--- /dev/null
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t.o %s
+# RUN: llvm-mc -filetype=obj -triple=wasm32-unknown-unknown -o %t2.o %S/Inputs/sig_mismatch.s
+# RUN: wasm-ld --relocatable %t.o %t2.o -o %t.wasm
+# RUN: obj2yaml %t.wasm | FileCheck %s
+
+# Regression test for handling of signature mismatches (variant function
+# symbols) and relocatable output. This issue only occurred when the undefined
+# function was seen first and the defined function was referenced within the
+# the defining file (see %S/Inputs/sig_mismatch.s).
+
+.globl _start
+_start:
+ .functype _start () -> ()
+ i32.const 1
+ i64.const 2
+ i32.const 3
+ call foo
+ end_function
+
+.functype foo (i32, i64, i32) -> (i32)
+
+# CHECK: - Type: CUSTOM
+# CHECK-NEXT: Name: linking
+# CHECK-NEXT: Version: 2
+# CHECK-NEXT: SymbolTable:
+# CHECK-NEXT: - Index: 0
+# CHECK-NEXT: Kind: FUNCTION
+# CHECK-NEXT: Name: _start
+# CHECK-NEXT: Flags: [ ]
+# CHECK-NEXT: Function: 1
+# CHECK-NEXT: - Index: 1
+# CHECK-NEXT: Kind: FUNCTION
+# CHECK-NEXT: Name: foo
+# CHECK-NEXT: Flags: [ ]
+# CHECK-NEXT: Function: 2
+# CHECK-NEXT: - Index: 2
+# CHECK-NEXT: Kind: FUNCTION
+# CHECK-NEXT: Name: call_foo
+# CHECK-NEXT: Flags: [ ]
+# CHECK-NEXT: Function: 3
+# CHECK-NEXT: - Index: 3
+# CHECK-NEXT: Kind: FUNCTION
+# CHECK-NEXT: Name: 'signature_mismatch:foo'
+# CHECK-NEXT: Flags: [ BINDING_LOCAL ]
+# CHECK-NEXT: Function: 0
+# CHECK-NEXT: - Type: CUSTOM
+# CHECK-NEXT: Name: name
+# CHECK-NEXT: FunctionNames:
+# CHECK-NEXT: - Index: 0
+# CHECK-NEXT: Name: 'signature_mismatch:foo'
+# CHECK-NEXT: - Index: 1
+# CHECK-NEXT: Name: _start
+# CHECK-NEXT: - Index: 2
+# CHECK-NEXT: Name: foo
+# CHECK-NEXT: - Index: 3
+# CHECK-NEXT: Name: call_foo
+# CHECK-NEXT:...
sym->isUsedInRegularObj = false;
sym->canInline = true;
sym->traced = trace;
+ sym->forceExport = false;
symVector.emplace_back(sym);
return {sym, true};
}
// Create a new variant;
LLVM_DEBUG(dbgs() << "added new variant\n");
variant = reinterpret_cast<Symbol *>(make<SymbolUnion>());
+ variant->isUsedInRegularObj =
+ !file || file->kind() == InputFile::ObjectKind;
+ variant->canInline = true;
+ variant->traced = false;
+ variant->forceExport = false;
variants.push_back(variant);
} else {
LLVM_DEBUG(dbgs() << "variant already exists: " << toString(*variant) << "\n");