Index: lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp =================================================================== --- lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp +++ lib/Target/WebAssembly/Disassembler/WebAssemblyDisassembler.cpp @@ -131,7 +131,7 @@ const char *Error = nullptr; Opc = decodeULEB128(Bytes.data() + Size, &N, Bytes.data() + Bytes.size(), &Error); - if (Error || Opc < 0 || Opc > 255) + if (Error || Opc < 0 || Opc >= WebAssemblyInstructionTableSize) return MCDisassembler::Fail; Size += N; WasmInst += Opc; Index: utils/TableGen/WebAssemblyDisassemblerEmitter.cpp =================================================================== --- utils/TableGen/WebAssemblyDisassemblerEmitter.cpp +++ utils/TableGen/WebAssemblyDisassemblerEmitter.cpp @@ -19,6 +19,8 @@ namespace llvm { +static constexpr int WebAssemblyInstructionTableSize = 256; + void emitWebAssemblyDisassemblerTables( raw_ostream &OS, const ArrayRef &NumberedInstructions) { @@ -59,6 +61,8 @@ OS << "#include \"MCTargetDesc/WebAssemblyMCTargetDesc.h\"\n"; OS << "\n"; OS << "namespace llvm {\n\n"; + OS << "static constexpr int WebAssemblyInstructionTableSize = "; + OS << WebAssemblyInstructionTableSize << ";\n\n"; OS << "enum EntryType : uint8_t { "; OS << "ET_Unused, ET_Prefix, ET_Instruction };\n\n"; OS << "struct WebAssemblyInstruction {\n"; @@ -74,7 +78,7 @@ continue; OS << "WebAssemblyInstruction InstructionTable" << PrefixPair.first; OS << "[] = {\n"; - for (unsigned I = 0; I <= 0xFF; I++) { + for (unsigned I = 0; I < WebAssemblyInstructionTableSize; I++) { auto InstIt = PrefixPair.second.find(I); if (InstIt != PrefixPair.second.end()) { // Regular instruction.