From 4eca12e9f5b6e6b09d89cd4438e8557c5b66dbd1 Mon Sep 17 00:00:00 2001 From: Simon Hausmann Date: Fri, 20 Jan 2017 10:43:55 +0100 Subject: Remove branch compaction #ifdef Since the #ifdef for ARMv7 and ARM64 makes it impossible to cross compile, we need to replace it with a template specialization of LinkBuffer. The "old" LinkBuffer becomes LinkBufferBase, then there's a generic LinkBuffer that's a sub-class of LinkBufferBase. Then there's a BranchCompactingLinkBuffer template that implements the compaction and two ARMv7 and ARM64 specializations of LinkBuffer end up being sub-classes of BranchCompactingLinkBuffer instead of LinkBufferBase. Change-Id: Ib62fe24aa6c3570dfa311edc39fde6fb5975f3cc Reviewed-by: Lars Knoll --- .../masm/assembler/AbstractMacroAssembler.h | 21 ++- src/3rdparty/masm/assembler/LinkBuffer.h | 184 +++++++++++++++------ src/3rdparty/masm/assembler/MacroAssemblerARM.h | 2 +- src/3rdparty/masm/assembler/MacroAssemblerARM64.h | 2 +- src/3rdparty/masm/assembler/MacroAssemblerARMv7.h | 2 +- src/3rdparty/masm/assembler/MacroAssemblerMIPS.h | 2 +- src/3rdparty/masm/assembler/MacroAssemblerSH4.h | 2 +- src/3rdparty/masm/assembler/MacroAssemblerX86.h | 2 +- src/3rdparty/masm/assembler/MacroAssemblerX86_64.h | 2 +- src/3rdparty/masm/wtf/Platform.h | 4 - 10 files changed, 155 insertions(+), 68 deletions(-) (limited to 'src/3rdparty') diff --git a/src/3rdparty/masm/assembler/AbstractMacroAssembler.h b/src/3rdparty/masm/assembler/AbstractMacroAssembler.h index ea91a99b08..a9035efed7 100644 --- a/src/3rdparty/masm/assembler/AbstractMacroAssembler.h +++ b/src/3rdparty/masm/assembler/AbstractMacroAssembler.h @@ -47,8 +47,10 @@ namespace JSC { class JumpReplacementWatchpoint; +template class> +class LinkBufferBase; template -class LinkBuffer; +class BranchCompactingLinkBuffer; class RepatchBuffer; class Watchpoint; namespace DFG { @@ -326,7 +328,7 @@ public: friend class Jump; friend class JumpReplacementWatchpoint; friend class MacroAssemblerCodeRef; - template friend class LinkBuffer; + template class> friend class LinkBufferBase; friend class Watchpoint; public: @@ -357,7 +359,7 @@ public: class ConvertibleLoadLabel { template friend class AbstractMacroAssembler; - template friend class LinkBuffer; + template class> friend class LinkBufferBase; public: ConvertibleLoadLabel() @@ -381,7 +383,7 @@ public: class DataLabelPtr { template friend class AbstractMacroAssembler; - template friend class LinkBuffer; + template class> friend class LinkBufferBase; public: DataLabelPtr() { @@ -405,7 +407,7 @@ public: class DataLabel32 { template friend class AbstractMacroAssembler; - template friend class LinkBuffer; + template class> friend class LinkBufferBase; public: DataLabel32() { @@ -429,7 +431,7 @@ public: class DataLabelCompact { template friend class AbstractMacroAssembler; - template friend class LinkBuffer; + template class> friend class LinkBufferBase; public: DataLabelCompact() { @@ -504,7 +506,7 @@ public: friend class AbstractMacroAssembler; friend class Call; friend struct DFG::OSRExit; - template friend class LinkBuffer; + template class> friend class LinkBufferBase; public: Jump() { @@ -646,7 +648,7 @@ public: // A JumpList is a set of Jump objects. // All jumps in the set will be linked to the same destination. class JumpList { - template friend class LinkBuffer; + template class> friend class LinkBufferBase; public: typedef Vector JumpVector; @@ -820,7 +822,8 @@ protected: static bool shouldBlindForSpecificArch(uint64_t) { return true; } #endif - template friend class LinkBuffer; + template class> friend class LinkBufferBase; + template friend class BranchCompactingLinkBuffer; friend class RepatchBuffer; static void linkJump(void* code, Jump jump, CodeLocationLabel target) diff --git a/src/3rdparty/masm/assembler/LinkBuffer.h b/src/3rdparty/masm/assembler/LinkBuffer.h index 1de44439f8..4d8a129e18 100644 --- a/src/3rdparty/masm/assembler/LinkBuffer.h +++ b/src/3rdparty/masm/assembler/LinkBuffer.h @@ -44,6 +44,12 @@ namespace JSC { class JSGlobalData; +template +struct DefaultExecutableOffsetCalculator { + template + static T applyOffset(Assembler *, T src) { return src; } +}; + // LinkBuffer: // // This class assists in linking code generated by the macro assembler, once code generation @@ -58,9 +64,9 @@ class JSGlobalData; // * The address of a Label pointing into the code may be resolved. // * The value referenced by a DataLabel may be set. // -template -class LinkBuffer { - WTF_MAKE_NONCOPYABLE(LinkBuffer); +template class ExecutableOffsetCalculator> +class LinkBufferBase { + WTF_MAKE_NONCOPYABLE(LinkBufferBase); typedef MacroAssemblerCodeRef CodeRef; typedef MacroAssemblerCodePtr CodePtr; typedef typename MacroAssembler::Label Label; @@ -72,17 +78,10 @@ class LinkBuffer { typedef typename MacroAssembler::DataLabel32 DataLabel32; typedef typename MacroAssembler::DataLabelPtr DataLabelPtr; typedef typename MacroAssembler::ConvertibleLoadLabel ConvertibleLoadLabel; -#if ENABLE(BRANCH_COMPACTION) - typedef typename MacroAssembler::LinkRecord LinkRecord; - typedef typename MacroAssembler::JumpLinkType JumpLinkType; -#endif public: - LinkBuffer(JSGlobalData& globalData, MacroAssembler* masm, void* ownerUID, JITCompilationEffort effort = JITCompilationMustSucceed) + LinkBufferBase(JSGlobalData& globalData, MacroAssembler* masm, JITCompilationEffort effort = JITCompilationMustSucceed) : m_size(0) -#if ENABLE(BRANCH_COMPACTION) - , m_initialSize(0) -#endif , m_code(0) , m_assembler(masm) , m_globalData(&globalData) @@ -91,10 +90,13 @@ public: , m_effort(effort) #endif { - linkCode(ownerUID, effort); +#ifdef NDEBUG + UNUSED_PARAM(effort) +#endif + // Simon: Moved this to the sub-classes linkCode(ownerUID, effort); } - ~LinkBuffer() + ~LinkBufferBase() { ASSERT(m_completed || (!m_executableMemory && m_effort == JITCompilationCanFail)); } @@ -227,12 +229,10 @@ public: private: template T applyOffset(T src) { -#if ENABLE(BRANCH_COMPACTION) - src.m_offset -= m_assembler->executableOffsetFor(src.m_offset); -#endif - return src; + return ExecutableOffsetCalculator::applyOffset(m_assembler, src); } +protected: // Keep this private! - the underlying code should only be obtained externally via finalizeCode(). void* code() { @@ -253,12 +253,10 @@ private: RefPtr m_executableMemory; size_t m_size; -#if ENABLE(BRANCH_COMPACTION) - size_t m_initialSize; -#endif void* m_code; MacroAssembler* m_assembler; JSGlobalData* m_globalData; +protected: #ifndef NDEBUG bool m_completed; JITCompilationEffort m_effort; @@ -293,16 +291,16 @@ private: FINALIZE_CODE_IF((Options::showDisassembly() || Options::showDFGDisassembly()), linkBufferReference, dataLogFArgumentsForHeading) -template -inline typename LinkBuffer::CodeRef LinkBuffer::finalizeCodeWithoutDisassembly() +template class ExecutableOffsetCalculator> +inline typename LinkBufferBase::CodeRef LinkBufferBase::finalizeCodeWithoutDisassembly() { performFinalization(); return CodeRef(m_executableMemory); } -template -inline typename LinkBuffer::CodeRef LinkBuffer::finalizeCodeWithDisassembly(const char* format, ...) +template class ExecutableOffsetCalculator> +inline typename LinkBufferBase::CodeRef LinkBufferBase::finalizeCodeWithDisassembly(const char* format, ...) { ASSERT(Options::showDisassembly() || Options::showDFGDisassembly()); @@ -327,18 +325,109 @@ inline typename LinkBuffer::CodeRef LinkBuffer:: return result; } -template -inline void LinkBuffer::linkCode(void* ownerUID, JITCompilationEffort effort) +template class ExecutableOffsetCalculator> +inline void LinkBufferBase::linkCode(void* ownerUID, JITCompilationEffort effort) { + UNUSED_PARAM(ownerUID) + UNUSED_PARAM(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 +} + +template class ExecutableOffsetCalculator> +inline void LinkBufferBase::performFinalization() +{ + // NOTE: This function is specialized in LinkBuffer +#ifndef NDEBUG + ASSERT(!m_completed); + ASSERT(isValid()); + m_completed = true; +#endif + + ASSERT(m_size <= INT_MAX); + ExecutableAllocator::makeExecutable(code(), static_cast(m_size)); + MacroAssembler::cacheFlush(code(), m_size); +} + +template +class LinkBuffer : public LinkBufferBase +{ +public: + LinkBuffer(JSGlobalData& globalData, MacroAssembler* masm, void* ownerUID, JITCompilationEffort effort = JITCompilationMustSucceed) + : LinkBufferBase(globalData, masm, effort) + { + this->linkCode(ownerUID, effort); + } +}; + +#if CPU(ARM_THUMB2) || CPU(ARM64) + +template +struct BranchCompactingExecutableOffsetCalculator { + template + static T applyOffset(Assembler *as, T src) { + src.m_offset -= as->executableOffsetFor(src.m_offset); + return src; + } +}; + +template +class BranchCompactingLinkBuffer : public LinkBufferBase +{ +public: + BranchCompactingLinkBuffer(JSGlobalData& globalData, MacroAssembler* masm, void* ownerUID, JITCompilationEffort effort = JITCompilationMustSucceed) + : LinkBufferBase(globalData, masm, effort) + { + linkCode(ownerUID, effort); + } + + inline void performFinalization(); + + inline void linkCode(void* ownerUID, JITCompilationEffort); + +private: + using Base = LinkBufferBase; +#ifndef NDEBUG + using Base::m_completed; +#endif + using Base::isValid; + using Base::code; + using Base::m_code; + using Base::m_size; + using Base::m_assembler; + using Base::m_executableMemory; + using Base::m_globalData; + + using LinkRecord = typename MacroAssembler::LinkRecord; + using JumpLinkType = typename MacroAssembler::JumpLinkType; + + size_t m_initialSize = 0; +}; + +template +inline void BranchCompactingLinkBuffer::performFinalization() +{ +#ifndef NDEBUG + ASSERT(!m_completed); + ASSERT(isValid()); + this->m_completed = true; +#endif + + ExecutableAllocator::makeExecutable(code(), m_initialSize); + MacroAssembler::cacheFlush(code(), m_size); +} + +template +inline void BranchCompactingLinkBuffer::linkCode(void* ownerUID, JITCompilationEffort 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) @@ -403,33 +492,32 @@ inline void LinkBuffer::linkCode(void* ownerUID, JITCompilationE 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 +#if CPU(ARM_THUMB2) +template <> +class LinkBuffer> : public BranchCompactingLinkBuffer> +{ +public: + LinkBuffer(JSGlobalData& globalData, JSC::MacroAssembler* masm, void* ownerUID, JITCompilationEffort effort = JITCompilationMustSucceed) + : BranchCompactingLinkBuffer>(globalData, masm, ownerUID, effort) + {} +}; #endif -} -template -inline void LinkBuffer::performFinalization() +#if CPU(ARM64) +template <> +class LinkBuffer> : public BranchCompactingLinkBuffer> { -#ifndef NDEBUG - ASSERT(!m_completed); - ASSERT(isValid()); - m_completed = true; +public: + LinkBuffer(JSGlobalData& globalData, JSC::MacroAssembler* masm, void* ownerUID, JITCompilationEffort effort = JITCompilationMustSucceed) + : BranchCompactingLinkBuffer>(globalData, masm, ownerUID, effort) + {} +}; #endif -#if ENABLE(BRANCH_COMPACTION) - ExecutableAllocator::makeExecutable(code(), m_initialSize); -#else - ASSERT(m_size <= INT_MAX); - ExecutableAllocator::makeExecutable(code(), static_cast(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 87c236df3a..268fe5fe73 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerARM.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerARM.h @@ -1349,7 +1349,7 @@ protected: } private: - template friend class LinkBuffer; + template class> friend class LinkBufferBase; 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 37c952b9f3..3e425a0246 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerARM64.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerARM64.h @@ -3353,7 +3353,7 @@ private: return makeBranch(cond); } - template friend class LinkBuffer; + template class> friend class LinkBufferBase; 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 9f5a089a75..3f6352c1db 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerARMv7.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerARMv7.h @@ -1930,7 +1930,7 @@ protected: } private: - template friend class LinkBuffer; + template class> friend class LinkBufferBase; 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 3664321cff..68584527fc 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; - template friend class LinkBuffer; + template class> friend class LinkBufferBase; 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 336d96834f..1e5a3113bb 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerSH4.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerSH4.h @@ -2278,7 +2278,7 @@ protected: return static_cast(cond); } private: - template friend class LinkBuffer; + template class> friend class LinkBufferBase; 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 5ae3e5efd9..c42100bbcb 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerX86.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerX86.h @@ -306,7 +306,7 @@ public: } private: - template friend class LinkBuffer; + template class> friend class LinkBufferBase; 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 52c1f89cad..47ca952a05 100644 --- a/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h +++ b/src/3rdparty/masm/assembler/MacroAssemblerX86_64.h @@ -634,7 +634,7 @@ public: } private: - template friend class LinkBuffer; + template class> friend class LinkBufferBase; friend class RepatchBuffer; static void linkCall(void* code, Call call, FunctionPtr function) diff --git a/src/3rdparty/masm/wtf/Platform.h b/src/3rdparty/masm/wtf/Platform.h index bc62c381db..7f2023a68a 100644 --- a/src/3rdparty/masm/wtf/Platform.h +++ b/src/3rdparty/masm/wtf/Platform.h @@ -949,10 +949,6 @@ #define WTF_USE_ACCESSIBILITY_CONTEXT_MENUS 1 #endif -#if CPU(ARM_THUMB2) || CPU(ARM64) -#define ENABLE_BRANCH_COMPACTION 1 -#endif - #if !defined(ENABLE_THREADING_LIBDISPATCH) && HAVE(DISPATCH_H) #define ENABLE_THREADING_LIBDISPATCH 1 #elif !defined(ENABLE_THREADING_OPENMP) && defined(_OPENMP) -- cgit v1.2.3