[PATCH] D18865: [asan] add option to set shadow mapping offset

Aaron Carroll via llvm-commits llvm-commits at lists.llvm.org
Tue May 3 10:00:31 PDT 2016


I think it’s still useful for porting. By stand-alone I mean a situation where you have no 3rd-party dependents so there’s no need to hard-code the shadow offset.

> On May 3, 2016, at 07:50, Filipe Cabecinhas <filcab+llvm.phabricator at gmail.com> wrote:
> 
> 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