[llvm-commits] [llvm] r160254 - in /llvm/trunk: lib/Transforms/Instrumentation/AddressSanitizer.cpp test/Instrumentation/AddressSanitizer/basic.ll
Kostya Serebryany
kcc at google.com
Mon Jul 16 02:39:06 PDT 2012
FYI
This broke some of the asan tests because multiple calls to __asan_report_*
got merged into one.
Every call to __asan_report_* has unique debug info and merging them leads
to incorrect error messages.
Chandler and I are investigating.
The simple way to reproduce:
% cd llvm/projects/compiler-rt/lib/asan
% clang -g -O1 -faddress-sanitizer output_tests/global-overflow.cc &&
./a.out 2>&1 | ./scripts/asan_symbolize.py /
Should print:
#0 0x403420 in main global-overflow.cc:9
Instead it prints:
#0 0x403420 in main global-overflow.cc:14
Please avoid making other changes to AddressSanitizer.cpp before we resolve
this issue.
--kcc
On Mon, Jul 16, 2012 at 12:58 PM, Chandler Carruth <chandlerc at gmail.com>wrote:
> Author: chandlerc
> Date: Mon Jul 16 03:58:53 2012
> New Revision: 160254
>
> URL: http://llvm.org/viewvc/llvm-project?rev=160254&view=rev
> Log:
> Teach AddressSanitizer to create basic blocks in a more natural order.
> This is particularly useful to the backend code generators which try to
> process things in the incoming function order.
>
> Also, cleanup some uses of IRBuilder to be a bit simpler and more clear.
>
> Modified:
> llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
> llvm/trunk/test/Instrumentation/AddressSanitizer/basic.ll
>
> Modified: llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp?rev=160254&r1=160253&r2=160254&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp
> (original)
> +++ llvm/trunk/lib/Transforms/Instrumentation/AddressSanitizer.cpp Mon Jul
> 16 03:58:53 2012
> @@ -230,17 +230,17 @@
> // Returns the ThenBlock's terminator.
> static BranchInst *splitBlockAndInsertIfThen(Value *Cmp) {
> Instruction *SplitBefore = cast<Instruction>(Cmp)->getNextNode();
> +
> + // Create three basic blocks, with the middle block empty, by splitting
> twice.
> BasicBlock *Head = SplitBefore->getParent();
> - BasicBlock *Tail = Head->splitBasicBlock(SplitBefore);
> + BasicBlock *Then = Head->splitBasicBlock(SplitBefore);
> + BasicBlock *Tail = Then->splitBasicBlock(SplitBefore);
> +
> TerminatorInst *HeadOldTerm = Head->getTerminator();
> - LLVMContext &C = Head->getParent()->getParent()->getContext();
> - BasicBlock *ThenBlock = BasicBlock::Create(C, "", Head->getParent());
> - BranchInst *HeadNewTerm =
> - BranchInst::Create(/*ifTrue*/ThenBlock, /*ifFalse*/Tail, Cmp);
> - ReplaceInstWithInst(HeadOldTerm, HeadNewTerm);
> + IRBuilder<>(HeadOldTerm).CreateCondBr(Cmp, Then, Tail);
> + HeadOldTerm->eraseFromParent();
>
> - BranchInst *CheckTerm = BranchInst::Create(Tail, ThenBlock);
> - return CheckTerm;
> + return cast<BranchInst>(Then->getTerminator());
> }
>
> Value *AddressSanitizer::memToShadow(Value *Shadow, IRBuilder<> &IRB) {
> @@ -387,28 +387,28 @@
> Value *Cmp = IRB.CreateICmpNE(ShadowValue, CmpVal);
>
> Instruction *CheckTerm = splitBlockAndInsertIfThen(Cmp);
> - IRBuilder<> IRB2(CheckTerm);
> + IRB.SetInsertPoint(CheckTerm);
>
> size_t Granularity = 1 << MappingScale;
> if (TypeSize < 8 * Granularity) {
> // Addr & (Granularity - 1)
> - Value *LastAccessedByte = IRB2.CreateAnd(
> + Value *LastAccessedByte = IRB.CreateAnd(
> AddrLong, ConstantInt::get(IntptrTy, Granularity - 1));
> // (Addr & (Granularity - 1)) + size - 1
> if (TypeSize / 8 > 1)
> - LastAccessedByte = IRB2.CreateAdd(
> + LastAccessedByte = IRB.CreateAdd(
> LastAccessedByte, ConstantInt::get(IntptrTy, TypeSize / 8 - 1));
> // (uint8_t) ((Addr & (Granularity-1)) + size - 1)
> - LastAccessedByte = IRB2.CreateIntCast(
> + LastAccessedByte = IRB.CreateIntCast(
> LastAccessedByte, IRB.getInt8Ty(), false);
> // ((uint8_t) ((Addr & (Granularity-1)) + size - 1)) >= ShadowValue
> - Value *Cmp2 = IRB2.CreateICmpSGE(LastAccessedByte, ShadowValue);
> + Value *Cmp2 = IRB.CreateICmpSGE(LastAccessedByte, ShadowValue);
>
> CheckTerm = splitBlockAndInsertIfThen(Cmp2);
> + IRB.SetInsertPoint(CheckTerm);
> }
>
> - IRBuilder<> IRB1(CheckTerm);
> - Instruction *Crash = generateCrashCode(IRB1, AddrLong, IsWrite,
> TypeSize);
> + Instruction *Crash = generateCrashCode(IRB, AddrLong, IsWrite,
> TypeSize);
> Crash->setDebugLoc(OrigIns->getDebugLoc());
> ReplaceInstWithInst(CheckTerm, new UnreachableInst(*C));
> }
>
> Modified: llvm/trunk/test/Instrumentation/AddressSanitizer/basic.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Instrumentation/AddressSanitizer/basic.ll?rev=160254&r1=160253&r2=160254&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/Instrumentation/AddressSanitizer/basic.ll (original)
> +++ llvm/trunk/test/Instrumentation/AddressSanitizer/basic.ll Mon Jul 16
> 03:58:53 2012
> @@ -16,11 +16,6 @@
> ; CHECK: icmp ne i8
> ; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
> ;
> -; The actual load comes next because ASan adds the last instrumentation
> block
> -; to the end of the function.
> -; CHECK: %tmp1 = load i32* %a
> -; CHECK: ret i32 %tmp1
> -;
> ; First instrumentation block refines the shadow test.
> ; CHECK: and i64 %[[LOAD_ADDR]], 7
> ; CHECK: add i64 %{{.*}}, 3
> @@ -28,9 +23,13 @@
> ; CHECK: icmp sge i8 %{{.*}}, %[[LOAD_SHADOW]]
> ; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
> ;
> -; Final instrumentation block reports the error.
> +; Second instrumentation block reports the error.
> ; CHECK: call void @__asan_report_load4(i64 %[[LOAD_ADDR]]) noreturn
> ; CHECK: unreachable
> +;
> +; Finally the instrumented load.
> +; CHECK: %tmp1 = load i32* %a
> +; CHECK: ret i32 %tmp1
>
> entry:
> %tmp1 = load i32* %a
> @@ -48,11 +47,6 @@
> ; CHECK: icmp ne i8
> ; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
> ;
> -; The actual store comes next because ASan adds the last instrumentation
> block
> -; to the end of the function.
> -; CHECK: store i32 42, i32* %a
> -; CHECK: ret void
> -;
> ; First instrumentation block refines the shadow test.
> ; CHECK: and i64 %[[STORE_ADDR]], 7
> ; CHECK: add i64 %{{.*}}, 3
> @@ -60,9 +54,13 @@
> ; CHECK: icmp sge i8 %{{.*}}, %[[STORE_SHADOW]]
> ; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}
> ;
> -; Final instrumentation block reports the error.
> +; Second instrumentation block reports the error.
> ; CHECK: call void @__asan_report_store4(i64 %[[STORE_ADDR]]) noreturn
> ; CHECK: unreachable
> +;
> +; Finally the instrumented store.
> +; CHECK: store i32 42, i32* %a
> +; CHECK: ret void
>
> entry:
> store i32 42, i32* %a
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20120716/2c6a7a02/attachment.html>
More information about the llvm-commits
mailing list