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