mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-28 06:32:09 +00:00
Attempt to update the shadow stack GC pass to the new EH model.
This inserts a cleanup landingpad instruction and a resume to mimic the old unwind instruction. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@140277 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
15c9a1f60c
commit
3ca2ad1156
@ -109,7 +109,7 @@ namespace {
|
||||
State = 1;
|
||||
|
||||
case 1:
|
||||
// Find all 'return' and 'unwind' instructions.
|
||||
// Find all 'return', 'resume', and 'unwind' instructions.
|
||||
while (StateBB != StateE) {
|
||||
BasicBlock *CurBB = StateBB++;
|
||||
|
||||
@ -141,9 +141,21 @@ namespace {
|
||||
return 0;
|
||||
|
||||
// Create a cleanup block.
|
||||
BasicBlock *CleanupBB = BasicBlock::Create(F.getContext(),
|
||||
CleanupBBName, &F);
|
||||
UnwindInst *UI = new UnwindInst(F.getContext(), CleanupBB);
|
||||
LLVMContext &C = F.getContext();
|
||||
BasicBlock *CleanupBB = BasicBlock::Create(C, CleanupBBName, &F);
|
||||
Type *ExnTy = StructType::get(Type::getInt8PtrTy(C),
|
||||
Type::getInt32Ty(C), NULL);
|
||||
// FIXME: Assuming the C++ personality function probably isn't the best
|
||||
// thing in the world.
|
||||
Constant *PersFn =
|
||||
F.getParent()->
|
||||
getOrInsertFunction("__gxx_personality_v0",
|
||||
FunctionType::get(Type::getInt32Ty(C), true));
|
||||
LandingPadInst *LPad = LandingPadInst::Create(ExnTy, PersFn, 1,
|
||||
"cleanup.lpad",
|
||||
CleanupBB);
|
||||
LPad->setCleanup(true);
|
||||
ResumeInst *RI = ResumeInst::Create(LPad, CleanupBB);
|
||||
|
||||
// Transform the 'call' instructions into 'invoke's branching to the
|
||||
// cleanup block. Go in reverse order to make prettier BB names.
|
||||
@ -174,7 +186,7 @@ namespace {
|
||||
delete CI;
|
||||
}
|
||||
|
||||
Builder.SetInsertPoint(UI->getParent(), UI);
|
||||
Builder.SetInsertPoint(RI->getParent(), RI);
|
||||
return &Builder;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user