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

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


The fix is in: r334085

On Wed, Jun 6, 2018 at 1:00 PM Ilya Biryukov <ibiryukov at google.com> wrote:

> 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
>


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


More information about the llvm-commits mailing list