1*9880d681SAndroid Build Coastguard Worker //===-- RuntimeDyldCOFF.cpp - Run-time dynamic linker for MC-JIT -*- C++ -*-==//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // Implementation of COFF support for the MC-JIT runtime dynamic linker.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "RuntimeDyldCOFF.h"
15*9880d681SAndroid Build Coastguard Worker #include "Targets/RuntimeDyldCOFFI386.h"
16*9880d681SAndroid Build Coastguard Worker #include "Targets/RuntimeDyldCOFFThumb.h"
17*9880d681SAndroid Build Coastguard Worker #include "Targets/RuntimeDyldCOFFX86_64.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/Triple.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Object/ObjectFile.h"
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker using namespace llvm;
23*9880d681SAndroid Build Coastguard Worker using namespace llvm::object;
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker #define DEBUG_TYPE "dyld"
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker namespace {
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker class LoadedCOFFObjectInfo final
30*9880d681SAndroid Build Coastguard Worker : public RuntimeDyld::LoadedObjectInfoHelper<LoadedCOFFObjectInfo> {
31*9880d681SAndroid Build Coastguard Worker public:
LoadedCOFFObjectInfo(RuntimeDyldImpl & RTDyld,ObjSectionToIDMap ObjSecToIDMap)32*9880d681SAndroid Build Coastguard Worker LoadedCOFFObjectInfo(RuntimeDyldImpl &RTDyld, ObjSectionToIDMap ObjSecToIDMap)
33*9880d681SAndroid Build Coastguard Worker : LoadedObjectInfoHelper(RTDyld, std::move(ObjSecToIDMap)) {}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker OwningBinary<ObjectFile>
getObjectForDebug(const ObjectFile & Obj) const36*9880d681SAndroid Build Coastguard Worker getObjectForDebug(const ObjectFile &Obj) const override {
37*9880d681SAndroid Build Coastguard Worker return OwningBinary<ObjectFile>();
38*9880d681SAndroid Build Coastguard Worker }
39*9880d681SAndroid Build Coastguard Worker };
40*9880d681SAndroid Build Coastguard Worker }
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker namespace llvm {
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker std::unique_ptr<RuntimeDyldCOFF>
create(Triple::ArchType Arch,RuntimeDyld::MemoryManager & MemMgr,RuntimeDyld::SymbolResolver & Resolver)45*9880d681SAndroid Build Coastguard Worker llvm::RuntimeDyldCOFF::create(Triple::ArchType Arch,
46*9880d681SAndroid Build Coastguard Worker RuntimeDyld::MemoryManager &MemMgr,
47*9880d681SAndroid Build Coastguard Worker RuntimeDyld::SymbolResolver &Resolver) {
48*9880d681SAndroid Build Coastguard Worker switch (Arch) {
49*9880d681SAndroid Build Coastguard Worker default: llvm_unreachable("Unsupported target for RuntimeDyldCOFF.");
50*9880d681SAndroid Build Coastguard Worker case Triple::x86:
51*9880d681SAndroid Build Coastguard Worker return make_unique<RuntimeDyldCOFFI386>(MemMgr, Resolver);
52*9880d681SAndroid Build Coastguard Worker case Triple::thumb:
53*9880d681SAndroid Build Coastguard Worker return make_unique<RuntimeDyldCOFFThumb>(MemMgr, Resolver);
54*9880d681SAndroid Build Coastguard Worker case Triple::x86_64:
55*9880d681SAndroid Build Coastguard Worker return make_unique<RuntimeDyldCOFFX86_64>(MemMgr, Resolver);
56*9880d681SAndroid Build Coastguard Worker }
57*9880d681SAndroid Build Coastguard Worker }
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker std::unique_ptr<RuntimeDyld::LoadedObjectInfo>
loadObject(const object::ObjectFile & O)60*9880d681SAndroid Build Coastguard Worker RuntimeDyldCOFF::loadObject(const object::ObjectFile &O) {
61*9880d681SAndroid Build Coastguard Worker if (auto ObjSectionToIDOrErr = loadObjectImpl(O)) {
62*9880d681SAndroid Build Coastguard Worker return llvm::make_unique<LoadedCOFFObjectInfo>(*this, *ObjSectionToIDOrErr);
63*9880d681SAndroid Build Coastguard Worker } else {
64*9880d681SAndroid Build Coastguard Worker HasError = true;
65*9880d681SAndroid Build Coastguard Worker raw_string_ostream ErrStream(ErrorStr);
66*9880d681SAndroid Build Coastguard Worker logAllUnhandledErrors(ObjSectionToIDOrErr.takeError(), ErrStream, "");
67*9880d681SAndroid Build Coastguard Worker return nullptr;
68*9880d681SAndroid Build Coastguard Worker }
69*9880d681SAndroid Build Coastguard Worker }
70*9880d681SAndroid Build Coastguard Worker
getSymbolOffset(const SymbolRef & Sym)71*9880d681SAndroid Build Coastguard Worker uint64_t RuntimeDyldCOFF::getSymbolOffset(const SymbolRef &Sym) {
72*9880d681SAndroid Build Coastguard Worker // The value in a relocatable COFF object is the offset.
73*9880d681SAndroid Build Coastguard Worker return Sym.getValue();
74*9880d681SAndroid Build Coastguard Worker }
75*9880d681SAndroid Build Coastguard Worker
isCompatibleFile(const object::ObjectFile & Obj) const76*9880d681SAndroid Build Coastguard Worker bool RuntimeDyldCOFF::isCompatibleFile(const object::ObjectFile &Obj) const {
77*9880d681SAndroid Build Coastguard Worker return Obj.isCOFF();
78*9880d681SAndroid Build Coastguard Worker }
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker } // namespace llvm
81