RuntimeDyldELF.cpp revision b862f094b78e3176813903f63c0e78b6e0e7852b
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"
15a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/OwningPtr.h"
16a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/StringRef.h"
17a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/STLExtras.h"
18a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/IntervalMap.h"
1976463fdeb603e1d89b05f094bfd6fe73b90d0b61Eli Bendersky#include "RuntimeDyldELF.h"
20a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/Object/ObjectFile.h"
21a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/Support/ELF.h"
22a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky#include "llvm/ADT/Triple.h"
23689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd#include "llvm/Object/ELF.h"
24689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd#include "JITRegistrar.h"
25a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskyusing namespace llvm;
26a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskyusing namespace llvm::object;
27a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
28689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdnamespace {
29689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
30689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits>
31689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdclass DyldELFObject : public ELFObjectFile<target_endianness, is64Bits> {
32689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  LLVM_ELF_IMPORT_TYPES(target_endianness, is64Bits)
33689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
34689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  typedef Elf_Shdr_Impl<target_endianness, is64Bits> Elf_Shdr;
35689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  typedef Elf_Sym_Impl<target_endianness, is64Bits> Elf_Sym;
36689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  typedef Elf_Rel_Impl<target_endianness, is64Bits, false> Elf_Rel;
37689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  typedef Elf_Rel_Impl<target_endianness, is64Bits, true> Elf_Rela;
38689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
39689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  typedef typename ELFObjectFile<target_endianness, is64Bits>::
40689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    Elf_Ehdr Elf_Ehdr;
41689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
42689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  typedef typename ELFDataTypeTypedefHelper<
43689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd          target_endianness, is64Bits>::value_type addr_type;
44689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
45689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdprotected:
46689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  // This duplicates the 'Data' member in the 'Binary' base class
47689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  // but it is necessary to workaround a bug in gcc 4.2
48689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  MemoryBuffer *InputData;
49689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
50689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdpublic:
51689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  DyldELFObject(MemoryBuffer *Object, error_code &ec);
52689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
53689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  void updateSectionAddress(const SectionRef &Sec, uint64_t Addr);
54689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr);
55689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
56689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  const MemoryBuffer& getBuffer() const { return *InputData; }
57689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
582e319870f17a090e47540e2a821eac33c495bf59Andrew Kaylor  // Methods for type inquiry through isa, cast and dyn_cast
59689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  static inline bool classof(const Binary *v) {
60689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    return (isa<ELFObjectFile<target_endianness, is64Bits> >(v)
61689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd            && classof(cast<ELFObjectFile<target_endianness, is64Bits> >(v)));
62689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
63689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  static inline bool classof(
64689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      const ELFObjectFile<target_endianness, is64Bits> *v) {
65689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    return v->isDyldType();
66689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
67689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  static inline bool classof(const DyldELFObject *v) {
68689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    return true;
69689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
70689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd};
71689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
72689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits>
73689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdclass ELFObjectImage : public ObjectImage {
74689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  protected:
75689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    DyldELFObject<target_endianness, is64Bits> *DyldObj;
76689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    bool Registered;
77689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
78689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  public:
79689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    ELFObjectImage(DyldELFObject<target_endianness, is64Bits> *Obj)
80689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    : ObjectImage(Obj),
81689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      DyldObj(Obj),
82689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      Registered(false) {}
83689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
84689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    virtual ~ELFObjectImage() {
85689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      if (Registered)
86689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd        deregisterWithDebugger();
87689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    }
88689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
89689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    // Subclasses can override these methods to update the image with loaded
90689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    // addresses for sections and common symbols
91689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    virtual void updateSectionAddress(const SectionRef &Sec, uint64_t Addr)
92689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    {
93689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      DyldObj->updateSectionAddress(Sec, Addr);
94689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    }
95689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
96689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    virtual void updateSymbolAddress(const SymbolRef &Sym, uint64_t Addr)
97689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    {
98689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      DyldObj->updateSymbolAddress(Sym, Addr);
99689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    }
100689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
101689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    virtual void registerWithDebugger()
102689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    {
103689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      JITRegistrar::getGDBRegistrar().registerObject(DyldObj->getBuffer());
104689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      Registered = true;
105689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    }
106689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    virtual void deregisterWithDebugger()
107689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    {
108689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd      JITRegistrar::getGDBRegistrar().deregisterObject(DyldObj->getBuffer());
109689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    }
110689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd};
111689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
112689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits>
113689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston GurdDyldELFObject<target_endianness, is64Bits>::DyldELFObject(MemoryBuffer *Object,
114689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                                          error_code &ec)
115689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  : ELFObjectFile<target_endianness, is64Bits>(Object, ec),
116689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    InputData(Object) {
117689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  this->isDyldELFObject = true;
118689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}
119689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
120689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits>
121689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdvoid DyldELFObject<target_endianness, is64Bits>::updateSectionAddress(
122689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                                       const SectionRef &Sec,
123689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                                       uint64_t Addr) {
124689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  DataRefImpl ShdrRef = Sec.getRawDataRefImpl();
125689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  Elf_Shdr *shdr = const_cast<Elf_Shdr*>(
126689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                          reinterpret_cast<const Elf_Shdr *>(ShdrRef.p));
127689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
128689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  // This assumes the address passed in matches the target address bitness
129689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  // The template-based type cast handles everything else.
130689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  shdr->sh_addr = static_cast<addr_type>(Addr);
131689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}
132689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
133689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdtemplate<support::endianness target_endianness, bool is64Bits>
134689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdvoid DyldELFObject<target_endianness, is64Bits>::updateSymbolAddress(
135689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                                       const SymbolRef &SymRef,
136689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                                       uint64_t Addr) {
137689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
138689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  Elf_Sym *sym = const_cast<Elf_Sym*>(
139689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                 ELFObjectFile<target_endianness, is64Bits>::
140689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                   getSymbol(SymRef.getRawDataRefImpl()));
141689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
142689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  // This assumes the address passed in matches the target address bitness
143689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  // The template-based type cast handles everything else.
144689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  sym->st_value = static_cast<addr_type>(Addr);
145689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}
146689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
147689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd} // namespace
148689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
149689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
150a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskynamespace llvm {
151a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
152689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston GurdObjectImage *RuntimeDyldELF::createObjectImage(
153689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                         const MemoryBuffer *ConstInputBuffer) {
154689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  MemoryBuffer *InputBuffer = const_cast<MemoryBuffer*>(ConstInputBuffer);
155689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  std::pair<unsigned char, unsigned char> Ident = getElfArchType(InputBuffer);
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 =
160689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd           new DyldELFObject<support::little, false>(InputBuffer, ec);
161689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    return new ELFObjectImage<support::little, false>(Obj);
162689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
163689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  else if (Ident.first == ELF::ELFCLASS32 && Ident.second == ELF::ELFDATA2MSB) {
164689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    DyldELFObject<support::big, false> *Obj =
165689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd           new DyldELFObject<support::big, false>(InputBuffer, ec);
166689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    return new ELFObjectImage<support::big, false>(Obj);
167689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
168689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2MSB) {
169689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    DyldELFObject<support::big, true> *Obj =
170689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd           new DyldELFObject<support::big, true>(InputBuffer, ec);
171689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    return new ELFObjectImage<support::big, true>(Obj);
172689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
173689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  else if (Ident.first == ELF::ELFCLASS64 && Ident.second == ELF::ELFDATA2LSB) {
174689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    DyldELFObject<support::little, true> *Obj =
175689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd           new DyldELFObject<support::little, true>(InputBuffer, ec);
176689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    return new ELFObjectImage<support::little, true>(Obj);
177689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  }
178689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  else
179689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    llvm_unreachable("Unexpected ELF format");
180689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}
181689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
182689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurdvoid RuntimeDyldELF::handleObjectLoaded(ObjectImage *Obj)
183689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd{
184689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  Obj->registerWithDebugger();
185689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  // Save the loaded object.  It will deregister itself when deleted
186689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  LoadedObject = Obj;
187689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}
188689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd
189689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston GurdRuntimeDyldELF::~RuntimeDyldELF() {
190689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd  if (LoadedObject)
191689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd    delete LoadedObject;
192689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd}
193a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
1940e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveX86_64Relocation(uint8_t *LocalAddress,
1950e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                             uint64_t FinalAddress,
1960e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                             uint64_t Value,
1970e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                             uint32_t Type,
1980e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                             int64_t Addend) {
1990e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  switch (Type) {
2000e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  default:
2010e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    llvm_unreachable("Relocation type not implemented yet!");
2020e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  break;
203a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case ELF::R_X86_64_64: {
2040e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint64_t *Target = (uint64_t*)(LocalAddress);
2050e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *Target = Value + Addend;
206a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
207a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
208a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case ELF::R_X86_64_32:
209a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case ELF::R_X86_64_32S: {
2100e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    Value += Addend;
211d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor    assert((Type == ELF::R_X86_64_32 && (Value <= UINT32_MAX)) ||
212d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor           (Type == ELF::R_X86_64_32S &&
213d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor             ((int64_t)Value <= INT32_MAX && (int64_t)Value >= INT32_MIN)));
214a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    uint32_t TruncatedAddr = (Value & 0xFFFFFFFF);
2150e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint32_t *Target = reinterpret_cast<uint32_t*>(LocalAddress);
216a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    *Target = TruncatedAddr;
217a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
218a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
219a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case ELF::R_X86_64_PC32: {
2200e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint32_t *Placeholder = reinterpret_cast<uint32_t*>(LocalAddress);
2210e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    int64_t RealOffset = *Placeholder + Value + Addend - FinalAddress;
222d83a547d671a424294df2103c71801127e55db0fAndrew Kaylor    assert(RealOffset <= INT32_MAX && RealOffset >= INT32_MIN);
2230e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    int32_t TruncOffset = (RealOffset & 0xFFFFFFFF);
224a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    *Placeholder = TruncOffset;
225a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
226a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
227a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
228a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky}
229a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
2300e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveX86Relocation(uint8_t *LocalAddress,
2310e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          uint32_t FinalAddress,
2320e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          uint32_t Value,
2330e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          uint32_t Type,
2340e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          int32_t Addend) {
2350e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  switch (Type) {
236a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case ELF::R_386_32: {
2370e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint32_t *Target = (uint32_t*)(LocalAddress);
238c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd    uint32_t Placeholder = *Target;
239c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd    *Target = Placeholder + Value + Addend;
240a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
241a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
242a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case ELF::R_386_PC32: {
2430e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint32_t *Placeholder = reinterpret_cast<uint32_t*>(LocalAddress);
2440e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint32_t RealOffset = *Placeholder + Value + Addend - FinalAddress;
245a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    *Placeholder = RealOffset;
246a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
247a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    }
248a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    default:
249a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky      // There are other relocation types, but it appears these are the
250e2e73bd044eca405076a127e87d68d91f0fcb4b9Andrew Kaylor      // only ones currently used by the LLVM ELF object writer
251858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper      llvm_unreachable("Relocation type not implemented yet!");
2520e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      break;
253a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
254a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky}
255a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
2560e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveARMRelocation(uint8_t *LocalAddress,
2570e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          uint32_t FinalAddress,
2580e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          uint32_t Value,
2590e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          uint32_t Type,
2600e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          int32_t Addend) {
2610e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // TODO: Add Thumb relocations.
2620e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  uint32_t* TargetPtr = (uint32_t*)LocalAddress;
2630e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  Value += Addend;
2640e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
2650e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  DEBUG(dbgs() << "resolveARMRelocation, LocalAddress: " << LocalAddress
2660e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " FinalAddress: " << format("%p",FinalAddress)
2670e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " Value: " << format("%x",Value)
2680e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " Type: " << format("%x",Type)
2690e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " Addend: " << format("%x",Addend)
2700e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << "\n");
2710e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
2720e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  switch(Type) {
2730e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  default:
2740e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    llvm_unreachable("Not implemented relocation type!");
2750e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
2760e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // Just write 32bit value to relocation address
2770e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case ELF::R_ARM_ABS32 :
2780e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr = Value;
2790e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    break;
2800e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
2810e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // Write first 16 bit of 32 bit value to the mov instruction.
2820e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // Last 4 bit should be shifted.
2830e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case ELF::R_ARM_MOVW_ABS_NC :
2840e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    Value = Value & 0xFFFF;
2850e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr |= Value & 0xFFF;
2860e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr |= ((Value >> 12) & 0xF) << 16;
2870e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    break;
2880e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
2890e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // Write last 16 bit of 32 bit value to the mov instruction.
2900e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // Last 4 bit should be shifted.
2910e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case ELF::R_ARM_MOVT_ABS :
2920e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    Value = (Value >> 16) & 0xFFFF;
2930e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr |= Value & 0xFFF;
2940e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr |= ((Value >> 12) & 0xF) << 16;
2950e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    break;
2960e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
2970e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  // Write 24 bit relative value to the branch instruction.
2980e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case ELF::R_ARM_PC24 :    // Fall through.
2990e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case ELF::R_ARM_CALL :    // Fall through.
3000e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case ELF::R_ARM_JUMP24 :
3010e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    int32_t RelValue = static_cast<int32_t>(Value - FinalAddress - 8);
3020e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    RelValue = (RelValue & 0x03FFFFFC) >> 2;
3030e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr &= 0xFF000000;
3040e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    *TargetPtr |= RelValue;
3050e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    break;
3060e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  }
307a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky}
308a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
309b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanakavoid RuntimeDyldELF::resolveMIPSRelocation(uint8_t *LocalAddress,
310b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka                                           uint32_t FinalAddress,
311b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka                                           uint32_t Value,
312b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka                                           uint32_t Type,
313b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka                                           int32_t Addend) {
314b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  uint32_t* TargetPtr = (uint32_t*)LocalAddress;
315b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  Value += Addend;
316b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
317b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  DEBUG(dbgs() << "resolveMipselocation, LocalAddress: " << LocalAddress
318b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka               << " FinalAddress: " << format("%p",FinalAddress)
319b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka               << " Value: " << format("%x",Value)
320b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka               << " Type: " << format("%x",Type)
321b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka               << " Addend: " << format("%x",Addend)
322b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka               << "\n");
323b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
324b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  switch(Type) {
325b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  default:
326b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    llvm_unreachable("Not implemented relocation type!");
327b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    break;
328b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  case ELF::R_MIPS_32:
329b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    *TargetPtr = Value + (*TargetPtr);
330b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    break;
331b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  case ELF::R_MIPS_26:
332b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    *TargetPtr = ((*TargetPtr) & 0xfc000000) | (( Value & 0x0fffffff) >> 2);
333b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    break;
334b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  case ELF::R_MIPS_HI16:
335b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    // Get the higher 16-bits. Also add 1 if bit 15 is 1.
336b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    Value += ((*TargetPtr) & 0x0000ffff) << 16;
337b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    *TargetPtr = ((*TargetPtr) & 0xffff0000) |
338b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                 (((Value + 0x8000) >> 16) & 0xffff);
339b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    break;
340b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka   case ELF::R_MIPS_LO16:
341b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    Value += ((*TargetPtr) & 0x0000ffff);
342b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    *TargetPtr = ((*TargetPtr) & 0xffff0000) | (Value & 0xffff);
343b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    break;
344b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka   }
345b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka}
346b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
3470e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::resolveRelocation(uint8_t *LocalAddress,
3480e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                       uint64_t FinalAddress,
3490e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                       uint64_t Value,
3500e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                       uint32_t Type,
3510e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                       int64_t Addend) {
352a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  switch (Arch) {
353a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case Triple::x86_64:
3540e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    resolveX86_64Relocation(LocalAddress, FinalAddress, Value, Type, Addend);
355a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
356a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  case Triple::x86:
3570e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    resolveX86Relocation(LocalAddress, (uint32_t)(FinalAddress & 0xffffffffL),
3580e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                         (uint32_t)(Value & 0xffffffffL), Type,
3590e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                         (uint32_t)(Addend & 0xffffffffL));
360a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
3610e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case Triple::arm:    // Fall through.
3620e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  case Triple::thumb:
3630e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    resolveARMRelocation(LocalAddress, (uint32_t)(FinalAddress & 0xffffffffL),
3640e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                         (uint32_t)(Value & 0xffffffffL), Type,
3650e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                         (uint32_t)(Addend & 0xffffffffL));
366a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky    break;
367b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  case Triple::mips:    // Fall through.
368b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  case Triple::mipsel:
369b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    resolveMIPSRelocation(LocalAddress, (uint32_t)(FinalAddress & 0xffffffffL),
370b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka                          (uint32_t)(Value & 0xffffffffL), Type,
371b862f094b78e3176813903f63c0e78b6e0e7852bAkira Hatanaka                          (uint32_t)(Addend & 0xffffffffL));
372b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    break;
373858143816d43e58b17bfd11cb1b57afbd7f0f893Craig Topper  default: llvm_unreachable("Unsupported CPU type!");
374a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
375a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky}
376a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky
3770e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshevvoid RuntimeDyldELF::processRelocationRef(const ObjRelocationInfo &Rel,
378689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd                                          ObjectImage &Obj,
3790e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          ObjSectionToIDMap &ObjSectionToID,
380d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky                                          const SymbolTableMap &Symbols,
3810e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                          StubMap &Stubs) {
3820e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
3830e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  uint32_t RelType = (uint32_t)(Rel.Type & 0xffffffffL);
3840e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  intptr_t Addend = (intptr_t)Rel.AdditionalInfo;
3850e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  const SymbolRef &Symbol = Rel.Symbol;
386c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky
387c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky  // Obtain the symbol name which is referenced in the relocation
388c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky  StringRef TargetName;
3890e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  Symbol.getName(TargetName);
3900e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  DEBUG(dbgs() << "\t\tRelType: " << RelType
3910e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " Addend: " << Addend
3920e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " TargetName: " << TargetName
3930e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << "\n");
394c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky  RelocationValueRef Value;
395c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky  // First search for the symbol in the local symbol table
396d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky  SymbolTableMap::const_iterator lsi = Symbols.find(TargetName.data());
3970e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  if (lsi != Symbols.end()) {
3980e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    Value.SectionID = lsi->second.first;
3990e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    Value.Addend = lsi->second.second;
4000e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  } else {
401c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky    // Search for the symbol in the global symbol table
402d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky    SymbolTableMap::const_iterator gsi =
403d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky        GlobalSymbolTable.find(TargetName.data());
404d98c9e918c9750d965c1efe9efcc9e13feacbe13Eli Bendersky    if (gsi != GlobalSymbolTable.end()) {
4050e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      Value.SectionID = gsi->second.first;
4060e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      Value.Addend = gsi->second.second;
4070e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    } else {
4080e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      SymbolRef::Type SymType;
4090e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      Symbol.getType(SymType);
4100e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      switch (SymType) {
4110e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev        case SymbolRef::ST_Debug: {
4120e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          // TODO: Now ELF SymbolRef::ST_Debug = STT_SECTION, it's not obviously
4130e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          // and can be changed by another developers. Maybe best way is add
4140e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          // a new symbol type ST_Section to SymbolRef and use it.
415c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky          section_iterator si(Obj.end_sections());
4160e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          Symbol.getSection(si);
4170e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          if (si == Obj.end_sections())
4180e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev            llvm_unreachable("Symbol section not found, bad object file format!");
4190e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          DEBUG(dbgs() << "\t\tThis is section symbol\n");
420689ff9c00f4f3dcf3491778bcdbda79e19e2285dPreston Gurd          Value.SectionID = findOrEmitSection(Obj, (*si), true, ObjSectionToID);
4210e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          Value.Addend = Addend;
4220e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          break;
4230e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev        }
4240e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev        case SymbolRef::ST_Unknown: {
4250e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          Value.SymbolName = TargetName.data();
4260e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          Value.Addend = Addend;
4270e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          break;
4280e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev        }
4290e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev        default:
4300e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          llvm_unreachable("Unresolved symbol type!");
4310e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev          break;
4320e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      }
4330e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    }
434a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  }
4350e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  DEBUG(dbgs() << "\t\tRel.SectionID: " << Rel.SectionID
4360e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << " Rel.Offset: " << Rel.Offset
4370e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev               << "\n");
4380e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev  if (Arch == Triple::arm &&
4390e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      (RelType == ELF::R_ARM_PC24 ||
4400e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev       RelType == ELF::R_ARM_CALL ||
4410e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev       RelType == ELF::R_ARM_JUMP24)) {
4420e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    // This is an ARM branch relocation, need to use a stub function.
4430e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    DEBUG(dbgs() << "\t\tThis is an ARM branch relocation.");
4440e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    SectionEntry &Section = Sections[Rel.SectionID];
4450e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    uint8_t *Target = Section.Address + Rel.Offset;
4460e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev
4470e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    //  Look up for existing stub.
4480e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    StubMap::const_iterator i = Stubs.find(Value);
4490e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    if (i != Stubs.end()) {
450ab427334f54fed51ed721672a6d0fd1ca0802dd4Danil Malyshev      resolveRelocation(Target, (uint64_t)Target, (uint64_t)Section.Address +
4510e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                        i->second, RelType, 0);
4520e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      DEBUG(dbgs() << " Stub function found\n");
4530e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    } else {
4540e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      // Create a new stub function.
4550e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      DEBUG(dbgs() << " Create a new stub function\n");
4560e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      Stubs[Value] = Section.StubOffset;
4570e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      uint8_t *StubTargetAddr = createStubFunction(Section.Address +
4580e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                                                   Section.StubOffset);
459c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky      RelocationEntry RE(Rel.SectionID, StubTargetAddr - Section.Address,
460c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky                         ELF::R_ARM_ABS32, Value.Addend);
461c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky      if (Value.SymbolName)
462c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky        addRelocationForSymbol(RE, Value.SymbolName);
463c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky      else
464c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky        addRelocationForSection(RE, Value.SectionID);
465c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky
466ab427334f54fed51ed721672a6d0fd1ca0802dd4Danil Malyshev      resolveRelocation(Target, (uint64_t)Target, (uint64_t)Section.Address +
4670e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev                        Section.StubOffset, RelType, 0);
4680e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev      Section.StubOffset += getMaxStubSize();
4690e4fa5ff365fccff46870b7d5d8d4d1d46e77986Danil Malyshev    }
470b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka  } else if (Arch == Triple::mipsel && RelType == ELF::R_MIPS_26) {
471b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    // This is an Mips branch relocation, need to use a stub function.
472b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    DEBUG(dbgs() << "\t\tThis is a Mips branch relocation.");
473b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    SectionEntry &Section = Sections[Rel.SectionID];
474b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    uint8_t *Target = Section.Address + Rel.Offset;
475b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    uint32_t *TargetAddress = (uint32_t *)Target;
476b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
477b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    // Extract the addend from the instruction.
478b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    uint32_t Addend = ((*TargetAddress) & 0x03ffffff) << 2;
479b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
480b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    Value.Addend += Addend;
481b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
482b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    //  Look up for existing stub.
483b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    StubMap::const_iterator i = Stubs.find(Value);
484b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    if (i != Stubs.end()) {
485b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      resolveRelocation(Target, (uint64_t)Target,
486b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                        (uint64_t)Section.Address +
487b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                        i->second, RelType, 0);
488b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      DEBUG(dbgs() << " Stub function found\n");
489b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    } else {
490b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      // Create a new stub function.
491b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      DEBUG(dbgs() << " Create a new stub function\n");
492b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      Stubs[Value] = Section.StubOffset;
493b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      uint8_t *StubTargetAddr = createStubFunction(Section.Address +
494b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                                                   Section.StubOffset);
495b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
496b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      // Creating Hi and Lo relocations for the filled stub instructions.
497b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      RelocationEntry REHi(Rel.SectionID,
498b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                           StubTargetAddr - Section.Address,
499b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                           ELF::R_MIPS_HI16, Value.Addend);
500b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      RelocationEntry RELo(Rel.SectionID,
501b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                           StubTargetAddr - Section.Address + 4,
502b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                           ELF::R_MIPS_LO16, Value.Addend);
503b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
504b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      if (Value.SymbolName) {
505b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka        addRelocationForSymbol(REHi, Value.SymbolName);
506b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka        addRelocationForSymbol(RELo, Value.SymbolName);
507b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      } else {
508b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka        addRelocationForSection(REHi, Value.SectionID);
509b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka        addRelocationForSection(RELo, Value.SectionID);
510b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      }
511b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka
512b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      resolveRelocation(Target, (uint64_t)Target,
513b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                        (uint64_t)Section.Address +
514b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka                        Section.StubOffset, RelType, 0);
515b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka      Section.StubOffset += getMaxStubSize();
516b889e0cd2fea4afee623d5be603b912b955a2ecaAkira Hatanaka    }
517c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky  } else {
518c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky    RelocationEntry RE(Rel.SectionID, Rel.Offset, RelType, Value.Addend);
519c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky    if (Value.SymbolName)
520c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky      addRelocationForSymbol(RE, Value.SymbolName);
521c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky    else
522c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky      addRelocationForSection(RE, Value.SectionID);
523c201e6eaf165c83f0092c43b371e509fa8eaf4ccEli Bendersky  }
52461425c0a7f4e3608a85f7bbf254cd052a15b7446Jim Grosbach}
52561425c0a7f4e3608a85f7bbf254cd052a15b7446Jim Grosbach
526a66a18505e07a4e72d6fa7e85663937a257577f3Eli Benderskybool RuntimeDyldELF::isCompatibleFormat(const MemoryBuffer *InputBuffer) const {
527a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  StringRef Magic = InputBuffer->getBuffer().slice(0, ELF::EI_NIDENT);
528a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky  return (memcmp(Magic.data(), ELF::ElfMagic, strlen(ELF::ElfMagic))) == 0;
529a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky}
530a66a18505e07a4e72d6fa7e85663937a257577f3Eli Bendersky} // namespace llvm
531