aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-12-24 01:00:50 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-12-24 01:00:50 +0000
commit0d9ba4fe26725cacc7253fc3c72c4574f26bc099 (patch)
tree90c426d54188ca226b29aaf8a308bba364a73d1a /test
parenteb1ff93d02b5f17b6b409e83c6d9be585f4a04b3 (diff)
Vendor import of lld trunk r321414:vendor/lld/lld-trunk-r321414
Notes
Notes: svn path=/vendor/lld/dist/; revision=327130 svn path=/vendor/lld/lld-trunk-r321414/; revision=327131; tag=vendor/lld/lld-trunk-r321414
Diffstat (limited to 'test')
-rw-r--r--test/COFF/export-armnt.yaml31
-rw-r--r--test/COFF/lto.ll16
-rw-r--r--test/ELF/Inputs/znotext-plt-relocations.s10
-rw-r--r--test/ELF/arm-exidx-dedup-and-sentinel.s29
-rw-r--r--test/ELF/i386-got-value.s13
-rw-r--r--test/ELF/i386-tls-initial-exec-local.s36
-rw-r--r--test/ELF/linkerscript/arm-exidx-sentinel-and-assignment.s25
-rw-r--r--test/ELF/linkerscript/operators.s6
-rw-r--r--test/ELF/znotext-plt-relocations.s20
-rw-r--r--test/wasm/Inputs/global-ctor-dtor.ll14
-rw-r--r--test/wasm/Inputs/weak-alias.ll32
-rw-r--r--test/wasm/Inputs/weak-symbol1.ll2
-rw-r--r--test/wasm/Inputs/weak-symbol2.ll2
-rw-r--r--test/wasm/archive.ll8
-rw-r--r--test/wasm/call-indirect.ll28
-rw-r--r--test/wasm/conflict.test2
-rw-r--r--test/wasm/data-layout.ll4
-rw-r--r--test/wasm/entry.ll2
-rw-r--r--test/wasm/function-imports-first.ll4
-rw-r--r--test/wasm/function-imports.ll4
-rw-r--r--test/wasm/function-index.test4
-rw-r--r--test/wasm/import-memory.test2
-rw-r--r--test/wasm/init-fini.ll99
-rw-r--r--test/wasm/invalid-stack-size.test2
-rw-r--r--test/wasm/local-symbols.ll2
-rw-r--r--test/wasm/many-functions.ll4
-rw-r--r--test/wasm/relocatable.ll4
-rw-r--r--test/wasm/signature-mismatch.ll4
-rw-r--r--test/wasm/stack-pointer.ll2
-rw-r--r--test/wasm/strip-debug.test2
-rw-r--r--test/wasm/symbol-type-mismatch.ll4
-rw-r--r--test/wasm/undefined-entry.test2
-rw-r--r--test/wasm/undefined.ll2
-rw-r--r--test/wasm/version.ll2
-rw-r--r--test/wasm/weak-alias-overide.ll59
-rw-r--r--test/wasm/weak-alias.ll55
-rw-r--r--test/wasm/weak-external.ll2
-rw-r--r--test/wasm/weak-symbols.ll31
38 files changed, 476 insertions, 94 deletions
diff --git a/test/COFF/export-armnt.yaml b/test/COFF/export-armnt.yaml
index 461d5a033fe2..367dabf70d88 100644
--- a/test/COFF/export-armnt.yaml
+++ b/test/COFF/export-armnt.yaml
@@ -2,16 +2,17 @@
# RUN: yaml2obj < %s > %t.obj
#
-# RUN: lld-link /out:%t.dll /dll %t.obj /export:exportfn1 /export:exportfn2
+# RUN: lld-link /out:%t.dll /dll %t.obj /export:exportfn1 /export:exportfn2 /export:exportdata,data
# RUN: llvm-objdump -p %t.dll | FileCheck %s
# CHECK: Export Table:
# CHECK: DLL name: export-armnt.yaml.tmp.dll
# CHECK: Ordinal RVA Name
# CHECK-NEXT: 0 0
-# CHECK-NEXT: 1 0x1005 exportfn1
-# CHECK-NEXT: 2 0x1009 exportfn2
-# CHECK-NEXT: 3 0x1009 exportfn3
+# CHECK-NEXT: 1 0x1000 exportdata
+# CHECK-NEXT: 2 0x2005 exportfn1
+# CHECK-NEXT: 3 0x2009 exportfn2
+# CHECK-NEXT: 4 0x2009 exportfn3
--- !COFF
header:
@@ -22,6 +23,10 @@ sections:
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE, IMAGE_SCN_MEM_READ ]
Alignment: 4
SectionData: 704700bf704700bf704700bf
+ - Name: .data
+ Characteristics: [ IMAGE_SCN_MEM_READ, IMAGE_SCN_MEM_WRITE ]
+ Alignment: 4
+ SectionData: 00000000
- Name: .drectve
Characteristics: [ IMAGE_SCN_LNK_INFO, IMAGE_SCN_LNK_REMOVE ]
Alignment: 1
@@ -39,6 +44,18 @@ symbols:
NumberOfLinenumbers: 0
CheckSum: 0
Number: 0
+ - Name: .data
+ Value: 0
+ SectionNumber: 2
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_STATIC
+ SectionDefinition:
+ Length: 4
+ NumberOfRelocations: 0
+ NumberOfLinenumbers: 0
+ CheckSum: 0
+ Number: 0
- Name: _DllMainCRTStartup
Value: 0
SectionNumber: 1
@@ -63,6 +80,12 @@ symbols:
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
+ - Name: exportdata
+ Value: 0
+ SectionNumber: 2
+ SimpleType: IMAGE_SYM_TYPE_NULL
+ ComplexType: IMAGE_SYM_DTYPE_NULL
+ StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: '?mangled@@YAHXZ'
Value: 8
SectionNumber: 1
diff --git a/test/COFF/lto.ll b/test/COFF/lto.ll
index b8f8d7063343..587ca5ddcf13 100644
--- a/test/COFF/lto.ll
+++ b/test/COFF/lto.ll
@@ -82,7 +82,21 @@
; TEXT-10: Disassembly of section .text:
; TEXT-10-NEXT: .text:
; TEXT-10-NEXT: retq
-; TEXT-10-NEXT: nopw %cs:(%rax,%rax)
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
+; TEXT-10-NEXT: nop
; TEXT-10-NEXT: retq
; TEXT-10-NEXT: int3
; TEXT-10-NEXT: int3
diff --git a/test/ELF/Inputs/znotext-plt-relocations.s b/test/ELF/Inputs/znotext-plt-relocations.s
new file mode 100644
index 000000000000..f269cf906619
--- /dev/null
+++ b/test/ELF/Inputs/znotext-plt-relocations.s
@@ -0,0 +1,10 @@
+.text
+.global atexit
+.type atexit,@function
+atexit:
+ nop
+
+.global foo
+.type foo,@function
+foo:
+ nop
diff --git a/test/ELF/arm-exidx-dedup-and-sentinel.s b/test/ELF/arm-exidx-dedup-and-sentinel.s
new file mode 100644
index 000000000000..84ef318a3850
--- /dev/null
+++ b/test/ELF/arm-exidx-dedup-and-sentinel.s
@@ -0,0 +1,29 @@
+// REQUIRES: arm
+// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t.o
+// RUN: ld.lld %t.o -shared -o %t.so --section-start .text=0x2000 --section-start .ARM.exidx=0x1000
+// RUN: llvm-objdump -s -triple=armv7a-none-linux-gnueabi %t.so | FileCheck %s
+
+ .syntax unified
+
+ .section .text.foo, "ax", %progbits
+ .globl foo
+foo:
+ .fnstart
+ bx lr
+ .cantunwind
+ .fnend
+
+ .section .text.bar, "ax", %progbits
+ .globl bar
+bar:
+ .fnstart
+ bx lr
+ .cantunwind
+ .fnend
+
+// CHECK: Contents of section .ARM.exidx:
+// 1000 + 1000 = 0x2000 = foo
+// The entry for bar is the same as previous and is eliminated.
+// The sentinel entry should be preserved.
+// 1008 + 1000 = 0x2008 = bar + sizeof(bar)
+// CHECK-NEXT: 1000 00100000 01000000 00100000 01000000
diff --git a/test/ELF/i386-got-value.s b/test/ELF/i386-got-value.s
index f42555b79272..8803fcffb312 100644
--- a/test/ELF/i386-got-value.s
+++ b/test/ELF/i386-got-value.s
@@ -1,10 +1,10 @@
# RUN: llvm-mc %s -o %t.o -filetype=obj -triple=i386-pc-linux
# RUN: ld.lld %t.o -o %t.so -shared
-# RUN: llvm-readobj --relocations --symbols --sections --section-data %t.so | FileCheck %s
+# RUN: llvm-readobj --relocations --sections --section-data %t.so | FileCheck %s
-# Check that the value of a preemptible symbol is written to the got
-# entry when using Elf_Rel. It is not clear why that is required, but
-# freebsd i386 seems to depend on it.
+# Check that the value of a preemptible symbol is not written to the
+# got entry when using Elf_Rel. It is not needed since the dynamic
+# linker will write the final value.
# CHECK: Name: .got
# CHECK-NEXT: Type: SHT_PROGBITS
@@ -20,14 +20,11 @@
# CHECK-NEXT: AddressAlignment:
# CHECK-NEXT: EntrySize:
# CHECK-NEXT: SectionData (
-# CHECK-NEXT: 0000: 00200000
+# CHECK-NEXT: 0000: 00000000
# CHECK-NEXT: )
# CHECK: R_386_GLOB_DAT bar 0x0
-# CHECK: Name: bar
-# CHECK-NEXT: Value: 0x2000
-
movl bar@GOT(%eax), %eax
.data
diff --git a/test/ELF/i386-tls-initial-exec-local.s b/test/ELF/i386-tls-initial-exec-local.s
new file mode 100644
index 000000000000..dd7de7b431e5
--- /dev/null
+++ b/test/ELF/i386-tls-initial-exec-local.s
@@ -0,0 +1,36 @@
+# REQUIRES: x86
+# RUN: llvm-mc %s -o %t.o -filetype=obj -triple=i386-pc-linux
+# RUN: ld.lld %t.o -o %t.so -shared
+# RUN: llvm-readobj --relocations --sections --section-data %t.so | FileCheck %s
+
+# Check initial exec access to a local symbol.
+
+# CHECK: Name: .got (
+# CHECK-NEXT: Type:
+# CHECK-NEXT: Flags [
+# CHECK-NEXT: SHF_ALLOC
+# CHECK-NEXT: SHF_WRITE
+# CHECK-NEXT: ]
+# CHECK-NEXT: Address:
+# CHECK-NEXT: Offset:
+# CHECK-NEXT: Size: 8
+# CHECK-NEXT: Link:
+# CHECK-NEXT: Info:
+# CHECK-NEXT: AddressAlignment:
+# CHECK-NEXT: EntrySize:
+# CHECK-NEXT: SectionData (
+# CHECK-NEXT: 0000: 00000000 04000000
+# CHECK-NEXT: )
+
+# CHECK: R_386_TLS_TPOFF - 0x0
+# CHECK-NEXT: R_386_TLS_TPOFF - 0x0
+
+ movl bar1@GOTNTPOFF(%eax), %ecx
+ movl bar2@GOTNTPOFF(%eax), %eax
+
+ .section .tdata,"awT",@progbits
+bar1:
+ .long 42
+
+bar2:
+ .long 42
diff --git a/test/ELF/linkerscript/arm-exidx-sentinel-and-assignment.s b/test/ELF/linkerscript/arm-exidx-sentinel-and-assignment.s
index 8cee22f7fed2..332ed93a4605 100644
--- a/test/ELF/linkerscript/arm-exidx-sentinel-and-assignment.s
+++ b/test/ELF/linkerscript/arm-exidx-sentinel-and-assignment.s
@@ -8,6 +8,7 @@
## was anything but an input section description.
# RUN: ld.lld --no-merge-exidx-entries -T %t.script %t.o -shared -o %t.so
# RUN: llvm-objdump -s -triple=armv7a-none-linux-gnueabi %t.so | FileCheck %s
+# RUN: llvm-readobj -s -t %t.so | FileCheck %s --check-prefix=SYMBOL
.syntax unified
.text
@@ -18,7 +19,23 @@ _start:
bx lr
.fnend
-// CHECK: Contents of section .ARM.exidx:
-// 1000 + 1000 = 0x2000 = _start
-// 1008 + 0ffc = 0x2004 = _start + sizeof(_start)
-// CHECK-NEXT: 1000 00100000 01000000 fc0f0000 01000000
+# CHECK: Contents of section .ARM.exidx:
+# 1000 + 1000 = 0x2000 = _start
+# 1008 + 0ffc = 0x2004 = _start + sizeof(_start)
+# CHECK-NEXT: 1000 00100000 01000000 fc0f0000 01000000
+
+# SYMBOL: Section {
+# SYMBOL: Name: .ARM.exidx
+# SYMBOL-NEXT: Type: SHT_ARM_EXIDX
+# SYMBOL-NEXT: Flags [
+# SYMBOL-NEXT: SHF_ALLOC
+# SYMBOL-NEXT: SHF_LINK_ORDER
+# SYMBOL-NEXT: ]
+# SYMBOL-NEXT: Address: 0x1000
+# SYMBOL-NEXT: Offset:
+# SYMBOL-NEXT: Size: 16
+
+# Symbol 'foo' is expected to point at the end of the section.
+# SYMBOL: Symbol {
+# SYMBOL: Name: foo
+# SYMBOL-NEXT: Value: 0x1010
diff --git a/test/ELF/linkerscript/operators.s b/test/ELF/linkerscript/operators.s
index 868805b34c2e..494fc08c0f99 100644
--- a/test/ELF/linkerscript/operators.s
+++ b/test/ELF/linkerscript/operators.s
@@ -1,6 +1,7 @@
# REQUIRES: x86
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
# RUN: echo "SECTIONS { \
+# RUN: _start = .; \
# RUN: plus = 1 + 2 + 3; \
# RUN: minus = 5 - 1; \
# RUN: div = 6 / 2; \
@@ -26,6 +27,9 @@
# RUN: . = 0xfff0; \
# RUN: datasegmentalign = DATA_SEGMENT_ALIGN (0xffff, 0); \
# RUN: datasegmentalign2 = DATA_SEGMENT_ALIGN (0, 0); \
+# RUN: _end = .; \
+# RUN: minus_rel = _end - 0x10; \
+# RUN: minus_abs = _end - _start; \
# RUN: }" > %t.script
# RUN: ld.lld %t --script %t.script -o %t2
# RUN: llvm-objdump -t %t2 | FileCheck %s
@@ -53,6 +57,8 @@
# CHECK: 00000000001000 *ABS* 00000000 commonpagesize
# CHECK: 0000000000ffff *ABS* 00000000 datasegmentalign
# CHECK: 0000000000fff0 *ABS* 00000000 datasegmentalign2
+# CHECK: 0000000000ffe0 .text 00000000 minus_rel
+# CHECK: 0000000000fff0 *ABS* 00000000 minus_abs
## Mailformed number error.
# RUN: echo "SECTIONS { . = 0x12Q41; }" > %t.script
diff --git a/test/ELF/znotext-plt-relocations.s b/test/ELF/znotext-plt-relocations.s
new file mode 100644
index 000000000000..ad305b0c1f6c
--- /dev/null
+++ b/test/ELF/znotext-plt-relocations.s
@@ -0,0 +1,20 @@
+# REQUIRES: x86
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/znotext-plt-relocations.s -o %t2.o
+# RUN: ld.lld %t2.o -o %t2.so -shared
+# RUN: ld.lld -z notext %t.o %t2.so -o %t
+# RUN: llvm-readobj -r %t | FileCheck %s
+
+# CHECK: Relocations [
+# CHECK-NEXT: Section {{.*}} .rela.dyn {
+# CHECK-NEXT: R_X86_64_64 foo 0x0
+# CHECK-NEXT: }
+# CHECK-NEXT: Section {{.*}} .rela.plt {
+# CHECK-NEXT: R_X86_64_JUMP_SLOT atexit 0x0
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
+
+.text
+_start:
+callq atexit
+.quad foo
diff --git a/test/wasm/Inputs/global-ctor-dtor.ll b/test/wasm/Inputs/global-ctor-dtor.ll
new file mode 100644
index 000000000000..5cacd7e433ab
--- /dev/null
+++ b/test/wasm/Inputs/global-ctor-dtor.ll
@@ -0,0 +1,14 @@
+define hidden void @myctor() {
+entry:
+ ret void
+}
+
+define hidden void @mydtor() {
+entry:
+ %ptr = alloca i32
+ ret void
+}
+
+@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @myctor, i8* null }]
+
+@llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @mydtor, i8* null }]
diff --git a/test/wasm/Inputs/weak-alias.ll b/test/wasm/Inputs/weak-alias.ll
index 079e68e3ce7a..b911b35529c5 100644
--- a/test/wasm/Inputs/weak-alias.ll
+++ b/test/wasm/Inputs/weak-alias.ll
@@ -1,13 +1,37 @@
; Function Attrs: norecurse nounwind readnone
-define i32 @foo() #0 {
+define i32 @direct_fn() #0 {
entry:
ret i32 0
}
-@bar = weak alias i32 (), i32 ()* @foo
+@alias_fn = weak alias i32 (), i32 ()* @direct_fn
-define i32 @call_bar() #0 {
+define i32 @call_direct() #0 {
entry:
- %call = call i32 @bar()
+ %call = call i32 @direct_fn()
+ ret i32 %call
+}
+
+define i32 @call_alias() #0 {
+entry:
+ %call = call i32 @alias_fn()
+ ret i32 %call
+}
+
+define i32 @call_alias_ptr() #0 {
+entry:
+ %fnptr = alloca i32 ()*, align 8
+ store i32 ()* @alias_fn, i32 ()** %fnptr, align 8
+ %0 = load i32 ()*, i32 ()** %fnptr, align 8
+ %call = call i32 %0()
+ ret i32 %call
+}
+
+define i32 @call_direct_ptr() #0 {
+entry:
+ %fnptr = alloca i32 ()*, align 8
+ store i32 ()* @direct_fn, i32 ()** %fnptr, align 8
+ %0 = load i32 ()*, i32 ()** %fnptr, align 8
+ %call = call i32 %0()
ret i32 %call
}
diff --git a/test/wasm/Inputs/weak-symbol1.ll b/test/wasm/Inputs/weak-symbol1.ll
index 2d561716f825..61e7e5818c54 100644
--- a/test/wasm/Inputs/weak-symbol1.ll
+++ b/test/wasm/Inputs/weak-symbol1.ll
@@ -7,3 +7,5 @@ define i32 @exportWeak1() {
entry:
ret i32 ptrtoint (i32 ()* @weakFn to i32)
}
+
+@weakGlobal = weak global i32 1
diff --git a/test/wasm/Inputs/weak-symbol2.ll b/test/wasm/Inputs/weak-symbol2.ll
index f43ea96673b9..9e2e270f8693 100644
--- a/test/wasm/Inputs/weak-symbol2.ll
+++ b/test/wasm/Inputs/weak-symbol2.ll
@@ -7,3 +7,5 @@ define i32 @exportWeak2() {
entry:
ret i32 ptrtoint (i32 ()* @weakFn to i32)
}
+
+@weakGlobal = weak global i32 2
diff --git a/test/wasm/archive.ll b/test/wasm/archive.ll
index 18f35330d1e9..a43e460d69f2 100644
--- a/test/wasm/archive.ll
+++ b/test/wasm/archive.ll
@@ -1,7 +1,7 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %S/Inputs/archive1.ll -o %t.a1.o
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %S/Inputs/archive2.ll -o %t.a2.o
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %S/Inputs/hello.ll -o %t.a3.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %S/Inputs/archive1.ll -o %t.a1.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %S/Inputs/archive2.ll -o %t.a2.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %S/Inputs/hello.ll -o %t.a3.o
; RUN: llvm-ar rcs %t.a %t.a1.o %t.a2.o %t.a3.o
; RUN: lld -flavor wasm %t.a %t.o -o %t.wasm
; RUN: llvm-nm -a %t.wasm | FileCheck %s
diff --git a/test/wasm/call-indirect.ll b/test/wasm/call-indirect.ll
index 14845eb50f83..2b838a8efa4d 100644
--- a/test/wasm/call-indirect.ll
+++ b/test/wasm/call-indirect.ll
@@ -1,5 +1,5 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/call-indirect.ll -o %t2.o
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/call-indirect.ll -o %t2.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
; RUN: lld -flavor wasm -o %t.wasm %t2.o %t.o
; RUN: obj2yaml %t.wasm | FileCheck %s
@@ -20,10 +20,17 @@ entry:
define i32 @_start() local_unnamed_addr #1 {
entry:
%0 = load i32 ()*, i32 ()** @indirect_func, align 4
- %call = tail call i32 %0() #2
+ %call = call i32 %0() #2
ret i32 0
}
+; Indirect function call where no function actually has this type.
+; Ensures that the type entry is still created in this case.
+define void @call_ptr(i64 (i64)* %arg) {
+ %1 = call i64 %arg(i64 1)
+ ret void
+}
+
; CHECK: !WASM
; CHECK-NEXT: FileHeader:
; CHECK-NEXT: Version: 0x00000001
@@ -36,8 +43,16 @@ entry:
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: ReturnType: NORESULT
; CHECK-NEXT: ParamTypes:
+; CHECK-NEXT: - Index: 2
+; CHECK-NEXT: ReturnType: NORESULT
+; CHECK-NEXT: ParamTypes:
+; CHECK-NEXT: - I32
+; CHECK-NEXT: - Index: 3
+; CHECK-NEXT: ReturnType: I64
+; CHECK-NEXT: ParamTypes:
+; CHECK-NEXT: - I64
; CHECK-NEXT: - Type: FUNCTION
-; CHECK-NEXT: FunctionTypes: [ 0, 1, 0, 0 ]
+; CHECK-NEXT: FunctionTypes: [ 0, 1, 0, 0, 2 ]
; CHECK-NEXT: - Type: TABLE
; CHECK-NEXT: Tables:
; CHECK-NEXT: - ElemType: ANYFUNC
@@ -72,6 +87,9 @@ entry:
; CHECK-NEXT: - Name: call_bar_indirect
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Index: 1
+; CHECK-NEXT: - Name: call_ptr
+; CHECK-NEXT: Kind: FUNCTION
+; CHECK-NEXT: Index: 4
; CHECK-NEXT: - Type: ELEM
; CHECK-NEXT: Segments:
; CHECK-NEXT: - Offset:
@@ -88,6 +106,8 @@ entry:
; CHECK-NEXT: Body: 41020B
; CHECK-NEXT: - Locals:
; CHECK-NEXT: Body: 410028028888808000118080808000001A41000B
+; CHECK-NEXT: - Locals:
+; CHECK-NEXT: Body: 42012000118380808000001A0B
; CHECK-NEXT: - Type: DATA
; CHECK-NEXT: Segments:
; CHECK-NEXT: - SectionOffset: 7
diff --git a/test/wasm/conflict.test b/test/wasm/conflict.test
index a0a2eb4e3b3a..41684ae51a12 100644
--- a/test/wasm/conflict.test
+++ b/test/wasm/conflict.test
@@ -1,4 +1,4 @@
-# RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
+# RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
# RUN: not lld -flavor wasm -o %t.wasm %t.ret32.o %t.ret32.o 2>&1 | FileCheck %s
# CHECK: duplicate symbol: ret32
diff --git a/test/wasm/data-layout.ll b/test/wasm/data-layout.ll
index 0b2c61da5547..2300b362a55f 100644
--- a/test/wasm/data-layout.ll
+++ b/test/wasm/data-layout.ll
@@ -1,5 +1,5 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/hello.ll -o %t.hello.o
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/hello.ll -o %t.hello.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
; RUN: lld -flavor wasm --emit-relocs --allow-undefined --no-entry -o %t.wasm %t.o %t.hello.o
; RUN: obj2yaml %t.wasm | FileCheck %s
diff --git a/test/wasm/entry.ll b/test/wasm/entry.ll
index e51c7055b80e..4749d8306651 100644
--- a/test/wasm/entry.ll
+++ b/test/wasm/entry.ll
@@ -1,4 +1,4 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
; RUN: lld -flavor wasm -e entry -o %t.wasm %t.o
; RUN: obj2yaml %t.wasm | FileCheck %s
; RUN: lld -flavor wasm --entry=entry -o %t.wasm %t.o
diff --git a/test/wasm/function-imports-first.ll b/test/wasm/function-imports-first.ll
index 085345ad7ffc..eda1302703c0 100644
--- a/test/wasm/function-imports-first.ll
+++ b/test/wasm/function-imports-first.ll
@@ -1,5 +1,5 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
; RUN: lld -flavor wasm -o %t.wasm %t.o %t.ret32.o
; RUN: obj2yaml %t.wasm | FileCheck %s
diff --git a/test/wasm/function-imports.ll b/test/wasm/function-imports.ll
index e0988ff95f96..072554d8400a 100644
--- a/test/wasm/function-imports.ll
+++ b/test/wasm/function-imports.ll
@@ -1,5 +1,5 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
; RUN: lld -flavor wasm -o %t.wasm %t.ret32.o %t.o
; RUN: obj2yaml %t.wasm | FileCheck %s
diff --git a/test/wasm/function-index.test b/test/wasm/function-index.test
index 03bd879b5176..c65c560d11c8 100644
--- a/test/wasm/function-index.test
+++ b/test/wasm/function-index.test
@@ -1,5 +1,5 @@
-# RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
-# RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/ret64.ll -o %t.ret64.o
+# RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
+# RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/ret64.ll -o %t.ret64.o
# RUN: lld -flavor wasm -r -o %t.wasm %t.ret32.o %t.ret64.o
# RUN: obj2yaml %t.wasm | FileCheck %s
diff --git a/test/wasm/import-memory.test b/test/wasm/import-memory.test
index af0ff910449c..9713e6cd5a17 100644
--- a/test/wasm/import-memory.test
+++ b/test/wasm/import-memory.test
@@ -1,4 +1,4 @@
-# RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
+# RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
# RUN: lld -flavor wasm -entry ret32 --import-memory -o %t.wasm %t.ret32.o
# RUN: obj2yaml %t.wasm | FileCheck %s
diff --git a/test/wasm/init-fini.ll b/test/wasm/init-fini.ll
new file mode 100644
index 000000000000..bdae29811d8e
--- /dev/null
+++ b/test/wasm/init-fini.ll
@@ -0,0 +1,99 @@
+; RUN: llc -mtriple=wasm32-unknown-unknown-wasm -filetype=obj -o %t.o %s
+; RUN: llc -mtriple=wasm32-unknown-unknown-wasm -filetype=obj %S/Inputs/global-ctor-dtor.ll -o %t.global-ctor-dtor.o
+
+define hidden void @func1() {
+entry:
+ ret void
+}
+
+define hidden void @func2() {
+entry:
+ ret void
+}
+
+define void @__cxa_atexit() {
+ ret void
+}
+
+define hidden void @_start() {
+entry:
+ ret void
+}
+
+@llvm.global_ctors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @func1, i8* null }]
+
+@llvm.global_dtors = appending global [1 x { i32, void ()*, i8* }] [{ i32, void ()*, i8* } { i32 65535, void ()* @func2, i8* null }]
+
+; RUN: lld -flavor wasm %t.o %t.global-ctor-dtor.o -o %t.wasm
+; RUN: obj2yaml %t.wasm | FileCheck %s
+
+; CHECK: Name: linking
+; CHECK-NEXT: DataSize: 0
+; CHECK-NEXT: - Type: CUSTOM
+; CHECK-NEXT: Name: name
+; CHECK-NEXT: FunctionNames:
+; CHECK-NEXT: - Index: 0
+; CHECK-NEXT: Name: func1
+; CHECK-NEXT: - Index: 1
+; CHECK-NEXT: Name: func2
+; CHECK-NEXT: - Index: 2
+; CHECK-NEXT: Name: __cxa_atexit
+; CHECK-NEXT: - Index: 3
+; CHECK-NEXT: Name: _start
+; CHECK-NEXT: - Index: 4
+; CHECK-NEXT: Name: .Lcall_dtors
+; CHECK-NEXT: - Index: 5
+; CHECK-NEXT: Name: .Lregister_call_dtors
+; CHECK-NEXT: - Index: 6
+; CHECK-NEXT: Name: .Lbitcast
+; CHECK-NEXT: - Index: 7
+; CHECK-NEXT: Name: myctor
+; CHECK-NEXT: - Index: 8
+; CHECK-NEXT: Name: mydtor
+; CHECK-NEXT: - Index: 9
+; CHECK-NEXT: Name: .Lcall_dtors
+; CHECK-NEXT: - Index: 10
+; CHECK-NEXT: Name: .Lregister_call_dtors
+; CHECK-NEXT: ...
+
+
+; RUN: lld -flavor wasm -r %t.o %t.global-ctor-dtor.o -o %t.reloc.wasm
+; RUN: obj2yaml %t.reloc.wasm | FileCheck -check-prefix=RELOC %s
+
+; RELOC: Name: linking
+; RELOC-NEXT: DataSize: 0
+; RELOC-NEXT: InitFunctions:
+; RELOC-NEXT: - Priority: 65535
+; RELOC-NEXT: FunctionIndex: 0
+; RELOC-NEXT: - Priority: 65535
+; RELOC-NEXT: FunctionIndex: 5
+; RELOC-NEXT: - Priority: 65535
+; RELOC-NEXT: FunctionIndex: 7
+; RELOC-NEXT: - Priority: 65535
+; RELOC-NEXT: FunctionIndex: 10
+; RELOC-NEXT: - Type: CUSTOM
+; RELOC-NEXT: Name: name
+; RELOC-NEXT: FunctionNames:
+; RELOC-NEXT: - Index: 0
+; RELOC-NEXT: Name: func1
+; RELOC-NEXT: - Index: 1
+; RELOC-NEXT: Name: func2
+; RELOC-NEXT: - Index: 2
+; RELOC-NEXT: Name: __cxa_atexit
+; RELOC-NEXT: - Index: 3
+; RELOC-NEXT: Name: _start
+; RELOC-NEXT: - Index: 4
+; RELOC-NEXT: Name: .Lcall_dtors
+; RELOC-NEXT: - Index: 5
+; RELOC-NEXT: Name: .Lregister_call_dtors
+; RELOC-NEXT: - Index: 6
+; RELOC-NEXT: Name: .Lbitcast
+; RELOC-NEXT: - Index: 7
+; RELOC-NEXT: Name: myctor
+; RELOC-NEXT: - Index: 8
+; RELOC-NEXT: Name: mydtor
+; RELOC-NEXT: - Index: 9
+; RELOC-NEXT: Name: .Lcall_dtors
+; RELOC-NEXT: - Index: 10
+; RELOC-NEXT: Name: .Lregister_call_dtors
+; RELOC-NEXT: ...
diff --git a/test/wasm/invalid-stack-size.test b/test/wasm/invalid-stack-size.test
index 6597c548499a..484bbd3ca2c8 100644
--- a/test/wasm/invalid-stack-size.test
+++ b/test/wasm/invalid-stack-size.test
@@ -1,4 +1,4 @@
-; RUN: llc -mtriple wasm32-unknown-unknown-wasm -filetype=obj %s -o %t.o
+; RUN: llc -mtriple=wasm32-unknown-unknown-wasm -filetype=obj %s -o %t.o
; RUN: not lld -flavor wasm -o %t.wasm -z stack-size=1 %t.o 2>&1 | FileCheck %s
define i32 @_start() local_unnamed_addr #1 {
diff --git a/test/wasm/local-symbols.ll b/test/wasm/local-symbols.ll
index 3e6722b124ec..e88f656e14c6 100644
--- a/test/wasm/local-symbols.ll
+++ b/test/wasm/local-symbols.ll
@@ -1,4 +1,4 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
; RUN: lld -flavor wasm -o %t.wasm %t.o
; RUN: obj2yaml %t.wasm | FileCheck %s
diff --git a/test/wasm/many-functions.ll b/test/wasm/many-functions.ll
index 77326d739a8b..f21298d862d6 100644
--- a/test/wasm/many-functions.ll
+++ b/test/wasm/many-functions.ll
@@ -1,5 +1,5 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/many-funcs.ll -o %t.many.o
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/many-funcs.ll -o %t.many.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
; RUN: lld -flavor wasm -r -o %t.wasm %t.many.o %t.o
; RUN: obj2yaml %t.wasm | FileCheck %s
diff --git a/test/wasm/relocatable.ll b/test/wasm/relocatable.ll
index cb86aa20cab2..d9d2e02bdabb 100644
--- a/test/wasm/relocatable.ll
+++ b/test/wasm/relocatable.ll
@@ -1,5 +1,5 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/hello.ll -o %t.hello.o
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/hello.ll -o %t.hello.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
; RUN: lld -flavor wasm -r -o %t.wasm %t.hello.o %t.o
; RUN: obj2yaml %t.wasm | FileCheck %s
diff --git a/test/wasm/signature-mismatch.ll b/test/wasm/signature-mismatch.ll
index 88f70fea5123..842b8289afd9 100644
--- a/test/wasm/signature-mismatch.ll
+++ b/test/wasm/signature-mismatch.ll
@@ -1,5 +1,5 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.main.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.main.o
; RUN: not lld -flavor wasm --check-signatures -o %t.wasm %t.main.o %t.ret32.o 2>&1 | FileCheck %s
; Function Attrs: nounwind
diff --git a/test/wasm/stack-pointer.ll b/test/wasm/stack-pointer.ll
index 738f0dce8e81..c5be94af4e39 100644
--- a/test/wasm/stack-pointer.ll
+++ b/test/wasm/stack-pointer.ll
@@ -1,4 +1,4 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
; RUN: lld -flavor wasm --emit-relocs -o %t.wasm %t.o
; RUN: obj2yaml %t.wasm | FileCheck %s
diff --git a/test/wasm/strip-debug.test b/test/wasm/strip-debug.test
index 57667a9f4406..ca4b02a4a5fb 100644
--- a/test/wasm/strip-debug.test
+++ b/test/wasm/strip-debug.test
@@ -1,4 +1,4 @@
-RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
+RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
RUN: lld -flavor wasm --strip-debug --entry=ret32 -o %t.wasm %t.ret32.o
RUN: obj2yaml %t.wasm | FileCheck %s
diff --git a/test/wasm/symbol-type-mismatch.ll b/test/wasm/symbol-type-mismatch.ll
index 706a361dd767..b7e37c142549 100644
--- a/test/wasm/symbol-type-mismatch.ll
+++ b/test/wasm/symbol-type-mismatch.ll
@@ -1,5 +1,5 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
; RUN: not lld -flavor wasm -o %t.wasm %t.o %t.ret32.o 2>&1 | FileCheck %s
@ret32 = extern_weak global i32, align 4
diff --git a/test/wasm/undefined-entry.test b/test/wasm/undefined-entry.test
index 00a0761f4b6c..55f7d6fb7843 100644
--- a/test/wasm/undefined-entry.test
+++ b/test/wasm/undefined-entry.test
@@ -1,4 +1,4 @@
-RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
+RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/ret32.ll -o %t.ret32.o
RUN: not lld -flavor wasm -o %t.wasm %t.ret32.o 2>&1 | FileCheck %s
CHECK: error: undefined symbol: _start
diff --git a/test/wasm/undefined.ll b/test/wasm/undefined.ll
index c5f266431702..249afe243b07 100644
--- a/test/wasm/undefined.ll
+++ b/test/wasm/undefined.ll
@@ -1,4 +1,4 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
; RUN: lld -flavor wasm --allow-undefined -o %t.wasm %t.o
; Fails due to undefined 'foo'
diff --git a/test/wasm/version.ll b/test/wasm/version.ll
index aed7b39ff3b9..2ae65d9ad37f 100644
--- a/test/wasm/version.ll
+++ b/test/wasm/version.ll
@@ -1,4 +1,4 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
; RUN: lld -flavor wasm -o %t.wasm %t.o
; RUN: llvm-readobj -file-headers %t.wasm | FileCheck %s
diff --git a/test/wasm/weak-alias-overide.ll b/test/wasm/weak-alias-overide.ll
index 5f4021e18b0f..c2f673a52725 100644
--- a/test/wasm/weak-alias-overide.ll
+++ b/test/wasm/weak-alias-overide.ll
@@ -1,19 +1,19 @@
-; RUN: llc -mtriple wasm32-unknown-unknown-wasm -filetype=obj -o %t.o %s
+; RUN: llc -mtriple=wasm32-unknown-unknown-wasm -filetype=obj -o %t.o %s
; RUN: llc -mtriple=wasm32-unknown-unknown-wasm -filetype=obj %S/Inputs/weak-alias.ll -o %t2.o
; RUN: lld -flavor wasm %t.o %t2.o -o %t.wasm
; RUN: obj2yaml %t.wasm | FileCheck %s
-; Test that the strongly defined bar is used correctly despite the existence
-; of the weak alias
+; Test that the strongly defined alias_fn from this file is used both here
+; and in call_alias.
-define i32 @bar() local_unnamed_addr #1 {
+define i32 @alias_fn() local_unnamed_addr #1 {
ret i32 1
}
; Function Attrs: nounwind uwtable
define void @_start() local_unnamed_addr #1 {
entry:
- %call = tail call i32 @bar() #2
+ %call = tail call i32 @alias_fn() #2
ret void
}
@@ -30,14 +30,14 @@ entry:
; CHECK-NEXT: ReturnType: NORESULT
; CHECK-NEXT: ParamTypes:
; CHECK-NEXT: - Type: FUNCTION
-; CHECK-NEXT: FunctionTypes: [ 0, 1, 0, 0 ]
+; CHECK-NEXT: FunctionTypes: [ 0, 1, 0, 0, 0, 0, 0 ]
; CHECK-NEXT: - Type: TABLE
; CHECK-NEXT: Tables:
; CHECK-NEXT: - ElemType: ANYFUNC
; CHECK-NEXT: Limits:
; CHECK-NEXT: Flags: [ HAS_MAX ]
-; CHECK-NEXT: Initial: 0x00000001
-; CHECK-NEXT: Maximum: 0x00000001
+; CHECK-NEXT: Initial: 0x00000003
+; CHECK-NEXT: Maximum: 0x00000003
; CHECK-NEXT: - Type: MEMORY
; CHECK-NEXT: Memories:
; CHECK-NEXT: - Initial: 0x00000002
@@ -56,15 +56,30 @@ entry:
; CHECK-NEXT: - Name: _start
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Index: 1
-; CHECK-NEXT: - Name: bar
+; CHECK-NEXT: - Name: alias_fn
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Index: 0
-; CHECK-NEXT: - Name: foo
+; CHECK-NEXT: - Name: direct_fn
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Index: 2
-; CHECK-NEXT: - Name: call_bar
+; CHECK-NEXT: - Name: call_direct
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Index: 3
+; CHECK-NEXT: - Name: call_alias
+; CHECK-NEXT: Kind: FUNCTION
+; CHECK-NEXT: Index: 4
+; CHECK-NEXT: - Name: call_alias_ptr
+; CHECK-NEXT: Kind: FUNCTION
+; CHECK-NEXT: Index: 5
+; CHECK-NEXT: - Name: call_direct_ptr
+; CHECK-NEXT: Kind: FUNCTION
+; CHECK-NEXT: Index: 6
+; CHECK-NEXT: - Type: ELEM
+; CHECK-NEXT: Segments:
+; CHECK-NEXT: - Offset:
+; CHECK-NEXT: Opcode: I32_CONST
+; CHECK-NEXT: Value: 1
+; CHECK-NEXT: Functions: [ 0, 2 ]
; CHECK-NEXT: - Type: CODE
; CHECK-NEXT: Functions:
; CHECK-NEXT: - Locals:
@@ -74,7 +89,17 @@ entry:
; CHECK-NEXT: - Locals:
; CHECK-NEXT: Body: 41000B
; CHECK-NEXT: - Locals:
+; CHECK-NEXT: Body: 1082808080000B
+; CHECK-NEXT: - Locals:
; CHECK-NEXT: Body: 1080808080000B
+; CHECK-NEXT: - Locals:
+; CHECK-NEXT: - Type: I32
+; CHECK-NEXT: Count: 2
+; CHECK-NEXT: Body: 23808080800041106B220024808080800020004181808080003602081080808080002101200041106A24808080800020010B
+; CHECK-NEXT: - Locals:
+; CHECK-NEXT: - Type: I32
+; CHECK-NEXT: Count: 2
+; CHECK-NEXT: Body: 23808080800041106B220024808080800020004182808080003602081082808080002101200041106A24808080800020010B
; CHECK-NEXT: - Type: CUSTOM
; CHECK-NEXT: Name: linking
; CHECK-NEXT: DataSize: 0
@@ -82,11 +107,17 @@ entry:
; CHECK-NEXT: Name: name
; CHECK-NEXT: FunctionNames:
; CHECK-NEXT: - Index: 0
-; CHECK-NEXT: Name: bar
+; CHECK-NEXT: Name: alias_fn
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: Name: _start
; CHECK-NEXT: - Index: 2
-; CHECK-NEXT: Name: foo
+; CHECK-NEXT: Name: direct_fn
; CHECK-NEXT: - Index: 3
-; CHECK-NEXT: Name: call_bar
+; CHECK-NEXT: Name: call_direct
+; CHECK-NEXT: - Index: 4
+; CHECK-NEXT: Name: call_alias
+; CHECK-NEXT: - Index: 5
+; CHECK-NEXT: Name: call_alias_ptr
+; CHECK-NEXT: - Index: 6
+; CHECK-NEXT: Name: call_direct_ptr
; CHECK-NEXT: ...
diff --git a/test/wasm/weak-alias.ll b/test/wasm/weak-alias.ll
index 6f96d4d17643..6a345ec0c63e 100644
--- a/test/wasm/weak-alias.ll
+++ b/test/wasm/weak-alias.ll
@@ -1,16 +1,16 @@
-; RUN: llc -mtriple wasm32-unknown-unknown-wasm -filetype=obj -o %t.o %s
+; RUN: llc -mtriple=wasm32-unknown-unknown-wasm -filetype=obj -o %t.o %s
; RUN: llc -mtriple=wasm32-unknown-unknown-wasm -filetype=obj %S/Inputs/weak-alias.ll -o %t2.o
; RUN: lld -flavor wasm %t.o %t2.o -o %t.wasm
; RUN: obj2yaml %t.wasm | FileCheck %s
-; Test that weak aliases (bar is a weak alias of foo) are linked correctly
+; Test that weak aliases (alias_fn is a weak alias of direct_fn) are linked correctly
-declare i32 @bar() local_unnamed_addr #1
+declare i32 @alias_fn() local_unnamed_addr #1
; Function Attrs: nounwind uwtable
define i32 @_start() local_unnamed_addr #1 {
entry:
- %call = tail call i32 @bar() #2
+ %call = tail call i32 @alias_fn() #2
ret i32 %call
}
@@ -24,14 +24,14 @@ entry:
; CHECK-NEXT: ReturnType: I32
; CHECK-NEXT: ParamTypes:
; CHECK-NEXT: - Type: FUNCTION
-; CHECK-NEXT: FunctionTypes: [ 0, 0, 0 ]
+; CHECK-NEXT: FunctionTypes: [ 0, 0, 0, 0, 0, 0 ]
; CHECK-NEXT: - Type: TABLE
; CHECK-NEXT: Tables:
; CHECK-NEXT: - ElemType: ANYFUNC
; CHECK-NEXT: Limits:
; CHECK-NEXT: Flags: [ HAS_MAX ]
-; CHECK-NEXT: Initial: 0x00000001
-; CHECK-NEXT: Maximum: 0x00000001
+; CHECK-NEXT: Initial: 0x00000003
+; CHECK-NEXT: Maximum: 0x00000003
; CHECK-NEXT: - Type: MEMORY
; CHECK-NEXT: Memories:
; CHECK-NEXT: - Initial: 0x00000002
@@ -50,15 +50,30 @@ entry:
; CHECK-NEXT: - Name: _start
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Index: 0
-; CHECK-NEXT: - Name: bar
+; CHECK-NEXT: - Name: alias_fn
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Index: 1
-; CHECK-NEXT: - Name: foo
+; CHECK-NEXT: - Name: direct_fn
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Index: 1
-; CHECK-NEXT: - Name: call_bar
+; CHECK-NEXT: - Name: call_direct
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Index: 2
+; CHECK-NEXT: - Name: call_alias
+; CHECK-NEXT: Kind: FUNCTION
+; CHECK-NEXT: Index: 3
+; CHECK-NEXT: - Name: call_alias_ptr
+; CHECK-NEXT: Kind: FUNCTION
+; CHECK-NEXT: Index: 4
+; CHECK-NEXT: - Name: call_direct_ptr
+; CHECK-NEXT: Kind: FUNCTION
+; CHECK-NEXT: Index: 5
+; CHECK-NEXT: - Type: ELEM
+; CHECK-NEXT: Segments:
+; CHECK-NEXT: - Offset:
+; CHECK-NEXT: Opcode: I32_CONST
+; CHECK-NEXT: Value: 1
+; CHECK-NEXT: Functions: [ 1, 1 ]
; CHECK-NEXT: - Type: CODE
; CHECK-NEXT: Functions:
; CHECK-NEXT: - Locals:
@@ -67,6 +82,16 @@ entry:
; CHECK-NEXT: Body: 41000B
; CHECK-NEXT: - Locals:
; CHECK-NEXT: Body: 1081808080000B
+; CHECK-NEXT: - Locals:
+; CHECK-NEXT: Body: 1081808080000B
+; CHECK-NEXT: - Locals:
+; CHECK-NEXT: - Type: I32
+; CHECK-NEXT: Count: 2
+; CHECK-NEXT: Body: 23808080800041106B220024808080800020004181808080003602081081808080002101200041106A24808080800020010B
+; CHECK-NEXT: - Locals:
+; CHECK-NEXT: - Type: I32
+; CHECK-NEXT: Count: 2
+; CHECK-NEXT: Body: 23808080800041106B220024808080800020004182808080003602081081808080002101200041106A24808080800020010B
; CHECK-NEXT: - Type: CUSTOM
; CHECK-NEXT: Name: linking
; CHECK-NEXT: DataSize: 0
@@ -76,7 +101,13 @@ entry:
; CHECK-NEXT: - Index: 0
; CHECK-NEXT: Name: _start
; CHECK-NEXT: - Index: 1
-; CHECK-NEXT: Name: foo
+; CHECK-NEXT: Name: direct_fn
; CHECK-NEXT: - Index: 2
-; CHECK-NEXT: Name: call_bar
+; CHECK-NEXT: Name: call_direct
+; CHECK-NEXT: - Index: 3
+; CHECK-NEXT: Name: call_alias
+; CHECK-NEXT: - Index: 4
+; CHECK-NEXT: Name: call_alias_ptr
+; CHECK-NEXT: - Index: 5
+; CHECK-NEXT: Name: call_direct_ptr
; CHECK-NEXT: ...
diff --git a/test/wasm/weak-external.ll b/test/wasm/weak-external.ll
index 891f7666ec76..e5025db53693 100644
--- a/test/wasm/weak-external.ll
+++ b/test/wasm/weak-external.ll
@@ -1,4 +1,4 @@
-; RUN: llc -mtriple wasm32-unknown-unknown-wasm -filetype=obj -o %t.o %s
+; RUN: llc -mtriple=wasm32-unknown-unknown-wasm -filetype=obj -o %t.o %s
; RUN: lld -flavor wasm -strip-debug %t.o -o %t.wasm
; RUN: obj2yaml %t.wasm | FileCheck %s
diff --git a/test/wasm/weak-symbols.ll b/test/wasm/weak-symbols.ll
index c282d005623f..4e4e2edfa9b2 100644
--- a/test/wasm/weak-symbols.ll
+++ b/test/wasm/weak-symbols.ll
@@ -1,15 +1,17 @@
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/weak-symbol1.ll -o %t1.o
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %p/Inputs/weak-symbol2.ll -o %t2.o
-; RUN: llc -filetype=obj -mtriple=wasm32-unknown-uknown-wasm %s -o %t.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/weak-symbol1.ll -o %t1.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %p/Inputs/weak-symbol2.ll -o %t2.o
+; RUN: llc -filetype=obj -mtriple=wasm32-unknown-unknown-wasm %s -o %t.o
; RUN: lld -flavor wasm -o %t.wasm %t.o %t1.o %t2.o
; RUN: obj2yaml %t.wasm | FileCheck %s
declare i32 @weakFn() local_unnamed_addr
+@weakGlobal = external global i32
-define void @_start() local_unnamed_addr {
+define i32 @_start() local_unnamed_addr {
entry:
%call = call i32 @weakFn()
- ret void
+ %val = load i32, i32* @weakGlobal, align 4
+ ret i32 %val
}
; CHECK: --- !WASM
@@ -19,13 +21,10 @@ entry:
; CHECK-NEXT: - Type: TYPE
; CHECK-NEXT: Signatures:
; CHECK-NEXT: - Index: 0
-; CHECK-NEXT: ReturnType: NORESULT
-; CHECK-NEXT: ParamTypes:
-; CHECK-NEXT: - Index: 1
; CHECK-NEXT: ReturnType: I32
; CHECK-NEXT: ParamTypes:
; CHECK-NEXT: - Type: FUNCTION
-; CHECK-NEXT: FunctionTypes: [ 0, 1, 1, 1, 1 ]
+; CHECK-NEXT: FunctionTypes: [ 0, 0, 0, 0, 0 ]
; CHECK-NEXT: - Type: TABLE
; CHECK-NEXT: Tables:
; CHECK-NEXT: - ElemType: ANYFUNC
@@ -42,7 +41,7 @@ entry:
; CHECK-NEXT: Mutable: true
; CHECK-NEXT: InitExpr:
; CHECK-NEXT: Opcode: I32_CONST
-; CHECK-NEXT: Value: 66560
+; CHECK-NEXT: Value: 66576
; CHECK-NEXT: - Type: EXPORT
; CHECK-NEXT: Exports:
; CHECK-NEXT: - Name: memory
@@ -69,7 +68,7 @@ entry:
; CHECK-NEXT: - Type: CODE
; CHECK-NEXT: Functions:
; CHECK-NEXT: - Locals:
-; CHECK-NEXT: Body: 1081808080001A0B
+; CHECK-NEXT: Body: 1081808080001A4100280280888080000B
; CHECK-NEXT: - Locals:
; CHECK-NEXT: Body: 41010B
; CHECK-NEXT: - Locals:
@@ -78,9 +77,17 @@ entry:
; CHECK-NEXT: Body: 41020B
; CHECK-NEXT: - Locals:
; CHECK-NEXT: Body: 4181808080000B
+; CHECK-NEXT: - Type: DATA
+; CHECK-NEXT: Segments:
+; CHECK-NEXT: - SectionOffset: 7
+; CHECK-NEXT: MemoryIndex: 0
+; CHECK-NEXT: Offset:
+; CHECK-NEXT: Opcode: I32_CONST
+; CHECK-NEXT: Value: 1024
+; CHECK-NEXT: Content: '0100000002000000'
; CHECK-NEXT: - Type: CUSTOM
; CHECK-NEXT: Name: linking
-; CHECK-NEXT: DataSize: 0
+; CHECK-NEXT: DataSize: 8
; CHECK-NEXT: - Type: CUSTOM
; CHECK-NEXT: Name: name
; CHECK-NEXT: FunctionNames: