summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2019-01-25 02:08:46 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2019-01-25 02:08:46 +0000
commit1a8acfb7682d5a28d4fabaef5f75dc394898661f (patch)
tree8a0ff3ef818bbf24a72ce5dc4799e9981ee7cc8e
parentf4e7051c6736e83facc072e06344b7b52bbf2183 (diff)
downloadbcm5719-llvm-1a8acfb7682d5a28d4fabaef5f75dc394898661f.tar.gz
bcm5719-llvm-1a8acfb7682d5a28d4fabaef5f75dc394898661f.zip
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
-rw-r--r--llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp15
-rw-r--r--llvm/test/Instrumentation/HWAddressSanitizer/lazy-thread-init.ll7
2 files changed, 20 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
index 6170b792a68..a6ffff418db 100644
--- a/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp
@@ -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);
diff --git a/llvm/test/Instrumentation/HWAddressSanitizer/lazy-thread-init.ll b/llvm/test/Instrumentation/HWAddressSanitizer/lazy-thread-init.ll
index b02d0f88a0f..d5a2541eb77 100644
--- a/llvm/test/Instrumentation/HWAddressSanitizer/lazy-thread-init.ll
+++ b/llvm/test/Instrumentation/HWAddressSanitizer/lazy-thread-init.ll
@@ -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
}
OpenPOWER on IntegriCloud