summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2017-05-25 21:08:07 +0000
committerSam Clegg <sbc@chromium.org>2017-05-25 21:08:07 +0000
commit1c154a6107804f4da2bf6baf7b2eeb0ee996dcd3 (patch)
tree127b462eb1aa36db67a425034d7d51438295d6a1 /llvm/lib
parentdda25b128cc05da413027f2fbc369c833d4f8b1e (diff)
downloadbcm5719-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.cpp34
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);
}
}
OpenPOWER on IntegriCloud