namespace JSC {
+#if ENABLE(SEPARATED_WX_HEAP)
+extern JS_EXPORT_PRIVATE bool useFastPermisionsJITCopy;
+#endif // ENABLE(SEPARATED_WX_HEAP)
+
bool shouldDumpDisassemblyFor(CodeBlock* codeBlock)
{
if (codeBlock && JITCode::isOptimizingJIT(codeBlock->jitType()) && Options::dumpDFGDisassembly())
template <typename InstructionType>
void LinkBuffer::copyCompactAndLinkCode(MacroAssembler& macroAssembler, void* ownerUID, JITCompilationEffort effort)
{
+#if CPU(ARM64E) && ENABLE(FAST_JIT_PERMISSIONS)
+#if ENABLE(SEPARATED_WX_HEAP)
+ const bool isUsingFastPermissionsJITCopy = useFastPermisionsJITCopy;
+#else
+ const bool isUsingFastPermissionsJITCopy = true;
+#endif
+#endif
+
allocate(macroAssembler, ownerUID, effort);
const size_t initialSize = macroAssembler.m_assembler.codeSize();
if (didFailToAllocate())
const ARM64EHash assemblerBufferHash = macroAssembler.m_assembler.buffer().hash();
ARM64EHash verifyUncompactedHash(assemblerBufferHash.randomSeed());
uint8_t* outData = codeOutData;
+#if ENABLE(SEPARATED_WX_HEAP)
+ AssemblerData outBuffer(m_size);
+ if (!isUsingFastPermissionsJITCopy)
+ outData = reinterpret_cast<uint8_t*>(outBuffer.buffer());
+#endif // ENABLE(SEPARATED_WX_HEAP)
#else
AssemblerData outBuffer(m_size);
uint8_t* outData = reinterpret_cast<uint8_t*>(outBuffer.buffer());
unsigned jumpCount = jumpsToLink.size();
#if CPU(ARM64E) && ENABLE(FAST_JIT_PERMISSIONS)
- os_thread_self_restrict_rwx_to_rw();
+ if (isUsingFastPermissionsJITCopy)
+ os_thread_self_restrict_rwx_to_rw();
#endif
if (m_shouldPerformBranchCompaction) {
for (unsigned i = 0; i < jumpCount; ++i) {
#if CPU(ARM64E) && ENABLE(FAST_JIT_PERMISSIONS)
auto memcpyFunction = memcpy;
+ if (!isUsingFastPermissionsJITCopy)
+ memcpyFunction = performJITMemcpy;
#else
auto memcpyFunction = performJITMemcpy;
#endif
}
#if CPU(ARM64E) && ENABLE(FAST_JIT_PERMISSIONS)
- os_thread_self_restrict_rwx_to_rx();
+ if (isUsingFastPermissionsJITCopy)
+ os_thread_self_restrict_rwx_to_rx();
#endif
if (m_executableMemory) {
ASSERT(codeOutData != outData);
performJITMemcpy(codeOutData, outData, m_size);
#else
- ASSERT(codeOutData == outData);
+ if (isUsingFastPermissionsJITCopy)
+ ASSERT(codeOutData == outData);
+ else {
+ ASSERT(codeOutData != outData);
+ performJITMemcpy(codeOutData, outData, m_size);
+ }
#endif
jumpsToLink.clear();
dumpCode(codeOutData, m_size);
#endif
}
-#endif
+#endif // ENABLE(BRANCH_COMPACTION)
void LinkBuffer::linkCode(MacroAssembler& macroAssembler, void* ownerUID, JITCompilationEffort effort)