diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-05-16 19:35:48 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-05-16 19:35:48 +0000 |
commit | b2633b9793174e3f9dc1e2d8a6eceb76b1726399 (patch) | |
tree | a238273f724973c80410de505bcd2dd0633f0da5 /clang/lib/CodeGen/CGCXX.cpp | |
parent | 6b238633b77f8f18d4c3979a98ba2c77ce652cb1 (diff) | |
download | bcm5719-llvm-b2633b9793174e3f9dc1e2d8a6eceb76b1726399.tar.gz bcm5719-llvm-b2633b9793174e3f9dc1e2d8a6eceb76b1726399.zip |
Update for llvm api change.
Now that llvm cannot represent alias cycles, we have to diagnose erros just
before trying to close the cycle. This degrades the errors a bit. The real
solution is what it was before: if we want to provide good errors for these
cases, we have to be able to find a clang level decl given a mangled name
and produce the error from Sema.
llvm-svn: 209008
Diffstat (limited to 'clang/lib/CodeGen/CGCXX.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGCXX.cpp | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/clang/lib/CodeGen/CGCXX.cpp b/clang/lib/CodeGen/CGCXX.cpp index 08b74a3c30d..0a73550c7a2 100644 --- a/clang/lib/CodeGen/CGCXX.cpp +++ b/clang/lib/CodeGen/CGCXX.cpp @@ -138,12 +138,12 @@ bool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl, // which case the caller is responsible for ensuring the soundness // of these semantics. auto *Ref = cast<llvm::GlobalValue>(GetAddrOfGlobal(TargetDecl)); - llvm::Constant *Aliasee = Ref; - if (Ref->getType() != AliasType) - Aliasee = llvm::ConstantExpr::getBitCast(Ref, AliasType); + auto *Aliasee = dyn_cast<llvm::GlobalObject>(Ref); + if (!Aliasee) + Aliasee = cast<llvm::GlobalAlias>(Ref)->getAliasee(); // Instead of creating as alias to a linkonce_odr, replace all of the uses - // of the aliassee. + // of the aliasee. if (llvm::GlobalValue::isDiscardableIfUnused(Linkage) && (TargetLinkage != llvm::GlobalValue::AvailableExternallyLinkage || !TargetDecl.getDecl()->hasAttr<AlwaysInlineAttr>())) { @@ -152,7 +152,10 @@ bool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl, // members with attribute "AlwaysInline" and expect no reference to // be generated. It is desirable to reenable this optimisation after // corresponding LLVM changes. - Replacements[MangledName] = Aliasee; + llvm::Constant *Replacement = Aliasee; + if (Aliasee->getType() != AliasType) + Replacement = llvm::ConstantExpr::getBitCast(Aliasee, AliasType); + Replacements[MangledName] = Replacement; return false; } @@ -160,7 +163,7 @@ bool CodeGenModule::TryEmitDefinitionAsAlias(GlobalDecl AliasDecl, /// If we don't have a definition for the destructor yet, don't /// emit. We can't emit aliases to declarations; that's just not /// how aliases work. - if (Ref->isDeclaration()) + if (Aliasee->isDeclaration()) return true; } |