Hi,

the code to call expand_main_function currently only checks DECL_NAME.  This 
leads
to a hack in ada/gcc-interface/utils.c to handle the gnatbind generated file 
that could
declare:

package ada_main is
…
   function my_main
     (argc : Integer;
      argv : System.Address;
      envp : System.Address)
      return Integer;
   pragma Export (C, my_main, "main");
…
end ada_main;

But expand_main_function is also called for function whose name is main but 
assembly name isn't.  Eg:

package pkg is
   procedure main;
end pkg;

So I think we should consider the assembler name is set, otherwise the decl 
name.

Manually tested on ia64-hp-openvms (where this issue was discovered).
No C regressions for x86_64-darwin.

Ok for trunk ?

Tristan.

gcc/
2012-03-14  Tristan Gingold  <ging...@adacore.com>

        * cfgexpand.c (gimple_expand_cfg): Consider the assembly name
        to call expand_main_function.

gcc/ada/
2012-03-14  Tristan Gingold  <ging...@adacore.com>

        * gcc-interface/utils.c (create_subprog_decl): Do not override
        DECL_NAME if asm_name is set.


diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index 2f38bb4..8693876 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -4501,8 +4501,12 @@ gimple_expand_cfg (void)
   /* If this function is `main', emit a call to `__main'
      to run global initializers, etc.  */
   if (DECL_NAME (current_function_decl)
-      && MAIN_NAME_P (DECL_NAME (current_function_decl))
-      && DECL_FILE_SCOPE_P (current_function_decl))
+      && DECL_FILE_SCOPE_P (current_function_decl)
+      && main_identifier_node != NULL_TREE
+      && ((!DECL_ASSEMBLER_NAME_SET_P (current_function_decl)
+          && MAIN_NAME_P (DECL_NAME (current_function_decl)))
+         || decl_assembler_name_equal (current_function_decl,
+                                       main_identifier_node)))
     expand_main_function ();
 
   /* Initialize the stack_protect_guard field.  This must happen after the

diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 7383358..81a1a0a 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -1899,18 +1899,7 @@ create_subprog_decl (tree subprog_name, tree asm_name, 
tree subprog_type,
   DECL_RESULT (subprog_decl) = result_decl;
 
   if (asm_name)
-    {
-      SET_DECL_ASSEMBLER_NAME (subprog_decl, asm_name);
-
-      /* The expand_main_function circuitry expects "main_identifier_node" to
-        designate the DECL_NAME of the 'main' entry point, in turn expected
-        to be declared as the "main" function literally by default.  Ada
-        program entry points are typically declared with a different name
-        within the binder generated file, exported as 'main' to satisfy the
-        system expectations.  Force main_identifier_node in this case.  */
-      if (asm_name == main_identifier_node)
-       DECL_NAME (subprog_decl) = main_identifier_node;
-    }
+    SET_DECL_ASSEMBLER_NAME (subprog_decl, asm_name);
 
   /* Add this decl to the current binding level.  */
   gnat_pushdecl (subprog_decl, gnat_node);


Reply via email to