[llvm] 504cb27 - [lld][WebAssembly] Convert TLS tests to asm format
Sam Clegg via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 10 11:39:10 PST 2020
Author: Sam Clegg
Date: 2020-11-10T11:38:53-08:00
New Revision: 504cb2730c25baa1e9e2adf4769b4c9427144292
URL: https://github.com/llvm/llvm-project/commit/504cb2730c25baa1e9e2adf4769b4c9427144292
DIFF: https://github.com/llvm/llvm-project/commit/504cb2730c25baa1e9e2adf4769b4c9427144292.diff
LOG: [lld][WebAssembly] Convert TLS tests to asm format
Fix a corresponding bug in WasmAsmParser around parsing.tdata sections.
Differential Revision: https://reviews.llvm.org/D91113
Added:
lld/test/wasm/no-tls.s
lld/test/wasm/tls-align.s
lld/test/wasm/tls.s
Modified:
llvm/lib/MC/MCParser/WasmAsmParser.cpp
Removed:
lld/test/wasm/no-tls.ll
lld/test/wasm/tls-align.ll
lld/test/wasm/tls.ll
################################################################################
diff --git a/lld/test/wasm/no-tls.ll b/lld/test/wasm/no-tls.ll
deleted file mode 100644
index 54bb9cee01699..0000000000000
--- a/lld/test/wasm/no-tls.ll
+++ /dev/null
@@ -1,48 +0,0 @@
-; Testing that __tls_size and __tls_align are correctly emitted when there are
-; no thread_local variables.
-
-; RUN: llc -mattr=+bulk-memory,+atomics -filetype=obj %s -o %t.o
-
-target triple = "wasm32-unknown-unknown"
-
-define void @_start() local_unnamed_addr {
-entry:
- ret void
-}
-
-; RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --allow-undefined -o %t.wasm %t.o
-; RUN: obj2yaml %t.wasm | FileCheck %s
-; CHECK: - Type: GLOBAL
-; CHECK-NEXT: Globals:
-
-; __stack_pointer
-; CHECK-NEXT: - Index: 0
-; CHECK-NEXT: Type: I32
-; CHECK-NEXT: Mutable: true
-; CHECK-NEXT: InitExpr:
-; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 66576
-
-; __tls_base
-; CHECK-NEXT: - Index: 1
-; CHECK-NEXT: Type: I32
-; CHECK-NEXT: Mutable: true
-; CHECK-NEXT: InitExpr:
-; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 0
-
-; __tls_size
-; CHECK-NEXT: - Index: 2
-; CHECK-NEXT: Type: I32
-; CHECK-NEXT: Mutable: false
-; CHECK-NEXT: InitExpr:
-; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 0
-
-; __tls_align
-; CHECK-NEXT: - Index: 3
-; CHECK-NEXT: Type: I32
-; CHECK-NEXT: Mutable: false
-; CHECK-NEXT: InitExpr:
-; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 1
diff --git a/lld/test/wasm/no-tls.s b/lld/test/wasm/no-tls.s
new file mode 100644
index 0000000000000..d1ba7663503fb
--- /dev/null
+++ b/lld/test/wasm/no-tls.s
@@ -0,0 +1,55 @@
+# Testing that __tls_size and __tls_align are correctly emitted when there are
+# no thread_local variables.
+
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+
+.globl _start
+_start:
+ .functype _start () -> ()
+ end_function
+
+.section .custom_section.target_features,"",@
+ .int8 2
+ .int8 43
+ .int8 7
+ .ascii "atomics"
+ .int8 43
+ .int8 11
+ .ascii "bulk-memory"
+
+# RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --allow-undefined -o %t.wasm %t.o
+# RUN: obj2yaml %t.wasm | FileCheck %s
+# CHECK: - Type: GLOBAL
+# CHECK-NEXT: Globals:
+
+# __stack_pointer
+# CHECK-NEXT: - Index: 0
+# CHECK-NEXT: Type: I32
+# CHECK-NEXT: Mutable: true
+# CHECK-NEXT: InitExpr:
+# CHECK-NEXT: Opcode: I32_CONST
+# CHECK-NEXT: Value: 66576
+
+# __tls_base
+# CHECK-NEXT: - Index: 1
+# CHECK-NEXT: Type: I32
+# CHECK-NEXT: Mutable: true
+# CHECK-NEXT: InitExpr:
+# CHECK-NEXT: Opcode: I32_CONST
+# CHECK-NEXT: Value: 0
+
+# __tls_size
+# CHECK-NEXT: - Index: 2
+# CHECK-NEXT: Type: I32
+# CHECK-NEXT: Mutable: false
+# CHECK-NEXT: InitExpr:
+# CHECK-NEXT: Opcode: I32_CONST
+# CHECK-NEXT: Value: 0
+
+# __tls_align
+# CHECK-NEXT: - Index: 3
+# CHECK-NEXT: Type: I32
+# CHECK-NEXT: Mutable: false
+# CHECK-NEXT: InitExpr:
+# CHECK-NEXT: Opcode: I32_CONST
+# CHECK-NEXT: Value: 1
diff --git a/lld/test/wasm/tls-align.ll b/lld/test/wasm/tls-align.ll
deleted file mode 100644
index 8363c82bb29f9..0000000000000
--- a/lld/test/wasm/tls-align.ll
+++ /dev/null
@@ -1,51 +0,0 @@
-; RUN: llc -mattr=+bulk-memory,+atomics -filetype=obj %s -o %t.o
-
-target triple = "wasm32-unknown-unknown"
-
- at no_tls = global i32 0, align 4
- at tls1 = thread_local(localexec) global i32 1, align 4
- at tls2 = thread_local(localexec) global i32 1, align 16
-
-define i32* @tls1_addr() {
- ret i32* @tls1
-}
-
-define i32* @tls2_addr() {
- ret i32* @tls2
-}
-
-; RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --no-entry -o %t.wasm %t.o
-; RUN: obj2yaml %t.wasm | FileCheck %s
-
-; CHECK: - Type: GLOBAL
-; CHECK-NEXT: Globals:
-; CHECK-NEXT: - Index: 0
-; CHECK-NEXT: Type: I32
-; CHECK-NEXT: Mutable: true
-; CHECK-NEXT: InitExpr:
-; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 66592
-
-; __tls_base
-; CHECK-NEXT: - Index: 1
-; CHECK-NEXT: Type: I32
-; CHECK-NEXT: Mutable: true
-; CHECK-NEXT: InitExpr:
-; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 0
-
-; __tls_size
-; CHECK-NEXT: - Index: 2
-; CHECK-NEXT: Type: I32
-; CHECK-NEXT: Mutable: false
-; CHECK-NEXT: InitExpr:
-; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 20
-
-; __tls_align
-; CHECK-NEXT: - Index: 3
-; CHECK-NEXT: Type: I32
-; CHECK-NEXT: Mutable: false
-; CHECK-NEXT: InitExpr:
-; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 16
diff --git a/lld/test/wasm/tls-align.s b/lld/test/wasm/tls-align.s
new file mode 100644
index 0000000000000..4fd296e1ef7fd
--- /dev/null
+++ b/lld/test/wasm/tls-align.s
@@ -0,0 +1,92 @@
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+
+.globaltype __tls_base, i32
+.globaltype __tls_align, i32, immutable
+
+.globl tls1_addr
+tls1_addr:
+ .functype tls1_addr () -> (i32)
+ global.get __tls_base
+ i32.const tls1
+ i32.add
+ end_function
+
+.globl tls2_addr
+tls2_addr:
+ .functype tls2_addr () -> (i32)
+ global.get __tls_base
+ i32.const tls2
+ i32.add
+ end_function
+
+.globl tls_align
+tls_align:
+ .functype tls_align () -> (i32)
+ global.get __tls_align
+ end_function
+
+.section .bss.no_tls,"",@
+.globl no_tls
+.p2align 2
+no_tls:
+ .int32 0
+ .size no_tls, 4
+
+.section .tdata.tls1,"",@
+.globl tls1
+.p2align 2
+tls1:
+ .int32 1
+ .size tls1, 4
+
+.section .tdata.tls2,"",@
+.globl tls2
+.p2align 4
+tls2:
+ .int32 1
+ .size tls2, 4
+
+.section .custom_section.target_features,"",@
+ .int8 2
+ .int8 43
+ .int8 7
+ .ascii "atomics"
+ .int8 43
+ .int8 11
+ .ascii "bulk-memory"
+
+# RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --no-entry -o %t.wasm %t.o
+# RUN: obj2yaml %t.wasm | FileCheck %s
+
+# CHECK: - Type: GLOBAL
+# CHECK-NEXT: Globals:
+# CHECK-NEXT: - Index: 0
+# CHECK-NEXT: Type: I32
+# CHECK-NEXT: Mutable: true
+# CHECK-NEXT: InitExpr:
+# CHECK-NEXT: Opcode: I32_CONST
+# CHECK-NEXT: Value: 66592
+
+# __tls_base
+# CHECK-NEXT: - Index: 1
+# CHECK-NEXT: Type: I32
+# CHECK-NEXT: Mutable: true
+# CHECK-NEXT: InitExpr:
+# CHECK-NEXT: Opcode: I32_CONST
+# CHECK-NEXT: Value: 0
+
+# __tls_size
+# CHECK-NEXT: - Index: 2
+# CHECK-NEXT: Type: I32
+# CHECK-NEXT: Mutable: false
+# CHECK-NEXT: InitExpr:
+# CHECK-NEXT: Opcode: I32_CONST
+# CHECK-NEXT: Value: 20
+
+# __tls_align
+# CHECK-NEXT: - Index: 3
+# CHECK-NEXT: Type: I32
+# CHECK-NEXT: Mutable: false
+# CHECK-NEXT: InitExpr:
+# CHECK-NEXT: Opcode: I32_CONST
+# CHECK-NEXT: Value: 16
diff --git a/lld/test/wasm/tls.ll b/lld/test/wasm/tls.ll
deleted file mode 100644
index 126c2237c1be8..0000000000000
--- a/lld/test/wasm/tls.ll
+++ /dev/null
@@ -1,106 +0,0 @@
-; RUN: llc -mattr=+bulk-memory,+atomics -filetype=obj %s -o %t.o
-
-target triple = "wasm32-unknown-unknown"
-
- at no_tls = global i32 0, align 4
- at tls1 = thread_local(localexec) global i32 1, align 4
- at tls2 = thread_local(localexec) global i32 1, align 4
-
-define i32* @tls1_addr() {
- ret i32* @tls1
-}
-
-define i32* @tls2_addr() {
- ret i32* @tls2
-}
-
-define i32 @tls_align() {
- %1 = call i32 @llvm.wasm.tls.align.i32()
- ret i32 %1
-}
-
-declare i32 @llvm.wasm.tls.align.i32()
-
-; RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --no-entry -o %t.wasm %t.o
-; RUN: obj2yaml %t.wasm | FileCheck %s
-
-; RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --no-merge-data-segments --no-entry -o %t.wasm %t.o
-; RUN: obj2yaml %t.wasm | FileCheck %s
-
-; CHECK: - Type: GLOBAL
-; CHECK-NEXT: Globals:
-; CHECK-NEXT: - Index: 0
-; CHECK-NEXT: Type: I32
-; CHECK-NEXT: Mutable: true
-; CHECK-NEXT: InitExpr:
-; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 66576
-
-; __tls_base
-; CHECK-NEXT: - Index: 1
-; CHECK-NEXT: Type: I32
-; CHECK-NEXT: Mutable: true
-; CHECK-NEXT: InitExpr:
-; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 0
-
-; __tls_size
-; CHECK-NEXT: - Index: 2
-; CHECK-NEXT: Type: I32
-; CHECK-NEXT: Mutable: false
-; CHECK-NEXT: InitExpr:
-; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 8
-
-; __tls_align
-; CHECK-NEXT: - Index: 3
-; CHECK-NEXT: Type: I32
-; CHECK-NEXT: Mutable: false
-; CHECK-NEXT: InitExpr:
-; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 4
-
-
-; CHECK: - Type: CODE
-; CHECK-NEXT: Functions:
-; Skip __wasm_call_ctors and __wasm_init_memory
-; CHECK: - Index: 2
-; CHECK-NEXT: Locals: []
-; CHECK-NEXT: Body: 20002401200041004108FC0800000B
-
-; Expected body of __wasm_init_tls:
-; local.get 0
-; global.set 1
-; local.get 0
-; i32.const 0
-; i32.const 8
-; memory.init 1, 0
-; end
-
-; CHECK-NEXT: - Index: 3
-; CHECK-NEXT: Locals: []
-; CHECK-NEXT: Body: 2381808080004180808080006A0B
-
-; Expected body of tls1_addr:
-; global.get 1
-; i32.const 0
-; i32.add
-; end
-
-; CHECK-NEXT: - Index: 4
-; CHECK-NEXT: Locals: []
-; CHECK-NEXT: Body: 2381808080004184808080006A0B
-
-; Expected body of tls1_addr:
-; global.get 1
-; i32.const 4
-; i32.add
-; end
-
-; CHECK-NEXT: - Index: 5
-; CHECK-NEXT: Locals: []
-; CHECK-NEXT: Body: 2383808080000B
-
-; Expected body of tls1_addr:
-; global.get 3
-; end
diff --git a/lld/test/wasm/tls.s b/lld/test/wasm/tls.s
new file mode 100644
index 0000000000000..d794cc9a09258
--- /dev/null
+++ b/lld/test/wasm/tls.s
@@ -0,0 +1,140 @@
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+
+.globaltype __tls_base, i32
+.globaltype __tls_align, i32, immutable
+
+.globl tls1_addr
+tls1_addr:
+ .functype tls1_addr () -> (i32)
+ global.get __tls_base
+ i32.const tls1
+ i32.add
+ end_function
+
+.globl tls2_addr
+tls2_addr:
+ .functype tls2_addr () -> (i32)
+ global.get __tls_base
+ i32.const tls2
+ i32.add
+ end_function
+
+.globl tls_align
+tls_align:
+ .functype tls_align () -> (i32)
+ global.get __tls_align
+ end_function
+
+.section .bss.no_tls,"",@
+.globl no_tls
+.p2align 2
+no_tls:
+ .int32 0
+ .size no_tls, 4
+
+.section .tdata.tls1,"",@
+.globl tls1
+.p2align 2
+tls1:
+ .int32 1
+ .size tls1, 4
+
+.section .tdata.tls2,"",@
+.globl tls2
+.p2align 2
+tls2:
+ .int32 1
+ .size tls2, 4
+
+.section .custom_section.target_features,"",@
+ .int8 2
+ .int8 43
+ .int8 7
+ .ascii "atomics"
+ .int8 43
+ .int8 11
+ .ascii "bulk-memory"
+
+# RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --no-entry -o %t.wasm %t.o
+# RUN: obj2yaml %t.wasm | FileCheck %s
+
+# RUN: wasm-ld -no-gc-sections --shared-memory --max-memory=131072 --no-merge-data-segments --no-entry -o %t.wasm %t.o
+# RUN: obj2yaml %t.wasm | FileCheck %s
+
+# CHECK: - Type: GLOBAL
+# CHECK-NEXT: Globals:
+# CHECK-NEXT: - Index: 0
+# CHECK-NEXT: Type: I32
+# CHECK-NEXT: Mutable: true
+# CHECK-NEXT: InitExpr:
+# CHECK-NEXT: Opcode: I32_CONST
+# CHECK-NEXT: Value: 66576
+
+# __tls_base
+# CHECK-NEXT: - Index: 1
+# CHECK-NEXT: Type: I32
+# CHECK-NEXT: Mutable: true
+# CHECK-NEXT: InitExpr:
+# CHECK-NEXT: Opcode: I32_CONST
+# CHECK-NEXT: Value: 0
+
+# __tls_size
+# CHECK-NEXT: - Index: 2
+# CHECK-NEXT: Type: I32
+# CHECK-NEXT: Mutable: false
+# CHECK-NEXT: InitExpr:
+# CHECK-NEXT: Opcode: I32_CONST
+# CHECK-NEXT: Value: 8
+
+# __tls_align
+# CHECK-NEXT: - Index: 3
+# CHECK-NEXT: Type: I32
+# CHECK-NEXT: Mutable: false
+# CHECK-NEXT: InitExpr:
+# CHECK-NEXT: Opcode: I32_CONST
+# CHECK-NEXT: Value: 4
+
+
+# CHECK: - Type: CODE
+# CHECK-NEXT: Functions:
+# Skip __wasm_call_ctors and __wasm_init_memory
+# CHECK: - Index: 2
+# CHECK-NEXT: Locals: []
+# CHECK-NEXT: Body: 20002401200041004108FC0800000B
+
+# Expected body of __wasm_init_tls:
+# local.get 0
+# global.set 1
+# local.get 0
+# i32.const 0
+# i32.const 8
+# memory.init 1, 0
+# end
+
+# CHECK-NEXT: - Index: 3
+# CHECK-NEXT: Locals: []
+# CHECK-NEXT: Body: 2381808080004180808080006A0B
+
+# Expected body of tls1_addr:
+# global.get 1
+# i32.const 0
+# i32.add
+# end
+
+# CHECK-NEXT: - Index: 4
+# CHECK-NEXT: Locals: []
+# CHECK-NEXT: Body: 2381808080004184808080006A0B
+
+# Expected body of tls1_addr:
+# global.get 1
+# i32.const 4
+# i32.add
+# end
+
+# CHECK-NEXT: - Index: 5
+# CHECK-NEXT: Locals: []
+# CHECK-NEXT: Body: 2383808080000B
+
+# Expected body of tls1_addr:
+# global.get 3
+# end
diff --git a/llvm/lib/MC/MCParser/WasmAsmParser.cpp b/llvm/lib/MC/MCParser/WasmAsmParser.cpp
index 05f23e1433411..4bb39d5d824b3 100644
--- a/llvm/lib/MC/MCParser/WasmAsmParser.cpp
+++ b/llvm/lib/MC/MCParser/WasmAsmParser.cpp
@@ -116,6 +116,7 @@ class WasmAsmParser : public MCAsmParserExtension {
auto Kind = StringSwitch<Optional<SectionKind>>(Name)
.StartsWith(".data", SectionKind::getData())
+ .StartsWith(".tdata", SectionKind::getThreadData())
.StartsWith(".rodata", SectionKind::getReadOnly())
.StartsWith(".text", SectionKind::getText())
.StartsWith(".custom_section", SectionKind::getMetadata())
More information about the llvm-commits
mailing list