From e24a89874b74f2b197ea96bb0877a5dbe7fa5b94 Mon Sep 17 00:00:00 2001 From: Bill Wendling Date: Mon, 29 Apr 2013 22:42:47 +0000 Subject: [PATCH] Duplicate a testcase. llvm-svn: 180744 --- test/CodeGen/X86/tls-init-funcs.ll | 89 ++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 test/CodeGen/X86/tls-init-funcs.ll diff --git a/test/CodeGen/X86/tls-init-funcs.ll b/test/CodeGen/X86/tls-init-funcs.ll new file mode 100644 index 00000000000..b4eafd4050e --- /dev/null +++ b/test/CodeGen/X86/tls-init-funcs.ll @@ -0,0 +1,89 @@ +; RUN: llc < %s -mtriple x86_64-apple-macosx10 | FileCheck %s + +; CHECK: .section __DATA,__thread_init,thread_local_init_function_pointers +; CHECK: .align 3 +; CHECK: .quad ___tls_init + +%struct.A = type { i8 } +%struct.B = type { i32 } + +@i = thread_local global i32 37, align 4 +@a = thread_local global %struct.A zeroinitializer, align 1 +@b = thread_local global %struct.B zeroinitializer, align 4 +@z = global %struct.A zeroinitializer, align 1 +@y = global %struct.B zeroinitializer, align 4 +@__tls_guard = internal thread_local unnamed_addr global i1 false +@llvm.global_ctors = appending global [1 x { i32, void ()* }] [{ i32, void ()* } { i32 65535, void ()* @_GLOBAL__I_a }] +@llvm.tls_init_funcs = appending global [1 x void ()*] [void ()* @__tls_init] + +@_ZTH1i = alias void ()* @__tls_init +@_ZTH1a = alias void ()* @__tls_init +@_ZTH1b = alias void ()* @__tls_init + +declare void @_ZN1AC1Ev(%struct.A*) + +declare void @_ZN1BC1Ei(%struct.B*, i32) + +define internal void @_GLOBAL__I_a() section "__TEXT,__StaticInit,regular,pure_instructions" { +entry: + tail call void @_ZN1AC1Ev(%struct.A* @z) + tail call void @_ZN1BC1Ei(%struct.B* @y, i32 42) + ret void +} + +define internal void @__tls_init() { +entry: + %.b = load i1* @__tls_guard, align 1 + store i1 true, i1* @__tls_guard, align 1 + br i1 %.b, label %exit, label %init + +init: ; preds = %entry + tail call void @_ZN1AC1Ev(%struct.A* @a) + tail call void @_ZN1BC1Ei(%struct.B* @b, i32 927) + br label %exit + +exit: ; preds = %entry, %init + ret void +} + +define weak_odr hidden i32* @_ZTW1i() { + %.b.i = load i1* @__tls_guard, align 1 + store i1 true, i1* @__tls_guard, align 1 + br i1 %.b.i, label %__tls_init.exit, label %init.i + +init.i: ; preds = %0 + tail call void @_ZN1AC1Ev(%struct.A* @a) + tail call void @_ZN1BC1Ei(%struct.B* @b, i32 927) + br label %__tls_init.exit + +__tls_init.exit: ; preds = %0, %init.i + ret i32* @i +} + +define weak_odr hidden %struct.A* @_ZTW1a() { + %.b.i = load i1* @__tls_guard, align 1 + store i1 true, i1* @__tls_guard, align 1 + br i1 %.b.i, label %__tls_init.exit, label %init.i + +init.i: ; preds = %0 + tail call void @_ZN1AC1Ev(%struct.A* @a) + tail call void @_ZN1BC1Ei(%struct.B* @b, i32 927) + br label %__tls_init.exit + +__tls_init.exit: ; preds = %0, %init.i + ret %struct.A* @a +} + +define weak_odr hidden %struct.B* @_ZTW1b() { + %.b.i = load i1* @__tls_guard, align 1 + store i1 true, i1* @__tls_guard, align 1 + br i1 %.b.i, label %__tls_init.exit, label %init.i + +init.i: ; preds = %0 + tail call void @_ZN1AC1Ev(%struct.A* @a) + tail call void @_ZN1BC1Ei(%struct.B* @b, i32 927) + br label %__tls_init.exit + +__tls_init.exit: ; preds = %0, %init.i + ret %struct.B* @b +}