https://gcc.gnu.org/g:41c7e1d0a707f97327f097022e9e6fa7f6f13533

commit 41c7e1d0a707f97327f097022e9e6fa7f6f13533
Author: Thomas Schwinge <tho...@codesourcery.com>
Date:   Wed Apr 12 11:38:58 2023 +0200

    Rust: Make 'tree'-level 'MAIN_NAME_P' work
    
    'gcc/tree.h':
    
        #define main_identifier_node                
global_trees[TI_MAIN_IDENTIFIER]
        #define MAIN_NAME_P(NODE) \
          (IDENTIFIER_NODE_CHECK (NODE) == main_identifier_node)
    
    ..., which is not initialized by default, but has to be set up by every 
front
    end individually.  'MAIN_NAME_P' enables certain code optimizations, but is
    especially also relevant for back ends that emit additional program entry 
setup
    code for 'main'.
    
            gcc/rust/
            * backend/rust-compile-base.cc (HIRCompileBase::compile_function):
            Handle 'main' specially.
            * rust-lang.cc (grs_langhook_init): Initialize
            'main_identifier_node'.

Diff:
---
 gcc/rust/backend/rust-compile-base.cc | 3 +++
 gcc/rust/rust-lang.cc                 | 3 +++
 2 files changed, 6 insertions(+)

diff --git a/gcc/rust/backend/rust-compile-base.cc 
b/gcc/rust/backend/rust-compile-base.cc
index 9650d1a47ee6..9b8a793a3c73 100644
--- a/gcc/rust/backend/rust-compile-base.cc
+++ b/gcc/rust/backend/rust-compile-base.cc
@@ -523,6 +523,9 @@ HIRCompileBase::compile_function (
 
   // we don't mangle the main fn since we haven't implemented the main shim
   bool is_main_fn = fn_name.compare ("main") == 0;
+  if (is_main_fn)
+    /* So that 'MAIN_NAME_P' works.  */
+    ir_symbol_name = fn_name;
   std::string asm_name = fn_name;
 
   unsigned int flags = 0;
diff --git a/gcc/rust/rust-lang.cc b/gcc/rust/rust-lang.cc
index f3532298aecc..9f1a914ed73f 100644
--- a/gcc/rust/rust-lang.cc
+++ b/gcc/rust/rust-lang.cc
@@ -38,6 +38,7 @@
 #include "rust-privacy-ctx.h"
 #include "rust-ast-resolve-item.h"
 #include "rust-optional.h"
+#include "stringpool.h"
 
 #include <mpfr.h>
 // note: header files must be in this order or else forward declarations don't
@@ -124,6 +125,8 @@ grs_langhook_init (void)
    whether char is signed.  */
   build_common_tree_nodes (false);
 
+  main_identifier_node = get_identifier ("main");
+
   // Builds built-ins for middle-end after all front-end built-ins are already
   // instantiated
   build_common_builtin_nodes ();

Reply via email to