diff options
author | Reid Kleckner <reid@kleckner.net> | 2014-02-03 18:54:51 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2014-02-03 18:54:51 +0000 |
commit | b78257d0c10f1fe331744574eabc1e8987652b7f (patch) | |
tree | 98f3a2b17e4185b01d41bffd9c4f0616ed201643 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | 7a712cea7126b5b815051569fd5b4577530b7f64 (diff) | |
download | bcm5719-llvm-b78257d0c10f1fe331744574eabc1e8987652b7f.tar.gz bcm5719-llvm-b78257d0c10f1fe331744574eabc1e8987652b7f.zip |
[ms-cxxabi] Fix cast when structor replacement is an alias
llvm-svn: 200711
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 2ee232284fd..c73e931c9d9 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -187,10 +187,14 @@ void CodeGenModule::applyReplacements() { llvm::Function *OldF = cast<llvm::Function>(Entry); llvm::Function *NewF = dyn_cast<llvm::Function>(Replacement); if (!NewF) { - llvm::ConstantExpr *CE = cast<llvm::ConstantExpr>(Replacement); - assert(CE->getOpcode() == llvm::Instruction::BitCast || - CE->getOpcode() == llvm::Instruction::GetElementPtr); - NewF = dyn_cast<llvm::Function>(CE->getOperand(0)); + if (llvm::GlobalAlias *Alias = dyn_cast<llvm::GlobalAlias>(Replacement)) { + NewF = dyn_cast<llvm::Function>(Alias->getAliasedGlobal()); + } else { + llvm::ConstantExpr *CE = cast<llvm::ConstantExpr>(Replacement); + assert(CE->getOpcode() == llvm::Instruction::BitCast || + CE->getOpcode() == llvm::Instruction::GetElementPtr); + NewF = dyn_cast<llvm::Function>(CE->getOperand(0)); + } } // Replace old with new, but keep the old order. |