[llvm] r252213 - [ASan] Disable instrumentation for inalloca variables.

Alexey Samsonov via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 5 13:18:41 PST 2015


Author: samsonov
Date: Thu Nov  5 15:18:41 2015
New Revision: 252213

URL: http://llvm.org/viewvc/llvm-project?rev=252213&view=rev
Log:
[ASan] Disable instrumentation for inalloca variables.

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.

Modified:
    llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
    llvm/trunk/test/Instrumentation/AddressSanitizer/instrument-dynamic-allocas.ll

Modified: llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?rev=252213&r1=252212&r2=252213&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp Thu Nov  5 15:18:41 2015
@@ -840,7 +840,10 @@ bool AddressSanitizer::isInterestingAllo
        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;

Modified: llvm/trunk/test/Instrumentation/AddressSanitizer/instrument-dynamic-allocas.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/instrument-dynamic-allocas.ll?rev=252213&r1=252212&r2=252213&view=diff
==============================================================================
--- llvm/trunk/test/Instrumentation/AddressSanitizer/instrument-dynamic-allocas.ll (original)
+++ llvm/trunk/test/Instrumentation/AddressSanitizer/instrument-dynamic-allocas.ll Thu Nov  5 15:18:41 2015
@@ -7,8 +7,10 @@ target triple = "x86_64-unknown-linux-gn
 
 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)




More information about the llvm-commits mailing list