[llvm] r225228 - Revert r225048: It broke ObjC on AArch64.
Rafael EspĂndola
rafael.espindola at gmail.com
Mon Jan 5 18:16:04 PST 2015
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 --------------
A non-text attachment was scrubbed...
Name: t.patch
Type: application/octet-stream
Size: 51445 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150105/c5dd4199/attachment.obj>
More information about the llvm-commits
mailing list