diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-12-24 01:00:50 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-12-24 01:00:50 +0000 |
commit | 0d9ba4fe26725cacc7253fc3c72c4574f26bc099 (patch) | |
tree | 90c426d54188ca226b29aaf8a308bba364a73d1a /test | |
parent | eb1ff93d02b5f17b6b409e83c6d9be585f4a04b3 (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')
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: |