]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll
Vendor import of llvm release_32 branch r168974 (effectively, 3.2 RC2):
[FreeBSD/FreeBSD.git] / test / Instrumentation / AddressSanitizer / instrument_initializer_metadata.ll
1 ; RUN: opt < %s -asan -asan-initialization-order -S | FileCheck %s
2 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"
3 target triple = "x86_64-unknown-linux-gnu"
4 @xxx = global i32 0, align 4
5 ; Clang will emit the following metadata identifying @xxx as dynamically
6 ; initialized.
7 !0 = metadata !{i32* @xxx}
8 !llvm.asan.dynamically_initialized_globals = !{!0}
9
10 define i32 @initializer() uwtable {
11 entry:
12   ret i32 42
13 }
14
15 define internal void @__cxx_global_var_init() section ".text.startup" {
16 entry:
17   %call = call i32 @initializer()
18   store i32 %call, i32* @xxx, align 4
19   ret void
20 }
21
22 define internal void @_GLOBAL__I_a() address_safety section ".text.startup" {
23 entry:
24   call void @__cxx_global_var_init()
25   ret void
26 }
27
28 ; Clang indicated that @xxx was dynamically initailized.
29 ; __asan_{before,after}_dynamic_init should be called from _GLOBAL__I_a
30
31 ; CHECK: define internal void @_GLOBAL__I_a
32 ; CHECK-NOT: ret
33 ; CHECK: call void @__asan_before_dynamic_init
34 ; CHECK: call void @__cxx_global_var_init
35 ; CHECK: call void @__asan_after_dynamic_init
36 ; CHECK: ret