summaryrefslogtreecommitdiff
path: root/dragonegg
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2014-05-05 22:06:22 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2014-05-05 22:06:22 +0000
commite9de3e07f34557418f132b2d2c8a4c895a9e2e8b (patch)
tree4629e657b078d823c299c4bac0a6392386a30afc /dragonegg
parentc3beb2257fa31645d9c7f778c69fdafe9d6d7912 (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.cpp16
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
}