forked from OSchip/llvm-project
hwasan: If we split the entry block, move static allocas back into the entry block.
Otherwise they are treated as dynamic allocas, which ends up increasing code size significantly. This reduces size of Chromium base_unittests by 2MB (6.7%). Differential Revision: https://reviews.llvm.org/D57205 llvm-svn: 352152
This commit is contained in:
parent
f4e7051c67
commit
1a8acfb768
|
@ -1038,6 +1038,21 @@ bool HWAddressSanitizer::runOnFunction(Function &F) {
|
|||
Changed |= instrumentStack(AllocasToInstrument, RetVec, StackTag);
|
||||
}
|
||||
|
||||
// If we split the entry block, move any allocas that were originally in the
|
||||
// entry block back into the entry block so that they aren't treated as
|
||||
// dynamic allocas.
|
||||
if (EntryIRB.GetInsertBlock() != &F.getEntryBlock()) {
|
||||
InsertPt = &*F.getEntryBlock().begin();
|
||||
for (auto II = EntryIRB.GetInsertBlock()->begin(),
|
||||
IE = EntryIRB.GetInsertBlock()->end();
|
||||
II != IE;) {
|
||||
Instruction *I = &*II++;
|
||||
if (auto *AI = dyn_cast<AllocaInst>(I))
|
||||
if (isa<ConstantInt>(AI->getArraySize()))
|
||||
I->moveBefore(InsertPt);
|
||||
}
|
||||
}
|
||||
|
||||
for (auto Inst : ToInstrument)
|
||||
Changed |= instrumentMemAccess(Inst);
|
||||
|
||||
|
|
|
@ -2,9 +2,10 @@
|
|||
|
||||
target triple = "aarch64--linux-android"
|
||||
|
||||
declare void @bar([16 x i32]* %p)
|
||||
declare i32 @bar([16 x i32]* %p)
|
||||
|
||||
define void @alloca() sanitize_hwaddress "hwasan-abi"="interceptor" {
|
||||
; CHECK: alloca [16 x i32]
|
||||
; CHECK: [[A:%[^ ]*]] = call i8* @llvm.thread.pointer()
|
||||
; CHECK: [[B:%[^ ]*]] = getelementptr i8, i8* [[A]], i32 48
|
||||
; CHECK: [[C:%[^ ]*]] = bitcast i8* [[B]] to i64*
|
||||
|
@ -19,9 +20,11 @@ define void @alloca() sanitize_hwaddress "hwasan-abi"="interceptor" {
|
|||
|
||||
; CHECK: [[CONT]]:
|
||||
; CHECK: phi i64 [ [[LOAD]], %0 ], [ [[RELOAD]], %[[INIT]] ]
|
||||
; CHECK: alloca i8
|
||||
|
||||
%p = alloca [16 x i32]
|
||||
call void @bar([16 x i32]* %p)
|
||||
%size = call i32 @bar([16 x i32]* %p)
|
||||
%q = alloca i8, i32 %size
|
||||
ret void
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue