14c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//===-- RuntimeDyldCOFF.cpp - Run-time dynamic linker for MC-JIT -*- C++ -*-==//
24c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//
34c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
44c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//
54c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
64c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// License. See LICENSE.TXT for details.
74c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//
84c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
94c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//
104c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar// Implementation of COFF support for the MC-JIT runtime dynamic linker.
114c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//
124c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar//===----------------------------------------------------------------------===//
134c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
144c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "RuntimeDyldCOFF.h"
154c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "Targets/RuntimeDyldCOFFX86_64.h"
164c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/ADT/STLExtras.h"
174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/ADT/Triple.h"
184c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/Object/ObjectFile.h"
194c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
204c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarusing namespace llvm;
214c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarusing namespace llvm::object;
224c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
234c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#define DEBUG_TYPE "dyld"
244c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
254c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarnamespace {
264c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
274c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarclass LoadedCOFFObjectInfo : public RuntimeDyld::LoadedObjectInfo {
284c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarpublic:
294c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  LoadedCOFFObjectInfo(RuntimeDyldImpl &RTDyld, unsigned BeginIdx,
304c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                       unsigned EndIdx)
314c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar      : RuntimeDyld::LoadedObjectInfo(RTDyld, BeginIdx, EndIdx) {}
324c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
334c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  OwningBinary<ObjectFile>
344c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  getObjectForDebug(const ObjectFile &Obj) const override {
354c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return OwningBinary<ObjectFile>();
364c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
374c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar};
384c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
394c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
404c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarnamespace llvm {
414c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
424c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstd::unique_ptr<RuntimeDyldCOFF>
432c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainarllvm::RuntimeDyldCOFF::create(Triple::ArchType Arch,
442c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                              RuntimeDyld::MemoryManager &MemMgr,
452c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar                              RuntimeDyld::SymbolResolver &Resolver) {
464c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  switch (Arch) {
474c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  default:
484c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    llvm_unreachable("Unsupported target for RuntimeDyldCOFF.");
494c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    break;
504c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  case Triple::x86_64:
512c3e0051c31c3f5b2328b447eadf1cf9c4427442Pirama Arumuga Nainar    return make_unique<RuntimeDyldCOFFX86_64>(MemMgr, Resolver);
524c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  }
534c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
544c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
554c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarstd::unique_ptr<RuntimeDyld::LoadedObjectInfo>
564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga NainarRuntimeDyldCOFF::loadObject(const object::ObjectFile &O) {
574c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  unsigned SectionStartIdx, SectionEndIdx;
584c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  std::tie(SectionStartIdx, SectionEndIdx) = loadObjectImpl(O);
594c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return llvm::make_unique<LoadedCOFFObjectInfo>(*this, SectionStartIdx,
604c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar                                                 SectionEndIdx);
614c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
624c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
634c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainaruint64_t RuntimeDyldCOFF::getSymbolOffset(const SymbolRef &Sym) {
644c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  uint64_t Address;
654c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (Sym.getAddress(Address))
664c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return UnknownAddressOrSize;
674c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
684c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (Address == UnknownAddressOrSize)
694c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return UnknownAddressOrSize;
704c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
714c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  const ObjectFile *Obj = Sym.getObject();
724c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  section_iterator SecI(Obj->section_end());
734c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (Sym.getSection(SecI))
744c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return UnknownAddressOrSize;
754c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
764c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  if (SecI == Obj->section_end())
774c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar    return UnknownAddressOrSize;
784c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
794c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  uint64_t SectionAddress = SecI->getAddress();
804c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return Address - SectionAddress;
814c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
824c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
834c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainarbool RuntimeDyldCOFF::isCompatibleFile(const object::ObjectFile &Obj) const {
844c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  return Obj.isCOFF();
854c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar}
864c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar
874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar} // namespace llvm
88