diff --git a/llvm/include/llvm/MC/MCCodeEmitter.h b/llvm/include/llvm/MC/MCCodeEmitter.h index e4f4b27816bb3..ceb16c9b4da78 100644 --- a/llvm/include/llvm/MC/MCCodeEmitter.h +++ b/llvm/include/llvm/MC/MCCodeEmitter.h @@ -30,12 +30,6 @@ class MCCodeEmitter { /// Lifetime management virtual void reset() {} - /// Append the prefixes of given instruction to the code buffer. - /// - /// \param Inst a single low-level machine instruction. - /// \param CB code buffer - virtual void emitPrefix(const MCInst &Inst, SmallVectorImpl &CB, - const MCSubtargetInfo &STI) const {} /// Encode the given \p Inst to bytes and append to \p CB. virtual void encodeInstruction(const MCInst &Inst, SmallVectorImpl &CB, SmallVectorImpl &Fixups, diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp index 4567daeb5c4a0..372de5c18ac2b 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp @@ -788,7 +788,7 @@ bool X86AsmBackend::padInstructionViaPrefix(MCRelaxableFragment &RF, const unsigned MaxPossiblePad = std::min(15 - OldSize, RemainingSize); const unsigned RemainingPrefixSize = [&]() -> unsigned { SmallString<15> Code; - Emitter.emitPrefix(RF.getInst(), Code, STI); + X86_MC::emitPrefix(Emitter, RF.getInst(), Code, STI); assert(Code.size() < 15 && "The number of prefixes must be less than 15."); // TODO: It turns out we need a decent amount of plumbing for the target diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp index 72219c136c7e1..3cd0af0c7f546 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp @@ -344,7 +344,7 @@ class X86MCCodeEmitter : public MCCodeEmitter { ~X86MCCodeEmitter() override = default; void emitPrefix(const MCInst &MI, SmallVectorImpl &CB, - const MCSubtargetInfo &STI) const override; + const MCSubtargetInfo &STI) const; void encodeInstruction(const MCInst &MI, SmallVectorImpl &CB, SmallVectorImpl &Fixups, @@ -1531,6 +1531,11 @@ void X86MCCodeEmitter::emitPrefix(const MCInst &MI, SmallVectorImpl &CB, emitPrefixImpl(CurOp, MI, STI, CB); } +void X86_MC::emitPrefix(MCCodeEmitter &MCE, const MCInst &MI, + SmallVectorImpl &CB, const MCSubtargetInfo &STI) { + static_cast(MCE).emitPrefix(MI, CB, STI); +} + void X86MCCodeEmitter::encodeInstruction(const MCInst &MI, SmallVectorImpl &CB, SmallVectorImpl &Fixups, diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h index 9e68d0c670329..96a7823b04ad8 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h @@ -13,6 +13,7 @@ #ifndef LLVM_LIB_TARGET_X86_MCTARGETDESC_X86MCTARGETDESC_H #define LLVM_LIB_TARGET_X86_MCTARGETDESC_X86MCTARGETDESC_H +#include "llvm/ADT/SmallVector.h" #include #include @@ -93,6 +94,9 @@ MCSubtargetInfo *createX86MCSubtargetInfo(const Triple &TT, StringRef CPU, void emitInstruction(MCObjectStreamer &, const MCInst &Inst, const MCSubtargetInfo &STI); + +void emitPrefix(MCCodeEmitter &MCE, const MCInst &MI, SmallVectorImpl &CB, + const MCSubtargetInfo &STI); } MCCodeEmitter *createX86MCCodeEmitter(const MCInstrInfo &MCII,