mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-21 23:17:16 +00:00
Remap blockaddress correctly when inlining a function. Fixes PR10162.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142684 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -113,8 +113,23 @@ void llvm::CloneFunctionInto(Function *NewFunc, const Function *OldFunc,
|
||||
|
||||
// Create a new basic block and copy instructions into it!
|
||||
BasicBlock *CBB = CloneBasicBlock(&BB, VMap, NameSuffix, NewFunc, CodeInfo);
|
||||
VMap[&BB] = CBB; // Add basic block mapping.
|
||||
|
||||
// Add basic block mapping.
|
||||
VMap[&BB] = CBB;
|
||||
|
||||
// It is only legal to clone a function if a block address within that
|
||||
// function is never referenced outside of the function. Given that, we
|
||||
// want to map block addresses from the old function to block addresses in
|
||||
// the clone. (This is different from the generic ValueMapper
|
||||
// implementation, which generates an invalid blockaddress when
|
||||
// cloning a function.)
|
||||
if (BB.hasAddressTaken()) {
|
||||
Constant *OldBBAddr = BlockAddress::get(const_cast<Function*>(OldFunc),
|
||||
const_cast<BasicBlock*>(&BB));
|
||||
VMap[OldBBAddr] = BlockAddress::get(NewFunc, CBB);
|
||||
}
|
||||
|
||||
// Note return instructions for the caller.
|
||||
if (ReturnInst *RI = dyn_cast<ReturnInst>(CBB->getTerminator()))
|
||||
Returns.push_back(RI);
|
||||
}
|
||||
@@ -224,6 +239,22 @@ void PruningFunctionCloner::CloneBlock(const BasicBlock *BB,
|
||||
BBEntry = NewBB = BasicBlock::Create(BB->getContext());
|
||||
if (BB->hasName()) NewBB->setName(BB->getName()+NameSuffix);
|
||||
|
||||
// It is only legal to clone a function if a block address within that
|
||||
// function is never referenced outside of the function. Given that, we
|
||||
// want to map block addresses from the old function to block addresses in
|
||||
// the clone. (This is different from the generic ValueMapper
|
||||
// implementation, which generates an invalid blockaddress when
|
||||
// cloning a function.)
|
||||
//
|
||||
// Note that we don't need to fix the mapping for unreachable blocks;
|
||||
// the default mapping there is safe.
|
||||
if (BB->hasAddressTaken()) {
|
||||
Constant *OldBBAddr = BlockAddress::get(const_cast<Function*>(OldFunc),
|
||||
const_cast<BasicBlock*>(BB));
|
||||
VMap[OldBBAddr] = BlockAddress::get(NewFunc, NewBB);
|
||||
}
|
||||
|
||||
|
||||
bool hasCalls = false, hasDynamicAllocas = false, hasStaticAllocas = false;
|
||||
|
||||
// Loop over all instructions, and copy them over, DCE'ing as we go. This
|
||||
|
||||
Reference in New Issue
Block a user