diff options
author | Sam Clegg <sbc@chromium.org> | 2017-09-20 21:17:04 +0000 |
---|---|---|
committer | Sam Clegg <sbc@chromium.org> | 2017-09-20 21:17:04 +0000 |
commit | 31a2c8093593a8e17a05022915eb505dcb7020e3 (patch) | |
tree | 7f21c266b4295bdb7d2000d6ef60d87fb733ad78 /llvm/lib/MC | |
parent | 1e72f65077f9f87cccaa490131803431958d90e2 (diff) | |
download | bcm5719-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.cpp | 37 |
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. |