summaryrefslogtreecommitdiffstats
path: root/llvm/lib/MC
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2017-09-20 21:17:04 +0000
committerSam Clegg <sbc@chromium.org>2017-09-20 21:17:04 +0000
commit31a2c8093593a8e17a05022915eb505dcb7020e3 (patch)
tree7f21c266b4295bdb7d2000d6ef60d87fb733ad78 /llvm/lib/MC
parent1e72f65077f9f87cccaa490131803431958d90e2 (diff)
downloadbcm5719-llvm-31a2c8093593a8e17a05022915eb505dcb7020e3.tar.gz
bcm5719-llvm-31a2c8093593a8e17a05022915eb505dcb7020e3.zip
[WebAssembly] Add support for local symbol bindings
Differential Revision: https://reviews.llvm.org/D38096 llvm-svn: 313817
Diffstat (limited to 'llvm/lib/MC')
-rw-r--r--llvm/lib/MC/WasmObjectWriter.cpp37
1 files changed, 22 insertions, 15 deletions
diff --git a/llvm/lib/MC/WasmObjectWriter.cpp b/llvm/lib/MC/WasmObjectWriter.cpp
index 6ec93246c06..f17801a4a64 100644
--- a/llvm/lib/MC/WasmObjectWriter.cpp
+++ b/llvm/lib/MC/WasmObjectWriter.cpp
@@ -280,11 +280,11 @@ private:
uint32_t NumFuncImports);
void writeCodeRelocSection();
void writeDataRelocSection();
- void writeLinkingMetaDataSection(ArrayRef<WasmDataSegment> Segments,
- uint32_t DataSize, uint32_t DataAlignment,
- ArrayRef<StringRef> WeakSymbols,
- bool HasStackPointer,
- uint32_t StackPointerGlobal);
+ void writeLinkingMetaDataSection(
+ ArrayRef<WasmDataSegment> Segments, uint32_t DataSize,
+ uint32_t DataAlignment,
+ SmallVector<std::pair<StringRef, uint32_t>, 4> SymbolFlags,
+ bool HasStackPointer, uint32_t StackPointerGlobal);
uint32_t getProvisionalValue(const WasmRelocationEntry &RelEntry);
void applyRelocations(ArrayRef<WasmRelocationEntry> Relocations,
@@ -914,7 +914,8 @@ void WasmObjectWriter::writeDataRelocSection() {
void WasmObjectWriter::writeLinkingMetaDataSection(
ArrayRef<WasmDataSegment> Segments, uint32_t DataSize,
- uint32_t DataAlignment, ArrayRef<StringRef> WeakSymbols,
+ uint32_t DataAlignment,
+ SmallVector<std::pair<StringRef, uint32_t>, 4> SymbolFlags,
bool HasStackPointer, uint32_t StackPointerGlobal) {
SectionBookkeeping Section;
startSection(Section, wasm::WASM_SEC_CUSTOM, "linking");
@@ -926,12 +927,12 @@ void WasmObjectWriter::writeLinkingMetaDataSection(
endSection(SubSection);
}
- if (WeakSymbols.size() != 0) {
+ if (SymbolFlags.size() != 0) {
startSection(SubSection, wasm::WASM_SYMBOL_INFO);
- encodeULEB128(WeakSymbols.size(), getStream());
- for (const StringRef Export: WeakSymbols) {
- writeString(Export);
- encodeULEB128(wasm::WASM_SYMBOL_FLAG_WEAK, getStream());
+ encodeULEB128(SymbolFlags.size(), getStream());
+ for (auto Pair: SymbolFlags) {
+ writeString(Pair.first);
+ encodeULEB128(Pair.second, getStream());
}
endSection(SubSection);
}
@@ -993,7 +994,7 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
SmallVector<uint32_t, 4> TableElems;
SmallVector<WasmImport, 4> Imports;
SmallVector<WasmExport, 4> Exports;
- SmallVector<StringRef, 4> WeakSymbols;
+ SmallVector<std::pair<StringRef, uint32_t>, 4> SymbolFlags;
SmallPtrSet<const MCSymbolWasm *, 4> IsAddressTaken;
unsigned NumFuncImports = 0;
SmallVector<WasmDataSegment, 4> DataSegments;
@@ -1164,7 +1165,7 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
<< " isVariable=" << WS.isVariable() << "\n");
if (WS.isWeak())
- WeakSymbols.push_back(WS.getName());
+ SymbolFlags.emplace_back(WS.getName(), wasm::WASM_SYMBOL_BINDING_WEAK);
if (WS.isVariable())
continue;
@@ -1235,7 +1236,7 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
}
// If the symbol is visible outside this translation unit, export it.
- if ((WS.isExternal() && WS.isDefined(/*SetUsed=*/false))) {
+ if (WS.isDefined(/*SetUsed=*/false)) {
WasmExport Export;
Export.FieldName = WS.getName();
Export.Index = Index;
@@ -1245,6 +1246,8 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
Export.Kind = wasm::WASM_EXTERNAL_GLOBAL;
DEBUG(dbgs() << " -> export " << Exports.size() << "\n");
Exports.push_back(Export);
+ if (!WS.isExternal())
+ SymbolFlags.emplace_back(WS.getName(), wasm::WASM_SYMBOL_BINDING_LOCAL);
}
}
@@ -1254,6 +1257,7 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
for (const MCSymbol &S : Asm.symbols()) {
if (!S.isVariable())
continue;
+
assert(S.isDefined(/*SetUsed=*/false));
// Find the target symbol of this weak alias and export that index
@@ -1273,6 +1277,9 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
Export.Kind = wasm::WASM_EXTERNAL_GLOBAL;
DEBUG(dbgs() << " -> export " << Exports.size() << "\n");
Exports.push_back(Export);
+
+ if (!WS.isExternal())
+ SymbolFlags.emplace_back(WS.getName(), wasm::WASM_SYMBOL_BINDING_LOCAL);
}
// Add types for indirect function calls.
@@ -1301,7 +1308,7 @@ void WasmObjectWriter::writeObject(MCAssembler &Asm,
writeCodeRelocSection();
writeDataRelocSection();
writeLinkingMetaDataSection(DataSegments, DataSize, DataAlignment,
- WeakSymbols, HasStackPointer, StackPointerGlobal);
+ SymbolFlags, HasStackPointer, StackPointerGlobal);
// TODO: Translate the .comment section to the output.
// TODO: Translate debug sections to the output.
OpenPOWER on IntegriCloud