Skip to content

Commit b218048

Browse files
authored
[hwasan] Consider order of mapping copts (#109621)
Flags "-hwasan-mapping-offset" and "-hwasan-mapping-offset-dynamic" are mutually exclusive, use the last one.
1 parent cfe1adc commit b218048

File tree

2 files changed

+58
-4
lines changed

2 files changed

+58
-4
lines changed

llvm/lib/Transforms/Instrumentation/HWAddressSanitizer.cpp

+8-4
Original file line numberDiff line numberDiff line change
@@ -1937,14 +1937,18 @@ void HWAddressSanitizer::ShadowMapping::init(Triple &TargetTriple,
19371937
// Fuchsia is always PIE, which means that the beginning of the address
19381938
// space is always available.
19391939
SetFixed(0);
1940-
} else if (ClMappingOffset.getNumOccurrences() > 0) {
1941-
SetFixed(ClMappingOffset);
19421940
} else if (ClEnableKhwasan || InstrumentWithCalls) {
19431941
SetFixed(0);
19441942
WithFrameRecord = false;
1945-
} else if (ClMappingOffsetDynamic.getNumOccurrences() > 0) {
1946-
Kind = ClMappingOffsetDynamic;
19471943
}
19481944

19491945
WithFrameRecord = optOr(ClFrameRecords, WithFrameRecord);
1946+
1947+
// Apply the last of ClMappingOffset and ClMappingOffsetDynamic.
1948+
Kind = optOr(ClMappingOffsetDynamic, Kind);
1949+
if (ClMappingOffset.getNumOccurrences() > 0 &&
1950+
!(ClMappingOffsetDynamic.getNumOccurrences() > 0 &&
1951+
ClMappingOffsetDynamic.getPosition() > ClMappingOffset.getPosition())) {
1952+
SetFixed(ClMappingOffset);
1953+
}
19501954
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2+
3+
; RUN: opt < %s -passes=hwasan -S | FileCheck %s
4+
; RUN: opt < %s -passes=hwasan -hwasan-mapping-offset-dynamic=global -S | FileCheck %s --check-prefixes=GLOBAL
5+
; RUN: opt < %s -passes=hwasan -hwasan-mapping-offset=567 -S | FileCheck %s --check-prefixes=FIXED
6+
; RUN: opt < %s -passes=hwasan -hwasan-mapping-offset=567 -hwasan-mapping-offset-dynamic=global -S | FileCheck %s --check-prefixes=FIXED-GLOBAL
7+
; RUN: opt < %s -passes=hwasan -hwasan-mapping-offset-dynamic=global -hwasan-mapping-offset=567 -S | FileCheck %s --check-prefixes=GLOBAL-FIXED
8+
9+
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
10+
target triple = "aarch64--linux-android"
11+
12+
define i8 @test_load8(ptr %a) sanitize_hwaddress {
13+
; CHECK-LABEL: define i8 @test_load8
14+
; CHECK-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
15+
; CHECK-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr @__hwasan_shadow)
16+
; CHECK-NEXT: call void @llvm.hwasan.check.memaccess(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 0)
17+
; CHECK-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
18+
; CHECK-NEXT: ret i8 [[B]]
19+
;
20+
; GLOBAL-LABEL: define i8 @test_load8
21+
; GLOBAL-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
22+
; GLOBAL-NEXT: [[TMP1:%.*]] = load ptr, ptr @__hwasan_shadow_memory_dynamic_address, align 8
23+
; GLOBAL-NEXT: call void @llvm.hwasan.check.memaccess(ptr [[TMP1]], ptr [[A]], i32 0)
24+
; GLOBAL-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
25+
; GLOBAL-NEXT: ret i8 [[B]]
26+
;
27+
; FIXED-LABEL: define i8 @test_load8
28+
; FIXED-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
29+
; FIXED-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr inttoptr (i64 567 to ptr))
30+
; FIXED-NEXT: call void @llvm.hwasan.check.memaccess(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 0)
31+
; FIXED-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
32+
; FIXED-NEXT: ret i8 [[B]]
33+
;
34+
; FIXED-GLOBAL-LABEL: define i8 @test_load8
35+
; FIXED-GLOBAL-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
36+
; FIXED-GLOBAL-NEXT: [[TMP1:%.*]] = load ptr, ptr @__hwasan_shadow_memory_dynamic_address, align 8
37+
; FIXED-GLOBAL-NEXT: call void @llvm.hwasan.check.memaccess(ptr [[TMP1]], ptr [[A]], i32 0)
38+
; FIXED-GLOBAL-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
39+
; FIXED-GLOBAL-NEXT: ret i8 [[B]]
40+
;
41+
; GLOBAL-FIXED-LABEL: define i8 @test_load8
42+
; GLOBAL-FIXED-SAME: (ptr [[A:%.*]]) #[[ATTR0:[0-9]+]] {
43+
; GLOBAL-FIXED-NEXT: [[DOTHWASAN_SHADOW:%.*]] = call ptr asm "", "=r,0"(ptr inttoptr (i64 567 to ptr))
44+
; GLOBAL-FIXED-NEXT: call void @llvm.hwasan.check.memaccess(ptr [[DOTHWASAN_SHADOW]], ptr [[A]], i32 0)
45+
; GLOBAL-FIXED-NEXT: [[B:%.*]] = load i8, ptr [[A]], align 4
46+
; GLOBAL-FIXED-NEXT: ret i8 [[B]]
47+
;
48+
%b = load i8, ptr %a, align 4
49+
ret i8 %b
50+
}

0 commit comments

Comments
 (0)