summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Object/WasmObjectFile.cpp
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2018-04-26 19:27:28 +0000
committerSam Clegg <sbc@chromium.org>2018-04-26 19:27:28 +0000
commit6a31a0d694a65f5cb11ae6d49c7fdb3f08b0d262 (patch)
tree80ffd86a99679f42be9cb191dcd65305be55e03a /llvm/lib/Object/WasmObjectFile.cpp
parent540512c29719dc98429961c38fa882bcfef1de40 (diff)
downloadbcm5719-llvm-6a31a0d694a65f5cb11ae6d49c7fdb3f08b0d262.tar.gz
bcm5719-llvm-6a31a0d694a65f5cb11ae6d49c7fdb3f08b0d262.zip
[WebAssembly] Write DWARF data into wasm object file
- Writes ".debug_XXX" into corresponding custom sections. - Writes relocation records into "reloc.debug_XXX" sections. Patch by Yury Delendik! Differential Revision: https://reviews.llvm.org/D44184 llvm-svn: 330982
Diffstat (limited to 'llvm/lib/Object/WasmObjectFile.cpp')
-rw-r--r--llvm/lib/Object/WasmObjectFile.cpp36
1 files changed, 35 insertions, 1 deletions
diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp
index 61db5d2468a..121e1f98f3e 100644
--- a/llvm/lib/Object/WasmObjectFile.cpp
+++ b/llvm/lib/Object/WasmObjectFile.cpp
@@ -465,6 +465,14 @@ Error WasmObjectFile::parseLinkingSectionSymtab(const uint8_t *&Ptr,
}
break;
+ case wasm::WASM_SYMBOL_TYPE_SECTION: {
+ Info.ElementIndex = readVaruint32(Ptr);
+ // Use somewhat unique section name as symbol name.
+ StringRef SectionName = Sections[Info.ElementIndex].Name;
+ Info.Name = SectionName;
+ break;
+ }
+
default:
return make_error<GenericBinaryError>("Invalid symbol type",
object_error::parse_failed);
@@ -573,6 +581,18 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, const uint8_t *Ptr,
object_error::parse_failed);
Reloc.Addend = readVarint32(Ptr);
break;
+ case wasm::R_WEBASSEMBLY_FUNCTION_OFFSET_I32:
+ if (!isValidFunctionSymbol(Reloc.Index))
+ return make_error<GenericBinaryError>("Bad relocation function index",
+ object_error::parse_failed);
+ Reloc.Addend = readVarint32(Ptr);
+ break;
+ case wasm::R_WEBASSEMBLY_SECTION_OFFSET_I32:
+ if (!isValidSectionSymbol(Reloc.Index))
+ return make_error<GenericBinaryError>("Bad relocation section index",
+ object_error::parse_failed);
+ Reloc.Addend = readVarint32(Ptr);
+ break;
default:
return make_error<GenericBinaryError>("Bad relocation type: " +
Twine(Reloc.Type),
@@ -584,7 +604,9 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, const uint8_t *Ptr,
// to check that.
uint64_t Size = 5;
if (Reloc.Type == wasm::R_WEBASSEMBLY_TABLE_INDEX_I32 ||
- Reloc.Type == wasm::R_WEBASSEMBLY_MEMORY_ADDR_I32)
+ Reloc.Type == wasm::R_WEBASSEMBLY_MEMORY_ADDR_I32 ||
+ Reloc.Type == wasm::R_WEBASSEMBLY_SECTION_OFFSET_I32 ||
+ Reloc.Type == wasm::R_WEBASSEMBLY_FUNCTION_OFFSET_I32)
Size = 4;
if (Reloc.Offset + Size > EndOffset)
return make_error<GenericBinaryError>("Bad relocation offset",
@@ -811,6 +833,10 @@ bool WasmObjectFile::isValidDataSymbol(uint32_t Index) const {
return Index < Symbols.size() && Symbols[Index].isTypeData();
}
+bool WasmObjectFile::isValidSectionSymbol(uint32_t Index) const {
+ return Index < Symbols.size() && Symbols[Index].isTypeSection();
+}
+
wasm::WasmFunction &WasmObjectFile::getDefinedFunction(uint32_t Index) {
assert(isDefinedFunctionIndex(Index));
return Functions[Index - NumImportedFunctions];
@@ -991,6 +1017,8 @@ uint64_t WasmObjectFile::getWasmSymbolValue(const WasmSymbol& Sym) const {
assert(Segment.Offset.Opcode == wasm::WASM_OPCODE_I32_CONST);
return Segment.Offset.Value.Int32 + Sym.Info.DataRef.Offset;
}
+ case wasm::WASM_SYMBOL_TYPE_SECTION:
+ return 0;
}
llvm_unreachable("invalid symbol type");
}
@@ -1020,6 +1048,8 @@ WasmObjectFile::getSymbolType(DataRefImpl Symb) const {
return SymbolRef::ST_Other;
case wasm::WASM_SYMBOL_TYPE_DATA:
return SymbolRef::ST_Data;
+ case wasm::WASM_SYMBOL_TYPE_SECTION:
+ return SymbolRef::ST_Debug;
}
llvm_unreachable("Unknown WasmSymbol::SymbolType");
@@ -1043,6 +1073,10 @@ WasmObjectFile::getSymbolSection(DataRefImpl Symb) const {
case wasm::WASM_SYMBOL_TYPE_DATA:
Ref.d.a = DataSection;
break;
+ case wasm::WASM_SYMBOL_TYPE_SECTION: {
+ Ref.d.a = Sym.Info.ElementIndex;
+ break;
+ }
default:
llvm_unreachable("Unknown WasmSymbol::SymbolType");
}
OpenPOWER on IntegriCloud