26 changes: 13 additions & 13 deletions llvm/test/Instrumentation/AddressSanitizer/musttail.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,33 +2,33 @@
;
; RUN: opt < %s -passes=asan -S | FileCheck %s

define internal i32 @foo(i32* %p) sanitize_address {
%rv = load i32, i32* %p
define internal i32 @foo(ptr %p) sanitize_address {
%rv = load i32, ptr %p
ret i32 %rv
}

declare void @alloca_test_use([10 x i8]*)
define i32 @call_foo(i32* %a) sanitize_address {
declare void @alloca_test_use(ptr)
define i32 @call_foo(ptr %a) sanitize_address {
%x = alloca [10 x i8], align 1
call void @alloca_test_use([10 x i8]* %x)
%r = musttail call i32 @foo(i32* %a)
call void @alloca_test_use(ptr %x)
%r = musttail call i32 @foo(ptr %a)
ret i32 %r
}

; CHECK-LABEL: define i32 @call_foo(i32* %a)
; CHECK: %r = musttail call i32 @foo(i32* %a)
; CHECK-LABEL: define i32 @call_foo(ptr %a)
; CHECK: %r = musttail call i32 @foo(ptr %a)
; CHECK-NEXT: ret i32 %r


define i32 @call_foo_cast(i32* %a) sanitize_address {
define i32 @call_foo_cast(ptr %a) sanitize_address {
%x = alloca [10 x i8], align 1
call void @alloca_test_use([10 x i8]* %x)
%r = musttail call i32 @foo(i32* %a)
call void @alloca_test_use(ptr %x)
%r = musttail call i32 @foo(ptr %a)
%t = bitcast i32 %r to i32
ret i32 %t
}

; CHECK-LABEL: define i32 @call_foo_cast(i32* %a)
; CHECK: %r = musttail call i32 @foo(i32* %a)
; CHECK-LABEL: define i32 @call_foo_cast(ptr %a)
; CHECK: %r = musttail call i32 @foo(ptr %a)
; CHECK-NEXT: %t = bitcast i32 %r to i32
; CHECK-NEXT: ret i32 %t
4 changes: 2 additions & 2 deletions llvm/test/Instrumentation/AddressSanitizer/ps4.ll
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
; RUN: opt < %s -passes=asan -S -mtriple=x86_64-scei-ps4 | FileCheck %s
; RUN: opt < %s -passes=asan -S -mtriple=x86_64-sie-ps5 | FileCheck %s

define i32 @read_4_bytes(i32* %a) sanitize_address {
define i32 @read_4_bytes(ptr %a) sanitize_address {
entry:
%tmp1 = load i32, i32* %a, align 4
%tmp1 = load i32, ptr %a, align 4
ret i32 %tmp1
}

Expand Down
12 changes: 6 additions & 6 deletions llvm/test/Instrumentation/AddressSanitizer/scale-offset.ll
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
; RUN: opt < %s -passes=asan -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 {
define i32 @read_offset(ptr %a) sanitize_address {
entry:
%tmp1 = load i32, i32* %a, align 4
%tmp1 = load i32, ptr %a, align 4
ret i32 %tmp1
}
; CHECK-OFFSET-LABEL: @read_offset
Expand All @@ -16,9 +16,9 @@ entry:
; CHECK-OFFSET-NEXT: add{{.*}}3735928559
; CHECK-OFFSET: ret

define i32 @read_scale(i32* %a) sanitize_address {
define i32 @read_scale(ptr %a) sanitize_address {
entry:
%tmp1 = load i32, i32* %a, align 4
%tmp1 = load i32, ptr %a, align 4
ret i32 %tmp1
}
; CHECK-SCALE-LABEL: @read_scale
Expand All @@ -27,9 +27,9 @@ entry:
; CHECK-SCALE-NEXT: add{{.*}}
; CHECK-SCALE: ret

define i32 @read_both(i32* %a) sanitize_address {
define i32 @read_both(ptr %a) sanitize_address {
entry:
%tmp1 = load i32, i32* %a, align 4
%tmp1 = load i32, ptr %a, align 4
ret i32 %tmp1
}
; CHECK-BOTH-LABEL: @read_both
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,157 +7,157 @@
target datalayout = "E-m:e-i64:64-n32:64"
target triple = "powerpc64-unknown-linux-gnu"

declare void @Foo(i8*)
declare void @Foo(ptr)

define void @Bar() uwtable sanitize_address {
entry:
%x = alloca [650 x i8], align 16
%xx = getelementptr inbounds [650 x i8], [650 x i8]* %x, i64 0, i64 0
%xx = getelementptr inbounds [650 x i8], ptr %x, i64 0, i64 0

%y = alloca [13 x i8], align 1
%yy = getelementptr inbounds [13 x i8], [13 x i8]* %y, i64 0, i64 0
%yy = getelementptr inbounds [13 x i8], ptr %y, i64 0, i64 0

%z = alloca [40 x i8], align 1
%zz = getelementptr inbounds [40 x i8], [40 x i8]* %z, i64 0, i64 0
%zz = getelementptr inbounds [40 x i8], ptr %z, i64 0, i64 0

; CHECK: [[SHADOW_BASE:%[0-9]+]] = add i64 %{{[0-9]+}}, 17592186044416

; F1F1F1F1
; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 0
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; ENTRY-NEXT: store [[TYPE]] -235802127, [[TYPE]]* [[PTR]], align 1
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-NEXT: store i32 -235802127, ptr [[PTR]], align 1

; 02F2F2F2F2F2F2F2
; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 85
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; ENTRY-NEXT: store [[TYPE]] 212499257711850226, [[TYPE]]* [[PTR]], align 1
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-NEXT: store i64 212499257711850226, ptr [[PTR]], align 1

; F2F2F2F2F2F2F2F2
; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 93
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; ENTRY-NEXT: store [[TYPE]] -940422246894996750, [[TYPE]]* [[PTR]], align 1
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-NEXT: store i64 -940422246894996750, ptr [[PTR]], align 1

; F20005F2F2000000
; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 101
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; ENTRY-NEXT: store [[TYPE]] -1008799775530680320, [[TYPE]]* [[PTR]], align 1
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-NEXT: store i64 -1008799775530680320, ptr [[PTR]], align 1

; F3F3F3F3
; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 111
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; ENTRY-NEXT: store [[TYPE]] -202116109, [[TYPE]]* [[PTR]], align 1
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-NEXT: store i32 -202116109, ptr [[PTR]], align 1

; F3
; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 115
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i8]]*
; ENTRY-NEXT: store [[TYPE]] -13, [[TYPE]]* [[PTR]], align 1
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-NEXT: store i8 -13, ptr [[PTR]], align 1

; F1F1F1F1
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 0
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -235802127, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i32 -235802127, ptr [[PTR]], align 1

; F8F8F8...
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 4
; ENTRY-UAS-NEXT: call void @__asan_set_shadow_f8(i64 [[OFFSET]], i64 82)

; F2F2F2F2F2F2F2F2
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 86
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -940422246894996750, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i64 -940422246894996750, ptr [[PTR]], align 1

; F2F2F2F2F2F2F2F2
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 94
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -940422246894996750, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i64 -940422246894996750, ptr [[PTR]], align 1

; F8F8F2F2F8F8F8F8
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 102
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -506387832706107144, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i64 -506387832706107144, ptr [[PTR]], align 1

; F8F3F3F3
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 110
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -118230029, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i32 -118230029, ptr [[PTR]], align 1

; F3F3
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 114
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i16]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -3085, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i16 -3085, ptr [[PTR]], align 1

; CHECK-LABEL: %xx = getelementptr inbounds
; CHECK-NEXT: %yy = getelementptr inbounds
; CHECK-NEXT: %zz = getelementptr inbounds


call void @llvm.lifetime.start.p0i8(i64 650, i8* %xx)
call void @llvm.lifetime.start.p0(i64 650, ptr %xx)
; 0000...
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 4
; ENTRY-UAS-NEXT: call void @__asan_set_shadow_00(i64 [[OFFSET]], i64 81)
; 02
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 85
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i8]]*
; ENTRY-UAS-NEXT: store [[TYPE]] 2, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i8 2, ptr [[PTR]], align 1

; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 650, i8* %xx)
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 650, ptr %xx)

call void @Foo(i8* %xx)
; CHECK-NEXT: call void @Foo(i8* %xx)
call void @Foo(ptr %xx)
; CHECK-NEXT: call void @Foo(ptr %xx)

call void @llvm.lifetime.end.p0i8(i64 650, i8* %xx)
call void @llvm.lifetime.end.p0(i64 650, ptr %xx)
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 4
; ENTRY-UAS-NEXT: call void @__asan_set_shadow_f8(i64 [[OFFSET]], i64 82)

; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 650, i8* %xx)
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 650, ptr %xx)


call void @llvm.lifetime.start.p0i8(i64 13, i8* %yy)
call void @llvm.lifetime.start.p0(i64 13, ptr %yy)
; 0005
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 102
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i16]]*
; ENTRY-UAS-NEXT: store [[TYPE]] 5, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i16 5, ptr [[PTR]], align 1

; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 13, i8* %yy)
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 13, ptr %yy)

call void @Foo(i8* %yy)
; CHECK-NEXT: call void @Foo(i8* %yy)
call void @Foo(ptr %yy)
; CHECK-NEXT: call void @Foo(ptr %yy)

call void @llvm.lifetime.end.p0i8(i64 13, i8* %yy)
call void @llvm.lifetime.end.p0(i64 13, ptr %yy)
; F8F8
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 102
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i16]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -1800, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i16 -1800, ptr [[PTR]], align 1

; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 13, i8* %yy)
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 13, ptr %yy)


call void @llvm.lifetime.start.p0i8(i64 40, i8* %zz)
call void @llvm.lifetime.start.p0(i64 40, ptr %zz)
; 00000000
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 106
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; ENTRY-UAS-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i32 0, ptr [[PTR]], align 1
; 00
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 110
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i8]]*
; ENTRY-UAS-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i8 0, ptr [[PTR]], align 1

; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 40, i8* %zz)
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 40, ptr %zz)

call void @Foo(i8* %zz)
; CHECK-NEXT: call void @Foo(i8* %zz)
call void @Foo(ptr %zz)
; CHECK-NEXT: call void @Foo(ptr %zz)

call void @llvm.lifetime.end.p0i8(i64 40, i8* %zz)
call void @llvm.lifetime.end.p0(i64 40, ptr %zz)
; F8F8F8F8
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 106
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -117901064, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i32 -117901064, ptr [[PTR]], align 1
; F8
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 110
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i8]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -8, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i8 -8, ptr [[PTR]], align 1

; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 40, i8* %zz)
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 40, ptr %zz)

; CHECK: {{^[0-9]+}}:

Expand All @@ -170,33 +170,33 @@ entry:

; 00000000
; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 0
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; EXIT-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; EXIT-NEXT: store i32 0, ptr [[PTR]], align 1

; 0000000000000000
; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 85
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; EXIT-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; EXIT-NEXT: store i64 0, ptr [[PTR]], align 1

; 0000000000000000
; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 93
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; EXIT-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; EXIT-NEXT: store i64 0, ptr [[PTR]], align 1

; 0000000000000000
; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 101
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; EXIT-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; EXIT-NEXT: store i64 0, ptr [[PTR]], align 1

; 00000000
; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 111
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; EXIT-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; EXIT-NEXT: store i32 0, ptr [[PTR]], align 1

; 00
; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 115
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i8]]*
; EXIT-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; EXIT-NEXT: store i8 0, ptr [[PTR]], align 1

; 0000...
; EXIT-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 0
Expand All @@ -209,8 +209,8 @@ entry:
; CHECK: ret void
}

declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
declare void @llvm.lifetime.start.p0(i64, ptr nocapture)
declare void @llvm.lifetime.end.p0(i64, ptr nocapture)

; CHECK-ON: declare void @__asan_set_shadow_00(i64, i64)
; CHECK-ON: declare void @__asan_set_shadow_f1(i64, i64)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,157 +7,157 @@
target datalayout = "e-i64:64-f80:128-s:64-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

declare void @Foo(i8*)
declare void @Foo(ptr)

define void @Bar() uwtable sanitize_address {
entry:
%x = alloca [650 x i8], align 16
%xx = getelementptr inbounds [650 x i8], [650 x i8]* %x, i64 0, i64 0
%xx = getelementptr inbounds [650 x i8], ptr %x, i64 0, i64 0

%y = alloca [13 x i8], align 1
%yy = getelementptr inbounds [13 x i8], [13 x i8]* %y, i64 0, i64 0
%yy = getelementptr inbounds [13 x i8], ptr %y, i64 0, i64 0

%z = alloca [40 x i8], align 1
%zz = getelementptr inbounds [40 x i8], [40 x i8]* %z, i64 0, i64 0
%zz = getelementptr inbounds [40 x i8], ptr %z, i64 0, i64 0

; CHECK: [[SHADOW_BASE:%[0-9]+]] = add i64 %{{[0-9]+}}, 2147450880

; F1F1F1F1
; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 0
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; ENTRY-NEXT: store [[TYPE]] -235802127, [[TYPE]]* [[PTR]], align 1
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-NEXT: store i32 -235802127, ptr [[PTR]], align 1

; 02F2F2F2F2F2F2F2
; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 85
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; ENTRY-NEXT: store [[TYPE]] -940422246894996990, [[TYPE]]* [[PTR]], align 1
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-NEXT: store i64 -940422246894996990, ptr [[PTR]], align 1

; F2F2F2F2F2F2F2F2
; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 93
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; ENTRY-NEXT: store [[TYPE]] -940422246894996750, [[TYPE]]* [[PTR]], align 1
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-NEXT: store i64 -940422246894996750, ptr [[PTR]], align 1

; F20005F2F2000000
; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 101
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; ENTRY-NEXT: store [[TYPE]] 1043442499826, [[TYPE]]* [[PTR]], align 1
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-NEXT: store i64 1043442499826, ptr [[PTR]], align 1

; F3F3F3F3
; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 111
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; ENTRY-NEXT: store [[TYPE]] -202116109, [[TYPE]]* [[PTR]], align 1
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-NEXT: store i32 -202116109, ptr [[PTR]], align 1

; F3
; ENTRY-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 115
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i8]]*
; ENTRY-NEXT: store [[TYPE]] -13, [[TYPE]]* [[PTR]], align 1
; ENTRY-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-NEXT: store i8 -13, ptr [[PTR]], align 1

; F1F1F1F1
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 0
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -235802127, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i32 -235802127, ptr [[PTR]], align 1

; F8F8F8...
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 4
; ENTRY-UAS-NEXT: call void @__asan_set_shadow_f8(i64 [[OFFSET]], i64 82)

; F2F2F2F2F2F2F2F2
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 86
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -940422246894996750, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i64 -940422246894996750, ptr [[PTR]], align 1

; F2F2F2F2F2F2F2F2
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 94
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -940422246894996750, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i64 -940422246894996750, ptr [[PTR]], align 1

; F8F8F2F2F8F8F8F8
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 102
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -506381209967593224, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i64 -506381209967593224, ptr [[PTR]], align 1

; F8F3F3F3
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 110
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -202116104, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i32 -202116104, ptr [[PTR]], align 1

; F3F3
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 114
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i16]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -3085, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i16 -3085, ptr [[PTR]], align 1

; CHECK-LABEL: %xx = getelementptr inbounds
; CHECK-NEXT: %yy = getelementptr inbounds
; CHECK-NEXT: %zz = getelementptr inbounds


call void @llvm.lifetime.start.p0i8(i64 650, i8* %xx)
call void @llvm.lifetime.start.p0(i64 650, ptr %xx)
; 0000...
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 4
; ENTRY-UAS-NEXT: call void @__asan_set_shadow_00(i64 [[OFFSET]], i64 81)
; 02
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 85
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i8]]*
; ENTRY-UAS-NEXT: store [[TYPE]] 2, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i8 2, ptr [[PTR]], align 1

; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 650, i8* %xx)
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 650, ptr %xx)

call void @Foo(i8* %xx)
; CHECK-NEXT: call void @Foo(i8* %xx)
call void @Foo(ptr %xx)
; CHECK-NEXT: call void @Foo(ptr %xx)

call void @llvm.lifetime.end.p0i8(i64 650, i8* %xx)
call void @llvm.lifetime.end.p0(i64 650, ptr %xx)
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 4
; ENTRY-UAS-NEXT: call void @__asan_set_shadow_f8(i64 [[OFFSET]], i64 82)

; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 650, i8* %xx)
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 650, ptr %xx)


call void @llvm.lifetime.start.p0i8(i64 13, i8* %yy)
call void @llvm.lifetime.start.p0(i64 13, ptr %yy)
; 0005
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 102
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i16]]*
; ENTRY-UAS-NEXT: store [[TYPE]] 1280, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i16 1280, ptr [[PTR]], align 1

; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 13, i8* %yy)
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 13, ptr %yy)

call void @Foo(i8* %yy)
; CHECK-NEXT: call void @Foo(i8* %yy)
call void @Foo(ptr %yy)
; CHECK-NEXT: call void @Foo(ptr %yy)

call void @llvm.lifetime.end.p0i8(i64 13, i8* %yy)
call void @llvm.lifetime.end.p0(i64 13, ptr %yy)
; F8F8
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 102
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i16]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -1800, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i16 -1800, ptr [[PTR]], align 1

; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 13, i8* %yy)
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 13, ptr %yy)


call void @llvm.lifetime.start.p0i8(i64 40, i8* %zz)
call void @llvm.lifetime.start.p0(i64 40, ptr %zz)
; 00000000
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 106
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; ENTRY-UAS-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i32 0, ptr [[PTR]], align 1
; 00
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 110
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i8]]*
; ENTRY-UAS-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i8 0, ptr [[PTR]], align 1

; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 40, i8* %zz)
; CHECK-NEXT: call void @llvm.lifetime.start.p0(i64 40, ptr %zz)

call void @Foo(i8* %zz)
; CHECK-NEXT: call void @Foo(i8* %zz)
call void @Foo(ptr %zz)
; CHECK-NEXT: call void @Foo(ptr %zz)

call void @llvm.lifetime.end.p0i8(i64 40, i8* %zz)
call void @llvm.lifetime.end.p0(i64 40, ptr %zz)
; F8F8F8F8
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 106
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -117901064, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i32 -117901064, ptr [[PTR]], align 1
; F8
; ENTRY-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 110
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i8]]*
; ENTRY-UAS-NEXT: store [[TYPE]] -8, [[TYPE]]* [[PTR]], align 1
; ENTRY-UAS-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; ENTRY-UAS-NEXT: store i8 -8, ptr [[PTR]], align 1

; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 40, i8* %zz)
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 40, ptr %zz)

; CHECK: {{^[0-9]+}}:

Expand All @@ -170,33 +170,33 @@ entry:

; 00000000
; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 0
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; EXIT-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; EXIT-NEXT: store i32 0, ptr [[PTR]], align 1

; 0000000000000000
; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 85
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; EXIT-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; EXIT-NEXT: store i64 0, ptr [[PTR]], align 1

; 0000000000000000
; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 93
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; EXIT-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; EXIT-NEXT: store i64 0, ptr [[PTR]], align 1

; 0000000000000000
; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 101
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i64]]*
; EXIT-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; EXIT-NEXT: store i64 0, ptr [[PTR]], align 1

; 00000000
; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 111
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i32]]*
; EXIT-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; EXIT-NEXT: store i32 0, ptr [[PTR]], align 1

; 00
; EXIT-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 115
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to [[TYPE:i8]]*
; EXIT-NEXT: store [[TYPE]] 0, [[TYPE]]* [[PTR]], align 1
; EXIT-NEXT: [[PTR:%[0-9]+]] = inttoptr i64 [[OFFSET]] to ptr
; EXIT-NEXT: store i8 0, ptr [[PTR]], align 1

; 0000...
; EXIT-UAS-NEXT: [[OFFSET:%[0-9]+]] = add i64 [[SHADOW_BASE]], 0
Expand All @@ -209,14 +209,12 @@ entry:
; CHECK: ret void
}

declare void @foo(i32*)
declare void @foo(ptr)
define void @PR41481(i1 %b) sanitize_address {
; CHECK-LABEL: @PR41481
entry:
%p1 = alloca i32
%p2 = alloca i32
%q1 = bitcast i32* %p1 to i8*
%q2 = bitcast i32* %p2 to i8*
br label %bb1

; Since we cannot account for all lifetime intrinsics in this function, we
Expand All @@ -226,27 +224,27 @@ entry:
; ENTRY-UAS: store i64 -935356719533264399

bb1:
%p = select i1 %b, i32* %p1, i32* %p2
%q = select i1 %b, i8* %q1, i8* %q2
call void @llvm.lifetime.start.p0i8(i64 4, i8* %q)
call void @foo(i32* %p)
%p = select i1 %b, ptr %p1, ptr %p2
%q = select i1 %b, ptr %p1, ptr %p2
call void @llvm.lifetime.start.p0(i64 4, ptr %q)
call void @foo(ptr %p)
br i1 %b, label %bb2, label %bb3

bb2:
call void @llvm.lifetime.end.p0i8(i64 4, i8* %q1)
call void @llvm.lifetime.end.p0(i64 4, ptr %p1)
br label %end

bb3:
call void @llvm.lifetime.end.p0i8(i64 4, i8* %q2)
call void @llvm.lifetime.end.p0(i64 4, ptr %p2)
br label %end

end:
ret void
}


declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture)
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture)
declare void @llvm.lifetime.start.p0(i64, ptr nocapture)
declare void @llvm.lifetime.end.p0(i64, ptr nocapture)

; CHECK-ON: declare void @__asan_set_shadow_00(i64, i64)
; CHECK-ON: declare void @__asan_set_shadow_f1(i64, i64)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,21 @@ target triple = "x86_64-unknown-linux-gnu"

%struct.A = type { [8 x i32] }

declare i32 @bar(%struct.A*)
declare i32 @bar(ptr)

; Test behavior for named argument with explicit alignment. The memcpy and
; alloca alignments should match the explicit alignment of 64.
define void @foo(%struct.A* byval(%struct.A) align 64 %a) sanitize_address {
define void @foo(ptr byval(%struct.A) align 64 %a) sanitize_address {
entry:
; CHECK-LABEL: foo
; CHECK: call i64 @__asan_stack_malloc
; CHECK: alloca i8, i64 {{.*}} align 64
; CHECK: [[copyPtr:%[^ \t]+]] = inttoptr i64 %{{[^ \t]+}} to %struct.A*
; CHECK: [[copyBytePtr:%[^ \t]+]] = bitcast %struct.A* [[copyPtr]]
; CHECK: [[aBytePtr:%[^ \t]+]] = bitcast %struct.A* %a
; CHECK: call void @llvm.memcpy{{[^%]+}}[[copyBytePtr]]{{[^%]+}} align 64 [[aBytePtr]],{{[^,]+}},
; CHECK: call i32 @bar(%struct.A* [[copyPtr]])
; CHECK: [[copyPtr:%[^ \t]+]] = inttoptr i64 %{{[^ \t]+}} to ptr
; CHECK: call void @llvm.memcpy{{[^%]+}}[[copyPtr]]{{[^%]+}} align 64 %a,{{[^,]+}},
; CHECK: call i32 @bar(ptr [[copyPtr]])
; CHECK: ret void

%call = call i32 @bar(%struct.A* %a)
%call = call i32 @bar(ptr %a)
ret void
}

Expand All @@ -35,18 +33,16 @@ entry:
; minimum alignment of 4 bytes since struct.A contains i32s which have 4-byte
; alignment. However, the alloca alignment will be 32 since that is the value
; passed via the -asan-realign-stack option, which is greater than 4.
define void @baz(%struct.A* byval(%struct.A)) sanitize_address {
define void @baz(ptr byval(%struct.A)) sanitize_address {
entry:
; CHECK-LABEL: baz
; CHECK: call i64 @__asan_stack_malloc
; CHECK: alloca i8, i64 {{.*}} align 32
; CHECK: [[copyPtr:%[^ \t]+]] = inttoptr i64 %{{[^ \t]+}} to %struct.A*
; CHECK: [[copyBytePtr:%[^ \t]+]] = bitcast %struct.A* [[copyPtr]]
; CHECK: [[aBytePtr:%[^ \t]+]] = bitcast %struct.A* %0
; CHECK: call void @llvm.memcpy{{[^%]+}}[[copyBytePtr]]{{[^%]+}} align 4 [[aBytePtr]],{{[^,]+}}
; CHECK: call i32 @bar(%struct.A* [[copyPtr]])
; CHECK: [[copyPtr:%[^ \t]+]] = inttoptr i64 %{{[^ \t]+}} to ptr
; CHECK: call void @llvm.memcpy{{[^%]+}}[[copyPtr]]{{[^%]+}} align 4 %0,{{[^,]+}}
; CHECK: call i32 @bar(ptr [[copyPtr]])
; CHECK: ret void

%call = call i32 @bar(%struct.A* %0)
%call = call i32 @bar(ptr %0)
ret void
}
13 changes: 5 additions & 8 deletions llvm/test/Instrumentation/AddressSanitizer/stack-poisoning.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
target datalayout = "e-i64:64-f80:128-s:64-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

declare void @Foo(i8*)
declare void @Foo(ptr)

define void @Bar() uwtable sanitize_address {
entry:
Expand All @@ -13,7 +13,7 @@ entry:
; CHECK-PLAIN: ret void

; CHECK-UAR-LABEL: Bar
; CHECK-UAR-RUNTIME: load i32, i32* @__asan_option_detect_stack_use_after_return
; CHECK-UAR-RUNTIME: load i32, ptr @__asan_option_detect_stack_use_after_return
; CHECK-UAR-RUNTIME: label
; CHECK-UAR-RUNTIME: call i64 @__asan_stack_malloc_4
; CHECK-UAR-ALWAYS: call i64 @__asan_stack_malloc_always_4
Expand Down Expand Up @@ -48,12 +48,9 @@ entry:
%x = alloca [20 x i8], align 16
%y = alloca [25 x i8], align 1
%z = alloca [500 x i8], align 1
%xx = getelementptr inbounds [20 x i8], [20 x i8]* %x, i64 0, i64 0
call void @Foo(i8* %xx)
%yy = getelementptr inbounds [25 x i8], [25 x i8]* %y, i64 0, i64 0
call void @Foo(i8* %yy)
%zz = getelementptr inbounds [500 x i8], [500 x i8]* %z, i64 0, i64 0
call void @Foo(i8* %zz)
call void @Foo(ptr %x)
call void @Foo(ptr %y)
call void @Foo(ptr %z)
ret void
}

Expand Down
24 changes: 11 additions & 13 deletions llvm/test/Instrumentation/AddressSanitizer/stack_dynamic_alloca.ll
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ entry:
; CHECK-LABEL: Func1

; CHECK: entry:
; CHECK-RUNTIME: load i32, i32* @__asan_option_detect_stack_use_after_return
; COM: CHECK-NORUNTIME-NOT: load i32, i32* @__asan_option_detect_stack_use_after_return
; CHECK-RUNTIME: load i32, ptr @__asan_option_detect_stack_use_after_return
; COM: CHECK-NORUNTIME-NOT: load i32, ptr @__asan_option_detect_stack_use_after_return

; CHECK-RUNTIME: [[UAR_ENABLED_BB:^[0-9]+]]:
; CHECK-RUNTIME: [[FAKE_STACK_RT:%[0-9]+]] = call i64 @__asan_stack_malloc_
Expand All @@ -34,16 +34,15 @@ entry:

; CHECK: [[NO_FAKE_STACK_BB:^[0-9]+]]:
; CHECK: %MyAlloca = alloca i8, i64
; CHECK: [[ALLOCA:%[0-9]+]] = ptrtoint i8* %MyAlloca
; CHECK: [[ALLOCA:%[0-9]+]] = ptrtoint ptr %MyAlloca

; CHECK-RUNTIME: phi i64 [ [[FAKE_STACK]], %[[FAKE_STACK_BB]] ], [ [[ALLOCA]], %[[NO_FAKE_STACK_BB]] ]
; CHECK-ALWAYS: phi i64 [ [[FAKE_STACK_RT]], %entry ], [ [[ALLOCA]], %[[NO_FAKE_STACK_BB]] ]

; CHECK: ret void

%XXX = alloca [20 x i8], align 1
%arr.ptr = bitcast [20 x i8]* %XXX to i8*
store volatile i8 0, i8* %arr.ptr
store volatile i8 0, ptr %XXX
ret void
}

Expand All @@ -55,8 +54,7 @@ entry:
; CHECK: ret void

%XXX = alloca [20 x i8], align 1
%arr.ptr = bitcast [20 x i8]* %XXX to i8*
store volatile i8 0, i8* %arr.ptr
store volatile i8 0, ptr %XXX
call void asm sideeffect "mov %%rbx, %%rcx", "~{dirflag},~{fpsr},~{flags}"() nounwind
ret void
}
Expand All @@ -75,19 +73,19 @@ define void @Func3() uwtable sanitize_address {
; CHECK: ret void
entry:
%a = alloca i32, align 4
%call = call i32 @_setjmp(%struct.__jmp_buf_tag* getelementptr inbounds ([1 x %struct.__jmp_buf_tag], [1 x %struct.__jmp_buf_tag]* @_ZL3buf, i32 0, i32 0)) nounwind returns_twice
%call = call i32 @_setjmp(ptr @_ZL3buf) nounwind returns_twice
%cmp = icmp eq i32 0, %call
br i1 %cmp, label %if.then, label %if.end

if.then: ; preds = %entry
call void @longjmp(%struct.__jmp_buf_tag* getelementptr inbounds ([1 x %struct.__jmp_buf_tag], [1 x %struct.__jmp_buf_tag]* @_ZL3buf, i32 0, i32 0), i32 1) noreturn nounwind
call void @longjmp(ptr @_ZL3buf, i32 1) noreturn nounwind
unreachable

if.end: ; preds = %entry
call void @_Z10escape_ptrPi(i32* %a)
call void @_Z10escape_ptrPi(ptr %a)
ret void
}

declare i32 @_setjmp(%struct.__jmp_buf_tag*) nounwind returns_twice
declare void @longjmp(%struct.__jmp_buf_tag*, i32) noreturn nounwind
declare void @_Z10escape_ptrPi(i32*)
declare i32 @_setjmp(ptr) nounwind returns_twice
declare void @longjmp(ptr, i32) noreturn nounwind
declare void @_Z10escape_ptrPi(ptr)
47 changes: 18 additions & 29 deletions llvm/test/Instrumentation/AddressSanitizer/stack_layout.ll
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

declare void @Use(i8*)
declare void @llvm.lifetime.start.p0i8(i64, i8* nocapture) nounwind
declare void @llvm.lifetime.end.p0i8(i64, i8* nocapture) nounwind
declare void @Use(ptr)
declare void @llvm.lifetime.start.p0(i64, ptr nocapture) nounwind
declare void @llvm.lifetime.end.p0(i64, ptr nocapture) nounwind

; CHECK: private unnamed_addr constant{{.*}}3 32 10 3 XXX 64 20 3 YYY 128 30 3 ZZZ\0
; CHECK: private unnamed_addr constant{{.*}}3 32 5 3 AAA 64 55 3 BBB 160 555 3 CCC\0
Expand All @@ -30,12 +30,9 @@ entry:
%XXX = alloca [10 x i8], align 1
%YYY = alloca [20 x i8], align 1
%ZZZ = alloca [30 x i8], align 1
%arr1.ptr = bitcast [10 x i8]* %XXX to i8*
store volatile i8 0, i8* %arr1.ptr
%arr2.ptr = bitcast [20 x i8]* %YYY to i8*
store volatile i8 0, i8* %arr2.ptr
%arr3.ptr = bitcast [30 x i8]* %ZZZ to i8*
store volatile i8 0, i8* %arr3.ptr
store volatile i8 0, ptr %XXX
store volatile i8 0, ptr %YYY
store volatile i8 0, ptr %ZZZ
ret void
}

Expand All @@ -52,12 +49,9 @@ entry:
%AAA = alloca [5 x i8], align 1
%BBB = alloca [55 x i8], align 1
%CCC = alloca [555 x i8], align 1
%arr1.ptr = bitcast [5 x i8]* %AAA to i8*
store volatile i8 0, i8* %arr1.ptr
%arr2.ptr = bitcast [55 x i8]* %BBB to i8*
store volatile i8 0, i8* %arr2.ptr
%arr3.ptr = bitcast [555 x i8]* %CCC to i8*
store volatile i8 0, i8* %arr3.ptr
store volatile i8 0, ptr %AAA
store volatile i8 0, ptr %BBB
store volatile i8 0, ptr %CCC
ret void
}

Expand All @@ -75,12 +69,9 @@ entry:
%AAA = alloca [128 x i8], align 16
%BBB = alloca [128 x i8], align 64
%CCC = alloca [128 x i8], align 256
%arr1.ptr = bitcast [128 x i8]* %AAA to i8*
store volatile i8 0, i8* %arr1.ptr
%arr2.ptr = bitcast [128 x i8]* %BBB to i8*
store volatile i8 0, i8* %arr2.ptr
%arr3.ptr = bitcast [128 x i8]* %CCC to i8*
store volatile i8 0, i8* %arr3.ptr
store volatile i8 0, ptr %AAA
store volatile i8 0, ptr %BBB
store volatile i8 0, ptr %CCC
ret void
}

Expand All @@ -89,14 +80,12 @@ entry:
define void @Func5() sanitize_address #0 !dbg !11 {
%AAA = alloca i32, align 4 ; File is not the same as !11
%BBB = alloca i32, align 4 ; File is the same as !11
%BBB.ptr = bitcast i32* %BBB to i8*
call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %BBB.ptr), !dbg !12
store volatile i32 5, i32* %BBB, align 4
%AAA.ptr = bitcast i32* %AAA to i8*
call void @llvm.lifetime.start.p0i8(i64 4, i8* nonnull %AAA.ptr), !dbg !14
store volatile i32 3, i32* %AAA, align 4
call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %AAA.ptr), !dbg !17
call void @llvm.lifetime.end.p0i8(i64 4, i8* nonnull %BBB.ptr), !dbg !18
call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %BBB), !dbg !12
store volatile i32 5, ptr %BBB, align 4
call void @llvm.lifetime.start.p0(i64 4, ptr nonnull %AAA), !dbg !14
store volatile i32 3, ptr %AAA, align 4
call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %AAA), !dbg !17
call void @llvm.lifetime.end.p0(i64 4, ptr nonnull %BBB), !dbg !18
ret void
}

Expand Down
30 changes: 15 additions & 15 deletions llvm/test/Instrumentation/AddressSanitizer/str-nobuiltin.ll
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"

declare i8* @memchr(i8* %a, i32 %b, i64 %c)
declare i32 @memcmp(i8* %a, i8* %b, i64 %c)
declare i32 @strcmp(i8* %a, i8* %b)
declare i8* @strcpy(i8* %a, i8* %b)
declare i8* @stpcpy(i8* %a, i8* %b)
declare i64 @strlen(i8* %a)
declare i64 @strnlen(i8* %a, i64 %b)
declare ptr @memchr(ptr %a, i32 %b, i64 %c)
declare i32 @memcmp(ptr %a, ptr %b, i64 %c)
declare i32 @strcmp(ptr %a, ptr %b)
declare ptr @strcpy(ptr %a, ptr %b)
declare ptr @stpcpy(ptr %a, ptr %b)
declare i64 @strlen(ptr %a)
declare i64 @strnlen(ptr %a, i64 %b)

; CHECK: call{{.*}}@memchr{{.*}} #[[ATTR:[0-9]+]]
; CHECK: call{{.*}}@memcmp{{.*}} #[[ATTR]]
Expand All @@ -21,13 +21,13 @@ declare i64 @strnlen(i8* %a, i64 %b)
; CHECK: call{{.*}}@strnlen{{.*}} #[[ATTR]]
; attributes #[[ATTR]] = { nobuiltin }

define void @f1(i8* %a, i8* %b) nounwind uwtable sanitize_address {
tail call i8* @memchr(i8* %a, i32 1, i64 12)
tail call i32 @memcmp(i8* %a, i8* %b, i64 12)
tail call i32 @strcmp(i8* %a, i8* %b)
tail call i8* @strcpy(i8* %a, i8* %b)
tail call i8* @stpcpy(i8* %a, i8* %b)
tail call i64 @strlen(i8* %a)
tail call i64 @strnlen(i8* %a, i64 12)
define void @f1(ptr %a, ptr %b) nounwind uwtable sanitize_address {
tail call ptr @memchr(ptr %a, i32 1, i64 12)
tail call i32 @memcmp(ptr %a, ptr %b, i64 12)
tail call i32 @strcmp(ptr %a, ptr %b)
tail call ptr @strcpy(ptr %a, ptr %b)
tail call ptr @stpcpy(ptr %a, ptr %b)
tail call i64 @strlen(ptr %a)
tail call i64 @strnlen(ptr %a, i64 12)
ret void
}
12 changes: 6 additions & 6 deletions llvm/test/Instrumentation/AddressSanitizer/test64.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
; RUN: opt < %s -passes=asan -asan-mapping-scale=5 -S | FileCheck --check-prefixes=CHECK,CHECK-S5 %s
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
define i32 @read_4_bytes(i32* %a) sanitize_address {
define i32 @read_4_bytes(ptr %a) sanitize_address {
entry:
%tmp1 = load i32, i32* %a, align 4
%tmp1 = load i32, ptr %a, align 4
ret i32 %tmp1
}
; CHECK-LABEL: @read_4_bytes
Expand All @@ -16,9 +16,9 @@ entry:
; CHECK-S5-NEXT: add{{.*}}2147352576
; CHECK: ret

define void @example_atomicrmw(i64* %ptr) nounwind uwtable sanitize_address {
define void @example_atomicrmw(ptr %ptr) nounwind uwtable sanitize_address {
entry:
%0 = atomicrmw add i64* %ptr, i64 1 seq_cst
%0 = atomicrmw add ptr %ptr, i64 1 seq_cst
ret void
}

Expand All @@ -30,9 +30,9 @@ entry:
; CHECK: atomicrmw
; CHECK: ret

define void @example_cmpxchg(i64* %ptr, i64 %compare_to, i64 %new_value) nounwind uwtable sanitize_address {
define void @example_cmpxchg(ptr %ptr, i64 %compare_to, i64 %new_value) nounwind uwtable sanitize_address {
entry:
%0 = cmpxchg i64* %ptr, i64 %compare_to, i64 %new_value seq_cst seq_cst
%0 = cmpxchg ptr %ptr, i64 %compare_to, i64 %new_value seq_cst seq_cst
ret void
}

Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Instrumentation/AddressSanitizer/twice.ll
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
; Check that the address sanitizer pass can be reused
; RUN: opt < %s -S -run-twice -passes=asan

define void @foo(i64* %b) nounwind uwtable sanitize_address {
define void @foo(ptr %b) nounwind uwtable sanitize_address {
entry:
store i64 0, i64* %b, align 1
store i64 0, ptr %b, align 1
ret void
}
65 changes: 32 additions & 33 deletions llvm/test/Instrumentation/AddressSanitizer/ubsan.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,48 +7,47 @@
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"

%struct.A = type { i32 (...)** }
declare void @__ubsan_handle_dynamic_type_cache_miss(i8*, i64, i64) uwtable
declare void @__ubsan_handle_pointer_overflow(i8*, i64, i64) uwtable
%struct.A = type { ptr }
declare void @__ubsan_handle_dynamic_type_cache_miss(ptr, i64, i64) uwtable
declare void @__ubsan_handle_pointer_overflow(ptr, i64, i64) uwtable
@__ubsan_vptr_type_cache = external global [128 x i64]
@.src = private unnamed_addr constant [19 x i8] c"tmp/ubsan/vptr.cpp\00", align 1
@0 = private unnamed_addr constant { i16, i16, [4 x i8] } { i16 -1, i16 0, [4 x i8] c"'A'\00" }
@_ZTI1A = external constant i8*
@1 = private unnamed_addr global { { [19 x i8]*, i32, i32 }, { i16, i16, [4 x i8] }*, i8*, i8 } { { [19 x i8]*, i32, i32 } { [19 x i8]* @.src, i32 2, i32 18 }, { i16, i16, [4 x i8] }* @0, i8* bitcast (i8** @_ZTI1A to i8*), i8 4 }
@2 = private unnamed_addr global { { [19 x i8]*, i32, i32 } } { { [19 x i8]*, i32, i32 } { [19 x i8]* @.src, i32 24, i32 25 } }
@_ZTI1A = external constant ptr
@1 = private unnamed_addr global { { ptr, i32, i32 }, ptr, ptr, i8 } { { ptr, i32, i32 } { ptr @.src, i32 2, i32 18 }, ptr @0, ptr @_ZTI1A, i8 4 }
@2 = private unnamed_addr global { { ptr, i32, i32 } } { { ptr, i32, i32 } { ptr @.src, i32 24, i32 25 } }

define void @_Z3BarP1A(%struct.A* %a) uwtable sanitize_address {
define void @_Z3BarP1A(ptr %a) uwtable sanitize_address {
; CHECK-LABEL: define void @_Z3BarP1A
entry:
%0 = bitcast %struct.A* %a to void (%struct.A*)***
%vtable = load void (%struct.A*)**, void (%struct.A*)*** %0, align 8
%vtable = load ptr, ptr %a, align 8
; CHECK: __asan_report_load8
%1 = load void (%struct.A*)*, void (%struct.A*)** %vtable, align 8
%0 = load ptr, ptr %vtable, align 8
; CHECK: __asan_report_load8
%2 = ptrtoint void (%struct.A*)** %vtable to i64
%3 = xor i64 %2, -303164226014115343, !nosanitize !0
%4 = mul i64 %3, -7070675565921424023, !nosanitize !0
%5 = lshr i64 %4, 47, !nosanitize !0
%6 = xor i64 %4, %2, !nosanitize !0
%7 = xor i64 %6, %5, !nosanitize !0
%8 = mul i64 %7, -7070675565921424023, !nosanitize !0
%9 = lshr i64 %8, 47, !nosanitize !0
%10 = xor i64 %9, %8, !nosanitize !0
%11 = mul i64 %10, -7070675565921424023, !nosanitize !0
%12 = and i64 %11, 127, !nosanitize !0
%13 = getelementptr inbounds [128 x i64], [128 x i64]* @__ubsan_vptr_type_cache, i64 0, i64 %12, !nosanitize !0
%1 = ptrtoint ptr %vtable to i64
%2 = xor i64 %1, -303164226014115343, !nosanitize !0
%3 = mul i64 %2, -7070675565921424023, !nosanitize !0
%4 = lshr i64 %3, 47, !nosanitize !0
%5 = xor i64 %3, %1, !nosanitize !0
%6 = xor i64 %5, %4, !nosanitize !0
%7 = mul i64 %6, -7070675565921424023, !nosanitize !0
%8 = lshr i64 %7, 47, !nosanitize !0
%9 = xor i64 %8, %7, !nosanitize !0
%10 = mul i64 %9, -7070675565921424023, !nosanitize !0
%11 = and i64 %10, 127, !nosanitize !0
%12 = getelementptr inbounds [128 x i64], ptr @__ubsan_vptr_type_cache, i64 0, i64 %11, !nosanitize !0
; CHECK-NOT: __asan_report_load8
%14 = load i64, i64* %13, align 8, !nosanitize !0
%15 = icmp eq i64 %14, %11, !nosanitize !0
br i1 %15, label %cont, label %handler.dynamic_type_cache_miss, !nosanitize !0
%13 = load i64, ptr %12, align 8, !nosanitize !0
%14 = icmp eq i64 %13, %10, !nosanitize !0
br i1 %14, label %cont, label %handler.dynamic_type_cache_miss, !nosanitize !0

handler.dynamic_type_cache_miss: ; preds = %entry
%16 = ptrtoint %struct.A* %a to i64, !nosanitize !0
tail call void @__ubsan_handle_dynamic_type_cache_miss(i8* bitcast ({ { [19 x i8]*, i32, i32 }, { i16, i16, [4 x i8] }*, i8*, i8 }* @1 to i8*), i64 %16, i64 %11) #2, !nosanitize !0
%15 = ptrtoint ptr %a to i64, !nosanitize !0
tail call void @__ubsan_handle_dynamic_type_cache_miss(ptr @1, i64 %15, i64 %10) #2, !nosanitize !0
br label %cont, !nosanitize !0

cont: ; preds = %handler.dynamic_type_cache_miss, %entry
tail call void %1(%struct.A* %a)
tail call void %0(ptr %a)
; CHECK: ret void
ret void
}
Expand All @@ -57,19 +56,19 @@ define void @_Z3foov() uwtable sanitize_address {
; NOCMP-LABEL: define void @_Z3foov
entry:
%bar = alloca [10 x i8], align 1
%arrayidx = getelementptr inbounds [10 x i8], [10 x i8]* %bar, i64 0, i64 4
%0 = ptrtoint [10 x i8]* %bar to i64, !nosanitize !0
%arrayidx = getelementptr inbounds [10 x i8], ptr %bar, i64 0, i64 4
%0 = ptrtoint ptr %bar to i64, !nosanitize !0
; NOCMP-NOT: call void @__sanitizer_ptr_cmp
%1 = icmp ult [10 x i8]* %bar, inttoptr (i64 -4 to [10 x i8]*), !nosanitize !0
%1 = icmp ult ptr %bar, inttoptr (i64 -4 to ptr), !nosanitize !0
br i1 %1, label %cont, label %handler.pointer_overflow, !nosanitize !0

handler.pointer_overflow: ; preds = %entry
%2 = add i64 %0, 4, !nosanitize !0
call void @__ubsan_handle_pointer_overflow(i8* bitcast ({ { [19 x i8]*, i32, i32 } }* @2 to i8*), i64 %0, i64 %2), !nosanitize !0
call void @__ubsan_handle_pointer_overflow(ptr @2, i64 %0, i64 %2), !nosanitize !0
br label %cont, !nosanitize !0

cont: ; preds = %handler.pointer_overflow, %entry
store i8 0, i8* %arrayidx, align 1
store i8 0, ptr %arrayidx, align 1
; NOCMP: ret void
ret void
}
Expand Down
36 changes: 18 additions & 18 deletions llvm/test/Instrumentation/AddressSanitizer/win-sorted-sections.ll
Original file line number Diff line number Diff line change
Expand Up @@ -18,35 +18,35 @@ $__crt_init_begin = comdat any
$__crt_init_callback = comdat any
$__crt_init_end = comdat any

@__pobjMapEntryFirst = weak_odr dso_local constant i8* null, section "ATL$__a", comdat, align 8
@__pobjMapEntryMiddle = weak_odr dso_local constant i8* null, section "ATL$__m", comdat, align 8
@__pobjMapEntryLast = weak_odr dso_local constant i8* null, section "ATL$__z", comdat, align 8
@__crt_init_begin = weak_odr dso_local constant i8* null, section ".CRT$XCA", comdat, align 8
@__crt_init_callback = weak_odr dso_local constant i8* null, section ".CRT$XCU", comdat, align 8
@__crt_init_end = weak_odr dso_local constant i8* null, section ".CRT$XCZ", comdat, align 8
@__pobjMapEntryFirst = weak_odr dso_local constant ptr null, section "ATL$__a", comdat, align 8
@__pobjMapEntryMiddle = weak_odr dso_local constant ptr null, section "ATL$__m", comdat, align 8
@__pobjMapEntryLast = weak_odr dso_local constant ptr null, section "ATL$__z", comdat, align 8
@__crt_init_begin = weak_odr dso_local constant ptr null, section ".CRT$XCA", comdat, align 8
@__crt_init_callback = weak_odr dso_local constant ptr null, section ".CRT$XCU", comdat, align 8
@__crt_init_end = weak_odr dso_local constant ptr null, section ".CRT$XCZ", comdat, align 8

; CHECK: @__pobjMapEntryFirst = weak_odr dso_local constant i8* null, section "ATL$__a", comdat, align 8
; CHECK: @__pobjMapEntryMiddle = weak_odr dso_local constant i8* null, section "ATL$__m", comdat, align 8
; CHECK: @__pobjMapEntryLast = weak_odr dso_local constant i8* null, section "ATL$__z", comdat, align 8
; CHECK: @__crt_init_begin = weak_odr dso_local constant i8* null, section ".CRT$XCA", comdat, align 8
; CHECK: @__crt_init_callback = weak_odr dso_local constant i8* null, section ".CRT$XCU", comdat, align 8
; CHECK: @__crt_init_end = weak_odr dso_local constant i8* null, section ".CRT$XCZ", comdat, align 8
; CHECK: @__pobjMapEntryFirst = weak_odr dso_local constant ptr null, section "ATL$__a", comdat, align 8
; CHECK: @__pobjMapEntryMiddle = weak_odr dso_local constant ptr null, section "ATL$__m", comdat, align 8
; CHECK: @__pobjMapEntryLast = weak_odr dso_local constant ptr null, section "ATL$__z", comdat, align 8
; CHECK: @__crt_init_begin = weak_odr dso_local constant ptr null, section ".CRT$XCA", comdat, align 8
; CHECK: @__crt_init_callback = weak_odr dso_local constant ptr null, section ".CRT$XCU", comdat, align 8
; CHECK: @__crt_init_end = weak_odr dso_local constant ptr null, section ".CRT$XCZ", comdat, align 8

!llvm.asan.globals = !{!0, !2, !4, !6, !8, !10}
!llvm.module.flags = !{!12, !13}
!llvm.ident = !{!14}

!0 = !{i8** @__pobjMapEntryFirst, !1, !"__pobjMapEntryFirst", i1 false, i1 false}
!0 = !{ptr @__pobjMapEntryFirst, !1, !"__pobjMapEntryFirst", i1 false, i1 false}
!1 = !{!"t.c", i32 6, i32 61}
!2 = !{i8** @__pobjMapEntryMiddle, !3, !"__pobjMapEntryMiddle", i1 false, i1 false}
!2 = !{ptr @__pobjMapEntryMiddle, !3, !"__pobjMapEntryMiddle", i1 false, i1 false}
!3 = !{!"t.c", i32 7, i32 61}
!4 = !{i8** @__pobjMapEntryLast, !5, !"__pobjMapEntryLast", i1 false, i1 false}
!4 = !{ptr @__pobjMapEntryLast, !5, !"__pobjMapEntryLast", i1 false, i1 false}
!5 = !{!"t.c", i32 8, i32 61}
!6 = !{i8** @__crt_init_begin, !7, !"__crt_init_begin", i1 false, i1 false}
!6 = !{ptr @__crt_init_begin, !7, !"__crt_init_begin", i1 false, i1 false}
!7 = !{!"t.c", i32 16, i32 62}
!8 = !{i8** @__crt_init_callback, !9, !"__crt_init_callback", i1 false, i1 false}
!8 = !{ptr @__crt_init_callback, !9, !"__crt_init_callback", i1 false, i1 false}
!9 = !{!"t.c", i32 17, i32 62}
!10 = !{i8** @__crt_init_end, !11, !"__crt_init_end", i1 false, i1 false}
!10 = !{ptr @__crt_init_end, !11, !"__crt_init_end", i1 false, i1 false}
!11 = !{!"t.c", i32 18, i32 62}
!12 = !{i32 1, !"wchar_size", i32 2}
!13 = !{i32 7, !"PIC Level", i32 2}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,8 @@

; CHECK: @"__asan_global_??_C@_04JIHMPGLA@asdf?$AA@" =
; CHECK-SAME: private global { i64, i64, i64, i64, i64, i64, i64, i64 }
; CHECK-SAME: { i64 ptrtoint ({ [5 x i8], [27 x i8] }* @"??_C@_04JIHMPGLA@asdf?$AA@" to i64),
; CHECK-SAME: i64 5, i64 32, i64 ptrtoint ([7 x i8]* @___asan_gen_.1 to i64), i64 ptrtoint ([8
; CHECK-SAME: x i8]* @___asan_gen_ to i64), i64 0, i64 0, i64 0 }, section ".ASAN$GL",
; CHECK-SAME: { i64 ptrtoint (ptr @"??_C@_04JIHMPGLA@asdf?$AA@" to i64),
; CHECK-SAME: i64 5, i64 32, i64 ptrtoint (ptr @___asan_gen_.1 to i64), i64 ptrtoint (ptr @___asan_gen_ to i64), i64 0, i64 0, i64 0 }, section ".ASAN$GL",
; CHECK-SAME: comdat($"??_C@_04JIHMPGLA@asdf?$AA@"), align 64

; ModuleID = 't.cpp'
Expand All @@ -27,9 +26,9 @@ $"??_C@_04JIHMPGLA@asdf?$AA@" = comdat any
@"??_C@_04JIHMPGLA@asdf?$AA@" = linkonce_odr dso_local unnamed_addr constant [5 x i8] c"asdf\00", comdat, align 1

; Function Attrs: nounwind sanitize_address uwtable
define dso_local i8* @"?getstr@@YAPEBDXZ"() #0 {
define dso_local ptr @"?getstr@@YAPEBDXZ"() #0 {
entry:
ret i8* getelementptr inbounds ([5 x i8], [5 x i8]* @"??_C@_04JIHMPGLA@asdf?$AA@", i32 0, i32 0)
ret ptr @"??_C@_04JIHMPGLA@asdf?$AA@"
}

attributes #0 = { nounwind sanitize_address uwtable }
Expand Down
16 changes: 8 additions & 8 deletions llvm/test/Instrumentation/AddressSanitizer/with-ifunc.ll
Original file line number Diff line number Diff line change
Expand Up @@ -21,27 +21,27 @@ target triple = "armv7--linux-android22"
; CHECK-IFUNC: @__asan_shadow = external global [0 x i8]
; CHECK-NOIFUNC: @__asan_shadow_memory_dynamic_address = external global i32

define i32 @test_load(i32* %a) sanitize_address {
define i32 @test_load(ptr %a) sanitize_address {
; First instrumentation in the function must be to load the dynamic shadow
; address into a local variable.
; CHECK-LABEL: @test_load
; CHECK: entry:

; CHECK-IFUNC-NEXT: %[[A:[^ ]*]] = ptrtoint i32* %a to i32
; CHECK-IFUNC-NEXT: %[[A:[^ ]*]] = ptrtoint ptr %a to i32
; CHECK-IFUNC-NEXT: %[[B:[^ ]*]] = lshr i32 %[[A]], 3
; CHECK-IFUNC-NEXT: %[[C:[^ ]*]] = add i32 %[[B]], ptrtoint ([0 x i8]* @__asan_shadow to i32)
; CHECK-IFUNC-NEXT: %[[C:[^ ]*]] = add i32 %[[B]], ptrtoint (ptr @__asan_shadow to i32)

; CHECK-IFUNC-NOREMAT-NEXT: %[[S:[^ ]*]] = call i32 asm "", "=r,0"([0 x i8]* @__asan_shadow)
; CHECK-IFUNC-NOREMAT-NEXT: %[[A:[^ ]*]] = ptrtoint i32* %a to i32
; CHECK-IFUNC-NOREMAT-NEXT: %[[S:[^ ]*]] = call i32 asm "", "=r,0"(ptr @__asan_shadow)
; CHECK-IFUNC-NOREMAT-NEXT: %[[A:[^ ]*]] = ptrtoint ptr %a to i32
; CHECK-IFUNC-NOREMAT-NEXT: %[[B:[^ ]*]] = lshr i32 %[[A]], 3
; CHECK-IFUNC-NOREMAT-NEXT: %[[C:[^ ]*]] = add i32 %[[B]], %[[S]]

; CHECK-NOIFUNC-NEXT: %[[SHADOW:[^ ]*]] = load i32, i32* @__asan_shadow_memory_dynamic_address
; CHECK-NOIFUNC-NEXT: %[[A:[^ ]*]] = ptrtoint i32* %a to i32
; CHECK-NOIFUNC-NEXT: %[[SHADOW:[^ ]*]] = load i32, ptr @__asan_shadow_memory_dynamic_address
; CHECK-NOIFUNC-NEXT: %[[A:[^ ]*]] = ptrtoint ptr %a to i32
; CHECK-NOIFUNC-NEXT: %[[B:[^ ]*]] = lshr i32 %[[A]], 3
; CHECK-NOIFUNC-NEXT: %[[C:[^ ]*]] = add i32 %[[B]], %[[SHADOW]]

entry:
%x = load i32, i32* %a, align 4
%x = load i32, ptr %a, align 4
ret i32 %x
}