[llvm] r225228 - Revert r225048: It broke ObjC on AArch64.

Lang Hames lhames at gmail.com
Thu Jan 15 15:47:52 PST 2015


Hi Rafael,

Sorry about the delay in testing this. Your patch fixes the issue on my
test case. I think is is good to go back in.

Cheers,
Lang.

On Mon, Jan 5, 2015 at 6:16 PM, Rafael EspĂ­ndola <rafael.espindola at gmail.com
> wrote:

> Hi Lang,
>
> Sorry I missed this earlier.
>
> For context, the patch is based on the discussion in
>
> http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20140203/204111.html
> but it clearly missed an AArch64 case.
>
> Note that the general structure is generic. A target can force any
> used symbol to be kept. In fact, the attached patch is a revised
> version that avoids the crash you reported by forcing relocations with
> cstrigs to be external.
>
> I don't have an AArch64 device, but is there a way to at least cross
> compile and link the test-suite? If not, would you mind giving the
> patch a try?
>
>
> On 5 January 2015 at 19:54, Lang Hames <lhames at gmail.com> wrote:
> > Author: lhames
> > Date: Mon Jan  5 18:54:32 2015
> > New Revision: 225228
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=225228&view=rev
> > Log:
> > Revert r225048: It broke ObjC on AArch64.
> >
> > I've filed http://llvm.org/PR22100 to track this issue.
> >
> > Removed:
> >     llvm/trunk/test/MC/MachO/AArch64/mergeable.s
> >     llvm/trunk/test/MC/MachO/x86_64-mergeable.s
> > Modified:
> >     llvm/trunk/include/llvm/MC/MCAsmBackend.h
> >     llvm/trunk/include/llvm/MC/MCAssembler.h
> >     llvm/trunk/include/llvm/MC/MCMachObjectWriter.h
> >     llvm/trunk/include/llvm/MC/MCObjectWriter.h
> >     llvm/trunk/lib/MC/ELFObjectWriter.cpp
> >     llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp
> >     llvm/trunk/lib/MC/MCAssembler.cpp
> >     llvm/trunk/lib/MC/MachObjectWriter.cpp
> >     llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp
> >     llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
> >
>  llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
> >     llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
> >     llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp
> >     llvm/trunk/lib/Target/R600/MCTargetDesc/AMDGPUAsmBackend.cpp
> >     llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
> >     llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
> >     llvm/trunk/test/MC/MachO/x86_64-symbols.s
> >
> > Modified: llvm/trunk/include/llvm/MC/MCAsmBackend.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAsmBackend.h?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/MC/MCAsmBackend.h (original)
> > +++ llvm/trunk/include/llvm/MC/MCAsmBackend.h Mon Jan  5 18:54:32 2015
> > @@ -61,6 +61,12 @@ public:
> >    /// markers. If not, data region directives will be ignored.
> >    bool hasDataInCodeSupport() const { return HasDataInCodeSupport; }
> >
> > +  /// doesSectionRequireSymbols - Check whether the given section
> requires that
> > +  /// all symbols (even temporaries) have symbol table entries.
> > +  virtual bool doesSectionRequireSymbols(const MCSection &Section)
> const {
> > +    return false;
> > +  }
> > +
> >    /// @name Target Fixup Interfaces
> >    /// @{
> >
> >
> > Modified: llvm/trunk/include/llvm/MC/MCAssembler.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCAssembler.h?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/MC/MCAssembler.h (original)
> > +++ llvm/trunk/include/llvm/MC/MCAssembler.h Mon Jan  5 18:54:32 2015
> > @@ -11,7 +11,6 @@
> >  #define LLVM_MC_MCASSEMBLER_H
> >
> >  #include "llvm/ADT/DenseMap.h"
> > -#include "llvm/ADT/DenseSet.h"
> >  #include "llvm/ADT/PointerIntPair.h"
> >  #include "llvm/ADT/SmallPtrSet.h"
> >  #include "llvm/ADT/SmallString.h"
> > @@ -882,8 +881,6 @@ private:
> >
> >    iplist<MCSymbolData> Symbols;
> >
> > -  DenseSet<const MCSymbol *> LocalsUsedInReloc;
> > -
> >    /// The map of sections to their associated assembler backend data.
> >    //
> >    // FIXME: Avoid this indirection?
> > @@ -983,9 +980,6 @@ private:
> >                                          MCFragment &F, const MCFixup
> &Fixup);
> >
> >  public:
> > -  void addLocalUsedInReloc(const MCSymbol &Sym);
> > -  bool isLocalUsedInReloc(const MCSymbol &Sym) const;
> > -
> >    /// Compute the effective fragment size assuming it is laid out at
> the given
> >    /// \p SectionAddress and \p FragmentOffset.
> >    uint64_t computeFragmentSize(const MCAsmLayout &Layout,
> >
> > Modified: llvm/trunk/include/llvm/MC/MCMachObjectWriter.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCMachObjectWriter.h?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/MC/MCMachObjectWriter.h (original)
> > +++ llvm/trunk/include/llvm/MC/MCMachObjectWriter.h Mon Jan  5 18:54:32
> 2015
> > @@ -68,10 +68,12 @@ public:
> >    /// @name API
> >    /// @{
> >
> > -  virtual void RecordRelocation(MachObjectWriter *Writer, MCAssembler
> &Asm,
> > +  virtual void RecordRelocation(MachObjectWriter *Writer,
> > +                                const MCAssembler &Asm,
> >                                  const MCAsmLayout &Layout,
> >                                  const MCFragment *Fragment,
> > -                                const MCFixup &Fixup, MCValue Target,
> > +                                const MCFixup &Fixup,
> > +                                MCValue Target,
> >                                  uint64_t &FixedValue) = 0;
> >
> >    /// @}
> > @@ -95,14 +97,8 @@ class MachObjectWriter : public MCObject
> >    /// @name Relocation Data
> >    /// @{
> >
> > -  struct RelAndSymbol {
> > -    const MCSymbolData *Sym;
> > -    MachO::any_relocation_info MRE;
> > -    RelAndSymbol(const MCSymbolData *Sym, const
> MachO::any_relocation_info &MRE)
> > -        : Sym(Sym), MRE(MRE) {}
> > -  };
> > -
> > -  llvm::DenseMap<const MCSectionData *, std::vector<RelAndSymbol>>
> Relocations;
> > +  llvm::DenseMap<const MCSectionData*,
> > +                 std::vector<MachO::any_relocation_info> > Relocations;
> >    llvm::DenseMap<const MCSectionData*, unsigned> IndirectSymBase;
> >
> >    /// @}
> > @@ -217,15 +213,9 @@ public:
> >    //  - Input errors, where something cannot be correctly encoded. 'as'
> allows
> >    //    these through in many cases.
> >
> > -  // Add a relocation to be output in the object file. At the time this
> is
> > -  // called, the symbol indexes are not know, so if the relocation
> refers
> > -  // to a symbol it should be passed as \p RelSymbol so that it can be
> updated
> > -  // afterwards. If the relocation doesn't refer to a symbol, nullptr
> should be
> > -  // used.
> > -  void addRelocation(const MCSymbolData *RelSymbol, const MCSectionData
> *SD,
> > +  void addRelocation(const MCSectionData *SD,
> >                       MachO::any_relocation_info &MRE) {
> > -    RelAndSymbol P(RelSymbol, MRE);
> > -    Relocations[SD].push_back(P);
> > +    Relocations[SD].push_back(MRE);
> >    }
> >
> >    void RecordScatteredRelocation(const MCAssembler &Asm,
> > @@ -241,7 +231,7 @@ public:
> >                              const MCFixup &Fixup, MCValue Target,
> >                              uint64_t &FixedValue);
> >
> > -  void RecordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout,
> > +  void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout
> &Layout,
> >                          const MCFragment *Fragment, const MCFixup
> &Fixup,
> >                          MCValue Target, bool &IsPCRel,
> >                          uint64_t &FixedValue) override;
> >
> > Modified: llvm/trunk/include/llvm/MC/MCObjectWriter.h
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectWriter.h?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/include/llvm/MC/MCObjectWriter.h (original)
> > +++ llvm/trunk/include/llvm/MC/MCObjectWriter.h Mon Jan  5 18:54:32 2015
> > @@ -76,10 +76,12 @@ public:
> >    /// post layout binding. The implementation is responsible for storing
> >    /// information about the relocation so that it can be emitted during
> >    /// WriteObject().
> > -  virtual void RecordRelocation(MCAssembler &Asm, const MCAsmLayout
> &Layout,
> > +  virtual void RecordRelocation(const MCAssembler &Asm,
> > +                                const MCAsmLayout &Layout,
> >                                  const MCFragment *Fragment,
> >                                  const MCFixup &Fixup, MCValue Target,
> > -                                bool &IsPCRel, uint64_t &FixedValue) =
> 0;
> > +                                bool &IsPCRel,
> > +                                uint64_t &FixedValue) = 0;
> >
> >    /// \brief Check whether the difference (A - B) between two symbol
> >    /// references is fully resolved.
> >
> > Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
> > +++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Mon Jan  5 18:54:32 2015
> > @@ -219,7 +219,7 @@ class ELFObjectWriter : public MCObjectW
> >                                    const MCSymbolData *SD, uint64_t C,
> >                                    unsigned Type) const;
> >
> > -    void RecordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout,
> > +    void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout
> &Layout,
> >                            const MCFragment *Fragment, const MCFixup
> &Fixup,
> >                            MCValue Target, bool &IsPCRel,
> >                            uint64_t &FixedValue) override;
> > @@ -789,11 +789,13 @@ static const MCSymbol *getWeakRef(const
> >    return nullptr;
> >  }
> >
> > -void ELFObjectWriter::RecordRelocation(MCAssembler &Asm,
> > +void ELFObjectWriter::RecordRelocation(const MCAssembler &Asm,
> >                                         const MCAsmLayout &Layout,
> >                                         const MCFragment *Fragment,
> > -                                       const MCFixup &Fixup, MCValue
> Target,
> > -                                       bool &IsPCRel, uint64_t
> &FixedValue) {
> > +                                       const MCFixup &Fixup,
> > +                                       MCValue Target,
> > +                                       bool &IsPCRel,
> > +                                       uint64_t &FixedValue) {
> >    const MCSectionData *FixupSection = Fragment->getParent();
> >    uint64_t C = Target.getConstant();
> >    uint64_t FixupOffset = Layout.getFragmentOffset(Fragment) +
> Fixup.getOffset();
> >
> > Modified: llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp (original)
> > +++ llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp Mon Jan  5 18:54:32 2015
> > @@ -27,7 +27,22 @@ bool MCAsmInfoDarwin::isSectionAtomizabl
> >    // contain.
> >    // Sections holding 2 byte strings require symbols in order to be
> atomized.
> >    // There is no dedicated section for 4 byte strings.
> > -  if (SMO.getType() == MachO::S_CSTRING_LITERALS)
> > +  if (SMO.getKind().isMergeable1ByteCString())
> > +    return false;
> > +
> > +  if (SMO.getSegmentName() == "__TEXT" &&
> > +      SMO.getSectionName() == "__objc_classname" &&
> > +      SMO.getType() == MachO::S_CSTRING_LITERALS)
> > +    return false;
> > +
> > +  if (SMO.getSegmentName() == "__TEXT" &&
> > +      SMO.getSectionName() == "__objc_methname" &&
> > +      SMO.getType() == MachO::S_CSTRING_LITERALS)
> > +    return false;
> > +
> > +  if (SMO.getSegmentName() == "__TEXT" &&
> > +      SMO.getSectionName() == "__objc_methtype" &&
> > +      SMO.getType() == MachO::S_CSTRING_LITERALS)
> >      return false;
> >
> >    if (SMO.getSegmentName() == "__DATA" && SMO.getSectionName() ==
> "__cfstring")
> >
> > Modified: llvm/trunk/lib/MC/MCAssembler.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCAssembler.cpp?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/MC/MCAssembler.cpp (original)
> > +++ llvm/trunk/lib/MC/MCAssembler.cpp Mon Jan  5 18:54:32 2015
> > @@ -425,16 +425,6 @@ bool MCAssembler::isThumbFunc(const MCSy
> >    return true;
> >  }
> >
> > -void MCAssembler::addLocalUsedInReloc(const MCSymbol &Sym) {
> > -  assert(Sym.isTemporary());
> > -  LocalsUsedInReloc.insert(&Sym);
> > -}
> > -
> > -bool MCAssembler::isLocalUsedInReloc(const MCSymbol &Sym) const {
> > -  assert(Sym.isTemporary());
> > -  return LocalsUsedInReloc.count(&Sym);
> > -}
> > -
> >  bool MCAssembler::isSymbolLinkerVisible(const MCSymbol &Symbol) const {
> >    // Non-temporary labels should always be visible to the linker.
> >    if (!Symbol.isTemporary())
> > @@ -444,10 +434,8 @@ bool MCAssembler::isSymbolLinkerVisible(
> >    if (!Symbol.isInSection())
> >      return false;
> >
> > -  if (isLocalUsedInReloc(Symbol))
> > -    return true;
> > -
> > -  return false;
> > +  // Otherwise, check if the section requires symbols even for
> temporary labels.
> > +  return getBackend().doesSectionRequireSymbols(Symbol.getSection());
> >  }
> >
> >  const MCSymbolData *MCAssembler::getAtom(const MCSymbolData *SD) const {
> >
> > Modified: llvm/trunk/lib/MC/MachObjectWriter.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MachObjectWriter.cpp?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/MC/MachObjectWriter.cpp (original)
> > +++ llvm/trunk/lib/MC/MachObjectWriter.cpp Mon Jan  5 18:54:32 2015
> > @@ -448,11 +448,14 @@ void MachObjectWriter::WriteLinkerOption
> >    assert(OS.tell() - Start == Size);
> >  }
> >
> > -void MachObjectWriter::RecordRelocation(MCAssembler &Asm,
> > +
> > +void MachObjectWriter::RecordRelocation(const MCAssembler &Asm,
> >                                          const MCAsmLayout &Layout,
> >                                          const MCFragment *Fragment,
> > -                                        const MCFixup &Fixup, MCValue
> Target,
> > -                                        bool &IsPCRel, uint64_t
> &FixedValue) {
> > +                                        const MCFixup &Fixup,
> > +                                        MCValue Target,
> > +                                        bool &IsPCRel,
> > +                                        uint64_t &FixedValue) {
> >    TargetObjectWriter->RecordRelocation(this, Asm, Layout, Fragment,
> Fixup,
> >                                         Target, FixedValue);
> >  }
> > @@ -613,22 +616,6 @@ void MachObjectWriter::ComputeSymbolTabl
> >      ExternalSymbolData[i].SymbolData->setIndex(Index++);
> >    for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i)
> >      UndefinedSymbolData[i].SymbolData->setIndex(Index++);
> > -
> > -  for (const MCSectionData &SD : Asm) {
> > -    std::vector<RelAndSymbol> &Relocs = Relocations[&SD];
> > -    for (RelAndSymbol &Rel : Relocs) {
> > -      if (!Rel.Sym)
> > -        continue;
> > -
> > -      // Set the Index and the IsExtern bit.
> > -      unsigned Index = Rel.Sym->getIndex();
> > -      assert(isInt<24>(Index));
> > -      if (IsLittleEndian)
> > -        Rel.MRE.r_word1 = (Rel.MRE.r_word1 & (-1 << 24)) | Index | (1
> << 27);
> > -      else
> > -        Rel.MRE.r_word1 = (Rel.MRE.r_word1 & 0xff) | Index << 8 | (1 <<
> 4);
> > -    }
> > -  }
> >  }
> >
> >  void MachObjectWriter::computeSectionAddresses(const MCAssembler &Asm,
> > @@ -675,6 +662,10 @@ void MachObjectWriter::ExecutePostLayout
> >    // Mark symbol difference expressions in variables (from .set or =
> directives)
> >    // as absolute.
> >    markAbsoluteVariableSymbols(Asm, Layout);
> > +
> > +  // Compute symbol table information and bind symbol indices.
> > +  ComputeSymbolTable(Asm, LocalSymbolData, ExternalSymbolData,
> > +                     UndefinedSymbolData);
> >  }
> >
> >  bool MachObjectWriter::
> > @@ -758,10 +749,6 @@ IsSymbolRefDifferenceFullyResolvedImpl(c
> >
> >  void MachObjectWriter::WriteObject(MCAssembler &Asm,
> >                                     const MCAsmLayout &Layout) {
> > -  // Compute symbol table information and bind symbol indices.
> > -  ComputeSymbolTable(Asm, LocalSymbolData, ExternalSymbolData,
> > -                     UndefinedSymbolData);
> > -
> >    unsigned NumSections = Asm.size();
> >    const MCAssembler::VersionMinInfoType &VersionInfo =
> >      Layout.getAssembler().getVersionMinInfo();
> > @@ -852,7 +839,7 @@ void MachObjectWriter::WriteObject(MCAss
> >    uint64_t RelocTableEnd = SectionDataStart + SectionDataFileSize;
> >    for (MCAssembler::const_iterator it = Asm.begin(),
> >           ie = Asm.end(); it != ie; ++it) {
> > -    std::vector<RelAndSymbol> &Relocs = Relocations[it];
> > +    std::vector<MachO::any_relocation_info> &Relocs = Relocations[it];
> >      unsigned NumRelocs = Relocs.size();
> >      uint64_t SectionStart = SectionDataStart + getSectionAddress(it);
> >      WriteSection(Asm, Layout, *it, SectionStart, RelocTableEnd,
> NumRelocs);
> > @@ -946,10 +933,10 @@ void MachObjectWriter::WriteObject(MCAss
> >           ie = Asm.end(); it != ie; ++it) {
> >      // Write the section relocation entries, in reverse order to match
> 'as'
> >      // (approximately, the exact algorithm is more complicated than
> this).
> > -    std::vector<RelAndSymbol> &Relocs = Relocations[it];
> > +    std::vector<MachO::any_relocation_info> &Relocs = Relocations[it];
> >      for (unsigned i = 0, e = Relocs.size(); i != e; ++i) {
> > -      Write32(Relocs[e - i - 1].MRE.r_word0);
> > -      Write32(Relocs[e - i - 1].MRE.r_word1);
> > +      Write32(Relocs[e - i - 1].r_word0);
> > +      Write32(Relocs[e - i - 1].r_word1);
> >      }
> >    }
> >
> >
> > Modified: llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp (original)
> > +++ llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp Mon Jan  5 18:54:32 2015
> > @@ -175,7 +175,7 @@ public:
> >                                                const MCFragment &FB,
> bool InSet,
> >                                                bool IsPCRel) const
> override;
> >
> > -  void RecordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout,
> > +  void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout
> &Layout,
> >                          const MCFragment *Fragment, const MCFixup
> &Fixup,
> >                          MCValue Target, bool &IsPCRel,
> >                          uint64_t &FixedValue) override;
> > @@ -661,9 +661,13 @@ bool WinCOFFObjectWriter::IsSymbolRefDif
> >                                                                  InSet,
> IsPCRel);
> >  }
> >
> > -void WinCOFFObjectWriter::RecordRelocation(
> > -    MCAssembler &Asm, const MCAsmLayout &Layout, const MCFragment
> *Fragment,
> > -    const MCFixup &Fixup, MCValue Target, bool &IsPCRel, uint64_t
> &FixedValue) {
> > +void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm,
> > +                                           const MCAsmLayout &Layout,
> > +                                           const MCFragment *Fragment,
> > +                                           const MCFixup &Fixup,
> > +                                           MCValue Target,
> > +                                           bool &IsPCRel,
> > +                                           uint64_t &FixedValue) {
> >    assert(Target.getSymA() && "Relocation must reference a symbol!");
> >
> >    const MCSymbol &Symbol = Target.getSymA()->getSymbol();
> >
> > 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=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
> (original)
> > +++ llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp Mon
> Jan  5 18:54:32 2015
> > @@ -317,6 +317,42 @@ public:
> >                                           MachO::CPU_SUBTYPE_ARM64_ALL);
> >    }
> >
> > +  bool doesSectionRequireSymbols(const MCSection &Section) const
> override {
> > +    // Any section for which the linker breaks things into atoms needs
> to
> > +    // preserve symbols, including assembler local symbols, to identify
> > +    // those atoms. These sections are:
> > +    // Sections of type:
> > +    //
> > +    //    S_CSTRING_LITERALS  (e.g. __cstring)
> > +    //    S_LITERAL_POINTERS  (e.g.  objc selector pointers)
> > +    //    S_16BYTE_LITERALS, S_8BYTE_LITERALS, S_4BYTE_LITERALS
> > +    //
> > +    // Sections named:
> > +    //
> > +    //    __TEXT,__eh_frame
> > +    //    __TEXT,__ustring
> > +    //    __DATA,__cfstring
> > +    //    __DATA,__objc_classrefs
> > +    //    __DATA,__objc_catlist
> > +    //
> > +    // FIXME: It would be better if the compiler used actual linker
> local
> > +    // symbols for each of these sections rather than preserving what
> > +    // are ostensibly assembler local symbols.
> > +    const MCSectionMachO &SMO = static_cast<const MCSectionMachO
> &>(Section);
> > +    return (SMO.getType() == MachO::S_CSTRING_LITERALS ||
> > +            SMO.getType() == MachO::S_4BYTE_LITERALS ||
> > +            SMO.getType() == MachO::S_8BYTE_LITERALS ||
> > +            SMO.getType() == MachO::S_16BYTE_LITERALS ||
> > +            SMO.getType() == MachO::S_LITERAL_POINTERS ||
> > +            (SMO.getSegmentName() == "__TEXT" &&
> > +             (SMO.getSectionName() == "__eh_frame" ||
> > +              SMO.getSectionName() == "__ustring")) ||
> > +            (SMO.getSegmentName() == "__DATA" &&
> > +             (SMO.getSectionName() == "__cfstring" ||
> > +              SMO.getSectionName() == "__objc_classrefs" ||
> > +              SMO.getSectionName() == "__objc_catlist")));
> > +  }
> > +
> >    /// \brief Generate the compact unwind encoding from the CFI
> directives.
> >    uint32_t generateCompactUnwindEncoding(
> >                               ArrayRef<MCCFIInstruction> Instrs) const
> override {
> >
> > Modified:
> llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > ---
> llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
> (original)
> > +++
> llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp Mon
> Jan  5 18:54:32 2015
> > @@ -10,7 +10,6 @@
> >  #include "MCTargetDesc/AArch64FixupKinds.h"
> >  #include "MCTargetDesc/AArch64MCTargetDesc.h"
> >  #include "llvm/ADT/Twine.h"
> > -#include "llvm/MC/MCAsmInfo.h"
> >  #include "llvm/MC/MCAsmLayout.h"
> >  #include "llvm/MC/MCAssembler.h"
> >  #include "llvm/MC/MCContext.h"
> > @@ -34,7 +33,7 @@ public:
> >        : MCMachObjectTargetWriter(true /* is64Bit */, CPUType,
> CPUSubtype,
> >                                   /*UseAggressiveSymbolFolding=*/true) {}
> >
> > -  void RecordRelocation(MachObjectWriter *Writer, MCAssembler &Asm,
> > +  void RecordRelocation(MachObjectWriter *Writer, const MCAssembler
> &Asm,
> >                          const MCAsmLayout &Layout, const MCFragment
> *Fragment,
> >                          const MCFixup &Fixup, MCValue Target,
> >                          uint64_t &FixedValue) override;
> > @@ -114,7 +113,7 @@ bool AArch64MachObjectWriter::getAArch64
> >  }
> >
> >  void AArch64MachObjectWriter::RecordRelocation(
> > -    MachObjectWriter *Writer, MCAssembler &Asm, const MCAsmLayout
> &Layout,
> > +    MachObjectWriter *Writer, const MCAssembler &Asm, const MCAsmLayout
> &Layout,
> >      const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target,
> >      uint64_t &FixedValue) {
> >    unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
> > @@ -124,9 +123,9 @@ void AArch64MachObjectWriter::RecordRelo
> >    unsigned Log2Size = 0;
> >    int64_t Value = 0;
> >    unsigned Index = 0;
> > +  unsigned IsExtern = 0;
> >    unsigned Type = 0;
> >    unsigned Kind = Fixup.getKind();
> > -  const MCSymbolData *RelSymbol = nullptr;
> >
> >    FixupOffset += Fixup.getOffset();
> >
> > @@ -172,8 +171,10 @@ void AArch64MachObjectWriter::RecordRelo
> >      // FIXME: Should this always be extern?
> >      // SymbolNum of 0 indicates the absolute section.
> >      Type = MachO::ARM64_RELOC_UNSIGNED;
> > +    Index = 0;
> >
> >      if (IsPCRel) {
> > +      IsExtern = 1;
> >        Asm.getContext().FatalError(Fixup.getLoc(),
> >                                    "PC relative absolute relocation!");
> >
> > @@ -197,12 +198,15 @@ void AArch64MachObjectWriter::RecordRelo
> >          Layout.getSymbolOffset(&B_SD) ==
> >              Layout.getFragmentOffset(Fragment) + Fixup.getOffset()) {
> >        // SymB is the PC, so use a PC-rel pointer-to-GOT relocation.
> > +      Index = A_Base->getIndex();
> > +      IsExtern = 1;
> >        Type = MachO::ARM64_RELOC_POINTER_TO_GOT;
> >        IsPCRel = 1;
> >        MachO::any_relocation_info MRE;
> >        MRE.r_word0 = FixupOffset;
> > -      MRE.r_word1 = (IsPCRel << 24) | (Log2Size << 25) | (Type << 28);
> > -      Writer->addRelocation(A_Base, Fragment->getParent(), MRE);
> > +      MRE.r_word1 = ((Index << 0) | (IsPCRel << 24) | (Log2Size << 25) |
> > +                     (IsExtern << 27) | (Type << 28));
> > +      Writer->addRelocation(Fragment->getParent(), MRE);
> >        return;
> >      } else if (Target.getSymA()->getKind() != MCSymbolRefExpr::VK_None
> ||
> >                 Target.getSymB()->getKind() != MCSymbolRefExpr::VK_None)
> > @@ -248,33 +252,25 @@ void AArch64MachObjectWriter::RecordRelo
> >                    ? 0
> >                    : Writer->getSymbolAddress(B_Base, Layout));
> >
> > +    Index = A_Base->getIndex();
> > +    IsExtern = 1;
> >      Type = MachO::ARM64_RELOC_UNSIGNED;
> >
> >      MachO::any_relocation_info MRE;
> >      MRE.r_word0 = FixupOffset;
> > -    MRE.r_word1 = (IsPCRel << 24) | (Log2Size << 25) | (Type << 28);
> > -    Writer->addRelocation(A_Base, Fragment->getParent(), MRE);
> > +    MRE.r_word1 = ((Index << 0) | (IsPCRel << 24) | (Log2Size << 25) |
> > +                   (IsExtern << 27) | (Type << 28));
> > +    Writer->addRelocation(Fragment->getParent(), MRE);
> >
> > -    RelSymbol = B_Base;
> > +    Index = B_Base->getIndex();
> > +    IsExtern = 1;
> >      Type = MachO::ARM64_RELOC_SUBTRACTOR;
> >    } else { // A + constant
> >      const MCSymbol *Symbol = &Target.getSymA()->getSymbol();
> > -    const MCSectionMachO &Section = static_cast<const MCSectionMachO &>(
> > -        Fragment->getParent()->getSection());
> > -
> > -    // Pointer-sized relocations can use a local relocation. Otherwise,
> > -    // we have to be in a debug info section.
> > -    bool CanUseLocalRelocation =
> > -        Section.hasAttribute(MachO::S_ATTR_DEBUG) || Log2Size == 3;
> > -
> > -    if (Symbol->isTemporary() && (Value || !CanUseLocalRelocation)) {
> > -      const MCSection &Sec = Symbol->getSection();
> > -      if
> (!Asm.getContext().getAsmInfo()->isSectionAtomizableBySymbols(Sec))
> > -        Asm.addLocalUsedInReloc(*Symbol);
> > -    }
> > -
> >      const MCSymbolData &SD = Asm.getSymbolData(*Symbol);
> >      const MCSymbolData *Base = Asm.getAtom(&SD);
> > +    const MCSectionMachO &Section = static_cast<const MCSectionMachO &>(
> > +        Fragment->getParent()->getSection());
> >
> >      // If the symbol is a variable and we weren't able to get a Base
> for it
> >      // (i.e., it's not in the symbol table associated with a section)
> resolve
> > @@ -314,13 +310,16 @@ void AArch64MachObjectWriter::RecordRelo
> >      // sections, and for pointer-sized relocations (.quad), we allow
> section
> >      // relocations.  It's code sections that run into trouble.
> >      if (Base) {
> > -      RelSymbol = Base;
> > +      Index = Base->getIndex();
> > +      IsExtern = 1;
> >
> >        // Add the local offset, if needed.
> >        if (Base != &SD)
> >          Value += Layout.getSymbolOffset(&SD) -
> Layout.getSymbolOffset(Base);
> >      } else if (Symbol->isInSection()) {
> > -      if (!CanUseLocalRelocation)
> > +      // Pointer-sized relocations can use a local relocation.
> Otherwise,
> > +      // we have to be in a debug info section.
> > +      if (!Section.hasAttribute(MachO::S_ATTR_DEBUG) && Log2Size != 3)
> >          Asm.getContext().FatalError(
> >              Fixup.getLoc(),
> >              "unsupported relocation of local symbol '" +
> Symbol->getName() +
> > @@ -330,6 +329,7 @@ void AArch64MachObjectWriter::RecordRelo
> >        const MCSectionData &SymSD =
> >            Asm.getSectionData(SD.getSymbol().getSection());
> >        Index = SymSD.getOrdinal() + 1;
> > +      IsExtern = 0;
> >        Value += Writer->getSymbolAddress(&SD, Layout);
> >
> >        if (IsPCRel)
> > @@ -362,16 +362,16 @@ void AArch64MachObjectWriter::RecordRelo
> >
> >      MachO::any_relocation_info MRE;
> >      MRE.r_word0 = FixupOffset;
> > -    MRE.r_word1 =
> > -        (Index << 0) | (IsPCRel << 24) | (Log2Size << 25) | (Type <<
> 28);
> > -    Writer->addRelocation(RelSymbol, Fragment->getParent(), MRE);
> > +    MRE.r_word1 = ((Index << 0) | (IsPCRel << 24) | (Log2Size << 25) |
> > +                   (IsExtern << 27) | (Type << 28));
> > +    Writer->addRelocation(Fragment->getParent(), MRE);
> >
> >      // Now set up the Addend relocation.
> >      Type = MachO::ARM64_RELOC_ADDEND;
> >      Index = Value;
> > -    RelSymbol = nullptr;
> >      IsPCRel = 0;
> >      Log2Size = 2;
> > +    IsExtern = 0;
> >
> >      // Put zero into the instruction itself. The addend is in the
> relocation.
> >      Value = 0;
> > @@ -383,9 +383,9 @@ void AArch64MachObjectWriter::RecordRelo
> >    // struct relocation_info (8 bytes)
> >    MachO::any_relocation_info MRE;
> >    MRE.r_word0 = FixupOffset;
> > -  MRE.r_word1 =
> > -      (Index << 0) | (IsPCRel << 24) | (Log2Size << 25) | (Type << 28);
> > -  Writer->addRelocation(RelSymbol, Fragment->getParent(), MRE);
> > +  MRE.r_word1 = ((Index << 0) | (IsPCRel << 24) | (Log2Size << 25) |
> > +                 (IsExtern << 27) | (Type << 28));
> > +  Writer->addRelocation(Fragment->getParent(), MRE);
> >  }
> >
> >  MCObjectWriter *llvm::createAArch64MachObjectWriter(raw_ostream &OS,
> >
> > Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
> (original)
> > +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp Mon
> Jan  5 18:54:32 2015
> > @@ -54,10 +54,10 @@ public:
> >      : MCMachObjectTargetWriter(Is64Bit, CPUType, CPUSubtype,
> >                                 /*UseAggressiveSymbolFolding=*/true) {}
> >
> > -  void RecordRelocation(MachObjectWriter *Writer, MCAssembler &Asm,
> > -                        const MCAsmLayout &Layout, const MCFragment
> *Fragment,
> > -                        const MCFixup &Fixup, MCValue Target,
> > -                        uint64_t &FixedValue) override;
> > +  void RecordRelocation(MachObjectWriter *Writer,
> > +                        const MCAssembler &Asm, const MCAsmLayout
> &Layout,
> > +                        const MCFragment *Fragment, const MCFixup
> &Fixup,
> > +                        MCValue Target, uint64_t &FixedValue) override;
> >  };
> >  }
> >
> > @@ -232,7 +232,7 @@ RecordARMScatteredHalfRelocation(MachObj
> >                     (IsPCRel               << 30) |
> >                     MachO::R_SCATTERED);
> >      MRE.r_word1 = Value2;
> > -    Writer->addRelocation(nullptr, Fragment->getParent(), MRE);
> > +    Writer->addRelocation(Fragment->getParent(), MRE);
> >    }
> >
> >    MachO::any_relocation_info MRE;
> > @@ -243,7 +243,7 @@ RecordARMScatteredHalfRelocation(MachObj
> >                   (IsPCRel     << 30) |
> >                   MachO::R_SCATTERED);
> >    MRE.r_word1 = Value;
> > -  Writer->addRelocation(nullptr, Fragment->getParent(), MRE);
> > +  Writer->addRelocation(Fragment->getParent(), MRE);
> >  }
> >
> >  void ARMMachObjectWriter::RecordARMScatteredRelocation(MachObjectWriter
> *Writer,
> > @@ -297,7 +297,7 @@ void ARMMachObjectWriter::RecordARMScatt
> >                     (IsPCRel               << 30) |
> >                     MachO::R_SCATTERED);
> >      MRE.r_word1 = Value2;
> > -    Writer->addRelocation(nullptr, Fragment->getParent(), MRE);
> > +    Writer->addRelocation(Fragment->getParent(), MRE);
> >    }
> >
> >    MachO::any_relocation_info MRE;
> > @@ -307,7 +307,7 @@ void ARMMachObjectWriter::RecordARMScatt
> >                   (IsPCRel     << 30) |
> >                   MachO::R_SCATTERED);
> >    MRE.r_word1 = Value;
> > -  Writer->addRelocation(nullptr, Fragment->getParent(), MRE);
> > +  Writer->addRelocation(Fragment->getParent(), MRE);
> >  }
> >
> >  bool ARMMachObjectWriter::requiresExternRelocation(MachObjectWriter
> *Writer,
> > @@ -351,10 +351,11 @@ bool ARMMachObjectWriter::requiresExtern
> >  }
> >
> >  void ARMMachObjectWriter::RecordRelocation(MachObjectWriter *Writer,
> > -                                           MCAssembler &Asm,
> > +                                           const MCAssembler &Asm,
> >                                             const MCAsmLayout &Layout,
> >                                             const MCFragment *Fragment,
> > -                                           const MCFixup &Fixup,
> MCValue Target,
> > +                                           const MCFixup &Fixup,
> > +                                           MCValue Target,
> >                                             uint64_t &FixedValue) {
> >    unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
> >    unsigned Log2Size;
> > @@ -400,8 +401,8 @@ void ARMMachObjectWriter::RecordRelocati
> >    // See <reloc.h>.
> >    uint32_t FixupOffset =
> Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
> >    unsigned Index = 0;
> > +  unsigned IsExtern = 0;
> >    unsigned Type = 0;
> > -  const MCSymbolData *RelSymbol = nullptr;
> >
> >    if (Target.isAbsolute()) { // constant
> >      // FIXME!
> > @@ -421,7 +422,8 @@ void ARMMachObjectWriter::RecordRelocati
> >      // Check whether we need an external or internal relocation.
> >      if (requiresExternRelocation(Writer, Asm, *Fragment, RelocType, SD,
> >                                   FixedValue)) {
> > -      RelSymbol = SD;
> > +      IsExtern = 1;
> > +      Index = SD->getIndex();
> >
> >        // For external relocations, make sure to offset the fixup value
> to
> >        // compensate for the addend of the symbol address, if it was
> > @@ -445,8 +447,11 @@ void ARMMachObjectWriter::RecordRelocati
> >    // struct relocation_info (8 bytes)
> >    MachO::any_relocation_info MRE;
> >    MRE.r_word0 = FixupOffset;
> > -  MRE.r_word1 =
> > -      (Index << 0) | (IsPCRel << 24) | (Log2Size << 25) | (Type << 28);
> > +  MRE.r_word1 = ((Index     <<  0) |
> > +                 (IsPCRel   << 24) |
> > +                 (Log2Size  << 25) |
> > +                 (IsExtern  << 27) |
> > +                 (Type      << 28));
> >
> >    // Even when it's not a scattered relocation, movw/movt always uses
> >    // a PAIR relocation.
> > @@ -471,10 +476,10 @@ void ARMMachObjectWriter::RecordRelocati
> >                         (Log2Size              << 25) |
> >                         (MachO::ARM_RELOC_PAIR << 28));
> >
> > -    Writer->addRelocation(nullptr, Fragment->getParent(), MREPair);
> > +    Writer->addRelocation(Fragment->getParent(), MREPair);
> >    }
> >
> > -  Writer->addRelocation(RelSymbol, Fragment->getParent(), MRE);
> > +  Writer->addRelocation(Fragment->getParent(), MRE);
> >  }
> >
> >  MCObjectWriter *llvm::createARMMachObjectWriter(raw_ostream &OS,
> >
> > Modified:
> llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp
> (original)
> > +++ llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp
> Mon Jan  5 18:54:32 2015
> > @@ -41,7 +41,7 @@ public:
> >        : MCMachObjectTargetWriter(Is64Bit, CPUType, CPUSubtype,
> >
>  /*UseAggressiveSymbolFolding=*/Is64Bit) {}
> >
> > -  void RecordRelocation(MachObjectWriter *Writer, MCAssembler &Asm,
> > +  void RecordRelocation(MachObjectWriter *Writer, const MCAssembler
> &Asm,
> >                          const MCAsmLayout &Layout, const MCFragment
> *Fragment,
> >                          const MCFixup &Fixup, MCValue Target,
> >                          uint64_t &FixedValue) override {
> > @@ -282,7 +282,7 @@ bool PPCMachObjectWriter::RecordScattere
> >      MachO::any_relocation_info MRE;
> >      makeScatteredRelocationInfo(MRE, other_half,
> MachO::GENERIC_RELOC_PAIR,
> >                                  Log2Size, IsPCRel, Value2);
> > -    Writer->addRelocation(nullptr, Fragment->getParent(), MRE);
> > +    Writer->addRelocation(Fragment->getParent(), MRE);
> >    } else {
> >      // If the offset is more than 24-bits, it won't fit in a scattered
> >      // relocation offset field, so we fall back to using a non-scattered
> > @@ -296,7 +296,7 @@ bool PPCMachObjectWriter::RecordScattere
> >    }
> >    MachO::any_relocation_info MRE;
> >    makeScatteredRelocationInfo(MRE, FixupOffset, Type, Log2Size,
> IsPCRel, Value);
> > -  Writer->addRelocation(nullptr, Fragment->getParent(), MRE);
> > +  Writer->addRelocation(Fragment->getParent(), MRE);
> >    return true;
> >  }
> >
> > @@ -331,9 +331,9 @@ void PPCMachObjectWriter::RecordPPCReloc
> >    // See <reloc.h>.
> >    const uint32_t FixupOffset = getFixupOffset(Layout, Fragment, Fixup);
> >    unsigned Index = 0;
> > +  unsigned IsExtern = 0;
> >    unsigned Type = RelocType;
> >
> > -  const MCSymbolData *RelSymbol = nullptr;
> >    if (Target.isAbsolute()) { // constant
> >                               // SymbolNum of 0 indicates the absolute
> section.
> >                               //
> > @@ -355,7 +355,8 @@ void PPCMachObjectWriter::RecordPPCReloc
> >
> >      // Check whether we need an external or internal relocation.
> >      if (Writer->doesSymbolRequireExternRelocation(SD)) {
> > -      RelSymbol = SD;
> > +      IsExtern = 1;
> > +      Index = SD->getIndex();
> >        // For external relocations, make sure to offset the fixup value
> to
> >        // compensate for the addend of the symbol address, if it was
> >        // undefined. This occurs with weak definitions, for example.
> > @@ -374,8 +375,9 @@ void PPCMachObjectWriter::RecordPPCReloc
> >
> >    // struct relocation_info (8 bytes)
> >    MachO::any_relocation_info MRE;
> > -  makeRelocationInfo(MRE, FixupOffset, Index, IsPCRel, Log2Size, false,
> Type);
> > -  Writer->addRelocation(RelSymbol, Fragment->getParent(), MRE);
> > +  makeRelocationInfo(MRE, FixupOffset, Index, IsPCRel, Log2Size,
> IsExtern,
> > +                     Type);
> > +  Writer->addRelocation(Fragment->getParent(), MRE);
> >  }
> >
> >  MCObjectWriter *llvm::createPPCMachObjectWriter(raw_ostream &OS, bool
> Is64Bit,
> >
> > Modified: llvm/trunk/lib/Target/R600/MCTargetDesc/AMDGPUAsmBackend.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/MCTargetDesc/AMDGPUAsmBackend.cpp?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Target/R600/MCTargetDesc/AMDGPUAsmBackend.cpp
> (original)
> > +++ llvm/trunk/lib/Target/R600/MCTargetDesc/AMDGPUAsmBackend.cpp Mon
> Jan  5 18:54:32 2015
> > @@ -29,7 +29,7 @@ public:
> >                                  const MCAsmLayout &Layout) override {
> >      //XXX: Implement if necessary.
> >    }
> > -  void RecordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout,
> > +  void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout
> &Layout,
> >                          const MCFragment *Fragment, const MCFixup
> &Fixup,
> >                          MCValue Target, bool &IsPCRel,
> >                          uint64_t &FixedValue) override {
> >
> > Modified: llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp (original)
> > +++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp Mon Jan  5
> 18:54:32 2015
> > @@ -777,6 +777,19 @@ public:
> >                                       MachO::CPU_TYPE_X86_64, Subtype);
> >    }
> >
> > +  bool doesSectionRequireSymbols(const MCSection &Section) const
> override {
> > +    // Temporary labels in the string literals sections require
> symbols. The
> > +    // issue is that the x86_64 relocation format does not allow symbol
> +
> > +    // offset, and so the linker does not have enough information to
> resolve the
> > +    // access to the appropriate atom unless an external relocation is
> used. For
> > +    // non-cstring sections, we expect the compiler to use a
> non-temporary label
> > +    // for anything that could have an addend pointing outside the
> symbol.
> > +    //
> > +    // See <rdar://problem/4765733>.
> > +    const MCSectionMachO &SMO = static_cast<const
> MCSectionMachO&>(Section);
> > +    return SMO.getType() == MachO::S_CSTRING_LITERALS;
> > +  }
> > +
> >    /// \brief Generate the compact unwind encoding for the CFI
> instructions.
> >    uint32_t generateCompactUnwindEncoding(
> >                               ArrayRef<MCCFIInstruction> Instrs) const
> override {
> >
> > Modified: llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
> (original)
> > +++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp Mon
> Jan  5 18:54:32 2015
> > @@ -10,7 +10,6 @@
> >  #include "MCTargetDesc/X86MCTargetDesc.h"
> >  #include "MCTargetDesc/X86FixupKinds.h"
> >  #include "llvm/ADT/Twine.h"
> > -#include "llvm/MC/MCAsmInfo.h"
> >  #include "llvm/MC/MCAsmLayout.h"
> >  #include "llvm/MC/MCAssembler.h"
> >  #include "llvm/MC/MCContext.h"
> > @@ -48,21 +47,23 @@ class X86MachObjectWriter : public MCMac
> >                                const MCFixup &Fixup,
> >                                MCValue Target,
> >                                uint64_t &FixedValue);
> > -  void RecordX86_64Relocation(MachObjectWriter *Writer, MCAssembler
> &Asm,
> > +  void RecordX86_64Relocation(MachObjectWriter *Writer,
> > +                              const MCAssembler &Asm,
> >                                const MCAsmLayout &Layout,
> > -                              const MCFragment *Fragment, const MCFixup
> &Fixup,
> > -                              MCValue Target, uint64_t &FixedValue);
> > -
> > +                              const MCFragment *Fragment,
> > +                              const MCFixup &Fixup,
> > +                              MCValue Target,
> > +                              uint64_t &FixedValue);
> >  public:
> >    X86MachObjectWriter(bool Is64Bit, uint32_t CPUType,
> >                        uint32_t CPUSubtype)
> >      : MCMachObjectTargetWriter(Is64Bit, CPUType, CPUSubtype,
> >                                 /*UseAggressiveSymbolFolding=*/Is64Bit)
> {}
> >
> > -  void RecordRelocation(MachObjectWriter *Writer, MCAssembler &Asm,
> > -                        const MCAsmLayout &Layout, const MCFragment
> *Fragment,
> > -                        const MCFixup &Fixup, MCValue Target,
> > -                        uint64_t &FixedValue) override {
> > +  void RecordRelocation(MachObjectWriter *Writer,
> > +                        const MCAssembler &Asm, const MCAsmLayout
> &Layout,
> > +                        const MCFragment *Fragment, const MCFixup
> &Fixup,
> > +                        MCValue Target, uint64_t &FixedValue) override {
> >      if (Writer->is64Bit())
> >        RecordX86_64Relocation(Writer, Asm, Layout, Fragment, Fixup,
> Target,
> >                               FixedValue);
> > @@ -96,10 +97,13 @@ static unsigned getFixupKindLog2Size(uns
> >    }
> >  }
> >
> > -void X86MachObjectWriter::RecordX86_64Relocation(
> > -    MachObjectWriter *Writer, MCAssembler &Asm, const MCAsmLayout
> &Layout,
> > -    const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target,
> > -    uint64_t &FixedValue) {
> > +void X86MachObjectWriter::RecordX86_64Relocation(MachObjectWriter
> *Writer,
> > +                                                 const MCAssembler &Asm,
> > +                                                 const MCAsmLayout
> &Layout,
> > +                                                 const MCFragment
> *Fragment,
> > +                                                 const MCFixup &Fixup,
> > +                                                 MCValue Target,
> > +                                                 uint64_t &FixedValue) {
> >    unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
> >    unsigned IsRIPRel = isFixupKindRIPRel(Fixup.getKind());
> >    unsigned Log2Size = getFixupKindLog2Size(Fixup.getKind());
> > @@ -113,7 +117,6 @@ void X86MachObjectWriter::RecordX86_64Re
> >    unsigned Index = 0;
> >    unsigned IsExtern = 0;
> >    unsigned Type = 0;
> > -  const MCSymbolData *RelSymbol = nullptr;
> >
> >    Value = Target.getConstant();
> >
> > @@ -129,6 +132,7 @@ void X86MachObjectWriter::RecordX86_64Re
> >    if (Target.isAbsolute()) { // constant
> >      // SymbolNum of 0 indicates the absolute section.
> >      Type = MachO::X86_64_RELOC_UNSIGNED;
> > +    Index = 0;
> >
> >      // FIXME: I believe this is broken, I don't think the linker can
> understand
> >      // it. I think it would require a local relocation, but I'm not
> sure if that
> > @@ -189,30 +193,36 @@ void X86MachObjectWriter::RecordX86_64Re
> >      Value -= Writer->getSymbolAddress(&B_SD, Layout) -
> >        (!B_Base ? 0 : Writer->getSymbolAddress(B_Base, Layout));
> >
> > -    if (!A_Base)
> > +    if (A_Base) {
> > +      Index = A_Base->getIndex();
> > +      IsExtern = 1;
> > +    } else {
> >        Index = A_SD.getFragment()->getParent()->getOrdinal() + 1;
> > +      IsExtern = 0;
> > +    }
> >      Type = MachO::X86_64_RELOC_UNSIGNED;
> >
> >      MachO::any_relocation_info MRE;
> >      MRE.r_word0 = FixupOffset;
> > -    MRE.r_word1 =
> > -        (Index << 0) | (IsPCRel << 24) | (Log2Size << 25) | (Type <<
> 28);
> > -    Writer->addRelocation(A_Base, Fragment->getParent(), MRE);
> > +    MRE.r_word1 = ((Index     <<  0) |
> > +                   (IsPCRel   << 24) |
> > +                   (Log2Size  << 25) |
> > +                   (IsExtern  << 27) |
> > +                   (Type      << 28));
> > +    Writer->addRelocation(Fragment->getParent(), MRE);
> >
> > -    if (B_Base)
> > -      RelSymbol = B_Base;
> > -    else
> > +    if (B_Base) {
> > +      Index = B_Base->getIndex();
> > +      IsExtern = 1;
> > +    } else {
> >        Index = B_SD.getFragment()->getParent()->getOrdinal() + 1;
> > +      IsExtern = 0;
> > +    }
> >      Type = MachO::X86_64_RELOC_SUBTRACTOR;
> >    } else {
> >      const MCSymbol *Symbol = &Target.getSymA()->getSymbol();
> > -    if (Symbol->isTemporary() && Value) {
> > -      const MCSection &Sec = Symbol->getSection();
> > -      if
> (!Asm.getContext().getAsmInfo()->isSectionAtomizableBySymbols(Sec))
> > -        Asm.addLocalUsedInReloc(*Symbol);
> > -    }
> >      const MCSymbolData &SD = Asm.getSymbolData(*Symbol);
> > -    RelSymbol = Asm.getAtom(&SD);
> > +    const MCSymbolData *Base = Asm.getAtom(&SD);
> >
> >      // Relocations inside debug sections always use local relocations
> when
> >      // possible. This seems to be done because the debugger doesn't
> fully
> > @@ -222,20 +232,23 @@ void X86MachObjectWriter::RecordX86_64Re
> >        const MCSectionMachO &Section = static_cast<const
> MCSectionMachO&>(
> >          Fragment->getParent()->getSection());
> >        if (Section.hasAttribute(MachO::S_ATTR_DEBUG))
> > -        RelSymbol = nullptr;
> > +        Base = nullptr;
> >      }
> >
> >      // x86_64 almost always uses external relocations, except when
> there is no
> >      // symbol to use as a base address (a local symbol with no preceding
> >      // non-local symbol).
> > -    if (RelSymbol) {
> > +    if (Base) {
> > +      Index = Base->getIndex();
> > +      IsExtern = 1;
> > +
> >        // Add the local offset, if needed.
> > -      if (RelSymbol != &SD)
> > -        Value +=
> > -            Layout.getSymbolOffset(&SD) -
> Layout.getSymbolOffset(RelSymbol);
> > +      if (Base != &SD)
> > +        Value += Layout.getSymbolOffset(&SD) -
> Layout.getSymbolOffset(Base);
> >      } else if (Symbol->isInSection() && !Symbol->isVariable()) {
> >        // The index is the section ordinal (1-based).
> >        Index = SD.getFragment()->getParent()->getOrdinal() + 1;
> > +      IsExtern = 0;
> >        Value += Writer->getSymbolAddress(&SD, Layout);
> >
> >        if (IsPCRel)
> > @@ -334,9 +347,12 @@ void X86MachObjectWriter::RecordX86_64Re
> >    // struct relocation_info (8 bytes)
> >    MachO::any_relocation_info MRE;
> >    MRE.r_word0 = FixupOffset;
> > -  MRE.r_word1 = (Index << 0) | (IsPCRel << 24) | (Log2Size << 25) |
> > -                (IsExtern << 27) | (Type << 28);
> > -  Writer->addRelocation(RelSymbol, Fragment->getParent(), MRE);
> > +  MRE.r_word1 = ((Index     <<  0) |
> > +                 (IsPCRel   << 24) |
> > +                 (Log2Size  << 25) |
> > +                 (IsExtern  << 27) |
> > +                 (Type      << 28));
> > +  Writer->addRelocation(Fragment->getParent(), MRE);
> >  }
> >
> >  bool X86MachObjectWriter::RecordScatteredRelocation(MachObjectWriter
> *Writer,
> > @@ -408,7 +424,7 @@ bool X86MachObjectWriter::RecordScattere
> >                     (IsPCRel                   << 30) |
> >                     MachO::R_SCATTERED);
> >      MRE.r_word1 = Value2;
> > -    Writer->addRelocation(nullptr, Fragment->getParent(), MRE);
> > +    Writer->addRelocation(Fragment->getParent(), MRE);
> >    } else {
> >      // If the offset is more than 24-bits, it won't fit in a scattered
> >      // relocation offset field, so we fall back to using a non-scattered
> > @@ -430,7 +446,7 @@ bool X86MachObjectWriter::RecordScattere
> >                   (IsPCRel     << 30) |
> >                   MachO::R_SCATTERED);
> >    MRE.r_word1 = Value;
> > -  Writer->addRelocation(nullptr, Fragment->getParent(), MRE);
> > +  Writer->addRelocation(Fragment->getParent(), MRE);
> >    return true;
> >  }
> >
> > @@ -451,6 +467,7 @@ void X86MachObjectWriter::RecordTLVPRelo
> >
> >    // Get the symbol data.
> >    const MCSymbolData *SD_A =
> &Asm.getSymbolData(Target.getSymA()->getSymbol());
> > +  unsigned Index = SD_A->getIndex();
> >
> >    // We're only going to have a second symbol in pic mode and it'll be a
> >    // subtraction from the picbase. For 32-bit pic the addend is the
> difference
> > @@ -473,9 +490,12 @@ void X86MachObjectWriter::RecordTLVPRelo
> >    // struct relocation_info (8 bytes)
> >    MachO::any_relocation_info MRE;
> >    MRE.r_word0 = Value;
> > -  MRE.r_word1 =
> > -      (IsPCRel << 24) | (Log2Size << 25) | (MachO::GENERIC_RELOC_TLV <<
> 28);
> > -  Writer->addRelocation(SD_A, Fragment->getParent(), MRE);
> > +  MRE.r_word1 = ((Index                    <<  0) |
> > +                 (IsPCRel                  << 24) |
> > +                 (Log2Size                 << 25) |
> > +                 (1                        << 27) | // r_extern
> > +                 (MachO::GENERIC_RELOC_TLV << 28)); // r_type
> > +  Writer->addRelocation(Fragment->getParent(), MRE);
> >  }
> >
> >  void X86MachObjectWriter::RecordX86Relocation(MachObjectWriter *Writer,
> > @@ -526,8 +546,8 @@ void X86MachObjectWriter::RecordX86Reloc
> >    // See <reloc.h>.
> >    uint32_t FixupOffset =
> Layout.getFragmentOffset(Fragment)+Fixup.getOffset();
> >    unsigned Index = 0;
> > +  unsigned IsExtern = 0;
> >    unsigned Type = 0;
> > -  const MCSymbolData *RelSymbol = nullptr;
> >
> >    if (Target.isAbsolute()) { // constant
> >      // SymbolNum of 0 indicates the absolute section.
> > @@ -548,7 +568,8 @@ void X86MachObjectWriter::RecordX86Reloc
> >
> >      // Check whether we need an external or internal relocation.
> >      if (Writer->doesSymbolRequireExternRelocation(SD)) {
> > -      RelSymbol = SD;
> > +      IsExtern = 1;
> > +      Index = SD->getIndex();
> >        // For external relocations, make sure to offset the fixup value
> to
> >        // compensate for the addend of the symbol address, if it was
> >        // undefined. This occurs with weak definitions, for example.
> > @@ -570,9 +591,12 @@ void X86MachObjectWriter::RecordX86Reloc
> >    // struct relocation_info (8 bytes)
> >    MachO::any_relocation_info MRE;
> >    MRE.r_word0 = FixupOffset;
> > -  MRE.r_word1 =
> > -      (Index << 0) | (IsPCRel << 24) | (Log2Size << 25) | (Type << 28);
> > -  Writer->addRelocation(RelSymbol, Fragment->getParent(), MRE);
> > +  MRE.r_word1 = ((Index     <<  0) |
> > +                 (IsPCRel   << 24) |
> > +                 (Log2Size  << 25) |
> > +                 (IsExtern  << 27) |
> > +                 (Type      << 28));
> > +  Writer->addRelocation(Fragment->getParent(), MRE);
> >  }
> >
> >  MCObjectWriter *llvm::createX86MachObjectWriter(raw_ostream &OS,
> >
> > Removed: llvm/trunk/test/MC/MachO/AArch64/mergeable.s
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/AArch64/mergeable.s?rev=225227&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/test/MC/MachO/AArch64/mergeable.s (original)
> > +++ llvm/trunk/test/MC/MachO/AArch64/mergeable.s (removed)
> > @@ -1,59 +0,0 @@
> > -// RUN: llvm-mc -triple aarch64-apple-darwin14 %s -filetype=obj -o - |
> llvm-readobj -r --expand-relocs | FileCheck %s
> > -
> > -// Test that we "S + K" produce a relocation with a symbol, but just S
> produces
> > -// a relocation with the section.
> > -
> > -       .section        __TEXT,__literal4,4byte_literals
> > -L0:
> > -       .long   42
> > -
> > -       .section        __TEXT,__cstring,cstring_literals
> > -L1:
> > -       .asciz  "42"
> > -
> > -       .section        __DATA,__data
> > -       .quad   L0
> > -       .quad   L0 + 1
> > -       .quad   L1
> > -       .quad   L1 + 1
> > -
> > -// CHECK:      Relocations [
> > -// CHECK-NEXT:   Section __data {
> > -// CHECK-NEXT:     Relocation {
> > -// CHECK-NEXT:       Offset: 0x18
> > -// CHECK-NEXT:       PCRel: 0
> > -// CHECK-NEXT:       Length: 3
> > -// CHECK-NEXT:       Extern: 1
> > -// CHECK-NEXT:       Type: ARM64_RELOC_UNSIGNED (0)
> > -// CHECK-NEXT:       Symbol: L1
> > -// CHECK-NEXT:       Scattered: 0
> > -// CHECK-NEXT:     }
> > -// CHECK-NEXT:     Relocation {
> > -// CHECK-NEXT:       Offset: 0x10
> > -// CHECK-NEXT:       PCRel: 0
> > -// CHECK-NEXT:       Length: 3
> > -// CHECK-NEXT:       Extern: 0
> > -// CHECK-NEXT:       Type: ARM64_RELOC_UNSIGNED (0)
> > -// CHECK-NEXT:       Symbol: 0x3
> > -// CHECK-NEXT:       Scattered: 0
> > -// CHECK-NEXT:     }
> > -// CHECK-NEXT:     Relocation {
> > -// CHECK-NEXT:       Offset: 0x8
> > -// CHECK-NEXT:       PCRel: 0
> > -// CHECK-NEXT:       Length: 3
> > -// CHECK-NEXT:       Extern: 1
> > -// CHECK-NEXT:       Type: ARM64_RELOC_UNSIGNED (0)
> > -// CHECK-NEXT:       Symbol: L0
> > -// CHECK-NEXT:       Scattered: 0
> > -// CHECK-NEXT:     }
> > -// CHECK-NEXT:     Relocation {
> > -// CHECK-NEXT:       Offset: 0x0
> > -// CHECK-NEXT:       PCRel: 0
> > -// CHECK-NEXT:       Length: 3
> > -// CHECK-NEXT:       Extern: 0
> > -// CHECK-NEXT:       Type: ARM64_RELOC_UNSIGNED (0)
> > -// CHECK-NEXT:       Symbol: 0x2
> > -// CHECK-NEXT:       Scattered: 0
> > -// CHECK-NEXT:     }
> > -// CHECK-NEXT:   }
> > -// CHECK-NEXT: ]
> >
> > Removed: llvm/trunk/test/MC/MachO/x86_64-mergeable.s
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/x86_64-mergeable.s?rev=225227&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/test/MC/MachO/x86_64-mergeable.s (original)
> > +++ llvm/trunk/test/MC/MachO/x86_64-mergeable.s (removed)
> > @@ -1,59 +0,0 @@
> > -// RUN: llvm-mc -triple x86_64-apple-darwin14 %s -filetype=obj -o - |
> llvm-readobj -r --expand-relocs | FileCheck %s
> > -
> > -// Test that we "S + K" produce a relocation with a symbol, but just S
> produces
> > -// a relocation with the section.
> > -
> > -       .section        __TEXT,__literal4,4byte_literals
> > -L0:
> > -       .long   42
> > -
> > -       .section        __TEXT,__cstring,cstring_literals
> > -L1:
> > -       .asciz  "42"
> > -
> > -       .section        __DATA,__data
> > -       .quad   L0
> > -       .quad   L0 + 1
> > -       .quad   L1
> > -       .quad   L1 + 1
> > -
> > -// CHECK:      Relocations [
> > -// CHECK-NEXT:   Section __data {
> > -// CHECK-NEXT:     Relocation {
> > -// CHECK-NEXT:       Offset: 0x18
> > -// CHECK-NEXT:       PCRel: 0
> > -// CHECK-NEXT:       Length: 3
> > -// CHECK-NEXT:       Extern: 1
> > -// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
> > -// CHECK-NEXT:       Symbol: L1
> > -// CHECK-NEXT:       Scattered: 0
> > -// CHECK-NEXT:     }
> > -// CHECK-NEXT:     Relocation {
> > -// CHECK-NEXT:       Offset: 0x10
> > -// CHECK-NEXT:       PCRel: 0
> > -// CHECK-NEXT:       Length: 3
> > -// CHECK-NEXT:       Extern: 0
> > -// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
> > -// CHECK-NEXT:       Symbol: 0x3
> > -// CHECK-NEXT:       Scattered: 0
> > -// CHECK-NEXT:     }
> > -// CHECK-NEXT:     Relocation {
> > -// CHECK-NEXT:       Offset: 0x8
> > -// CHECK-NEXT:       PCRel: 0
> > -// CHECK-NEXT:       Length: 3
> > -// CHECK-NEXT:       Extern: 1
> > -// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
> > -// CHECK-NEXT:       Symbol: L0
> > -// CHECK-NEXT:       Scattered: 0
> > -// CHECK-NEXT:     }
> > -// CHECK-NEXT:     Relocation {
> > -// CHECK-NEXT:       Offset: 0x0
> > -// CHECK-NEXT:       PCRel: 0
> > -// CHECK-NEXT:       Length: 3
> > -// CHECK-NEXT:       Extern: 0
> > -// CHECK-NEXT:       Type: X86_64_RELOC_UNSIGNED (0)
> > -// CHECK-NEXT:       Symbol: 0x2
> > -// CHECK-NEXT:       Scattered: 0
> > -// CHECK-NEXT:     }
> > -// CHECK-NEXT:   }
> > -// CHECK-NEXT: ]
> >
> > Modified: llvm/trunk/test/MC/MachO/x86_64-symbols.s
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/x86_64-symbols.s?rev=225228&r1=225227&r2=225228&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/MC/MachO/x86_64-symbols.s (original)
> > +++ llvm/trunk/test/MC/MachO/x86_64-symbols.s Mon Jan  5 18:54:32 2015
> > @@ -121,12 +121,6 @@ D38:
> >  //L39:
> >  //D39:
> >
> > -        .section foo, bar
> > -        .long L4 + 1
> > -        .long L35 + 1
> > -        .long L36 + 1
> > -        .long L37 + 1
> > -        .long L38 + 1
> >
> >  // CHECK: Symbols [
> >  // CHECK-NEXT:   Symbol {
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150115/c566193a/attachment.html>


More information about the llvm-commits mailing list