diff options
Diffstat (limited to 'test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll')
-rw-r--r-- | test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll b/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll index 83ff53f..c2bb0aa 100644 --- a/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll +++ b/test/Instrumentation/AddressSanitizer/instrument_initializer_metadata.ll @@ -7,10 +7,10 @@ target triple = "x86_64-unknown-linux-gnu" @YYY = global i32 0, align 4 ; W/o dynamic initializer. ; Clang will emit the following metadata identifying @xxx as dynamically ; initialized. -!0 = metadata !{i32* @xxx, null, i1 true, i1 false} -!1 = metadata !{i32* @XXX, null, i1 true, i1 false} -!2 = metadata !{i32* @yyy, null, i1 false, i1 false} -!3 = metadata !{i32* @YYY, null, i1 false, i1 false} +!0 = metadata !{i32* @xxx, null, null, i1 true, i1 false} +!1 = metadata !{i32* @XXX, null, null, i1 true, i1 false} +!2 = metadata !{i32* @yyy, null, null, i1 false, i1 false} +!3 = metadata !{i32* @YYY, null, null, i1 false, i1 false} !llvm.asan.globals = !{!0, !1, !2, !3} define i32 @initializer() uwtable { @@ -25,29 +25,39 @@ entry: ret void } -@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }] +@llvm.global_ctors = appending global [2 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @__late_ctor }, { i32, void ()* } { i32 0, void ()* @__early_ctor }] -define internal void @_GLOBAL__I_a() sanitize_address section ".text.startup" { +define internal void @__late_ctor() sanitize_address section ".text.startup" { entry: call void @__cxx_global_var_init() ret void } ; Clang indicated that @xxx was dynamically initailized. -; __asan_{before,after}_dynamic_init should be called from _GLOBAL__I_a +; __asan_{before,after}_dynamic_init should be called from __late_ctor -; CHECK: define internal void @_GLOBAL__I_a +; CHECK-LABEL: define internal void @__late_ctor ; CHECK-NOT: ret ; CHECK: call void @__asan_before_dynamic_init ; CHECK: call void @__cxx_global_var_init ; CHECK: call void @__asan_after_dynamic_init ; CHECK: ret +; CTOR with priority 0 should not be instrumented. +define internal void @__early_ctor() sanitize_address section ".text.startup" { +entry: + call void @__cxx_global_var_init() + ret void +} +; CHECK-LABEL: define internal void @__early_ctor +; CHECK-NOT: __asan +; CHECK: ret + ; Check that xxx is instrumented. define void @touch_xxx() sanitize_address { store i32 0, i32 *@xxx, align 4 ret void -; CHECK: define void @touch_xxx +; CHECK-LABEL: touch_xxx ; CHECK: call void @__asan_report_store4 ; CHECK: ret void } |