1; RUN: opt < %s -asan -asan-module -asan-globals-live-support=1 -S | FileCheck %s 2; RUN: opt < %s -asan -asan-module -asan-globals-live-support=1 -asan-mapping-scale=5 -S | FileCheck %s 3target 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" 4target triple = "x86_64-unknown-linux-gnu" 5@xxx = global i32 0, align 4 6 7; If a global is present, __asan_[un]register_globals should be called from 8; module ctor/dtor 9 10; CHECK: @___asan_gen_ = private constant [8 x i8] c"<stdin>\00", align 1 11; CHECK: llvm.global_ctors 12; CHECK: llvm.global_dtors 13 14; Test that we don't instrument global arrays with static initializer 15; indexed with constants in-bounds. But instrument all other cases. 16 17@GlobSt = global [10 x i32] zeroinitializer, align 16 ; static initializer 18@GlobDy = global [10 x i32] zeroinitializer, align 16 ; dynamic initializer 19@GlobEx = external global [10 x i32] , align 16 ; extern initializer 20 21; GlobSt is declared here, and has static initializer -- ok to optimize. 22define i32 @AccessGlobSt_0_2() sanitize_address { 23entry: 24 %0 = load i32, i32* getelementptr inbounds ([10 x i32], [10 x i32]* @GlobSt, i64 0, i64 2), align 8 25 ret i32 %0 26; CHECK-LABEL: define i32 @AccessGlobSt_0_2 27; CHECK-NOT: __asan_report 28; CHECK: ret i32 %0 29} 30 31; GlobSt is accessed out of bounds -- can't optimize 32define i32 @AccessGlobSt_0_12() sanitize_address { 33entry: 34 %0 = load i32, i32* getelementptr inbounds ([10 x i32], [10 x i32]* @GlobSt, i64 0, i64 12), align 8 35 ret i32 %0 36; CHECK-LABEL: define i32 @AccessGlobSt_0_12 37; CHECK: __asan_report 38; CHECK: ret i32 39} 40 41; GlobSt is accessed with Gep that has non-0 first index -- can't optimize. 42define i32 @AccessGlobSt_1_2() sanitize_address { 43entry: 44 %0 = load i32, i32* getelementptr inbounds ([10 x i32], [10 x i32]* @GlobSt, i64 1, i64 2), align 8 45 ret i32 %0 46; CHECK-LABEL: define i32 @AccessGlobSt_1_2 47; CHECK: __asan_report 48; CHECK: ret i32 49} 50 51; GlobDy is declared with dynamic initializer -- can't optimize. 52define i32 @AccessGlobDy_0_2() sanitize_address { 53entry: 54 %0 = load i32, i32* getelementptr inbounds ([10 x i32], [10 x i32]* @GlobDy, i64 0, i64 2), align 8 55 ret i32 %0 56; CHECK-LABEL: define i32 @AccessGlobDy_0_2 57; CHECK: __asan_report 58; CHECK: ret i32 59} 60 61; GlobEx is an external global -- can't optimize. 62define i32 @AccessGlobEx_0_2() sanitize_address { 63entry: 64 %0 = load i32, i32* getelementptr inbounds ([10 x i32], [10 x i32]* @GlobEx, i64 0, i64 2), align 8 65 ret i32 %0 66; CHECK-LABEL: define i32 @AccessGlobEx_0_2 67; CHECK: __asan_report 68; CHECK: ret i32 69} 70 71 72!llvm.asan.globals = !{!0} 73!0 = !{[10 x i32]* @GlobDy, null, null, i1 true, i1 false} 74 75; CHECK-LABEL: define internal void @asan.module_ctor 76; CHECK-NOT: ret 77; CHECK: call void @__asan_register_elf_globals 78; CHECK: ret 79 80; CHECK-LABEL: define internal void @asan.module_dtor 81; CHECK-NOT: ret 82; CHECK: call void @__asan_unregister_elf_globals 83; CHECK: ret 84