39 lines · plain
1; Test -asan-with-ifunc flag.2;3; RUN: opt -passes=asan -S -asan-with-ifunc=0 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-NOIFUNC4; RUN: opt -passes=asan -S -asan-with-ifunc=1 -asan-with-ifunc-suppress-remat=0 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-IFUNC5; RUN: opt -passes=asan -S -asan-with-ifunc=1 -asan-with-ifunc-suppress-remat=1 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-IFUNC-NOREMAT6 7; RUN: opt -passes=asan -S -asan-with-ifunc=1 -asan-with-ifunc-suppress-remat=0 -mtriple=armv7-linux-android < %s | FileCheck %s --check-prefixes=CHECK,CHECK-IFUNC8 9target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"10target triple = "armv7--linux-android"11 12; CHECK-IFUNC: @__asan_shadow = external global [0 x i8]13; CHECK-NOIFUNC: @__asan_shadow_memory_dynamic_address = external global i3214 15define i32 @test_load(ptr %a) sanitize_address {16; First instrumentation in the function must be to load the dynamic shadow17; address into a local variable.18; CHECK-LABEL: @test_load19; CHECK: entry:20 21; CHECK-IFUNC-NEXT: %[[A:[^ ]*]] = ptrtoint ptr %a to i3222; CHECK-IFUNC-NEXT: %[[B:[^ ]*]] = lshr i32 %[[A]], 323; CHECK-IFUNC-NEXT: %[[C:[^ ]*]] = add i32 %[[B]], ptrtoint (ptr @__asan_shadow to i32)24 25; CHECK-IFUNC-NOREMAT-NEXT: %[[S:[^ ]*]] = call i32 asm "", "=r,0"(ptr @__asan_shadow)26; CHECK-IFUNC-NOREMAT-NEXT: %[[A:[^ ]*]] = ptrtoint ptr %a to i3227; CHECK-IFUNC-NOREMAT-NEXT: %[[B:[^ ]*]] = lshr i32 %[[A]], 328; CHECK-IFUNC-NOREMAT-NEXT: %[[C:[^ ]*]] = add i32 %[[B]], %[[S]]29 30; CHECK-NOIFUNC-NEXT: %[[SHADOW:[^ ]*]] = load i32, ptr @__asan_shadow_memory_dynamic_address31; CHECK-NOIFUNC-NEXT: %[[A:[^ ]*]] = ptrtoint ptr %a to i3232; CHECK-NOIFUNC-NEXT: %[[B:[^ ]*]] = lshr i32 %[[A]], 333; CHECK-NOIFUNC-NEXT: %[[C:[^ ]*]] = add i32 %[[B]], %[[SHADOW]]34 35entry:36 %x = load i32, ptr %a, align 437 ret i32 %x38}39