[llvm] r334078 - [MC] Pass MCSubtargetInfo to fixupNeedsRelaxation and applyFixup

Ilya Biryukov via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 6 04:00:48 PDT 2018


I'll commit the change then. Thanks! Just wanted to make sure no extra code
handling of the new params in the functions is needed.

On Wed, Jun 6, 2018 at 12:52 PM Peter Smith <peter.smith at linaro.org> wrote:

> I think I have pretty much the exact same patch nearly done, I just
> haven't fully built clang yet. If your's builds I think you may as
> well commit.
>
> Does that sound ok to you?
>
> Peter
>
> On 6 June 2018 at 11:50, Ilya Biryukov <ibiryukov at google.com> wrote:
> > Thanks! I have a trivial fix for the compilation failures that adds the
> > corresponding parameters to the overridden functions. (Without using the
> > added parameters in any way).
> > If there are no objections, I would land it now to make sure the targets
> > build. Does that LG?
> > Unless you have something in the works too, of course.
> >
> > On Wed, Jun 6, 2018 at 12:24 PM Peter Smith <peter.smith at linaro.org>
> wrote:
> >>
> >> Sure looking now.
> >>
> >> Apologies for the disruption.
> >>
> >> Peter
> >>
> >> On 6 June 2018 at 11:21, Ilya Biryukov <ibiryukov at google.com> wrote:
> >> > Hi Peter,
> >> >
> >> > This change broke the build for WebAssembly and RISCV targets:
> >> >
> >> > llvm/lib/Target/RISCV/MCTargetDesc/RISCVAsmBackend.cpp:47:58: error:
> >> > non-virtual member function marked 'override' hides virtual member
> >> > function
> >> > ...
> >> >
> >> >
> llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyAsmBackend.cpp:50:55:
> >> > error: non-virtual member function marked 'override' hides virtual
> >> > member
> >> > function
> >> >
> >> >
> >> > Could you take a look please?
> >> >
> >> >
> >> >
> >> > On Wed, Jun 6, 2018 at 11:44 AM Peter Smith via llvm-commits
> >> > <llvm-commits at lists.llvm.org> wrote:
> >> >>
> >> >> Author: psmith
> >> >> Date: Wed Jun  6 02:40:06 2018
> >> >> New Revision: 334078
> >> >>
> >> >> URL: http://llvm.org/viewvc/llvm-project?rev=334078&view=rev
> >> >> Log:
> >> >> [MC] Pass MCSubtargetInfo to fixupNeedsRelaxation and applyFixup
> >> >>
> >> >> On targets like Arm some relaxations may only be performed when
> certain
> >> >> architectural features are available. As functions can be compiled
> with
> >> >> differing levels of architectural support we must make a judgement on
> >> >> whether we can relax based on the MCSubtargetInfo for the function.
> >> >> This
> >> >> change passes through the MCSubtargetInfo for the function to
> >> >> fixupNeedsRelaxation so that the decision on whether to relax can be
> >> >> made
> >> >> per function. In this patch, only the ARM backend makes use of this
> >> >> information. We must also pass the MCSubtargetInfo to applyFixup
> >> >> because
> >> >> some fixups skip error checking on the assumption that relaxation has
> >> >> occurred, to prevent code-generation errors applyFixup must see the
> >> >> same
> >> >> MCSubtargetInfo as fixupNeedsRelaxation.
> >> >>
> >> >> Differential Revision: https://reviews.llvm.org/D44928
> >> >>
> >> >>
> >> >> Added:
> >> >>     llvm/trunk/test/CodeGen/ARM/relax-per-target-feature.ll
> >> >>     llvm/trunk/test/MC/ARM/AlignedBundling/illegal-subtarget-change.s
> >> >>     llvm/trunk/test/MC/ARM/AlignedBundling/subtarget-change.s
> >> >>     llvm/trunk/test/MC/ARM/fixup-per-fragment.s
> >> >>
> >> >>
> llvm/trunk/test/MC/X86/AlignedBundling/bundle-subtarget-change-error.s
> >> >> Modified:
> >> >>     llvm/trunk/include/llvm/MC/MCAsmBackend.h
> >> >>     llvm/trunk/include/llvm/MC/MCFragment.h
> >> >>     llvm/trunk/include/llvm/MC/MCObjectStreamer.h
> >> >>     llvm/trunk/include/llvm/MC/MCStreamer.h
> >> >>     llvm/trunk/lib/MC/MCAsmStreamer.cpp
> >> >>     llvm/trunk/lib/MC/MCAssembler.cpp
> >> >>     llvm/trunk/lib/MC/MCELFStreamer.cpp
> >> >>     llvm/trunk/lib/MC/MCMachOStreamer.cpp
> >> >>     llvm/trunk/lib/MC/MCObjectStreamer.cpp
> >> >>     llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> >> >>     llvm/trunk/lib/MC/MCWasmStreamer.cpp
> >> >>     llvm/trunk/lib/MC/MCWinCOFFStreamer.cpp
> >> >>     llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
> >> >>     llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUAsmBackend.cpp
> >> >>     llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
> >> >>     llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.h
> >> >>     llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp
> >> >>     llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp
> >> >>     llvm/trunk/lib/Target/Lanai/MCTargetDesc/LanaiAsmBackend.cpp
> >> >>     llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
> >> >>     llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.h
> >> >>     llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
> >> >>     llvm/trunk/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
> >> >>
>  llvm/trunk/lib/Target/SystemZ/MCTargetDesc/SystemZMCAsmBackend.cpp
> >> >>     llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
> >> >>
> >> >> Modified: llvm/trunk/include/llvm/MC/MCAsmBackend.h
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmBackend.h?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/include/llvm/MC/MCAsmBackend.h (original)
> >> >> +++ llvm/trunk/include/llvm/MC/MCAsmBackend.h Wed Jun  6 02:40:06
> 2018
> >> >> @@ -92,9 +92,12 @@ public:
> >> >>    /// the offset specified by the fixup and following the fixup kind
> >> >> as
> >> >>    /// appropriate. Errors (such as an out of range fixup value)
> should
> >> >> be
> >> >>    /// reported via \p Ctx.
> >> >> +  /// The  \p STI is present only for fragments of type
> >> >> MCRelaxableFragment and
> >> >> +  /// MCDataFragment with hasInstructions() == true.
> >> >>    virtual void applyFixup(const MCAssembler &Asm, const MCFixup
> >> >> &Fixup,
> >> >>                            const MCValue &Target,
> MutableArrayRef<char>
> >> >> Data,
> >> >> -                          uint64_t Value, bool IsResolved) const =
> 0;
> >> >> +                          uint64_t Value, bool IsResolved,
> >> >> +                          const MCSubtargetInfo *STI) const = 0;
> >> >>
> >> >>    /// Check whether the given target requires emitting differences
> of
> >> >> two
> >> >>    /// symbols as a set of relocations.
> >> >> @@ -108,7 +111,10 @@ public:
> >> >>    /// Check whether the given instruction may need relaxation.
> >> >>    ///
> >> >>    /// \param Inst - The instruction to test.
> >> >> -  virtual bool mayNeedRelaxation(const MCInst &Inst) const = 0;
> >> >> +  /// \param STI - The MCSubtargetInfo in effect when the
> instruction
> >> >> was
> >> >> +  /// encoded.
> >> >> +  virtual bool mayNeedRelaxation(const MCInst &Inst,
> >> >> +                                 const MCSubtargetInfo &STI) const =
> >> >> 0;
> >> >>
> >> >>    /// Target specific predicate for whether a given fixup requires
> the
> >> >>    /// associated instruction to be relaxed.
> >> >>
> >> >> Modified: llvm/trunk/include/llvm/MC/MCFragment.h
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCFragment.h?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/include/llvm/MC/MCFragment.h (original)
> >> >> +++ llvm/trunk/include/llvm/MC/MCFragment.h Wed Jun  6 02:40:06 2018
> >> >> @@ -201,7 +201,16 @@ protected:
> >> >>        : MCEncodedFragmentWithContents<ContentsSize>(FType,
> >> >> HasInstructions,
> >> >>                                                      Sec) {}
> >> >>
> >> >> +  /// STI - The MCSubtargetInfo in effect when the instruction was
> >> >> encoded.
> >> >> +  /// must be non-null for instructions.
> >> >> +  const MCSubtargetInfo *STI = nullptr;
> >> >> +
> >> >>  public:
> >> >> +
> >> >> +  /// Retrieve the MCSubTargetInfo in effect when the instruction
> was
> >> >> encoded.
> >> >> +  /// Guaranteed to be non-null if hasInstructions() == true
> >> >> +  const MCSubtargetInfo *getSubtargetInfo() const { return STI; }
> >> >> +
> >> >>    using const_fixup_iterator =
> >> >> SmallVectorImpl<MCFixup>::const_iterator;
> >> >>    using fixup_iterator = SmallVectorImpl<MCFixup>::iterator;
> >> >>
> >> >> @@ -228,7 +237,12 @@ public:
> >> >>    MCDataFragment(MCSection *Sec = nullptr)
> >> >>        : MCEncodedFragmentWithFixups<32, 4>(FT_Data, false, Sec) {}
> >> >>
> >> >> -  void setHasInstructions(bool V) { HasInstructions = V; }
> >> >> +  /// Record that the fragment contains instructions with the
> >> >> MCSubtargetInfo in
> >> >> +  /// effect when the instruction was encoded.
> >> >> +  void setHasInstructions(const MCSubtargetInfo &STI) {
> >> >> +    HasInstructions = true;
> >> >> +    this->STI = &STI;
> >> >> +  }
> >> >>
> >> >>    static bool classof(const MCFragment *F) {
> >> >>      return F->getKind() == MCFragment::FT_Data;
> >> >> @@ -259,20 +273,15 @@ class MCRelaxableFragment : public MCEnc
> >> >>    /// Inst - The instruction this is a fragment for.
> >> >>    MCInst Inst;
> >> >>
> >> >> -  /// STI - The MCSubtargetInfo in effect when the instruction was
> >> >> encoded.
> >> >> -  const MCSubtargetInfo &STI;
> >> >> -
> >> >>  public:
> >> >>    MCRelaxableFragment(const MCInst &Inst, const MCSubtargetInfo
> &STI,
> >> >>                        MCSection *Sec = nullptr)
> >> >>        : MCEncodedFragmentWithFixups(FT_Relaxable, true, Sec),
> >> >> -        Inst(Inst), STI(STI) {}
> >> >> +        Inst(Inst) { this->STI = &STI; }
> >> >>
> >> >>    const MCInst &getInst() const { return Inst; }
> >> >>    void setInst(const MCInst &Value) { Inst = Value; }
> >> >>
> >> >> -  const MCSubtargetInfo &getSubtargetInfo() { return STI; }
> >> >> -
> >> >>    static bool classof(const MCFragment *F) {
> >> >>      return F->getKind() == MCFragment::FT_Relaxable;
> >> >>    }
> >> >>
> >> >> Modified: llvm/trunk/include/llvm/MC/MCObjectStreamer.h
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectStreamer.h?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/include/llvm/MC/MCObjectStreamer.h (original)
> >> >> +++ llvm/trunk/include/llvm/MC/MCObjectStreamer.h Wed Jun  6 02:40:06
> >> >> 2018
> >> >> @@ -73,7 +73,9 @@ public:
> >> >>
> >> >>    /// Get a data fragment to write into, creating a new one if the
> >> >> current
> >> >>    /// fragment is not a data fragment.
> >> >> -  MCDataFragment *getOrCreateDataFragment();
> >> >> +  /// 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();
> >> >>
> >> >>  protected:
> >> >> @@ -158,7 +160,8 @@ public:
> >> >>    void EmitGPRel32Value(const MCExpr *Value) override;
> >> >>    void EmitGPRel64Value(const MCExpr *Value) override;
> >> >>    bool EmitRelocDirective(const MCExpr &Offset, StringRef Name,
> >> >> -                          const MCExpr *Expr, SMLoc Loc) override;
> >> >> +                          const MCExpr *Expr, SMLoc Loc,
> >> >> +                          const MCSubtargetInfo &STI) override;
> >> >>    using MCStreamer::emitFill;
> >> >>    void emitFill(const MCExpr &NumBytes, uint64_t FillValue,
> >> >>                  SMLoc Loc = SMLoc()) override;
> >> >>
> >> >> Modified: llvm/trunk/include/llvm/MC/MCStreamer.h
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCStreamer.h?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/include/llvm/MC/MCStreamer.h (original)
> >> >> +++ llvm/trunk/include/llvm/MC/MCStreamer.h Wed Jun  6 02:40:06 2018
> >> >> @@ -918,7 +918,8 @@ public:
> >> >>    /// Returns true if the relocation could not be emitted because
> Name
> >> >> is
> >> >> not
> >> >>    /// known.
> >> >>    virtual bool EmitRelocDirective(const MCExpr &Offset, StringRef
> >> >> Name,
> >> >> -                                  const MCExpr *Expr, SMLoc Loc) {
> >> >> +                                  const MCExpr *Expr, SMLoc Loc,
> >> >> +                                  const MCSubtargetInfo &STI) {
> >> >>      return true;
> >> >>    }
> >> >>
> >> >>
> >> >> Modified: llvm/trunk/lib/MC/MCAsmStreamer.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmStreamer.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/MC/MCAsmStreamer.cpp (original)
> >> >> +++ llvm/trunk/lib/MC/MCAsmStreamer.cpp Wed Jun  6 02:40:06 2018
> >> >> @@ -315,7 +315,8 @@ public:
> >> >>    void EmitBundleUnlock() override;
> >> >>
> >> >>    bool EmitRelocDirective(const MCExpr &Offset, StringRef Name,
> >> >> -                          const MCExpr *Expr, SMLoc Loc) override;
> >> >> +                          const MCExpr *Expr, SMLoc Loc,
> >> >> +                          const MCSubtargetInfo &STI) override;
> >> >>
> >> >>    /// If this file is backed by an assembly streamer, this dumps the
> >> >> specified
> >> >>    /// string in the output .s file. This capability is indicated by
> >> >> the
> >> >> @@ -1820,7 +1821,8 @@ void MCAsmStreamer::EmitBundleUnlock() {
> >> >>  }
> >> >>
> >> >>  bool MCAsmStreamer::EmitRelocDirective(const MCExpr &Offset,
> StringRef
> >> >> Name,
> >> >> -                                       const MCExpr *Expr, SMLoc) {
> >> >> +                                       const MCExpr *Expr, SMLoc,
> >> >> +                                       const MCSubtargetInfo &STI) {
> >> >>    OS << "\t.reloc ";
> >> >>    Offset.print(OS, MAI);
> >> >>    OS << ", " << Name;
> >> >>
> >> >> Modified: llvm/trunk/lib/MC/MCAssembler.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAssembler.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/MC/MCAssembler.cpp (original)
> >> >> +++ llvm/trunk/lib/MC/MCAssembler.cpp Wed Jun  6 02:40:06 2018
> >> >> @@ -805,12 +805,17 @@ void MCAssembler::layout(MCAsmLayout &La
> >> >>          continue;
> >> >>        ArrayRef<MCFixup> Fixups;
> >> >>        MutableArrayRef<char> Contents;
> >> >> +      const MCSubtargetInfo *STI = nullptr;
> >> >>        if (auto *FragWithFixups = dyn_cast<MCDataFragment>(&Frag)) {
> >> >>          Fixups = FragWithFixups->getFixups();
> >> >>          Contents = FragWithFixups->getContents();
> >> >> +        STI = FragWithFixups->getSubtargetInfo();
> >> >> +        assert(!FragWithFixups->hasInstructions() || STI !=
> nullptr);
> >> >>        } else if (auto *FragWithFixups =
> >> >> dyn_cast<MCRelaxableFragment>(&Frag)) {
> >> >>          Fixups = FragWithFixups->getFixups();
> >> >>          Contents = FragWithFixups->getContents();
> >> >> +        STI = FragWithFixups->getSubtargetInfo();
> >> >> +        assert(!FragWithFixups->hasInstructions() || STI !=
> nullptr);
> >> >>        } else if (auto *FragWithFixups =
> >> >> dyn_cast<MCCVDefRangeFragment>(&Frag)) {
> >> >>          Fixups = FragWithFixups->getFixups();
> >> >>          Contents = FragWithFixups->getContents();
> >> >> @@ -823,7 +828,7 @@ void MCAssembler::layout(MCAsmLayout &La
> >> >>          std::tie(Target, FixedValue, IsResolved) =
> >> >>              handleFixup(Layout, Frag, Fixup);
> >> >>          getBackend().applyFixup(*this, Fixup, Target, Contents,
> >> >> FixedValue,
> >> >> -                                IsResolved);
> >> >> +                                IsResolved, STI);
> >> >>        }
> >> >>      }
> >> >>    }
> >> >> @@ -860,7 +865,7 @@ bool MCAssembler::fragmentNeedsRelaxatio
> >> >>    // If this inst doesn't ever need relaxation, ignore it. This
> occurs
> >> >> when we
> >> >>    // are intentionally pushing out inst fragments, or because we
> >> >> relaxed
> >> >> a
> >> >>    // previous instruction to one that doesn't need relaxation.
> >> >> -  if (!getBackend().mayNeedRelaxation(F->getInst()))
> >> >> +  if (!getBackend().mayNeedRelaxation(F->getInst(),
> >> >> *F->getSubtargetInfo()))
> >> >>      return false;
> >> >>
> >> >>    for (const MCFixup &Fixup : F->getFixups())
> >> >> @@ -885,7 +890,7 @@ bool MCAssembler::relaxInstruction(MCAsm
> >> >>    // Relax the fragment.
> >> >>
> >> >>    MCInst Relaxed;
> >> >> -  getBackend().relaxInstruction(F.getInst(), F.getSubtargetInfo(),
> >> >> Relaxed);
> >> >> +  getBackend().relaxInstruction(F.getInst(), *F.getSubtargetInfo(),
> >> >> Relaxed);
> >> >>
> >> >>    // Encode the new instruction.
> >> >>    //
> >> >> @@ -894,7 +899,7 @@ bool MCAssembler::relaxInstruction(MCAsm
> >> >>    SmallVector<MCFixup, 4> Fixups;
> >> >>    SmallString<256> Code;
> >> >>    raw_svector_ostream VecOS(Code);
> >> >> -  getEmitter().encodeInstruction(Relaxed, VecOS, Fixups,
> >> >> F.getSubtargetInfo());
> >> >> +  getEmitter().encodeInstruction(Relaxed, VecOS, Fixups,
> >> >> *F.getSubtargetInfo());
> >> >>
> >> >>    // Update the fragment.
> >> >>    F.setInst(Relaxed);
> >> >>
> >> >> Modified: llvm/trunk/lib/MC/MCELFStreamer.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCELFStreamer.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/MC/MCELFStreamer.cpp (original)
> >> >> +++ llvm/trunk/lib/MC/MCELFStreamer.cpp Wed Jun  6 02:40:06 2018
> >> >> @@ -83,7 +83,8 @@ void MCELFStreamer::mergeFragment(MCData
> >> >>                                   DF->getContents().size());
> >> >>      DF->getFixups().push_back(EF->getFixups()[i]);
> >> >>    }
> >> >> -  DF->setHasInstructions(true);
> >> >> +  if (DF->getSubtargetInfo() == nullptr && EF->getSubtargetInfo())
> >> >> +    DF->setHasInstructions(*EF->getSubtargetInfo());
> >> >>    DF->getContents().append(EF->getContents().begin(),
> >> >> EF->getContents().end());
> >> >>  }
> >> >>
> >> >> @@ -493,6 +494,15 @@ void MCELFStreamer::EmitInstToFragment(c
> >> >>      fixSymbolsInTLSFixups(F.getFixups()[i].getValue());
> >> >>  }
> >> >>
> >> >> +// A fragment can only have one Subtarget, and when bundling is
> >> >> enabled
> >> >> we
> >> >> +// sometimes need to use the same fragment. We give an error if
> there
> >> >> +// are conflicting Subtargets.
> >> >> +static void CheckBundleSubtargets(const MCSubtargetInfo *OldSTI,
> >> >> +                                  const MCSubtargetInfo *NewSTI) {
> >> >> +  if (OldSTI && NewSTI && OldSTI != NewSTI)
> >> >> +    report_fatal_error("A Bundle can only have one Subtarget.");
> >> >> +}
> >> >> +
> >> >>  void MCELFStreamer::EmitInstToData(const MCInst &Inst,
> >> >>                                     const MCSubtargetInfo &STI) {
> >> >>    MCAssembler &Assembler = getAssembler();
> >> >> @@ -508,7 +518,7 @@ void MCELFStreamer::EmitInstToData(const
> >> >>    //
> >> >>    // If bundling is disabled, append the encoded instruction to the
> >> >> current data
> >> >>    // fragment (or create a new such fragment if the current fragment
> >> >> is
> >> >> not a
> >> >> -  // data fragment).
> >> >> +  // data fragment, or the Subtarget has changed).
> >> >>    //
> >> >>    // If bundling is enabled:
> >> >>    // - If we're not in a bundle-locked group, emit the instruction
> >> >> into a
> >> >> @@ -523,19 +533,23 @@ void MCELFStreamer::EmitInstToData(const
> >> >>
> >> >>    if (Assembler.isBundlingEnabled()) {
> >> >>      MCSection &Sec = *getCurrentSectionOnly();
> >> >> -    if (Assembler.getRelaxAll() && isBundleLocked())
> >> >> +    if (Assembler.getRelaxAll() && isBundleLocked()) {
> >> >>        // If the -mc-relax-all flag is used and we are bundle-locked,
> >> >> we
> >> >> re-use
> >> >>        // the current bundle group.
> >> >>        DF = BundleGroups.back();
> >> >> +      CheckBundleSubtargets(DF->getSubtargetInfo(), &STI);
> >> >> +    }
> >> >>      else if (Assembler.getRelaxAll() && !isBundleLocked())
> >> >>        // When not in a bundle-locked group and the -mc-relax-all
> flag
> >> >> is
> >> >> used,
> >> >>        // we create a new temporary fragment which will be later
> merged
> >> >> into
> >> >>        // the current fragment.
> >> >>        DF = new MCDataFragment();
> >> >> -    else if (isBundleLocked() &&
> !Sec.isBundleGroupBeforeFirstInst())
> >> >> +    else if (isBundleLocked() &&
> !Sec.isBundleGroupBeforeFirstInst())
> >> >> {
> >> >>        // If we are bundle-locked, we re-use the current fragment.
> >> >>        // The bundle-locking directive ensures this is a new data
> >> >> fragment.
> >> >>        DF = cast<MCDataFragment>(getCurrentFragment());
> >> >> +      CheckBundleSubtargets(DF->getSubtargetInfo(), &STI);
> >> >> +    }
> >> >>      else if (!isBundleLocked() && Fixups.size() == 0) {
> >> >>        // Optimize memory usage by emitting the instruction to a
> >> >>        // MCCompactEncodedInstFragment when not in a bundle-locked
> >> >> group
> >> >> and
> >> >> @@ -560,7 +574,7 @@ void MCELFStreamer::EmitInstToData(const
> >> >>      // to be turned off.
> >> >>      Sec.setBundleGroupBeforeFirstInst(false);
> >> >>    } else {
> >> >> -    DF = getOrCreateDataFragment();
> >> >> +    DF = getOrCreateDataFragment(&STI);
> >> >>    }
> >> >>
> >> >>    // Add the fixups and data.
> >> >> @@ -568,12 +582,12 @@ void MCELFStreamer::EmitInstToData(const
> >> >>      Fixups[i].setOffset(Fixups[i].getOffset() +
> >> >> DF->getContents().size());
> >> >>      DF->getFixups().push_back(Fixups[i]);
> >> >>    }
> >> >> -  DF->setHasInstructions(true);
> >> >> +  DF->setHasInstructions(STI);
> >> >>    DF->getContents().append(Code.begin(), Code.end());
> >> >>
> >> >>    if (Assembler.isBundlingEnabled() && Assembler.getRelaxAll()) {
> >> >>      if (!isBundleLocked()) {
> >> >> -      mergeFragment(getOrCreateDataFragment(), DF);
> >> >> +      mergeFragment(getOrCreateDataFragment(&STI), DF);
> >> >>        delete DF;
> >> >>      }
> >> >>    }
> >> >> @@ -633,7 +647,7 @@ void MCELFStreamer::EmitBundleUnlock() {
> >> >>
> >> >>      // FIXME: Use more separate fragments for nested groups.
> >> >>      if (!isBundleLocked()) {
> >> >> -      mergeFragment(getOrCreateDataFragment(), DF);
> >> >> +      mergeFragment(getOrCreateDataFragment(DF->getSubtargetInfo()),
> >> >> DF);
> >> >>        BundleGroups.pop_back();
> >> >>        delete DF;
> >> >>      }
> >> >>
> >> >> Modified: llvm/trunk/lib/MC/MCMachOStreamer.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCMachOStreamer.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/MC/MCMachOStreamer.cpp (original)
> >> >> +++ llvm/trunk/lib/MC/MCMachOStreamer.cpp Wed Jun  6 02:40:06 2018
> >> >> @@ -450,6 +450,7 @@ void MCMachOStreamer::EmitInstToData(con
> >> >>      Fixup.setOffset(Fixup.getOffset() + DF->getContents().size());
> >> >>      DF->getFixups().push_back(Fixup);
> >> >>    }
> >> >> +  DF->setHasInstructions(STI);
> >> >>    DF->getContents().append(Code.begin(), Code.end());
> >> >>  }
> >> >>
> >> >>
> >> >> Modified: llvm/trunk/lib/MC/MCObjectStreamer.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectStreamer.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/MC/MCObjectStreamer.cpp (original)
> >> >> +++ llvm/trunk/lib/MC/MCObjectStreamer.cpp Wed Jun  6 02:40:06 2018
> >> >> @@ -146,12 +146,24 @@ MCFragment *MCObjectStreamer::getCurrent
> >> >>    return nullptr;
> >> >>  }
> >> >>
> >> >> -MCDataFragment *MCObjectStreamer::getOrCreateDataFragment() {
> >> >> -  MCDataFragment *F =
> >> >> dyn_cast_or_null<MCDataFragment>(getCurrentFragment());
> >> >> +static bool CanReuseDataFragment(const MCDataFragment &F,
> >> >> +                                 const MCAssembler &Assembler,
> >> >> +                                 const MCSubtargetInfo *STI) {
> >> >> +  if (!F.hasInstructions())
> >> >> +    return true;
> >> >>    // When bundling is enabled, we don't want to add data to a
> fragment
> >> >> that
> >> >>    // already has instructions (see MCELFStreamer::EmitInstToData for
> >> >> details)
> >> >> -  if (!F || (Assembler->isBundlingEnabled() &&
> >> >> !Assembler->getRelaxAll()
> >> >> &&
> >> >> -             F->hasInstructions())) {
> >> >> +  if (Assembler.isBundlingEnabled())
> >> >> +    return Assembler.getRelaxAll();
> >> >> +  // If the subtarget is changed mid fragment we start a new
> fragment
> >> >> to
> >> >> record
> >> >> +  // the new STI.
> >> >> +  return !STI || F.getSubtargetInfo() == STI;
> >> >> +}
> >> >> +
> >> >> +MCDataFragment *
> >> >> +MCObjectStreamer::getOrCreateDataFragment(const MCSubtargetInfo
> *STI)
> >> >> {
> >> >> +  MCDataFragment *F =
> >> >> dyn_cast_or_null<MCDataFragment>(getCurrentFragment());
> >> >> +  if (!F || !CanReuseDataFragment(*F, *Assembler, STI)) {
> >> >>      F = new MCDataFragment();
> >> >>      insert(F);
> >> >>    }
> >> >> @@ -327,7 +339,7 @@ void MCObjectStreamer::EmitInstructionIm
> >> >>
> >> >>    // If this instruction doesn't need relaxation, just emit it as
> >> >> data.
> >> >>    MCAssembler &Assembler = getAssembler();
> >> >> -  if (!Assembler.getBackend().mayNeedRelaxation(Inst)) {
> >> >> +  if (!Assembler.getBackend().mayNeedRelaxation(Inst, STI)) {
> >> >>      EmitInstToData(Inst, STI);
> >> >>      return;
> >> >>    }
> >> >> @@ -341,7 +353,7 @@ void MCObjectStreamer::EmitInstructionIm
> >> >>        (Assembler.isBundlingEnabled() && Sec->isBundleLocked())) {
> >> >>      MCInst Relaxed;
> >> >>      getAssembler().getBackend().relaxInstruction(Inst, STI,
> Relaxed);
> >> >> -    while (getAssembler().getBackend().mayNeedRelaxation(Relaxed))
> >> >> +    while (getAssembler().getBackend().mayNeedRelaxation(Relaxed,
> >> >> STI))
> >> >>        getAssembler().getBackend().relaxInstruction(Relaxed, STI,
> >> >> Relaxed);
> >> >>      EmitInstToData(Relaxed, STI);
> >> >>      return;
> >> >> @@ -606,7 +618,8 @@ void MCObjectStreamer::EmitGPRel64Value(
> >> >>  }
> >> >>
> >> >>  bool MCObjectStreamer::EmitRelocDirective(const MCExpr &Offset,
> >> >> StringRef
> >> >> Name,
> >> >> -                                          const MCExpr *Expr, SMLoc
> >> >> Loc)
> >> >> {
> >> >> +                                          const MCExpr *Expr, SMLoc
> >> >> Loc,
> >> >> +                                          const MCSubtargetInfo
> &STI)
> >> >> {
> >> >>    int64_t OffsetValue;
> >> >>    if (!Offset.evaluateAsAbsolute(OffsetValue))
> >> >>      llvm_unreachable("Offset is not absolute");
> >> >> @@ -614,7 +627,7 @@ bool MCObjectStreamer::EmitRelocDirectiv
> >> >>    if (OffsetValue < 0)
> >> >>      llvm_unreachable("Offset is negative");
> >> >>
> >> >> -  MCDataFragment *DF = getOrCreateDataFragment();
> >> >> +  MCDataFragment *DF = getOrCreateDataFragment(&STI);
> >> >>    flushPendingLabels(DF, DF->getContents().size());
> >> >>
> >> >>    Optional<MCFixupKind> MaybeKind =
> >> >> Assembler->getBackend().getFixupKind(Name);
> >> >>
> >> >> Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
> >> >> +++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Wed Jun  6 02:40:06 2018
> >> >> @@ -2949,7 +2949,9 @@ bool AsmParser::parseDirectiveReloc(SMLo
> >> >>                   "unexpected token in .reloc directive"))
> >> >>        return true;
> >> >>
> >> >> -  if (getStreamer().EmitRelocDirective(*Offset, Name, Expr,
> >> >> DirectiveLoc))
> >> >> +  const MCTargetAsmParser &MCT = getTargetParser();
> >> >> +  const MCSubtargetInfo &STI = MCT.getSTI();
> >> >> +  if (getStreamer().EmitRelocDirective(*Offset, Name, Expr,
> >> >> DirectiveLoc,
> >> >> STI))
> >> >>      return Error(NameLoc, "unknown relocation name");
> >> >>
> >> >>    return false;
> >> >>
> >> >> Modified: llvm/trunk/lib/MC/MCWasmStreamer.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCWasmStreamer.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/MC/MCWasmStreamer.cpp (original)
> >> >> +++ llvm/trunk/lib/MC/MCWasmStreamer.cpp Wed Jun  6 02:40:06 2018
> >> >> @@ -45,7 +45,8 @@ void MCWasmStreamer::mergeFragment(MCDat
> >> >>                                   DF->getContents().size());
> >> >>      DF->getFixups().push_back(EF->getFixups()[i]);
> >> >>    }
> >> >> -  DF->setHasInstructions(true);
> >> >> +  if (DF->getSubtargetInfo() == nullptr && EF->getSubtargetInfo())
> >> >> +    DF->setHasInstructions(*EF->getSubtargetInfo());
> >> >>    DF->getContents().append(EF->getContents().begin(),
> >> >> EF->getContents().end());
> >> >>  }
> >> >>
> >> >> @@ -183,7 +184,7 @@ void MCWasmStreamer::EmitInstToData(cons
> >> >>      Fixups[i].setOffset(Fixups[i].getOffset() +
> >> >> DF->getContents().size());
> >> >>      DF->getFixups().push_back(Fixups[i]);
> >> >>    }
> >> >> -  DF->setHasInstructions(true);
> >> >> +  DF->setHasInstructions(STI);
> >> >>    DF->getContents().append(Code.begin(), Code.end());
> >> >>  }
> >> >>
> >> >>
> >> >> Modified: llvm/trunk/lib/MC/MCWinCOFFStreamer.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCWinCOFFStreamer.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/MC/MCWinCOFFStreamer.cpp (original)
> >> >> +++ llvm/trunk/lib/MC/MCWinCOFFStreamer.cpp Wed Jun  6 02:40:06 2018
> >> >> @@ -63,7 +63,7 @@ void MCWinCOFFStreamer::EmitInstToData(c
> >> >>      Fixups[i].setOffset(Fixups[i].getOffset() +
> >> >> DF->getContents().size());
> >> >>      DF->getFixups().push_back(Fixups[i]);
> >> >>    }
> >> >> -
> >> >> +  DF->setHasInstructions(STI);
> >> >>    DF->getContents().append(Code.begin(), Code.end());
> >> >>  }
> >> >>
> >> >>
> >> >> Modified:
> >> >> llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
> >> >> (original)
> >> >> +++ llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
> >> >> Wed
> >> >> Jun  6 02:40:06 2018
> >> >> @@ -73,9 +73,11 @@ public:
> >> >>
> >> >>    void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
> >> >>                    const MCValue &Target, MutableArrayRef<char> Data,
> >> >> -                  uint64_t Value, bool IsResolved) const override;
> >> >> +                  uint64_t Value, bool IsResolved,
> >> >> +                  const MCSubtargetInfo *STI) const override;
> >> >>
> >> >> -  bool mayNeedRelaxation(const MCInst &Inst) const override;
> >> >> +  bool mayNeedRelaxation(const MCInst &Inst,
> >> >> +                         const MCSubtargetInfo &STI) const override;
> >> >>    bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value,
> >> >>                              const MCRelaxableFragment *DF,
> >> >>                              const MCAsmLayout &Layout) const
> override;
> >> >> @@ -285,7 +287,8 @@ unsigned AArch64AsmBackend::getFixupKind
> >> >>  void AArch64AsmBackend::applyFixup(const MCAssembler &Asm, const
> >> >> MCFixup
> >> >> &Fixup,
> >> >>                                     const MCValue &Target,
> >> >>                                     MutableArrayRef<char> Data,
> >> >> uint64_t
> >> >> Value,
> >> >> -                                   bool IsResolved) const {
> >> >> +                                   bool IsResolved,
> >> >> +                                   const MCSubtargetInfo *STI)
> const {
> >> >>    unsigned NumBytes = getFixupKindNumBytes(Fixup.getKind());
> >> >>    if (!Value)
> >> >>      return; // Doesn't change encoding.
> >> >> @@ -321,7 +324,8 @@ void AArch64AsmBackend::applyFixup(const
> >> >>    }
> >> >>  }
> >> >>
> >> >> -bool AArch64AsmBackend::mayNeedRelaxation(const MCInst &Inst) const
> {
> >> >> +bool AArch64AsmBackend::mayNeedRelaxation(const MCInst &Inst,
> >> >> +                                          const MCSubtargetInfo
> &STI)
> >> >> const {
> >> >>    return false;
> >> >>  }
> >> >>
> >> >>
> >> >> Modified:
> >> >> llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUAsmBackend.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUAsmBackend.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUAsmBackend.cpp
> >> >> (original)
> >> >> +++ llvm/trunk/lib/Target/AMDGPU/MCTargetDesc/AMDGPUAsmBackend.cpp
> Wed
> >> >> Jun
> >> >> 6 02:40:06 2018
> >> >> @@ -32,7 +32,8 @@ public:
> >> >>
> >> >>    void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
> >> >>                    const MCValue &Target, MutableArrayRef<char> Data,
> >> >> -                  uint64_t Value, bool IsResolved) const override;
> >> >> +                  uint64_t Value, bool IsResolved,
> >> >> +                  const MCSubtargetInfo *STI) const override;
> >> >>    bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value,
> >> >>                              const MCRelaxableFragment *DF,
> >> >>                              const MCAsmLayout &Layout) const
> override
> >> >> {
> >> >> @@ -42,7 +43,10 @@ public:
> >> >>                          MCInst &Res) const override {
> >> >>      llvm_unreachable("Not implemented");
> >> >>    }
> >> >> -  bool mayNeedRelaxation(const MCInst &Inst) const override { return
> >> >> false; }
> >> >> +  bool mayNeedRelaxation(const MCInst &Inst,
> >> >> +                         const MCSubtargetInfo &STI) const override
> {
> >> >> +    return false;
> >> >> +  }
> >> >>
> >> >>    unsigned getMinimumNopSize() const override;
> >> >>    bool writeNopData(raw_ostream &OS, uint64_t Count) const override;
> >> >> @@ -102,7 +106,8 @@ static uint64_t adjustFixupValue(const M
> >> >>  void AMDGPUAsmBackend::applyFixup(const MCAssembler &Asm, const
> >> >> MCFixup
> >> >> &Fixup,
> >> >>                                    const MCValue &Target,
> >> >>                                    MutableArrayRef<char> Data,
> uint64_t
> >> >> Value,
> >> >> -                                  bool IsResolved) const {
> >> >> +                                  bool IsResolved,
> >> >> +                                  const MCSubtargetInfo *STI) const
> {
> >> >>    Value = adjustFixupValue(Fixup, Value, &Asm.getContext());
> >> >>    if (!Value)
> >> >>      return; // Doesn't change encoding.
> >> >>
> >> >> Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp
> (original)
> >> >> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.cpp Wed
> Jun  6
> >> >> 02:40:06 2018
> >> >> @@ -173,7 +173,8 @@ void ARMAsmBackend::handleAssemblerFlag(
> >> >>    }
> >> >>  }
> >> >>
> >> >> -unsigned ARMAsmBackend::getRelaxedOpcode(unsigned Op) const {
> >> >> +unsigned ARMAsmBackend::getRelaxedOpcode(unsigned Op,
> >> >> +                                         const MCSubtargetInfo &STI)
> >> >> const {
> >> >>    bool HasThumb2 = STI.getFeatureBits()[ARM::FeatureThumb2];
> >> >>    bool HasV8MBaselineOps =
> >> >> STI.getFeatureBits()[ARM::HasV8MBaselineOps];
> >> >>
> >> >> @@ -195,8 +196,9 @@ unsigned ARMAsmBackend::getRelaxedOpcode
> >> >>    }
> >> >>  }
> >> >>
> >> >> -bool ARMAsmBackend::mayNeedRelaxation(const MCInst &Inst) const {
> >> >> -  if (getRelaxedOpcode(Inst.getOpcode()) != Inst.getOpcode())
> >> >> +bool ARMAsmBackend::mayNeedRelaxation(const MCInst &Inst,
> >> >> +                                      const MCSubtargetInfo &STI)
> >> >> const {
> >> >> +  if (getRelaxedOpcode(Inst.getOpcode(), STI) != Inst.getOpcode())
> >> >>      return true;
> >> >>    return false;
> >> >>  }
> >> >> @@ -263,7 +265,7 @@ bool ARMAsmBackend::fixupNeedsRelaxation
> >> >>  void ARMAsmBackend::relaxInstruction(const MCInst &Inst,
> >> >>                                       const MCSubtargetInfo &STI,
> >> >>                                       MCInst &Res) const {
> >> >> -  unsigned RelaxedOp = getRelaxedOpcode(Inst.getOpcode());
> >> >> +  unsigned RelaxedOp = getRelaxedOpcode(Inst.getOpcode(), STI);
> >> >>
> >> >>    // Sanity check w/ diagnostic if we get here w/ a bogus
> instruction.
> >> >>    if (RelaxedOp == Inst.getOpcode()) {
> >> >> @@ -360,7 +362,8 @@ static uint32_t joinHalfWords(uint32_t F
> >> >>  unsigned ARMAsmBackend::adjustFixupValue(const MCAssembler &Asm,
> >> >>                                           const MCFixup &Fixup,
> >> >>                                           const MCValue &Target,
> >> >> uint64_t
> >> >> Value,
> >> >> -                                         bool IsResolved, MCContext
> >> >> &Ctx)
> >> >> const {
> >> >> +                                         bool IsResolved, MCContext
> >> >> &Ctx,
> >> >> +                                         const MCSubtargetInfo* STI)
> >> >> const {
> >> >>    unsigned Kind = Fixup.getKind();
> >> >>
> >> >>    // MachO tries to make .o files that look vaguely pre-linked, so
> for
> >> >> MOVW/MOVT
> >> >> @@ -389,7 +392,8 @@ unsigned ARMAsmBackend::adjustFixupValue
> >> >>    case FK_SecRel_4:
> >> >>      return Value;
> >> >>    case ARM::fixup_arm_movt_hi16:
> >> >> -    if (IsResolved || !STI.getTargetTriple().isOSBinFormatELF())
> >> >> +    assert(STI != nullptr);
> >> >> +    if (IsResolved || !STI->getTargetTriple().isOSBinFormatELF())
> >> >>        Value >>= 16;
> >> >>      LLVM_FALLTHROUGH;
> >> >>    case ARM::fixup_arm_movw_lo16: {
> >> >> @@ -401,7 +405,8 @@ unsigned ARMAsmBackend::adjustFixupValue
> >> >>      return Value;
> >> >>    }
> >> >>    case ARM::fixup_t2_movt_hi16:
> >> >> -    if (IsResolved || !STI.getTargetTriple().isOSBinFormatELF())
> >> >> +    assert(STI != nullptr);
> >> >> +    if (IsResolved || !STI->getTargetTriple().isOSBinFormatELF())
> >> >>        Value >>= 16;
> >> >>      LLVM_FALLTHROUGH;
> >> >>    case ARM::fixup_t2_movw_lo16: {
> >> >> @@ -529,9 +534,9 @@ unsigned ARMAsmBackend::adjustFixupValue
> >> >>    }
> >> >>    case ARM::fixup_arm_thumb_bl: {
> >> >>      if (!isInt<25>(Value - 4) ||
> >> >> -        (!STI.getFeatureBits()[ARM::FeatureThumb2] &&
> >> >> -         !STI.getFeatureBits()[ARM::HasV8MBaselineOps] &&
> >> >> -         !STI.getFeatureBits()[ARM::HasV6MOps] &&
> >> >> +        (!STI->getFeatureBits()[ARM::FeatureThumb2] &&
> >> >> +         !STI->getFeatureBits()[ARM::HasV8MBaselineOps] &&
> >> >> +         !STI->getFeatureBits()[ARM::HasV6MOps] &&
> >> >>           !isInt<23>(Value - 4))) {
> >> >>        Ctx.reportError(Fixup.getLoc(), "Relocation out of range");
> >> >>        return 0;
> >> >> @@ -603,7 +608,8 @@ unsigned ARMAsmBackend::adjustFixupValue
> >> >>    case ARM::fixup_arm_thumb_cp:
> >> >>      // On CPUs supporting Thumb2, this will be relaxed to an ldr.w,
> >> >> otherwise we
> >> >>      // could have an error on our hands.
> >> >> -    if (!STI.getFeatureBits()[ARM::FeatureThumb2] && IsResolved) {
> >> >> +    assert(STI != nullptr);
> >> >> +    if (!STI->getFeatureBits()[ARM::FeatureThumb2] && IsResolved) {
> >> >>        const char *FixupDiagnostic = reasonForFixupRelaxation(Fixup,
> >> >> Value);
> >> >>        if (FixupDiagnostic) {
> >> >>          Ctx.reportError(Fixup.getLoc(), FixupDiagnostic);
> >> >> @@ -627,8 +633,9 @@ unsigned ARMAsmBackend::adjustFixupValue
> >> >>    }
> >> >>    case ARM::fixup_arm_thumb_br:
> >> >>      // Offset by 4 and don't encode the lower bit, which is always
> 0.
> >> >> -    if (!STI.getFeatureBits()[ARM::FeatureThumb2] &&
> >> >> -        !STI.getFeatureBits()[ARM::HasV8MBaselineOps]) {
> >> >> +    assert(STI != nullptr);
> >> >> +    if (!STI->getFeatureBits()[ARM::FeatureThumb2] &&
> >> >> +        !STI->getFeatureBits()[ARM::HasV8MBaselineOps]) {
> >> >>        const char *FixupDiagnostic = reasonForFixupRelaxation(Fixup,
> >> >> Value);
> >> >>        if (FixupDiagnostic) {
> >> >>          Ctx.reportError(Fixup.getLoc(), FixupDiagnostic);
> >> >> @@ -638,7 +645,8 @@ unsigned ARMAsmBackend::adjustFixupValue
> >> >>      return ((Value - 4) >> 1) & 0x7ff;
> >> >>    case ARM::fixup_arm_thumb_bcc:
> >> >>      // Offset by 4 and don't encode the lower bit, which is always
> 0.
> >> >> -    if (!STI.getFeatureBits()[ARM::FeatureThumb2]) {
> >> >> +    assert(STI != nullptr);
> >> >> +    if (!STI->getFeatureBits()[ARM::FeatureThumb2]) {
> >> >>        const char *FixupDiagnostic = reasonForFixupRelaxation(Fixup,
> >> >> Value);
> >> >>        if (FixupDiagnostic) {
> >> >>          Ctx.reportError(Fixup.getLoc(), FixupDiagnostic);
> >> >> @@ -894,10 +902,11 @@ static unsigned getFixupKindContainerSiz
> >> >>  void ARMAsmBackend::applyFixup(const MCAssembler &Asm, const MCFixup
> >> >> &Fixup,
> >> >>                                 const MCValue &Target,
> >> >>                                 MutableArrayRef<char> Data, uint64_t
> >> >> Value,
> >> >> -                               bool IsResolved) const {
> >> >> +                               bool IsResolved,
> >> >> +                               const MCSubtargetInfo* STI) const {
> >> >>    unsigned NumBytes = getFixupKindNumBytes(Fixup.getKind());
> >> >>    MCContext &Ctx = Asm.getContext();
> >> >> -  Value = adjustFixupValue(Asm, Fixup, Target, Value, IsResolved,
> >> >> Ctx);
> >> >> +  Value = adjustFixupValue(Asm, Fixup, Target, Value, IsResolved,
> Ctx,
> >> >> STI);
> >> >>    if (!Value)
> >> >>      return; // Doesn't change encoding.
> >> >>
> >> >>
> >> >> Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.h
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.h?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.h (original)
> >> >> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMAsmBackend.h Wed Jun  6
> >> >> 02:40:06 2018
> >> >> @@ -19,6 +19,9 @@
> >> >>  namespace llvm {
> >> >>
> >> >>  class ARMAsmBackend : public MCAsmBackend {
> >> >> +  // The STI from the target triple the MCAsmBackend was
> instantiated
> >> >> with
> >> >> +  // note that MCFragments may have a different local STI that
> should
> >> >> be
> >> >> +  // used in preference.
> >> >>    const MCSubtargetInfo &STI;
> >> >>    bool isThumbMode;    // Currently emitting Thumb code.
> >> >>  public:
> >> >> @@ -31,6 +34,8 @@ public:
> >> >>      return ARM::NumTargetFixupKinds;
> >> >>    }
> >> >>
> >> >> +  // FIXME: this should be calculated per fragment as the STI may be
> >> >> +  // different.
> >> >>    bool hasNOP() const { return
> STI.getFeatureBits()[ARM::HasV6T2Ops];
> >> >> }
> >> >>
> >> >>    const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const
> >> >> override;
> >> >> @@ -40,15 +45,18 @@ public:
> >> >>
> >> >>    unsigned adjustFixupValue(const MCAssembler &Asm, const MCFixup
> >> >> &Fixup,
> >> >>                              const MCValue &Target, uint64_t Value,
> >> >> -                            bool IsResolved, MCContext &Ctx) const;
> >> >> +                            bool IsResolved, MCContext &Ctx,
> >> >> +                            const MCSubtargetInfo *STI) const;
> >> >>
> >> >>    void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
> >> >>                    const MCValue &Target, MutableArrayRef<char> Data,
> >> >> -                  uint64_t Value, bool IsResolved) const override;
> >> >> +                  uint64_t Value, bool IsResolved,
> >> >> +                  const MCSubtargetInfo *STI) const override;
> >> >>
> >> >> -  unsigned getRelaxedOpcode(unsigned Op) const;
> >> >> +  unsigned getRelaxedOpcode(unsigned Op, const MCSubtargetInfo &STI)
> >> >> const;
> >> >>
> >> >> -  bool mayNeedRelaxation(const MCInst &Inst) const override;
> >> >> +  bool mayNeedRelaxation(const MCInst &Inst,
> >> >> +                         const MCSubtargetInfo &STI) const override;
> >> >>
> >> >>    const char *reasonForFixupRelaxation(const MCFixup &Fixup,
> >> >>                                         uint64_t Value) const;
> >> >>
> >> >> Modified: llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp
> (original)
> >> >> +++ llvm/trunk/lib/Target/BPF/MCTargetDesc/BPFAsmBackend.cpp Wed
> Jun  6
> >> >> 02:40:06 2018
> >> >> @@ -27,7 +27,8 @@ public:
> >> >>
> >> >>    void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
> >> >>                    const MCValue &Target, MutableArrayRef<char> Data,
> >> >> -                  uint64_t Value, bool IsResolved) const override;
> >> >> +                  uint64_t Value, bool IsResolved,
> >> >> +                  const MCSubtargetInfo *STI) const override;
> >> >>
> >> >>    std::unique_ptr<MCObjectTargetWriter>
> >> >>    createObjectTargetWriter() const override;
> >> >> @@ -41,7 +42,10 @@ public:
> >> >>
> >> >>    unsigned getNumFixupKinds() const override { return 1; }
> >> >>
> >> >> -  bool mayNeedRelaxation(const MCInst &Inst) const override { return
> >> >> false; }
> >> >> +  bool mayNeedRelaxation(const MCInst &Inst,
> >> >> +                         const MCSubtargetInfo &STI) const override
> {
> >> >> +    return false;
> >> >> +  }
> >> >>
> >> >>    void relaxInstruction(const MCInst &Inst, const MCSubtargetInfo
> >> >> &STI,
> >> >>                          MCInst &Res) const override {}
> >> >> @@ -64,7 +68,8 @@ bool BPFAsmBackend::writeNopData(raw_ost
> >> >>  void BPFAsmBackend::applyFixup(const MCAssembler &Asm, const MCFixup
> >> >> &Fixup,
> >> >>                                 const MCValue &Target,
> >> >>                                 MutableArrayRef<char> Data, uint64_t
> >> >> Value,
> >> >> -                               bool IsResolved) const {
> >> >> +                               bool IsResolved,
> >> >> +                               const MCSubtargetInfo *STI) const {
> >> >>    if (Fixup.getKind() == FK_SecRel_4 || Fixup.getKind() ==
> >> >> FK_SecRel_8) {
> >> >>      assert(Value == 0);
> >> >>    } else if (Fixup.getKind() == FK_Data_4) {
> >> >>
> >> >> Modified:
> >> >> llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp
> >> >> (original)
> >> >> +++ llvm/trunk/lib/Target/Hexagon/MCTargetDesc/HexagonAsmBackend.cpp
> >> >> Wed
> >> >> Jun  6 02:40:06 2018
> >> >> @@ -51,7 +51,7 @@ class HexagonAsmBackend : public MCAsmBa
> >> >>      SmallVector<MCFixup, 4> Fixups;
> >> >>      SmallString<256> Code;
> >> >>      raw_svector_ostream VecOS(Code);
> >> >> -    E.encodeInstruction(HMB, VecOS, Fixups, RF.getSubtargetInfo());
> >> >> +    E.encodeInstruction(HMB, VecOS, Fixups, *RF.getSubtargetInfo());
> >> >>
> >> >>      // Update the fragment.
> >> >>      RF.setInst(HMB);
> >> >> @@ -414,7 +414,8 @@ public:
> >> >>    /// fixup kind as appropriate.
> >> >>    void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
> >> >>                    const MCValue &Target, MutableArrayRef<char> Data,
> >> >> -                  uint64_t FixupValue, bool IsResolved) const
> override
> >> >> {
> >> >> +                  uint64_t FixupValue, bool IsResolved,
> >> >> +                  const MCSubtargetInfo *STI) const override {
> >> >>
> >> >>      // When FixupValue is 0 the relocation is external and there
> >> >>      // is nothing for us to do.
> >> >> @@ -561,7 +562,8 @@ public:
> >> >>    /// relaxation.
> >> >>    ///
> >> >>    /// \param Inst - The instruction to test.
> >> >> -  bool mayNeedRelaxation(MCInst const &Inst) const override {
> >> >> +  bool mayNeedRelaxation(MCInst const &Inst,
> >> >> +                         const MCSubtargetInfo &STI) const override
> {
> >> >>      return true;
> >> >>    }
> >> >>
> >> >> @@ -736,7 +738,7 @@ public:
> >> >>                  Inst.addOperand(MCOperand::createInst(Nop));
> >> >>                  Size -= 4;
> >> >>                  if (!HexagonMCChecker(
> >> >> -                         Context, *MCII, RF.getSubtargetInfo(),
> Inst,
> >> >> +                         Context, *MCII, *RF.getSubtargetInfo(),
> Inst,
> >> >>                           *Context.getRegisterInfo(), false)
> >> >>                           .check()) {
> >> >>                    Inst.erase(Inst.end() - 1);
> >> >> @@ -744,7 +746,7 @@ public:
> >> >>                  }
> >> >>                }
> >> >>                bool Error = HexagonMCShuffle(Context, true, *MCII,
> >> >> -                                            RF.getSubtargetInfo(),
> >> >> Inst);
> >> >> +                                            *RF.getSubtargetInfo(),
> >> >> Inst);
> >> >>                //assert(!Error);
> >> >>                (void)Error;
> >> >>                ReplaceInstruction(Asm.getEmitter(), RF, Inst);
> >> >>
> >> >> Modified:
> llvm/trunk/lib/Target/Lanai/MCTargetDesc/LanaiAsmBackend.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Lanai/MCTargetDesc/LanaiAsmBackend.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/Target/Lanai/MCTargetDesc/LanaiAsmBackend.cpp
> >> >> (original)
> >> >> +++ llvm/trunk/lib/Target/Lanai/MCTargetDesc/LanaiAsmBackend.cpp Wed
> >> >> Jun
> >> >> 6 02:40:06 2018
> >> >> @@ -51,7 +51,8 @@ public:
> >> >>
> >> >>    void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
> >> >>                    const MCValue &Target, MutableArrayRef<char> Data,
> >> >> -                  uint64_t Value, bool IsResolved) const override;
> >> >> +                  uint64_t Value, bool IsResolved,
> >> >> +                  const MCSubtargetInfo *STI) const override;
> >> >>
> >> >>    std::unique_ptr<MCObjectTargetWriter>
> >> >>    createObjectTargetWriter() const override;
> >> >> @@ -69,7 +70,8 @@ public:
> >> >>      return Lanai::NumTargetFixupKinds;
> >> >>    }
> >> >>
> >> >> -  bool mayNeedRelaxation(const MCInst & /*Inst*/) const override {
> >> >> +  bool mayNeedRelaxation(const MCInst & /*Inst*/,
> >> >> +                         const MCSubtargetInfo &STI) const override
> {
> >> >>      return false;
> >> >>    }
> >> >>
> >> >> @@ -93,7 +95,8 @@ bool LanaiAsmBackend::writeNopData(raw_o
> >> >>  void LanaiAsmBackend::applyFixup(const MCAssembler &Asm, const
> MCFixup
> >> >> &Fixup,
> >> >>                                   const MCValue &Target,
> >> >>                                   MutableArrayRef<char> Data,
> uint64_t
> >> >> Value,
> >> >> -                                 bool /*IsResolved*/) const {
> >> >> +                                 bool /*IsResolved*/,
> >> >> +                                 const MCSubtargetInfo */*STI*/)
> const
> >> >> {
> >> >>    MCFixupKind Kind = Fixup.getKind();
> >> >>    Value = adjustFixupValue(static_cast<unsigned>(Kind), Value);
> >> >>
> >> >>
> >> >> Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp
> >> >> (original)
> >> >> +++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.cpp Wed
> Jun
> >> >> 6
> >> >> 02:40:06 2018
> >> >> @@ -243,7 +243,8 @@ static unsigned calculateMMLEIndex(unsig
> >> >>  void MipsAsmBackend::applyFixup(const MCAssembler &Asm, const
> MCFixup
> >> >> &Fixup,
> >> >>                                  const MCValue &Target,
> >> >>                                  MutableArrayRef<char> Data, uint64_t
> >> >> Value,
> >> >> -                                bool IsResolved) const {
> >> >> +                                bool IsResolved,
> >> >> +                                const MCSubtargetInfo *STI) const {
> >> >>    MCFixupKind Kind = Fixup.getKind();
> >> >>    MCContext &Ctx = Asm.getContext();
> >> >>    Value = adjustFixupValue(Fixup, Value, Ctx);
> >> >>
> >> >> Modified: llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.h
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.h?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.h
> (original)
> >> >> +++ llvm/trunk/lib/Target/Mips/MCTargetDesc/MipsAsmBackend.h Wed
> Jun  6
> >> >> 02:40:06 2018
> >> >> @@ -42,7 +42,8 @@ public:
> >> >>
> >> >>    void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
> >> >>                    const MCValue &Target, MutableArrayRef<char> Data,
> >> >> -                  uint64_t Value, bool IsResolved) const override;
> >> >> +                  uint64_t Value, bool IsResolved,
> >> >> +                  const MCSubtargetInfo *STI) const override;
> >> >>
> >> >>    Optional<MCFixupKind> getFixupKind(StringRef Name) const override;
> >> >>    const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const
> >> >> override;
> >> >> @@ -58,7 +59,8 @@ public:
> >> >>    /// relaxation.
> >> >>    ///
> >> >>    /// \param Inst - The instruction to test.
> >> >> -  bool mayNeedRelaxation(const MCInst &Inst) const override {
> >> >> +  bool mayNeedRelaxation(const MCInst &Inst,
> >> >> +                         const MCSubtargetInfo &STI) const override
> {
> >> >>      return false;
> >> >>    }
> >> >>
> >> >>
> >> >> Modified:
> llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
> >> >> URL:
> >> >>
> >> >>
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp?rev=334078&r1=334077&r2=334078&view=diff
> >> >>
> >> >>
> >> >>
> ==============================================================================
> >> >> --- llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp
> >> >> (original)
> >> >> +++ llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCAsmBackend.cpp Wed
> >> >> Jun
> >> >> 6 02:40:06 2018
> >> >> @@ -117,7 +117,8 @@ public:
> >> >>
> >> >>    void applyFixup(const MCAssembler &Asm, const MCFixup &Fixup,
> >> >>                    const MCValue &Target, MutableArrayRef<char> Data,
> >> >> -                  uint64_t Value, bool IsResolved) const override {
> >> >> +                  uint64_t Value, bool IsResolved,
> >> >> +                  const MCSubtargetInfo *STI) const override {
> >> >>      Value = adjustFixupValue(Fixup.getKind(), Value);
> >> >>      if (!Value) return;           // Doesn't change encoding.
> >> >>
> >> >> @@ -157,7 +158,8 @@ public:
> >> >>      }
> >> >>    }
> >> >>
> >> >> -  bool mayNeedRelaxation(const MCInst &Inst) const override {
> >> >> +  bool mayNeedRelaxation(const MCInst &Inst,
> >> >> +                         const MCSubtargetInfo &STI) const override
> {
> >> >>      // FIXME.
> >> >>      return false;
> >> >>    }
> >> >>
> >> >> Modified:
> llvm/trunk/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp
> >> >> URL:
> >> >>
> >> >> http://llvm.org/viewvc/llvm-p
> <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/Sparc/MCTargetDesc/SparcAsmBackend.cpp?rev=334078&r1=334077&r2=334078&view=diff>



-- 
Regards,
Ilya Biryukov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180606/dc9aa88b/attachment.html>


More information about the llvm-commits mailing list