summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lld/test/wasm/fatal-warnings.ll5
-rw-r--r--lld/test/wasm/signature-mismatch-weak.ll3
-rw-r--r--lld/test/wasm/signature-mismatch.ll15
-rw-r--r--lld/wasm/Driver.cpp3
-rw-r--r--lld/wasm/MarkLive.cpp5
-rw-r--r--lld/wasm/SymbolTable.cpp25
-rw-r--r--lld/wasm/Symbols.h6
7 files changed, 16 insertions, 46 deletions
diff --git a/lld/test/wasm/fatal-warnings.ll b/lld/test/wasm/fatal-warnings.ll
index e47a59b250c..0007dc203f0 100644
--- a/lld/test/wasm/fatal-warnings.ll
+++ b/lld/test/wasm/fatal-warnings.ll
@@ -10,11 +10,6 @@ target triple = "wasm32-unknown-unknown"
define hidden void @_start() local_unnamed_addr #0 {
entry:
- ret void
-}
-
-define hidden void @_call_ret32() local_unnamed_addr #0 {
-entry:
%call = tail call i32 @ret32(i32 1, i64 2, i32 3) #2
ret void
}
diff --git a/lld/test/wasm/signature-mismatch-weak.ll b/lld/test/wasm/signature-mismatch-weak.ll
index 67df7af1fbb..dbf73d1aa46 100644
--- a/lld/test/wasm/signature-mismatch-weak.ll
+++ b/lld/test/wasm/signature-mismatch-weak.ll
@@ -1,7 +1,7 @@
; RUN: llc -filetype=obj %p/Inputs/weak-symbol1.ll -o %t.weak.o
; RUN: llc -filetype=obj %p/Inputs/strong-symbol.ll -o %t.strong.o
; RUN: llc -filetype=obj %s -o %t.o
-; RUN: not wasm-ld -o %t.wasm %t.o %t.strong.o %t.weak.o 2>&1 | FileCheck %s
+; RUN: wasm-ld -o %t.wasm %t.o %t.strong.o %t.weak.o 2>&1 | FileCheck %s
target triple = "wasm32-unknown-unknown"
@@ -16,4 +16,3 @@ entry:
; CHECK: warning: function signature mismatch: weakFn
; CHECK-NEXT: >>> defined as () -> I32 in {{.*}}signature-mismatch-weak.ll.tmp.o
; CHECK-NEXT: >>> defined as () -> I64 in {{.*}}signature-mismatch-weak.ll.tmp.strong.o
-; CHECK: error: function signature mismatch: weakFn
diff --git a/lld/test/wasm/signature-mismatch.ll b/lld/test/wasm/signature-mismatch.ll
index f34eef7fbb3..d750d4f6b35 100644
--- a/lld/test/wasm/signature-mismatch.ll
+++ b/lld/test/wasm/signature-mismatch.ll
@@ -1,11 +1,10 @@
; RUN: llc -filetype=obj %p/Inputs/ret32.ll -o %t.ret32.o
; RUN: llc -filetype=obj %s -o %t.main.o
-; RUN: not wasm-ld -o %t.wasm %t.main.o %t.ret32.o 2>&1 | FileCheck %s
-; RUN: not wasm-ld --no-gc-sections -o %t.wasm %t.main.o %t.ret32.o 2>&1 | FileCheck %s -check-prefix=NO-GC
+; RUN: not wasm-ld --fatal-warnings -o %t.wasm %t.main.o %t.ret32.o 2>&1 | FileCheck %s
; Run the test again by with the object files in the other order to verify
; the check works when the undefined symbol is resolved by an existing defined
; one.
-; RUN: not wasm-ld -o %t.wasm %t.ret32.o %t.main.o 2>&1 | FileCheck %s -check-prefix=REVERSE
+; RUN: not wasm-ld --fatal-warnings -o %t.wasm %t.ret32.o %t.main.o 2>&1 | FileCheck %s -check-prefix=REVERSE
target triple = "wasm32-unknown-unknown"
@@ -18,16 +17,10 @@ entry:
declare i32 @ret32(i32, i64, i32) local_unnamed_addr #1
-; CHECK: warning: function signature mismatch: ret32
+; CHECK: error: function signature mismatch: ret32
; CHECK-NEXT: >>> defined as (I32, I64, I32) -> I32 in {{.*}}.main.o
; CHECK-NEXT: >>> defined as (F32) -> I32 in {{.*}}.ret32.o
-; CHECK: error: function signature mismatch: ret32
-
-; NO-GC: error: function signature mismatch: ret32
-; NO-GC-NEXT: >>> defined as (I32, I64, I32) -> I32 in {{.*}}.main.o
-; NO-GC-NEXT: >>> defined as (F32) -> I32 in {{.*}}.ret32.o
-; REVERSE: warning: function signature mismatch: ret32
+; REVERSE: error: function signature mismatch: ret32
; REVERSE-NEXT: >>> defined as (F32) -> I32 in {{.*}}.ret32.o
; REVERSE-NEXT: >>> defined as (I32, I64, I32) -> I32 in {{.*}}.main.o
-; REVERSE: error: function signature mismatch: ret32
diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp
index c24496c6ecc..70a36046ad9 100644
--- a/lld/wasm/Driver.cpp
+++ b/lld/wasm/Driver.cpp
@@ -483,8 +483,7 @@ void LinkerDriver::link(ArrayRef<const char *> ArgsArr) {
return;
// Do size optimizations: garbage collection
- if (Config->GcSections)
- markLive();
+ markLive();
// Write the result to the file.
writeResult();
diff --git a/lld/wasm/MarkLive.cpp b/lld/wasm/MarkLive.cpp
index c9dbbf59c95..018b3255b55 100644
--- a/lld/wasm/MarkLive.cpp
+++ b/lld/wasm/MarkLive.cpp
@@ -34,6 +34,9 @@ using namespace lld;
using namespace lld::wasm;
void lld::wasm::markLive() {
+ if (!Config->GcSections)
+ return;
+
LLVM_DEBUG(dbgs() << "markLive\n");
SmallVector<InputChunk *, 256> Q;
@@ -42,8 +45,6 @@ void lld::wasm::markLive() {
return;
LLVM_DEBUG(dbgs() << "markLive: " << Sym->getName() << "\n");
Sym->markLive();
- if (Sym->SignatureMismatch)
- error("function signature mismatch: " + Sym->getName());
if (InputChunk *Chunk = Sym->getChunk())
Q.push_back(Chunk);
};
diff --git a/lld/wasm/SymbolTable.cpp b/lld/wasm/SymbolTable.cpp
index 77b2f18c286..1180cfc6759 100644
--- a/lld/wasm/SymbolTable.cpp
+++ b/lld/wasm/SymbolTable.cpp
@@ -106,7 +106,7 @@ static void reportTypeError(const Symbol *Existing, const InputFile *File,
" in " + toString(File));
}
-static void checkFunctionType(Symbol *Existing, const InputFile *File,
+static void checkFunctionType(const Symbol *Existing, const InputFile *File,
const WasmSignature *NewSig) {
auto ExistingFunction = dyn_cast<FunctionSymbol>(Existing);
if (!ExistingFunction) {
@@ -114,27 +114,12 @@ static void checkFunctionType(Symbol *Existing, const InputFile *File,
return;
}
-
const WasmSignature *OldSig = ExistingFunction->getFunctionType();
if (OldSig && NewSig && *NewSig != *OldSig) {
- // Don't generate more than one warning per symbol.
- if (Existing->SignatureMismatch)
- return;
- Existing->SignatureMismatch = true;
-
- std::string msg = ("function signature mismatch: " + Existing->getName() +
- "\n>>> defined as " + toString(*OldSig) + " in " +
- toString(Existing->getFile()) + "\n>>> defined as " +
- toString(*NewSig) + " in " + toString(File))
- .str();
- // A function signature mismatch is only really problem if the mismatched
- // symbol is included in the final output, and gc-sections can remove the
- // offending uses. Therefore we delay reporting this as an error when
- // section GC is enabled.
- if (Config->GcSections)
- warn(msg);
- else
- error(msg);
+ warn("function signature mismatch: " + Existing->getName() +
+ "\n>>> defined as " + toString(*OldSig) + " in " +
+ toString(Existing->getFile()) + "\n>>> defined as " +
+ toString(*NewSig) + " in " + toString(File));
}
}
diff --git a/lld/wasm/Symbols.h b/lld/wasm/Symbols.h
index ab974770d36..a1a41bea9dc 100644
--- a/lld/wasm/Symbols.h
+++ b/lld/wasm/Symbols.h
@@ -93,12 +93,11 @@ public:
// True if this symbol was referenced by a regular (non-bitcode) object.
unsigned IsUsedInRegularObj : 1;
- unsigned SignatureMismatch : 1;
protected:
Symbol(StringRef Name, Kind K, uint32_t Flags, InputFile *F)
- : IsUsedInRegularObj(false), SignatureMismatch(false), Name(Name),
- SymbolKind(K), Flags(Flags), File(F), Referenced(!Config->GcSections) {}
+ : IsUsedInRegularObj(false), Name(Name), SymbolKind(K), Flags(Flags),
+ File(F), Referenced(!Config->GcSections) {}
StringRef Name;
Kind SymbolKind;
@@ -341,7 +340,6 @@ T *replaceSymbol(Symbol *S, ArgT &&... Arg) {
T *S2 = new (S) T(std::forward<ArgT>(Arg)...);
S2->IsUsedInRegularObj = SymCopy.IsUsedInRegularObj;
- S2->SignatureMismatch = SymCopy.SignatureMismatch;
return S2;
}