summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CodeGenModule.cpp
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-11-10 19:04:30 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-11-10 19:04:30 +0000
commit732c99c4ae6e309ea441f73f757c6990b7223f8e (patch)
tree633921df97b6428954ae616ec87a7eb5e637647e /clang/lib/CodeGen/CodeGenModule.cpp
parent760c1e0b0ac9066b778787a6c58e258bcebf5ddc (diff)
downloadbcm5719-llvm-732c99c4ae6e309ea441f73f757c6990b7223f8e.tar.gz
bcm5719-llvm-732c99c4ae6e309ea441f73f757c6990b7223f8e.zip
Keep the old function order in CodeGenModule::applyReplacements.
The original decls are created when used. The replacements are created at the end of the TU in reverse order. This makes the original order far better for testing. This is particularly important since the replacement logic could be used even when -mconstructor-aliases is not used, but that would make many tests hard to read. llvm-svn: 194357
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
-rw-r--r--clang/lib/CodeGen/CodeGenModule.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp
index 74f3bbb0459..ee700807437 100644
--- a/clang/lib/CodeGen/CodeGenModule.cpp
+++ b/clang/lib/CodeGen/CodeGenModule.cpp
@@ -181,8 +181,20 @@ void CodeGenModule::applyReplacements() {
llvm::GlobalValue *Entry = GetGlobalValue(MangledName);
if (!Entry)
continue;
- Entry->replaceAllUsesWith(Replacement);
- Entry->eraseFromParent();
+ 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 = cast<llvm::Function>(CE->getOperand(0));
+ }
+
+ // Replace old with new, but keep the old order.
+ OldF->replaceAllUsesWith(Replacement);
+ NewF->removeFromParent();
+ OldF->getParent()->getFunctionList().insertAfter(OldF, NewF);
+ OldF->eraseFromParent();
}
}
OpenPOWER on IntegriCloud