[lld] r332308 - [WebAssembly] Allow signautre of entry function to be flexible
Sam Clegg via llvm-commits
llvm-commits at lists.llvm.org
Mon May 14 16:01:16 PDT 2018
Author: sbc
Date: Mon May 14 16:01:16 2018
New Revision: 332308
URL: http://llvm.org/viewvc/llvm-project?rev=332308&view=rev
Log:
[WebAssembly] Allow signautre of entry function to be flexible
Since we a no longer using this function for the wasm start
section we don't actually care what its signature is.
Differential Revision: https://reviews.llvm.org/D46594
Added:
lld/trunk/test/wasm/entry-signature.ll
Modified:
lld/trunk/test/wasm/Inputs/comdat2.ll
lld/trunk/test/wasm/data-layout.ll
lld/trunk/test/wasm/data-segment-merging.ll
lld/trunk/test/wasm/entry.ll
lld/trunk/test/wasm/fatal-warnings.ll
lld/trunk/test/wasm/load-undefined.test
lld/trunk/test/wasm/undefined-entry.test
lld/trunk/wasm/Driver.cpp
lld/trunk/wasm/SymbolTable.cpp
Modified: lld/trunk/test/wasm/Inputs/comdat2.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/Inputs/comdat2.ll?rev=332308&r1=332307&r2=332308&view=diff
==============================================================================
--- lld/trunk/test/wasm/Inputs/comdat2.ll (original)
+++ lld/trunk/test/wasm/Inputs/comdat2.ll Mon May 14 16:01:16 2018
@@ -9,5 +9,5 @@ entry:
define i32 @callInline2() {
entry:
- ret i32 ptrtoint (i32 ()* @inlineFn to i32)
+ ret i32 ptrtoint (i32 ()* @inlineFn to i32)
}
Modified: lld/trunk/test/wasm/data-layout.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/data-layout.ll?rev=332308&r1=332307&r2=332308&view=diff
==============================================================================
--- lld/trunk/test/wasm/data-layout.ll (original)
+++ lld/trunk/test/wasm/data-layout.ll Mon May 14 16:01:16 2018
@@ -13,7 +13,7 @@ target triple = "wasm32-unknown-unknown"
@local_struct = hidden global %struct.s zeroinitializer, align 4
@local_struct_internal_ptr = hidden local_unnamed_addr global i32* getelementptr inbounds (%struct.s, %struct.s* @local_struct, i32 0, i32 1), align 4
-; RUN: wasm-ld -no-gc-sections --allow-undefined -o %t.wasm %t.o %t.hello.o
+; RUN: wasm-ld -no-gc-sections --allow-undefined --no-entry -o %t.wasm %t.o %t.hello.o
; RUN: obj2yaml %t.wasm | FileCheck %s
; CHECK: - Type: MEMORY
@@ -57,7 +57,7 @@ target triple = "wasm32-unknown-unknown"
; CHECK-NEXT: - Type: CUSTOM
-; RUN: wasm-ld -no-gc-sections --allow-undefined \
+; RUN: wasm-ld -no-gc-sections --allow-undefined --no-entry \
; RUN: --initial-memory=131072 --max-memory=131072 -o %t_max.wasm %t.o \
; RUN: %t.hello.o
; RUN: obj2yaml %t_max.wasm | FileCheck %s -check-prefix=CHECK-MAX
Modified: lld/trunk/test/wasm/data-segment-merging.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/data-segment-merging.ll?rev=332308&r1=332307&r2=332308&view=diff
==============================================================================
--- lld/trunk/test/wasm/data-segment-merging.ll (original)
+++ lld/trunk/test/wasm/data-segment-merging.ll Mon May 14 16:01:16 2018
@@ -7,7 +7,7 @@ target triple = "wasm32-unknown-unknown"
; RUN: llc -filetype=obj %s -o %t.data-segment-merging.o
-; RUN: wasm-ld -no-gc-sections --allow-undefined -o %t.merged.wasm %t.data-segment-merging.o
+; RUN: wasm-ld -no-gc-sections --no-entry -o %t.merged.wasm %t.data-segment-merging.o
; RUN: obj2yaml %t.merged.wasm | FileCheck %s --check-prefix=MERGE
; MERGE: - Type: DATA
; MERGE-NEXT: Segments:
@@ -18,7 +18,7 @@ target triple = "wasm32-unknown-unknown"
; MERGE-NEXT: Value: 1024
; MERGE-NEXT: Content: 68656C6C6F00676F6F6462796500776861746576657200002A000000
-; RUN: wasm-ld -no-gc-sections --allow-undefined --no-merge-data-segments -o %t.separate.wasm %t.data-segment-merging.o
+; RUN: wasm-ld -no-gc-sections --no-entry --no-merge-data-segments -o %t.separate.wasm %t.data-segment-merging.o
; RUN: obj2yaml %t.separate.wasm | FileCheck %s --check-prefix=SEPARATE
; SEPARATE: - Type: DATA
; SEPARATE-NEXT: Segments:
Added: lld/trunk/test/wasm/entry-signature.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/entry-signature.ll?rev=332308&view=auto
==============================================================================
--- lld/trunk/test/wasm/entry-signature.ll (added)
+++ lld/trunk/test/wasm/entry-signature.ll Mon May 14 16:01:16 2018
@@ -0,0 +1,10 @@
+; Verify that the entry point signauture can be flexible.
+; RUN: llc -filetype=obj %s -o %t.o
+; RUN: wasm-ld -o %t1.wasm %t.o
+
+target triple = "wasm32-unknown-unknown-wasm"
+
+define hidden i32 @_start(i32, i64) local_unnamed_addr #0 {
+entry:
+ ret i32 0
+}
Modified: lld/trunk/test/wasm/entry.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/entry.ll?rev=332308&r1=332307&r2=332308&view=diff
==============================================================================
--- lld/trunk/test/wasm/entry.ll (original)
+++ lld/trunk/test/wasm/entry.ll Mon May 14 16:01:16 2018
@@ -28,8 +28,8 @@ entry:
; CHECK-NEXT: Index: 1
; CHECK-NEXT: - Type:
-; The __wasm_call_ctors is somewhat special. Make sure we can use it
-; as the entry point if we choose
+; The __wasm_call_ctors is somewhat special since its created by the linker.
+; Make sure we can use it as the entry point if we choose
; RUN: wasm-ld --entry=__wasm_call_ctors -o %t3.wasm %t.o
; RUN: obj2yaml %t3.wasm | FileCheck %s -check-prefix=CHECK-CTOR
Modified: lld/trunk/test/wasm/fatal-warnings.ll
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/fatal-warnings.ll?rev=332308&r1=332307&r2=332308&view=diff
==============================================================================
--- lld/trunk/test/wasm/fatal-warnings.ll (original)
+++ lld/trunk/test/wasm/fatal-warnings.ll Mon May 14 16:01:16 2018
@@ -1,14 +1,17 @@
; RUN: llc -filetype=obj %s -o %t.main.o
-; RUN: lld -flavor wasm -o %t.wasm %t.main.o 2>&1 | FileCheck %s -check-prefix=CHECK-WARN
-; RUN: not lld -flavor wasm --fatal-warnings -o %t.wasm %t.main.o 2>&1 | FileCheck %s -check-prefix=CHECK-FATAL
+; RUN: llc -filetype=obj %p/Inputs/ret32.ll -o %t.ret32.o
+; RUN: lld -flavor wasm -o %t.wasm %t.main.o %t.ret32.o 2>&1 | FileCheck %s -check-prefix=CHECK-WARN
+; RUN: not lld -flavor wasm --fatal-warnings -o %t.wasm %t.main.o %t.ret32.o 2>&1 | FileCheck %s -check-prefix=CHECK-FATAL
-; CHECK-WARN: warning: Function type mismatch: _start
-; CHECK-FATAL: error: Function type mismatch: _start
+; CHECK-WARN: warning: Function type mismatch: ret32
+; CHECK-FATAL: error: Function type mismatch: ret32
target triple = "wasm32-unknown-unknown"
-define hidden i32 @_start(i32 %arg) local_unnamed_addr {
+define hidden void @_start() local_unnamed_addr #0 {
entry:
- ret i32 %arg
+ %call = tail call i32 @ret32(i32 1, i64 2, i32 3) #2
+ ret void
}
+declare i32 @ret32(i32, i64, i32) local_unnamed_addr #1
Modified: lld/trunk/test/wasm/load-undefined.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/load-undefined.test?rev=332308&r1=332307&r2=332308&view=diff
==============================================================================
--- lld/trunk/test/wasm/load-undefined.test (original)
+++ lld/trunk/test/wasm/load-undefined.test Mon May 14 16:01:16 2018
@@ -36,4 +36,4 @@
; CHECK-UNDEFINED1: error: undefined symbol: symboldoesnotexist
; RUN: not wasm-ld %t.start.o -o %t.wasm --undefined symboldoesnotexist --allow-undefined 2>&1 | FileCheck -check-prefix=CHECK-UNDEFINED2 %s
-; CHECK-UNDEFINED2: function forced with --undefined not found: symboldoesnotexist
+; CHECK-UNDEFINED2: symbol forced with --undefined not found: symboldoesnotexist
Modified: lld/trunk/test/wasm/undefined-entry.test
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/wasm/undefined-entry.test?rev=332308&r1=332307&r2=332308&view=diff
==============================================================================
--- lld/trunk/test/wasm/undefined-entry.test (original)
+++ lld/trunk/test/wasm/undefined-entry.test Mon May 14 16:01:16 2018
@@ -1,10 +1,11 @@
RUN: llc -filetype=obj %p/Inputs/ret32.ll -o %t.ret32.o
RUN: not wasm-ld -o %t.wasm %t.ret32.o 2>&1 | FileCheck %s
-
-CHECK: error: undefined symbol: _start
-
RUN: not wasm-ld -entry=foo -o %t.wasm %t.ret32.o 2>&1 | FileCheck %s -check-prefix=CHECK-CUSTOM
+RUN: not wasm-ld --allow-undefined -o %t.wasm %t.ret32.o 2>&1 | FileCheck %s -check-prefix=CHECK-ALLOW
+CHECK: error: undefined symbol: _start
CHECK-CUSTOM: error: undefined symbol: foo
+CHECK-ALLOW: error: entry symbol not defined (pass --no-entry to supress):
+_start
-RUN: wasm-ld -entry=foo --allow-undefined -o %t.wasm %t.ret32.o
+RUN: wasm-ld --no-entry -o %t.wasm %t.ret32.o
Modified: lld/trunk/wasm/Driver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/Driver.cpp?rev=332308&r1=332307&r2=332308&view=diff
==============================================================================
--- lld/trunk/wasm/Driver.cpp (original)
+++ lld/trunk/wasm/Driver.cpp Mon May 14 16:01:16 2018
@@ -360,9 +360,11 @@ void LinkerDriver::link(ArrayRef<const c
"__dso_handle", WASM_SYMBOL_VISIBILITY_HIDDEN);
WasmSym::DataEnd = Symtab->addSyntheticDataSymbol("__data_end", 0);
+ // For now, since we don't actually use the start function as the
+ // wasm start symbol, we don't need to care about it signature.
if (!Config->Entry.empty())
- EntrySym = Symtab->addUndefinedFunction(Config->Entry, 0, nullptr,
- &NullSignature);
+ EntrySym =
+ Symtab->addUndefinedFunction(Config->Entry, 0, nullptr, nullptr);
// Handle the `--undefined <sym>` options.
for (auto *Arg : Args.filtered(OPT_undefined))
@@ -386,15 +388,19 @@ void LinkerDriver::link(ArrayRef<const c
if (!Config->Relocatable && !Config->AllowUndefined) {
Symtab->reportRemainingUndefines();
} else {
- // When we allow undefined symbols we cannot include those defined in
- // -u/--undefined since these undefined symbols have only names and no
- // function signature, which means they cannot be written to the final
- // output.
+ // Even when using --allow-undefined we still want to report the absence of
+ // our initial set of undefined symbols (i.e. the entry point and symbols
+ // specified via --undefined).
+ // Part of the reason for this is that these function don't have signatures
+ // so which means they cannot be written as wasm function imports.
for (auto *Arg : Args.filtered(OPT_undefined)) {
Symbol *Sym = Symtab->find(Arg->getValue());
if (!Sym->isDefined())
- error("function forced with --undefined not found: " + Sym->getName());
+ error("symbol forced with --undefined not found: " + Sym->getName());
}
+ if (EntrySym && !EntrySym->isDefined())
+ error("entry symbol not defined (pass --no-entry to supress): " +
+ EntrySym->getName());
}
if (errorCount())
return;
Modified: lld/trunk/wasm/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/wasm/SymbolTable.cpp?rev=332308&r1=332307&r2=332308&view=diff
==============================================================================
--- lld/trunk/wasm/SymbolTable.cpp (original)
+++ lld/trunk/wasm/SymbolTable.cpp Mon May 14 16:01:16 2018
@@ -78,14 +78,14 @@ static void reportTypeError(const Symbol
static void checkFunctionType(const Symbol *Existing, const InputFile *File,
const WasmSignature *NewSig) {
- if (!isa<FunctionSymbol>(Existing)) {
+ auto ExistingFunction = dyn_cast<FunctionSymbol>(Existing);
+ if (!ExistingFunction) {
reportTypeError(Existing, File, WASM_SYMBOL_TYPE_FUNCTION);
return;
}
- const WasmSignature *OldSig =
- cast<FunctionSymbol>(Existing)->getFunctionType();
- if (OldSig && *NewSig != *OldSig) {
+ const WasmSignature *OldSig = ExistingFunction->getFunctionType();
+ if (OldSig && NewSig && *NewSig != *OldSig) {
warn("Function type mismatch: " + Existing->getName() +
"\n>>> defined as " + toString(*OldSig) + " in " +
toString(Existing->getFile()) + "\n>>> defined as " +
More information about the llvm-commits
mailing list