[PATCH] D18865: [asan] add option to set shadow mapping offset
Filipe Cabecinhas via llvm-commits
llvm-commits at lists.llvm.org
Tue May 3 07:50:20 PDT 2016
This was removed back in r202033 by Kostya.
It's mostly only useful when starting to port ASan, AFAICT.
I'm curious, what do you mean with "stand-alone ASAN implementations"?
Thank you,
Filipe
On Mon, May 2, 2016 at 10:11 PM, Aaron Carroll <aaronc at apple.com> wrote:
> aaronc updated this revision to Diff 55895.
> aaronc added a comment.
>
> Missed llvm-commits at . Resending with same diff.
>
>
> http://reviews.llvm.org/D18865
>
> Files:
> lib/Transforms/Instrumentation/AddressSanitizer.cpp
> test/Instrumentation/AddressSanitizer/scale-offset.ll
>
> Index: test/Instrumentation/AddressSanitizer/scale-offset.ll
> ===================================================================
> --- /dev/null
> +++ test/Instrumentation/AddressSanitizer/scale-offset.ll
> @@ -0,0 +1,39 @@
> +; Test that the scale (-asan-mapping-scale) and offset (-asan-mapping-offset) command-line options work as expected
> +;
> +; RUN: opt < %s -asan -asan-module -asan-mapping-offset 0xdeadbeef -S | FileCheck --check-prefix=CHECK-OFFSET %s
> +; RUN: opt < %s -asan -asan-module -asan-mapping-scale 1 -S | FileCheck --check-prefix=CHECK-SCALE %s
> +; RUN: opt < %s -asan -asan-module -asan-mapping-offset 0xc0ffee -asan-mapping-scale 0 -S | FileCheck --check-prefix=CHECK-BOTH %s
> +target triple = "x86_64-unknown-linux-gnu"
> +
> +define i32 @read_offset(i32* %a) sanitize_address {
> +entry:
> + %tmp1 = load i32, i32* %a, align 4
> + ret i32 %tmp1
> +}
> +; CHECK-OFFSET-LABEL: @read_offset
> +; CHECK-OFFSET-NOT: ret
> +; CHECK-OFFSET: lshr {{.*}} 3
> +; CHECK-OFFSET-NEXT: add{{.*}}3735928559
> +; CHECK-OFFSET: ret
> +
> +define i32 @read_scale(i32* %a) sanitize_address {
> +entry:
> + %tmp1 = load i32, i32* %a, align 4
> + ret i32 %tmp1
> +}
> +; CHECK-SCALE-LABEL: @read_scale
> +; CHECK-SCALE-NOT: ret
> +; CHECK-SCALE: lshr {{.*}} 1
> +; CHECK-SCALE-NEXT: add{{.*}}
> +; CHECK-SCALE: ret
> +
> +define i32 @read_both(i32* %a) sanitize_address {
> +entry:
> + %tmp1 = load i32, i32* %a, align 4
> + ret i32 %tmp1
> +}
> +; CHECK-BOTH-LABEL: @read_both
> +; CHECK-BOTH-NOT: ret
> +; CHECK-BOTH: lshr {{.*}} 0
> +; CHECK-BOTH-NEXT: add{{.*}}12648430
> +; CHECK-BOTH: ret
> Index: lib/Transforms/Instrumentation/AddressSanitizer.cpp
> ===================================================================
> --- lib/Transforms/Instrumentation/AddressSanitizer.cpp
> +++ lib/Transforms/Instrumentation/AddressSanitizer.cpp
> @@ -204,10 +204,13 @@
>
> // These flags allow to change the shadow mapping.
> // The shadow mapping looks like
> -// Shadow = (Mem >> scale) + (1 << offset_log)
> +// Shadow = (Mem >> scale) + offset
> static cl::opt<int> ClMappingScale("asan-mapping-scale",
> cl::desc("scale of asan shadow mapping"),
> cl::Hidden, cl::init(0));
> +static cl::opt<uint64_t> ClMappingOffset("asan-mapping-offset",
> + cl::desc("offset of asan shadow mapping [EXPERIMENTAL]"),
> + cl::Hidden, cl::init(0));
>
> // Optimization flags. Not user visible, used mostly for testing
> // and benchmarking the tool.
> @@ -404,10 +407,14 @@
> }
>
> Mapping.Scale = kDefaultShadowScale;
> - if (ClMappingScale) {
> + if (ClMappingScale.getNumOccurrences() > 0) {
> Mapping.Scale = ClMappingScale;
> }
>
> + if (ClMappingOffset.getNumOccurrences() > 0) {
> + Mapping.Offset = ClMappingOffset;
> + }
> +
> // OR-ing shadow offset if more efficient (at least on x86) if the offset
> // is a power of two, but on ppc64 we have to use add since the shadow
> // offset is not necessary 1/8-th of the address space. On SystemZ,
>
>
More information about the llvm-commits
mailing list