| Index: lib/MC/ELFObjectWriter.cpp
|
| ===================================================================
|
| --- lib/MC/ELFObjectWriter.cpp (revision 118714)
|
| +++ lib/MC/ELFObjectWriter.cpp (working copy)
|
| @@ -101,6 +101,7 @@
|
| namespace {
|
|
|
| class ELFObjectWriterImpl {
|
| + protected:
|
| /*static bool isFixupKindX86RIPRel(unsigned Kind) {
|
| return Kind == X86::reloc_riprel_4byte ||
|
| Kind == X86::reloc_riprel_4byte_movq_load;
|
| @@ -197,7 +198,7 @@
|
| Is64Bit(_Is64Bit), HasRelocationAddend(_HasRelAddend),
|
| OSType(_OSType), EMachine(_EMachine) {
|
| }
|
| -
|
| + virtual ~ELFObjectWriterImpl();
|
| void Write8(uint8_t Value) { Writer->Write8(Value); }
|
| void Write16(uint16_t Value) { Writer->Write16(Value); }
|
| void Write32(uint32_t Value) { Writer->Write32(Value); }
|
| @@ -277,28 +278,32 @@
|
| F.getContents() += StringRef(buf, 8);
|
| }
|
|
|
| - void WriteHeader(uint64_t SectionDataSize, unsigned NumberOfSections);
|
| + /// @name new virtuals
|
| + /// @{
|
| + virtual void WriteHeader(uint64_t SectionDataSize, unsigned NumberOfSections);
|
|
|
| - void WriteSymbolEntry(MCDataFragment *SymtabF, MCDataFragment *ShndxF,
|
| + virtual void WriteSymbolEntry(MCDataFragment *SymtabF, MCDataFragment *ShndxF,
|
| uint64_t name, uint8_t info,
|
| uint64_t value, uint64_t size,
|
| uint8_t other, uint32_t shndx,
|
| bool Reserved);
|
|
|
| - void WriteSymbol(MCDataFragment *SymtabF, MCDataFragment *ShndxF,
|
| + virtual void WriteSymbol(MCDataFragment *SymtabF, MCDataFragment *ShndxF,
|
| ELFSymbolData &MSD,
|
| const MCAsmLayout &Layout);
|
|
|
| - void WriteSymbolTable(MCDataFragment *SymtabF, MCDataFragment *ShndxF,
|
| + virtual void WriteSymbolTable(MCDataFragment *SymtabF, MCDataFragment *ShndxF,
|
| const MCAssembler &Asm,
|
| const MCAsmLayout &Layout,
|
| unsigned NumRegularSections);
|
|
|
| - void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
|
| + virtual void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
|
| const MCFragment *Fragment, const MCFixup &Fixup,
|
| - MCValue Target, uint64_t &FixedValue);
|
| + MCValue Target, uint64_t &FixedValue) {
|
| + assert(0 && "RecordRelocation is not specific enough");
|
| + };
|
|
|
| - uint64_t getSymbolIndexInSymbolTable(const MCAssembler &Asm,
|
| + virtual uint64_t getSymbolIndexInSymbolTable(const MCAssembler &Asm,
|
| const MCSymbol *S);
|
|
|
| /// ComputeSymbolTable - Compute the symbol table data
|
| @@ -306,40 +311,68 @@
|
| /// \param StringTable [out] - The string table data.
|
| /// \param StringIndexMap [out] - Map from symbol names to offsets in the
|
| /// string table.
|
| - void ComputeSymbolTable(MCAssembler &Asm);
|
| + virtual void ComputeSymbolTable(MCAssembler &Asm);
|
|
|
| - void WriteRelocation(MCAssembler &Asm, MCAsmLayout &Layout,
|
| + virtual void WriteRelocation(MCAssembler &Asm, MCAsmLayout &Layout,
|
| const MCSectionData &SD);
|
|
|
| - void WriteRelocations(MCAssembler &Asm, MCAsmLayout &Layout) {
|
| + virtual void WriteRelocations(MCAssembler &Asm, MCAsmLayout &Layout) {
|
| for (MCAssembler::const_iterator it = Asm.begin(),
|
| ie = Asm.end(); it != ie; ++it) {
|
| WriteRelocation(Asm, Layout, *it);
|
| }
|
| }
|
|
|
| - void CreateMetadataSections(MCAssembler &Asm, MCAsmLayout &Layout);
|
| + virtual void CreateMetadataSections(MCAssembler &Asm, MCAsmLayout &Layout);
|
|
|
| - void ExecutePostLayoutBinding(MCAssembler &Asm);
|
| + virtual void ExecutePostLayoutBinding(MCAssembler &Asm);
|
|
|
| - void WriteSecHdrEntry(uint32_t Name, uint32_t Type, uint64_t Flags,
|
| + virtual void WriteSecHdrEntry(uint32_t Name, uint32_t Type, uint64_t Flags,
|
| uint64_t Address, uint64_t Offset,
|
| uint64_t Size, uint32_t Link, uint32_t Info,
|
| uint64_t Alignment, uint64_t EntrySize);
|
|
|
| - void WriteRelocationsFragment(const MCAssembler &Asm, MCDataFragment *F,
|
| + virtual void WriteRelocationsFragment(const MCAssembler &Asm, MCDataFragment *F,
|
| const MCSectionData *SD);
|
|
|
| - bool IsFixupFullyResolved(const MCAssembler &Asm,
|
| + virtual bool IsFixupFullyResolved(const MCAssembler &Asm,
|
| const MCValue Target,
|
| bool IsPCRel,
|
| const MCFragment *DF) const;
|
|
|
| - void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout);
|
| + virtual void WriteObject(MCAssembler &Asm, const MCAsmLayout &Layout);
|
| + /// @}
|
| };
|
|
|
| +
|
| +class X86ELFObjectWriterImpl : public ELFObjectWriterImpl {
|
| +public:
|
| + X86ELFObjectWriterImpl(ELFObjectWriter *_Writer, bool _Is64Bit,
|
| + uint16_t _EMachine, bool _HasRelAddend,
|
| + Triple::OSType _OSType);
|
| + virtual void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
|
| + const MCFragment *Fragment, const MCFixup &Fixup,
|
| + MCValue Target, uint64_t &FixedValue);
|
| + virtual ~X86ELFObjectWriterImpl();
|
| +};
|
| +
|
| +class ARMELFObjectWriterImpl : public ELFObjectWriterImpl {
|
| +public:
|
| + ARMELFObjectWriterImpl(ELFObjectWriter *_Writer, bool _Is64Bit,
|
| + uint16_t _EMachine, bool _HasRelAddend,
|
| + Triple::OSType _OSType);
|
| + virtual void RecordRelocation(const MCAssembler &Asm, const MCAsmLayout &Layout,
|
| + const MCFragment *Fragment, const MCFixup &Fixup,
|
| + MCValue Target, uint64_t &FixedValue);
|
| + ~ARMELFObjectWriterImpl();
|
| +};
|
| +
|
| }
|
|
|
| +// new virtual destructor
|
| +ELFObjectWriterImpl::~ELFObjectWriterImpl()
|
| +{}
|
| +
|
| // Emit the ELF header.
|
| void ELFObjectWriterImpl::WriteHeader(uint64_t SectionDataSize,
|
| unsigned NumberOfSections) {
|
| @@ -649,223 +682,7 @@
|
| return false;
|
| }
|
|
|
| -// FIXME: this is currently X86/X86_64 only
|
| -void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,
|
| - const MCAsmLayout &Layout,
|
| - const MCFragment *Fragment,
|
| - const MCFixup &Fixup,
|
| - MCValue Target,
|
| - uint64_t &FixedValue) {
|
| - int64_t Addend = 0;
|
| - int Index = 0;
|
| - int64_t Value = Target.getConstant();
|
| - const MCSymbol *Symbol = 0;
|
| - const MCSymbol *Renamed = 0;
|
|
|
| - bool IsPCRel = isFixupKindX86PCRel(Fixup.getKind());
|
| - if (!Target.isAbsolute()) {
|
| - Symbol = &AliasedSymbol(Target.getSymA()->getSymbol());
|
| - Renamed = Renames.lookup(Symbol);
|
| - if (!Renamed)
|
| - Renamed = &Target.getSymA()->getSymbol();
|
| - MCSymbolData &SD = Asm.getSymbolData(*Symbol);
|
| - MCFragment *F = SD.getFragment();
|
| -
|
| - if (const MCSymbolRefExpr *RefB = Target.getSymB()) {
|
| - const MCSymbol &SymbolB = RefB->getSymbol();
|
| - MCSymbolData &SDB = Asm.getSymbolData(SymbolB);
|
| - IsPCRel = true;
|
| - MCSectionData *Sec = Fragment->getParent();
|
| -
|
| - // Offset of the symbol in the section
|
| - int64_t a = Layout.getSymbolAddress(&SDB) - Layout.getSectionAddress(Sec);
|
| -
|
| - // Ofeset of the relocation in the section
|
| - int64_t b = Layout.getFragmentOffset(Fragment) + Fixup.getOffset();
|
| - Value += b - a;
|
| - }
|
| -
|
| - // Check that this case has already been fully resolved before we get
|
| - // here.
|
| - if (Symbol->isDefined() && !SD.isExternal() &&
|
| - IsPCRel &&
|
| - &Fragment->getParent()->getSection() == &Symbol->getSection()) {
|
| - llvm_unreachable("We don't need a relocation in this case.");
|
| - return;
|
| - }
|
| -
|
| - bool RelocOnSymbol = ShouldRelocOnSymbol(SD, Target, *Fragment);
|
| - if (!RelocOnSymbol) {
|
| - Index = F->getParent()->getOrdinal();
|
| -
|
| - MCSectionData *FSD = F->getParent();
|
| - // Offset of the symbol in the section
|
| - Value += Layout.getSymbolAddress(&SD) - Layout.getSectionAddress(FSD);
|
| - } else {
|
| - UsedInReloc.insert(Renamed);
|
| - MCSymbolData &RenamedSD = Asm.getSymbolData(*Renamed);
|
| - if (RenamedSD.getFlags() & ELF_Other_Weakref) {
|
| - WeakrefUsedInReloc.insert(Symbol);
|
| - }
|
| - Index = -1;
|
| - }
|
| - Addend = Value;
|
| - // Compensate for the addend on i386.
|
| - if (Is64Bit)
|
| - Value = 0;
|
| - }
|
| -
|
| - FixedValue = Value;
|
| -
|
| - // determine the type of the relocation
|
| -
|
| - MCSymbolRefExpr::VariantKind Modifier = Target.getSymA()->getKind();
|
| - unsigned Type;
|
| - if (Is64Bit) {
|
| - if (IsPCRel) {
|
| - switch (Modifier) {
|
| - default:
|
| - llvm_unreachable("Unimplemented");
|
| - case MCSymbolRefExpr::VK_None:
|
| - Type = ELF::R_X86_64_PC32;
|
| - break;
|
| - case MCSymbolRefExpr::VK_PLT:
|
| - Type = ELF::R_X86_64_PLT32;
|
| - break;
|
| - case MCSymbolRefExpr::VK_GOTPCREL:
|
| - Type = ELF::R_X86_64_GOTPCREL;
|
| - break;
|
| - case MCSymbolRefExpr::VK_GOTTPOFF:
|
| - Type = ELF::R_X86_64_GOTTPOFF;
|
| - break;
|
| - case MCSymbolRefExpr::VK_TLSGD:
|
| - Type = ELF::R_X86_64_TLSGD;
|
| - break;
|
| - case MCSymbolRefExpr::VK_TLSLD:
|
| - Type = ELF::R_X86_64_TLSLD;
|
| - break;
|
| - }
|
| - } else {
|
| - switch ((unsigned)Fixup.getKind()) {
|
| - default: llvm_unreachable("invalid fixup kind!");
|
| - case FK_Data_8: Type = ELF::R_X86_64_64; break;
|
| - case X86::reloc_signed_4byte:
|
| - case X86::reloc_pcrel_4byte:
|
| - assert(isInt<32>(Target.getConstant()));
|
| - switch (Modifier) {
|
| - default:
|
| - llvm_unreachable("Unimplemented");
|
| - case MCSymbolRefExpr::VK_None:
|
| - Type = ELF::R_X86_64_32S;
|
| - break;
|
| - case MCSymbolRefExpr::VK_GOT:
|
| - Type = ELF::R_X86_64_GOT32;
|
| - break;
|
| - case MCSymbolRefExpr::VK_GOTPCREL:
|
| - Type = ELF::R_X86_64_GOTPCREL;
|
| - break;
|
| - case MCSymbolRefExpr::VK_TPOFF:
|
| - Type = ELF::R_X86_64_TPOFF32;
|
| - break;
|
| - case MCSymbolRefExpr::VK_DTPOFF:
|
| - Type = ELF::R_X86_64_DTPOFF32;
|
| - break;
|
| - }
|
| - break;
|
| - case FK_Data_4:
|
| - Type = ELF::R_X86_64_32;
|
| - break;
|
| - case FK_Data_2: Type = ELF::R_X86_64_16; break;
|
| - case X86::reloc_pcrel_1byte:
|
| - case FK_Data_1: Type = ELF::R_X86_64_8; break;
|
| - }
|
| - }
|
| - } else {
|
| - if (IsPCRel) {
|
| - switch (Modifier) {
|
| - default:
|
| - llvm_unreachable("Unimplemented");
|
| - case MCSymbolRefExpr::VK_None:
|
| - Type = ELF::R_386_PC32;
|
| - break;
|
| - case MCSymbolRefExpr::VK_PLT:
|
| - Type = ELF::R_386_PLT32;
|
| - break;
|
| - }
|
| - } else {
|
| - switch ((unsigned)Fixup.getKind()) {
|
| - default: llvm_unreachable("invalid fixup kind!");
|
| -
|
| - case X86::reloc_global_offset_table:
|
| - Type = ELF::R_386_GOTPC;
|
| - break;
|
| -
|
| - // FIXME: Should we avoid selecting reloc_signed_4byte in 32 bit mode
|
| - // instead?
|
| - case X86::reloc_signed_4byte:
|
| - case X86::reloc_pcrel_4byte:
|
| - case FK_Data_4:
|
| - switch (Modifier) {
|
| - default:
|
| - llvm_unreachable("Unimplemented");
|
| - case MCSymbolRefExpr::VK_None:
|
| - Type = ELF::R_386_32;
|
| - break;
|
| - case MCSymbolRefExpr::VK_GOT:
|
| - Type = ELF::R_386_GOT32;
|
| - break;
|
| - case MCSymbolRefExpr::VK_GOTOFF:
|
| - Type = ELF::R_386_GOTOFF;
|
| - break;
|
| - case MCSymbolRefExpr::VK_TLSGD:
|
| - Type = ELF::R_386_TLS_GD;
|
| - break;
|
| - case MCSymbolRefExpr::VK_TPOFF:
|
| - Type = ELF::R_386_TLS_LE_32;
|
| - break;
|
| - case MCSymbolRefExpr::VK_INDNTPOFF:
|
| - Type = ELF::R_386_TLS_IE;
|
| - break;
|
| - case MCSymbolRefExpr::VK_NTPOFF:
|
| - Type = ELF::R_386_TLS_LE;
|
| - break;
|
| - case MCSymbolRefExpr::VK_GOTNTPOFF:
|
| - Type = ELF::R_386_TLS_GOTIE;
|
| - break;
|
| - case MCSymbolRefExpr::VK_TLSLDM:
|
| - Type = ELF::R_386_TLS_LDM;
|
| - break;
|
| - case MCSymbolRefExpr::VK_DTPOFF:
|
| - Type = ELF::R_386_TLS_LDO_32;
|
| - break;
|
| - }
|
| - break;
|
| - case FK_Data_2: Type = ELF::R_386_16; break;
|
| - case X86::reloc_pcrel_1byte:
|
| - case FK_Data_1: Type = ELF::R_386_8; break;
|
| - }
|
| - }
|
| - }
|
| -
|
| - if (RelocNeedsGOT(Modifier))
|
| - NeedsGOT = true;
|
| -
|
| - ELFRelocationEntry ERE;
|
| -
|
| - ERE.Index = Index;
|
| - ERE.Type = Type;
|
| - ERE.Symbol = Renamed;
|
| -
|
| - ERE.r_offset = Layout.getFragmentOffset(Fragment) + Fixup.getOffset();
|
| -
|
| - if (HasRelocationAddend)
|
| - ERE.r_addend = Addend;
|
| - else
|
| - ERE.r_addend = 0; // Silence compiler warning.
|
| -
|
| - Relocations[Fragment->getParent()].push_back(ERE);
|
| -}
|
| -
|
| uint64_t
|
| ELFObjectWriterImpl::getSymbolIndexInSymbolTable(const MCAssembler &Asm,
|
| const MCSymbol *S) {
|
| @@ -1374,8 +1191,20 @@
|
| bool HasRelocationAddend)
|
| : MCObjectWriter(OS, IsLittleEndian)
|
| {
|
| - Impl = new ELFObjectWriterImpl(this, Is64Bit, EMachine,
|
| + switch (EMachine) {
|
| + case ELF::EM_MBLAZE:
|
| + case ELF::EM_386:
|
| + case ELF::EM_X86_64:
|
| + Impl = new X86ELFObjectWriterImpl(this, Is64Bit, EMachine,
|
| HasRelocationAddend, OSType);
|
| + break;
|
| + case ELF::EM_ARM:
|
| + Impl = new ARMELFObjectWriterImpl(this, Is64Bit, EMachine,
|
| + HasRelocationAddend, OSType);
|
| + break;
|
| + default:
|
| + assert(0 && "Unsupported EMachine"); break;
|
| + }
|
| }
|
|
|
| ELFObjectWriter::~ELFObjectWriter() {
|
| @@ -1407,3 +1236,255 @@
|
| const MCAsmLayout &Layout) {
|
| ((ELFObjectWriterImpl*) Impl)->WriteObject(Asm, Layout);
|
| }
|
| +
|
| +
|
| +//===- X86ELFObjectWriterImpl ---------------------------------------===//
|
| +
|
| +X86ELFObjectWriterImpl::X86ELFObjectWriterImpl(ELFObjectWriter *_Writer, bool _Is64Bit,
|
| + uint16_t _EMachine, bool _HasRelAddend,
|
| + Triple::OSType _OSType)
|
| + : ELFObjectWriterImpl(_Writer, _Is64Bit, _EMachine, _HasRelAddend, _OSType)
|
| +{}
|
| +
|
| +
|
| +X86ELFObjectWriterImpl::~X86ELFObjectWriterImpl()
|
| +{}
|
| +
|
| +void X86ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,
|
| + const MCAsmLayout &Layout,
|
| + const MCFragment *Fragment,
|
| + const MCFixup &Fixup,
|
| + MCValue Target,
|
| + uint64_t &FixedValue) {
|
| + int64_t Addend = 0;
|
| + int Index = 0;
|
| + int64_t Value = Target.getConstant();
|
| + const MCSymbol *Symbol = 0;
|
| + const MCSymbol *Renamed = 0;
|
| +
|
| + bool IsPCRel = isFixupKindX86PCRel(Fixup.getKind());
|
| + if (!Target.isAbsolute()) {
|
| + Symbol = &AliasedSymbol(Target.getSymA()->getSymbol());
|
| + Renamed = Renames.lookup(Symbol);
|
| + if (!Renamed)
|
| + Renamed = &Target.getSymA()->getSymbol();
|
| + MCSymbolData &SD = Asm.getSymbolData(*Symbol);
|
| + MCFragment *F = SD.getFragment();
|
| +
|
| + if (const MCSymbolRefExpr *RefB = Target.getSymB()) {
|
| + const MCSymbol &SymbolB = RefB->getSymbol();
|
| + MCSymbolData &SDB = Asm.getSymbolData(SymbolB);
|
| + IsPCRel = true;
|
| + MCSectionData *Sec = Fragment->getParent();
|
| +
|
| + // Offset of the symbol in the section
|
| + int64_t a = Layout.getSymbolAddress(&SDB) - Layout.getSectionAddress(Sec);
|
| +
|
| + // Ofeset of the relocation in the section
|
| + int64_t b = Layout.getFragmentOffset(Fragment) + Fixup.getOffset();
|
| + Value += b - a;
|
| + }
|
| +
|
| + // Check that this case has already been fully resolved before we get
|
| + // here.
|
| + if (Symbol->isDefined() && !SD.isExternal() &&
|
| + IsPCRel &&
|
| + &Fragment->getParent()->getSection() == &Symbol->getSection()) {
|
| + llvm_unreachable("We don't need a relocation in this case.");
|
| + return;
|
| + }
|
| +
|
| + bool RelocOnSymbol = ShouldRelocOnSymbol(SD, Target, *Fragment);
|
| + if (!RelocOnSymbol) {
|
| + Index = F->getParent()->getOrdinal();
|
| +
|
| + MCSectionData *FSD = F->getParent();
|
| + // Offset of the symbol in the section
|
| + Value += Layout.getSymbolAddress(&SD) - Layout.getSectionAddress(FSD);
|
| + } else {
|
| + UsedInReloc.insert(Renamed);
|
| + MCSymbolData &RenamedSD = Asm.getSymbolData(*Renamed);
|
| + if (RenamedSD.getFlags() & ELF_Other_Weakref) {
|
| + WeakrefUsedInReloc.insert(Symbol);
|
| + }
|
| + Index = -1;
|
| + }
|
| + Addend = Value;
|
| + // Compensate for the addend on i386.
|
| + if (Is64Bit)
|
| + Value = 0;
|
| + }
|
| +
|
| + FixedValue = Value;
|
| +
|
| + // determine the type of the relocation
|
| +
|
| + MCSymbolRefExpr::VariantKind Modifier = Target.getSymA()->getKind();
|
| + unsigned Type;
|
| + if (Is64Bit) {
|
| + if (IsPCRel) {
|
| + switch (Modifier) {
|
| + default:
|
| + llvm_unreachable("Unimplemented");
|
| + case MCSymbolRefExpr::VK_None:
|
| + Type = ELF::R_X86_64_PC32;
|
| + break;
|
| + case MCSymbolRefExpr::VK_PLT:
|
| + Type = ELF::R_X86_64_PLT32;
|
| + break;
|
| + case MCSymbolRefExpr::VK_GOTPCREL:
|
| + Type = ELF::R_X86_64_GOTPCREL;
|
| + break;
|
| + case MCSymbolRefExpr::VK_GOTTPOFF:
|
| + Type = ELF::R_X86_64_GOTTPOFF;
|
| + break;
|
| + case MCSymbolRefExpr::VK_TLSGD:
|
| + Type = ELF::R_X86_64_TLSGD;
|
| + break;
|
| + case MCSymbolRefExpr::VK_TLSLD:
|
| + Type = ELF::R_X86_64_TLSLD;
|
| + break;
|
| + }
|
| + } else {
|
| + switch ((unsigned)Fixup.getKind()) {
|
| + default: llvm_unreachable("invalid fixup kind!");
|
| + case FK_Data_8: Type = ELF::R_X86_64_64; break;
|
| + case X86::reloc_signed_4byte:
|
| + case X86::reloc_pcrel_4byte:
|
| + assert(isInt<32>(Target.getConstant()));
|
| + switch (Modifier) {
|
| + default:
|
| + llvm_unreachable("Unimplemented");
|
| + case MCSymbolRefExpr::VK_None:
|
| + Type = ELF::R_X86_64_32S;
|
| + break;
|
| + case MCSymbolRefExpr::VK_GOT:
|
| + Type = ELF::R_X86_64_GOT32;
|
| + break;
|
| + case MCSymbolRefExpr::VK_GOTPCREL:
|
| + Type = ELF::R_X86_64_GOTPCREL;
|
| + break;
|
| + case MCSymbolRefExpr::VK_TPOFF:
|
| + Type = ELF::R_X86_64_TPOFF32;
|
| + break;
|
| + case MCSymbolRefExpr::VK_DTPOFF:
|
| + Type = ELF::R_X86_64_DTPOFF32;
|
| + break;
|
| + }
|
| + break;
|
| + case FK_Data_4:
|
| + Type = ELF::R_X86_64_32;
|
| + break;
|
| + case FK_Data_2: Type = ELF::R_X86_64_16; break;
|
| + case X86::reloc_pcrel_1byte:
|
| + case FK_Data_1: Type = ELF::R_X86_64_8; break;
|
| + }
|
| + }
|
| + } else {
|
| + if (IsPCRel) {
|
| + switch (Modifier) {
|
| + default:
|
| + llvm_unreachable("Unimplemented");
|
| + case MCSymbolRefExpr::VK_None:
|
| + Type = ELF::R_386_PC32;
|
| + break;
|
| + case MCSymbolRefExpr::VK_PLT:
|
| + Type = ELF::R_386_PLT32;
|
| + break;
|
| + }
|
| + } else {
|
| + switch ((unsigned)Fixup.getKind()) {
|
| + default: llvm_unreachable("invalid fixup kind!");
|
| +
|
| + case X86::reloc_global_offset_table:
|
| + Type = ELF::R_386_GOTPC;
|
| + break;
|
| +
|
| + // FIXME: Should we avoid selecting reloc_signed_4byte in 32 bit mode
|
| + // instead?
|
| + case X86::reloc_signed_4byte:
|
| + case X86::reloc_pcrel_4byte:
|
| + case FK_Data_4:
|
| + switch (Modifier) {
|
| + default:
|
| + llvm_unreachable("Unimplemented");
|
| + case MCSymbolRefExpr::VK_None:
|
| + Type = ELF::R_386_32;
|
| + break;
|
| + case MCSymbolRefExpr::VK_GOT:
|
| + Type = ELF::R_386_GOT32;
|
| + break;
|
| + case MCSymbolRefExpr::VK_GOTOFF:
|
| + Type = ELF::R_386_GOTOFF;
|
| + break;
|
| + case MCSymbolRefExpr::VK_TLSGD:
|
| + Type = ELF::R_386_TLS_GD;
|
| + break;
|
| + case MCSymbolRefExpr::VK_TPOFF:
|
| + Type = ELF::R_386_TLS_LE_32;
|
| + break;
|
| + case MCSymbolRefExpr::VK_INDNTPOFF:
|
| + Type = ELF::R_386_TLS_IE;
|
| + break;
|
| + case MCSymbolRefExpr::VK_NTPOFF:
|
| + Type = ELF::R_386_TLS_LE;
|
| + break;
|
| + case MCSymbolRefExpr::VK_GOTNTPOFF:
|
| + Type = ELF::R_386_TLS_GOTIE;
|
| + break;
|
| + case MCSymbolRefExpr::VK_TLSLDM:
|
| + Type = ELF::R_386_TLS_LDM;
|
| + break;
|
| + case MCSymbolRefExpr::VK_DTPOFF:
|
| + Type = ELF::R_386_TLS_LDO_32;
|
| + break;
|
| + }
|
| + break;
|
| + case FK_Data_2: Type = ELF::R_386_16; break;
|
| + case X86::reloc_pcrel_1byte:
|
| + case FK_Data_1: Type = ELF::R_386_8; break;
|
| + }
|
| + }
|
| + }
|
| +
|
| + if (RelocNeedsGOT(Modifier))
|
| + NeedsGOT = true;
|
| +
|
| + ELFRelocationEntry ERE;
|
| +
|
| + ERE.Index = Index;
|
| + ERE.Type = Type;
|
| + ERE.Symbol = Renamed;
|
| +
|
| + ERE.r_offset = Layout.getFragmentOffset(Fragment) + Fixup.getOffset();
|
| +
|
| + if (HasRelocationAddend)
|
| + ERE.r_addend = Addend;
|
| + else
|
| + ERE.r_addend = 0; // Silence compiler warning.
|
| +
|
| + Relocations[Fragment->getParent()].push_back(ERE);
|
| +}
|
| +
|
| +
|
| +
|
| +//===- ARMELFObjectWriterImpl ---------------------------------------===//
|
| +
|
| +ARMELFObjectWriterImpl::ARMELFObjectWriterImpl(ELFObjectWriter *_Writer, bool _Is64Bit,
|
| + uint16_t _EMachine, bool _HasRelAddend,
|
| + Triple::OSType _OSType)
|
| + : ELFObjectWriterImpl(_Writer, _Is64Bit, _EMachine, _HasRelAddend, _OSType)
|
| +{}
|
| +
|
| +
|
| +ARMELFObjectWriterImpl::~ARMELFObjectWriterImpl()
|
| +{}
|
| +
|
| +void ARMELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,
|
| + const MCAsmLayout &Layout,
|
| + const MCFragment *Fragment,
|
| + const MCFixup &Fixup,
|
| + MCValue Target,
|
| + uint64_t &FixedValue) {
|
| + assert(0 && "ARM RecordRelocation unimplemented");
|
| +}
|
|
|