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