[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