diff options
-rw-r--r-- | src/3rdparty/masm/assembler/AbstractMacroAssembler.h | 17 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/LinkBuffer.cpp | 134 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/LinkBuffer.h | 170 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/MacroAssemblerARM.h | 2 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/MacroAssemblerARM64.h | 2 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/MacroAssemblerARMv7.h | 2 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/MacroAssemblerMIPS.h | 2 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/MacroAssemblerSH4.h | 2 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/MacroAssemblerX86.h | 2 | ||||
-rw-r--r-- | src/3rdparty/masm/assembler/MacroAssemblerX86_64.h | 2 | ||||
-rw-r--r-- | src/3rdparty/masm/yarr/YarrJIT.cpp | 4 | ||||
-rw-r--r-- | src/qml/jit/qv4assembler.cpp | 2 |
12 files changed, 174 insertions, 167 deletions
diff --git a/src/3rdparty/masm/assembler/AbstractMacroAssembler.h b/src/3rdparty/masm/assembler/AbstractMacroAssembler.h index e90dd235c6..ea91a99b08 100644 --- a/src/3rdparty/masm/assembler/AbstractMacroAssembler.h +++ b/src/3rdparty/masm/assembler/AbstractMacroAssembler.h @@ -47,6 +47,7 @@ namespace JSC { class JumpReplacementWatchpoint; +template <typename> class LinkBuffer; class RepatchBuffer; class Watchpoint; @@ -325,7 +326,7 @@ public: friend class Jump; friend class JumpReplacementWatchpoint; friend class MacroAssemblerCodeRef; - friend class LinkBuffer; + template <typename> friend class LinkBuffer; friend class Watchpoint; public: @@ -356,7 +357,7 @@ public: class ConvertibleLoadLabel { template<class TemplateAssemblerType> friend class AbstractMacroAssembler; - friend class LinkBuffer; + template <typename> friend class LinkBuffer; public: ConvertibleLoadLabel() @@ -380,7 +381,7 @@ public: class DataLabelPtr { template<class TemplateAssemblerType> friend class AbstractMacroAssembler; - friend class LinkBuffer; + template <typename> friend class LinkBuffer; public: DataLabelPtr() { @@ -404,7 +405,7 @@ public: class DataLabel32 { template<class TemplateAssemblerType> friend class AbstractMacroAssembler; - friend class LinkBuffer; + template <typename> friend class LinkBuffer; public: DataLabel32() { @@ -428,7 +429,7 @@ public: class DataLabelCompact { template<class TemplateAssemblerType> friend class AbstractMacroAssembler; - friend class LinkBuffer; + template <typename> friend class LinkBuffer; public: DataLabelCompact() { @@ -503,7 +504,7 @@ public: friend class AbstractMacroAssembler; friend class Call; friend struct DFG::OSRExit; - friend class LinkBuffer; + template <typename> friend class LinkBuffer; public: Jump() { @@ -645,7 +646,7 @@ public: // A JumpList is a set of Jump objects. // All jumps in the set will be linked to the same destination. class JumpList { - friend class LinkBuffer; + template <typename> friend class LinkBuffer; public: typedef Vector<Jump, 2> JumpVector; @@ -819,7 +820,7 @@ protected: static bool shouldBlindForSpecificArch(uint64_t) { return true; } #endif - friend class LinkBuffer; + template <typename> friend class LinkBuffer; friend class RepatchBuffer; static void linkJump(void* code, Jump jump, CodeLocationLabel target) diff --git a/src/3rdparty/masm/assembler/LinkBuffer.cpp b/src/3rdparty/masm/assembler/LinkBuffer.cpp index 432a7ee227..74c278135b 100644 --- a/src/3rdparty/masm/assembler/LinkBuffer.cpp +++ b/src/3rdparty/masm/assembler/LinkBuffer.cpp @@ -32,140 +32,6 @@ namespace JSC { -LinkBuffer::CodeRef LinkBuffer::finalizeCodeWithoutDisassembly() -{ - performFinalization(); - - return CodeRef(m_executableMemory); -} - -LinkBuffer::CodeRef LinkBuffer::finalizeCodeWithDisassembly(const char* format, ...) -{ - ASSERT(Options::showDisassembly() || Options::showDFGDisassembly()); - - CodeRef result = finalizeCodeWithoutDisassembly(); - - dataLogF("Generated JIT code for "); - va_list argList; - va_start(argList, format); - WTF::dataLogFV(format, argList); - va_end(argList); - dataLogF(":\n"); - - dataLogF( -#if OS(WINDOWS) - " Code at [0x%p, 0x%p):\n", -#else - " Code at [%p, %p):\n", -#endif - result.code().executableAddress(), static_cast<char*>(result.code().executableAddress()) + result.size()); - disassemble(result.code(), m_size, " ", WTF::dataFile()); - - return result; -} - -void LinkBuffer::linkCode(void* ownerUID, JITCompilationEffort effort) -{ - ASSERT(!m_code); -#if !ENABLE(BRANCH_COMPACTION) - m_executableMemory = m_assembler->m_assembler.executableCopy(*m_globalData, ownerUID, effort); - if (!m_executableMemory) - return; - m_code = m_executableMemory->start(); - m_size = m_assembler->m_assembler.codeSize(); - ASSERT(m_code); -#else - 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(); - 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; - int writePtr = 0; - Vector<LinkRecord, 0, UnsafeVectorOverflow>& jumpsToLink = m_assembler->jumpsToLink(); - unsigned jumpCount = jumpsToLink.size(); - for (unsigned i = 0; i < jumpCount; ++i) { - int offset = readPtr - writePtr; - ASSERT(!(offset & 1)); - - // Copy the instructions from the last jump to the current one. - size_t regionSize = jumpsToLink[i].from() - readPtr; - uint16_t* copySource = reinterpret_cast_ptr<uint16_t*>(inData + readPtr); - uint16_t* copyEnd = reinterpret_cast_ptr<uint16_t*>(inData + readPtr + regionSize); - uint16_t* copyDst = reinterpret_cast_ptr<uint16_t*>(outData + writePtr); - ASSERT(!(regionSize % 2)); - ASSERT(!(readPtr % 2)); - ASSERT(!(writePtr % 2)); - while (copySource != copyEnd) - *copyDst++ = *copySource++; - m_assembler->recordLinkOffsets(readPtr, jumpsToLink[i].from(), offset); - readPtr += regionSize; - writePtr += regionSize; - - // Calculate absolute address of the jump target, in the case of backwards - // branches we need to be precise, forward branches we are pessimistic - const uint8_t* target; - if (jumpsToLink[i].to() >= jumpsToLink[i].from()) - target = outData + jumpsToLink[i].to() - offset; // Compensate for what we have collapsed so far - else - target = outData + jumpsToLink[i].to() - m_assembler->executableOffsetFor(jumpsToLink[i].to()); - - JumpLinkType jumpLinkType = m_assembler->computeJumpType(jumpsToLink[i], outData + writePtr, target); - // Compact branch if we can... - if (m_assembler->canCompact(jumpsToLink[i].type())) { - // Step back in the write stream - int32_t delta = m_assembler->jumpSizeDelta(jumpsToLink[i].type(), jumpLinkType); - if (delta) { - writePtr -= delta; - m_assembler->recordLinkOffsets(jumpsToLink[i].from() - delta, readPtr, readPtr - writePtr); - } - } - jumpsToLink[i].setFrom(writePtr); - } - // Copy everything after the last jump - memcpy(outData + writePtr, inData + readPtr, m_initialSize - readPtr); - m_assembler->recordLinkOffsets(readPtr, m_initialSize, readPtr - writePtr); - - for (unsigned i = 0; i < jumpCount; ++i) { - uint8_t* location = outData + jumpsToLink[i].from(); - uint8_t* target = outData + jumpsToLink[i].to() - m_assembler->executableOffsetFor(jumpsToLink[i].to()); - m_assembler->link(jumpsToLink[i], location, target); - } - - jumpsToLink.clear(); - m_size = writePtr + m_initialSize - readPtr; - m_executableMemory->shrink(m_size); - -#if DUMP_LINK_STATISTICS - dumpLinkStatistics(m_code, m_initialSize, m_size); -#endif -#if DUMP_CODE - dumpCode(m_code, m_size); -#endif -#endif -} - -void LinkBuffer::performFinalization() -{ -#ifndef NDEBUG - ASSERT(!m_completed); - ASSERT(isValid()); - m_completed = true; -#endif - -#if ENABLE(BRANCH_COMPACTION) - ExecutableAllocator::makeExecutable(code(), m_initialSize); -#else - ASSERT(m_size <= INT_MAX); - ExecutableAllocator::makeExecutable(code(), static_cast<int>(m_size)); -#endif - MacroAssembler::cacheFlush(code(), m_size); -} - #if DUMP_LINK_STATISTICS void LinkBuffer::dumpLinkStatistics(void* code, size_t initializeSize, size_t finalSize) { diff --git a/src/3rdparty/masm/assembler/LinkBuffer.h b/src/3rdparty/masm/assembler/LinkBuffer.h index e1882433c1..1de44439f8 100644 --- a/src/3rdparty/masm/assembler/LinkBuffer.h +++ b/src/3rdparty/masm/assembler/LinkBuffer.h @@ -36,6 +36,7 @@ #include "JITCompilationEffort.h" #include "MacroAssembler.h" +#include "Options.h" #include <wtf/DataLog.h> #include <wtf/Noncopyable.h> @@ -57,22 +58,23 @@ class JSGlobalData; // * The address of a Label pointing into the code may be resolved. // * The value referenced by a DataLabel may be set. // +template <typename MacroAssembler> class LinkBuffer { WTF_MAKE_NONCOPYABLE(LinkBuffer); typedef MacroAssemblerCodeRef CodeRef; typedef MacroAssemblerCodePtr CodePtr; - typedef MacroAssembler::Label Label; - typedef MacroAssembler::Jump Jump; - typedef MacroAssembler::PatchableJump PatchableJump; - typedef MacroAssembler::JumpList JumpList; - typedef MacroAssembler::Call Call; - typedef MacroAssembler::DataLabelCompact DataLabelCompact; - typedef MacroAssembler::DataLabel32 DataLabel32; - typedef MacroAssembler::DataLabelPtr DataLabelPtr; - typedef MacroAssembler::ConvertibleLoadLabel ConvertibleLoadLabel; + typedef typename MacroAssembler::Label Label; + typedef typename MacroAssembler::Jump Jump; + typedef typename MacroAssembler::PatchableJump PatchableJump; + typedef typename MacroAssembler::JumpList JumpList; + typedef typename MacroAssembler::Call Call; + typedef typename MacroAssembler::DataLabelCompact DataLabelCompact; + typedef typename MacroAssembler::DataLabel32 DataLabel32; + typedef typename MacroAssembler::DataLabelPtr DataLabelPtr; + typedef typename MacroAssembler::ConvertibleLoadLabel ConvertibleLoadLabel; #if ENABLE(BRANCH_COMPACTION) - typedef MacroAssembler::LinkRecord LinkRecord; - typedef MacroAssembler::JumpLinkType JumpLinkType; + typedef typename MacroAssembler::LinkRecord LinkRecord; + typedef typename MacroAssembler::JumpLinkType JumpLinkType; #endif public: @@ -204,8 +206,8 @@ public: // finalizeCodeWithoutDisassembly() directly if you have your own way of // displaying disassembly. - CodeRef finalizeCodeWithoutDisassembly(); - CodeRef finalizeCodeWithDisassembly(const char* format, ...) WTF_ATTRIBUTE_PRINTF(2, 3); + inline CodeRef finalizeCodeWithoutDisassembly(); + inline CodeRef finalizeCodeWithDisassembly(const char* format, ...) WTF_ATTRIBUTE_PRINTF(2, 3); CodePtr trampolineAt(Label label) { @@ -237,9 +239,9 @@ private: return m_code; } - void linkCode(void* ownerUID, JITCompilationEffort); + inline void linkCode(void* ownerUID, JITCompilationEffort); - void performFinalization(); + inline void performFinalization(); #if DUMP_LINK_STATISTICS static void dumpLinkStatistics(void* code, size_t initialSize, size_t finalSize); @@ -290,6 +292,144 @@ private: #define FINALIZE_DFG_CODE(linkBufferReference, dataLogFArgumentsForHeading) \ FINALIZE_CODE_IF((Options::showDisassembly() || Options::showDFGDisassembly()), linkBufferReference, dataLogFArgumentsForHeading) + +template <typename MacroAssembler> +inline typename LinkBuffer<MacroAssembler>::CodeRef LinkBuffer<MacroAssembler>::finalizeCodeWithoutDisassembly() +{ + performFinalization(); + + return CodeRef(m_executableMemory); +} + +template <typename MacroAssembler> +inline typename LinkBuffer<MacroAssembler>::CodeRef LinkBuffer<MacroAssembler>::finalizeCodeWithDisassembly(const char* format, ...) +{ + ASSERT(Options::showDisassembly() || Options::showDFGDisassembly()); + + CodeRef result = finalizeCodeWithoutDisassembly(); + + dataLogF("Generated JIT code for "); + va_list argList; + va_start(argList, format); + WTF::dataLogFV(format, argList); + va_end(argList); + dataLogF(":\n"); + + dataLogF( +#if OS(WINDOWS) + " Code at [0x%p, 0x%p):\n", +#else + " Code at [%p, %p):\n", +#endif + result.code().executableAddress(), static_cast<char*>(result.code().executableAddress()) + result.size()); + disassemble(result.code(), m_size, " ", WTF::dataFile()); + + return result; +} + +template <typename MacroAssembler> +inline void LinkBuffer<MacroAssembler>::linkCode(void* ownerUID, JITCompilationEffort effort) +{ + ASSERT(!m_code); +#if !ENABLE(BRANCH_COMPACTION) + m_executableMemory = m_assembler->m_assembler.executableCopy(*m_globalData, ownerUID, effort); + if (!m_executableMemory) + return; + m_code = m_executableMemory->start(); + m_size = m_assembler->m_assembler.codeSize(); + ASSERT(m_code); +#else + 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(); + 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; + int writePtr = 0; + Vector<LinkRecord, 0, UnsafeVectorOverflow>& jumpsToLink = m_assembler->jumpsToLink(); + unsigned jumpCount = jumpsToLink.size(); + for (unsigned i = 0; i < jumpCount; ++i) { + int offset = readPtr - writePtr; + ASSERT(!(offset & 1)); + + // Copy the instructions from the last jump to the current one. + size_t regionSize = jumpsToLink[i].from() - readPtr; + uint16_t* copySource = reinterpret_cast_ptr<uint16_t*>(inData + readPtr); + uint16_t* copyEnd = reinterpret_cast_ptr<uint16_t*>(inData + readPtr + regionSize); + uint16_t* copyDst = reinterpret_cast_ptr<uint16_t*>(outData + writePtr); + ASSERT(!(regionSize % 2)); + ASSERT(!(readPtr % 2)); + ASSERT(!(writePtr % 2)); + while (copySource != copyEnd) + *copyDst++ = *copySource++; + m_assembler->recordLinkOffsets(readPtr, jumpsToLink[i].from(), offset); + readPtr += regionSize; + writePtr += regionSize; + + // Calculate absolute address of the jump target, in the case of backwards + // branches we need to be precise, forward branches we are pessimistic + const uint8_t* target; + if (jumpsToLink[i].to() >= jumpsToLink[i].from()) + target = outData + jumpsToLink[i].to() - offset; // Compensate for what we have collapsed so far + else + target = outData + jumpsToLink[i].to() - m_assembler->executableOffsetFor(jumpsToLink[i].to()); + + JumpLinkType jumpLinkType = m_assembler->computeJumpType(jumpsToLink[i], outData + writePtr, target); + // Compact branch if we can... + if (m_assembler->canCompact(jumpsToLink[i].type())) { + // Step back in the write stream + int32_t delta = m_assembler->jumpSizeDelta(jumpsToLink[i].type(), jumpLinkType); + if (delta) { + writePtr -= delta; + m_assembler->recordLinkOffsets(jumpsToLink[i].from() - delta, readPtr, readPtr - writePtr); + } + } + jumpsToLink[i].setFrom(writePtr); + } + // Copy everything after the last jump + memcpy(outData + writePtr, inData + readPtr, m_initialSize - readPtr); + m_assembler->recordLinkOffsets(readPtr, m_initialSize, readPtr - writePtr); + + for (unsigned i = 0; i < jumpCount; ++i) { + uint8_t* location = outData + jumpsToLink[i].from(); + uint8_t* target = outData + jumpsToLink[i].to() - m_assembler->executableOffsetFor(jumpsToLink[i].to()); + m_assembler->link(jumpsToLink[i], location, target); + } + + jumpsToLink.clear(); + m_size = writePtr + m_initialSize - readPtr; + m_executableMemory->shrink(m_size); + +#if DUMP_LINK_STATISTICS + dumpLinkStatistics(m_code, m_initialSize, m_size); +#endif +#if DUMP_CODE + dumpCode(m_code, m_size); +#endif +#endif +} + +template <typename MacroAssembler> +inline void LinkBuffer<MacroAssembler>::performFinalization() +{ +#ifndef NDEBUG + ASSERT(!m_completed); + ASSERT(isValid()); + m_completed = true; +#endif + +#if ENABLE(BRANCH_COMPACTION) + ExecutableAllocator::makeExecutable(code(), m_initialSize); +#else + ASSERT(m_size <= INT_MAX); + ExecutableAllocator::makeExecutable(code(), static_cast<int>(m_size)); +#endif + MacroAssembler::cacheFlush(code(), m_size); +} } // namespace JSC #endif // ENABLE(ASSEMBLER) diff --git a/src/3rdparty/masm/assembler/MacroAssemblerARM.h b/src/3rdparty/masm/assembler/MacroAssemblerARM.h index 01e34c97cd..87c236df3a 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerARM.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerARM.h @@ -1349,7 +1349,7 @@ protected: } private: - friend class LinkBuffer; + template <typename> friend class LinkBuffer; friend class RepatchBuffer; void internalCompare32(RegisterID left, TrustedImm32 right) diff --git a/src/3rdparty/masm/assembler/MacroAssemblerARM64.h b/src/3rdparty/masm/assembler/MacroAssemblerARM64.h index bd85b6b2c1..37c952b9f3 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerARM64.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerARM64.h @@ -3353,7 +3353,7 @@ private: return makeBranch(cond); } - friend class LinkBuffer; + template <typename> friend class LinkBuffer; void recordLinkOffsets(int32_t regionStart, int32_t regionEnd, int32_t offset) {return m_assembler.recordLinkOffsets(regionStart, regionEnd, offset); } int executableOffsetFor(int location) { return m_assembler.executableOffsetFor(location); } diff --git a/src/3rdparty/masm/assembler/MacroAssemblerARMv7.h b/src/3rdparty/masm/assembler/MacroAssemblerARMv7.h index 0938383513..73833c0ceb 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerARMv7.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerARMv7.h @@ -1927,7 +1927,7 @@ protected: } private: - friend class LinkBuffer; + template <typename> friend class LinkBuffer; friend class RepatchBuffer; static void linkCall(void* code, Call call, FunctionPtr function) diff --git a/src/3rdparty/masm/assembler/MacroAssemblerMIPS.h b/src/3rdparty/masm/assembler/MacroAssemblerMIPS.h index 734e779c70..3664321cff 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerMIPS.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerMIPS.h @@ -2802,7 +2802,7 @@ private: // Otherwise, we can emit any number of instructions. bool m_fixedWidth; - friend class LinkBuffer; + template <typename> friend class LinkBuffer; friend class RepatchBuffer; static void linkCall(void* code, Call call, FunctionPtr function) diff --git a/src/3rdparty/masm/assembler/MacroAssemblerSH4.h b/src/3rdparty/masm/assembler/MacroAssemblerSH4.h index 56fb74d45b..336d96834f 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerSH4.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerSH4.h @@ -2278,7 +2278,7 @@ protected: return static_cast<SH4Assembler::Condition>(cond); } private: - friend class LinkBuffer; + template <typename> friend class LinkBuffer; friend class RepatchBuffer; static void linkCall(void*, Call, FunctionPtr); diff --git a/src/3rdparty/masm/assembler/MacroAssemblerX86.h b/src/3rdparty/masm/assembler/MacroAssemblerX86.h index 9a33fe870e..5ae3e5efd9 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerX86.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerX86.h @@ -306,7 +306,7 @@ public: } private: - friend class LinkBuffer; + template <typename> friend class LinkBuffer; friend class RepatchBuffer; static void linkCall(void* code, Call call, FunctionPtr function) diff --git a/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h b/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h index 9e74f1c29f..52c1f89cad 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h @@ -634,7 +634,7 @@ public: } private: - friend class LinkBuffer; + template <typename> friend class LinkBuffer; friend class RepatchBuffer; static void linkCall(void* code, Call call, FunctionPtr function) diff --git a/src/3rdparty/masm/yarr/YarrJIT.cpp b/src/3rdparty/masm/yarr/YarrJIT.cpp index d8211ec4b2..c6f2cdb91f 100644 --- a/src/3rdparty/masm/yarr/YarrJIT.cpp +++ b/src/3rdparty/masm/yarr/YarrJIT.cpp @@ -599,7 +599,7 @@ class YarrGenerator : private MacroAssembler { } // Called at the end of code generation to link all return addresses. - void linkDataLabels(LinkBuffer& linkBuffer) + void linkDataLabels(LinkBuffer<JSC::MacroAssembler>& linkBuffer) { ASSERT(isEmpty()); for (unsigned i = 0; i < m_backtrackRecords.size(); ++i) @@ -2676,7 +2676,7 @@ public: backtrack(); // Link & finalize the code. - LinkBuffer linkBuffer(*globalData, this, REGEXP_CODE_ID); + LinkBuffer<JSC::MacroAssembler> linkBuffer(*globalData, this, REGEXP_CODE_ID); m_backtrackingState.linkDataLabels(linkBuffer); if (compileMode == MatchOnly) { diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp index 018396318e..6203349e96 100644 --- a/src/qml/jit/qv4assembler.cpp +++ b/src/qml/jit/qv4assembler.cpp @@ -577,7 +577,7 @@ JSC::MacroAssemblerCodeRef Assembler::link(int *codeSize) } JSC::JSGlobalData dummy(_executableAllocator); - JSC::LinkBuffer linkBuffer(dummy, this, 0); + JSC::LinkBuffer<JSC::MacroAssembler> linkBuffer(dummy, this, 0); for (const DataLabelPatch &p : qAsConst(_dataLabelPatches)) linkBuffer.patch(p.dataLabel, linkBuffer.locationOf(p.target)); |