summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2018-02-16 18:06:05 +0000
committerSam Clegg <sbc@chromium.org>2018-02-16 18:06:05 +0000
commitb7a5469c7eb9980ba22b6f43459b8fb42a7ba6e3 (patch)
tree0f4519eeb7b3340ad83fdc6e03b341e4781819ab
parent91bb7750870147c863145c7241c984b3d3505b74 (diff)
downloadbcm5719-llvm-b7a5469c7eb9980ba22b6f43459b8fb42a7ba6e3.tar.gz
bcm5719-llvm-b7a5469c7eb9980ba22b6f43459b8fb42a7ba6e3.zip
[WebAssembly] MC: Make explicit our current lack of support for relocations against unnamed temporary symbols.
Add an explicit check before looking up symbol in SymbolIndices. This was previously silently succeeding and returning zero for such unnamed temporaries. Differential Revision: https://reviews.llvm.org/D43365 llvm-svn: 325367
-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