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