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
+}

Reply via email to