Index: include/llvm/MC/MCAsmBackend.h =================================================================== --- include/llvm/MC/MCAsmBackend.h +++ include/llvm/MC/MCAsmBackend.h @@ -171,8 +171,10 @@ /// \param OS The streamer used for writing the padding data and function. /// \param Context the context of the padding, Embeds the basic block's /// parameters. + /// \param STI the subtarget in effect when the basic block was created. void handleCodePaddingBasicBlockStart(MCObjectStreamer *OS, - const MCCodePaddingContext &Context); + const MCCodePaddingContext &Context, + const MCSubtargetInfo &STI); /// Handles all target related code padding after writing a block to an object /// file. /// @@ -183,7 +185,9 @@ /// to an object file. /// /// \param Inst the instruction. - void handleCodePaddingInstructionBegin(const MCInst &Inst); + /// \param STI the subtarget in effect when the instruction was encoded. + void handleCodePaddingInstructionBegin(const MCInst &Inst, + const MCSubtargetInfo &STI); /// Handles all target related code padding after writing an instruction to an /// object file. /// Index: include/llvm/MC/MCCodePadder.h =================================================================== --- include/llvm/MC/MCCodePadder.h +++ include/llvm/MC/MCCodePadder.h @@ -93,8 +93,10 @@ /// \param OS The streamer used for writing the padding data and function. /// \param Context the context of the padding, Embeds the basic block's /// parameters. + /// \param STI The MCSubtargetInfo in operation when basic block is emitted. void handleBasicBlockStart(MCObjectStreamer *OS, - const MCCodePaddingContext &Context); + const MCCodePaddingContext &Context, + const MCSubtargetInfo &STI); /// Handles all target related code padding when done writing a block to an /// object file. /// @@ -105,7 +107,9 @@ /// to an object file. /// /// \param Inst the instruction. - void handleInstructionBegin(const MCInst &Inst); + /// \param STI the MCSubtargetInfo in operation when the instruction was + /// encoded. + void handleInstructionBegin(const MCInst &Inst, const MCSubtargetInfo &STI); /// Handles all target related code padding after writing an instruction to an /// object file. /// Index: include/llvm/MC/MCFragment.h =================================================================== --- include/llvm/MC/MCFragment.h +++ include/llvm/MC/MCFragment.h @@ -349,6 +349,8 @@ uint64_t Size; + const MCSubtargetInfo &STI; + struct MCInstInfo { bool IsInitialized; MCInst Inst; @@ -377,9 +379,9 @@ MaxTargetPerfNopFragmentKind = 63 }; - MCPaddingFragment(MCSection *Sec = nullptr) + MCPaddingFragment(const MCSubtargetInfo& STI, MCSection *Sec = nullptr) : MCFragment(FT_Padding, false, Sec), PaddingPoliciesMask(PFK_None), - IsInsertionPoint(false), Size(UINT64_C(0)), + IsInsertionPoint(false), Size(UINT64_C(0)), STI(STI), InstInfo({false, MCInst(), false, {0}}) {} bool isInsertionPoint() const { return IsInsertionPoint; } @@ -419,7 +421,7 @@ uint64_t getSize() const { return Size; } void setSize(uint64_t Value) { Size = Value; } bool isInstructionInitialized() const { return InstInfo.IsInitialized; } - + const MCSubtargetInfo &getSubtargetInfo() const { return STI; } static bool classof(const MCFragment *F) { return F->getKind() == MCFragment::FT_Padding; } Index: include/llvm/MC/MCObjectStreamer.h =================================================================== --- include/llvm/MC/MCObjectStreamer.h +++ include/llvm/MC/MCObjectStreamer.h @@ -76,7 +76,7 @@ /// Optionally a \p STI can be passed in so that a new fragment is created /// if the Subtarget differs from the current fragment. MCDataFragment *getOrCreateDataFragment(const MCSubtargetInfo* STI = nullptr); - MCPaddingFragment *getOrCreatePaddingFragment(); + MCPaddingFragment *getOrCreatePaddingFragment(const MCSubtargetInfo& STI); protected: bool changeSectionImpl(MCSection *Section, const MCExpr *Subsection); @@ -125,7 +125,8 @@ void emitValueToOffset(const MCExpr *Offset, unsigned char Value, SMLoc Loc) override; void - EmitCodePaddingBasicBlockStart(const MCCodePaddingContext &Context) override; + EmitCodePaddingBasicBlockStart(const MCCodePaddingContext &Context, + const MCSubtargetInfo &STI) override; void EmitCodePaddingBasicBlockEnd(const MCCodePaddingContext &Context) override; void EmitDwarfLocDirective(unsigned FileNo, unsigned Line, Index: include/llvm/MC/MCStreamer.h =================================================================== --- include/llvm/MC/MCStreamer.h +++ include/llvm/MC/MCStreamer.h @@ -745,7 +745,8 @@ SMLoc Loc); virtual void - EmitCodePaddingBasicBlockStart(const MCCodePaddingContext &Context) {} + EmitCodePaddingBasicBlockStart(const MCCodePaddingContext &Context, + const MCSubtargetInfo &STI) {} virtual void EmitCodePaddingBasicBlockEnd(const MCCodePaddingContext &Context) {} Index: lib/CodeGen/AsmPrinter/AsmPrinter.cpp =================================================================== --- lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -2778,7 +2778,7 @@ EmitAlignment(Align); MCCodePaddingContext Context; setupCodePaddingContext(MBB, Context); - OutStreamer->EmitCodePaddingBasicBlockStart(Context); + OutStreamer->EmitCodePaddingBasicBlockStart(Context, MF->getSubtarget()); // If the block has its address taken, emit any labels that were used to // reference the block. It is possible that there is more than one label Index: lib/MC/MCAsmBackend.cpp =================================================================== --- lib/MC/MCAsmBackend.cpp +++ lib/MC/MCAsmBackend.cpp @@ -108,8 +108,9 @@ } void MCAsmBackend::handleCodePaddingBasicBlockStart( - MCObjectStreamer *OS, const MCCodePaddingContext &Context) { - CodePadder->handleBasicBlockStart(OS, Context); + MCObjectStreamer *OS, const MCCodePaddingContext &Context, + const MCSubtargetInfo &STI) { + CodePadder->handleBasicBlockStart(OS, Context, STI); } void MCAsmBackend::handleCodePaddingBasicBlockEnd( @@ -117,8 +118,9 @@ CodePadder->handleBasicBlockEnd(Context); } -void MCAsmBackend::handleCodePaddingInstructionBegin(const MCInst &Inst) { - CodePadder->handleInstructionBegin(Inst); +void MCAsmBackend::handleCodePaddingInstructionBegin( + const MCInst &Inst, const MCSubtargetInfo &STI) { + CodePadder->handleInstructionBegin(Inst, STI); } void MCAsmBackend::handleCodePaddingInstructionEnd(const MCInst &Inst) { Index: lib/MC/MCCodePadder.cpp =================================================================== --- lib/MC/MCCodePadder.cpp +++ lib/MC/MCCodePadder.cpp @@ -31,7 +31,8 @@ } void MCCodePadder::handleBasicBlockStart(MCObjectStreamer *OS, - const MCCodePaddingContext &Context) { + const MCCodePaddingContext &Context, + const MCSubtargetInfo &STI) { assert(OS != nullptr && "OS must be valid"); assert(this->OS == nullptr && "Still handling another basic block"); this->OS = OS; @@ -58,7 +59,7 @@ } if (InsertionPoint || PoliciesMask != MCPaddingFragment::PFK_None) { - MCPaddingFragment *PaddingFragment = OS->getOrCreatePaddingFragment(); + MCPaddingFragment *PaddingFragment = OS->getOrCreatePaddingFragment(STI); if (InsertionPoint) PaddingFragment->setAsInsertionPoint(); PaddingFragment->setPaddingPoliciesMask( @@ -71,7 +72,8 @@ OS = nullptr; } -void MCCodePadder::handleInstructionBegin(const MCInst &Inst) { +void MCCodePadder::handleInstructionBegin(const MCInst &Inst, + const MCSubtargetInfo &STI) { if (!OS) return; // instruction was emitted outside a function @@ -107,7 +109,7 @@ needToUpdateCurrFragment) { // temporarily holding the fragment as CurrHandledInstFragment, to be // updated after the instruction will be written - CurrHandledInstFragment = OS->getOrCreatePaddingFragment(); + CurrHandledInstFragment = OS->getOrCreatePaddingFragment(STI); if (InsertionPoint) CurrHandledInstFragment->setAsInsertionPoint(); CurrHandledInstFragment->setPaddingPoliciesMask( Index: lib/MC/MCObjectStreamer.cpp =================================================================== --- lib/MC/MCObjectStreamer.cpp +++ lib/MC/MCObjectStreamer.cpp @@ -170,11 +170,12 @@ return F; } -MCPaddingFragment *MCObjectStreamer::getOrCreatePaddingFragment() { +MCPaddingFragment * +MCObjectStreamer::getOrCreatePaddingFragment(const MCSubtargetInfo &STI) { MCPaddingFragment *F = dyn_cast_or_null(getCurrentFragment()); if (!F) { - F = new MCPaddingFragment(); + F = new MCPaddingFragment(STI); insert(F); } return F; @@ -320,7 +321,7 @@ void MCObjectStreamer::EmitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI, bool) { - getAssembler().getBackend().handleCodePaddingInstructionBegin(Inst); + getAssembler().getBackend().handleCodePaddingInstructionBegin(Inst, STI); EmitInstructionImpl(Inst, STI); getAssembler().getBackend().handleCodePaddingInstructionEnd(Inst); } @@ -548,8 +549,9 @@ } void MCObjectStreamer::EmitCodePaddingBasicBlockStart( - const MCCodePaddingContext &Context) { - getAssembler().getBackend().handleCodePaddingBasicBlockStart(this, Context); + const MCCodePaddingContext &Context, const MCSubtargetInfo &STI) { + getAssembler().getBackend().handleCodePaddingBasicBlockStart(this, Context, + STI); } void MCObjectStreamer::EmitCodePaddingBasicBlockEnd(