Home | History | Annotate | Download | only in RuntimeDyld
      1 //===-- RuntimeDyldELF.cpp - Run-time dynamic linker for MC-JIT -*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // Implementation of ELF support for the MC-JIT runtime dynamic linker.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "RuntimeDyldELF.h"
     15 #include "RuntimeDyldCheckerImpl.h"
     16 #include "llvm/ADT/IntervalMap.h"
     17 #include "llvm/ADT/STLExtras.h"
     18 #include "llvm/ADT/StringRef.h"
     19 #include "llvm/ADT/Triple.h"
     20 #include "llvm/MC/MCStreamer.h"
     21 #include "llvm/Object/ELFObjectFile.h"
     22 #include "llvm/Object/ObjectFile.h"
     23 #include "llvm/Support/ELF.h"
     24 #include "llvm/Support/Endian.h"
     25 #include "llvm/Support/MemoryBuffer.h"
     26 #include "llvm/Support/TargetRegistry.h"
     27 
     28 using namespace llvm;
     29 using namespace llvm::object;
     30 
     31 #define DEBUG_TYPE "dyld"
     32 
     33 static inline std::error_code check(std::error_code Err) {
     34   if (Err) {
     35     report_fatal_error(Err.message());
     36   }
     37   return Err;
     38 }
     39 
     40 namespace {
     41 
     42 template <class ELFT> class DyldELFObject : public ELFObjectFile<ELFT> {
     43   LLVM_ELF_IMPORT_TYPES_ELFT(ELFT)
     44 
     45   typedef Elf_Shdr_Impl<ELFT> Elf_Shdr;
     46   typedef Elf_Sym_Impl<ELFT> Elf_Sym;
     47   typedef Elf_Rel_Impl<ELFT, false> Elf_Rel;
     48   typedef Elf_Rel_Impl<ELFT, true> Elf_Rela;
     49 
     50   typedef Elf_Ehdr_Impl<ELFT> Elf_Ehdr;
     51 
     52   typedef typename ELFDataTypeTypedefHelper<ELFT>::value_type addr_type;
     53 
     54 public:
     55   DyldELFObject(MemoryBufferRef Wrapper, std::error_code &ec);
     56 
     57   void updateSectionAddress(const SectionRef &Sec, uint64_t Addr);
     58 
     59   void updateSymbolAddress(const SymbolRef &SymRef, uint64_t Addr);
     60 
     61   // Methods for type inquiry through isa, cast and dyn_cast
     62   static inline bool classof(const Binary *v) {
     63     return (isa<ELFObjectFile<ELFT>>(v) &&
     64             classof(cast<ELFObjectFile<ELFT>>(v)));
     65   }
     66   static inline bool classof(const ELFObjectFile<ELFT> *v) {
     67     return v->isDyldType();
     68   }
     69 
     70 };
     71 
     72 
     73 
     74 // The MemoryBuffer passed into this constructor is just a wrapper around the
     75 // actual memory.  Ultimately, the Binary parent class will take ownership of
     76 // this MemoryBuffer object but not the underlying memory.
     77 template <class ELFT>
     78 DyldELFObject<ELFT>::DyldELFObject(MemoryBufferRef Wrapper, std::error_code &EC)
     79     : ELFObjectFile<ELFT>(Wrapper, EC) {
     80   this->isDyldELFObject = true;
     81 }
     82 
     83 template <class ELFT>
     84 void DyldELFObject<ELFT>::updateSectionAddress(const SectionRef &Sec,
     85                                                uint64_t Addr) {
     86   DataRefImpl ShdrRef = Sec.getRawDataRefImpl();
     87   Elf_Shdr *shdr =
     88       const_cast<Elf_Shdr *>(reinterpret_cast<const Elf_Shdr *>(ShdrRef.p));
     89 
     90   // This assumes the address passed in matches the target address bitness
     91   // The template-based type cast handles everything else.
     92   shdr->sh_addr = static_cast<addr_type>(Addr);
     93 }
     94 
     95 template <class ELFT>
     96 void DyldELFObject<ELFT>::updateSymbolAddress(const SymbolRef &SymRef,
     97                                               uint64_t Addr) {
     98 
     99   Elf_Sym *sym = const_cast<Elf_Sym *>(
    100       ELFObjectFile<ELFT>::getSymbol(SymRef.getRawDataRefImpl()));
    101 
    102   // This assumes the address passed in matches the target address bitness
    103   // The template-based type cast handles everything else.
    104   sym->st_value = static_cast<addr_type>(Addr);
    105 }
    106 
    107 class LoadedELFObjectInfo : public RuntimeDyld::LoadedObjectInfo {
    108 public:
    109   LoadedELFObjectInfo(RuntimeDyldImpl &RTDyld, unsigned BeginIdx,
    110                       unsigned EndIdx)
    111     : RuntimeDyld::LoadedObjectInfo(RTDyld, BeginIdx, EndIdx) {}
    112 
    113   OwningBinary<ObjectFile>
    114   getObjectForDebug(const ObjectFile &Obj) const override;
    115 };
    116 
    117 template <typename ELFT>
    118 std::unique_ptr<DyldELFObject<ELFT>>
    119 createRTDyldELFObject(MemoryBufferRef Buffer,
    120                       const LoadedELFObjectInfo &L,
    121                       std::error_code &ec) {
    122   typedef typename ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
    123   typedef typename ELFDataTypeTypedefHelper<ELFT>::value_type addr_type;
    124 
    125   std::unique_ptr<DyldELFObject<ELFT>> Obj =
    126     llvm::make_unique<DyldELFObject<ELFT>>(Buffer, ec);
    127 
    128   // Iterate over all sections in the object.
    129   for (const auto &Sec : Obj->sections()) {
    130     StringRef SectionName;
    131     Sec.getName(SectionName);
    132     if (SectionName != "") {
    133       DataRefImpl ShdrRef = Sec.getRawDataRefImpl();
    134       Elf_Shdr *shdr = const_cast<Elf_Shdr *>(
    135           reinterpret_cast<const Elf_Shdr *>(ShdrRef.p));
    136 
    137       if (uint64_t SecLoadAddr = L.getSectionLoadAddress(SectionName)) {
    138         // This assumes that the address passed in matches the target address
    139         // bitness. The template-based type cast handles everything else.
    140         shdr->sh_addr = static_cast<addr_type>(SecLoadAddr);
    141       }
    142     }
    143   }
    144 
    145   return Obj;
    146 }
    147 
    148 OwningBinary<ObjectFile> createELFDebugObject(const ObjectFile &Obj,
    149                                               const LoadedELFObjectInfo &L) {
    150   assert(Obj.isELF() && "Not an ELF object file.");
    151 
    152   std::unique_ptr<MemoryBuffer> Buffer =
    153     MemoryBuffer::getMemBufferCopy(Obj.getData(), Obj.getFileName());
    154 
    155   std::error_code ec;
    156 
    157   std::unique_ptr<ObjectFile> DebugObj;
    158   if (Obj.getBytesInAddress() == 4 && Obj.isLittleEndian()) {
    159     typedef ELFType<support::little, 2, false> ELF32LE;
    160     DebugObj = createRTDyldELFObject<ELF32LE>(Buffer->getMemBufferRef(), L, ec);
    161   } else if (Obj.getBytesInAddress() == 4 && !Obj.isLittleEndian()) {
    162     typedef ELFType<support::big, 2, false> ELF32BE;
    163     DebugObj = createRTDyldELFObject<ELF32BE>(Buffer->getMemBufferRef(), L, ec);
    164   } else if (Obj.getBytesInAddress() == 8 && !Obj.isLittleEndian()) {
    165     typedef ELFType<support::big, 2, true> ELF64BE;
    166     DebugObj = createRTDyldELFObject<ELF64BE>(Buffer->getMemBufferRef(), L, ec);
    167   } else if (Obj.getBytesInAddress() == 8 && Obj.isLittleEndian()) {
    168     typedef ELFType<support::little, 2, true> ELF64LE;
    169     DebugObj = createRTDyldELFObject<ELF64LE>(Buffer->getMemBufferRef(), L, ec);
    170   } else
    171     llvm_unreachable("Unexpected ELF format");
    172 
    173   assert(!ec && "Could not construct copy ELF object file");
    174 
    175   return OwningBinary<ObjectFile>(std::move(DebugObj), std::move(Buffer));
    176 }
    177 
    178 OwningBinary<ObjectFile>
    179 LoadedELFObjectInfo::getObjectForDebug(const ObjectFile &Obj) const {
    180   return createELFDebugObject(Obj, *this);
    181 }
    182 
    183 } // namespace
    184 
    185 namespace llvm {
    186 
    187 RuntimeDyldELF::RuntimeDyldELF(RuntimeDyld::MemoryManager &MemMgr,
    188                                RuntimeDyld::SymbolResolver &Resolver)
    189     : RuntimeDyldImpl(MemMgr, Resolver), GOTSectionID(0), CurrentGOTIndex(0) {}
    190 RuntimeDyldELF::~RuntimeDyldELF() {}
    191 
    192 void RuntimeDyldELF::registerEHFrames() {
    193   for (int i = 0, e = UnregisteredEHFrameSections.size(); i != e; ++i) {
    194     SID EHFrameSID = UnregisteredEHFrameSections[i];
    195     uint8_t *EHFrameAddr = Sections[EHFrameSID].Address;
    196     uint64_t EHFrameLoadAddr = Sections[EHFrameSID].LoadAddress;
    197     size_t EHFrameSize = Sections[EHFrameSID].Size;
    198     MemMgr.registerEHFrames(EHFrameAddr, EHFrameLoadAddr, EHFrameSize);
    199     RegisteredEHFrameSections.push_back(EHFrameSID);
    200   }
    201   UnregisteredEHFrameSections.clear();
    202 }
    203 
    204 void RuntimeDyldELF::deregisterEHFrames() {
    205   for (int i = 0, e = RegisteredEHFrameSections.size(); i != e; ++i) {
    206     SID EHFrameSID = RegisteredEHFrameSections[i];
    207     uint8_t *EHFrameAddr = Sections[EHFrameSID].Address;
    208     uint64_t EHFrameLoadAddr = Sections[EHFrameSID].LoadAddress;
    209     size_t EHFrameSize = Sections[EHFrameSID].Size;
    210     MemMgr.deregisterEHFrames(EHFrameAddr, EHFrameLoadAddr, EHFrameSize);
    211   }
    212   RegisteredEHFrameSections.clear();
    213 }
    214 
    215 std::unique_ptr<RuntimeDyld::LoadedObjectInfo>
    216 RuntimeDyldELF::loadObject(const object::ObjectFile &O) {
    217   unsigned SectionStartIdx, SectionEndIdx;
    218   std::tie(SectionStartIdx, SectionEndIdx) = loadObjectImpl(O);
    219   return llvm::make_unique<LoadedELFObjectInfo>(*this, SectionStartIdx,
    220                                                 SectionEndIdx);
    221 }
    222 
    223 void RuntimeDyldELF::resolveX86_64Relocation(const SectionEntry &Section,
    224                                              uint64_t Offset, uint64_t Value,
    225                                              uint32_t Type, int64_t Addend,
    226                                              uint64_t SymOffset) {
    227   switch (Type) {
    228   default:
    229     llvm_unreachable("Relocation type not implemented yet!");
    230     break;
    231   case ELF::R_X86_64_64: {
    232     support::ulittle64_t::ref(Section.Address + Offset) = Value + Addend;
    233     DEBUG(dbgs() << "Writing " << format("%p", (Value + Addend)) << " at "
    234                  << format("%p\n", Section.Address + Offset));
    235     break;
    236   }
    237   case ELF::R_X86_64_32:
    238   case ELF::R_X86_64_32S: {
    239     Value += Addend;
    240     assert((Type == ELF::R_X86_64_32 && (Value <= UINT32_MAX)) ||
    241            (Type == ELF::R_X86_64_32S &&
    242             ((int64_t)Value <= INT32_MAX && (int64_t)Value >= INT32_MIN)));
    243     uint32_t TruncatedAddr = (Value & 0xFFFFFFFF);
    244     support::ulittle32_t::ref(Section.Address + Offset) = TruncatedAddr;
    245     DEBUG(dbgs() << "Writing " << format("%p", TruncatedAddr) << " at "
    246                  << format("%p\n", Section.Address + Offset));
    247     break;
    248   }
    249   case ELF::R_X86_64_PC32: {
    250     // Get the placeholder value from the generated object since
    251     // a previous relocation attempt may have overwritten the loaded version
    252     support::ulittle32_t::ref Placeholder(
    253         (void *)(Section.ObjAddress + Offset));
    254     uint64_t FinalAddress = Section.LoadAddress + Offset;
    255     int64_t RealOffset = Value + Addend - FinalAddress;
    256     // Don't add the placeholder if this is a stub
    257     if (Offset < Section.Size)
    258       RealOffset += Placeholder;
    259     assert(RealOffset <= INT32_MAX && RealOffset >= INT32_MIN);
    260     int32_t TruncOffset = (RealOffset & 0xFFFFFFFF);
    261     support::ulittle32_t::ref(Section.Address + Offset) = TruncOffset;
    262     break;
    263   }
    264   case ELF::R_X86_64_PC64: {
    265     // Get the placeholder value from the generated object since
    266     // a previous relocation attempt may have overwritten the loaded version
    267     support::ulittle64_t::ref Placeholder(
    268         (void *)(Section.ObjAddress + Offset));
    269     uint64_t FinalAddress = Section.LoadAddress + Offset;
    270     int64_t RealOffset = Value + Addend - FinalAddress;
    271     if (Offset < Section.Size)
    272       RealOffset += Placeholder;
    273     support::ulittle64_t::ref(Section.Address + Offset) = RealOffset;
    274     break;
    275   }
    276   }
    277 }
    278 
    279 void RuntimeDyldELF::resolveX86Relocation(const SectionEntry &Section,
    280                                           uint64_t Offset, uint32_t Value,
    281                                           uint32_t Type, int32_t Addend) {
    282   switch (Type) {
    283   case ELF::R_386_32: {
    284     // Get the placeholder value from the generated object since
    285     // a previous relocation attempt may have overwritten the loaded version
    286     support::ulittle32_t::ref Placeholder(
    287         (void *)(Section.ObjAddress + Offset));
    288     support::ulittle32_t::ref(Section.Address + Offset) =
    289         Placeholder + Value + Addend;
    290     break;
    291   }
    292   case ELF::R_386_PC32: {
    293     // Get the placeholder value from the generated object since
    294     // a previous relocation attempt may have overwritten the loaded version
    295     support::ulittle32_t::ref Placeholder(
    296         (void *)(Section.ObjAddress + Offset));
    297     uint32_t FinalAddress = ((Section.LoadAddress + Offset) & 0xFFFFFFFF);
    298     uint32_t RealOffset = Placeholder + Value + Addend - FinalAddress;
    299     support::ulittle32_t::ref(Section.Address + Offset) = RealOffset;
    300     break;
    301   }
    302   default:
    303     // There are other relocation types, but it appears these are the
    304     // only ones currently used by the LLVM ELF object writer
    305     llvm_unreachable("Relocation type not implemented yet!");
    306     break;
    307   }
    308 }
    309 
    310 void RuntimeDyldELF::resolveAArch64Relocation(const SectionEntry &Section,
    311                                               uint64_t Offset, uint64_t Value,
    312                                               uint32_t Type, int64_t Addend) {
    313   uint32_t *TargetPtr = reinterpret_cast<uint32_t *>(Section.Address + Offset);
    314   uint64_t FinalAddress = Section.LoadAddress + Offset;
    315 
    316   DEBUG(dbgs() << "resolveAArch64Relocation, LocalAddress: 0x"
    317                << format("%llx", Section.Address + Offset)
    318                << " FinalAddress: 0x" << format("%llx", FinalAddress)
    319                << " Value: 0x" << format("%llx", Value) << " Type: 0x"
    320                << format("%x", Type) << " Addend: 0x" << format("%llx", Addend)
    321                << "\n");
    322 
    323   switch (Type) {
    324   default:
    325     llvm_unreachable("Relocation type not implemented yet!");
    326     break;
    327   case ELF::R_AARCH64_ABS64: {
    328     uint64_t *TargetPtr =
    329         reinterpret_cast<uint64_t *>(Section.Address + Offset);
    330     *TargetPtr = Value + Addend;
    331     break;
    332   }
    333   case ELF::R_AARCH64_PREL32: {
    334     uint64_t Result = Value + Addend - FinalAddress;
    335     assert(static_cast<int64_t>(Result) >= INT32_MIN &&
    336            static_cast<int64_t>(Result) <= UINT32_MAX);
    337     *TargetPtr = static_cast<uint32_t>(Result & 0xffffffffU);
    338     break;
    339   }
    340   case ELF::R_AARCH64_CALL26: // fallthrough
    341   case ELF::R_AARCH64_JUMP26: {
    342     // Operation: S+A-P. Set Call or B immediate value to bits fff_fffc of the
    343     // calculation.
    344     uint64_t BranchImm = Value + Addend - FinalAddress;
    345 
    346     // "Check that -2^27 <= result < 2^27".
    347     assert(-(1LL << 27) <= static_cast<int64_t>(BranchImm) &&
    348            static_cast<int64_t>(BranchImm) < (1LL << 27));
    349 
    350     // AArch64 code is emitted with .rela relocations. The data already in any
    351     // bits affected by the relocation on entry is garbage.
    352     *TargetPtr &= 0xfc000000U;
    353     // Immediate goes in bits 25:0 of B and BL.
    354     *TargetPtr |= static_cast<uint32_t>(BranchImm & 0xffffffcU) >> 2;
    355     break;
    356   }
    357   case ELF::R_AARCH64_MOVW_UABS_G3: {
    358     uint64_t Result = Value + Addend;
    359 
    360     // AArch64 code is emitted with .rela relocations. The data already in any
    361     // bits affected by the relocation on entry is garbage.
    362     *TargetPtr &= 0xffe0001fU;
    363     // Immediate goes in bits 20:5 of MOVZ/MOVK instruction
    364     *TargetPtr |= Result >> (48 - 5);
    365     // Shift must be "lsl #48", in bits 22:21
    366     assert((*TargetPtr >> 21 & 0x3) == 3 && "invalid shift for relocation");
    367     break;
    368   }
    369   case ELF::R_AARCH64_MOVW_UABS_G2_NC: {
    370     uint64_t Result = Value + Addend;
    371 
    372     // AArch64 code is emitted with .rela relocations. The data already in any
    373     // bits affected by the relocation on entry is garbage.
    374     *TargetPtr &= 0xffe0001fU;
    375     // Immediate goes in bits 20:5 of MOVZ/MOVK instruction
    376     *TargetPtr |= ((Result & 0xffff00000000ULL) >> (32 - 5));
    377     // Shift must be "lsl #32", in bits 22:21
    378     assert((*TargetPtr >> 21 & 0x3) == 2 && "invalid shift for relocation");
    379     break;
    380   }
    381   case ELF::R_AARCH64_MOVW_UABS_G1_NC: {
    382     uint64_t Result = Value + Addend;
    383 
    384     // AArch64 code is emitted with .rela relocations. The data already in any
    385     // bits affected by the relocation on entry is garbage.
    386     *TargetPtr &= 0xffe0001fU;
    387     // Immediate goes in bits 20:5 of MOVZ/MOVK instruction
    388     *TargetPtr |= ((Result & 0xffff0000U) >> (16 - 5));
    389     // Shift must be "lsl #16", in bits 22:2
    390     assert((*TargetPtr >> 21 & 0x3) == 1 && "invalid shift for relocation");
    391     break;
    392   }
    393   case ELF::R_AARCH64_MOVW_UABS_G0_NC: {
    394     uint64_t Result = Value + Addend;
    395 
    396     // AArch64 code is emitted with .rela relocations. The data already in any
    397     // bits affected by the relocation on entry is garbage.
    398     *TargetPtr &= 0xffe0001fU;
    399     // Immediate goes in bits 20:5 of MOVZ/MOVK instruction
    400     *TargetPtr |= ((Result & 0xffffU) << 5);
    401     // Shift must be "lsl #0", in bits 22:21.
    402     assert((*TargetPtr >> 21 & 0x3) == 0 && "invalid shift for relocation");
    403     break;
    404   }
    405   case ELF::R_AARCH64_ADR_PREL_PG_HI21: {
    406     // Operation: Page(S+A) - Page(P)
    407     uint64_t Result =
    408         ((Value + Addend) & ~0xfffULL) - (FinalAddress & ~0xfffULL);
    409 
    410     // Check that -2^32 <= X < 2^32
    411     assert(static_cast<int64_t>(Result) >= (-1LL << 32) &&
    412            static_cast<int64_t>(Result) < (1LL << 32) &&
    413            "overflow check failed for relocation");
    414 
    415     // AArch64 code is emitted with .rela relocations. The data already in any
    416     // bits affected by the relocation on entry is garbage.
    417     *TargetPtr &= 0x9f00001fU;
    418     // Immediate goes in bits 30:29 + 5:23 of ADRP instruction, taken
    419     // from bits 32:12 of X.
    420     *TargetPtr |= ((Result & 0x3000U) << (29 - 12));
    421     *TargetPtr |= ((Result & 0x1ffffc000ULL) >> (14 - 5));
    422     break;
    423   }
    424   case ELF::R_AARCH64_LDST32_ABS_LO12_NC: {
    425     // Operation: S + A
    426     uint64_t Result = Value + Addend;
    427 
    428     // AArch64 code is emitted with .rela relocations. The data already in any
    429     // bits affected by the relocation on entry is garbage.
    430     *TargetPtr &= 0xffc003ffU;
    431     // Immediate goes in bits 21:10 of LD/ST instruction, taken
    432     // from bits 11:2 of X
    433     *TargetPtr |= ((Result & 0xffc) << (10 - 2));
    434     break;
    435   }
    436   case ELF::R_AARCH64_LDST64_ABS_LO12_NC: {
    437     // Operation: S + A
    438     uint64_t Result = Value + Addend;
    439 
    440     // AArch64 code is emitted with .rela relocations. The data already in any
    441     // bits affected by the relocation on entry is garbage.
    442     *TargetPtr &= 0xffc003ffU;
    443     // Immediate goes in bits 21:10 of LD/ST instruction, taken
    444     // from bits 11:3 of X
    445     *TargetPtr |= ((Result & 0xff8) << (10 - 3));
    446     break;
    447   }
    448   }
    449 }
    450 
    451 void RuntimeDyldELF::resolveARMRelocation(const SectionEntry &Section,
    452                                           uint64_t Offset, uint32_t Value,
    453                                           uint32_t Type, int32_t Addend) {
    454   // TODO: Add Thumb relocations.
    455   uint32_t *Placeholder =
    456       reinterpret_cast<uint32_t *>(Section.ObjAddress + Offset);
    457   uint32_t *TargetPtr = (uint32_t *)(Section.Address + Offset);
    458   uint32_t FinalAddress = ((Section.LoadAddress + Offset) & 0xFFFFFFFF);
    459   Value += Addend;
    460 
    461   DEBUG(dbgs() << "resolveARMRelocation, LocalAddress: "
    462                << Section.Address + Offset
    463                << " FinalAddress: " << format("%p", FinalAddress) << " Value: "
    464                << format("%x", Value) << " Type: " << format("%x", Type)
    465                << " Addend: " << format("%x", Addend) << "\n");
    466 
    467   switch (Type) {
    468   default:
    469     llvm_unreachable("Not implemented relocation type!");
    470 
    471   case ELF::R_ARM_NONE:
    472     break;
    473   // Write a 32bit value to relocation address, taking into account the
    474   // implicit addend encoded in the target.
    475   case ELF::R_ARM_PREL31:
    476   case ELF::R_ARM_TARGET1:
    477   case ELF::R_ARM_ABS32:
    478     *TargetPtr = *Placeholder + Value;
    479     break;
    480   // Write first 16 bit of 32 bit value to the mov instruction.
    481   // Last 4 bit should be shifted.
    482   case ELF::R_ARM_MOVW_ABS_NC:
    483     // We are not expecting any other addend in the relocation address.
    484     // Using 0x000F0FFF because MOVW has its 16 bit immediate split into 2
    485     // non-contiguous fields.
    486     assert((*Placeholder & 0x000F0FFF) == 0);
    487     Value = Value & 0xFFFF;
    488     *TargetPtr = *Placeholder | (Value & 0xFFF);
    489     *TargetPtr |= ((Value >> 12) & 0xF) << 16;
    490     break;
    491   // Write last 16 bit of 32 bit value to the mov instruction.
    492   // Last 4 bit should be shifted.
    493   case ELF::R_ARM_MOVT_ABS:
    494     // We are not expecting any other addend in the relocation address.
    495     // Use 0x000F0FFF for the same reason as R_ARM_MOVW_ABS_NC.
    496     assert((*Placeholder & 0x000F0FFF) == 0);
    497 
    498     Value = (Value >> 16) & 0xFFFF;
    499     *TargetPtr = *Placeholder | (Value & 0xFFF);
    500     *TargetPtr |= ((Value >> 12) & 0xF) << 16;
    501     break;
    502   // Write 24 bit relative value to the branch instruction.
    503   case ELF::R_ARM_PC24: // Fall through.
    504   case ELF::R_ARM_CALL: // Fall through.
    505   case ELF::R_ARM_JUMP24: {
    506     int32_t RelValue = static_cast<int32_t>(Value - FinalAddress - 8);
    507     RelValue = (RelValue & 0x03FFFFFC) >> 2;
    508     assert((*TargetPtr & 0xFFFFFF) == 0xFFFFFE);
    509     *TargetPtr &= 0xFF000000;
    510     *TargetPtr |= RelValue;
    511     break;
    512   }
    513   case ELF::R_ARM_PRIVATE_0:
    514     // This relocation is reserved by the ARM ELF ABI for internal use. We
    515     // appropriate it here to act as an R_ARM_ABS32 without any addend for use
    516     // in the stubs created during JIT (which can't put an addend into the
    517     // original object file).
    518     *TargetPtr = Value;
    519     break;
    520   }
    521 }
    522 
    523 void RuntimeDyldELF::resolveMIPSRelocation(const SectionEntry &Section,
    524                                            uint64_t Offset, uint32_t Value,
    525                                            uint32_t Type, int32_t Addend) {
    526   uint32_t *Placeholder =
    527       reinterpret_cast<uint32_t *>(Section.ObjAddress + Offset);
    528   uint32_t *TargetPtr = (uint32_t *)(Section.Address + Offset);
    529   Value += Addend;
    530 
    531   DEBUG(dbgs() << "resolveMipselocation, LocalAddress: "
    532                << Section.Address + Offset << " FinalAddress: "
    533                << format("%p", Section.LoadAddress + Offset) << " Value: "
    534                << format("%x", Value) << " Type: " << format("%x", Type)
    535                << " Addend: " << format("%x", Addend) << "\n");
    536 
    537   switch (Type) {
    538   default:
    539     llvm_unreachable("Not implemented relocation type!");
    540     break;
    541   case ELF::R_MIPS_32:
    542     *TargetPtr = Value + (*Placeholder);
    543     break;
    544   case ELF::R_MIPS_26:
    545     *TargetPtr = ((*Placeholder) & 0xfc000000) | ((Value & 0x0fffffff) >> 2);
    546     break;
    547   case ELF::R_MIPS_HI16:
    548     // Get the higher 16-bits. Also add 1 if bit 15 is 1.
    549     Value += ((*Placeholder) & 0x0000ffff) << 16;
    550     *TargetPtr =
    551         ((*Placeholder) & 0xffff0000) | (((Value + 0x8000) >> 16) & 0xffff);
    552     break;
    553   case ELF::R_MIPS_LO16:
    554     Value += ((*Placeholder) & 0x0000ffff);
    555     *TargetPtr = ((*Placeholder) & 0xffff0000) | (Value & 0xffff);
    556     break;
    557   case ELF::R_MIPS_UNUSED1:
    558     // Similar to ELF::R_ARM_PRIVATE_0, R_MIPS_UNUSED1 and R_MIPS_UNUSED2
    559     // are used for internal JIT purpose. These relocations are similar to
    560     // R_MIPS_HI16 and R_MIPS_LO16, but they do not take any addend into
    561     // account.
    562     *TargetPtr =
    563         ((*TargetPtr) & 0xffff0000) | (((Value + 0x8000) >> 16) & 0xffff);
    564     break;
    565   case ELF::R_MIPS_UNUSED2:
    566     *TargetPtr = ((*TargetPtr) & 0xffff0000) | (Value & 0xffff);
    567     break;
    568   }
    569 }
    570 
    571 // Return the .TOC. section and offset.
    572 void RuntimeDyldELF::findPPC64TOCSection(const ObjectFile &Obj,
    573                                          ObjSectionToIDMap &LocalSections,
    574                                          RelocationValueRef &Rel) {
    575   // Set a default SectionID in case we do not find a TOC section below.
    576   // This may happen for references to TOC base base (sym@toc, .odp
    577   // relocation) without a .toc directive.  In this case just use the
    578   // first section (which is usually the .odp) since the code won't
    579   // reference the .toc base directly.
    580   Rel.SymbolName = NULL;
    581   Rel.SectionID = 0;
    582 
    583   // The TOC consists of sections .got, .toc, .tocbss, .plt in that
    584   // order. The TOC starts where the first of these sections starts.
    585   for (section_iterator si = Obj.section_begin(), se = Obj.section_end();
    586        si != se; ++si) {
    587 
    588     StringRef SectionName;
    589     check(si->getName(SectionName));
    590 
    591     if (SectionName == ".got"
    592         || SectionName == ".toc"
    593         || SectionName == ".tocbss"
    594         || SectionName == ".plt") {
    595       Rel.SectionID = findOrEmitSection(Obj, *si, false, LocalSections);
    596       break;
    597     }
    598   }
    599 
    600   // Per the ppc64-elf-linux ABI, The TOC base is TOC value plus 0x8000
    601   // thus permitting a full 64 Kbytes segment.
    602   Rel.Addend = 0x8000;
    603 }
    604 
    605 // Returns the sections and offset associated with the ODP entry referenced
    606 // by Symbol.
    607 void RuntimeDyldELF::findOPDEntrySection(const ObjectFile &Obj,
    608                                          ObjSectionToIDMap &LocalSections,
    609                                          RelocationValueRef &Rel) {
    610   // Get the ELF symbol value (st_value) to compare with Relocation offset in
    611   // .opd entries
    612   for (section_iterator si = Obj.section_begin(), se = Obj.section_end();
    613        si != se; ++si) {
    614     section_iterator RelSecI = si->getRelocatedSection();
    615     if (RelSecI == Obj.section_end())
    616       continue;
    617 
    618     StringRef RelSectionName;
    619     check(RelSecI->getName(RelSectionName));
    620     if (RelSectionName != ".opd")
    621       continue;
    622 
    623     for (relocation_iterator i = si->relocation_begin(),
    624                              e = si->relocation_end();
    625          i != e;) {
    626       // The R_PPC64_ADDR64 relocation indicates the first field
    627       // of a .opd entry
    628       uint64_t TypeFunc;
    629       check(i->getType(TypeFunc));
    630       if (TypeFunc != ELF::R_PPC64_ADDR64) {
    631         ++i;
    632         continue;
    633       }
    634 
    635       uint64_t TargetSymbolOffset;
    636       symbol_iterator TargetSymbol = i->getSymbol();
    637       check(i->getOffset(TargetSymbolOffset));
    638       int64_t Addend;
    639       check(getELFRelocationAddend(*i, Addend));
    640 
    641       ++i;
    642       if (i == e)
    643         break;
    644 
    645       // Just check if following relocation is a R_PPC64_TOC
    646       uint64_t TypeTOC;
    647       check(i->getType(TypeTOC));
    648       if (TypeTOC != ELF::R_PPC64_TOC)
    649         continue;
    650 
    651       // Finally compares the Symbol value and the target symbol offset
    652       // to check if this .opd entry refers to the symbol the relocation
    653       // points to.
    654       if (Rel.Addend != (int64_t)TargetSymbolOffset)
    655         continue;
    656 
    657       section_iterator tsi(Obj.section_end());
    658       check(TargetSymbol->getSection(tsi));
    659       bool IsCode = tsi->isText();
    660       Rel.SectionID = findOrEmitSection(Obj, (*tsi), IsCode, LocalSections);
    661       Rel.Addend = (intptr_t)Addend;
    662       return;
    663     }
    664   }
    665   llvm_unreachable("Attempting to get address of ODP entry!");
    666 }
    667 
    668 // Relocation masks following the #lo(value), #hi(value), #ha(value),
    669 // #higher(value), #highera(value), #highest(value), and #highesta(value)
    670 // macros defined in section 4.5.1. Relocation Types of the PPC-elf64abi
    671 // document.
    672 
    673 static inline uint16_t applyPPClo(uint64_t value) { return value & 0xffff; }
    674 
    675 static inline uint16_t applyPPChi(uint64_t value) {
    676   return (value >> 16) & 0xffff;
    677 }
    678 
    679 static inline uint16_t applyPPCha (uint64_t value) {
    680   return ((value + 0x8000) >> 16) & 0xffff;
    681 }
    682 
    683 static inline uint16_t applyPPChigher(uint64_t value) {
    684   return (value >> 32) & 0xffff;
    685 }
    686 
    687 static inline uint16_t applyPPChighera (uint64_t value) {
    688   return ((value + 0x8000) >> 32) & 0xffff;
    689 }
    690 
    691 static inline uint16_t applyPPChighest(uint64_t value) {
    692   return (value >> 48) & 0xffff;
    693 }
    694 
    695 static inline uint16_t applyPPChighesta (uint64_t value) {
    696   return ((value + 0x8000) >> 48) & 0xffff;
    697 }
    698 
    699 void RuntimeDyldELF::resolvePPC64Relocation(const SectionEntry &Section,
    700                                             uint64_t Offset, uint64_t Value,
    701                                             uint32_t Type, int64_t Addend) {
    702   uint8_t *LocalAddress = Section.Address + Offset;
    703   switch (Type) {
    704   default:
    705     llvm_unreachable("Relocation type not implemented yet!");
    706     break;
    707   case ELF::R_PPC64_ADDR16:
    708     writeInt16BE(LocalAddress, applyPPClo(Value + Addend));
    709     break;
    710   case ELF::R_PPC64_ADDR16_DS:
    711     writeInt16BE(LocalAddress, applyPPClo(Value + Addend) & ~3);
    712     break;
    713   case ELF::R_PPC64_ADDR16_LO:
    714     writeInt16BE(LocalAddress, applyPPClo(Value + Addend));
    715     break;
    716   case ELF::R_PPC64_ADDR16_LO_DS:
    717     writeInt16BE(LocalAddress, applyPPClo(Value + Addend) & ~3);
    718     break;
    719   case ELF::R_PPC64_ADDR16_HI:
    720     writeInt16BE(LocalAddress, applyPPChi(Value + Addend));
    721     break;
    722   case ELF::R_PPC64_ADDR16_HA:
    723     writeInt16BE(LocalAddress, applyPPCha(Value + Addend));
    724     break;
    725   case ELF::R_PPC64_ADDR16_HIGHER:
    726     writeInt16BE(LocalAddress, applyPPChigher(Value + Addend));
    727     break;
    728   case ELF::R_PPC64_ADDR16_HIGHERA:
    729     writeInt16BE(LocalAddress, applyPPChighera(Value + Addend));
    730     break;
    731   case ELF::R_PPC64_ADDR16_HIGHEST:
    732     writeInt16BE(LocalAddress, applyPPChighest(Value + Addend));
    733     break;
    734   case ELF::R_PPC64_ADDR16_HIGHESTA:
    735     writeInt16BE(LocalAddress, applyPPChighesta(Value + Addend));
    736     break;
    737   case ELF::R_PPC64_ADDR14: {
    738     assert(((Value + Addend) & 3) == 0);
    739     // Preserve the AA/LK bits in the branch instruction
    740     uint8_t aalk = *(LocalAddress + 3);
    741     writeInt16BE(LocalAddress + 2, (aalk & 3) | ((Value + Addend) & 0xfffc));
    742   } break;
    743   case ELF::R_PPC64_REL16_LO: {
    744     uint64_t FinalAddress = (Section.LoadAddress + Offset);
    745     uint64_t Delta = Value - FinalAddress + Addend;
    746     writeInt16BE(LocalAddress, applyPPClo(Delta));
    747   } break;
    748   case ELF::R_PPC64_REL16_HI: {
    749     uint64_t FinalAddress = (Section.LoadAddress + Offset);
    750     uint64_t Delta = Value - FinalAddress + Addend;
    751     writeInt16BE(LocalAddress, applyPPChi(Delta));
    752   } break;
    753   case ELF::R_PPC64_REL16_HA: {
    754     uint64_t FinalAddress = (Section.LoadAddress + Offset);
    755     uint64_t Delta = Value - FinalAddress + Addend;
    756     writeInt16BE(LocalAddress, applyPPCha(Delta));
    757   } break;
    758   case ELF::R_PPC64_ADDR32: {
    759     int32_t Result = static_cast<int32_t>(Value + Addend);
    760     if (SignExtend32<32>(Result) != Result)
    761       llvm_unreachable("Relocation R_PPC64_ADDR32 overflow");
    762     writeInt32BE(LocalAddress, Result);
    763   } break;
    764   case ELF::R_PPC64_REL24: {
    765     uint64_t FinalAddress = (Section.LoadAddress + Offset);
    766     int32_t delta = static_cast<int32_t>(Value - FinalAddress + Addend);
    767     if (SignExtend32<24>(delta) != delta)
    768       llvm_unreachable("Relocation R_PPC64_REL24 overflow");
    769     // Generates a 'bl <address>' instruction
    770     writeInt32BE(LocalAddress, 0x48000001 | (delta & 0x03FFFFFC));
    771   } break;
    772   case ELF::R_PPC64_REL32: {
    773     uint64_t FinalAddress = (Section.LoadAddress + Offset);
    774     int32_t delta = static_cast<int32_t>(Value - FinalAddress + Addend);
    775     if (SignExtend32<32>(delta) != delta)
    776       llvm_unreachable("Relocation R_PPC64_REL32 overflow");
    777     writeInt32BE(LocalAddress, delta);
    778   } break;
    779   case ELF::R_PPC64_REL64: {
    780     uint64_t FinalAddress = (Section.LoadAddress + Offset);
    781     uint64_t Delta = Value - FinalAddress + Addend;
    782     writeInt64BE(LocalAddress, Delta);
    783   } break;
    784   case ELF::R_PPC64_ADDR64:
    785     writeInt64BE(LocalAddress, Value + Addend);
    786     break;
    787   }
    788 }
    789 
    790 void RuntimeDyldELF::resolveSystemZRelocation(const SectionEntry &Section,
    791                                               uint64_t Offset, uint64_t Value,
    792                                               uint32_t Type, int64_t Addend) {
    793   uint8_t *LocalAddress = Section.Address + Offset;
    794   switch (Type) {
    795   default:
    796     llvm_unreachable("Relocation type not implemented yet!");
    797     break;
    798   case ELF::R_390_PC16DBL:
    799   case ELF::R_390_PLT16DBL: {
    800     int64_t Delta = (Value + Addend) - (Section.LoadAddress + Offset);
    801     assert(int16_t(Delta / 2) * 2 == Delta && "R_390_PC16DBL overflow");
    802     writeInt16BE(LocalAddress, Delta / 2);
    803     break;
    804   }
    805   case ELF::R_390_PC32DBL:
    806   case ELF::R_390_PLT32DBL: {
    807     int64_t Delta = (Value + Addend) - (Section.LoadAddress + Offset);
    808     assert(int32_t(Delta / 2) * 2 == Delta && "R_390_PC32DBL overflow");
    809     writeInt32BE(LocalAddress, Delta / 2);
    810     break;
    811   }
    812   case ELF::R_390_PC32: {
    813     int64_t Delta = (Value + Addend) - (Section.LoadAddress + Offset);
    814     assert(int32_t(Delta) == Delta && "R_390_PC32 overflow");
    815     writeInt32BE(LocalAddress, Delta);
    816     break;
    817   }
    818   case ELF::R_390_64:
    819     writeInt64BE(LocalAddress, Value + Addend);
    820     break;
    821   }
    822 }
    823 
    824 // The target location for the relocation is described by RE.SectionID and
    825 // RE.Offset.  RE.SectionID can be used to find the SectionEntry.  Each
    826 // SectionEntry has three members describing its location.
    827 // SectionEntry::Address is the address at which the section has been loaded
    828 // into memory in the current (host) process.  SectionEntry::LoadAddress is the
    829 // address that the section will have in the target process.
    830 // SectionEntry::ObjAddress is the address of the bits for this section in the
    831 // original emitted object image (also in the current address space).
    832 //
    833 // Relocations will be applied as if the section were loaded at
    834 // SectionEntry::LoadAddress, but they will be applied at an address based
    835 // on SectionEntry::Address.  SectionEntry::ObjAddress will be used to refer to
    836 // Target memory contents if they are required for value calculations.
    837 //
    838 // The Value parameter here is the load address of the symbol for the
    839 // relocation to be applied.  For relocations which refer to symbols in the
    840 // current object Value will be the LoadAddress of the section in which
    841 // the symbol resides (RE.Addend provides additional information about the
    842 // symbol location).  For external symbols, Value will be the address of the
    843 // symbol in the target address space.
    844 void RuntimeDyldELF::resolveRelocation(const RelocationEntry &RE,
    845                                        uint64_t Value) {
    846   const SectionEntry &Section = Sections[RE.SectionID];
    847   return resolveRelocation(Section, RE.Offset, Value, RE.RelType, RE.Addend,
    848                            RE.SymOffset);
    849 }
    850 
    851 void RuntimeDyldELF::resolveRelocation(const SectionEntry &Section,
    852                                        uint64_t Offset, uint64_t Value,
    853                                        uint32_t Type, int64_t Addend,
    854                                        uint64_t SymOffset) {
    855   switch (Arch) {
    856   case Triple::x86_64:
    857     resolveX86_64Relocation(Section, Offset, Value, Type, Addend, SymOffset);
    858     break;
    859   case Triple::x86:
    860     resolveX86Relocation(Section, Offset, (uint32_t)(Value & 0xffffffffL), Type,
    861                          (uint32_t)(Addend & 0xffffffffL));
    862     break;
    863   case Triple::aarch64:
    864   case Triple::aarch64_be:
    865     resolveAArch64Relocation(Section, Offset, Value, Type, Addend);
    866     break;
    867   case Triple::arm: // Fall through.
    868   case Triple::armeb:
    869   case Triple::thumb:
    870   case Triple::thumbeb:
    871     resolveARMRelocation(Section, Offset, (uint32_t)(Value & 0xffffffffL), Type,
    872                          (uint32_t)(Addend & 0xffffffffL));
    873     break;
    874   case Triple::mips: // Fall through.
    875   case Triple::mipsel:
    876     resolveMIPSRelocation(Section, Offset, (uint32_t)(Value & 0xffffffffL),
    877                           Type, (uint32_t)(Addend & 0xffffffffL));
    878     break;
    879   case Triple::ppc64: // Fall through.
    880   case Triple::ppc64le:
    881     resolvePPC64Relocation(Section, Offset, Value, Type, Addend);
    882     break;
    883   case Triple::systemz:
    884     resolveSystemZRelocation(Section, Offset, Value, Type, Addend);
    885     break;
    886   default:
    887     llvm_unreachable("Unsupported CPU type!");
    888   }
    889 }
    890 
    891 relocation_iterator RuntimeDyldELF::processRelocationRef(
    892     unsigned SectionID, relocation_iterator RelI,
    893     const ObjectFile &Obj,
    894     ObjSectionToIDMap &ObjSectionToID,
    895     StubMap &Stubs) {
    896   uint64_t RelType;
    897   Check(RelI->getType(RelType));
    898   int64_t Addend;
    899   Check(getELFRelocationAddend(*RelI, Addend));
    900   symbol_iterator Symbol = RelI->getSymbol();
    901 
    902   // Obtain the symbol name which is referenced in the relocation
    903   StringRef TargetName;
    904   if (Symbol != Obj.symbol_end())
    905     Symbol->getName(TargetName);
    906   DEBUG(dbgs() << "\t\tRelType: " << RelType << " Addend: " << Addend
    907                << " TargetName: " << TargetName << "\n");
    908   RelocationValueRef Value;
    909   // First search for the symbol in the local symbol table
    910   SymbolRef::Type SymType = SymbolRef::ST_Unknown;
    911 
    912   // Search for the symbol in the global symbol table
    913   RTDyldSymbolTable::const_iterator gsi = GlobalSymbolTable.end();
    914   if (Symbol != Obj.symbol_end()) {
    915     gsi = GlobalSymbolTable.find(TargetName.data());
    916     Symbol->getType(SymType);
    917   }
    918   if (gsi != GlobalSymbolTable.end()) {
    919     const auto &SymInfo = gsi->second;
    920     Value.SectionID = SymInfo.getSectionID();
    921     Value.Offset = SymInfo.getOffset();
    922     Value.Addend = SymInfo.getOffset() + Addend;
    923   } else {
    924     switch (SymType) {
    925     case SymbolRef::ST_Debug: {
    926       // TODO: Now ELF SymbolRef::ST_Debug = STT_SECTION, it's not obviously
    927       // and can be changed by another developers. Maybe best way is add
    928       // a new symbol type ST_Section to SymbolRef and use it.
    929       section_iterator si(Obj.section_end());
    930       Symbol->getSection(si);
    931       if (si == Obj.section_end())
    932         llvm_unreachable("Symbol section not found, bad object file format!");
    933       DEBUG(dbgs() << "\t\tThis is section symbol\n");
    934       bool isCode = si->isText();
    935       Value.SectionID = findOrEmitSection(Obj, (*si), isCode, ObjSectionToID);
    936       Value.Addend = Addend;
    937       break;
    938     }
    939     case SymbolRef::ST_Data:
    940     case SymbolRef::ST_Unknown: {
    941       Value.SymbolName = TargetName.data();
    942       Value.Addend = Addend;
    943 
    944       // Absolute relocations will have a zero symbol ID (STN_UNDEF), which
    945       // will manifest here as a NULL symbol name.
    946       // We can set this as a valid (but empty) symbol name, and rely
    947       // on addRelocationForSymbol to handle this.
    948       if (!Value.SymbolName)
    949         Value.SymbolName = "";
    950       break;
    951     }
    952     default:
    953       llvm_unreachable("Unresolved symbol type!");
    954       break;
    955     }
    956   }
    957 
    958   uint64_t Offset;
    959   Check(RelI->getOffset(Offset));
    960 
    961   DEBUG(dbgs() << "\t\tSectionID: " << SectionID << " Offset: " << Offset
    962                << "\n");
    963   if ((Arch == Triple::aarch64 || Arch == Triple::aarch64_be) &&
    964       (RelType == ELF::R_AARCH64_CALL26 || RelType == ELF::R_AARCH64_JUMP26)) {
    965     // This is an AArch64 branch relocation, need to use a stub function.
    966     DEBUG(dbgs() << "\t\tThis is an AArch64 branch relocation.");
    967     SectionEntry &Section = Sections[SectionID];
    968 
    969     // Look for an existing stub.
    970     StubMap::const_iterator i = Stubs.find(Value);
    971     if (i != Stubs.end()) {
    972       resolveRelocation(Section, Offset, (uint64_t)Section.Address + i->second,
    973                         RelType, 0);
    974       DEBUG(dbgs() << " Stub function found\n");
    975     } else {
    976       // Create a new stub function.
    977       DEBUG(dbgs() << " Create a new stub function\n");
    978       Stubs[Value] = Section.StubOffset;
    979       uint8_t *StubTargetAddr =
    980           createStubFunction(Section.Address + Section.StubOffset);
    981 
    982       RelocationEntry REmovz_g3(SectionID, StubTargetAddr - Section.Address,
    983                                 ELF::R_AARCH64_MOVW_UABS_G3, Value.Addend);
    984       RelocationEntry REmovk_g2(SectionID, StubTargetAddr - Section.Address + 4,
    985                                 ELF::R_AARCH64_MOVW_UABS_G2_NC, Value.Addend);
    986       RelocationEntry REmovk_g1(SectionID, StubTargetAddr - Section.Address + 8,
    987                                 ELF::R_AARCH64_MOVW_UABS_G1_NC, Value.Addend);
    988       RelocationEntry REmovk_g0(SectionID,
    989                                 StubTargetAddr - Section.Address + 12,
    990                                 ELF::R_AARCH64_MOVW_UABS_G0_NC, Value.Addend);
    991 
    992       if (Value.SymbolName) {
    993         addRelocationForSymbol(REmovz_g3, Value.SymbolName);
    994         addRelocationForSymbol(REmovk_g2, Value.SymbolName);
    995         addRelocationForSymbol(REmovk_g1, Value.SymbolName);
    996         addRelocationForSymbol(REmovk_g0, Value.SymbolName);
    997       } else {
    998         addRelocationForSection(REmovz_g3, Value.SectionID);
    999         addRelocationForSection(REmovk_g2, Value.SectionID);
   1000         addRelocationForSection(REmovk_g1, Value.SectionID);
   1001         addRelocationForSection(REmovk_g0, Value.SectionID);
   1002       }
   1003       resolveRelocation(Section, Offset,
   1004                         (uint64_t)Section.Address + Section.StubOffset, RelType,
   1005                         0);
   1006       Section.StubOffset += getMaxStubSize();
   1007     }
   1008   } else if (Arch == Triple::arm &&
   1009              (RelType == ELF::R_ARM_PC24 || RelType == ELF::R_ARM_CALL ||
   1010               RelType == ELF::R_ARM_JUMP24)) {
   1011     // This is an ARM branch relocation, need to use a stub function.
   1012     DEBUG(dbgs() << "\t\tThis is an ARM branch relocation.");
   1013     SectionEntry &Section = Sections[SectionID];
   1014 
   1015     // Look for an existing stub.
   1016     StubMap::const_iterator i = Stubs.find(Value);
   1017     if (i != Stubs.end()) {
   1018       resolveRelocation(Section, Offset, (uint64_t)Section.Address + i->second,
   1019                         RelType, 0);
   1020       DEBUG(dbgs() << " Stub function found\n");
   1021     } else {
   1022       // Create a new stub function.
   1023       DEBUG(dbgs() << " Create a new stub function\n");
   1024       Stubs[Value] = Section.StubOffset;
   1025       uint8_t *StubTargetAddr =
   1026           createStubFunction(Section.Address + Section.StubOffset);
   1027       RelocationEntry RE(SectionID, StubTargetAddr - Section.Address,
   1028                          ELF::R_ARM_PRIVATE_0, Value.Addend);
   1029       if (Value.SymbolName)
   1030         addRelocationForSymbol(RE, Value.SymbolName);
   1031       else
   1032         addRelocationForSection(RE, Value.SectionID);
   1033 
   1034       resolveRelocation(Section, Offset,
   1035                         (uint64_t)Section.Address + Section.StubOffset, RelType,
   1036                         0);
   1037       Section.StubOffset += getMaxStubSize();
   1038     }
   1039   } else if ((Arch == Triple::mipsel || Arch == Triple::mips) &&
   1040              RelType == ELF::R_MIPS_26) {
   1041     // This is an Mips branch relocation, need to use a stub function.
   1042     DEBUG(dbgs() << "\t\tThis is a Mips branch relocation.");
   1043     SectionEntry &Section = Sections[SectionID];
   1044     uint8_t *Target = Section.Address + Offset;
   1045     uint32_t *TargetAddress = (uint32_t *)Target;
   1046 
   1047     // Extract the addend from the instruction.
   1048     uint32_t Addend = ((*TargetAddress) & 0x03ffffff) << 2;
   1049 
   1050     Value.Addend += Addend;
   1051 
   1052     //  Look up for existing stub.
   1053     StubMap::const_iterator i = Stubs.find(Value);
   1054     if (i != Stubs.end()) {
   1055       RelocationEntry RE(SectionID, Offset, RelType, i->second);
   1056       addRelocationForSection(RE, SectionID);
   1057       DEBUG(dbgs() << " Stub function found\n");
   1058     } else {
   1059       // Create a new stub function.
   1060       DEBUG(dbgs() << " Create a new stub function\n");
   1061       Stubs[Value] = Section.StubOffset;
   1062       uint8_t *StubTargetAddr =
   1063           createStubFunction(Section.Address + Section.StubOffset);
   1064 
   1065       // Creating Hi and Lo relocations for the filled stub instructions.
   1066       RelocationEntry REHi(SectionID, StubTargetAddr - Section.Address,
   1067                            ELF::R_MIPS_UNUSED1, Value.Addend);
   1068       RelocationEntry RELo(SectionID, StubTargetAddr - Section.Address + 4,
   1069                            ELF::R_MIPS_UNUSED2, Value.Addend);
   1070 
   1071       if (Value.SymbolName) {
   1072         addRelocationForSymbol(REHi, Value.SymbolName);
   1073         addRelocationForSymbol(RELo, Value.SymbolName);
   1074       } else {
   1075         addRelocationForSection(REHi, Value.SectionID);
   1076         addRelocationForSection(RELo, Value.SectionID);
   1077       }
   1078 
   1079       RelocationEntry RE(SectionID, Offset, RelType, Section.StubOffset);
   1080       addRelocationForSection(RE, SectionID);
   1081       Section.StubOffset += getMaxStubSize();
   1082     }
   1083   } else if (Arch == Triple::ppc64 || Arch == Triple::ppc64le) {
   1084     if (RelType == ELF::R_PPC64_REL24) {
   1085       // Determine ABI variant in use for this object.
   1086       unsigned AbiVariant;
   1087       Obj.getPlatformFlags(AbiVariant);
   1088       AbiVariant &= ELF::EF_PPC64_ABI;
   1089       // A PPC branch relocation will need a stub function if the target is
   1090       // an external symbol (Symbol::ST_Unknown) or if the target address
   1091       // is not within the signed 24-bits branch address.
   1092       SectionEntry &Section = Sections[SectionID];
   1093       uint8_t *Target = Section.Address + Offset;
   1094       bool RangeOverflow = false;
   1095       if (SymType != SymbolRef::ST_Unknown) {
   1096         if (AbiVariant != 2) {
   1097           // In the ELFv1 ABI, a function call may point to the .opd entry,
   1098           // so the final symbol value is calculated based on the relocation
   1099           // values in the .opd section.
   1100           findOPDEntrySection(Obj, ObjSectionToID, Value);
   1101         } else {
   1102           // In the ELFv2 ABI, a function symbol may provide a local entry
   1103           // point, which must be used for direct calls.
   1104           uint8_t SymOther;
   1105           Symbol->getOther(SymOther);
   1106           Value.Addend += ELF::decodePPC64LocalEntryOffset(SymOther);
   1107         }
   1108         uint8_t *RelocTarget = Sections[Value.SectionID].Address + Value.Addend;
   1109         int32_t delta = static_cast<int32_t>(Target - RelocTarget);
   1110         // If it is within 24-bits branch range, just set the branch target
   1111         if (SignExtend32<24>(delta) == delta) {
   1112           RelocationEntry RE(SectionID, Offset, RelType, Value.Addend);
   1113           if (Value.SymbolName)
   1114             addRelocationForSymbol(RE, Value.SymbolName);
   1115           else
   1116             addRelocationForSection(RE, Value.SectionID);
   1117         } else {
   1118           RangeOverflow = true;
   1119         }
   1120       }
   1121       if (SymType == SymbolRef::ST_Unknown || RangeOverflow) {
   1122         // It is an external symbol (SymbolRef::ST_Unknown) or within a range
   1123         // larger than 24-bits.
   1124         StubMap::const_iterator i = Stubs.find(Value);
   1125         if (i != Stubs.end()) {
   1126           // Symbol function stub already created, just relocate to it
   1127           resolveRelocation(Section, Offset,
   1128                             (uint64_t)Section.Address + i->second, RelType, 0);
   1129           DEBUG(dbgs() << " Stub function found\n");
   1130         } else {
   1131           // Create a new stub function.
   1132           DEBUG(dbgs() << " Create a new stub function\n");
   1133           Stubs[Value] = Section.StubOffset;
   1134           uint8_t *StubTargetAddr =
   1135               createStubFunction(Section.Address + Section.StubOffset,
   1136                                  AbiVariant);
   1137           RelocationEntry RE(SectionID, StubTargetAddr - Section.Address,
   1138                              ELF::R_PPC64_ADDR64, Value.Addend);
   1139 
   1140           // Generates the 64-bits address loads as exemplified in section
   1141           // 4.5.1 in PPC64 ELF ABI.  Note that the relocations need to
   1142           // apply to the low part of the instructions, so we have to update
   1143           // the offset according to the target endianness.
   1144           uint64_t StubRelocOffset = StubTargetAddr - Section.Address;
   1145           if (!IsTargetLittleEndian)
   1146             StubRelocOffset += 2;
   1147 
   1148           RelocationEntry REhst(SectionID, StubRelocOffset + 0,
   1149                                 ELF::R_PPC64_ADDR16_HIGHEST, Value.Addend);
   1150           RelocationEntry REhr(SectionID, StubRelocOffset + 4,
   1151                                ELF::R_PPC64_ADDR16_HIGHER, Value.Addend);
   1152           RelocationEntry REh(SectionID, StubRelocOffset + 12,
   1153                               ELF::R_PPC64_ADDR16_HI, Value.Addend);
   1154           RelocationEntry REl(SectionID, StubRelocOffset + 16,
   1155                               ELF::R_PPC64_ADDR16_LO, Value.Addend);
   1156 
   1157           if (Value.SymbolName) {
   1158             addRelocationForSymbol(REhst, Value.SymbolName);
   1159             addRelocationForSymbol(REhr, Value.SymbolName);
   1160             addRelocationForSymbol(REh, Value.SymbolName);
   1161             addRelocationForSymbol(REl, Value.SymbolName);
   1162           } else {
   1163             addRelocationForSection(REhst, Value.SectionID);
   1164             addRelocationForSection(REhr, Value.SectionID);
   1165             addRelocationForSection(REh, Value.SectionID);
   1166             addRelocationForSection(REl, Value.SectionID);
   1167           }
   1168 
   1169           resolveRelocation(Section, Offset,
   1170                             (uint64_t)Section.Address + Section.StubOffset,
   1171                             RelType, 0);
   1172           Section.StubOffset += getMaxStubSize();
   1173         }
   1174         if (SymType == SymbolRef::ST_Unknown) {
   1175           // Restore the TOC for external calls
   1176           if (AbiVariant == 2)
   1177             writeInt32BE(Target + 4, 0xE8410018); // ld r2,28(r1)
   1178           else
   1179             writeInt32BE(Target + 4, 0xE8410028); // ld r2,40(r1)
   1180         }
   1181       }
   1182     } else if (RelType == ELF::R_PPC64_TOC16 ||
   1183                RelType == ELF::R_PPC64_TOC16_DS ||
   1184                RelType == ELF::R_PPC64_TOC16_LO ||
   1185                RelType == ELF::R_PPC64_TOC16_LO_DS ||
   1186                RelType == ELF::R_PPC64_TOC16_HI ||
   1187                RelType == ELF::R_PPC64_TOC16_HA) {
   1188       // These relocations are supposed to subtract the TOC address from
   1189       // the final value.  This does not fit cleanly into the RuntimeDyld
   1190       // scheme, since there may be *two* sections involved in determining
   1191       // the relocation value (the section of the symbol refered to by the
   1192       // relocation, and the TOC section associated with the current module).
   1193       //
   1194       // Fortunately, these relocations are currently only ever generated
   1195       // refering to symbols that themselves reside in the TOC, which means
   1196       // that the two sections are actually the same.  Thus they cancel out
   1197       // and we can immediately resolve the relocation right now.
   1198       switch (RelType) {
   1199       case ELF::R_PPC64_TOC16: RelType = ELF::R_PPC64_ADDR16; break;
   1200       case ELF::R_PPC64_TOC16_DS: RelType = ELF::R_PPC64_ADDR16_DS; break;
   1201       case ELF::R_PPC64_TOC16_LO: RelType = ELF::R_PPC64_ADDR16_LO; break;
   1202       case ELF::R_PPC64_TOC16_LO_DS: RelType = ELF::R_PPC64_ADDR16_LO_DS; break;
   1203       case ELF::R_PPC64_TOC16_HI: RelType = ELF::R_PPC64_ADDR16_HI; break;
   1204       case ELF::R_PPC64_TOC16_HA: RelType = ELF::R_PPC64_ADDR16_HA; break;
   1205       default: llvm_unreachable("Wrong relocation type.");
   1206       }
   1207 
   1208       RelocationValueRef TOCValue;
   1209       findPPC64TOCSection(Obj, ObjSectionToID, TOCValue);
   1210       if (Value.SymbolName || Value.SectionID != TOCValue.SectionID)
   1211         llvm_unreachable("Unsupported TOC relocation.");
   1212       Value.Addend -= TOCValue.Addend;
   1213       resolveRelocation(Sections[SectionID], Offset, Value.Addend, RelType, 0);
   1214     } else {
   1215       // There are two ways to refer to the TOC address directly: either
   1216       // via a ELF::R_PPC64_TOC relocation (where both symbol and addend are
   1217       // ignored), or via any relocation that refers to the magic ".TOC."
   1218       // symbols (in which case the addend is respected).
   1219       if (RelType == ELF::R_PPC64_TOC) {
   1220         RelType = ELF::R_PPC64_ADDR64;
   1221         findPPC64TOCSection(Obj, ObjSectionToID, Value);
   1222       } else if (TargetName == ".TOC.") {
   1223         findPPC64TOCSection(Obj, ObjSectionToID, Value);
   1224         Value.Addend += Addend;
   1225       }
   1226 
   1227       RelocationEntry RE(SectionID, Offset, RelType, Value.Addend);
   1228 
   1229       if (Value.SymbolName)
   1230         addRelocationForSymbol(RE, Value.SymbolName);
   1231       else
   1232         addRelocationForSection(RE, Value.SectionID);
   1233     }
   1234   } else if (Arch == Triple::systemz &&
   1235              (RelType == ELF::R_390_PLT32DBL || RelType == ELF::R_390_GOTENT)) {
   1236     // Create function stubs for both PLT and GOT references, regardless of
   1237     // whether the GOT reference is to data or code.  The stub contains the
   1238     // full address of the symbol, as needed by GOT references, and the
   1239     // executable part only adds an overhead of 8 bytes.
   1240     //
   1241     // We could try to conserve space by allocating the code and data
   1242     // parts of the stub separately.  However, as things stand, we allocate
   1243     // a stub for every relocation, so using a GOT in JIT code should be
   1244     // no less space efficient than using an explicit constant pool.
   1245     DEBUG(dbgs() << "\t\tThis is a SystemZ indirect relocation.");
   1246     SectionEntry &Section = Sections[SectionID];
   1247 
   1248     // Look for an existing stub.
   1249     StubMap::const_iterator i = Stubs.find(Value);
   1250     uintptr_t StubAddress;
   1251     if (i != Stubs.end()) {
   1252       StubAddress = uintptr_t(Section.Address) + i->second;
   1253       DEBUG(dbgs() << " Stub function found\n");
   1254     } else {
   1255       // Create a new stub function.
   1256       DEBUG(dbgs() << " Create a new stub function\n");
   1257 
   1258       uintptr_t BaseAddress = uintptr_t(Section.Address);
   1259       uintptr_t StubAlignment = getStubAlignment();
   1260       StubAddress = (BaseAddress + Section.StubOffset + StubAlignment - 1) &
   1261                     -StubAlignment;
   1262       unsigned StubOffset = StubAddress - BaseAddress;
   1263 
   1264       Stubs[Value] = StubOffset;
   1265       createStubFunction((uint8_t *)StubAddress);
   1266       RelocationEntry RE(SectionID, StubOffset + 8, ELF::R_390_64,
   1267                          Value.Offset);
   1268       if (Value.SymbolName)
   1269         addRelocationForSymbol(RE, Value.SymbolName);
   1270       else
   1271         addRelocationForSection(RE, Value.SectionID);
   1272       Section.StubOffset = StubOffset + getMaxStubSize();
   1273     }
   1274 
   1275     if (RelType == ELF::R_390_GOTENT)
   1276       resolveRelocation(Section, Offset, StubAddress + 8, ELF::R_390_PC32DBL,
   1277                         Addend);
   1278     else
   1279       resolveRelocation(Section, Offset, StubAddress, RelType, Addend);
   1280   } else if (Arch == Triple::x86_64 && RelType == ELF::R_X86_64_PLT32) {
   1281     // The way the PLT relocations normally work is that the linker allocates
   1282     // the
   1283     // PLT and this relocation makes a PC-relative call into the PLT.  The PLT
   1284     // entry will then jump to an address provided by the GOT.  On first call,
   1285     // the
   1286     // GOT address will point back into PLT code that resolves the symbol. After
   1287     // the first call, the GOT entry points to the actual function.
   1288     //
   1289     // For local functions we're ignoring all of that here and just replacing
   1290     // the PLT32 relocation type with PC32, which will translate the relocation
   1291     // into a PC-relative call directly to the function. For external symbols we
   1292     // can't be sure the function will be within 2^32 bytes of the call site, so
   1293     // we need to create a stub, which calls into the GOT.  This case is
   1294     // equivalent to the usual PLT implementation except that we use the stub
   1295     // mechanism in RuntimeDyld (which puts stubs at the end of the section)
   1296     // rather than allocating a PLT section.
   1297     if (Value.SymbolName) {
   1298       // This is a call to an external function.
   1299       // Look for an existing stub.
   1300       SectionEntry &Section = Sections[SectionID];
   1301       StubMap::const_iterator i = Stubs.find(Value);
   1302       uintptr_t StubAddress;
   1303       if (i != Stubs.end()) {
   1304         StubAddress = uintptr_t(Section.Address) + i->second;
   1305         DEBUG(dbgs() << " Stub function found\n");
   1306       } else {
   1307         // Create a new stub function (equivalent to a PLT entry).
   1308         DEBUG(dbgs() << " Create a new stub function\n");
   1309 
   1310         uintptr_t BaseAddress = uintptr_t(Section.Address);
   1311         uintptr_t StubAlignment = getStubAlignment();
   1312         StubAddress = (BaseAddress + Section.StubOffset + StubAlignment - 1) &
   1313                       -StubAlignment;
   1314         unsigned StubOffset = StubAddress - BaseAddress;
   1315         Stubs[Value] = StubOffset;
   1316         createStubFunction((uint8_t *)StubAddress);
   1317 
   1318         // Bump our stub offset counter
   1319         Section.StubOffset = StubOffset + getMaxStubSize();
   1320 
   1321         // Allocate a GOT Entry
   1322         uint64_t GOTOffset = allocateGOTEntries(SectionID, 1);
   1323 
   1324         // The load of the GOT address has an addend of -4
   1325         resolveGOTOffsetRelocation(SectionID, StubOffset + 2, GOTOffset - 4);
   1326 
   1327         // Fill in the value of the symbol we're targeting into the GOT
   1328         addRelocationForSymbol(computeGOTOffsetRE(SectionID,GOTOffset,0,ELF::R_X86_64_64),
   1329             Value.SymbolName);
   1330       }
   1331 
   1332       // Make the target call a call into the stub table.
   1333       resolveRelocation(Section, Offset, StubAddress, ELF::R_X86_64_PC32,
   1334                         Addend);
   1335     } else {
   1336       RelocationEntry RE(SectionID, Offset, ELF::R_X86_64_PC32, Value.Addend,
   1337                          Value.Offset);
   1338       addRelocationForSection(RE, Value.SectionID);
   1339     }
   1340   } else if (Arch == Triple::x86_64 && RelType == ELF::R_X86_64_GOTPCREL) {
   1341     uint64_t GOTOffset = allocateGOTEntries(SectionID, 1);
   1342     resolveGOTOffsetRelocation(SectionID, Offset, GOTOffset + Addend);
   1343 
   1344     // Fill in the value of the symbol we're targeting into the GOT
   1345     RelocationEntry RE = computeGOTOffsetRE(SectionID, GOTOffset, Value.Offset, ELF::R_X86_64_64);
   1346     if (Value.SymbolName)
   1347       addRelocationForSymbol(RE, Value.SymbolName);
   1348     else
   1349       addRelocationForSection(RE, Value.SectionID);
   1350   } else {
   1351     RelocationEntry RE(SectionID, Offset, RelType, Value.Addend, Value.Offset);
   1352     if (Value.SymbolName)
   1353       addRelocationForSymbol(RE, Value.SymbolName);
   1354     else
   1355       addRelocationForSection(RE, Value.SectionID);
   1356   }
   1357   return ++RelI;
   1358 }
   1359 
   1360 size_t RuntimeDyldELF::getGOTEntrySize() {
   1361   // We don't use the GOT in all of these cases, but it's essentially free
   1362   // to put them all here.
   1363   size_t Result = 0;
   1364   switch (Arch) {
   1365   case Triple::x86_64:
   1366   case Triple::aarch64:
   1367   case Triple::aarch64_be:
   1368   case Triple::ppc64:
   1369   case Triple::ppc64le:
   1370   case Triple::systemz:
   1371     Result = sizeof(uint64_t);
   1372     break;
   1373   case Triple::x86:
   1374   case Triple::arm:
   1375   case Triple::thumb:
   1376   case Triple::mips:
   1377   case Triple::mipsel:
   1378     Result = sizeof(uint32_t);
   1379     break;
   1380   default:
   1381     llvm_unreachable("Unsupported CPU type!");
   1382   }
   1383   return Result;
   1384 }
   1385 
   1386 uint64_t RuntimeDyldELF::allocateGOTEntries(unsigned SectionID, unsigned no)
   1387 {
   1388   (void)SectionID; // The GOT Section is the same for all section in the object file
   1389   if (GOTSectionID == 0) {
   1390     GOTSectionID = Sections.size();
   1391     // Reserve a section id. We'll allocate the section later
   1392     // once we know the total size
   1393     Sections.push_back(SectionEntry(".got", 0, 0, 0));
   1394   }
   1395   uint64_t StartOffset = CurrentGOTIndex * getGOTEntrySize();
   1396   CurrentGOTIndex += no;
   1397   return StartOffset;
   1398 }
   1399 
   1400 void RuntimeDyldELF::resolveGOTOffsetRelocation(unsigned SectionID, uint64_t Offset, uint64_t GOTOffset)
   1401 {
   1402   // Fill in the relative address of the GOT Entry into the stub
   1403   RelocationEntry GOTRE(SectionID, Offset, ELF::R_X86_64_PC32, GOTOffset);
   1404   addRelocationForSection(GOTRE, GOTSectionID);
   1405 }
   1406 
   1407 RelocationEntry RuntimeDyldELF::computeGOTOffsetRE(unsigned SectionID, uint64_t GOTOffset, uint64_t SymbolOffset,
   1408                                                    uint32_t Type)
   1409 {
   1410   (void)SectionID; // The GOT Section is the same for all section in the object file
   1411   return RelocationEntry(GOTSectionID, GOTOffset, Type, SymbolOffset);
   1412 }
   1413 
   1414 void RuntimeDyldELF::finalizeLoad(const ObjectFile &Obj,
   1415                                   ObjSectionToIDMap &SectionMap) {
   1416   // If necessary, allocate the global offset table
   1417   if (GOTSectionID != 0) {
   1418     // Allocate memory for the section
   1419     size_t TotalSize = CurrentGOTIndex * getGOTEntrySize();
   1420     uint8_t *Addr = MemMgr.allocateDataSection(TotalSize, getGOTEntrySize(),
   1421                                                 GOTSectionID, ".got", false);
   1422     if (!Addr)
   1423       report_fatal_error("Unable to allocate memory for GOT!");
   1424 
   1425     Sections[GOTSectionID] = SectionEntry(".got", Addr, TotalSize, 0);
   1426 
   1427     if (Checker)
   1428       Checker->registerSection(Obj.getFileName(), GOTSectionID);
   1429 
   1430     // For now, initialize all GOT entries to zero.  We'll fill them in as
   1431     // needed when GOT-based relocations are applied.
   1432     memset(Addr, 0, TotalSize);
   1433   }
   1434 
   1435   // Look for and record the EH frame section.
   1436   ObjSectionToIDMap::iterator i, e;
   1437   for (i = SectionMap.begin(), e = SectionMap.end(); i != e; ++i) {
   1438     const SectionRef &Section = i->first;
   1439     StringRef Name;
   1440     Section.getName(Name);
   1441     if (Name == ".eh_frame") {
   1442       UnregisteredEHFrameSections.push_back(i->second);
   1443       break;
   1444     }
   1445   }
   1446 
   1447   GOTSectionID = 0;
   1448   CurrentGOTIndex = 0;
   1449 }
   1450 
   1451 bool RuntimeDyldELF::isCompatibleFile(const object::ObjectFile &Obj) const {
   1452   return Obj.isELF();
   1453 }
   1454 
   1455 } // namespace llvm
   1456