mirror of
https://github.com/RPCSX/llvm.git
synced 2025-03-03 18:37:56 +00:00
[asan] Fix dynamic allocas unpoisoning on PowerPC64.
For PowerPC64 we cannot just pass SP extracted from @llvm.stackrestore to _asan_allocas_unpoison due to specific ABI requirements (http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi.html#DYNAM-STACK). This patch adds the value returned by @llvm.get.dynamic.area.offset to extracted from @llvm.stackrestore stack pointer, so dynamic allocas unpoisoning stuff would work correctly on PowerPC64. Patch by Max Ostapenko. Differential Revision: http://reviews.llvm.org/D15108 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@254707 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9ce890e1fe
commit
008021cd33
@ -624,9 +624,24 @@ struct FunctionStackPoisoner : public InstVisitor<FunctionStackPoisoner> {
|
||||
void unpoisonDynamicAllocasBeforeInst(Instruction *InstBefore,
|
||||
Value *SavedStack) {
|
||||
IRBuilder<> IRB(InstBefore);
|
||||
Value *DynamicAreaPtr = IRB.CreatePtrToInt(SavedStack, IntptrTy);
|
||||
// When we insert _asan_allocas_unpoison before @llvm.stackrestore, we
|
||||
// need to adjust extracted SP to compute the address of the most recent
|
||||
// alloca. We have a special @llvm.get.dynamic.area.offset intrinsic for
|
||||
// this purpose.
|
||||
if (!isa<ReturnInst>(InstBefore)) {
|
||||
Function *DynamicAreaOffsetFunc = Intrinsic::getDeclaration(
|
||||
InstBefore->getModule(), Intrinsic::get_dynamic_area_offset,
|
||||
{IntptrTy});
|
||||
|
||||
Value *DynamicAreaOffset = IRB.CreateCall(DynamicAreaOffsetFunc, {});
|
||||
|
||||
DynamicAreaPtr = IRB.CreateAdd(IRB.CreatePtrToInt(SavedStack, IntptrTy),
|
||||
DynamicAreaOffset);
|
||||
}
|
||||
|
||||
IRB.CreateCall(AsanAllocasUnpoisonFunc,
|
||||
{IRB.CreateLoad(DynamicAllocaLayout),
|
||||
IRB.CreatePtrToInt(SavedStack, IntptrTy)});
|
||||
{IRB.CreateLoad(DynamicAllocaLayout), DynamicAreaPtr});
|
||||
}
|
||||
|
||||
// Unpoison dynamic allocas redzones.
|
||||
|
Loading…
x
Reference in New Issue
Block a user