mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 20:23:11 +01:00
b812d3d3ad
Userspace page aliasing allows us to use middle pointer bits for tags without untagging them before syscalls or accesses. This should enable easier experimentation with HWASan on x86_64 platforms. Currently stack, global, and secondary heap tagging are unsupported. Only primary heap allocations get tagged. Note that aliasing mode will not work properly in the presence of fork(), since heap memory will be shared between the parent and child processes. This mode is non-ideal; we expect Intel LAM to enable full HWASan support on x86_64 in the future. Reviewed By: vitalybuka, eugenis Differential Revision: https://reviews.llvm.org/D98875
85 lines
2.2 KiB
LLVM
85 lines
2.2 KiB
LLVM
; Test basic address sanitizer instrumentation.
|
|
; Generic code is covered by ../basic.ll, only the x86_64 specific code is
|
|
; tested here.
|
|
;
|
|
; RUN: opt < %s -hwasan -hwasan-recover=0 -S | FileCheck %s --check-prefixes=CHECK,ABORT
|
|
; RUN: opt < %s -hwasan -hwasan-recover=1 -S | FileCheck %s --check-prefixes=CHECK,RECOVER
|
|
|
|
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
|
|
target triple = "x86_64-unknown-linux-gnu"
|
|
|
|
define i8 @test_load8(i8* %a) sanitize_hwaddress {
|
|
; CHECK-LABEL: @test_load8(
|
|
; CHECK: %[[A:[^ ]*]] = ptrtoint i8* %a to i64
|
|
|
|
; ABORT: call void @__hwasan_load1(i64 %[[A]])
|
|
; RECOVER: call void @__hwasan_load1_noabort(i64 %[[A]])
|
|
|
|
; CHECK: %[[G:[^ ]*]] = load i8, i8* %a, align 4
|
|
; CHECK: ret i8 %[[G]]
|
|
|
|
entry:
|
|
%b = load i8, i8* %a, align 4
|
|
ret i8 %b
|
|
}
|
|
|
|
define i40 @test_load40(i40* %a) sanitize_hwaddress {
|
|
; CHECK-LABEL: @test_load40(
|
|
; CHECK: %[[A:[^ ]*]] = ptrtoint i40* %a to i64
|
|
|
|
; ABORT: call void @__hwasan_loadN(i64 %[[A]], i64 5)
|
|
; RECOVER: call void @__hwasan_loadN_noabort(i64 %[[A]], i64 5)
|
|
|
|
; CHECK: %[[B:[^ ]*]] = load i40, i40* %a
|
|
; CHECK: ret i40 %[[B]]
|
|
|
|
entry:
|
|
%b = load i40, i40* %a, align 4
|
|
ret i40 %b
|
|
}
|
|
|
|
define void @test_store8(i8* %a, i8 %b) sanitize_hwaddress {
|
|
; CHECK-LABEL: @test_store8(
|
|
; CHECK: %[[A:[^ ]*]] = ptrtoint i8* %a to i64
|
|
|
|
; ABORT: call void @__hwasan_store1(i64 %[[A]])
|
|
; RECOVER: call void @__hwasan_store1_noabort(i64 %[[A]])
|
|
|
|
; CHECK: store i8 %b, i8* %a, align 4
|
|
; CHECK: ret void
|
|
|
|
entry:
|
|
store i8 %b, i8* %a, align 4
|
|
ret void
|
|
}
|
|
|
|
define void @test_store40(i40* %a, i40 %b) sanitize_hwaddress {
|
|
; CHECK-LABEL: @test_store40(
|
|
; CHECK: %[[A:[^ ]*]] = ptrtoint i40* %a to i64
|
|
|
|
; ABORT: call void @__hwasan_storeN(i64 %[[A]], i64 5)
|
|
; RECOVER: call void @__hwasan_storeN_noabort(i64 %[[A]], i64 5)
|
|
|
|
; CHECK: store i40 %b, i40* %a
|
|
; CHECK: ret void
|
|
|
|
entry:
|
|
store i40 %b, i40* %a, align 4
|
|
ret void
|
|
}
|
|
|
|
define void @test_store_unaligned(i64* %a, i64 %b) sanitize_hwaddress {
|
|
; CHECK-LABEL: @test_store_unaligned(
|
|
; CHECK: %[[A:[^ ]*]] = ptrtoint i64* %a to i64
|
|
|
|
; ABORT: call void @__hwasan_storeN(i64 %[[A]], i64 8)
|
|
; RECOVER: call void @__hwasan_storeN_noabort(i64 %[[A]], i64 8)
|
|
|
|
; CHECK: store i64 %b, i64* %a, align 4
|
|
; CHECK: ret void
|
|
|
|
entry:
|
|
store i64 %b, i64* %a, align 4
|
|
ret void
|
|
}
|