diff options
author | Sam Clegg <sbc@chromium.org> | 2017-05-25 21:08:07 +0000 |
---|---|---|
committer | Sam Clegg <sbc@chromium.org> | 2017-05-25 21:08:07 +0000 |
commit | 1c154a6107804f4da2bf6baf7b2eeb0ee996dcd3 (patch) | |
tree | 127b462eb1aa36db67a425034d7d51438295d6a1 /llvm/lib | |
parent | dda25b128cc05da413027f2fbc369c833d4f8b1e (diff) | |
download | bcm5719-llvm-1c154a6107804f4da2bf6baf7b2eeb0ee996dcd3.tar.gz bcm5719-llvm-1c154a6107804f4da2bf6baf7b2eeb0ee996dcd3.zip |
[WebAssembly] MC: Include unnamed data when writing wasm files
Also, include global entries for all data symbols, not
just external ones, since these are referenced by the
relocation records.
Add a test case that includes unnamed data.
Differential Revision: https://reviews.llvm.org/D33079
llvm-svn: 303915
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/MC/WasmObjectWriter.cpp | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp index 0540c4c47a3..8c3df36cfb4 100644 --- a/llvm/lib/MC/WasmObjectWriter.cpp +++ b/llvm/lib/MC/WasmObjectWriter.cpp @@ -422,6 +422,7 @@ static void ApplyRelocations( RelEntry.Offset; switch (RelEntry.Type) { case wasm::R_WEBASSEMBLY_FUNCTION_INDEX_LEB: { + assert(SymbolIndices.count(RelEntry.Symbol)); uint32_t Index = SymbolIndices[RelEntry.Symbol]; assert(RelEntry.Addend == 0); @@ -429,6 +430,7 @@ static void ApplyRelocations( break; } case wasm::R_WEBASSEMBLY_TABLE_INDEX_SLEB: { + assert(SymbolIndices.count(RelEntry.Symbol)); uint32_t Index = SymbolIndices[RelEntry.Symbol]; assert(RelEntry.Addend == 0); @@ -448,6 +450,7 @@ static void ApplyRelocations( break; } case wasm::R_WEBASSEMBLY_TABLE_INDEX_I32: { + assert(SymbolIndices.count(RelEntry.Symbol)); uint32_t Index = SymbolIndices[RelEntry.Symbol]; assert(RelEntry.Addend == 0); @@ -478,6 +481,7 @@ WriteRelocations(ArrayRef<WasmRelocationEntry> Relocations, uint64_t Offset = RelEntry.Offset + RelEntry.FixupSection->getSectionOffset() + HeaderSize; + assert(SymbolIndices.count(RelEntry.Symbol)); uint32_t Index = SymbolIndices[RelEntry.Symbol]; int64_t Addend = RelEntry.Addend; @@ -726,10 +730,6 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm, if (IsAddressTaken.count(&WS)) TableElems.push_back(Index); } else { - // For now, ignore temporary non-function symbols. - if (S.isTemporary()) - continue; - if (WS.getOffset() != 0) report_fatal_error("data sections must contain one variable each"); if (!WS.getSize()) @@ -777,20 +777,18 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm, } } - // For each external global, prepare a corresponding wasm global - // holding its address. - if (WS.isExternal()) { - Index = NumGlobalImports + Globals.size(); - - WasmGlobal Global; - Global.Type = PtrType; - Global.IsMutable = false; - Global.HasImport = false; - Global.InitialValue = DataSection.getSectionOffset(); - Global.ImportIndex = 0; - SymbolIndices[&WS] = Index; - Globals.push_back(Global); - } + // For each global, prepare a corresponding wasm global holding its + // address. For externals these will also be named exports. + Index = NumGlobalImports + Globals.size(); + + WasmGlobal Global; + Global.Type = PtrType; + Global.IsMutable = false; + Global.HasImport = false; + Global.InitialValue = DataSection.getSectionOffset(); + Global.ImportIndex = 0; + SymbolIndices[&WS] = Index; + Globals.push_back(Global); } } |