diff options
author | Sam Clegg <sbc@chromium.org> | 2018-01-24 01:27:17 +0000 |
---|---|---|
committer | Sam Clegg <sbc@chromium.org> | 2018-01-24 01:27:17 +0000 |
commit | 23012e98c94989febc5334de85f8c18ba19f0097 (patch) | |
tree | 06e218b1555afbef5d156aa7e6ca97dd8922da67 /llvm/lib/Object | |
parent | 70fd374d1ed1070758f078d3e00537d88da2c9fc (diff) | |
download | bcm5719-llvm-23012e98c94989febc5334de85f8c18ba19f0097.tar.gz bcm5719-llvm-23012e98c94989febc5334de85f8c18ba19f0097.zip |
[WebAssembly] Add minor helper functions to WasmObjectFile
Also, fix crash when exporting an imported function.
Differential Revision: https://reviews.llvm.org/D42454
llvm-svn: 323290
Diffstat (limited to 'llvm/lib/Object')
-rw-r--r-- | llvm/lib/Object/WasmObjectFile.cpp | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp index 132471ab7f5..2bba662171b 100644 --- a/llvm/lib/Object/WasmObjectFile.cpp +++ b/llvm/lib/Object/WasmObjectFile.cpp @@ -292,10 +292,10 @@ Error WasmObjectFile::parseNameSection(const uint8_t *Ptr, const uint8_t *End) { return make_error<GenericBinaryError>("Invalid name entry", object_error::parse_failed); DebugNames.push_back(wasm::WasmFunctionName{Index, Name}); - if (Index >= NumImportedFunctions) { + if (isDefinedFunctionIndex(Index)) { // Override any existing name; the name specified by the "names" // section is the Function's canonical name. - Functions[Index - NumImportedFunctions].Name = Name; + getDefinedFunction(Index).Name = Name; } } break; @@ -369,8 +369,9 @@ void WasmObjectFile::populateSymbolTable() { << " sym index:" << SymIndex << "\n"); } } - if (Export.Kind == wasm::WASM_EXTERNAL_FUNCTION) { - auto &Function = Functions[Export.Index - NumImportedFunctions]; + if (Export.Kind == wasm::WASM_EXTERNAL_FUNCTION && + isDefinedFunctionIndex(Export.Index)) { + auto &Function = getDefinedFunction(Export.Index); if (Function.Name.empty()) { // Use the export's name to set a name for the Function, but only if one // hasn't already been set. @@ -501,14 +502,13 @@ Error WasmObjectFile::parseLinkingSectionComdat(const uint8_t *&Ptr, DataSegments[Index].Data.Comdat = Name; break; case wasm::WASM_COMDAT_FUNCTION: - if (Index < NumImportedFunctions || !isValidFunctionIndex(Index)) + if (!isDefinedFunctionIndex(Index)) return make_error<GenericBinaryError>("COMDAT function index out of range", object_error::parse_failed); - Index -= NumImportedFunctions; - if (!Functions[Index].Comdat.empty()) + if (!getDefinedFunction(Index).Comdat.empty()) return make_error<GenericBinaryError>("Function in two COMDATs", object_error::parse_failed); - Functions[Index].Comdat = Name; + getDefinedFunction(Index).Comdat = Name; break; } } @@ -736,7 +736,7 @@ Error WasmObjectFile::parseExportSection(const uint8_t *Ptr, const uint8_t *End) Ex.Index = readVaruint32(Ptr); switch (Ex.Kind) { case wasm::WASM_EXTERNAL_FUNCTION: - if (Ex.Index >= FunctionTypes.size() + NumImportedFunctions) + if (!isValidFunctionIndex(Ex.Index)) return make_error<GenericBinaryError>("Invalid function export", object_error::parse_failed); break; @@ -765,6 +765,15 @@ bool WasmObjectFile::isValidFunctionIndex(uint32_t Index) const { return Index < FunctionTypes.size() + NumImportedFunctions; } +bool WasmObjectFile::isDefinedFunctionIndex(uint32_t Index) const { + return Index >= NumImportedFunctions && isValidFunctionIndex(Index); +} + +wasm::WasmFunction& WasmObjectFile::getDefinedFunction(uint32_t Index) { + assert(isDefinedFunctionIndex(Index)); + return Functions[Index - NumImportedFunctions]; +} + Error WasmObjectFile::parseStartSection(const uint8_t *Ptr, const uint8_t *End) { StartFunction = readVaruint32(Ptr); if (!isValidFunctionIndex(StartFunction)) |