diff --git a/llvm/include/llvm/MC/MCAsmBackend.h b/llvm/include/llvm/MC/MCAsmBackend.h index 01a64fb425a94..1f36b7e98274f 100644 --- a/llvm/include/llvm/MC/MCAsmBackend.h +++ b/llvm/include/llvm/MC/MCAsmBackend.h @@ -62,13 +62,6 @@ class MCAsmBackend { /// tricky way for optimization. virtual bool allowEnhancedRelaxation() const { return false; } - /// Give the target a chance to manipulate state related to instruction - /// alignment (e.g. padding for optimization), instruction relaxablility, etc. - /// before and after actually emitting the instruction. - virtual void emitInstructionBegin(MCObjectStreamer &OS, const MCInst &Inst, - const MCSubtargetInfo &STI) {} - virtual void emitInstructionEnd(MCObjectStreamer &OS, const MCInst &Inst) {} - /// lifetime management virtual void reset() {} diff --git a/llvm/lib/MC/MCObjectStreamer.cpp b/llvm/lib/MC/MCObjectStreamer.cpp index 5dc73c5b7887a..fec1ccee6ff84 100644 --- a/llvm/lib/MC/MCObjectStreamer.cpp +++ b/llvm/lib/MC/MCObjectStreamer.cpp @@ -330,9 +330,7 @@ void MCObjectStreamer::emitInstruction(const MCInst &Inst, "' cannot have instructions"); return; } - getAssembler().getBackend().emitInstructionBegin(*this, Inst, STI); emitInstructionImpl(Inst, STI); - getAssembler().getBackend().emitInstructionEnd(*this, Inst); } void MCObjectStreamer::emitInstructionImpl(const MCInst &Inst, diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp index c2188d206b5f6..4567daeb5c4a0 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp @@ -7,8 +7,8 @@ //===----------------------------------------------------------------------===// #include "MCTargetDesc/X86BaseInfo.h" -#include "MCTargetDesc/X86FixupKinds.h" #include "MCTargetDesc/X86EncodingOptimization.h" +#include "MCTargetDesc/X86FixupKinds.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/BinaryFormat/ELF.h" #include "llvm/BinaryFormat/MachO.h" @@ -19,6 +19,7 @@ #include "llvm/MC/MCContext.h" #include "llvm/MC/MCDwarf.h" #include "llvm/MC/MCELFObjectWriter.h" +#include "llvm/MC/MCELFStreamer.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCFixupKindInfo.h" #include "llvm/MC/MCInst.h" @@ -162,8 +163,8 @@ class X86AsmBackend : public MCAsmBackend { bool allowAutoPadding() const override; bool allowEnhancedRelaxation() const override; void emitInstructionBegin(MCObjectStreamer &OS, const MCInst &Inst, - const MCSubtargetInfo &STI) override; - void emitInstructionEnd(MCObjectStreamer &OS, const MCInst &Inst) override; + const MCSubtargetInfo &STI); + void emitInstructionEnd(MCObjectStreamer &OS, const MCInst &Inst); unsigned getNumFixupKinds() const override { return X86::NumTargetFixupKinds; @@ -1546,3 +1547,37 @@ MCAsmBackend *llvm::createX86_64AsmBackend(const Target &T, return new ELFX86_X32AsmBackend(T, OSABI, STI); return new ELFX86_64AsmBackend(T, OSABI, STI); } + +namespace { +class X86ELFStreamer : public MCELFStreamer { +public: + X86ELFStreamer(MCContext &Context, std::unique_ptr TAB, + std::unique_ptr OW, + std::unique_ptr Emitter) + : MCELFStreamer(Context, std::move(TAB), std::move(OW), + std::move(Emitter)) {} + + void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override; +}; +} // end anonymous namespace + +void X86_MC::emitInstruction(MCObjectStreamer &S, const MCInst &Inst, + const MCSubtargetInfo &STI) { + auto &Backend = static_cast(S.getAssembler().getBackend()); + Backend.emitInstructionBegin(S, Inst, STI); + S.MCObjectStreamer::emitInstruction(Inst, STI); + Backend.emitInstructionEnd(S, Inst); +} + +void X86ELFStreamer::emitInstruction(const MCInst &Inst, + const MCSubtargetInfo &STI) { + X86_MC::emitInstruction(*this, Inst, STI); +} + +MCStreamer *llvm::createX86ELFStreamer(const Triple &T, MCContext &Context, + std::unique_ptr &&MAB, + std::unique_ptr &&MOW, + std::unique_ptr &&MCE) { + return new X86ELFStreamer(Context, std::move(MAB), std::move(MOW), + std::move(MCE)); +} diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp index ed4d0a45bd8f2..07c2c73e84ed9 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.cpp @@ -742,6 +742,7 @@ extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeX86TargetMC() { TargetRegistry::RegisterNullTargetStreamer(*T, createX86NullTargetStreamer); TargetRegistry::RegisterCOFFStreamer(*T, createX86WinCOFFStreamer); + TargetRegistry::RegisterELFStreamer(*T, createX86ELFStreamer); // Register the MCInstPrinter. TargetRegistry::RegisterMCInstPrinter(*T, createX86MCInstPrinter); diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h index 18ecca34943f6..9e68d0c670329 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCTargetDesc.h @@ -24,6 +24,7 @@ class MCContext; class MCInst; class MCInstPrinter; class MCInstrInfo; +class MCObjectStreamer; class MCObjectTargetWriter; class MCObjectWriter; class MCRegister; @@ -89,6 +90,9 @@ bool needsAddressSizeOverride(const MCInst &MI, const MCSubtargetInfo &STI, /// do not need to go through TargetRegistry. MCSubtargetInfo *createX86MCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS); + +void emitInstruction(MCObjectStreamer &, const MCInst &Inst, + const MCSubtargetInfo &STI); } MCCodeEmitter *createX86MCCodeEmitter(const MCInstrInfo &MCII, @@ -123,6 +127,11 @@ MCStreamer *createX86WinCOFFStreamer(MCContext &C, std::unique_ptr &&CE, bool IncrementalLinkerCompatible); +MCStreamer *createX86ELFStreamer(const Triple &T, MCContext &Context, + std::unique_ptr &&MAB, + std::unique_ptr &&MOW, + std::unique_ptr &&MCE); + /// Construct an X86 Mach-O object writer. std::unique_ptr createX86MachObjectWriter(bool Is64Bit, uint32_t CPUType, uint32_t CPUSubtype); diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFStreamer.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFStreamer.cpp index dac8bc1fb1be3..b1e5362c5d24b 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFStreamer.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86WinCOFFStreamer.cpp @@ -26,6 +26,7 @@ class X86WinCOFFStreamer : public MCWinCOFFStreamer { std::unique_ptr OW) : MCWinCOFFStreamer(C, std::move(AB), std::move(CE), std::move(OW)) {} + void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override; void emitWinEHHandlerData(SMLoc Loc) override; void emitWindowsUnwindTables(WinEH::FrameInfo *Frame) override; void emitWindowsUnwindTables() override; @@ -33,6 +34,11 @@ class X86WinCOFFStreamer : public MCWinCOFFStreamer { void finishImpl() override; }; +void X86WinCOFFStreamer::emitInstruction(const MCInst &Inst, + const MCSubtargetInfo &STI) { + X86_MC::emitInstruction(*this, Inst, STI); +} + void X86WinCOFFStreamer::emitWinEHHandlerData(SMLoc Loc) { MCStreamer::emitWinEHHandlerData(Loc);