diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-06-04 19:14:05 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-06-04 19:14:05 +0000 |
commit | 8a7eca315d571a70be3a077050674de6de0707d3 (patch) | |
tree | 36fc8faba8bd9f3f40b79757c53d08bb2b28c7d9 /dragonegg | |
parent | 5532d843e168764cec68a1d818aaab6281d5167c (diff) |
Fix alias generation and bring back the tests for it.
Diffstat (limited to 'dragonegg')
-rw-r--r-- | dragonegg/src/Backend.cpp | 8 | ||||
-rw-r--r-- | dragonegg/test/validator/c/FunctionAlias.c (renamed from dragonegg/test/validator/c/FunctionAlias.c.disabled) | 4 | ||||
-rw-r--r-- | dragonegg/test/validator/c/VariableAlias.c (renamed from dragonegg/test/validator/c/VariableAlias.c.disabled) | 4 |
3 files changed, 8 insertions, 8 deletions
diff --git a/dragonegg/src/Backend.cpp b/dragonegg/src/Backend.cpp index 484a05ceba8..5737d859382 100644 --- a/dragonegg/src/Backend.cpp +++ b/dragonegg/src/Backend.cpp @@ -983,11 +983,11 @@ static void emit_alias(tree decl, tree target) { GlobalValue::LinkageTypes Linkage = GetLinkageForAlias(decl); if (Linkage != GlobalValue::InternalLinkage && !IsWeakRef) { - // Create the LLVM alias. - // FIXME: handle alias to aliases. - auto *GO = cast<GlobalObject>(Aliasee); + auto *GV = cast<GlobalValue>(Aliasee->stripPointerCasts()); + if (auto *GA = llvm::dyn_cast<GlobalAlias>(GV)) + GV = cast<GlobalValue>(GA->getAliasee()->stripPointerCasts()); auto *GA = GlobalAlias::create(Aliasee->getType()->getElementType(), 0, - Linkage, "", GO); + Linkage, "", GV); handleVisibility(decl, GA); // Associate it with decl instead of V. diff --git a/dragonegg/test/validator/c/FunctionAlias.c.disabled b/dragonegg/test/validator/c/FunctionAlias.c index ec0e202df05..de05965b8e4 100644 --- a/dragonegg/test/validator/c/FunctionAlias.c.disabled +++ b/dragonegg/test/validator/c/FunctionAlias.c @@ -4,6 +4,6 @@ void qux(void) { } void foo(void) __attribute__ ((alias ("qux"))); // CHECK: @foo = alias void ()* @qux void bar(void) __attribute__ ((weak, alias ("foo"))); -// CHECK: @bar = alias weak void ()* @{{foo|qux}} +// CHECK: @bar = alias weak void ()* @qux void baz(void) __attribute__ ((alias ("bar"))); -// CHECK: @baz = alias void ()* @bar +// CHECK: @baz = alias void ()* @qux diff --git a/dragonegg/test/validator/c/VariableAlias.c.disabled b/dragonegg/test/validator/c/VariableAlias.c index 2b899ebf6d5..7381caad349 100644 --- a/dragonegg/test/validator/c/VariableAlias.c.disabled +++ b/dragonegg/test/validator/c/VariableAlias.c @@ -4,6 +4,6 @@ int qux; extern int foo __attribute__ ((alias ("qux"))); // CHECK: @foo = alias i32* @qux extern int bar __attribute__ ((weak, alias ("foo"))); -// CHECK: @bar = alias weak i32* @{{foo|qux}} +// CHECK: @bar = alias weak i32* @qux extern int baz __attribute__ ((alias ("bar"))); -// CHECK: @baz = alias i32* @bar +// CHECK: @baz = alias i32* @qux |