summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/MC/WasmObjectWriter.cpp19
-rw-r--r--llvm/lib/Target/WebAssembly/known_gcc_test_failures.txt6
-rw-r--r--llvm/test/MC/WebAssembly/blockaddress.ll15
3 files changed, 34 insertions, 6 deletions
diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp
index 1ef6567555d..c47c014467a 100644
--- a/llvm/lib/MC/WasmObjectWriter.cpp
+++ b/llvm/lib/MC/WasmObjectWriter.cpp
@@ -355,6 +355,10 @@ void WasmObjectWriter::recordRelocation(MCAssembler &Asm,
if (FixupSection.getSectionName().startswith(".init_array"))
return;
+ // TODO(sbc): Add support for debug sections.
+ if (FixupSection.getKind().isMetadata())
+ return;
+
if (const MCSymbolRefExpr *RefB = Target.getSymB()) {
assert(RefB->getKind() == MCSymbolRefExpr::VK_None &&
"Should not have constructed this");
@@ -423,12 +427,20 @@ void WasmObjectWriter::recordRelocation(MCAssembler &Asm,
WasmRelocationEntry Rec(FixupOffset, SymA, C, Type, &FixupSection);
DEBUG(dbgs() << "WasmReloc: " << Rec << "\n");
+ // Relocation other than R_WEBASSEMBLY_TYPE_INDEX_LEB are currently required
+ // to be against a named symbol.
+ // TODO(sbc): Add support for relocations against unnamed temporaries such
+ // as those generated by llvm's `blockaddress`.
+ // See: test/MC/WebAssembly/blockaddress.ll
+ if (SymA->getName().empty() && Type != wasm::R_WEBASSEMBLY_TYPE_INDEX_LEB)
+ report_fatal_error("relocations against un-named temporaries are not yet "
+ "supported by wasm");
+
if (FixupSection.isWasmData())
DataRelocations.push_back(Rec);
else if (FixupSection.getKind().isText())
CodeRelocations.push_back(Rec);
- else if (!FixupSection.getKind().isMetadata())
- // TODO(sbc): Add support for debug sections.
+ else
llvm_unreachable("unexpected section type");
}
@@ -496,6 +508,9 @@ WasmObjectWriter::getProvisionalValue(const WasmRelocationEntry &RelEntry) {
if (!Sym->isDefined())
return 0;
+ if (!SymbolIndices.count(Sym))
+ report_fatal_error("symbol not found in function/global index space: " +
+ Sym->getName());
uint32_t GlobalIndex = SymbolIndices[Sym];
const WasmGlobal& Global = Globals[GlobalIndex - NumGlobalImports];
uint64_t Address = Global.InitialValue + RelEntry.Addend;
diff --git a/llvm/lib/Target/WebAssembly/known_gcc_test_failures.txt b/llvm/lib/Target/WebAssembly/known_gcc_test_failures.txt
index 242f96fe219..c9eda8b8d8e 100644
--- a/llvm/lib/Target/WebAssembly/known_gcc_test_failures.txt
+++ b/llvm/lib/Target/WebAssembly/known_gcc_test_failures.txt
@@ -11,7 +11,8 @@
# to wasm object files (.o).
# Computed gotos are not supported (Cannot select BlockAddress/BRIND)
-20071220-1.c wasm-o,O0
+20071220-1.c wasm-o
+20071220-2.c wasm-o
20040302-1.c
20041214-1.c O0
20071210-1.c
@@ -97,9 +98,6 @@ devirt-14.C # bad main signature
devirt-21.C # bad main signature
devirt-23.C # bad main signature
-# Untriaged: Assertion failure in WasmObjectWriter::applyRelocations
-20071220-2.c wasm-o,O0
-
# Untriaged C++ failures
spec5.C
addr1.C
diff --git a/llvm/test/MC/WebAssembly/blockaddress.ll b/llvm/test/MC/WebAssembly/blockaddress.ll
new file mode 100644
index 00000000000..79bc1b8fcfc
--- /dev/null
+++ b/llvm/test/MC/WebAssembly/blockaddress.ll
@@ -0,0 +1,15 @@
+; TODO(sbc): Make this test pass by adding support for unnamed tempoaries
+; in wasm relocations.
+; RUN: not llc -filetype=obj %s
+
+target triple = "wasm32-unknown-unknown-wasm"
+
+@foo = internal global i8* blockaddress(@bar, %addr), align 4
+
+define hidden i32 @bar() #0 {
+entry:
+ br label %addr
+
+addr:
+ ret i32 0
+}
OpenPOWER on IntegriCloud