diff --git a/compiler-rt/test/asan/TestCases/initialization-bug-no-global.cpp b/compiler-rt/test/asan/TestCases/initialization-bug-no-global.cpp new file mode 100644 index 00000000000000..50698b2a7d06fc --- /dev/null +++ b/compiler-rt/test/asan/TestCases/initialization-bug-no-global.cpp @@ -0,0 +1,26 @@ +// RUN: %clangxx_asan %min_macos_deployment_target=10.11 -O0 %s %p/Helpers/initialization-bug-extra.cpp -o %t +// RUN: %env_asan_opts=check_initialization_order=true:strict_init_order=true not %run %t 2>&1 | FileCheck %s + +// Not implemented. +// XFAIL: * + +// Do not test with optimization -- the error may be optimized away. + +// FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=186 +// XFAIL: target={{.*windows-msvc.*}} + +#include + +extern int y; + +void __attribute__((constructor)) ctor() { + printf("%d\n", y); + // CHECK: AddressSanitizer: initialization-order-fiasco +} + +int main() { + // ASan should have caused an exit before main runs. + printf("PASS\n"); + // CHECK-NOT: PASS + return 0; +} diff --git a/llvm/test/Instrumentation/AddressSanitizer/instrument_initializer_without_global.ll b/llvm/test/Instrumentation/AddressSanitizer/instrument_initializer_without_global.ll new file mode 100644 index 00000000000000..c8a6541bacfdfa --- /dev/null +++ b/llvm/test/Instrumentation/AddressSanitizer/instrument_initializer_without_global.ll @@ -0,0 +1,34 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals all --global-value-regex ".*global_ctors.*" --version 5 +; RUN: opt < %s -passes=asan -S | FileCheck %s +; RUN: opt < %s -passes=asan -S -asan-initialization-order=0 | FileCheck %s --check-prefixes=NOINIT + +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" +target triple = "x86_64-unknown-linux-gnu" + +@llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__late_ctor, ptr null }] + +declare void @initializer() uwtable; + +;. +; CHECK: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__late_ctor, ptr null }, { i32, ptr, ptr } { i32 1, ptr @asan.module_ctor, ptr @asan.module_ctor }] +;. +; NOINIT: @llvm.global_ctors = appending global [2 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 65535, ptr @__late_ctor, ptr null }, { i32, ptr, ptr } { i32 1, ptr @asan.module_ctor, ptr @asan.module_ctor }] +;. +define internal void @__late_ctor() sanitize_address section ".text.startup" { +; CHECK-LABEL: define internal void @__late_ctor( +; CHECK-SAME: ) #[[ATTR1:[0-9]+]] section ".text.startup" { +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: call void @initializer() +; CHECK-NEXT: ret void +; +; NOINIT-LABEL: define internal void @__late_ctor( +; NOINIT-SAME: ) #[[ATTR1:[0-9]+]] section ".text.startup" { +; NOINIT-NEXT: [[ENTRY:.*:]] +; NOINIT-NEXT: call void @initializer() +; NOINIT-NEXT: ret void +; +entry: + + call void @initializer() + ret void +}