Index: test/Transforms/NaCl/expand-tls-aligned.ll |
diff --git a/test/Transforms/NaCl/expand-tls-aligned.ll b/test/Transforms/NaCl/expand-tls-aligned.ll |
new file mode 100644 |
index 0000000000000000000000000000000000000000..75f03ba306ff03f712f53d0c917bf1c75d73f9ae |
--- /dev/null |
+++ b/test/Transforms/NaCl/expand-tls-aligned.ll |
@@ -0,0 +1,42 @@ |
+; RUN: opt < %s -nacl-expand-tls -S | FileCheck %s |
+ |
+target datalayout = "p:32:32:32" |
+ |
+ |
+@var = global i32 123 |
+ |
+; Put this first to check that the pass handles BSS variables last. |
+@bss_tvar_aligned = thread_local global i32 0, align 64 |
+ |
+@tvar1 = thread_local global i16 234 |
+; Test a pointer to check we are getting the right pointer size. |
+@tvar2 = thread_local global i32* @var |
+@tvar_aligned = thread_local global i8 99, align 32 |
+ |
+ |
+; CHECK: %tls_init_template = type <{ i16, [2 x i8], i32*, [24 x i8], i8 }> |
+; CHECK: %tls_struct = type <{ %tls_init_template, %tls_bss_template }> |
+ |
+; This struct type must be "packed" because the 31 byte padding here |
+; is followed by an i32. |
+; CHECK: %tls_bss_template = type <{ [31 x i8], i32, [60 x i8] }> |
+ |
+; CHECK: @__tls_template_start = internal constant %tls_init_template <{ i16 234, [2 x i8] zeroinitializer, i32* @var, [24 x i8] zeroinitializer, i8 99 }> |
+ |
+; CHECK: @__tls_template_alignment = internal constant i32 64 |
+ |
+ |
+; Create references to __tls_template_* to keep these live, otherwise |
+; the definition of %tls_struct (which we check for above) is removed |
+; from the output. |
+ |
+@__tls_template_tdata_end = external global i8 |
+@__tls_template_end = external global i8 |
+ |
+define i8* @get_tls_template_tdata_end() { |
+ ret i8* @__tls_template_tdata_end |
+} |
+ |
+define i8* @get_tls_template_end() { |
+ ret i8* @__tls_template_end |
+} |