RuntimeDyldELF.cpp revision 3f23cef24fc9200def464bd4bce820678b5715de
1e0934bee3a4f40731169bc42b15a39ce39978175Jim Grosbach//===-- RuntimeDyldELF.cpp - Run-time dynamic linker for MC-JIT -*- C++ -*-===//
2a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky//
3a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky//                     The LLVM Compiler Infrastructure
4a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky//
5a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky// This file is distributed under the University of Illinois Open Source
6a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky// License. See LICENSE.TXT for details.
7a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky//
8a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky//===----------------------------------------------------------------------===//
9a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky//
10a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky// Implementation of ELF support for the MC-JIT runtime dynamic linker.
11a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky//
12a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky//===----------------------------------------------------------------------===//
13a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
14a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#define DEBUG_TYPE "dyld"
153f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "RuntimeDyldELF.h"
163f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "JITRegistrar.h"
173f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "ObjectImageCommon.h"
18a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/OwningPtr.h"
19a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/StringRef.h"
20a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/STLExtras.h"
21a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/IntervalMap.h"
22a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/Object/ObjectFile.h"
233f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "llvm/ExecutionEngine/ObjectImage.h"
243f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor#include "llvm/ExecutionEngine/ObjectBuffer.h"
25a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/Support/ELF.h"
26a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/Triple.h"
27689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd#include "llvm/Object/ELF.h"
28a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskyusing namespace llvm;
29a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskyusing namespace llvm::object;
30a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
31689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdnamespace {
32689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
33689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits>
34689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdclass DyldELFObject : public ELFObjectFile<target_endianness, is64Bits> {
35689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits)
36689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
37689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  typedef Elf_Shdr_Impl<target_endianness, is64Bits> Elf_Shdr;
38689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  typedef Elf_Sym_Impl<target_endianness, is64Bits> Elf_Sym;
39689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  typedef Elf_Rel_Impl<target_endianness, is64Bits, false> Elf_Rel;
40689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  typedef Elf_Rel_Impl<target_endianness, is64Bits, true> Elf_Rela;
41689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
422c38a6615a693d0a43159825da2358126473502bMichael J. Spencer  typedef Elf_Ehdr_Impl<target_endianness, is64Bits> Elf_Ehdr;
43689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
44689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  typedef typename ELFDataTypeTypedefHelper<
45689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd          target_endianness, is64Bits>::value_type addr_type;
46689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
47689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdpublic:
483f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  DyldELFObject(MemoryBuffer *Wrapper, error_code &ec);
49689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
50689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  void updateSectionAddress(const SectionRef &Sec, uint64_t Addr);
51689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr);
52689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
532e319870f17a090e47540e2a821eac33c495bf59Andrew Kaylor  // Methods for type inquiry through isa, cast and dyn_cast
54689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  static inline bool classof(const Binary *v) {
55689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    return (isa<ELFObjectFile<target_endianness, is64Bits> >(v)
56689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd            && classof(cast<ELFObjectFile<target_endianness, is64Bits> >(v)));
57689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
58689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  static inline bool classof(
59689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      const ELFObjectFile<target_endianness, is64Bits> *v) {
60689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    return v->isDyldType();
61689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
62689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  static inline bool classof(const DyldELFObject *v) {
63689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    return true;
64689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
65689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd};
66689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
67689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits>
683f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylorclass ELFObjectImage : public ObjectImageCommon {
69689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  protected:
70689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    DyldELFObject<target_endianness, is64Bits> *DyldObj;
71689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    bool Registered;
72689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
73689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  public:
743f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor    ELFObjectImage(ObjectBuffer *Input,
753f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor                   DyldELFObject<target_endianness, is64Bits> *Obj)
763f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor    : ObjectImageCommon(Input, Obj),
77689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      DyldObj(Obj),
78689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      Registered(false) {}
79689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
80689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    virtual ~ELFObjectImage() {
81689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      if (Registered)
82689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd        deregisterWithDebugger();
83689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    }
84689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
85689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    // Subclasses can override these methods to update the image with loaded
86689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    // addresses for sections and common symbols
87689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    virtual void updateSectionAddress(const SectionRef &Sec, uint64_t Addr)
88689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    {
89689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      DyldObj->updateSectionAddress(Sec, Addr);
90689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    }
91689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
92689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    virtual void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr)
93689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    {
94689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      DyldObj->updateSymbolAddress(Sym, Addr);
95689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    }
96689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
97689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    virtual void registerWithDebugger()
98689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    {
993f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor      JITRegistrar::getGDBRegistrar().registerObject(*Buffer);
100689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      Registered = true;
101689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    }
102689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    virtual void deregisterWithDebugger()
103689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    {
1043f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor      JITRegistrar::getGDBRegistrar().deregisterObject(*Buffer);
105689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    }
106689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd};
107689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
1083f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor// The MemoryBuffer passed into this constructor is just a wrapper around the
1093f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor// actual memory.  Ultimately, the Binary parent class will take ownership of
1103f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor// this MemoryBuffer object but not the underlying memory.
111689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits>
1123f23cef24fc9200def464bd4bce820678b5715deAndrew KaylorDyldELFObject<target_endianness, is64Bits>::DyldELFObject(MemoryBuffer *Wrapper,
113689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                                          error_code &ec)
1143f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  : ELFObjectFile<target_endianness, is64Bits>(Wrapper, ec) {
115689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  this->isDyldELFObject = true;
116689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}
117689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
118689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits>
119689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdvoid DyldELFObject<target_endianness, is64Bits>::updateSectionAddress(
120689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                                       const SectionRef &Sec,
121689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                                       uint64_t Addr) {
122689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  DataRefImpl ShdrRef = Sec.getRawDataRefImpl();
123689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  Elf_Shdr *shdr = const_cast<Elf_Shdr*>(
124689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                          reinterpret_cast<const Elf_Shdr *>(ShdrRef.p));
125689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
126689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  // This assumes the address passed in matches the target address bitness
127689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  // The template-based type cast handles everything else.
128689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  shdr->sh_addr = static_cast<addr_type>(Addr);
129689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}
130689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
131689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits>
132689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdvoid DyldELFObject<target_endianness, is64Bits>::updateSymbolAddress(
133689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                                       const SymbolRef &SymRef,
134689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                                       uint64_t Addr) {
135689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
136689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  Elf_Sym *sym = const_cast<Elf_Sym*>(
137689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                 ELFObjectFile<target_endianness, is64Bits>::
138689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                   getSymbol(SymRef.getRawDataRefImpl()));
139689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
140689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  // This assumes the address passed in matches the target address bitness
141689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  // The template-based type cast handles everything else.
142689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  sym->st_value = static_cast<addr_type>(Addr);
143689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}
144689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
145689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} // namespace
146689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
147689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
148a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskynamespace llvm {
149a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
1503f23cef24fc9200def464bd4bce820678b5715deAndrew KaylorObjectImage *RuntimeDyldELF::createObjectImage(ObjectBuffer *Buffer) {
1513f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  if (Buffer->getBufferSize() < ELF::EI_NIDENT)
1523f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor    llvm_unreachable("Unexpected ELF object size");
1533f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  std::pair<unsigned char, unsigned char> Ident = std::make_pair(
1543f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor                         (uint8_t)Buffer->getBufferStart()[ELF::EI_CLASS],
1553f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor                         (uint8_t)Buffer->getBufferStart()[ELF::EI_DATA]);
156689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  error_code ec;
157689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
158689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2LSB) {
159689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    DyldELFObject<support::little, false> *Obj =
1603f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor           new DyldELFObject<support::little, false>(Buffer->getMemBuffer(), ec);
1613f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor    return new ELFObjectImage<support::little, false>(Buffer, Obj);
162689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
163689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB) {
164689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    DyldELFObject<support::big, false> *Obj =
1653f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor           new DyldELFObject<support::big, false>(Buffer->getMemBuffer(), ec);
1663f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor    return new ELFObjectImage<support::big, false>(Buffer, Obj);
167689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
168689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB) {
169689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    DyldELFObject<support::big, true> *Obj =
1703f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor           new DyldELFObject<support::big, true>(Buffer->getMemBuffer(), ec);
1713f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor    return new ELFObjectImage<support::big, true>(Buffer, Obj);
172689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
173689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) {
174689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    DyldELFObject<support::little, true> *Obj =
1753f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor           new DyldELFObject<support::little, true>(Buffer->getMemBuffer(), ec);
1763f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor    return new ELFObjectImage<support::little, true>(Buffer, Obj);
177689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
178689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  else
179689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    llvm_unreachable("Unexpected ELF format");
180689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}
181689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
182689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston GurdRuntimeDyldELF::~RuntimeDyldELF() {
183689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}
184a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
1850e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveX86_64Relocation(uint8_t *LocalAddress,
1860e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                             uint64_t FinalAddress,
1870e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                             uint64_t Value,
1880e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                             uint32_t Type,
1890e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                             int64_t Addend) {
1900e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  switch (Type) {
1910e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  default:
1920e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    llvm_unreachable("Relocation type not implemented yet!");
1930e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  break;
194a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case ELF::R_X86_64_64: {
1950e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint64_t *Target = (uint64_t*)(LocalAddress);
1960e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *Target = Value + Addend;
197a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
198a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
199a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case ELF::R_X86_64_32:
200a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case ELF::R_X86_64_32S: {
2010e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    Value += Addend;
202d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor    assert((Type == ELF::R_X86_64_32 && (Value <= UINT32_MAX)) ||
203d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor           (Type == ELF::R_X86_64_32S &&
204d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor             ((int64_t)Value <= INT32_MAX && (int64_t)Value >= INT32_MIN)));
205a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    uint32_t TruncatedAddr = (Value & 0xFFFFFFFF);
2060e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint32_t *Target = reinterpret_cast<uint32_t*>(LocalAddress);
207a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    *Target = TruncatedAddr;
208a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
209a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
210a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case ELF::R_X86_64_PC32: {
2110e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint32_t *Placeholder = reinterpret_cast<uint32_t*>(LocalAddress);
2120e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    int64_t RealOffset = *Placeholder + Value + Addend - FinalAddress;
213d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor    assert(RealOffset <= INT32_MAX && RealOffset >= INT32_MIN);
2140e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    int32_t TruncOffset = (RealOffset & 0xFFFFFFFF);
215a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    *Placeholder = TruncOffset;
216a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
217a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
218a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
219a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky}
220a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
2210e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveX86Relocation(uint8_t *LocalAddress,
2220e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          uint32_t FinalAddress,
2230e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          uint32_t Value,
2240e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          uint32_t Type,
2250e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          int32_t Addend) {
2260e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  switch (Type) {
227a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case ELF::R_386_32: {
2280e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint32_t *Target = (uint32_t*)(LocalAddress);
229c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd    uint32_t Placeholder = *Target;
230c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd    *Target = Placeholder + Value + Addend;
231a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
232a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
233a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case ELF::R_386_PC32: {
2340e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint32_t *Placeholder = reinterpret_cast<uint32_t*>(LocalAddress);
2350e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint32_t RealOffset = *Placeholder + Value + Addend - FinalAddress;
236a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    *Placeholder = RealOffset;
237a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
238a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    }
239a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    default:
240a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky      // There are other relocation types, but it appears these are the
241e2e73bd044eca405076a127e87d68d91f0fcb4b9Andrew Kaylor      // only ones currently used by the LLVM ELF object writer
242858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper      llvm_unreachable("Relocation type not implemented yet!");
2430e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      break;
244a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
245a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky}
246a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
2470e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveARMRelocation(uint8_t *LocalAddress,
2480e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          uint32_t FinalAddress,
2490e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          uint32_t Value,
2500e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          uint32_t Type,
2510e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          int32_t Addend) {
2520e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // TODO: Add Thumb relocations.
2530e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  uint32_t* TargetPtr = (uint32_t*)LocalAddress;
2540e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  Value += Addend;
2550e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
2560e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  DEBUG(dbgs() << "resolveARMRelocation, LocalAddress: " << LocalAddress
2570e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " FinalAddress: " << format("%p",FinalAddress)
2580e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " Value: " << format("%x",Value)
2590e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " Type: " << format("%x",Type)
2600e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " Addend: " << format("%x",Addend)
2610e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << "\n");
2620e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
2630e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  switch(Type) {
2640e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  default:
2650e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    llvm_unreachable("Not implemented relocation type!");
2660e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
2670e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // Just write 32bit value to relocation address
2680e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case ELF::R_ARM_ABS32 :
2690e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr = Value;
2700e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    break;
2710e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
2720e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // Write first 16 bit of 32 bit value to the mov instruction.
2730e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // Last 4 bit should be shifted.
2740e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case ELF::R_ARM_MOVW_ABS_NC :
2750e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    Value = Value & 0xFFFF;
2760e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr |= Value & 0xFFF;
2770e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr |= ((Value >> 12) & 0xF) << 16;
2780e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    break;
2790e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
2800e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // Write last 16 bit of 32 bit value to the mov instruction.
2810e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // Last 4 bit should be shifted.
2820e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case ELF::R_ARM_MOVT_ABS :
2830e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    Value = (Value >> 16) & 0xFFFF;
2840e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr |= Value & 0xFFF;
2850e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr |= ((Value >> 12) & 0xF) << 16;
2860e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    break;
2870e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
2880e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // Write 24 bit relative value to the branch instruction.
2890e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case ELF::R_ARM_PC24 :    // Fall through.
2900e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case ELF::R_ARM_CALL :    // Fall through.
2910e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case ELF::R_ARM_JUMP24 :
2920e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    int32_t RelValue = static_cast<int32_t>(Value - FinalAddress - 8);
2930e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    RelValue = (RelValue & 0x03FFFFFC) >> 2;
2940e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr &= 0xFF000000;
2950e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr |= RelValue;
2960e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    break;
2970e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  }
298a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky}
299a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
300b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanakavoid RuntimeDyldELF::resolveMIPSRelocation(uint8_t *LocalAddress,
301b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka                                           uint32_t FinalAddress,
302b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka                                           uint32_t Value,
303b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka                                           uint32_t Type,
304b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka                                           int32_t Addend) {
305b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  uint32_t* TargetPtr = (uint32_t*)LocalAddress;
306b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  Value += Addend;
307b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
308b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  DEBUG(dbgs() << "resolveMipselocation, LocalAddress: " << LocalAddress
309b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka               << " FinalAddress: " << format("%p",FinalAddress)
310b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka               << " Value: " << format("%x",Value)
311b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka               << " Type: " << format("%x",Type)
312b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka               << " Addend: " << format("%x",Addend)
313b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka               << "\n");
314b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
315b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  switch(Type) {
316b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  default:
317b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    llvm_unreachable("Not implemented relocation type!");
318b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    break;
319b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  case ELF::R_MIPS_32:
320b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    *TargetPtr = Value + (*TargetPtr);
321b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    break;
322b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  case ELF::R_MIPS_26:
323b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    *TargetPtr = ((*TargetPtr) & 0xfc000000) | (( Value & 0x0fffffff) >> 2);
324b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    break;
325b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  case ELF::R_MIPS_HI16:
326b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    // Get the higher 16-bits. Also add 1 if bit 15 is 1.
327b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    Value += ((*TargetPtr) & 0x0000ffff) << 16;
328b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    *TargetPtr = ((*TargetPtr) & 0xffff0000) |
329b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                 (((Value + 0x8000) >> 16) & 0xffff);
330b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    break;
331b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka   case ELF::R_MIPS_LO16:
332b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    Value += ((*TargetPtr) & 0x0000ffff);
333b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    *TargetPtr = ((*TargetPtr) & 0xffff0000) | (Value & 0xffff);
334b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    break;
335b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka   }
336b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka}
337b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
3380e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveRelocation(uint8_t *LocalAddress,
3390e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                       uint64_t FinalAddress,
3400e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                       uint64_t Value,
3410e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                       uint32_t Type,
3420e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                       int64_t Addend) {
343a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  switch (Arch) {
344a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case Triple::x86_64:
3450e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    resolveX86_64Relocation(LocalAddress, FinalAddress, Value, Type, Addend);
346a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
347a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case Triple::x86:
3480e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    resolveX86Relocation(LocalAddress, (uint32_t)(FinalAddress & 0xffffffffL),
3490e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                         (uint32_t)(Value & 0xffffffffL), Type,
3500e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                         (uint32_t)(Addend & 0xffffffffL));
351a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
3520e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case Triple::arm:    // Fall through.
3530e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case Triple::thumb:
3540e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    resolveARMRelocation(LocalAddress, (uint32_t)(FinalAddress & 0xffffffffL),
3550e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                         (uint32_t)(Value & 0xffffffffL), Type,
3560e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                         (uint32_t)(Addend & 0xffffffffL));
357a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
358b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  case Triple::mips:    // Fall through.
359b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  case Triple::mipsel:
360b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    resolveMIPSRelocation(LocalAddress, (uint32_t)(FinalAddress & 0xffffffffL),
361b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka                          (uint32_t)(Value & 0xffffffffL), Type,
362b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka                          (uint32_t)(Addend & 0xffffffffL));
363b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    break;
364858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper  default: llvm_unreachable("Unsupported CPU type!");
365a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
366a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky}
367a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
3680e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::processRelocationRef(const ObjRelocationInfo &Rel,
369689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                          ObjectImage &Obj,
3700e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          ObjSectionToIDMap &ObjSectionToID,
371d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky                                          const SymbolTableMap &Symbols,
3720e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          StubMap &Stubs) {
3730e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
3740e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  uint32_t RelType = (uint32_t)(Rel.Type & 0xffffffffL);
3750e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  intptr_t Addend = (intptr_t)Rel.AdditionalInfo;
3760e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  const SymbolRef &Symbol = Rel.Symbol;
377c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky
378c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky  // Obtain the symbol name which is referenced in the relocation
379c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky  StringRef TargetName;
3800e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  Symbol.getName(TargetName);
3810e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  DEBUG(dbgs() << "\t\tRelType: " << RelType
3820e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " Addend: " << Addend
3830e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " TargetName: " << TargetName
3840e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << "\n");
385c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky  RelocationValueRef Value;
386c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky  // First search for the symbol in the local symbol table
387d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky  SymbolTableMap::const_iterator lsi = Symbols.find(TargetName.data());
3880e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  if (lsi != Symbols.end()) {
3890e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    Value.SectionID = lsi->second.first;
3900e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    Value.Addend = lsi->second.second;
3910e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  } else {
392c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky    // Search for the symbol in the global symbol table
393d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky    SymbolTableMap::const_iterator gsi =
394d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky        GlobalSymbolTable.find(TargetName.data());
395d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky    if (gsi != GlobalSymbolTable.end()) {
3960e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      Value.SectionID = gsi->second.first;
3970e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      Value.Addend = gsi->second.second;
3980e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    } else {
3990e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      SymbolRef::Type SymType;
4000e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      Symbol.getType(SymType);
4010e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      switch (SymType) {
4020e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev        case SymbolRef::ST_Debug: {
4030e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          // TODO: Now ELF SymbolRef::ST_Debug = STT_SECTION, it's not obviously
4040e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          // and can be changed by another developers. Maybe best way is add
4050e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          // a new symbol type ST_Section to SymbolRef and use it.
406c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky          section_iterator si(Obj.end_sections());
4070e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          Symbol.getSection(si);
4080e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          if (si == Obj.end_sections())
4090e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev            llvm_unreachable("Symbol section not found, bad object file format!");
4100e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          DEBUG(dbgs() << "\t\tThis is section symbol\n");
411689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd          Value.SectionID = findOrEmitSection(Obj, (*si), true, ObjSectionToID);
4120e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          Value.Addend = Addend;
4130e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          break;
4140e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev        }
4150e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev        case SymbolRef::ST_Unknown: {
4160e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          Value.SymbolName = TargetName.data();
4170e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          Value.Addend = Addend;
4180e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          break;
4190e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev        }
4200e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev        default:
4210e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          llvm_unreachable("Unresolved symbol type!");
4220e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          break;
4230e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      }
4240e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    }
425a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
4260e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  DEBUG(dbgs() << "\t\tRel.SectionID: " << Rel.SectionID
4270e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " Rel.Offset: " << Rel.Offset
4280e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << "\n");
4290e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  if (Arch == Triple::arm &&
4300e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      (RelType == ELF::R_ARM_PC24 ||
4310e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev       RelType == ELF::R_ARM_CALL ||
4320e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev       RelType == ELF::R_ARM_JUMP24)) {
4330e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    // This is an ARM branch relocation, need to use a stub function.
4340e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    DEBUG(dbgs() << "\t\tThis is an ARM branch relocation.");
4350e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    SectionEntry &Section = Sections[Rel.SectionID];
4360e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint8_t *Target = Section.Address + Rel.Offset;
4370e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
4380e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    //  Look up for existing stub.
4390e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    StubMap::const_iterator i = Stubs.find(Value);
4400e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    if (i != Stubs.end()) {
441ab427334f54fed51ed721672a6d0fd1ca0802dd4Danil Malyshev      resolveRelocation(Target, (uint64_t)Target, (uint64_t)Section.Address +
4420e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                        i->second, RelType, 0);
4430e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      DEBUG(dbgs() << " Stub function found\n");
4440e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    } else {
4450e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      // Create a new stub function.
4460e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      DEBUG(dbgs() << " Create a new stub function\n");
4470e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      Stubs[Value] = Section.StubOffset;
4480e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      uint8_t *StubTargetAddr = createStubFunction(Section.Address +
4490e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                                   Section.StubOffset);
450c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky      RelocationEntry RE(Rel.SectionID, StubTargetAddr - Section.Address,
451c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky                         ELF::R_ARM_ABS32, Value.Addend);
452c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky      if (Value.SymbolName)
453c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky        addRelocationForSymbol(RE, Value.SymbolName);
454c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky      else
455c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky        addRelocationForSection(RE, Value.SectionID);
456c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky
457ab427334f54fed51ed721672a6d0fd1ca0802dd4Danil Malyshev      resolveRelocation(Target, (uint64_t)Target, (uint64_t)Section.Address +
4580e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                        Section.StubOffset, RelType, 0);
4590e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      Section.StubOffset += getMaxStubSize();
4600e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    }
461b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  } else if (Arch == Triple::mipsel && RelType == ELF::R_MIPS_26) {
462b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    // This is an Mips branch relocation, need to use a stub function.
463b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    DEBUG(dbgs() << "\t\tThis is a Mips branch relocation.");
464b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    SectionEntry &Section = Sections[Rel.SectionID];
465b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    uint8_t *Target = Section.Address + Rel.Offset;
466b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    uint32_t *TargetAddress = (uint32_t *)Target;
467b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
468b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    // Extract the addend from the instruction.
469b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    uint32_t Addend = ((*TargetAddress) & 0x03ffffff) << 2;
470b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
471b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    Value.Addend += Addend;
472b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
473b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    //  Look up for existing stub.
474b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    StubMap::const_iterator i = Stubs.find(Value);
475b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    if (i != Stubs.end()) {
476b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      resolveRelocation(Target, (uint64_t)Target,
477b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                        (uint64_t)Section.Address +
478b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                        i->second, RelType, 0);
479b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      DEBUG(dbgs() << " Stub function found\n");
480b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    } else {
481b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      // Create a new stub function.
482b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      DEBUG(dbgs() << " Create a new stub function\n");
483b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      Stubs[Value] = Section.StubOffset;
484b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      uint8_t *StubTargetAddr = createStubFunction(Section.Address +
485b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                                                   Section.StubOffset);
486b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
487b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      // Creating Hi and Lo relocations for the filled stub instructions.
488b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      RelocationEntry REHi(Rel.SectionID,
489b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                           StubTargetAddr - Section.Address,
490b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                           ELF::R_MIPS_HI16, Value.Addend);
491b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      RelocationEntry RELo(Rel.SectionID,
492b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                           StubTargetAddr - Section.Address + 4,
493b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                           ELF::R_MIPS_LO16, Value.Addend);
494b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
495b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      if (Value.SymbolName) {
496b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka        addRelocationForSymbol(REHi, Value.SymbolName);
497b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka        addRelocationForSymbol(RELo, Value.SymbolName);
498b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      } else {
499b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka        addRelocationForSection(REHi, Value.SectionID);
500b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka        addRelocationForSection(RELo, Value.SectionID);
501b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      }
502b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
503b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      resolveRelocation(Target, (uint64_t)Target,
504b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                        (uint64_t)Section.Address +
505b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                        Section.StubOffset, RelType, 0);
506b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      Section.StubOffset += getMaxStubSize();
507b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    }
508c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky  } else {
509c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky    RelocationEntry RE(Rel.SectionID, Rel.Offset, RelType, Value.Addend);
510c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky    if (Value.SymbolName)
511c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky      addRelocationForSymbol(RE, Value.SymbolName);
512c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky    else
513c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky      addRelocationForSection(RE, Value.SectionID);
514c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky  }
51561425c0a7f4e3608a85f7bbf254cd052a15b7446Jim Grosbach}
51661425c0a7f4e3608a85f7bbf254cd052a15b7446Jim Grosbach
5173f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylorbool RuntimeDyldELF::isCompatibleFormat(const ObjectBuffer *Buffer) const {
5183f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  if (Buffer->getBufferSize() < strlen(ELF::ElfMagic))
5193f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor    return false;
5203f23cef24fc9200def464bd4bce820678b5715deAndrew Kaylor  return (memcmp(Buffer->getBufferStart(), ELF::ElfMagic, strlen(ELF::ElfMagic))) == 0;
521a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky}
522a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} // namespace llvm
523