[ASan] Disable instrumentation for inalloca variables.
authorAlexey Samsonov <vonosmas@gmail.com>
Thu, 5 Nov 2015 21:18:41 +0000 (21:18 +0000)
committerAlexey Samsonov <vonosmas@gmail.com>
Thu, 5 Nov 2015 21:18:41 +0000 (21:18 +0000)
inalloca variables were not treated as static allocas, therefore didn't
participate in regular stack instrumentation. We don't want them to
participate in dynamic alloca instrumentation as well.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252213 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Instrumentation/AddressSanitizer.cpp
test/Instrumentation/AddressSanitizer/instrument-dynamic-allocas.ll

index 538cc850295a78bb44802a22babe7361f7115309..1c51264d7376860fe750df5dce94f08b6b74358c 100644 (file)
@@ -840,7 +840,10 @@ bool AddressSanitizer::isInterestingAlloca(AllocaInst &AI) {
        getAllocaSizeInBytes(&AI) > 0 &&
        // We are only interested in allocas not promotable to registers.
        // Promotable allocas are common under -O0.
-       (!ClSkipPromotableAllocas || !isAllocaPromotable(&AI)));
+       (!ClSkipPromotableAllocas || !isAllocaPromotable(&AI)) &&
+       // inalloca allocas are not treated as static, and we don't want
+       // dynamic alloca instrumentation for them as well.
+       !AI.isUsedWithInAlloca());
 
   ProcessedAllocas[&AI] = IsInteresting;
   return IsInteresting;
index ceaf0e6fcfb6d473fc1560d90437ca3e2dea3caa..f6354b1ee59db2fb6fb5c5dfafc3d6f5fe02b84b 100644 (file)
@@ -7,8 +7,10 @@ target triple = "x86_64-unknown-linux-gnu"
 
 define void @foo(i32 %len) sanitize_address {
 entry:
+; CHECK-ALLOCA-LABEL: define void @foo
 ; CHECK-ALLOCA: __asan_alloca_poison
 ; CHECK-ALLOCA: __asan_allocas_unpoison
+; CHECK-ALLOCA: ret void
   %0 = alloca i32, align 4
   %1 = alloca i8*
   store volatile i32 %len, i32* %0, align 4
@@ -19,3 +21,17 @@ entry:
   ret void
 }
 
+; Test that dynamic alloca is not used for inalloca variables.
+define void @has_inalloca() uwtable sanitize_address {
+; CHECK-ALLOCA-LABEL: define void @has_inalloca
+; CHECK-ALLOCA-NOT: __asan_alloca_poison
+; CHECK-ALLOCA-NOT: __asan_alloca_unpoison
+; CHECK-ALLOCA: ret void
+entry:
+  %t = alloca inalloca i32
+  store i32 42, i32* %t
+  call void @pass_inalloca(i32* inalloca %t)
+  ret void
+}
+
+declare void @pass_inalloca(i32* inalloca)