Changeset View
Changeset View
Standalone View
Standalone View
llvm/trunk/test/Instrumentation/AddressSanitizer/basic.ll
; Test basic address sanitizer instrumentation. | ; Test basic address sanitizer instrumentation. | ||||
; | ; | ||||
; RUN: opt < %s -asan -asan-module -S | FileCheck %s | ; RUN: opt < %s -asan -asan-module -S | FileCheck --check-prefixes=CHECK,CHECK-S3 %s | ||||
; RUN: opt < %s -asan -asan-module -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 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" | target triple = "x86_64-unknown-linux-gnu" | ||||
; CHECK: @llvm.global_ctors = {{.*}}@asan.module_ctor | ; CHECK: @llvm.global_ctors = {{.*}}@asan.module_ctor | ||||
define i32 @test_load(i32* %a) sanitize_address { | define i32 @test_load(i32* %a) sanitize_address { | ||||
; CHECK-LABEL: @test_load | ; CHECK-LABEL: @test_load | ||||
; CHECK-NOT: load | ; CHECK-NOT: load | ||||
; CHECK: %[[LOAD_ADDR:[^ ]*]] = ptrtoint i32* %a to i64 | ; CHECK: %[[LOAD_ADDR:[^ ]*]] = ptrtoint i32* %a to i64 | ||||
; CHECK: lshr i64 %[[LOAD_ADDR]], 3 | ; CHECK-S3: lshr i64 %[[LOAD_ADDR]], 3 | ||||
; CHECK-S5: lshr i64 %[[LOAD_ADDR]], 5 | |||||
; CHECK: {{or|add}} | ; CHECK: {{or|add}} | ||||
; CHECK: %[[LOAD_SHADOW_PTR:[^ ]*]] = inttoptr | ; CHECK: %[[LOAD_SHADOW_PTR:[^ ]*]] = inttoptr | ||||
; CHECK: %[[LOAD_SHADOW:[^ ]*]] = load i8, i8* %[[LOAD_SHADOW_PTR]] | ; CHECK: %[[LOAD_SHADOW:[^ ]*]] = load i8, i8* %[[LOAD_SHADOW_PTR]] | ||||
; CHECK: icmp ne i8 | ; CHECK: icmp ne i8 | ||||
; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}!prof ![[PROF:[0-9]+]] | ; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}}!prof ![[PROF:[0-9]+]] | ||||
; | ; | ||||
; First instrumentation block refines the shadow test. | ; First instrumentation block refines the shadow test. | ||||
; CHECK: and i64 %[[LOAD_ADDR]], 7 | ; CHECK-S3: and i64 %[[LOAD_ADDR]], 7 | ||||
; CHECK-S5: and i64 %[[LOAD_ADDR]], 31 | |||||
; CHECK: add i64 %{{.*}}, 3 | ; CHECK: add i64 %{{.*}}, 3 | ||||
; CHECK: trunc i64 %{{.*}} to i8 | ; CHECK: trunc i64 %{{.*}} to i8 | ||||
; CHECK: icmp sge i8 %{{.*}}, %[[LOAD_SHADOW]] | ; CHECK: icmp sge i8 %{{.*}}, %[[LOAD_SHADOW]] | ||||
; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} | ; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} | ||||
; | ; | ||||
; The crash block reports the error. | ; The crash block reports the error. | ||||
; CHECK: call void @__asan_report_load4(i64 %[[LOAD_ADDR]]) | ; CHECK: call void @__asan_report_load4(i64 %[[LOAD_ADDR]]) | ||||
; CHECK: unreachable | ; CHECK: unreachable | ||||
; | ; | ||||
; The actual load. | ; The actual load. | ||||
; CHECK: %tmp1 = load i32, i32* %a | ; CHECK: %tmp1 = load i32, i32* %a | ||||
; CHECK: ret i32 %tmp1 | ; CHECK: ret i32 %tmp1 | ||||
entry: | entry: | ||||
%tmp1 = load i32, i32* %a, align 4 | %tmp1 = load i32, i32* %a, align 4 | ||||
ret i32 %tmp1 | ret i32 %tmp1 | ||||
} | } | ||||
define void @test_store(i32* %a) sanitize_address { | define void @test_store(i32* %a) sanitize_address { | ||||
; CHECK-LABEL: @test_store | ; CHECK-LABEL: @test_store | ||||
; CHECK-NOT: store | ; CHECK-NOT: store | ||||
; CHECK: %[[STORE_ADDR:[^ ]*]] = ptrtoint i32* %a to i64 | ; CHECK: %[[STORE_ADDR:[^ ]*]] = ptrtoint i32* %a to i64 | ||||
; CHECK: lshr i64 %[[STORE_ADDR]], 3 | ; CHECK-S3: lshr i64 %[[STORE_ADDR]], 3 | ||||
; CHECK-S5: lshr i64 %[[STORE_ADDR]], 5 | |||||
; CHECK: {{or|add}} | ; CHECK: {{or|add}} | ||||
; CHECK: %[[STORE_SHADOW_PTR:[^ ]*]] = inttoptr | ; CHECK: %[[STORE_SHADOW_PTR:[^ ]*]] = inttoptr | ||||
; CHECK: %[[STORE_SHADOW:[^ ]*]] = load i8, i8* %[[STORE_SHADOW_PTR]] | ; CHECK: %[[STORE_SHADOW:[^ ]*]] = load i8, i8* %[[STORE_SHADOW_PTR]] | ||||
; CHECK: icmp ne i8 | ; CHECK: icmp ne i8 | ||||
; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} | ; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} | ||||
; | ; | ||||
; First instrumentation block refines the shadow test. | ; First instrumentation block refines the shadow test. | ||||
; CHECK: and i64 %[[STORE_ADDR]], 7 | ; CHECK-S3: and i64 %[[STORE_ADDR]], 7 | ||||
; CHECK-S5: and i64 %[[STORE_ADDR]], 31 | |||||
; CHECK: add i64 %{{.*}}, 3 | ; CHECK: add i64 %{{.*}}, 3 | ||||
; CHECK: trunc i64 %{{.*}} to i8 | ; CHECK: trunc i64 %{{.*}} to i8 | ||||
; CHECK: icmp sge i8 %{{.*}}, %[[STORE_SHADOW]] | ; CHECK: icmp sge i8 %{{.*}}, %[[STORE_SHADOW]] | ||||
; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} | ; CHECK: br i1 %{{.*}}, label %{{.*}}, label %{{.*}} | ||||
; | ; | ||||
; The crash block reports the error. | ; The crash block reports the error. | ||||
; CHECK: call void @__asan_report_store4(i64 %[[STORE_ADDR]]) | ; CHECK: call void @__asan_report_store4(i64 %[[STORE_ADDR]]) | ||||
; CHECK: unreachable | ; CHECK: unreachable | ||||
▲ Show 20 Lines • Show All 161 Lines • Show Last 20 Lines |