https://gcc.gnu.org/g:2c7eda728712eff4ab0f17b4c6d662c9db7898d1
commit r17-1889-g2c7eda728712eff4ab0f17b4c6d662c9db7898d1 Author: Enes Cevik <[email protected]> Date: Mon May 25 16:57:09 2026 +0300 gccrs: attr: Add attribute rustc_std_internal_symbol This patch introduces the `rustc_std_internal_symbol` attribute. This attribute is required by the Rust standard library to prevent name mangling for internal runtime symbols. gcc/rust/ChangeLog: * backend/rust-compile-base.cc (should_mangle_item): Bypass mangling for rustc_std_internal_symbol. (HIRCompileBase::setup_fndecl): Dispatch the new attribute. (HIRCompileBase::handle_rustc_std_internal_symbol_attribute_on_fndecl): New function. * backend/rust-compile-base.h: (handle_rustc_std_internal_symbol_attribute_on_fndecl): New declaration. * util/rust-attribute-values.h (Attributes): Add RUSTC_STD_INTERNAL_SYMBOL constexpr. * util/rust-attributes.cc (__definitions): Register rustc_std_internal_symbol in the BuiltinAttributes list. * checks/errors/rust-builtin-attribute-checker.cc (rustc_std_internal_symbol): New function. (attribute_checking_handlers): Add rustc_std_internal_symbol function. gcc/testsuite/ChangeLog: * rust/compile/rustc_std_internal_symbol1.rs: New test. * rust/compile/rustc_std_internal_symbol2.rs: New test. Signed-off-by: Enes Cevik <[email protected]> Diff: --- gcc/rust/backend/rust-compile-base.cc | 20 +++++++++- gcc/rust/backend/rust-compile-base.h | 3 ++ .../errors/rust-builtin-attribute-checker.cc | 43 ++++++++++++++-------- gcc/rust/util/rust-attribute-values.h | 2 + gcc/rust/util/rust-attributes.cc | 1 + .../rust/compile/rustc_std_internal_symbol1.rs | 10 +++++ .../rust/compile/rustc_std_internal_symbol2.rs | 7 ++++ 7 files changed, 70 insertions(+), 16 deletions(-) diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc index f566cc07b738..1318b876e650 100644 --- a/gcc/rust/backend/rust-compile-base.cc +++ b/gcc/rust/backend/rust-compile-base.cc @@ -51,7 +51,10 @@ bool inline should_mangle_item (const tree fndecl) { return lookup_attribute (Values::Attributes::NO_MANGLE, DECL_ATTRIBUTES (fndecl)) - == NULL_TREE; + == NULL_TREE + && lookup_attribute (Values::Attributes::RUSTC_STD_INTERNAL_SYMBOL, + DECL_ATTRIBUTES (fndecl)) + == NULL_TREE; } void @@ -85,6 +88,8 @@ HIRCompileBase::setup_fndecl (tree fndecl, bool is_main_entry_point, bool is_cold = attr_str == Values::Attributes::COLD; bool is_link_section = attr_str == Values::Attributes::LINK_SECTION; bool no_mangle = attr_str == Values::Attributes::NO_MANGLE; + bool is_std_internal + = attr_str == Values::Attributes::RUSTC_STD_INTERNAL_SYMBOL; bool is_deprecated = attr_str == Values::Attributes::DEPRECATED; bool is_proc_macro = attr_str == Values::Attributes::PROC_MACRO; bool is_proc_macro_attribute @@ -116,6 +121,10 @@ HIRCompileBase::setup_fndecl (tree fndecl, bool is_main_entry_point, { handle_no_mangle_attribute_on_fndecl (fndecl, attr); } + else if (is_std_internal) + { + handle_rustc_std_internal_symbol_attribute_on_fndecl (fndecl, attr); + } else if (is_proc_macro) { handle_bang_proc_macro_attribute_on_fndecl (fndecl, attr); @@ -280,6 +289,15 @@ HIRCompileBase::handle_no_mangle_attribute_on_fndecl ( DECL_ATTRIBUTES (fndecl)); } +void +HIRCompileBase::handle_rustc_std_internal_symbol_attribute_on_fndecl ( + tree fndecl, const AST::Attribute &attr) +{ + DECL_ATTRIBUTES (fndecl) + = tree_cons (get_identifier (Values::Attributes::RUSTC_STD_INTERNAL_SYMBOL), + NULL_TREE, DECL_ATTRIBUTES (fndecl)); +} + void HIRCompileBase::handle_deprecated_attribute_on_fndecl ( tree fndecl, const AST::Attribute &attr) diff --git a/gcc/rust/backend/rust-compile-base.h b/gcc/rust/backend/rust-compile-base.h index 4a98eb46fc6f..551a02e4d82b 100644 --- a/gcc/rust/backend/rust-compile-base.h +++ b/gcc/rust/backend/rust-compile-base.h @@ -152,6 +152,9 @@ protected: static void handle_no_mangle_attribute_on_fndecl (tree fndecl, const AST::Attribute &attr); + static void handle_rustc_std_internal_symbol_attribute_on_fndecl ( + tree fndecl, const AST::Attribute &attr); + static void setup_abi_options (tree fndecl, ABI abi); static tree indirect_expression (tree expr, location_t locus); diff --git a/gcc/rust/checks/errors/rust-builtin-attribute-checker.cc b/gcc/rust/checks/errors/rust-builtin-attribute-checker.cc index 9078a10164a2..46b96f23aced 100644 --- a/gcc/rust/checks/errors/rust-builtin-attribute-checker.cc +++ b/gcc/rust/checks/errors/rust-builtin-attribute-checker.cc @@ -358,25 +358,38 @@ no_mangle (const AST::Attribute &attribute) "must be of the form: %<#[no_mangle]%>"); } } +void +rustc_std_internal_symbol (const AST::Attribute &attribute) +{ + if (attribute.has_attr_input ()) + { + rust_error_at (attribute.get_locus (), + "malformed %<rustc_std_internal_symbol%> attribute input"); + rust_inform (attribute.get_locus (), + "must be of the form: %<#[rustc_std_internal_symbol]%>"); + } +} } // namespace handlers const std::unordered_map<std::string, std::function<void (AST::Attribute &)>> - attribute_checking_handlers - = {{Attrs::DOC, handlers::doc}, - {Attrs::DEPRECATED, handlers::deprecated}, - {Attrs::LINK_SECTION, handlers::link_section}, - {Attrs::EXPORT_NAME, handlers::export_name}, - {Attrs::NO_MANGLE, handlers::no_mangle}, - {Attrs::ALLOW, handlers::lint}, - {Attrs::DENY, handlers::lint}, - {Attrs::WARN, handlers::lint}, - {Attrs::FORBID, handlers::lint}, - {Attrs::LINK_NAME, handlers::link_name}, - {Attrs::PROC_MACRO_DERIVE, handlers::proc_macro_derive}, - {Attrs::PROC_MACRO, handlers::proc_macro}, - {Attrs::PROC_MACRO_ATTRIBUTE, handlers::proc_macro}, - {Attrs::TARGET_FEATURE, handlers::target_feature}}; + attribute_checking_handlers = { + {Attrs::DOC, handlers::doc}, + {Attrs::DEPRECATED, handlers::deprecated}, + {Attrs::LINK_SECTION, handlers::link_section}, + {Attrs::EXPORT_NAME, handlers::export_name}, + {Attrs::NO_MANGLE, handlers::no_mangle}, + {Attrs::ALLOW, handlers::lint}, + {Attrs::DENY, handlers::lint}, + {Attrs::WARN, handlers::lint}, + {Attrs::FORBID, handlers::lint}, + {Attrs::LINK_NAME, handlers::link_name}, + {Attrs::PROC_MACRO_DERIVE, handlers::proc_macro_derive}, + {Attrs::PROC_MACRO, handlers::proc_macro}, + {Attrs::PROC_MACRO_ATTRIBUTE, handlers::proc_macro}, + {Attrs::TARGET_FEATURE, handlers::target_feature}, + {Attrs::RUSTC_STD_INTERNAL_SYMBOL, handlers::rustc_std_internal_symbol}, +}; tl::optional<std::function<void (AST::Attribute &)>> lookup_handler (std::string attr_name) diff --git a/gcc/rust/util/rust-attribute-values.h b/gcc/rust/util/rust-attribute-values.h index 332d65e80dd4..02d915f1acbd 100644 --- a/gcc/rust/util/rust-attribute-values.h +++ b/gcc/rust/util/rust-attribute-values.h @@ -44,6 +44,8 @@ public: static constexpr auto &NO_STD = "no_std"; static constexpr auto &LINK_SECTION = "link_section"; static constexpr auto &NO_MANGLE = "no_mangle"; + static constexpr auto &RUSTC_STD_INTERNAL_SYMBOL + = "rustc_std_internal_symbol"; static constexpr auto &EXPORT_NAME = "export_name"; static constexpr auto &REPR = "repr"; static constexpr auto &RUSTC_BUILTIN_MACRO = "rustc_builtin_macro"; diff --git a/gcc/rust/util/rust-attributes.cc b/gcc/rust/util/rust-attributes.cc index ad57f5695553..7042f8bd10ed 100644 --- a/gcc/rust/util/rust-attributes.cc +++ b/gcc/rust/util/rust-attributes.cc @@ -44,6 +44,7 @@ static const BuiltinAttrDefinition __definitions[] {Attrs::LINK_NAME, CODE_GENERATION}, {Attrs::LINK_SECTION, CODE_GENERATION}, {Attrs::NO_MANGLE, CODE_GENERATION}, + {Attrs::RUSTC_STD_INTERNAL_SYMBOL, CODE_GENERATION}, {Attrs::EXPORT_NAME, CODE_GENERATION}, {Attrs::REPR, CODE_GENERATION}, {Attrs::RUSTC_BUILTIN_MACRO, EXPANSION}, diff --git a/gcc/testsuite/rust/compile/rustc_std_internal_symbol1.rs b/gcc/testsuite/rust/compile/rustc_std_internal_symbol1.rs new file mode 100644 index 000000000000..00ad2286a73a --- /dev/null +++ b/gcc/testsuite/rust/compile/rustc_std_internal_symbol1.rs @@ -0,0 +1,10 @@ +// { dg-additional-options "-fdump-tree-gimple" } +#![feature(no_core, rustc_attrs)] +#![no_core] + +#[rustc_std_internal_symbol] +pub fn _foo() -> i32 { + 0 +} + +// { dg-final { scan-tree-dump "_foo" "gimple" } } diff --git a/gcc/testsuite/rust/compile/rustc_std_internal_symbol2.rs b/gcc/testsuite/rust/compile/rustc_std_internal_symbol2.rs new file mode 100644 index 000000000000..f9e61ea2ac2e --- /dev/null +++ b/gcc/testsuite/rust/compile/rustc_std_internal_symbol2.rs @@ -0,0 +1,7 @@ +#![feature(no_core, rustc_attrs)] +#![no_core] + +#[rustc_std_internal_symbol(invalid_argument)] // { dg-error "malformed .rustc_std_internal_symbol. attribute input" } +pub fn _bar() -> i32 { + 0 +}
