[patch] Call assemble_external only from final.c and from MI-thunk hooks
Steven Bosscher
stevenb.gcc@gmail.com
Sun Mar 25 23:27:00 GMT 2012
Hello,
This patch removes all calls to assemble_external from places other
than final.c and MI-thunk generators.
This is step 2 toward addressing PR17982 on the trunk for GCC 4.8. The
next, and final, step will be to change pending_assemble_externals to
pending_assemble_visibility, and fold assemble_external_real() back
into assemble_external.
Bootstrapped & tested all default languages on
x86_64-unknown-linux-gnu and on powerpc64-unknown-linux-gnu.
Also cross-built c and c++ to mips-elf and tested on mips-sim
(mips-elf was the only target I could find that really emits something
for its ASM_OUTPUT_EXTERNAL target macro and has a sim in gdb. I
hard-coded mips_output_external, by replacing "if
(!TARGET_EXPLICIT_RELOCS && ..." with "if (1 && ...").
OK for trunk?
Ciao!
Steven
* toplev.c (check_global_declaration_1): Do not call assemble_external.
* expr.c (emit_block_move_libcall_fn): Likewise.
(clear_storage_libcall_fn): Likewise.
(expand_expr_addr_expr_1): Likewise.
(expand_expr_real_1): Likewise.
* calls.c (rtx_for_function_call): Likewise.
-------------- next part --------------
* toplev.c (check_global_declaration_1): Do not call assemble_external.
* expr.c (emit_block_move_libcall_fn): Likewise.
(clear_storage_libcall_fn): Likewise.
(expand_expr_addr_expr_1): Likewise.
(expand_expr_real_1): Likewise.
* calls.c (rtx_for_function_call): Likewise.
Index: toplev.c
===================================================================
--- toplev.c (revision 185768)
+++ toplev.c (working copy)
@@ -486,7 +486,6 @@ check_global_declaration_1 (tree decl)
warning (OPT_Wunused_function, "%q+F declared %<static%> but never defined", decl);
/* This symbol is effectively an "extern" declaration now. */
TREE_PUBLIC (decl) = 1;
- assemble_external (decl);
}
/* Warn about static fns or vars defined but not used. */
@@ -591,7 +590,7 @@ compile_file (void)
output_shared_constant_pool ();
output_object_blocks ();
- finish_tm_clone_pairs ();
+ finish_tm_clone_pairs ();
/* Write out any pending weak symbol declarations. */
weak_finish ();
Index: expr.c
===================================================================
--- expr.c (revision 185768)
+++ expr.c (working copy)
@@ -1375,8 +1375,7 @@ emit_block_move_via_libcall (rtx dst, rtx src, rtx
}
/* A subroutine of emit_block_move_via_libcall. Create the tree node
- for the function we use for block copies. The first time FOR_CALL
- is true, we call assemble_external. */
+ for the function we use for block copies. */
static GTY(()) tree block_move_fn;
@@ -1419,7 +1418,6 @@ emit_block_move_libcall_fn (int for_call)
{
emitted_extern = true;
make_decl_rtl (block_move_fn);
- assemble_external (block_move_fn);
}
return block_move_fn;
@@ -2747,8 +2745,7 @@ set_storage_via_libcall (rtx object, rtx size, rtx
}
/* A subroutine of set_storage_via_libcall. Create the tree node
- for the function we use for block clears. The first time FOR_CALL
- is true, we call assemble_external. */
+ for the function we use for block clears. */
tree block_clear_fn;
@@ -2791,7 +2788,6 @@ clear_storage_libcall_fn (int for_call)
{
emitted_extern = true;
make_decl_rtl (block_clear_fn);
- assemble_external (block_clear_fn);
}
return block_clear_fn;
@@ -7413,11 +7409,8 @@ expand_expr_addr_expr_1 (tree exp, rtx target, enu
result = XEXP (result, 0);
/* ??? Is this needed anymore? */
- if (DECL_P (exp) && !TREE_USED (exp) == 0)
- {
- assemble_external (exp);
- TREE_USED (exp) = 1;
- }
+ if (DECL_P (exp))
+ TREE_USED (exp) = 1;
if (modifier != EXPAND_INITIALIZER
&& modifier != EXPAND_CONST_ADDRESS
@@ -9012,11 +9005,7 @@ expand_expr_real_1 (tree exp, rtx target, enum mac
/* Ensure variable marked as used even if it doesn't go through
a parser. If it hasn't be used yet, write out an external
definition. */
- if (! TREE_USED (exp))
- {
- assemble_external (exp);
- TREE_USED (exp) = 1;
- }
+ TREE_USED (exp) = 1;
/* Show we haven't gotten RTL for this yet. */
temp = 0;
Index: calls.c
===================================================================
--- calls.c (revision 185768)
+++ calls.c (working copy)
@@ -1642,13 +1642,8 @@ rtx_for_function_call (tree fndecl, tree addr)
/* Get the function to call, in the form of RTL. */
if (fndecl)
{
- /* If this is the first use of the function, see if we need to
- make an external definition for it. */
if (!TREE_USED (fndecl) && fndecl != current_function_decl)
- {
- assemble_external (fndecl);
- TREE_USED (fndecl) = 1;
- }
+ TREE_USED (fndecl) = 1;
/* Get a SYMBOL_REF rtx for the function address. */
funexp = XEXP (DECL_RTL (fndecl), 0);
More information about the Gcc-patches
mailing list