Index: lib/MC/WasmObjectWriter.cpp =================================================================== --- lib/MC/WasmObjectWriter.cpp +++ lib/MC/WasmObjectWriter.cpp @@ -355,6 +355,10 @@ 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 @@ 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 @@ 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; Index: lib/Target/WebAssembly/known_gcc_test_failures.txt =================================================================== --- lib/Target/WebAssembly/known_gcc_test_failures.txt +++ 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-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 Index: test/MC/WebAssembly/blockaddress.ll =================================================================== --- /dev/null +++ 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 +}