Skip to content

Commit b036b11

Browse files
committed
Fix LLVM memory manager for LLVM 6.0 and higher
Refactor code to avoid unecessary casts
1 parent 3fb1ca5 commit b036b11

2 files changed

Lines changed: 41 additions & 9 deletions

File tree

src/include/OSL/llvm_util.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ namespace llvm {
4343
class ExecutionEngine;
4444
class Function;
4545
class FunctionType;
46-
class JITMemoryManager;
46+
class SectionMemoryManager;
4747
class Linker;
4848
class LLVMContext;
4949
class Module;
@@ -503,7 +503,7 @@ class OSLEXECPUBLIC LLVM_Util {
503503
llvm::LLVMContext *m_llvm_context;
504504
llvm::Module *m_llvm_module;
505505
IRBuilder *m_builder;
506-
MemoryManager *m_llvm_jitmm;
506+
llvm::SectionMemoryManager *m_llvm_jitmm;
507507
llvm::Function *m_current_function;
508508
llvm::legacy::PassManager *m_llvm_module_passes;
509509
llvm::legacy::FunctionPassManager *m_llvm_func_passes;

src/liboslexec/llvm_util.cpp

Lines changed: 39 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,32 @@ typedef llvm::SectionMemoryManager LLVMMemoryManager;
8989

9090

9191
namespace {
92+
93+
#if OSL_LLVM_VERSION >= 60
94+
// NOTE: This is a COPY of something internal to LLVM, but since we destroy our LLVMMemoryManager
95+
// via global variables we can't rely on the LLVM copy sticking around.
96+
// Because of this, the variable must be declared _before_ jitmm_hold so that the object stays
97+
// valid until after we have destroyed all our memory managers.
98+
struct DefaultMMapper final : public llvm::SectionMemoryManager::MemoryMapper {
99+
llvm::sys::MemoryBlock
100+
allocateMappedMemory(llvm::SectionMemoryManager::AllocationPurpose Purpose,
101+
size_t NumBytes, const llvm::sys::MemoryBlock *const NearBlock,
102+
unsigned Flags, std::error_code &EC) override {
103+
return llvm::sys::Memory::allocateMappedMemory(NumBytes, NearBlock, Flags, EC);
104+
}
105+
106+
std::error_code protectMappedMemory(const llvm::sys::MemoryBlock &Block,
107+
unsigned Flags) override {
108+
return llvm::sys::Memory::protectMappedMemory(Block, Flags);
109+
}
110+
111+
std::error_code releaseMappedMemory(llvm::sys::MemoryBlock &M) override {
112+
return llvm::sys::Memory::releaseMappedMemory(M);
113+
}
114+
};
115+
static DefaultMMapper llvm_default_mapper;
116+
#endif
117+
92118
static OIIO::spin_mutex llvm_global_mutex;
93119
static bool setup_done = false;
94120
static boost::thread_specific_ptr<LLVM_Util::PerThreadInfo> perthread_infos;
@@ -185,14 +211,16 @@ class LLVM_Util::MemoryManager : public LLVMMemoryManager {
185211
virtual void registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) {
186212
mm->registerEHFrames (Addr, LoadAddr, Size);
187213
}
188-
virtual void deregisterEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) {
189214
#if OSL_LLVM_VERSION < 50
215+
virtual void deregisterEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) {
190216
mm->deregisterEHFrames(Addr, LoadAddr, Size);
217+
}
191218
#else
192-
// TODO: verify this is correct
219+
virtual void deregisterEHFrames() {
193220
mm->deregisterEHFrames();
194-
#endif
195221
}
222+
#endif
223+
196224
virtual uint64_t getSymbolAddress(const std::string &Name) {
197225
return mm->getSymbolAddress (Name);
198226
}
@@ -231,12 +259,16 @@ LLVM_Util::LLVM_Util (int debuglevel)
231259
m_thread->llvm_context = new llvm::LLVMContext();
232260

233261
if (! m_thread->llvm_jitmm) {
234-
m_thread->llvm_jitmm = new LLVMMemoryManager;
262+
#if OSL_LLVM_VERSION >= 60
263+
m_thread->llvm_jitmm = new LLVMMemoryManager(&llvm_default_mapper);
264+
#else
265+
m_thread->llvm_jitmm = new LLVMMemoryManager();
266+
#endif
235267
ASSERT (m_thread->llvm_jitmm);
236-
jitmm_hold.push_back (std::shared_ptr<LLVMMemoryManager>(m_thread->llvm_jitmm));
268+
jitmm_hold.emplace_back (m_thread->llvm_jitmm);
237269
}
238270
// Hold the REAL manager and use it as an argument later
239-
m_llvm_jitmm = reinterpret_cast<MemoryManager*>(m_thread->llvm_jitmm);
271+
m_llvm_jitmm = m_thread->llvm_jitmm;
240272
}
241273

242274
m_llvm_context = m_thread->llvm_context;
@@ -442,7 +474,7 @@ LLVM_Util::make_jit_execengine (std::string *err)
442474

443475
// We are actually holding a LLVMMemoryManager
444476
engine_builder.setMCJITMemoryManager (std::unique_ptr<llvm::RTDyldMemoryManager>
445-
(new MemoryManager(reinterpret_cast<LLVMMemoryManager*>(m_llvm_jitmm))));
477+
(new MemoryManager(m_llvm_jitmm)));
446478

447479
engine_builder.setOptLevel (llvm::CodeGenOpt::Default);
448480

0 commit comments

Comments
 (0)