diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp b/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp index 82aa1830dced..ab8918ce1919 100644 --- a/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp +++ b/contrib/llvm-project/llvm/lib/Object/WasmObjectFile.cpp @@ -56,7 +56,7 @@ LLVM_DUMP_METHOD void WasmSymbol::dump() const { print(dbgs()); } Expected<std::unique_ptr<WasmObjectFile>> ObjectFile::createWasmObjectFile(MemoryBufferRef Buffer) { Error Err = Error::success(); - auto ObjectFile = llvm::make_unique<WasmObjectFile>(Buffer, Err); + auto ObjectFile = std::make_unique<WasmObjectFile>(Buffer, Err); if (Err) return std::move(Err); @@ -343,7 +343,7 @@ Error WasmObjectFile::parseDylinkSection(ReadContext &Ctx) { Error WasmObjectFile::parseNameSection(ReadContext &Ctx) { llvm::DenseSet<uint64_t> Seen; - if (Functions.size() != FunctionTypes.size()) { + if (FunctionTypes.size() && !SeenCodeSection) { return make_error<GenericBinaryError>("Names must come after code section", object_error::parse_failed); } @@ -389,7 +389,7 @@ Error WasmObjectFile::parseNameSection(ReadContext &Ctx) { Error WasmObjectFile::parseLinkingSection(ReadContext &Ctx) { HasLinkingSection = true; - if (Functions.size() != FunctionTypes.size()) { + if (FunctionTypes.size() && !SeenCodeSection) { return make_error<GenericBinaryError>( "Linking data must come after code section", object_error::parse_failed); @@ -781,7 +781,7 @@ Error WasmObjectFile::parseRelocSection(StringRef Name, ReadContext &Ctx) { break; case wasm::R_WASM_GLOBAL_INDEX_LEB: // R_WASM_GLOBAL_INDEX_LEB are can be used against function and data - // symbols to refer to thier GOT enties. + // symbols to refer to their GOT entries. if (!isValidGlobalSymbol(Reloc.Index) && !isValidDataSymbol(Reloc.Index) && !isValidFunctionSymbol(Reloc.Index)) @@ -881,12 +881,9 @@ Error WasmObjectFile::parseTypeSection(ReadContext &Ctx) { Sig.Params.push_back(wasm::ValType(ParamType)); } uint32_t ReturnCount = readVaruint32(Ctx); - if (ReturnCount) { - if (ReturnCount != 1) { - return make_error<GenericBinaryError>( - "Multiple return types not supported", object_error::parse_failed); - } - Sig.Returns.push_back(wasm::ValType(readUint8(Ctx))); + while (ReturnCount--) { + uint32_t ReturnType = readUint8(Ctx); + Sig.Returns.push_back(wasm::ValType(ReturnType)); } Signatures.push_back(std::move(Sig)); } @@ -943,6 +940,7 @@ Error WasmObjectFile::parseImportSection(ReadContext &Ctx) { Error WasmObjectFile::parseFunctionSection(ReadContext &Ctx) { uint32_t Count = readVaruint32(Ctx); FunctionTypes.reserve(Count); + Functions.resize(Count); uint32_t NumTypes = Signatures.size(); while (Count--) { uint32_t Type = readVaruint32(Ctx); @@ -1032,9 +1030,11 @@ Error WasmObjectFile::parseExportSection(ReadContext &Ctx) { Ex.Index = readVaruint32(Ctx); switch (Ex.Kind) { case wasm::WASM_EXTERNAL_FUNCTION: - if (!isValidFunctionIndex(Ex.Index)) + + if (!isDefinedFunctionIndex(Ex.Index)) return make_error<GenericBinaryError>("Invalid function export", object_error::parse_failed); + getDefinedFunction(Ex.Index).ExportName = Ex.Name; break; case wasm::WASM_EXTERNAL_GLOBAL: if (!isValidGlobalIndex(Ex.Index)) @@ -1135,6 +1135,7 @@ Error WasmObjectFile::parseStartSection(ReadContext &Ctx) { } Error WasmObjectFile::parseCodeSection(ReadContext &Ctx) { + SeenCodeSection = true; CodeSection = Sections.size(); uint32_t FunctionCount = readVaruint32(Ctx); if (FunctionCount != FunctionTypes.size()) { @@ -1142,14 +1143,14 @@ Error WasmObjectFile::parseCodeSection(ReadContext &Ctx) { object_error::parse_failed); } - while (FunctionCount--) { - wasm::WasmFunction Function; + for (uint32_t i = 0; i < FunctionCount; i++) { + wasm::WasmFunction& Function = Functions[i]; const uint8_t *FunctionStart = Ctx.Ptr; uint32_t Size = readVaruint32(Ctx); const uint8_t *FunctionEnd = Ctx.Ptr + Size; Function.CodeOffset = Ctx.Ptr - FunctionStart; - Function.Index = NumImportedFunctions + Functions.size(); + Function.Index = NumImportedFunctions + i; Function.CodeSectionOffset = FunctionStart - Ctx.Start; Function.Size = FunctionEnd - FunctionStart; @@ -1168,7 +1169,6 @@ Error WasmObjectFile::parseCodeSection(ReadContext &Ctx) { Function.Comdat = UINT32_MAX; Ctx.Ptr += BodySize; assert(Ctx.Ptr == FunctionEnd); - Functions.push_back(Function); } if (Ctx.Ptr != Ctx.End) return make_error<GenericBinaryError>("Code section ended prematurely", |
