1; RUN: opt < %s -asan -asan-module -S | FileCheck %s 2target 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" 3target triple = "x86_64-unknown-linux-gnu" 4@xxx = internal global i32 0, align 4 ; With dynamic initializer. 5@XXX = global i32 0, align 4 ; With dynamic initializer. 6@yyy = internal global i32 0, align 4 ; W/o dynamic initializer. 7@YYY = global i32 0, align 4 ; W/o dynamic initializer. 8; Clang will emit the following metadata identifying @xxx as dynamically 9; initialized. 10!0 = metadata !{i32* @xxx} 11!1 = metadata !{i32* @XXX} 12!llvm.asan.dynamically_initialized_globals = !{!0, !1} 13 14define i32 @initializer() uwtable { 15entry: 16 ret i32 42 17} 18 19define internal void @__cxx_global_var_init() section ".text.startup" { 20entry: 21 %call = call i32 @initializer() 22 store i32 %call, i32* @xxx, align 4 23 ret void 24} 25 26define internal void @_GLOBAL__I_a() sanitize_address section ".text.startup" { 27entry: 28 call void @__cxx_global_var_init() 29 ret void 30} 31 32; Clang indicated that @xxx was dynamically initailized. 33; __asan_{before,after}_dynamic_init should be called from _GLOBAL__I_a 34 35; CHECK: define internal void @_GLOBAL__I_a 36; CHECK-NOT: ret 37; CHECK: call void @__asan_before_dynamic_init 38; CHECK: call void @__cxx_global_var_init 39; CHECK: call void @__asan_after_dynamic_init 40; CHECK: ret 41 42; Check that xxx is instrumented. 43define void @touch_xxx() sanitize_address { 44 store i32 0, i32 *@xxx, align 4 45 ret void 46; CHECK: define void @touch_xxx 47; CHECK: call void @__asan_report_store4 48; CHECK: ret void 49} 50 51; Check that XXX is instrumented. 52define void @touch_XXX() sanitize_address { 53 store i32 0, i32 *@XXX, align 4 54 ret void 55; CHECK: define void @touch_XXX 56; CHECK: call void @__asan_report_store4 57; CHECK: ret void 58} 59 60 61; Check that yyy is NOT instrumented (as it does not have dynamic initializer). 62define void @touch_yyy() sanitize_address { 63 store i32 0, i32 *@yyy, align 4 64 ret void 65; CHECK: define void @touch_yyy 66; CHECK-NOT: call void @__asan_report_store4 67; CHECK: ret void 68} 69 70; Check that YYY is NOT instrumented (as it does not have dynamic initializer). 71define void @touch_YYY() sanitize_address { 72 store i32 0, i32 *@YYY, align 4 73 ret void 74; CHECK: define void @touch_YYY 75; CHECK-NOT: call void @__asan_report_store4 76; CHECK: ret void 77} 78