diff --git a/llvm/lib/MC/MCAsmStreamer.cpp b/llvm/lib/MC/MCAsmStreamer.cpp index 9e1d108ac14dc..49668de27d67e 100644 --- a/llvm/lib/MC/MCAsmStreamer.cpp +++ b/llvm/lib/MC/MCAsmStreamer.cpp @@ -154,7 +154,10 @@ class MCAsmStreamer final : public MCStreamer { void emitGNUAttribute(unsigned Tag, unsigned Value) override; StringRef getMnemonic(MCInst &MI) override { - return InstPrinter->getMnemonic(&MI).first; + auto [Ptr, Bits] = InstPrinter->getMnemonic(&MI); + assert((Bits != 0 || Ptr == nullptr) && + "Invalid char pointer for instruction with no mnemonic"); + return Ptr; } void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override; diff --git a/llvm/utils/TableGen/AsmWriterEmitter.cpp b/llvm/utils/TableGen/AsmWriterEmitter.cpp index 0220927295cf7..e0cd5fad3254d 100644 --- a/llvm/utils/TableGen/AsmWriterEmitter.cpp +++ b/llvm/utils/TableGen/AsmWriterEmitter.cpp @@ -438,6 +438,10 @@ void AsmWriterEmitter::EmitGetMnemonic( O << " // Emit the opcode for the instruction.\n"; O << BitsString; + // Make sure we don't return an invalid pointer if bits is 0 + O << " if (Bits == 0)\n" + " return {nullptr, Bits};\n"; + // Return mnemonic string and bits. O << " return {AsmStrs+(Bits & " << (1 << AsmStrBits) - 1 << ")-1, Bits};\n\n";