diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-05-05 22:06:22 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-05-05 22:06:22 +0000 |
commit | e9de3e07f34557418f132b2d2c8a4c895a9e2e8b (patch) | |
tree | 4629e657b078d823c299c4bac0a6392386a30afc /dragonegg | |
parent | c3beb2257fa31645d9c7f778c69fdafe9d6d7912 (diff) |
Fix c/InternVariableWeakref.c.
The test was failing when building with gcc 4.8. It looks like weakrefs are
reachable via emit_varpool_aliases and emit_varpool_weakref. This causes us to
try to use rauw twice, causing an assert when we get a this->rauw(this).
The patch simply skips weakrefs in emit_varpool_aliases.
Diffstat (limited to 'dragonegg')
-rw-r--r-- | dragonegg/src/Backend.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/dragonegg/src/Backend.cpp b/dragonegg/src/Backend.cpp index 2e176ca6877..2f74b6710b7 100644 --- a/dragonegg/src/Backend.cpp +++ b/dragonegg/src/Backend.cpp @@ -1016,12 +1016,16 @@ static void emit_varpool_aliases(struct varpool_node *node) { struct ipa_ref *ref; for (int i = 0; ipa_ref_list_referring_iterate(&varpool_symbol(node)->ref_list, i, ref); - i++) - if (ref->use == IPA_REF_ALIAS) { - struct varpool_node *alias = ipa_ref_referring_varpool_node(ref); - emit_alias(varpool_symbol(alias)->decl, alias->alias_of); - emit_varpool_aliases(alias); - } + i++) { + if (ref->use != IPA_REF_ALIAS) + continue; + struct varpool_node *alias = ipa_ref_referring_varpool_node(ref); + if (lookup_attribute("weakref", + DECL_ATTRIBUTES(varpool_symbol(alias)->decl))) + continue; + emit_alias(varpool_symbol(alias)->decl, alias->alias_of); + emit_varpool_aliases(alias); + } #endif } |