Home | History | Annotate | Download | only in RuntimeDyld
      1 //===-- RuntimeDyld.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 the MC-JIT runtime dynamic linker.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "llvm/ExecutionEngine/RuntimeDyld.h"
     15 #include "JITRegistrar.h"
     16 #include "ObjectImageCommon.h"
     17 #include "RuntimeDyldELF.h"
     18 #include "RuntimeDyldImpl.h"
     19 #include "RuntimeDyldMachO.h"
     20 #include "llvm/Object/ELF.h"
     21 #include "llvm/Support/MathExtras.h"
     22 #include "llvm/Support/MutexGuard.h"
     23 
     24 using namespace llvm;
     25 using namespace llvm::object;
     26 
     27 #define DEBUG_TYPE "dyld"
     28 
     29 // Empty out-of-line virtual destructor as the key function.
     30 RuntimeDyldImpl::~RuntimeDyldImpl() {}
     31 
     32 // Pin the JITRegistrar's and ObjectImage*'s vtables to this file.
     33 void JITRegistrar::anchor() {}
     34 void ObjectImage::anchor() {}
     35 void ObjectImageCommon::anchor() {}
     36 
     37 namespace llvm {
     38 
     39 void RuntimeDyldImpl::registerEHFrames() {}
     40 
     41 void RuntimeDyldImpl::deregisterEHFrames() {}
     42 
     43 // Resolve the relocations for all symbols we currently know about.
     44 void RuntimeDyldImpl::resolveRelocations() {
     45   MutexGuard locked(lock);
     46 
     47   // First, resolve relocations associated with external symbols.
     48   resolveExternalSymbols();
     49 
     50   // Just iterate over the sections we have and resolve all the relocations
     51   // in them. Gross overkill, but it gets the job done.
     52   for (int i = 0, e = Sections.size(); i != e; ++i) {
     53     // The Section here (Sections[i]) refers to the section in which the
     54     // symbol for the relocation is located.  The SectionID in the relocation
     55     // entry provides the section to which the relocation will be applied.
     56     uint64_t Addr = Sections[i].LoadAddress;
     57     DEBUG(dbgs() << "Resolving relocations Section #" << i << "\t"
     58                  << format("%p", (uint8_t *)Addr) << "\n");
     59     resolveRelocationList(Relocations[i], Addr);
     60     Relocations.erase(i);
     61   }
     62 }
     63 
     64 void RuntimeDyldImpl::mapSectionAddress(const void *LocalAddress,
     65                                         uint64_t TargetAddress) {
     66   MutexGuard locked(lock);
     67   for (unsigned i = 0, e = Sections.size(); i != e; ++i) {
     68     if (Sections[i].Address == LocalAddress) {
     69       reassignSectionAddress(i, TargetAddress);
     70       return;
     71     }
     72   }
     73   llvm_unreachable("Attempting to remap address of unknown section!");
     74 }
     75 
     76 static std::error_code getOffset(const SymbolRef &Sym, uint64_t &Result) {
     77   uint64_t Address;
     78   if (std::error_code EC = Sym.getAddress(Address))
     79     return EC;
     80 
     81   if (Address == UnknownAddressOrSize) {
     82     Result = UnknownAddressOrSize;
     83     return object_error::success;
     84   }
     85 
     86   const ObjectFile *Obj = Sym.getObject();
     87   section_iterator SecI(Obj->section_begin());
     88   if (std::error_code EC = Sym.getSection(SecI))
     89     return EC;
     90 
     91  if (SecI == Obj->section_end()) {
     92    Result = UnknownAddressOrSize;
     93    return object_error::success;
     94  }
     95 
     96   uint64_t SectionAddress;
     97   if (std::error_code EC = SecI->getAddress(SectionAddress))
     98     return EC;
     99 
    100   Result = Address - SectionAddress;
    101   return object_error::success;
    102 }
    103 
    104 ObjectImage *RuntimeDyldImpl::loadObject(ObjectImage *InputObject) {
    105   MutexGuard locked(lock);
    106 
    107   std::unique_ptr<ObjectImage> Obj(InputObject);
    108   if (!Obj)
    109     return nullptr;
    110 
    111   // Save information about our target
    112   Arch = (Triple::ArchType)Obj->getArch();
    113   IsTargetLittleEndian = Obj->getObjectFile()->isLittleEndian();
    114 
    115   // Compute the memory size required to load all sections to be loaded
    116   // and pass this information to the memory manager
    117   if (MemMgr->needsToReserveAllocationSpace()) {
    118     uint64_t CodeSize = 0, DataSizeRO = 0, DataSizeRW = 0;
    119     computeTotalAllocSize(*Obj, CodeSize, DataSizeRO, DataSizeRW);
    120     MemMgr->reserveAllocationSpace(CodeSize, DataSizeRO, DataSizeRW);
    121   }
    122 
    123   // Symbols found in this object
    124   StringMap<SymbolLoc> LocalSymbols;
    125   // Used sections from the object file
    126   ObjSectionToIDMap LocalSections;
    127 
    128   // Common symbols requiring allocation, with their sizes and alignments
    129   CommonSymbolMap CommonSymbols;
    130   // Maximum required total memory to allocate all common symbols
    131   uint64_t CommonSize = 0;
    132 
    133   // Parse symbols
    134   DEBUG(dbgs() << "Parse symbols:\n");
    135   for (symbol_iterator I = Obj->begin_symbols(), E = Obj->end_symbols(); I != E;
    136        ++I) {
    137     object::SymbolRef::Type SymType;
    138     StringRef Name;
    139     Check(I->getType(SymType));
    140     Check(I->getName(Name));
    141 
    142     uint32_t Flags = I->getFlags();
    143 
    144     bool IsCommon = Flags & SymbolRef::SF_Common;
    145     if (IsCommon) {
    146       // Add the common symbols to a list.  We'll allocate them all below.
    147       if (!GlobalSymbolTable.count(Name)) {
    148         uint32_t Align;
    149         Check(I->getAlignment(Align));
    150         uint64_t Size = 0;
    151         Check(I->getSize(Size));
    152         CommonSize += Size + Align;
    153         CommonSymbols[*I] = CommonSymbolInfo(Size, Align);
    154       }
    155     } else {
    156       if (SymType == object::SymbolRef::ST_Function ||
    157           SymType == object::SymbolRef::ST_Data ||
    158           SymType == object::SymbolRef::ST_Unknown) {
    159         uint64_t SectOffset;
    160         StringRef SectionData;
    161         bool IsCode;
    162         section_iterator SI = Obj->end_sections();
    163         Check(getOffset(*I, SectOffset));
    164         Check(I->getSection(SI));
    165         if (SI == Obj->end_sections())
    166           continue;
    167         Check(SI->getContents(SectionData));
    168         Check(SI->isText(IsCode));
    169         unsigned SectionID =
    170             findOrEmitSection(*Obj, *SI, IsCode, LocalSections);
    171         LocalSymbols[Name.data()] = SymbolLoc(SectionID, SectOffset);
    172         DEBUG(dbgs() << "\tOffset: " << format("%p", (uintptr_t)SectOffset)
    173                      << " flags: " << Flags << " SID: " << SectionID);
    174         GlobalSymbolTable[Name] = SymbolLoc(SectionID, SectOffset);
    175       }
    176     }
    177     DEBUG(dbgs() << "\tType: " << SymType << " Name: " << Name << "\n");
    178   }
    179 
    180   // Allocate common symbols
    181   if (CommonSize != 0)
    182     emitCommonSymbols(*Obj, CommonSymbols, CommonSize, GlobalSymbolTable);
    183 
    184   // Parse and process relocations
    185   DEBUG(dbgs() << "Parse relocations:\n");
    186   for (section_iterator SI = Obj->begin_sections(), SE = Obj->end_sections();
    187        SI != SE; ++SI) {
    188     unsigned SectionID = 0;
    189     StubMap Stubs;
    190     section_iterator RelocatedSection = SI->getRelocatedSection();
    191 
    192     relocation_iterator I = SI->relocation_begin();
    193     relocation_iterator E = SI->relocation_end();
    194 
    195     if (I == E && !ProcessAllSections)
    196       continue;
    197 
    198     bool IsCode = false;
    199     Check(RelocatedSection->isText(IsCode));
    200     SectionID =
    201         findOrEmitSection(*Obj, *RelocatedSection, IsCode, LocalSections);
    202     DEBUG(dbgs() << "\tSectionID: " << SectionID << "\n");
    203 
    204     for (; I != E;)
    205       I = processRelocationRef(SectionID, I, *Obj, LocalSections, LocalSymbols,
    206                                Stubs);
    207   }
    208 
    209   // Give the subclasses a chance to tie-up any loose ends.
    210   finalizeLoad(*Obj, LocalSections);
    211 
    212   return Obj.release();
    213 }
    214 
    215 // A helper method for computeTotalAllocSize.
    216 // Computes the memory size required to allocate sections with the given sizes,
    217 // assuming that all sections are allocated with the given alignment
    218 static uint64_t
    219 computeAllocationSizeForSections(std::vector<uint64_t> &SectionSizes,
    220                                  uint64_t Alignment) {
    221   uint64_t TotalSize = 0;
    222   for (size_t Idx = 0, Cnt = SectionSizes.size(); Idx < Cnt; Idx++) {
    223     uint64_t AlignedSize =
    224         (SectionSizes[Idx] + Alignment - 1) / Alignment * Alignment;
    225     TotalSize += AlignedSize;
    226   }
    227   return TotalSize;
    228 }
    229 
    230 // Compute an upper bound of the memory size that is required to load all
    231 // sections
    232 void RuntimeDyldImpl::computeTotalAllocSize(ObjectImage &Obj,
    233                                             uint64_t &CodeSize,
    234                                             uint64_t &DataSizeRO,
    235                                             uint64_t &DataSizeRW) {
    236   // Compute the size of all sections required for execution
    237   std::vector<uint64_t> CodeSectionSizes;
    238   std::vector<uint64_t> ROSectionSizes;
    239   std::vector<uint64_t> RWSectionSizes;
    240   uint64_t MaxAlignment = sizeof(void *);
    241 
    242   // Collect sizes of all sections to be loaded;
    243   // also determine the max alignment of all sections
    244   for (section_iterator SI = Obj.begin_sections(), SE = Obj.end_sections();
    245        SI != SE; ++SI) {
    246     const SectionRef &Section = *SI;
    247 
    248     bool IsRequired;
    249     Check(Section.isRequiredForExecution(IsRequired));
    250 
    251     // Consider only the sections that are required to be loaded for execution
    252     if (IsRequired) {
    253       uint64_t DataSize = 0;
    254       uint64_t Alignment64 = 0;
    255       bool IsCode = false;
    256       bool IsReadOnly = false;
    257       StringRef Name;
    258       Check(Section.getSize(DataSize));
    259       Check(Section.getAlignment(Alignment64));
    260       Check(Section.isText(IsCode));
    261       Check(Section.isReadOnlyData(IsReadOnly));
    262       Check(Section.getName(Name));
    263       unsigned Alignment = (unsigned)Alignment64 & 0xffffffffL;
    264 
    265       uint64_t StubBufSize = computeSectionStubBufSize(Obj, Section);
    266       uint64_t SectionSize = DataSize + StubBufSize;
    267 
    268       // The .eh_frame section (at least on Linux) needs an extra four bytes
    269       // padded
    270       // with zeroes added at the end.  For MachO objects, this section has a
    271       // slightly different name, so this won't have any effect for MachO
    272       // objects.
    273       if (Name == ".eh_frame")
    274         SectionSize += 4;
    275 
    276       if (SectionSize > 0) {
    277         // save the total size of the section
    278         if (IsCode) {
    279           CodeSectionSizes.push_back(SectionSize);
    280         } else if (IsReadOnly) {
    281           ROSectionSizes.push_back(SectionSize);
    282         } else {
    283           RWSectionSizes.push_back(SectionSize);
    284         }
    285         // update the max alignment
    286         if (Alignment > MaxAlignment) {
    287           MaxAlignment = Alignment;
    288         }
    289       }
    290     }
    291   }
    292 
    293   // Compute the size of all common symbols
    294   uint64_t CommonSize = 0;
    295   for (symbol_iterator I = Obj.begin_symbols(), E = Obj.end_symbols(); I != E;
    296        ++I) {
    297     uint32_t Flags = I->getFlags();
    298     if (Flags & SymbolRef::SF_Common) {
    299       // Add the common symbols to a list.  We'll allocate them all below.
    300       uint64_t Size = 0;
    301       Check(I->getSize(Size));
    302       CommonSize += Size;
    303     }
    304   }
    305   if (CommonSize != 0) {
    306     RWSectionSizes.push_back(CommonSize);
    307   }
    308 
    309   // Compute the required allocation space for each different type of sections
    310   // (code, read-only data, read-write data) assuming that all sections are
    311   // allocated with the max alignment. Note that we cannot compute with the
    312   // individual alignments of the sections, because then the required size
    313   // depends on the order, in which the sections are allocated.
    314   CodeSize = computeAllocationSizeForSections(CodeSectionSizes, MaxAlignment);
    315   DataSizeRO = computeAllocationSizeForSections(ROSectionSizes, MaxAlignment);
    316   DataSizeRW = computeAllocationSizeForSections(RWSectionSizes, MaxAlignment);
    317 }
    318 
    319 // compute stub buffer size for the given section
    320 unsigned RuntimeDyldImpl::computeSectionStubBufSize(ObjectImage &Obj,
    321                                                     const SectionRef &Section) {
    322   unsigned StubSize = getMaxStubSize();
    323   if (StubSize == 0) {
    324     return 0;
    325   }
    326   // FIXME: this is an inefficient way to handle this. We should computed the
    327   // necessary section allocation size in loadObject by walking all the sections
    328   // once.
    329   unsigned StubBufSize = 0;
    330   for (section_iterator SI = Obj.begin_sections(), SE = Obj.end_sections();
    331        SI != SE; ++SI) {
    332     section_iterator RelSecI = SI->getRelocatedSection();
    333     if (!(RelSecI == Section))
    334       continue;
    335 
    336     for (const RelocationRef &Reloc : SI->relocations()) {
    337       (void)Reloc;
    338       StubBufSize += StubSize;
    339     }
    340   }
    341 
    342   // Get section data size and alignment
    343   uint64_t Alignment64;
    344   uint64_t DataSize;
    345   Check(Section.getSize(DataSize));
    346   Check(Section.getAlignment(Alignment64));
    347 
    348   // Add stubbuf size alignment
    349   unsigned Alignment = (unsigned)Alignment64 & 0xffffffffL;
    350   unsigned StubAlignment = getStubAlignment();
    351   unsigned EndAlignment = (DataSize | Alignment) & -(DataSize | Alignment);
    352   if (StubAlignment > EndAlignment)
    353     StubBufSize += StubAlignment - EndAlignment;
    354   return StubBufSize;
    355 }
    356 
    357 void RuntimeDyldImpl::emitCommonSymbols(ObjectImage &Obj,
    358                                         const CommonSymbolMap &CommonSymbols,
    359                                         uint64_t TotalSize,
    360                                         SymbolTableMap &SymbolTable) {
    361   // Allocate memory for the section
    362   unsigned SectionID = Sections.size();
    363   uint8_t *Addr = MemMgr->allocateDataSection(TotalSize, sizeof(void *),
    364                                               SectionID, StringRef(), false);
    365   if (!Addr)
    366     report_fatal_error("Unable to allocate memory for common symbols!");
    367   uint64_t Offset = 0;
    368   Sections.push_back(SectionEntry(StringRef(), Addr, TotalSize, 0));
    369   memset(Addr, 0, TotalSize);
    370 
    371   DEBUG(dbgs() << "emitCommonSection SectionID: " << SectionID << " new addr: "
    372                << format("%p", Addr) << " DataSize: " << TotalSize << "\n");
    373 
    374   // Assign the address of each symbol
    375   for (CommonSymbolMap::const_iterator it = CommonSymbols.begin(),
    376        itEnd = CommonSymbols.end(); it != itEnd; ++it) {
    377     uint64_t Size = it->second.first;
    378     uint64_t Align = it->second.second;
    379     StringRef Name;
    380     it->first.getName(Name);
    381     if (Align) {
    382       // This symbol has an alignment requirement.
    383       uint64_t AlignOffset = OffsetToAlignment((uint64_t)Addr, Align);
    384       Addr += AlignOffset;
    385       Offset += AlignOffset;
    386       DEBUG(dbgs() << "Allocating common symbol " << Name << " address "
    387                    << format("%p\n", Addr));
    388     }
    389     Obj.updateSymbolAddress(it->first, (uint64_t)Addr);
    390     SymbolTable[Name.data()] = SymbolLoc(SectionID, Offset);
    391     Offset += Size;
    392     Addr += Size;
    393   }
    394 }
    395 
    396 unsigned RuntimeDyldImpl::emitSection(ObjectImage &Obj,
    397                                       const SectionRef &Section, bool IsCode) {
    398 
    399   StringRef data;
    400   uint64_t Alignment64;
    401   Check(Section.getContents(data));
    402   Check(Section.getAlignment(Alignment64));
    403 
    404   unsigned Alignment = (unsigned)Alignment64 & 0xffffffffL;
    405   bool IsRequired;
    406   bool IsVirtual;
    407   bool IsZeroInit;
    408   bool IsReadOnly;
    409   uint64_t DataSize;
    410   unsigned PaddingSize = 0;
    411   unsigned StubBufSize = 0;
    412   StringRef Name;
    413   Check(Section.isRequiredForExecution(IsRequired));
    414   Check(Section.isVirtual(IsVirtual));
    415   Check(Section.isZeroInit(IsZeroInit));
    416   Check(Section.isReadOnlyData(IsReadOnly));
    417   Check(Section.getSize(DataSize));
    418   Check(Section.getName(Name));
    419 
    420   StubBufSize = computeSectionStubBufSize(Obj, Section);
    421 
    422   // The .eh_frame section (at least on Linux) needs an extra four bytes padded
    423   // with zeroes added at the end.  For MachO objects, this section has a
    424   // slightly different name, so this won't have any effect for MachO objects.
    425   if (Name == ".eh_frame")
    426     PaddingSize = 4;
    427 
    428   uintptr_t Allocate;
    429   unsigned SectionID = Sections.size();
    430   uint8_t *Addr;
    431   const char *pData = nullptr;
    432 
    433   // Some sections, such as debug info, don't need to be loaded for execution.
    434   // Leave those where they are.
    435   if (IsRequired) {
    436     Allocate = DataSize + PaddingSize + StubBufSize;
    437     Addr = IsCode ? MemMgr->allocateCodeSection(Allocate, Alignment, SectionID,
    438                                                 Name)
    439                   : MemMgr->allocateDataSection(Allocate, Alignment, SectionID,
    440                                                 Name, IsReadOnly);
    441     if (!Addr)
    442       report_fatal_error("Unable to allocate section memory!");
    443 
    444     // Virtual sections have no data in the object image, so leave pData = 0
    445     if (!IsVirtual)
    446       pData = data.data();
    447 
    448     // Zero-initialize or copy the data from the image
    449     if (IsZeroInit || IsVirtual)
    450       memset(Addr, 0, DataSize);
    451     else
    452       memcpy(Addr, pData, DataSize);
    453 
    454     // Fill in any extra bytes we allocated for padding
    455     if (PaddingSize != 0) {
    456       memset(Addr + DataSize, 0, PaddingSize);
    457       // Update the DataSize variable so that the stub offset is set correctly.
    458       DataSize += PaddingSize;
    459     }
    460 
    461     DEBUG(dbgs() << "emitSection SectionID: " << SectionID << " Name: " << Name
    462                  << " obj addr: " << format("%p", pData)
    463                  << " new addr: " << format("%p", Addr)
    464                  << " DataSize: " << DataSize << " StubBufSize: " << StubBufSize
    465                  << " Allocate: " << Allocate << "\n");
    466     Obj.updateSectionAddress(Section, (uint64_t)Addr);
    467   } else {
    468     // Even if we didn't load the section, we need to record an entry for it
    469     // to handle later processing (and by 'handle' I mean don't do anything
    470     // with these sections).
    471     Allocate = 0;
    472     Addr = nullptr;
    473     DEBUG(dbgs() << "emitSection SectionID: " << SectionID << " Name: " << Name
    474                  << " obj addr: " << format("%p", data.data()) << " new addr: 0"
    475                  << " DataSize: " << DataSize << " StubBufSize: " << StubBufSize
    476                  << " Allocate: " << Allocate << "\n");
    477   }
    478 
    479   Sections.push_back(SectionEntry(Name, Addr, DataSize, (uintptr_t)pData));
    480   return SectionID;
    481 }
    482 
    483 unsigned RuntimeDyldImpl::findOrEmitSection(ObjectImage &Obj,
    484                                             const SectionRef &Section,
    485                                             bool IsCode,
    486                                             ObjSectionToIDMap &LocalSections) {
    487 
    488   unsigned SectionID = 0;
    489   ObjSectionToIDMap::iterator i = LocalSections.find(Section);
    490   if (i != LocalSections.end())
    491     SectionID = i->second;
    492   else {
    493     SectionID = emitSection(Obj, Section, IsCode);
    494     LocalSections[Section] = SectionID;
    495   }
    496   return SectionID;
    497 }
    498 
    499 void RuntimeDyldImpl::addRelocationForSection(const RelocationEntry &RE,
    500                                               unsigned SectionID) {
    501   Relocations[SectionID].push_back(RE);
    502 }
    503 
    504 void RuntimeDyldImpl::addRelocationForSymbol(const RelocationEntry &RE,
    505                                              StringRef SymbolName) {
    506   // Relocation by symbol.  If the symbol is found in the global symbol table,
    507   // create an appropriate section relocation.  Otherwise, add it to
    508   // ExternalSymbolRelocations.
    509   SymbolTableMap::const_iterator Loc = GlobalSymbolTable.find(SymbolName);
    510   if (Loc == GlobalSymbolTable.end()) {
    511     ExternalSymbolRelocations[SymbolName].push_back(RE);
    512   } else {
    513     // Copy the RE since we want to modify its addend.
    514     RelocationEntry RECopy = RE;
    515     RECopy.Addend += Loc->second.second;
    516     Relocations[Loc->second.first].push_back(RECopy);
    517   }
    518 }
    519 
    520 uint8_t *RuntimeDyldImpl::createStubFunction(uint8_t *Addr) {
    521   if (Arch == Triple::aarch64 || Arch == Triple::aarch64_be ||
    522       Arch == Triple::arm64 || Arch == Triple::arm64_be) {
    523     // This stub has to be able to access the full address space,
    524     // since symbol lookup won't necessarily find a handy, in-range,
    525     // PLT stub for functions which could be anywhere.
    526     uint32_t *StubAddr = (uint32_t *)Addr;
    527 
    528     // Stub can use ip0 (== x16) to calculate address
    529     *StubAddr = 0xd2e00010; // movz ip0, #:abs_g3:<addr>
    530     StubAddr++;
    531     *StubAddr = 0xf2c00010; // movk ip0, #:abs_g2_nc:<addr>
    532     StubAddr++;
    533     *StubAddr = 0xf2a00010; // movk ip0, #:abs_g1_nc:<addr>
    534     StubAddr++;
    535     *StubAddr = 0xf2800010; // movk ip0, #:abs_g0_nc:<addr>
    536     StubAddr++;
    537     *StubAddr = 0xd61f0200; // br ip0
    538 
    539     return Addr;
    540   } else if (Arch == Triple::arm || Arch == Triple::armeb) {
    541     // TODO: There is only ARM far stub now. We should add the Thumb stub,
    542     // and stubs for branches Thumb - ARM and ARM - Thumb.
    543     uint32_t *StubAddr = (uint32_t *)Addr;
    544     *StubAddr = 0xe51ff004; // ldr pc,<label>
    545     return (uint8_t *)++StubAddr;
    546   } else if (Arch == Triple::mipsel || Arch == Triple::mips) {
    547     uint32_t *StubAddr = (uint32_t *)Addr;
    548     // 0:   3c190000        lui     t9,%hi(addr).
    549     // 4:   27390000        addiu   t9,t9,%lo(addr).
    550     // 8:   03200008        jr      t9.
    551     // c:   00000000        nop.
    552     const unsigned LuiT9Instr = 0x3c190000, AdduiT9Instr = 0x27390000;
    553     const unsigned JrT9Instr = 0x03200008, NopInstr = 0x0;
    554 
    555     *StubAddr = LuiT9Instr;
    556     StubAddr++;
    557     *StubAddr = AdduiT9Instr;
    558     StubAddr++;
    559     *StubAddr = JrT9Instr;
    560     StubAddr++;
    561     *StubAddr = NopInstr;
    562     return Addr;
    563   } else if (Arch == Triple::ppc64 || Arch == Triple::ppc64le) {
    564     // PowerPC64 stub: the address points to a function descriptor
    565     // instead of the function itself. Load the function address
    566     // on r11 and sets it to control register. Also loads the function
    567     // TOC in r2 and environment pointer to r11.
    568     writeInt32BE(Addr,    0x3D800000); // lis   r12, highest(addr)
    569     writeInt32BE(Addr+4,  0x618C0000); // ori   r12, higher(addr)
    570     writeInt32BE(Addr+8,  0x798C07C6); // sldi  r12, r12, 32
    571     writeInt32BE(Addr+12, 0x658C0000); // oris  r12, r12, h(addr)
    572     writeInt32BE(Addr+16, 0x618C0000); // ori   r12, r12, l(addr)
    573     writeInt32BE(Addr+20, 0xF8410028); // std   r2,  40(r1)
    574     writeInt32BE(Addr+24, 0xE96C0000); // ld    r11, 0(r12)
    575     writeInt32BE(Addr+28, 0xE84C0008); // ld    r2,  0(r12)
    576     writeInt32BE(Addr+32, 0x7D6903A6); // mtctr r11
    577     writeInt32BE(Addr+36, 0xE96C0010); // ld    r11, 16(r2)
    578     writeInt32BE(Addr+40, 0x4E800420); // bctr
    579 
    580     return Addr;
    581   } else if (Arch == Triple::systemz) {
    582     writeInt16BE(Addr,    0xC418);     // lgrl %r1,.+8
    583     writeInt16BE(Addr+2,  0x0000);
    584     writeInt16BE(Addr+4,  0x0004);
    585     writeInt16BE(Addr+6,  0x07F1);     // brc 15,%r1
    586     // 8-byte address stored at Addr + 8
    587     return Addr;
    588   } else if (Arch == Triple::x86_64) {
    589     *Addr      = 0xFF; // jmp
    590     *(Addr+1)  = 0x25; // rip
    591     // 32-bit PC-relative address of the GOT entry will be stored at Addr+2
    592   } else if (Arch == Triple::x86) {
    593     *Addr      = 0xE9; // 32-bit pc-relative jump.
    594   }
    595   return Addr;
    596 }
    597 
    598 // Assign an address to a symbol name and resolve all the relocations
    599 // associated with it.
    600 void RuntimeDyldImpl::reassignSectionAddress(unsigned SectionID,
    601                                              uint64_t Addr) {
    602   // The address to use for relocation resolution is not
    603   // the address of the local section buffer. We must be doing
    604   // a remote execution environment of some sort. Relocations can't
    605   // be applied until all the sections have been moved.  The client must
    606   // trigger this with a call to MCJIT::finalize() or
    607   // RuntimeDyld::resolveRelocations().
    608   //
    609   // Addr is a uint64_t because we can't assume the pointer width
    610   // of the target is the same as that of the host. Just use a generic
    611   // "big enough" type.
    612   Sections[SectionID].LoadAddress = Addr;
    613 }
    614 
    615 void RuntimeDyldImpl::resolveRelocationList(const RelocationList &Relocs,
    616                                             uint64_t Value) {
    617   for (unsigned i = 0, e = Relocs.size(); i != e; ++i) {
    618     const RelocationEntry &RE = Relocs[i];
    619     // Ignore relocations for sections that were not loaded
    620     if (Sections[RE.SectionID].Address == nullptr)
    621       continue;
    622     resolveRelocation(RE, Value);
    623   }
    624 }
    625 
    626 void RuntimeDyldImpl::resolveExternalSymbols() {
    627   while (!ExternalSymbolRelocations.empty()) {
    628     StringMap<RelocationList>::iterator i = ExternalSymbolRelocations.begin();
    629 
    630     StringRef Name = i->first();
    631     if (Name.size() == 0) {
    632       // This is an absolute symbol, use an address of zero.
    633       DEBUG(dbgs() << "Resolving absolute relocations."
    634                    << "\n");
    635       RelocationList &Relocs = i->second;
    636       resolveRelocationList(Relocs, 0);
    637     } else {
    638       uint64_t Addr = 0;
    639       SymbolTableMap::const_iterator Loc = GlobalSymbolTable.find(Name);
    640       if (Loc == GlobalSymbolTable.end()) {
    641         // This is an external symbol, try to get its address from
    642         // MemoryManager.
    643         Addr = MemMgr->getSymbolAddress(Name.data());
    644         // The call to getSymbolAddress may have caused additional modules to
    645         // be loaded, which may have added new entries to the
    646         // ExternalSymbolRelocations map.  Consquently, we need to update our
    647         // iterator.  This is also why retrieval of the relocation list
    648         // associated with this symbol is deferred until below this point.
    649         // New entries may have been added to the relocation list.
    650         i = ExternalSymbolRelocations.find(Name);
    651       } else {
    652         // We found the symbol in our global table.  It was probably in a
    653         // Module that we loaded previously.
    654         SymbolLoc SymLoc = Loc->second;
    655         Addr = getSectionLoadAddress(SymLoc.first) + SymLoc.second;
    656       }
    657 
    658       // FIXME: Implement error handling that doesn't kill the host program!
    659       if (!Addr)
    660         report_fatal_error("Program used external function '" + Name +
    661                            "' which could not be resolved!");
    662 
    663       updateGOTEntries(Name, Addr);
    664       DEBUG(dbgs() << "Resolving relocations Name: " << Name << "\t"
    665                    << format("0x%lx", Addr) << "\n");
    666       // This list may have been updated when we called getSymbolAddress, so
    667       // don't change this code to get the list earlier.
    668       RelocationList &Relocs = i->second;
    669       resolveRelocationList(Relocs, Addr);
    670     }
    671 
    672     ExternalSymbolRelocations.erase(i);
    673   }
    674 }
    675 
    676 //===----------------------------------------------------------------------===//
    677 // RuntimeDyld class implementation
    678 RuntimeDyld::RuntimeDyld(RTDyldMemoryManager *mm) {
    679   // FIXME: There's a potential issue lurking here if a single instance of
    680   // RuntimeDyld is used to load multiple objects.  The current implementation
    681   // associates a single memory manager with a RuntimeDyld instance.  Even
    682   // though the public class spawns a new 'impl' instance for each load,
    683   // they share a single memory manager.  This can become a problem when page
    684   // permissions are applied.
    685   Dyld = nullptr;
    686   MM = mm;
    687   ProcessAllSections = false;
    688 }
    689 
    690 RuntimeDyld::~RuntimeDyld() { delete Dyld; }
    691 
    692 static std::unique_ptr<RuntimeDyldELF>
    693 createRuntimeDyldELF(RTDyldMemoryManager *MM, bool ProcessAllSections) {
    694   std::unique_ptr<RuntimeDyldELF> Dyld(new RuntimeDyldELF(MM));
    695   Dyld->setProcessAllSections(ProcessAllSections);
    696   return Dyld;
    697 }
    698 
    699 static std::unique_ptr<RuntimeDyldMachO>
    700 createRuntimeDyldMachO(RTDyldMemoryManager *MM, bool ProcessAllSections) {
    701   std::unique_ptr<RuntimeDyldMachO> Dyld(new RuntimeDyldMachO(MM));
    702   Dyld->setProcessAllSections(ProcessAllSections);
    703   return Dyld;
    704 }
    705 
    706 ObjectImage *RuntimeDyld::loadObject(std::unique_ptr<ObjectFile> InputObject) {
    707   std::unique_ptr<ObjectImage> InputImage;
    708 
    709   ObjectFile &Obj = *InputObject;
    710 
    711   if (InputObject->isELF()) {
    712     InputImage.reset(RuntimeDyldELF::createObjectImageFromFile(std::move(InputObject)));
    713     if (!Dyld)
    714       Dyld = createRuntimeDyldELF(MM, ProcessAllSections).release();
    715   } else if (InputObject->isMachO()) {
    716     InputImage.reset(RuntimeDyldMachO::createObjectImageFromFile(std::move(InputObject)));
    717     if (!Dyld)
    718       Dyld = createRuntimeDyldMachO(MM, ProcessAllSections).release();
    719   } else
    720     report_fatal_error("Incompatible object format!");
    721 
    722   if (!Dyld->isCompatibleFile(&Obj))
    723     report_fatal_error("Incompatible object format!");
    724 
    725   Dyld->loadObject(InputImage.get());
    726   return InputImage.release();
    727 }
    728 
    729 ObjectImage *RuntimeDyld::loadObject(ObjectBuffer *InputBuffer) {
    730   std::unique_ptr<ObjectImage> InputImage;
    731   sys::fs::file_magic Type = sys::fs::identify_magic(InputBuffer->getBuffer());
    732 
    733   switch (Type) {
    734   case sys::fs::file_magic::elf_relocatable:
    735   case sys::fs::file_magic::elf_executable:
    736   case sys::fs::file_magic::elf_shared_object:
    737   case sys::fs::file_magic::elf_core:
    738     InputImage.reset(RuntimeDyldELF::createObjectImage(InputBuffer));
    739     if (!Dyld)
    740       Dyld = createRuntimeDyldELF(MM, ProcessAllSections).release();
    741     break;
    742   case sys::fs::file_magic::macho_object:
    743   case sys::fs::file_magic::macho_executable:
    744   case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib:
    745   case sys::fs::file_magic::macho_core:
    746   case sys::fs::file_magic::macho_preload_executable:
    747   case sys::fs::file_magic::macho_dynamically_linked_shared_lib:
    748   case sys::fs::file_magic::macho_dynamic_linker:
    749   case sys::fs::file_magic::macho_bundle:
    750   case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub:
    751   case sys::fs::file_magic::macho_dsym_companion:
    752     InputImage.reset(RuntimeDyldMachO::createObjectImage(InputBuffer));
    753     if (!Dyld)
    754       Dyld = createRuntimeDyldMachO(MM, ProcessAllSections).release();
    755     break;
    756   case sys::fs::file_magic::unknown:
    757   case sys::fs::file_magic::bitcode:
    758   case sys::fs::file_magic::archive:
    759   case sys::fs::file_magic::coff_object:
    760   case sys::fs::file_magic::coff_import_library:
    761   case sys::fs::file_magic::pecoff_executable:
    762   case sys::fs::file_magic::macho_universal_binary:
    763   case sys::fs::file_magic::windows_resource:
    764     report_fatal_error("Incompatible object format!");
    765   }
    766 
    767   if (!Dyld->isCompatibleFormat(InputBuffer))
    768     report_fatal_error("Incompatible object format!");
    769 
    770   Dyld->loadObject(InputImage.get());
    771   return InputImage.release();
    772 }
    773 
    774 void *RuntimeDyld::getSymbolAddress(StringRef Name) {
    775   if (!Dyld)
    776     return nullptr;
    777   return Dyld->getSymbolAddress(Name);
    778 }
    779 
    780 uint64_t RuntimeDyld::getSymbolLoadAddress(StringRef Name) {
    781   if (!Dyld)
    782     return 0;
    783   return Dyld->getSymbolLoadAddress(Name);
    784 }
    785 
    786 void RuntimeDyld::resolveRelocations() { Dyld->resolveRelocations(); }
    787 
    788 void RuntimeDyld::reassignSectionAddress(unsigned SectionID, uint64_t Addr) {
    789   Dyld->reassignSectionAddress(SectionID, Addr);
    790 }
    791 
    792 void RuntimeDyld::mapSectionAddress(const void *LocalAddress,
    793                                     uint64_t TargetAddress) {
    794   Dyld->mapSectionAddress(LocalAddress, TargetAddress);
    795 }
    796 
    797 bool RuntimeDyld::hasError() { return Dyld->hasError(); }
    798 
    799 StringRef RuntimeDyld::getErrorString() { return Dyld->getErrorString(); }
    800 
    801 void RuntimeDyld::registerEHFrames() {
    802   if (Dyld)
    803     Dyld->registerEHFrames();
    804 }
    805 
    806 void RuntimeDyld::deregisterEHFrames() {
    807   if (Dyld)
    808     Dyld->deregisterEHFrames();
    809 }
    810 
    811 } // end namespace llvm
    812