bool PystonMemoryManager::finalizeMemory(std::string* ErrMsg) { // FIXME: Should in-progress permissions be reverted if an error occurs? llvm_error_code ec; // Make code memory executable. // pyston: also make it writeable so we can patch it later ec = applyMemoryGroupPermissions(CodeMem, sys::Memory::MF_READ | sys::Memory::MF_EXEC | sys::Memory::MF_WRITE); if (ec) { if (ErrMsg) { *ErrMsg = ec.message(); } RELEASE_ASSERT(0, "finalizeMemory failed"); } // Make read-only data memory read-only. ec = applyMemoryGroupPermissions(RODataMem, sys::Memory::MF_READ | sys::Memory::MF_EXEC); if (ec) { if (ErrMsg) { *ErrMsg = ec.message(); } RELEASE_ASSERT(0, "finalizeMemory failed"); } // Read-write data memory already has the correct permissions // Some platforms with separate data cache and instruction cache require // explicit cache flush, otherwise JIT code manipulations (like resolved // relocations) will get to the data cache but not to the instruction cache. invalidateInstructionCache(); return false; }
bool SectionMemoryManager::applyPermissions(std::string *ErrMsg) { // FIXME: Should in-progress permissions be reverted if an error occurs? error_code ec; // Make code memory executable. ec = applyMemoryGroupPermissions(CodeMem, sys::Memory::MF_READ | sys::Memory::MF_EXEC); if (ec) { if (ErrMsg) { *ErrMsg = ec.message(); } return true; } // Make read-only data memory read-only. ec = applyMemoryGroupPermissions(RODataMem, sys::Memory::MF_READ | sys::Memory::MF_EXEC); if (ec) { if (ErrMsg) { *ErrMsg = ec.message(); } return true; } // Read-write data memory already has the correct permissions return false; }
bool SectionMemoryManager::applyPermissions(std::string *ErrMsg) { // FIXME: Should in-progress permissions be reverted if an error occurs? error_code ec; // Make code memory executable. ec = applyMemoryGroupPermissions(CodeMem, sys::Memory::MF_READ | sys::Memory::MF_EXEC); if (ec) { if (ErrMsg) { *ErrMsg = ec.message(); } return true; } // Make read-only data memory read-only. ec = applyMemoryGroupPermissions(RODataMem, sys::Memory::MF_READ | sys::Memory::MF_EXEC); if (ec) { if (ErrMsg) { *ErrMsg = ec.message(); } return true; } // Read-write data memory already has the correct permissions // Some platforms with separate data cache and instruction cache require // explicit cache flush, otherwise JIT code manipulations (like resolved // relocations) will get to the data cache but not to the instruction cache. invalidateInstructionCache(); return false; }