[lld] 4ef1f90 - [lld][WebAssembly] Convert more tests to asm format. NFC

Sam Clegg via llvm-commits llvm-commits at lists.llvm.org
Mon May 3 17:20:52 PDT 2021


Author: Sam Clegg
Date: 2021-05-03T17:16:31-07:00
New Revision: 4ef1f90e4d564b872e3598ccef45adb740eb0f0d

URL: https://github.com/llvm/llvm-project/commit/4ef1f90e4d564b872e3598ccef45adb740eb0f0d
DIFF: https://github.com/llvm/llvm-project/commit/4ef1f90e4d564b872e3598ccef45adb740eb0f0d.diff

LOG: [lld][WebAssembly] Convert more tests to asm format. NFC

Two of these are trivial.  The third (shared.s) did have some
expectations changes but only due to two data symbols being re-ordered.

Differential Revision: https://reviews.llvm.org/D101711

Added: 
    lld/test/wasm/shared-export-dynamic.s
    lld/test/wasm/shared-needed.s
    lld/test/wasm/shared.s

Modified: 
    

Removed: 
    lld/test/wasm/shared-export-dynamic.ll
    lld/test/wasm/shared-needed.ll
    lld/test/wasm/shared.ll


################################################################################
diff  --git a/lld/test/wasm/shared-export-dynamic.ll b/lld/test/wasm/shared-export-dynamic.ll
deleted file mode 100644
index c2c4a9ff23969..0000000000000
--- a/lld/test/wasm/shared-export-dynamic.ll
+++ /dev/null
@@ -1,18 +0,0 @@
-; RUN: llc -relocation-model=pic -filetype=obj %s -o %t.o
-
-; By default all `default` symbols should be exported
-; RUN: wasm-ld -shared -o %t.wasm %t.o
-; RUN: obj2yaml %t.wasm | FileCheck %s -check-prefix=DEFAULT
-; DEFAULT: foo
-
-; Verify that `--no-export-dynamic` works with `-shared`
-; RUN: wasm-ld -shared --no-export-dynamic -o %t2.wasm %t.o
-; RUN: obj2yaml %t2.wasm | FileCheck %s -check-prefix=NO-EXPORT
-; NO-EXPORT-NOT: foo
-
-target triple = "wasm32-unknown-emscripten"
-
-define default i32 @foo() {
-entry:
-  ret i32 0
-}

diff  --git a/lld/test/wasm/shared-export-dynamic.s b/lld/test/wasm/shared-export-dynamic.s
new file mode 100644
index 0000000000000..015d73388f2b7
--- /dev/null
+++ b/lld/test/wasm/shared-export-dynamic.s
@@ -0,0 +1,18 @@
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+
+# By default all `default` symbols should be exported
+# RUN: wasm-ld -shared --experimental-pic -o %t.wasm %t.o
+# RUN: obj2yaml %t.wasm | FileCheck %s -check-prefix=DEFAULT
+# DEFAULT: foo
+
+# Verify that `--no-export-dynamic` works with `-shared`
+# RUN: wasm-ld -shared --experimental-pic --no-export-dynamic -o %t2.wasm %t.o
+# RUN: obj2yaml %t2.wasm | FileCheck %s -check-prefix=NO-EXPORT
+# NO-EXPORT-NOT: foo
+
+.globl foo
+
+foo:
+  .functype foo () -> (i32)
+  i32.const 0
+  end_function

diff  --git a/lld/test/wasm/shared-needed.ll b/lld/test/wasm/shared-needed.ll
deleted file mode 100644
index 00ecdb68202e9..0000000000000
--- a/lld/test/wasm/shared-needed.ll
+++ /dev/null
@@ -1,38 +0,0 @@
-; RUN: llc -filetype=obj %s -o %t.o
-; RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/ret32.s -o %t.ret32.o
-
-; RUN: wasm-ld -shared -o %t1.so %t.o
-; RUN: obj2yaml %t1.so | FileCheck %s -check-prefix=SO1
-
-; RUN: wasm-ld -shared -o %t2.so %t1.so %t.ret32.o
-; RUN: obj2yaml %t2.so | FileCheck %s -check-prefix=SO2
-
-target triple = "wasm32-unknown-unknown"
-
- at data = global i32 2, align 4
-
-define default void @foo() {
-entry:
-  ret void
-}
-
-; SO1:      Sections:
-; SO1-NEXT:   - Type:            CUSTOM
-; SO1-NEXT:     Name:            dylink
-; SO1-NEXT:     MemorySize:      4
-; SO1-NEXT:     MemoryAlignment: 2
-; SO1-NEXT:     TableSize:       0
-; SO1-NEXT:     TableAlignment:  0
-; SO1-NEXT:     Needed:          []
-; SO1-NEXT:   - Type:            TYPE
-
-; SO2:      Sections:
-; SO2-NEXT:   - Type:            CUSTOM
-; SO2-NEXT:     Name:            dylink
-; SO2-NEXT:     MemorySize:      0
-; SO2-NEXT:     MemoryAlignment: 0
-; SO2-NEXT:     TableSize:       0
-; SO2-NEXT:     TableAlignment:  0
-; SO2-NEXT:     Needed:
-; SO2-NEXT:       - shared-needed.ll.tmp1.so
-; SO2-NEXT:   - Type:            TYPE

diff  --git a/lld/test/wasm/shared-needed.s b/lld/test/wasm/shared-needed.s
new file mode 100644
index 0000000000000..c6ebd5ee1060a
--- /dev/null
+++ b/lld/test/wasm/shared-needed.s
@@ -0,0 +1,43 @@
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown %p/Inputs/ret32.s -o %t.ret32.o
+
+# RUN: wasm-ld -shared --experimental-pic -o %t1.so %t.o
+# RUN: obj2yaml %t1.so | FileCheck %s -check-prefix=SO1
+
+# RUN: wasm-ld -shared --experimental-pic -o %t2.so %t1.so %t.ret32.o
+# RUN: obj2yaml %t2.so | FileCheck %s -check-prefix=SO2
+
+.globl foo
+.globl data
+
+foo:
+  .functype foo () -> ()
+  end_function
+
+.section .data,"",@
+data:
+ .p2align 2
+ .int32 0
+ .size data,4
+
+
+# SO1:      Sections:
+# SO1-NEXT:   - Type:            CUSTOM
+# SO1-NEXT:     Name:            dylink
+# SO1-NEXT:     MemorySize:      4
+# SO1-NEXT:     MemoryAlignment: 2
+# SO1-NEXT:     TableSize:       0
+# SO1-NEXT:     TableAlignment:  0
+# SO1-NEXT:     Needed:          []
+# SO1-NEXT:   - Type:            TYPE
+
+# SO2:      Sections:
+# SO2-NEXT:   - Type:            CUSTOM
+# SO2-NEXT:     Name:            dylink
+# SO2-NEXT:     MemorySize:      0
+# SO2-NEXT:     MemoryAlignment: 0
+# SO2-NEXT:     TableSize:       0
+# SO2-NEXT:     TableAlignment:  0
+# SO2-NEXT:     Needed:
+# SO2-NEXT:       - shared-needed.s.tmp1.so
+# SO2-NEXT:   - Type:            TYPE

diff  --git a/lld/test/wasm/shared.ll b/lld/test/wasm/shared.ll
deleted file mode 100644
index 5cf49fb50bf40..0000000000000
--- a/lld/test/wasm/shared.ll
+++ /dev/null
@@ -1,156 +0,0 @@
-; RUN: llc -relocation-model=pic -mattr=+mutable-globals -filetype=obj %s -o %t.o
-; RUN: wasm-ld --experimental-pic -shared -o %t.wasm %t.o
-; RUN: obj2yaml %t.wasm | FileCheck %s
-
-target triple = "wasm32-unknown-emscripten"
-
- at data = hidden global i32 2, align 4
- at data_external = external global i32
- at indirect_func = local_unnamed_addr global i32 ()* @foo, align 4
- at indirect_func_external = local_unnamed_addr global void ()* @func_external, align 4
-
-; Test data relocations
- at data_addr = local_unnamed_addr global i32* @data, align 4
-; .. against external symbols
- at data_addr_external = local_unnamed_addr global i32* @data_external, align 4
-; .. including addends
-%struct.s = type { i32, i32 }
- at extern_struct = external global %struct.s
- at extern_struct_internal_ptr = local_unnamed_addr global i32* getelementptr inbounds (%struct.s, %struct.s* @extern_struct, i32 0, i32 1), align 4
-
-define hidden i32 @foo() {
-entry:
-  ; To ensure we use __stack_pointer
-  %ptr = alloca i32
-  %0 = load i32, i32* @data, align 4
-  %1 = load i32 ()*, i32 ()** @indirect_func, align 4
-  call i32 %1()
-  ret i32 %0
-}
-
-define hidden i32* @get_data_address() {
-entry:
-  ret i32* @data_external
-}
-
-define hidden i8* @get_func_address() {
-entry:
-  ret i8* bitcast (void ()* @func_external to i8*)
-}
-
-define default i8* @get_local_func_address() {
-entry:
-  ; Verify that a function which is otherwise not address taken *is* added to
-  ; the wasm table with referenced via R_WASM_TABLE_INDEX_REL_SLEB
-  ret i8* bitcast (i8* ()* @get_func_address to i8*)
-}
-
-declare void @func_external()
-
-; check for dylink section at start
-
-; CHECK:      Sections:
-; CHECK-NEXT:   - Type:            CUSTOM
-; CHECK-NEXT:     Name:            dylink
-; CHECK-NEXT:     MemorySize:      24
-; CHECK-NEXT:     MemoryAlignment: 2
-; CHECK-NEXT:     TableSize:       2
-; CHECK-NEXT:     TableAlignment:  0
-; CHECK-NEXT:     Needed:          []
-; CHECK-NEXT:   - Type:            TYPE
-
-; check for import of __table_base and __memory_base globals
-
-; CHECK:        - Type:            IMPORT
-; CHECK-NEXT:     Imports:
-; CHECK-NEXT:       - Module:          env
-; CHECK-NEXT:         Field:           memory
-; CHECK-NEXT:         Kind:            MEMORY
-; CHECK-NEXT:         Memory:
-; CHECK-NEXT:           Minimum:       0x1
-; CHECK-NEXT:       - Module:          env
-; CHECK-NEXT:         Field:           __indirect_function_table
-; CHECK-NEXT:         Kind:            TABLE
-; CHECK-NEXT:         Table:
-; CHECK-NEXT:           Index:           0
-; CHECK-NEXT:           ElemType:        FUNCREF
-; CHECK-NEXT:           Limits:
-; CHECK-NEXT:             Minimum:         0x2
-; CHECK-NEXT:       - Module:          env
-; CHECK-NEXT:         Field:           __stack_pointer
-; CHECK-NEXT:         Kind:            GLOBAL
-; CHECK-NEXT:         GlobalType:      I32
-; CHECK-NEXT:         GlobalMutable:   true
-; CHECK-NEXT:       - Module:          env
-; CHECK-NEXT:         Field:           __memory_base
-; CHECK-NEXT:         Kind:            GLOBAL
-; CHECK-NEXT:         GlobalType:      I32
-; CHECK-NEXT:         GlobalMutable:   false
-; CHECK-NEXT:       - Module:          env
-; CHECK-NEXT:         Field:           __table_base
-; CHECK-NEXT:         Kind:            GLOBAL
-; CHECK-NEXT:         GlobalType:      I32
-; CHECK-NEXT:         GlobalMutable:   false
-; CHECK-NEXT:       - Module:          env
-; CHECK-NEXT:         Field:           func_external
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         SigIndex:        1
-; CHECK-NEXT:       - Module:          GOT.mem
-; CHECK-NEXT:         Field:           indirect_func
-; CHECK-NEXT:         Kind:            GLOBAL
-; CHECK-NEXT:         GlobalType:      I32
-; CHECK-NEXT:         GlobalMutable:   true
-; CHECK-NEXT:       - Module:          GOT.func
-; CHECK-NEXT:         Field:           func_external
-; CHECK-NEXT:         Kind:            GLOBAL
-; CHECK-NEXT:         GlobalType:      I32
-; CHECK-NEXT:         GlobalMutable:   true
-; CHECK-NEXT:       - Module:          GOT.mem
-; CHECK-NEXT:         Field:           data_external
-; CHECK-NEXT:         Kind:            GLOBAL
-; CHECK-NEXT:         GlobalType:      I32
-; CHECK-NEXT:         GlobalMutable:   true
-; CHECK-NEXT:       - Module:          GOT.mem
-; CHECK-NEXT:         Field:           extern_struct
-; CHECK-NEXT:         Kind:            GLOBAL
-; CHECK-NEXT:         GlobalType:      I32
-; CHECK-NEXT:         GlobalMutable:   true
-; CHECK-NEXT:   - Type:            FUNCTION
-
-; CHECK:        - Type:            EXPORT
-; CHECK-NEXT:     Exports:
-; CHECK-NEXT:       - Name:            __wasm_call_ctors
-; CHECK-NEXT:         Kind:            FUNCTION
-; CHECK-NEXT:         Index:           1
-
-; check for elem segment initialized with __table_base global as offset
-
-; CHECK:        - Type:            ELEM
-; CHECK-NEXT:     Segments:
-; CHECK-NEXT:       - Offset:
-; CHECK-NEXT:           Opcode:          GLOBAL_GET
-; CHECK-NEXT:           Index:           2
-; CHECK-NEXT:         Functions:       [ 4, 3 ]
-
-; check the generated code in __wasm_call_ctors and __wasm_apply_data_relocs functions
-; TODO(sbc): Disassemble and verify instructions.
-
-; CHECK:        - Type:            CODE
-; CHECK-NEXT:     Functions:
-; CHECK-NEXT:       - Index:           1
-; CHECK-NEXT:         Locals:          []
-; CHECK-NEXT:         Body:            10020B
-; CHECK-NEXT:       - Index:           2
-; CHECK-NEXT:         Locals:          []
-; CHECK-NEXT:         Body:            230141046A230241016A360200230141086A23043602002301410C6A230141006A360200230141106A2305360200230141146A230641046A3602000B
-
-; check the data segment initialized with __memory_base global as offset
-
-; CHECK:        - Type:            DATA
-; CHECK-NEXT:     Segments:
-; CHECK-NEXT:       - SectionOffset:   6
-; CHECK-NEXT:         InitFlags:       0
-; CHECK-NEXT:         Offset:
-; CHECK-NEXT:           Opcode:          GLOBAL_GET
-; CHECK-NEXT:           Index:           1
-; CHECK-NEXT:         Content:         '020000000100000000000000000000000000000000000000'

diff  --git a/lld/test/wasm/shared.s b/lld/test/wasm/shared.s
new file mode 100644
index 0000000000000..4799b2fba5b84
--- /dev/null
+++ b/lld/test/wasm/shared.s
@@ -0,0 +1,232 @@
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+# RUN: wasm-ld --experimental-pic -shared -o %t.wasm %t.o
+# RUN: obj2yaml %t.wasm | FileCheck %s
+
+.section .data.data,"",@
+data:
+  .p2align 2
+  .int32 2
+  .size data, 4
+
+.section .data.indirect_func_external,"",@
+indirect_func_external:
+  .int32 func_external
+.size indirect_func_external, 4
+
+.section .data.indirect_func,"",@
+indirect_func:
+  .int32 foo
+  .size indirect_func, 4
+
+# Test data relocations
+
+.section .data.data_addr,"",@
+data_addr:
+  .int32 data
+  .size data_addr, 4
+
+# .. against external symbols
+
+.section .data.data_addr_external,"",@
+data_addr_external:
+  .int32 data_external
+  .size data_addr_external, 4
+
+# .. including addends
+
+.section .data.extern_struct_internal_ptr,"",@
+extern_struct_internal_ptr:
+  .int32 extern_struct + 4
+  .size extern_struct_internal_ptr, 4
+
+# Test use of __stack_pointer
+
+.section .text,"",@
+foo:
+  # %ptr = alloca i32
+  # %0 = load i32, i32* @data, align 4
+  # %1 = load i32 ()*, i32 ()** @indirect_func, align 4
+  # call i32 %1()
+  # ret i32 %0
+  .functype foo () -> (i32)
+  .local    i32, i32
+  global.get  __stack_pointer
+  i32.const 16
+  i32.sub
+  local.tee 0
+  global.set  __stack_pointer
+  global.get  __memory_base
+  i32.const data at MBREL
+  i32.add
+  i32.load  0
+  local.set 1
+  global.get  indirect_func at GOT
+  i32.load  0
+  call_indirect  () -> (i32)
+  drop
+  local.get 0
+  i32.const 16
+  i32.add
+  global.set  __stack_pointer
+  local.get 1
+  end_function
+
+get_func_address:
+  .functype get_func_address () -> (i32)
+  global.get func_external at GOT
+  end_function
+
+get_data_address:
+  .functype get_data_address () -> (i32)
+  global.get  data_external at GOT
+  end_function
+
+get_local_func_address:
+  # Verify that a function which is otherwise not address taken *is* added to
+  # the wasm table with referenced via R_WASM_TABLE_INDEX_REL_SLEB
+  .functype get_local_func_address () -> (i32)
+  global.get  __table_base
+  i32.const get_func_address at TBREL
+  i32.add
+  end_function
+
+.globl foo
+.globl data
+.globl indirect_func
+.globl indirect_func_external
+.globl data_addr
+.globl data_addr_external
+.globl extern_struct_internal_ptr
+.globl get_data_address
+.globl get_func_address
+.globl get_local_func_address
+
+.hidden foo
+.hidden data
+.hidden get_data_address
+.hidden get_func_address
+
+# Without this linking will fail because we import __stack_pointer (a mutable
+# global).
+# TODO(sbc): We probably want a nicer way to specify target_features section
+# in assembly.
+.section .custom_section.target_features,"",@
+.int8 1
+.int8 43
+.int8 15
+.ascii "mutable-globals"
+
+.functype func_external () -> ()
+
+# Linker-synthesized globals
+.globaltype __stack_pointer, i32
+.globaltype	__table_base, i32, immutable
+.globaltype	__memory_base, i32, immutable
+
+# check for dylink section at start
+
+# CHECK:      Sections:
+# CHECK-NEXT:   - Type:            CUSTOM
+# CHECK-NEXT:     Name:            dylink
+# CHECK-NEXT:     MemorySize:      24
+# CHECK-NEXT:     MemoryAlignment: 2
+# CHECK-NEXT:     TableSize:       2
+# CHECK-NEXT:     TableAlignment:  0
+# CHECK-NEXT:     Needed:          []
+# CHECK-NEXT:   - Type:            TYPE
+
+# check for import of __table_base and __memory_base globals
+
+# CHECK:        - Type:            IMPORT
+# CHECK-NEXT:     Imports:
+# CHECK-NEXT:       - Module:          env
+# CHECK-NEXT:         Field:           memory
+# CHECK-NEXT:         Kind:            MEMORY
+# CHECK-NEXT:         Memory:
+# CHECK-NEXT:           Minimum:       0x1
+# CHECK-NEXT:       - Module:          env
+# CHECK-NEXT:         Field:           __indirect_function_table
+# CHECK-NEXT:         Kind:            TABLE
+# CHECK-NEXT:         Table:
+# CHECK-NEXT:           Index:           0
+# CHECK-NEXT:           ElemType:        FUNCREF
+# CHECK-NEXT:           Limits:
+# CHECK-NEXT:             Minimum:         0x2
+# CHECK-NEXT:       - Module:          env
+# CHECK-NEXT:         Field:           __stack_pointer
+# CHECK-NEXT:         Kind:            GLOBAL
+# CHECK-NEXT:         GlobalType:      I32
+# CHECK-NEXT:         GlobalMutable:   true
+# CHECK-NEXT:       - Module:          env
+# CHECK-NEXT:         Field:           __memory_base
+# CHECK-NEXT:         Kind:            GLOBAL
+# CHECK-NEXT:         GlobalType:      I32
+# CHECK-NEXT:         GlobalMutable:   false
+# CHECK-NEXT:       - Module:          env
+# CHECK-NEXT:         Field:           __table_base
+# CHECK-NEXT:         Kind:            GLOBAL
+# CHECK-NEXT:         GlobalType:      I32
+# CHECK-NEXT:         GlobalMutable:   false
+# CHECK-NEXT:       - Module:          env
+# CHECK-NEXT:         Field:           func_external
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         SigIndex:        1
+# CHECK-NEXT:       - Module:          GOT.mem
+# CHECK-NEXT:         Field:           indirect_func
+# CHECK-NEXT:         Kind:            GLOBAL
+# CHECK-NEXT:         GlobalType:      I32
+# CHECK-NEXT:         GlobalMutable:   true
+# CHECK-NEXT:       - Module:          GOT.func
+# CHECK-NEXT:         Field:           func_external
+# CHECK-NEXT:         Kind:            GLOBAL
+# CHECK-NEXT:         GlobalType:      I32
+# CHECK-NEXT:         GlobalMutable:   true
+# CHECK-NEXT:       - Module:          GOT.mem
+# CHECK-NEXT:         Field:           data_external
+# CHECK-NEXT:         Kind:            GLOBAL
+# CHECK-NEXT:         GlobalType:      I32
+# CHECK-NEXT:         GlobalMutable:   true
+# CHECK-NEXT:       - Module:          GOT.mem
+# CHECK-NEXT:         Field:           extern_struct
+# CHECK-NEXT:         Kind:            GLOBAL
+# CHECK-NEXT:         GlobalType:      I32
+# CHECK-NEXT:         GlobalMutable:   true
+# CHECK-NEXT:   - Type:            FUNCTION
+
+# CHECK:        - Type:            EXPORT
+# CHECK-NEXT:     Exports:
+# CHECK-NEXT:       - Name:            __wasm_call_ctors
+# CHECK-NEXT:         Kind:            FUNCTION
+# CHECK-NEXT:         Index:           1
+
+# check for elem segment initialized with __table_base global as offset
+
+# CHECK:        - Type:            ELEM
+# CHECK-NEXT:     Segments:
+# CHECK-NEXT:       - Offset:
+# CHECK-NEXT:           Opcode:          GLOBAL_GET
+# CHECK-NEXT:           Index:           2
+# CHECK-NEXT:         Functions:       [ 4, 3 ]
+
+# check the generated code in __wasm_call_ctors and __wasm_apply_data_relocs functions
+# TODO(sbc): Disassemble and verify instructions.
+
+# CHECK:        - Type:            CODE
+# CHECK-NEXT:     Functions:
+# CHECK-NEXT:       - Index:           1
+# CHECK-NEXT:         Locals:          []
+# CHECK-NEXT:         Body:            10020B
+# CHECK-NEXT:       - Index:           2
+# CHECK-NEXT:         Locals:          []
+# CHECK-NEXT:         Body:            230141046A2304360200230141086A230241016A3602002301410C6A230141006A360200230141106A2305360200230141146A230641046A3602000B
+
+# check the data segment initialized with __memory_base global as offset
+
+# CHECK:        - Type:            DATA
+# CHECK-NEXT:     Segments:
+# CHECK-NEXT:       - SectionOffset:   6
+# CHECK-NEXT:         InitFlags:       0
+# CHECK-NEXT:         Offset:
+# CHECK-NEXT:           Opcode:          GLOBAL_GET
+# CHECK-NEXT:           Index:           1
+# CHECK-NEXT:         Content:         '020000000000000001000000000000000000000000000000'


        


More information about the llvm-commits mailing list