Imported Upstream version 6.10.0.49

Former-commit-id: 1d6753294b2993e1fbf92de9366bb9544db4189b
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2020-01-16 16:38:04 +00:00
parent d94e79959b
commit 468663ddbb
48518 changed files with 2789335 additions and 61176 deletions

View File

@@ -0,0 +1,7 @@
declare i32 @bar() local_unnamed_addr #1
define i32 @foo() local_unnamed_addr #0 {
entry:
%call = tail call i32 @bar() #2
ret i32 %call
}

View File

@@ -0,0 +1,7 @@
declare i32 @foo() local_unnamed_addr #1
define i32 @bar() local_unnamed_addr #0 {
entry:
%call = tail call i32 @foo() #2
ret i32 %call
}

View File

@@ -0,0 +1,17 @@
@indirect_bar = internal local_unnamed_addr global i32 ()* @bar, align 4
@indirect_foo = internal local_unnamed_addr global i32 ()* @foo, align 4
declare i32 @foo() local_unnamed_addr
define i32 @bar() {
entry:
ret i32 1
}
define void @call_bar_indirect() local_unnamed_addr #1 {
entry:
%0 = load i32 ()*, i32 ()** @indirect_bar, align 4
%1 = load i32 ()*, i32 ()** @indirect_foo, align 4
%call = tail call i32 %0() #2
ret void
}

View File

@@ -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 }]

View File

@@ -0,0 +1,15 @@
; Wasm module generated from the following C code:
; void puts(const char*);
; void hello() { puts("hello\n"); }
@hello_str = unnamed_addr constant [7 x i8] c"hello\0A\00", align 1
; Function Attrs: nounwind
define hidden void @hello() local_unnamed_addr #0 {
entry:
tail call void @puts(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @hello_str, i32 0, i32 0))
ret void
}
; Function Attrs: nounwind
declare void @puts(i8* nocapture readonly) local_unnamed_addr #1

View File

@@ -0,0 +1,11 @@
; Function Attrs: norecurse nounwind readnone
define hidden i32 @archiveHidden() #0 {
entry:
ret i32 0
}
; Function Attrs: norecurse nounwind readnone
define i32 @archiveDefault() #1 {
entry:
ret i32 0
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,6 @@
; Function Attrs: norecurse nounwind readnone
define i32 @ret32(float %arg) #0 {
entry:
ret i32 0
; ptrtoint (i32 (float)* @ret32 to i32)
}

View File

@@ -0,0 +1,4 @@
define i64 @ret64(double %arg) local_unnamed_addr #0 {
entry:
ret i64 1
}

View File

@@ -0,0 +1,37 @@
; Function Attrs: norecurse nounwind readnone
define i32 @direct_fn() #0 {
entry:
ret i32 0
}
@alias_fn = weak alias i32 (), i32 ()* @direct_fn
define i32 @call_direct() #0 {
entry:
%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
}

View File

@@ -0,0 +1,11 @@
define weak i32 @weakFn() #0 {
entry:
ret i32 1
}
define i32 @exportWeak1() {
entry:
ret i32 ptrtoint (i32 ()* @weakFn to i32)
}
@weakGlobal = weak global i32 1

View File

@@ -0,0 +1,11 @@
define weak i32 @weakFn() #0 {
entry:
ret i32 2
}
define i32 @exportWeak2() {
entry:
ret i32 ptrtoint (i32 ()* @weakFn to i32)
}
@weakGlobal = weak global i32 2

View File

@@ -0,0 +1,31 @@
; 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
declare i32 @foo() local_unnamed_addr #1
define i32 @_start() local_unnamed_addr #0 {
entry:
%call = tail call i32 @foo() #2
ret i32 %call
}
; Verify that multually dependant object files in an archive is handled
; correctly.
; CHECK: 00000002 T _start
; CHECK-NEXT: 00000002 T _start
; CHECK-NEXT: 00000000 T bar
; CHECK-NEXT: 00000000 T bar
; CHECK-NEXT: 00000001 T foo
; CHECK-NEXT: 00000001 T foo
; Verify that symbols from unused objects don't appear in the symbol table
; CHECK-NOT: hello
; Specifying the same archive twice is allowed.
; RUN: lld -flavor wasm %t.a %t.a %t.o -o %t.wasm

View File

@@ -0,0 +1,132 @@
; 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
; bitcode generated from the following C code:
; int foo(void) { return 1; }
; int (*indirect_func)(void) = &foo;
; void _start(void) { indirect_func(); }
@indirect_func = local_unnamed_addr global i32 ()* @foo, align 4
; Function Attrs: norecurse nounwind readnone
define i32 @foo() #0 {
entry:
ret i32 2
}
; Function Attrs: nounwind
define i32 @_start() local_unnamed_addr #1 {
entry:
%0 = load i32 ()*, i32 ()** @indirect_func, align 4
%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
; CHECK-NEXT: Sections:
; CHECK-NEXT: - Type: TYPE
; CHECK-NEXT: Signatures:
; CHECK-NEXT: - Index: 0
; CHECK-NEXT: ReturnType: I32
; CHECK-NEXT: ParamTypes:
; 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, 2 ]
; CHECK-NEXT: - Type: TABLE
; CHECK-NEXT: Tables:
; CHECK-NEXT: - ElemType: ANYFUNC
; CHECK-NEXT: Limits:
; CHECK-NEXT: Flags: [ HAS_MAX ]
; CHECK-NEXT: Initial: 0x00000003
; CHECK-NEXT: Maximum: 0x00000003
; CHECK-NEXT: - Type: MEMORY
; CHECK-NEXT: Memories:
; CHECK-NEXT: - Initial: 0x00000002
; CHECK-NEXT: - Type: GLOBAL
; CHECK-NEXT: Globals:
; CHECK-NEXT: - Type: I32
; CHECK-NEXT: Mutable: true
; CHECK-NEXT: InitExpr:
; CHECK-NEXT: Opcode: I32_CONST
; CHECK-NEXT: Value: 66576
; CHECK-NEXT: - Type: EXPORT
; CHECK-NEXT: Exports:
; CHECK-NEXT: - Name: memory
; CHECK-NEXT: Kind: MEMORY
; CHECK-NEXT: Index: 0
; CHECK-NEXT: - Name: _start
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Index: 3
; CHECK-NEXT: - Name: foo
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Index: 2
; CHECK-NEXT: - Name: bar
; CHECK-NEXT: Kind: FUNCTION
; CHECK-NEXT: Index: 0
; 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:
; CHECK-NEXT: Opcode: I32_CONST
; CHECK-NEXT: Value: 1
; CHECK-NEXT: Functions: [ 0, 2 ]
; CHECK-NEXT: - Type: CODE
; CHECK-NEXT: Functions:
; CHECK-NEXT: - Locals:
; CHECK-NEXT: Body: 41010B
; CHECK-NEXT: - Locals:
; CHECK-NEXT: Body: 410028028088808000118080808000001A0B
; CHECK-NEXT: - Locals:
; 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
; CHECK-NEXT: MemoryIndex: 0
; CHECK-NEXT: Offset:
; CHECK-NEXT: Opcode: I32_CONST
; CHECK-NEXT: Value: 1024
; CHECK-NEXT: Content: '010000000200000002000000'
; CHECK-NEXT: - Type: CUSTOM
; CHECK-NEXT: Name: linking
; CHECK-NEXT: DataSize: 12
; CHECK-NEXT: - Type: CUSTOM
; CHECK-NEXT: Name: name
; CHECK-NEXT: FunctionNames:
; CHECK-NEXT: - Index: 0
; CHECK-NEXT: Name: bar
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: Name: call_bar_indirect
; CHECK-NEXT: - Index: 2
; CHECK-NEXT: Name: foo
; CHECK-NEXT: - Index: 3
; CHECK-NEXT: Name: _start

View File

@@ -0,0 +1,6 @@
# 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
# CHECK-NEXT: >>> defined in {{.*}}conflict.test.tmp.ret32.o
# CHECK-NEXT: >>> defined in {{.*}}conflict.test.tmp.ret32.o

View File

@@ -0,0 +1,61 @@
; 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
@foo = hidden global i32 1, align 4
@aligned_bar = hidden global i32 3, align 16
@hello_str = external global i8*
@external_ref = global i8** @hello_str, align 8
; CHECK: - Type: GLOBAL
; CHECK-NEXT: Globals:
; CHECK-NEXT: - Type: I32
; CHECK-NEXT: Mutable: true
; CHECK-NEXT: InitExpr:
; CHECK-NEXT: Opcode: I32_CONST
; CHECK-NEXT: Value: 66608
; CHECK-NEXT: - Type: I32
; CHECK-NEXT: Mutable: false
; CHECK-NEXT: InitExpr:
; CHECK-NEXT: Opcode: I32_CONST
; CHECK-NEXT: Value: 1024
; CHECK-NEXT: - Type: I32
; CHECK-NEXT: Mutable: false
; CHECK-NEXT: InitExpr:
; CHECK-NEXT: Opcode: I32_CONST
; CHECK-NEXT: Value: 1040
; CHECK-NEXT: - Type: I32
; CHECK-NEXT: Mutable: false
; CHECK-NEXT: InitExpr:
; CHECK-NEXT: Opcode: I32_CONST
; CHECK-NEXT: Value: 1048
; CHECK-NEXT: - Type: I32
; CHECK-NEXT: Mutable: false
; CHECK-NEXT: InitExpr:
; CHECK-NEXT: Opcode: I32_CONST
; CHECK-NEXT: Value: 1052
; CHECK: - Type: DATA
; CHECK-NEXT: Relocations:
; CHECK-NEXT: - Type: R_WEBASSEMBLY_MEMORY_ADDR_I32
; CHECK-NEXT: Index: 4
; CHECK-NEXT: Offset: 0x0000001F
; 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: 0100000000000000000000000000000003000000000000001C040000
; CHECK-NEXT: - SectionOffset: 41
; CHECK-NEXT: MemoryIndex: 0
; CHECK-NEXT: Offset:
; CHECK-NEXT: Opcode: I32_CONST
; CHECK-NEXT: Value: 1052
; CHECK-NEXT: Content: 68656C6C6F0A00
; CHECK: - Type: CUSTOM
; CHECK-NEXT: Name: linking
; CHECK-NEXT: DataSize: 35

View File

@@ -0,0 +1,19 @@
; 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
; RUN: obj2yaml %t.wasm | FileCheck %s
define void @entry() local_unnamed_addr #0 {
entry:
ret void
}
; CHECK: - Type: EXPORT
; CHECK: Exports:
; CHECK: - Name: memory
; CHECK: Kind: MEMORY
; CHECK: Index: 0
; CHECK: - Name: entry
; CHECK: Kind: FUNCTION
; CHECK: Index: 0

View File

@@ -0,0 +1,42 @@
; 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
; Function Attrs: nounwind
define hidden void @_start() local_unnamed_addr #0 {
entry:
%call = tail call i32 @ret32(float 0.000000e+00) #2
ret void
}
declare i32 @ret32(float) local_unnamed_addr #1
; CHECK: - Type: TYPE
; CHECK: 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: - F32
; CHECK: - Type: FUNCTION
; CHECK-NEXT: FunctionTypes: [ 0, 1 ]
; CHECK: - Type: CODE
; CHECK-NEXT: Functions:
; CHECK-NEXT: - Locals:
; CHECK-NEXT: Body: 43000000001081808080001A0B
; CHECK-NEXT: - Locals:
; CHECK-NEXT: Body: 41000B
; CHECK-NEXT: - Type: CUSTOM
; CHECK-NEXT: Name: linking
; CHECK-NEXT: DataSize: 0
; CHECK-NEXT: - Type: CUSTOM
; CHECK-NEXT: Name: name
; CHECK-NEXT: FunctionNames:
; CHECK-NEXT: - Index: 0
; CHECK-NEXT: Name: _start
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: Name: ret32
; CHECK-NEXT: ...

View File

@@ -0,0 +1,37 @@
; 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
; Function Attrs: nounwind
define hidden void @_start() local_unnamed_addr #0 {
entry:
%call = tail call i32 @ret32(float 0.000000e+00) #2
ret void
}
declare i32 @ret32(float) local_unnamed_addr #1
; CHECK: Sections:
; CHECK: - Type: TYPE
; CHECK-NEXT: Signatures:
; CHECK-NEXT: - Index: 0
; CHECK-NEXT: ReturnType: I32
; CHECK-NEXT: ParamTypes:
; CHECK-NEXT: - F32
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: ReturnType: NORESULT
; CHECK-NEXT: ParamTypes:
; CHECK-NEXT: - Type: FUNCTION
; CHECK-NEXT: FunctionTypes: [ 0, 1 ]
; CHECK: - Type: CODE
; CHECK-NEXT: Functions:
; CHECK: - Locals:
; CHECK: - Locals:
; CHECK: Name: name
; CHECK-NEXT: FunctionNames:
; CHECK-NEXT: - Index: 0
; CHECK-NEXT: Name: ret32
; CHECK-NEXT: - Index: 1
; CHECK-NEXT: Name: _start
; CHECK-NEXT: ...

View File

@@ -0,0 +1,18 @@
# 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
CHECK: Sections:
CHECK: - Type: TYPE
CHECK: Signatures:
CHECK: - Index: 0
CHECK: ReturnType: I32
CHECK: ParamTypes:
CHECK: - F32
CHECK: - Index: 1
CHECK: ReturnType: I64
CHECK: ParamTypes:
CHECK: - F64
CHECK: - Type: FUNCTION
CHECK: FunctionTypes: [ 0, 1 ]

Some files were not shown because too many files have changed in this diff Show More