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 <[email protected]>
* cfgexpand.c (gimple_expand_cfg): Consider the assembly name
to call expand_main_function.
gcc/ada/
2012-03-14 Tristan Gingold <[email protected]>
* 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);