Index: lib/Transforms/Instrumentation/AddressSanitizer.cpp =================================================================== --- lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -18,6 +18,7 @@ #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/DepthFirstIterator.h" +#include "llvm/ADT/SetVector.h" #include "llvm/ADT/SmallSet.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/SmallVector.h" @@ -527,7 +528,7 @@ ShadowMapping Mapping; SmallVector AllocaVec; - SmallVector NonInstrumentedStaticAllocaVec; + SmallSetVector NonInstrumentedStaticAllocaVec; SmallVector RetVec; unsigned StackAlignment; @@ -629,7 +630,7 @@ /// \brief Collect Alloca instructions we want (and can) handle. void visitAllocaInst(AllocaInst &AI) { if (!ASan.isInterestingAlloca(AI)) { - if (AI.isStaticAlloca()) NonInstrumentedStaticAllocaVec.push_back(&AI); + if (AI.isStaticAlloca()) NonInstrumentedStaticAllocaVec.insert(&AI); return; } @@ -1743,7 +1744,11 @@ // Make sure non-instrumented allocas stay in the first basic block. // Otherwise, debug info is broken, because only first-basic-block allocas are // treated as regular stack slots. - for (auto *AI : NonInstrumentedStaticAllocaVec) AI->moveBefore(InsBefore); + if (InsBefore->getParent() == &F.getEntryBlock()) + for (BasicBlock::iterator I = InsBefore; I != F.getEntryBlock().end(); ++I) + if (auto *AI = dyn_cast_or_null(I)) + if (NonInstrumentedStaticAllocaVec.count(AI) > 0) + AI->moveBefore(InsBefore); SmallVector SVD; SVD.reserve(AllocaVec.size()); Index: test/Instrumentation/AddressSanitizer/debug_info_noninstrumented_alloca.ll =================================================================== --- test/Instrumentation/AddressSanitizer/debug_info_noninstrumented_alloca.ll +++ test/Instrumentation/AddressSanitizer/debug_info_noninstrumented_alloca.ll @@ -9,18 +9,31 @@ define i32 @foo() sanitize_address { entry: + ; Won't be instrumented because of asan-skip-promotable-allocas. + %non_instrumented1 = alloca i32, align 4 + ; Regular alloca, will get instrumented (forced by the ptrtoint below). %instrumented = alloca i32, align 4 ; Won't be instrumented because of asan-skip-promotable-allocas. - %non_instrumented = alloca i32, align 4 - store i32 0, i32* %non_instrumented, align 4 - %value = load i32, i32* %non_instrumented, align 4 + %non_instrumented2 = alloca i32, align 4 + + br label %bb0 + +bb0: + ; Won't be instrumented because of asan-skip-promotable-allocas. + %non_instrumented3 = alloca i32, align 4 + + %ptr = ptrtoint i32* %instrumented to i32 + br label %bb1 - %ptr = ptrtoint i32* %instrumented to i64 - ret i32 %value +bb1: + ret i32 %ptr } ; CHECK: entry: -; CHECK: %non_instrumented = alloca i32, align 4 +; CHECK: %non_instrumented1 = alloca i32, align 4 +; CHECK: %non_instrumented2 = alloca i32, align 4 ; CHECK: load i32, i32* @__asan_option_detect_stack_use_after_return +; CHECK: bb0: +; CHECK: %non_instrumented3 = alloca i32, align 4