1 //===-- RuntimeDyldCOFF.h - 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 // COFF support for MC-JIT runtime dynamic linker. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_RUNTIME_DYLD_COFF_H 14 #define LLVM_RUNTIME_DYLD_COFF_H 15 16 #include "RuntimeDyldImpl.h" 17 18 #define DEBUG_TYPE "dyld" 19 20 using namespace llvm; 21 22 namespace llvm { 23 24 // Common base class for COFF dynamic linker support. 25 // Concrete subclasses for each target can be found in ./Targets. 26 class RuntimeDyldCOFF : public RuntimeDyldImpl { 27 28 public: 29 std::unique_ptr<RuntimeDyld::LoadedObjectInfo> 30 loadObject(const object::ObjectFile &Obj) override; 31 bool isCompatibleFile(const object::ObjectFile &Obj) const override; 32 33 static std::unique_ptr<RuntimeDyldCOFF> 34 create(Triple::ArchType Arch, RuntimeDyld::MemoryManager &MemMgr, 35 JITSymbolResolver &Resolver); 36 37 protected: 38 RuntimeDyldCOFF(RuntimeDyld::MemoryManager &MemMgr, 39 JITSymbolResolver &Resolver, unsigned PointerSize, 40 uint32_t PointerReloc) 41 : RuntimeDyldImpl(MemMgr, Resolver), PointerSize(PointerSize), 42 PointerReloc(PointerReloc) { 43 assert((PointerSize == 4 || PointerSize == 8) && "Unexpected pointer size"); 44 } 45 46 uint64_t getSymbolOffset(const SymbolRef &Sym); 47 uint64_t getDLLImportOffset(unsigned SectionID, StubMap &Stubs, 48 StringRef Name, bool SetSectionIDMinus1 = false); 49 50 static constexpr StringRef getImportSymbolPrefix() { return "__imp_"; } 51 52 private: 53 unsigned PointerSize; 54 uint32_t PointerReloc; 55 }; 56 57 } // end namespace llvm 58 59 #undef DEBUG_TYPE 60 61 #endif 62