Patchwork Call assemble_external only from final.c and from MI-thunk hooks

login
register
mail settings
Submitter Steven Bosscher
Date March 25, 2012, 11:27 p.m.
Message ID <CABu31nM49hh=YyrL80v80zML7AD3x2uczOnbm-4Q74kAThFiwg@mail.gmail.com>
Download mbox | patch
Permalink /patch/148608/
State New
Headers show

Comments

Steven Bosscher - March 25, 2012, 11:27 p.m.
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.
* 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.
Richard Guenther - March 26, 2012, 7:31 a.m.
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.
Steven Bosscher - March 26, 2012, 4:26 p.m.
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
H.J. Lu - March 26, 2012, 6:22 p.m.
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
Steven Bosscher - March 26, 2012, 6:51 p.m.
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

Patch

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);