[llvm] r225048 - Add r224985 back with a fix.

Michael Zolotukhin mzolotukhin at apple.com
Fri Jan 9 16:52:15 PST 2015


Hi Rafael,

I just finished testing your patch on SPEC2000 on AArch64 with PGO and LTO, and everything looks to be working fine. SPEC2006 are still running.
I’ll give you an update when they finish, but I expect them to pass as well, since the fails in SPEC2000 have disappeared.

Thanks,
Michael

> On Jan 6, 2015, at 3:02 PM, Rafael Espíndola <rafael.espindola at gmail.com> wrote:
> 
> I am not sure about the specifics of profiling, but this patch got
> reverted because it caused other problems with cstrings.
> 
> In the thread for r225228 (which reverted this) I included an updated
> patch. It would be awesome if you could test it :-)
> 
> 
> On 6 January 2015 at 17:33, Michael Zolotukhin <mzolotukhin at apple.com> wrote:
>> Hi,
>> 
>> It looks like this commit broke profiling on AArch64: I ran SPEC2000,
>> SPEC2006 and saw a bunch of failures. The benchmarks hung during profile
>> generation step, that is, when we run an executable built with
>> ‘-fprofile-instr-generate’.
>> 
>> Here is a small reproducer for the issue:
>> 
>>> cat fail.c
>> #include <stdio.h>
>> #include <string.h>
>> 
>> char * strip_left[] = {"(", "$", NULL};
>> char * strip_right[] = {")", "%", ",", ".", ":", ";", "?", "!", "'", "'s",
>> NULL};
>> 
>> int separate_word(char * w, char *wend, int is_first_word) {
>>    int i;
>>    for (;;) {
>> for (i=0; strip_left[i] != NULL; i++) {
>>   if (strncmp(w, strip_left[i], strlen(strip_left[i])) == 0) {
>> w += strlen(strip_left[i]);
>> break;
>>   }
>> }
>> if (strip_left[i] == NULL) break;
>>    }
>>    return 1;
>> }
>> int main(int argc, char** argv) {
>>    int batch;
>>    int prob;
>>    int i;
>> 
>>    char a[] = {84, 104, 105, 115, 0};
>>    printf("Starting...\n");
>>    if (!separate_word(&a[0], &a[4], 1)) return 0;
>>    printf("OK!\n");
>>    return 0;
>> }
>> 
>>> $CC_225047 -fprofile-instr-generate -O3 -isysroot $SYSROOT -arch arm64
>>> fail.c -o good.out
>>> $CC_225048 -fprofile-instr-generate -O3 -isysroot $SYSROOT -arch arm64
>>> fail.c -o bad.out
>> 
>>> # On device:
>> 
>>> ./good.out
>> Starting...
>> OK!
>> 
>>> ./bad.out
>> Starting...
>> Segmentation fault: 11
>> 
>> 
>> Seemingly bad.out and good.out differ only in relocation entries.
>> Do you have any idea what might go wrong here?
>> 
>> Thanks,
>> Michael
>> 
>> On Dec 31, 2014, at 9:19 AM, Rafael Espindola <rafael.espindola at gmail.com>
>> wrote:
>> 
>> Author: rafael
>> Date: Wed Dec 31 11:19:34 2014
>> New Revision: 225048
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=225048&view=rev
>> Log:
>> Add r224985 back with a fix.
>> 
>> The issues was that AArch64 has additional restrictions on when local
>> relocations can be used. We have to take those into consideration when
>> deciding to put a L symbol in the symbol table or not.
>> 
>> Original message:
>> 
>> Remove doesSectionRequireSymbols.
>> 
>> In an assembly expression like
>> 
>> bar:
>> .long L0 + 1
>> 
>> the intended semantics is that bar will contain a pointer one byte past L0.
>> 
>> In sections that are merged by content (strings, 4 byte constants, etc), a
>> single position in the section doesn't give the linker enough information.
>> For example, it would not be able to tell a relocation must point to the
>> end of a string, since that would look just like the start of the next.
>> 
>> The solution used in ELF to use relocation with symbols if there is a
>> non-zero
>> addend.
>> 
>> In MachO before this patch we would just keep all symbols in some sections.
>> 
>> This would miss some cases (only cstrings on x86_64 were implemented) and
>> was
>> inefficient since most relocations have an addend of 0 and can be
>> represented
>> without the symbol.
>> 
>> This patch implements the non-zero addend logic for MachO too.
>> 
>> Added:
>>   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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/MC/MCAsmBackend.h (original)
>> +++ llvm/trunk/include/llvm/MC/MCAsmBackend.h Wed Dec 31 11:19:34 2014
>> @@ -61,12 +61,6 @@ 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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/MC/MCAssembler.h (original)
>> +++ llvm/trunk/include/llvm/MC/MCAssembler.h Wed Dec 31 11:19:34 2014
>> @@ -11,6 +11,7 @@
>> #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"
>> @@ -881,6 +882,8 @@ private:
>> 
>>  iplist<MCSymbolData> Symbols;
>> 
>> +  DenseSet<const MCSymbol *> LocalsUsedInReloc;
>> +
>>  /// The map of sections to their associated assembler backend data.
>>  //
>>  // FIXME: Avoid this indirection?
>> @@ -980,6 +983,9 @@ 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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/MC/MCMachObjectWriter.h (original)
>> +++ llvm/trunk/include/llvm/MC/MCMachObjectWriter.h Wed Dec 31 11:19:34 2014
>> @@ -68,12 +68,10 @@ public:
>>  /// @name API
>>  /// @{
>> 
>> -  virtual void RecordRelocation(MachObjectWriter *Writer,
>> -                                const MCAssembler &Asm,
>> +  virtual void RecordRelocation(MachObjectWriter *Writer, MCAssembler &Asm,
>>                                const MCAsmLayout &Layout,
>>                                const MCFragment *Fragment,
>> -                                const MCFixup &Fixup,
>> -                                MCValue Target,
>> +                                const MCFixup &Fixup, MCValue Target,
>>                                uint64_t &FixedValue) = 0;
>> 
>>  /// @}
>> @@ -97,8 +95,14 @@ class MachObjectWriter : public MCObject
>>  /// @name Relocation Data
>>  /// @{
>> 
>> -  llvm::DenseMap<const MCSectionData*,
>> -                 std::vector<MachO::any_relocation_info> > Relocations;
>> +  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*, unsigned> IndirectSymBase;
>> 
>>  /// @}
>> @@ -213,9 +217,15 @@ public:
>>  //  - Input errors, where something cannot be correctly encoded. 'as'
>> allows
>>  //    these through in many cases.
>> 
>> -  void addRelocation(const MCSectionData *SD,
>> +  // 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,
>>                     MachO::any_relocation_info &MRE) {
>> -    Relocations[SD].push_back(MRE);
>> +    RelAndSymbol P(RelSymbol, MRE);
>> +    Relocations[SD].push_back(P);
>>  }
>> 
>>  void RecordScatteredRelocation(const MCAssembler &Asm,
>> @@ -231,7 +241,7 @@ public:
>>                            const MCFixup &Fixup, MCValue Target,
>>                            uint64_t &FixedValue);
>> 
>> -  void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
>> +  void RecordRelocation(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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/include/llvm/MC/MCObjectWriter.h (original)
>> +++ llvm/trunk/include/llvm/MC/MCObjectWriter.h Wed Dec 31 11:19:34 2014
>> @@ -76,12 +76,10 @@ 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(const MCAssembler &Asm,
>> -                                const MCAsmLayout &Layout,
>> +  virtual void RecordRelocation(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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
>> +++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Wed Dec 31 11:19:34 2014
>> @@ -219,7 +219,7 @@ class ELFObjectWriter : public MCObjectW
>>                                  const MCSymbolData *SD, uint64_t C,
>>                                  unsigned Type) const;
>> 
>> -    void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout
>> &Layout,
>> +    void RecordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout,
>>                          const MCFragment *Fragment, const MCFixup &Fixup,
>>                          MCValue Target, bool &IsPCRel,
>>                          uint64_t &FixedValue) override;
>> @@ -789,13 +789,11 @@ static const MCSymbol *getWeakRef(const
>>  return nullptr;
>> }
>> 
>> -void ELFObjectWriter::RecordRelocation(const MCAssembler &Asm,
>> +void ELFObjectWriter::RecordRelocation(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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp (original)
>> +++ llvm/trunk/lib/MC/MCAsmInfoDarwin.cpp Wed Dec 31 11:19:34 2014
>> @@ -27,22 +27,7 @@ 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.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)
>> +  if (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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/MC/MCAssembler.cpp (original)
>> +++ llvm/trunk/lib/MC/MCAssembler.cpp Wed Dec 31 11:19:34 2014
>> @@ -425,6 +425,16 @@ 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())
>> @@ -434,8 +444,10 @@ bool MCAssembler::isSymbolLinkerVisible(
>>  if (!Symbol.isInSection())
>>    return false;
>> 
>> -  // Otherwise, check if the section requires symbols even for temporary
>> labels.
>> -  return getBackend().doesSectionRequireSymbols(Symbol.getSection());
>> +  if (isLocalUsedInReloc(Symbol))
>> +    return true;
>> +
>> +  return false;
>> }
>> 
>> 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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/MC/MachObjectWriter.cpp (original)
>> +++ llvm/trunk/lib/MC/MachObjectWriter.cpp Wed Dec 31 11:19:34 2014
>> @@ -448,14 +448,11 @@ void MachObjectWriter::WriteLinkerOption
>>  assert(OS.tell() - Start == Size);
>> }
>> 
>> -
>> -void MachObjectWriter::RecordRelocation(const MCAssembler &Asm,
>> +void MachObjectWriter::RecordRelocation(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);
>> }
>> @@ -616,6 +613,22 @@ 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,
>> @@ -662,10 +675,6 @@ 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::
>> @@ -749,6 +758,10 @@ 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();
>> @@ -839,7 +852,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<MachO::any_relocation_info> &Relocs = Relocations[it];
>> +    std::vector<RelAndSymbol> &Relocs = Relocations[it];
>>    unsigned NumRelocs = Relocs.size();
>>    uint64_t SectionStart = SectionDataStart + getSectionAddress(it);
>>    WriteSection(Asm, Layout, *it, SectionStart, RelocTableEnd, NumRelocs);
>> @@ -933,10 +946,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<MachO::any_relocation_info> &Relocs = Relocations[it];
>> +    std::vector<RelAndSymbol> &Relocs = Relocations[it];
>>    for (unsigned i = 0, e = Relocs.size(); i != e; ++i) {
>> -      Write32(Relocs[e - i - 1].r_word0);
>> -      Write32(Relocs[e - i - 1].r_word1);
>> +      Write32(Relocs[e - i - 1].MRE.r_word0);
>> +      Write32(Relocs[e - i - 1].MRE.r_word1);
>>    }
>>  }
>> 
>> 
>> Modified: llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp?rev=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp (original)
>> +++ llvm/trunk/lib/MC/WinCOFFObjectWriter.cpp Wed Dec 31 11:19:34 2014
>> @@ -175,7 +175,7 @@ public:
>>                                              const MCFragment &FB, bool
>> InSet,
>>                                              bool IsPCRel) const override;
>> 
>> -  void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
>> +  void RecordRelocation(MCAssembler &Asm, const MCAsmLayout &Layout,
>>                        const MCFragment *Fragment, const MCFixup &Fixup,
>>                        MCValue Target, bool &IsPCRel,
>>                        uint64_t &FixedValue) override;
>> @@ -661,13 +661,9 @@ bool WinCOFFObjectWriter::IsSymbolRefDif
>>                                                                InSet,
>> IsPCRel);
>> }
>> 
>> -void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm,
>> -                                           const MCAsmLayout &Layout,
>> -                                           const MCFragment *Fragment,
>> -                                           const MCFixup &Fixup,
>> -                                           MCValue Target,
>> -                                           bool &IsPCRel,
>> -                                           uint64_t &FixedValue) {
>> +void WinCOFFObjectWriter::RecordRelocation(
>> +    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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp
>> (original)
>> +++ llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64AsmBackend.cpp Wed Dec
>> 31 11:19:34 2014
>> @@ -317,42 +317,6 @@ 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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
>> (original)
>> +++ llvm/trunk/lib/Target/AArch64/MCTargetDesc/AArch64MachObjectWriter.cpp
>> Wed Dec 31 11:19:34 2014
>> @@ -10,6 +10,7 @@
>> #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"
>> @@ -33,7 +34,7 @@ public:
>>      : MCMachObjectTargetWriter(true /* is64Bit */, CPUType, CPUSubtype,
>>                                 /*UseAggressiveSymbolFolding=*/true) {}
>> 
>> -  void RecordRelocation(MachObjectWriter *Writer, const MCAssembler &Asm,
>> +  void RecordRelocation(MachObjectWriter *Writer, MCAssembler &Asm,
>>                        const MCAsmLayout &Layout, const MCFragment
>> *Fragment,
>>                        const MCFixup &Fixup, MCValue Target,
>>                        uint64_t &FixedValue) override;
>> @@ -113,7 +114,7 @@ bool AArch64MachObjectWriter::getAArch64
>> }
>> 
>> void AArch64MachObjectWriter::RecordRelocation(
>> -    MachObjectWriter *Writer, const MCAssembler &Asm, const MCAsmLayout
>> &Layout,
>> +    MachObjectWriter *Writer, MCAssembler &Asm, const MCAsmLayout &Layout,
>>    const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target,
>>    uint64_t &FixedValue) {
>>  unsigned IsPCRel = Writer->isFixupKindPCRel(Asm, Fixup.getKind());
>> @@ -123,9 +124,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();
>> 
>> @@ -171,10 +172,8 @@ 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!");
>> 
>> @@ -198,15 +197,12 @@ 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 = ((Index << 0) | (IsPCRel << 24) | (Log2Size << 25) |
>> -                     (IsExtern << 27) | (Type << 28));
>> -      Writer->addRelocation(Fragment->getParent(), MRE);
>> +      MRE.r_word1 = (IsPCRel << 24) | (Log2Size << 25) | (Type << 28);
>> +      Writer->addRelocation(A_Base, Fragment->getParent(), MRE);
>>      return;
>>    } else if (Target.getSymA()->getKind() != MCSymbolRefExpr::VK_None ||
>>               Target.getSymB()->getKind() != MCSymbolRefExpr::VK_None)
>> @@ -252,26 +248,34 @@ 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 = ((Index << 0) | (IsPCRel << 24) | (Log2Size << 25) |
>> -                   (IsExtern << 27) | (Type << 28));
>> -    Writer->addRelocation(Fragment->getParent(), MRE);
>> +    MRE.r_word1 = (IsPCRel << 24) | (Log2Size << 25) | (Type << 28);
>> +    Writer->addRelocation(A_Base, Fragment->getParent(), MRE);
>> 
>> -    Index = B_Base->getIndex();
>> -    IsExtern = 1;
>> +    RelSymbol = B_Base;
>>    Type = MachO::ARM64_RELOC_SUBTRACTOR;
>>  } else { // A + constant
>>    const MCSymbol *Symbol = &Target.getSymA()->getSymbol();
>> -    const MCSymbolData &SD = Asm.getSymbolData(*Symbol);
>> -    const MCSymbolData *Base = Asm.getAtom(&SD);
>>    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);
>> +
>>    // 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
>>    // the relocation based its expansion instead.
>> @@ -310,16 +314,13 @@ void AArch64MachObjectWriter::RecordRelo
>>    // sections, and for pointer-sized relocations (.quad), we allow section
>>    // relocations.  It's code sections that run into trouble.
>>    if (Base) {
>> -      Index = Base->getIndex();
>> -      IsExtern = 1;
>> +      RelSymbol = Base;
>> 
>>      // Add the local offset, if needed.
>>      if (Base != &SD)
>>        Value += Layout.getSymbolOffset(&SD) - Layout.getSymbolOffset(Base);
>>    } else if (Symbol->isInSection()) {
>> -      // 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)
>> +      if (!CanUseLocalRelocation)
>>        Asm.getContext().FatalError(
>>            Fixup.getLoc(),
>>            "unsupported relocation of local symbol '" + Symbol->getName() +
>> @@ -329,7 +330,6 @@ 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) |
>> -                   (IsExtern << 27) | (Type << 28));
>> -    Writer->addRelocation(Fragment->getParent(), MRE);
>> +    MRE.r_word1 =
>> +        (Index << 0) | (IsPCRel << 24) | (Log2Size << 25) | (Type << 28);
>> +    Writer->addRelocation(RelSymbol, 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) |
>> -                 (IsExtern << 27) | (Type << 28));
>> -  Writer->addRelocation(Fragment->getParent(), MRE);
>> +  MRE.r_word1 =
>> +      (Index << 0) | (IsPCRel << 24) | (Log2Size << 25) | (Type << 28);
>> +  Writer->addRelocation(RelSymbol, 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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp
>> (original)
>> +++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMMachObjectWriter.cpp Wed Dec
>> 31 11:19:34 2014
>> @@ -54,10 +54,10 @@ public:
>>    : MCMachObjectTargetWriter(Is64Bit, CPUType, CPUSubtype,
>>                               /*UseAggressiveSymbolFolding=*/true) {}
>> 
>> -  void RecordRelocation(MachObjectWriter *Writer,
>> -                        const MCAssembler &Asm, const MCAsmLayout &Layout,
>> -                        const MCFragment *Fragment, const MCFixup &Fixup,
>> -                        MCValue Target, uint64_t &FixedValue) override;
>> +  void RecordRelocation(MachObjectWriter *Writer, 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(Fragment->getParent(), MRE);
>> +    Writer->addRelocation(nullptr, 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(Fragment->getParent(), MRE);
>> +  Writer->addRelocation(nullptr, 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(Fragment->getParent(), MRE);
>> +    Writer->addRelocation(nullptr, 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(Fragment->getParent(), MRE);
>> +  Writer->addRelocation(nullptr, Fragment->getParent(), MRE);
>> }
>> 
>> bool ARMMachObjectWriter::requiresExternRelocation(MachObjectWriter *Writer,
>> @@ -351,11 +351,10 @@ bool ARMMachObjectWriter::requiresExtern
>> }
>> 
>> void ARMMachObjectWriter::RecordRelocation(MachObjectWriter *Writer,
>> -                                           const MCAssembler &Asm,
>> +                                           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;
>> @@ -401,8 +400,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!
>> @@ -422,8 +421,7 @@ void ARMMachObjectWriter::RecordRelocati
>>    // Check whether we need an external or internal relocation.
>>    if (requiresExternRelocation(Writer, Asm, *Fragment, RelocType, SD,
>>                                 FixedValue)) {
>> -      IsExtern = 1;
>> -      Index = SD->getIndex();
>> +      RelSymbol = SD;
>> 
>>      // For external relocations, make sure to offset the fixup value to
>>      // compensate for the addend of the symbol address, if it was
>> @@ -447,11 +445,8 @@ 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) |
>> -                 (IsExtern  << 27) |
>> -                 (Type      << 28));
>> +  MRE.r_word1 =
>> +      (Index << 0) | (IsPCRel << 24) | (Log2Size << 25) | (Type << 28);
>> 
>>  // Even when it's not a scattered relocation, movw/movt always uses
>>  // a PAIR relocation.
>> @@ -476,10 +471,10 @@ void ARMMachObjectWriter::RecordRelocati
>>                       (Log2Size              << 25) |
>>                       (MachO::ARM_RELOC_PAIR << 28));
>> 
>> -    Writer->addRelocation(Fragment->getParent(), MREPair);
>> +    Writer->addRelocation(nullptr, Fragment->getParent(), MREPair);
>>  }
>> 
>> -  Writer->addRelocation(Fragment->getParent(), MRE);
>> +  Writer->addRelocation(RelSymbol, 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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp
>> (original)
>> +++ llvm/trunk/lib/Target/PowerPC/MCTargetDesc/PPCMachObjectWriter.cpp Wed
>> Dec 31 11:19:34 2014
>> @@ -41,7 +41,7 @@ public:
>>      : MCMachObjectTargetWriter(Is64Bit, CPUType, CPUSubtype,
>>                                 /*UseAggressiveSymbolFolding=*/Is64Bit) {}
>> 
>> -  void RecordRelocation(MachObjectWriter *Writer, const MCAssembler &Asm,
>> +  void RecordRelocation(MachObjectWriter *Writer, 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(Fragment->getParent(), MRE);
>> +    Writer->addRelocation(nullptr, 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(Fragment->getParent(), MRE);
>> +  Writer->addRelocation(nullptr, 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,8 +355,7 @@ void PPCMachObjectWriter::RecordPPCReloc
>> 
>>    // Check whether we need an external or internal relocation.
>>    if (Writer->doesSymbolRequireExternRelocation(SD)) {
>> -      IsExtern = 1;
>> -      Index = SD->getIndex();
>> +      RelSymbol = SD;
>>      // 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.
>> @@ -375,9 +374,8 @@ void PPCMachObjectWriter::RecordPPCReloc
>> 
>>  // struct relocation_info (8 bytes)
>>  MachO::any_relocation_info MRE;
>> -  makeRelocationInfo(MRE, FixupOffset, Index, IsPCRel, Log2Size, IsExtern,
>> -                     Type);
>> -  Writer->addRelocation(Fragment->getParent(), MRE);
>> +  makeRelocationInfo(MRE, FixupOffset, Index, IsPCRel, Log2Size, false,
>> Type);
>> +  Writer->addRelocation(RelSymbol, 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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/R600/MCTargetDesc/AMDGPUAsmBackend.cpp (original)
>> +++ llvm/trunk/lib/Target/R600/MCTargetDesc/AMDGPUAsmBackend.cpp Wed Dec 31
>> 11:19:34 2014
>> @@ -29,7 +29,7 @@ public:
>>                                const MCAsmLayout &Layout) override {
>>    //XXX: Implement if necessary.
>>  }
>> -  void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
>> +  void RecordRelocation(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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp (original)
>> +++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp Wed Dec 31
>> 11:19:34 2014
>> @@ -777,19 +777,6 @@ 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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp
>> (original)
>> +++ llvm/trunk/lib/Target/X86/MCTargetDesc/X86MachObjectWriter.cpp Wed Dec
>> 31 11:19:34 2014
>> @@ -10,6 +10,7 @@
>> #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"
>> @@ -47,23 +48,21 @@ class X86MachObjectWriter : public MCMac
>>                              const MCFixup &Fixup,
>>                              MCValue Target,
>>                              uint64_t &FixedValue);
>> -  void RecordX86_64Relocation(MachObjectWriter *Writer,
>> -                              const MCAssembler &Asm,
>> +  void RecordX86_64Relocation(MachObjectWriter *Writer, 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,
>> -                        const MCAssembler &Asm, const MCAsmLayout &Layout,
>> -                        const MCFragment *Fragment, const MCFixup &Fixup,
>> -                        MCValue Target, uint64_t &FixedValue) override {
>> +  void RecordRelocation(MachObjectWriter *Writer, 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);
>> @@ -97,13 +96,10 @@ static unsigned getFixupKindLog2Size(uns
>>  }
>> }
>> 
>> -void X86MachObjectWriter::RecordX86_64Relocation(MachObjectWriter *Writer,
>> -                                                 const MCAssembler &Asm,
>> -                                                 const MCAsmLayout &Layout,
>> -                                                 const MCFragment
>> *Fragment,
>> -                                                 const MCFixup &Fixup,
>> -                                                 MCValue Target,
>> -                                                 uint64_t &FixedValue) {
>> +void X86MachObjectWriter::RecordX86_64Relocation(
>> +    MachObjectWriter *Writer, 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());
>> @@ -117,6 +113,7 @@ void X86MachObjectWriter::RecordX86_64Re
>>  unsigned Index = 0;
>>  unsigned IsExtern = 0;
>>  unsigned Type = 0;
>> +  const MCSymbolData *RelSymbol = nullptr;
>> 
>>  Value = Target.getConstant();
>> 
>> @@ -132,7 +129,6 @@ 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
>> @@ -193,36 +189,30 @@ void X86MachObjectWriter::RecordX86_64Re
>>    Value -= Writer->getSymbolAddress(&B_SD, Layout) -
>>      (!B_Base ? 0 : Writer->getSymbolAddress(B_Base, Layout));
>> 
>> -    if (A_Base) {
>> -      Index = A_Base->getIndex();
>> -      IsExtern = 1;
>> -    } else {
>> +    if (!A_Base)
>>      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) |
>> -                   (IsExtern  << 27) |
>> -                   (Type      << 28));
>> -    Writer->addRelocation(Fragment->getParent(), MRE);
>> +    MRE.r_word1 =
>> +        (Index << 0) | (IsPCRel << 24) | (Log2Size << 25) | (Type << 28);
>> +    Writer->addRelocation(A_Base, Fragment->getParent(), MRE);
>> 
>> -    if (B_Base) {
>> -      Index = B_Base->getIndex();
>> -      IsExtern = 1;
>> -    } else {
>> +    if (B_Base)
>> +      RelSymbol = B_Base;
>> +    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);
>> -    const MCSymbolData *Base = Asm.getAtom(&SD);
>> +    RelSymbol = Asm.getAtom(&SD);
>> 
>>    // Relocations inside debug sections always use local relocations when
>>    // possible. This seems to be done because the debugger doesn't fully
>> @@ -232,23 +222,20 @@ void X86MachObjectWriter::RecordX86_64Re
>>      const MCSectionMachO &Section = static_cast<const MCSectionMachO&>(
>>        Fragment->getParent()->getSection());
>>      if (Section.hasAttribute(MachO::S_ATTR_DEBUG))
>> -        Base = nullptr;
>> +        RelSymbol = 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 (Base) {
>> -      Index = Base->getIndex();
>> -      IsExtern = 1;
>> -
>> +    if (RelSymbol) {
>>      // Add the local offset, if needed.
>> -      if (Base != &SD)
>> -        Value += Layout.getSymbolOffset(&SD) -
>> Layout.getSymbolOffset(Base);
>> +      if (RelSymbol != &SD)
>> +        Value +=
>> +            Layout.getSymbolOffset(&SD) -
>> Layout.getSymbolOffset(RelSymbol);
>>    } 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)
>> @@ -347,12 +334,9 @@ 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(Fragment->getParent(), MRE);
>> +  MRE.r_word1 = (Index << 0) | (IsPCRel << 24) | (Log2Size << 25) |
>> +                (IsExtern << 27) | (Type << 28);
>> +  Writer->addRelocation(RelSymbol, Fragment->getParent(), MRE);
>> }
>> 
>> bool X86MachObjectWriter::RecordScatteredRelocation(MachObjectWriter
>> *Writer,
>> @@ -424,7 +408,7 @@ bool X86MachObjectWriter::RecordScattere
>>                   (IsPCRel                   << 30) |
>>                   MachO::R_SCATTERED);
>>    MRE.r_word1 = Value2;
>> -    Writer->addRelocation(Fragment->getParent(), MRE);
>> +    Writer->addRelocation(nullptr, 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
>> @@ -446,7 +430,7 @@ bool X86MachObjectWriter::RecordScattere
>>                 (IsPCRel     << 30) |
>>                 MachO::R_SCATTERED);
>>  MRE.r_word1 = Value;
>> -  Writer->addRelocation(Fragment->getParent(), MRE);
>> +  Writer->addRelocation(nullptr, Fragment->getParent(), MRE);
>>  return true;
>> }
>> 
>> @@ -467,7 +451,6 @@ 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
>> @@ -490,12 +473,9 @@ void X86MachObjectWriter::RecordTLVPRelo
>>  // struct relocation_info (8 bytes)
>>  MachO::any_relocation_info MRE;
>>  MRE.r_word0 = Value;
>> -  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);
>> +  MRE.r_word1 =
>> +      (IsPCRel << 24) | (Log2Size << 25) | (MachO::GENERIC_RELOC_TLV <<
>> 28);
>> +  Writer->addRelocation(SD_A, Fragment->getParent(), MRE);
>> }
>> 
>> void X86MachObjectWriter::RecordX86Relocation(MachObjectWriter *Writer,
>> @@ -546,8 +526,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.
>> @@ -568,8 +548,7 @@ void X86MachObjectWriter::RecordX86Reloc
>> 
>>    // Check whether we need an external or internal relocation.
>>    if (Writer->doesSymbolRequireExternRelocation(SD)) {
>> -      IsExtern = 1;
>> -      Index = SD->getIndex();
>> +      RelSymbol = SD;
>>      // 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.
>> @@ -591,12 +570,9 @@ 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) |
>> -                 (IsExtern  << 27) |
>> -                 (Type      << 28));
>> -  Writer->addRelocation(Fragment->getParent(), MRE);
>> +  MRE.r_word1 =
>> +      (Index << 0) | (IsPCRel << 24) | (Log2Size << 25) | (Type << 28);
>> +  Writer->addRelocation(RelSymbol, Fragment->getParent(), MRE);
>> }
>> 
>> MCObjectWriter *llvm::createX86MachObjectWriter(raw_ostream &OS,
>> 
>> Added: llvm/trunk/test/MC/MachO/AArch64/mergeable.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/MachO/AArch64/mergeable.s?rev=225048&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/MC/MachO/AArch64/mergeable.s (added)
>> +++ llvm/trunk/test/MC/MachO/AArch64/mergeable.s Wed Dec 31 11:19:34 2014
>> @@ -0,0 +1,59 @@
>> +// 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: ]
>> 
>> Added: 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=225048&view=auto
>> ==============================================================================
>> --- llvm/trunk/test/MC/MachO/x86_64-mergeable.s (added)
>> +++ llvm/trunk/test/MC/MachO/x86_64-mergeable.s Wed Dec 31 11:19:34 2014
>> @@ -0,0 +1,59 @@
>> +// 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=225048&r1=225047&r2=225048&view=diff
>> ==============================================================================
>> --- llvm/trunk/test/MC/MachO/x86_64-symbols.s (original)
>> +++ llvm/trunk/test/MC/MachO/x86_64-symbols.s Wed Dec 31 11:19:34 2014
>> @@ -121,6 +121,12 @@ 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
>> 
>> 





More information about the llvm-commits mailing list