| Index: test/Transforms/NaCl/expand-ctors.ll
|
| diff --git a/test/Transforms/NaCl/expand-ctors.ll b/test/Transforms/NaCl/expand-ctors.ll
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..250abbc1bf90d90e0bf5b01f966374b7bfe8895f
|
| --- /dev/null
|
| +++ b/test/Transforms/NaCl/expand-ctors.ll
|
| @@ -0,0 +1,37 @@
|
| +; We expect these symbol names to be removed:
|
| +; RUN: opt < %s -nacl-expand-ctors -S | FileCheck %s -check-prefix=NO_CTORS
|
| +; NO_CTORS-NOT: llvm.global.ctors
|
| +; NO_CTORS-NOT: __init_array_end
|
| +; NO_CTORS-NOT: __fini_array_end
|
| +
|
| +; RUN: opt < %s -nacl-expand-ctors -S | FileCheck %s
|
| +
|
| +@llvm.global_ctors = appending global [3 x { i32, void ()* }]
|
| + [{ i32, void ()* } { i32 300, void ()* @init_func_A },
|
| + { i32, void ()* } { i32 100, void ()* @init_func_B },
|
| + { i32, void ()* } { i32 200, void ()* @init_func_C }]
|
| +
|
| +@__init_array_start = extern_weak global [0 x void ()*]
|
| +@__init_array_end = extern_weak global [0 x void ()*]
|
| +
|
| +; CHECK: @__init_array_start = internal constant [3 x void ()*] [void ()* @init_func_B, void ()* @init_func_C, void ()* @init_func_A]
|
| +; CHECK: @__fini_array_start = internal constant [0 x void ()*] zeroinitializer
|
| +
|
| +define void @init_func_A() { ret void }
|
| +define void @init_func_B() { ret void }
|
| +define void @init_func_C() { ret void }
|
| +
|
| +define [0 x void ()*]* @get_array_start() {
|
| + ret [0 x void ()*]* @__init_array_start;
|
| +}
|
| +; CHECK: @get_array_start()
|
| +; CHECK: ret {{.*}} @__init_array_start
|
| +
|
| +define [0 x void ()*]* @get_array_end() {
|
| + ret [0 x void ()*]* @__init_array_end;
|
| +}
|
| +
|
| +; @get_array_end() is converted to use a GetElementPtr that returns
|
| +; the end of the generated array:
|
| +; CHECK: @get_array_end()
|
| +; CHECK: ret {{.*}} bitcast ([3 x void ()*]* getelementptr inbounds ([3 x void ()*]* @__init_array_start, i32 1)
|
|
|