diff options
author | Zack Weinberg <zack@gcc.gnu.org> | 2004-12-08 19:13:35 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2004-12-08 19:13:35 +0000 |
commit | 857e7259c4c62c4ac7ccace2e44fdd73286bf194 (patch) | |
tree | d6fa6db393ca0978490c8abd03a55eb4749830d9 /gcc | |
parent | b057216dba84bd26eeb749d876fde5b871e01e15 (diff) | |
download | gcc-857e7259c4c62c4ac7ccace2e44fdd73286bf194.zip gcc-857e7259c4c62c4ac7ccace2e44fdd73286bf194.tar.gz gcc-857e7259c4c62c4ac7ccace2e44fdd73286bf194.tar.bz2 |
re PR middle-end/17982 (stop calling assemble_external before final assembly output time)
PR 17982
* varasm.c (pending_assemble_externals): New static.
(assemble_external_real): Meat of assemble_external split out
to this new function.
(process_pending_assemble_externals): New function.
(assemble_external): Use gcc_assert. If flag_unit_at_a_time
is true and the basic test passes, merely cons the decl onto
the pending list to be handled later.
* tree.h: Declare process_pending_assemble_externals.
* cgraphunit.c (cgraph_optimize): Call it.
* config/h8300/h8300.h: Do not define ASM_OUTPUT_EXTERNAL.
From-SVN: r91914
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 21 | ||||
-rw-r--r-- | gcc/cgraphunit.c | 3 | ||||
-rw-r--r-- | gcc/config/h8300/h8300.h | 2 | ||||
-rw-r--r-- | gcc/tree.h | 1 | ||||
-rw-r--r-- | gcc/varasm.c | 57 |
5 files changed, 65 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7972254..e780766c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2004-12-08 Zack Weinberg <zack@codesourcery.com> + + PR 17982 + * varasm.c (pending_assemble_externals): New static. + (assemble_external_real): Meat of assemble_external split out + to this new function. + (process_pending_assemble_externals): New function. + (assemble_external): Use gcc_assert. If flag_unit_at_a_time + is true and the basic test passes, merely cons the decl onto + the pending list to be handled later. + * tree.h: Declare process_pending_assemble_externals. + * cgraphunit.c (cgraph_optimize): Call it. + + * config/h8300/h8300.h: Do not define ASM_OUTPUT_EXTERNAL. + 2004-12-08 Kazu Hirata <kazu@cs.umass.edu> * cfgloopmanip.c (create_preheader): Speed up by "unrolling" @@ -87,9 +102,9 @@ 2004-12-07 David Mosberger <davidm@hpl.hp.com> - PR target/18443 - * config/ia64/ia64.c (ia64_assemble_integer): Add support for - emitting unaligned pointer-sized integers. + PR target/18443 + * config/ia64/ia64.c (ia64_assemble_integer): Add support for + emitting unaligned pointer-sized integers. 2004-12-07 Steven Bosscher <stevenb@suse.de> diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index 43564b0..22b3381 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -1750,6 +1750,9 @@ cgraph_optimize (void) #endif if (!flag_unit_at_a_time) return; + + process_pending_assemble_externals (); + timevar_push (TV_CGRAPHOPT); if (!quiet_flag) fprintf (stderr, "Performing intraprocedural optimizations\n"); diff --git a/gcc/config/h8300/h8300.h b/gcc/config/h8300/h8300.h index d7b73e8..85886dd 100644 --- a/gcc/config/h8300/h8300.h +++ b/gcc/config/h8300/h8300.h @@ -1160,8 +1160,6 @@ struct cum_arg { {"er0", 0}, {"er1", 1}, {"er2", 2}, {"er3", 3}, {"er4", 4}, \ {"er5", 5}, {"er6", 6}, {"er7", 7}, {"r7", 7} } -#define ASM_OUTPUT_EXTERNAL(FILE, DECL, NAME) - /* Globalizing directive for a label. */ #define GLOBAL_ASM_OP "\t.global " @@ -3701,6 +3701,7 @@ extern void mark_referenced (tree); extern void mark_decl_referenced (tree); extern void notice_global_symbol (tree); extern void set_user_assembler_name (tree, const char *); +extern void process_pending_assemble_externals (void); /* In stmt.c */ extern void expand_computed_goto (tree); diff --git a/gcc/varasm.c b/gcc/varasm.c index d900273..f80ce93 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -1759,6 +1759,12 @@ contains_pointers_p (tree type) } } +/* In unit-at-a-time mode, we delay assemble_external processing until + the compilation unit is finalized. This is the best we can do for + right now (i.e. stage 3 of GCC 4.0) - the right thing is to delay + it all the way to final. See PR 17982 for further discussion. */ +static GTY(()) tree pending_assemble_externals; + #ifdef ASM_OUTPUT_EXTERNAL /* True if DECL is a function decl for which no out-of-line copy exists. It is assumed that DECL's assembler name has been set. */ @@ -1780,8 +1786,37 @@ incorporeal_function_p (tree decl) } return false; } + +/* Actually do the tests to determine if this is necessary, and invoke + ASM_OUTPUT_EXTERNAL. */ +static void +assemble_external_real (tree decl) +{ + rtx rtl = DECL_RTL (decl); + + if (MEM_P (rtl) && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF + && !SYMBOL_REF_USED (XEXP (rtl, 0)) + && !incorporeal_function_p (decl)) + { + /* Some systems do require some output. */ + SYMBOL_REF_USED (XEXP (rtl, 0)) = 1; + ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0)); + } +} #endif +void +process_pending_assemble_externals (void) +{ +#ifdef ASM_OUTPUT_EXTERNAL + tree list; + for (list = pending_assemble_externals; list; list = TREE_CHAIN (list)) + assemble_external_real (TREE_VALUE (list)); + + pending_assemble_externals = 0; +#endif +} + /* Output something to declare an external symbol to the assembler. (Most assemblers don't need this, so we normally output nothing.) Do nothing if DECL is not external. */ @@ -1793,23 +1828,17 @@ assemble_external (tree decl ATTRIBUTE_UNUSED) main body of this code is only rarely exercised. To provide some testing, on all platforms, we make sure that the ASM_OUT_FILE is open. If it's not, we should not be calling this function. */ - if (!asm_out_file) - abort (); + gcc_assert (asm_out_file); #ifdef ASM_OUTPUT_EXTERNAL - if (DECL_P (decl) && DECL_EXTERNAL (decl) && TREE_PUBLIC (decl)) - { - rtx rtl = DECL_RTL (decl); + if (!DECL_P (decl) || !DECL_EXTERNAL (decl) || !TREE_PUBLIC (decl)) + return; - if (MEM_P (rtl) && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF - && !SYMBOL_REF_USED (XEXP (rtl, 0)) - && !incorporeal_function_p (decl)) - { - /* Some systems do require some output. */ - SYMBOL_REF_USED (XEXP (rtl, 0)) = 1; - ASM_OUTPUT_EXTERNAL (asm_out_file, decl, XSTR (XEXP (rtl, 0), 0)); - } - } + if (flag_unit_at_a_time) + pending_assemble_externals = tree_cons (0, decl, + pending_assemble_externals); + else + assemble_external_real (decl); #endif } |