diff options
Diffstat (limited to 'src/3rdparty/masm/assembler/LinkBuffer.h')
-rw-r--r-- | src/3rdparty/masm/assembler/LinkBuffer.h | 72 |
1 files changed, 42 insertions, 30 deletions
diff --git a/src/3rdparty/masm/assembler/LinkBuffer.h b/src/3rdparty/masm/assembler/LinkBuffer.h index 7f9979302e..a556ef379b 100644 --- a/src/3rdparty/masm/assembler/LinkBuffer.h +++ b/src/3rdparty/masm/assembler/LinkBuffer.h @@ -93,7 +93,7 @@ public: #endif { #ifdef NDEBUG - UNUSED_PARAM(effort) + UNUSED_PARAM(effort); #endif // Simon: Moved this to the sub-classes linkCode(ownerUID, effort); } @@ -209,9 +209,9 @@ public: // complete generation of the code. Alternatively, call // finalizeCodeWithoutDisassembly() directly if you have your own way of // displaying disassembly. - + inline CodeRef finalizeCodeWithoutDisassembly(); - inline CodeRef finalizeCodeWithDisassembly(const char *jitKind, const char* format, ...) WTF_ATTRIBUTE_PRINTF(3, 4); + inline CodeRef finalizeCodeWithDisassembly(const char *jitKind, const char* func); CodePtr trampolineAt(Label label) { @@ -228,6 +228,8 @@ public: return m_size; } + inline bool makeExecutable(); + private: template <typename T> T applyOffset(T src) { @@ -265,9 +267,9 @@ protected: #endif }; -#define FINALIZE_CODE_IF(condition, linkBufferReference, jitKind, dataLogFArgumentsForHeading) \ +#define FINALIZE_CODE_IF(condition, linkBufferReference, jitKind, func) \ (UNLIKELY((condition)) \ - ? ((linkBufferReference).finalizeCodeWithDisassembly (jitKind, dataLogFArgumentsForHeading)) \ + ? ((linkBufferReference).finalizeCodeWithDisassembly (jitKind, func)) \ : (linkBufferReference).finalizeCodeWithoutDisassembly()) // Use this to finalize code, like so: @@ -286,11 +288,11 @@ protected: // Note that the dataLogFArgumentsForHeading are only evaluated when showDisassembly // is true, so you can hide expensive disassembly-only computations inside there. -#define FINALIZE_CODE(linkBufferReference, jitKind, dataLogFArgumentsForHeading) \ - FINALIZE_CODE_IF(Options::showDisassembly(), linkBufferReference, jitKind, dataLogFArgumentsForHeading) +#define FINALIZE_CODE(linkBufferReference, jitKind, func) \ + FINALIZE_CODE_IF(Options::showDisassembly(), linkBufferReference, jitKind, func) -#define FINALIZE_DFG_CODE(linkBufferReference, jitKind, dataLogFArgumentsForHeading) \ - FINALIZE_CODE_IF((Options::showDisassembly() || Options::showDFGDisassembly()), linkBufferReference, jitKind, dataLogFArgumentsForHeading) +#define FINALIZE_DFG_CODE(linkBufferReference, jitKind, func) \ + FINALIZE_CODE_IF((Options::showDisassembly() || Options::showDFGDisassembly()), linkBufferReference, jitKind, func) template <typename MacroAssembler, template <typename T> class ExecutableOffsetCalculator> @@ -302,24 +304,19 @@ inline typename LinkBufferBase<MacroAssembler, ExecutableOffsetCalculator>::Code } template <typename MacroAssembler, template <typename T> class ExecutableOffsetCalculator> -inline typename LinkBufferBase<MacroAssembler, ExecutableOffsetCalculator>::CodeRef LinkBufferBase<MacroAssembler, ExecutableOffsetCalculator>::finalizeCodeWithDisassembly(const char *jitKind, const char* format, ...) +inline typename LinkBufferBase<MacroAssembler, ExecutableOffsetCalculator>::CodeRef LinkBufferBase<MacroAssembler, ExecutableOffsetCalculator>::finalizeCodeWithDisassembly(const char *jitKind, const char* func) { ASSERT(Options::showDisassembly() || Options::showDFGDisassembly()); CodeRef result = finalizeCodeWithoutDisassembly(); - dataLogF("Generated %s code for ", jitKind); - va_list argList; - va_start(argList, format); - WTF::dataLogFV(format, argList); - va_end(argList); - dataLogF(":\n"); + dataLogF("Generated %s code for function %s:", jitKind, func); dataLogF( #if OS(WINDOWS) - " Code at [0x%p, 0x%p):\n", + " Code at [0x%p, 0x%p):", #else - " Code at [%p, %p):\n", + " Code at [%p, %p):", #endif result.code().executableAddress(), static_cast<char*>(result.code().executableAddress()) + result.size()); disassemble(result.code(), m_size, " ", WTF::dataFile()); @@ -330,13 +327,13 @@ inline typename LinkBufferBase<MacroAssembler, ExecutableOffsetCalculator>::Code template <typename MacroAssembler, template <typename T> class ExecutableOffsetCalculator> inline void LinkBufferBase<MacroAssembler, ExecutableOffsetCalculator>::linkCode(void* ownerUID, JITCompilationEffort effort) { - UNUSED_PARAM(ownerUID) - UNUSED_PARAM(effort) + UNUSED_PARAM(ownerUID); + UNUSED_PARAM(effort); ASSERT(!m_code); m_executableMemory = m_assembler->m_assembler.executableCopy(*m_globalData, ownerUID, effort); if (!m_executableMemory) return; - m_code = m_executableMemory->start(); + m_code = m_executableMemory->codeStart(); m_size = m_assembler->m_assembler.codeSize(); ASSERT(m_code); } @@ -353,7 +350,13 @@ void LinkBufferBase<MacroAssembler, ExecutableOffsetCalculator>::performFinaliza ASSERT(m_size <= INT_MAX); MacroAssembler::cacheFlush(code(), m_size); - ExecutableAllocator::makeExecutable(code(), static_cast<int>(m_size)); +} + +template <typename MacroAssembler, template <typename T> class ExecutableOffsetCalculator> +inline bool LinkBufferBase<MacroAssembler, ExecutableOffsetCalculator>::makeExecutable() +{ + return ExecutableAllocator::makeExecutable(m_executableMemory->memoryStart(), + m_executableMemory->memorySize()); } template <typename MacroAssembler> @@ -367,7 +370,7 @@ public: } }; -#if CPU(ARM_THUMB2) || CPU(ARM64) || defined(V4_BOOTSTRAP) +#if CPU(ARM_THUMB2) || CPU(ARM64) template <typename T> struct BranchCompactingExecutableOffsetCalculator { @@ -389,6 +392,7 @@ public: } virtual void performFinalization() override final; + inline bool makeExecutable(); inline void linkCode(void* ownerUID, JITCompilationEffort); @@ -421,22 +425,30 @@ void BranchCompactingLinkBuffer<MacroAssembler>::performFinalization() #endif MacroAssembler::cacheFlush(code(), m_size); - ExecutableAllocator::makeExecutable(code(), m_initialSize); +} + +template <typename MacroAssembler> +inline bool BranchCompactingLinkBuffer<MacroAssembler>::makeExecutable() +{ + return ExecutableAllocator::makeExecutable(code(), m_initialSize); } template <typename MacroAssembler> inline void BranchCompactingLinkBuffer<MacroAssembler>::linkCode(void* ownerUID, JITCompilationEffort effort) { - UNUSED_PARAM(ownerUID) - UNUSED_PARAM(effort) + UNUSED_PARAM(ownerUID); + UNUSED_PARAM(effort); ASSERT(!m_code); m_initialSize = m_assembler->m_assembler.codeSize(); m_executableMemory = m_globalData->executableAllocator.allocate(*m_globalData, m_initialSize, ownerUID, effort); if (!m_executableMemory) return; - m_code = (uint8_t*)m_executableMemory->start(); + if (Q_UNLIKELY(!ExecutableAllocator::makeWritable(m_executableMemory->memoryStart(), m_executableMemory->memorySize()))) { + m_executableMemory = {}; + return; + } + m_code = (uint8_t*)m_executableMemory->codeStart(); ASSERT(m_code); - ExecutableAllocator::makeWritable(m_code, m_initialSize); uint8_t* inData = (uint8_t*)m_assembler->unlinkedCode(); uint8_t* outData = reinterpret_cast<uint8_t*>(m_code); int readPtr = 0; @@ -496,7 +508,7 @@ inline void BranchCompactingLinkBuffer<MacroAssembler>::linkCode(void* ownerUID, m_executableMemory->shrink(m_size); } -#if CPU(ARM_THUMB2) || defined(V4_BOOTSTRAP) +#if CPU(ARM_THUMB2) template <> class LinkBuffer<JSC::MacroAssembler<MacroAssemblerARMv7>> : public BranchCompactingLinkBuffer<JSC::MacroAssembler<MacroAssemblerARMv7>> { @@ -507,7 +519,7 @@ public: }; #endif -#if CPU(ARM64) || defined(V4_BOOTSTRAP) +#if CPU(ARM64) template <> class LinkBuffer<JSC::MacroAssembler<MacroAssemblerARM64>> : public BranchCompactingLinkBuffer<JSC::MacroAssembler<MacroAssemblerARM64>> { |