aboutsummaryrefslogtreecommitdiff
path: root/gcc/varasm.c
diff options
context:
space:
mode:
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>2012-12-16 17:34:58 +0000
committerJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>2012-12-16 17:34:58 +0000
commitd662a03c83e3e2499bfeb3d359b124980b2facb4 (patch)
tree8ca040f2f18e62eaa90b69da9d175142cbab6232 /gcc/varasm.c
parent4a2130caad85be6d661a8c65be0b6525f1091d54 (diff)
PR middle-end/55709
Forward port from 4.7 branch: 2012-04-10 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> PR middle-end/52894 * varasm.c (process_pending_assemble_externals): Set pending_assemble_externals_processed true. (assemble_external): Call assemble_external_real if the pending assemble externals have been processed. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@194538 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r--gcc/varasm.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c
index bca852dc4e8..daeb6e2a829 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -2088,6 +2088,11 @@ contains_pointers_p (tree type)
it all the way to final. See PR 17982 for further discussion. */
static GTY(()) tree pending_assemble_externals;
+/* Some targets delay some output to final using TARGET_ASM_FILE_END.
+ As a result, assemble_external can be called after the list of externals
+ is processed and the pointer set destroyed. */
+static bool pending_assemble_externals_processed;
+
#ifdef ASM_OUTPUT_EXTERNAL
/* Avoid O(external_decls**2) lookups in the pending_assemble_externals
TREE_LIST in assemble_external. */
@@ -2144,6 +2149,7 @@ process_pending_assemble_externals (void)
assemble_external_real (TREE_VALUE (list));
pending_assemble_externals = 0;
+ pending_assemble_externals_processed = true;
pointer_set_destroy (pending_assemble_externals_set);
#endif
}
@@ -2196,6 +2202,12 @@ assemble_external (tree decl ATTRIBUTE_UNUSED)
weak_decls = tree_cons (NULL, decl, weak_decls);
#ifdef ASM_OUTPUT_EXTERNAL
+ if (pending_assemble_externals_processed)
+ {
+ assemble_external_real (decl);
+ return;
+ }
+
if (! pointer_set_insert (pending_assemble_externals_set, decl))
pending_assemble_externals = tree_cons (NULL, decl,
pending_assemble_externals);