RuntimeDyld.cpp revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
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
24using namespace llvm;
25using namespace llvm::object;
26
27#define DEBUG_TYPE "dyld"
28
29// Empty out-of-line virtual destructor as the key function.
30RuntimeDyldImpl::~RuntimeDyldImpl() {}
31
32// Pin the JITRegistrar's and ObjectImage*'s vtables to this file.
33void JITRegistrar::anchor() {}
34void ObjectImage::anchor() {}
35void ObjectImageCommon::anchor() {}
36
37namespace llvm {
38
39void RuntimeDyldImpl::registerEHFrames() {}
40
41void RuntimeDyldImpl::deregisterEHFrames() {}
42
43// Resolve the relocations for all symbols we currently know about.
44void 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
64void 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
76static error_code getOffset(const SymbolRef &Sym, uint64_t &Result) {
77  uint64_t Address;
78  if (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 (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 (error_code EC = SecI->getAddress(SectionAddress))
98    return EC;
99
100  Result = Address - SectionAddress;
101  return object_error::success;
102}
103
104ObjectImage *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
218static uint64_t
219computeAllocationSizeForSections(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
232void 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
320unsigned 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
357void 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
396unsigned 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
483unsigned 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
499void RuntimeDyldImpl::addRelocationForSection(const RelocationEntry &RE,
500                                              unsigned SectionID) {
501  Relocations[SectionID].push_back(RE);
502}
503
504void 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
520uint8_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.
600void 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
615void 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
626void 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
678RuntimeDyld::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
690RuntimeDyld::~RuntimeDyld() { delete Dyld; }
691
692static std::unique_ptr<RuntimeDyldELF>
693createRuntimeDyldELF(RTDyldMemoryManager *MM, bool ProcessAllSections) {
694  std::unique_ptr<RuntimeDyldELF> Dyld(new RuntimeDyldELF(MM));
695  Dyld->setProcessAllSections(ProcessAllSections);
696  return Dyld;
697}
698
699static std::unique_ptr<RuntimeDyldMachO>
700createRuntimeDyldMachO(RTDyldMemoryManager *MM, bool ProcessAllSections) {
701  std::unique_ptr<RuntimeDyldMachO> Dyld(new RuntimeDyldMachO(MM));
702  Dyld->setProcessAllSections(ProcessAllSections);
703  return Dyld;
704}
705
706ObjectImage *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
729ObjectImage *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
774void *RuntimeDyld::getSymbolAddress(StringRef Name) {
775  if (!Dyld)
776    return nullptr;
777  return Dyld->getSymbolAddress(Name);
778}
779
780uint64_t RuntimeDyld::getSymbolLoadAddress(StringRef Name) {
781  if (!Dyld)
782    return 0;
783  return Dyld->getSymbolLoadAddress(Name);
784}
785
786void RuntimeDyld::resolveRelocations() { Dyld->resolveRelocations(); }
787
788void RuntimeDyld::reassignSectionAddress(unsigned SectionID, uint64_t Addr) {
789  Dyld->reassignSectionAddress(SectionID, Addr);
790}
791
792void RuntimeDyld::mapSectionAddress(const void *LocalAddress,
793                                    uint64_t TargetAddress) {
794  Dyld->mapSectionAddress(LocalAddress, TargetAddress);
795}
796
797bool RuntimeDyld::hasError() { return Dyld->hasError(); }
798
799StringRef RuntimeDyld::getErrorString() { return Dyld->getErrorString(); }
800
801void RuntimeDyld::registerEHFrames() {
802  if (Dyld)
803    Dyld->registerEHFrames();
804}
805
806void RuntimeDyld::deregisterEHFrames() {
807  if (Dyld)
808    Dyld->deregisterEHFrames();
809}
810
811} // end namespace llvm
812