@@ -89,6 +89,32 @@ typedef llvm::SectionMemoryManager LLVMMemoryManager;
8989
9090
9191namespace {
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+
92118static OIIO::spin_mutex llvm_global_mutex;
93119static bool setup_done = false ;
94120static 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