Message ID | CABu31nM49hh=YyrL80v80zML7AD3x2uczOnbm-4Q74kAThFiwg@mail.gmail.com |
---|---|
State | New |
Headers | show |
On Mon, Mar 26, 2012 at 1:27 AM, Steven Bosscher <stevenb.gcc@gmail.com> wrote: > 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? Ok. (I think the remaining TREE_USED sets look dubious and may not be needed, too?) Thanks, Richard. > 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.
On Mon, Mar 26, 2012 at 9:31 AM, Richard Guenther <richard.guenther@gmail.com> wrote: > On Mon, Mar 26, 2012 at 1:27 AM, Steven Bosscher <stevenb.gcc@gmail.com> wrote: >> 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? > > Ok. (I think the remaining TREE_USED sets look dubious and may not > be needed, too?) I'm not sure. I think some of them may still be necessary, because they were changed relatively recently (r126144). So I left them in for now. Actually, the whole back end is full of cleanup opportunities, now that the compiler always works in unit-at-a-time mode. But let's start small. Ciao! Steven
On Mon, Mar 26, 2012 at 9:26 AM, Steven Bosscher <stevenb.gcc@gmail.com> wrote: > On Mon, Mar 26, 2012 at 9:31 AM, Richard Guenther > <richard.guenther@gmail.com> wrote: >> On Mon, Mar 26, 2012 at 1:27 AM, Steven Bosscher <stevenb.gcc@gmail.com> wrote: >>> 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? >> >> Ok. (I think the remaining TREE_USED sets look dubious and may not >> be needed, too?) > > I'm not sure. I think some of them may still be necessary, because > they were changed relatively recently (r126144). So I left them in for > now. > > Actually, the whole back end is full of cleanup opportunities, now > that the compiler always works in unit-at-a-time mode. But let's start > small. > It may have caused: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52730
On Mon, Mar 26, 2012 at 8:22 PM, H.J. Lu <hjl.tools@gmail.com> wrote: > It may have caused: > > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52730 It certainly seems so. Looking into it... Ciao! Steven
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);