diff --git a/llvm/include/llvm/Object/Wasm.h b/llvm/include/llvm/Object/Wasm.h --- a/llvm/include/llvm/Object/Wasm.h +++ b/llvm/include/llvm/Object/Wasm.h @@ -287,7 +287,6 @@ uint32_t StartFunction = -1; bool HasLinkingSection = false; bool HasDylinkSection = false; - bool SeenCodeSection = false; bool HasMemory64 = false; wasm::WasmLinkingData LinkingData; uint32_t NumImportedGlobals = 0; diff --git a/llvm/lib/Object/WasmObjectFile.cpp b/llvm/lib/Object/WasmObjectFile.cpp --- a/llvm/lib/Object/WasmObjectFile.cpp +++ b/llvm/lib/Object/WasmObjectFile.cpp @@ -451,10 +451,6 @@ llvm::DenseSet SeenFunctions; llvm::DenseSet SeenGlobals; llvm::DenseSet SeenSegments; - if (Functions.size() && !SeenCodeSection) { - return make_error("names must come after code section", - object_error::parse_failed); - } while (Ctx.Ptr < Ctx.End) { uint8_t Type = readUint8(Ctx); @@ -474,7 +470,7 @@ return make_error( "function named more than once", object_error::parse_failed); if (!isValidFunctionIndex(Index) || Name.empty()) - return make_error("invalid name entry", + return make_error("invalid function name entry", object_error::parse_failed); if (isDefinedFunctionIndex(Index)) @@ -485,7 +481,7 @@ return make_error("global named more than once", object_error::parse_failed); if (!isValidGlobalIndex(Index) || Name.empty()) - return make_error("invalid name entry", + return make_error("invalid global name entry", object_error::parse_failed); } else { nameType = wasm::NameType::DATA_SEGMENT; @@ -493,7 +489,7 @@ return make_error( "segment named more than once", object_error::parse_failed); if (Index > DataSegments.size()) - return make_error("invalid named data segment", + return make_error("invalid data segment name entry", object_error::parse_failed); } DebugNames.push_back(wasm::WasmDebugName{nameType, Index, Name}); @@ -519,11 +515,6 @@ Error WasmObjectFile::parseLinkingSection(ReadContext &Ctx) { HasLinkingSection = true; - if (Functions.size() && !SeenCodeSection) { - return make_error( - "linking data must come after code section", - object_error::parse_failed); - } LinkingData.Version = readVaruint32(Ctx); if (LinkingData.Version != wasm::WasmMetadataVersion) { @@ -1410,7 +1401,6 @@ } Error WasmObjectFile::parseCodeSection(ReadContext &Ctx) { - SeenCodeSection = true; CodeSection = Sections.size(); uint32_t FunctionCount = readVaruint32(Ctx); if (FunctionCount != Functions.size()) { diff --git a/llvm/test/tools/llvm-objdump/wasm/no-codesec.test b/llvm/test/tools/llvm-objdump/wasm/no-codesec.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/wasm/no-codesec.test @@ -0,0 +1,26 @@ +## Test that sections that use function indices (e.g. name) work without the code section +# RUN: yaml2obj %s -o %t +# RUN: llvm-objdump -h %t | FileCheck %s + +# CHECK: Sections: +# CHECK-NEXT: Idx Name Size VMA Type +# CHECK-NEXT: 0 TYPE 00000004 00000000 +# CHECK-NEXT: 1 FUNCTION 00000002 00000000 +# CHECK-NEXT: 2 name 00000008 00000000 + +--- !WASM +FileHeader: + Version: 0x00000001 +Sections: + - Type: TYPE + Signatures: + - Index: 0 + ParamTypes: [] + ReturnTypes: [] + - Type: FUNCTION + FunctionTypes: [ 0 ] + - Type: CUSTOM + Name: name + FunctionNames: + - Index: 0 + Name: foo