diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/assembler/LinkBuffer.cpp | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/assembler/LinkBuffer.cpp')
-rw-r--r-- | Source/JavaScriptCore/assembler/LinkBuffer.cpp | 104 |
1 files changed, 37 insertions, 67 deletions
diff --git a/Source/JavaScriptCore/assembler/LinkBuffer.cpp b/Source/JavaScriptCore/assembler/LinkBuffer.cpp index 82fb2ed39..a7f469da8 100644 --- a/Source/JavaScriptCore/assembler/LinkBuffer.cpp +++ b/Source/JavaScriptCore/assembler/LinkBuffer.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2015 Apple Inc. All rights reserved. + * Copyright (C) 2012, 2013 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -28,22 +28,12 @@ #if ENABLE(ASSEMBLER) -#include "CodeBlock.h" -#include "JITCode.h" -#include "JSCInlines.h" #include "Options.h" #include "VM.h" #include <wtf/CompilationThread.h> namespace JSC { -bool shouldDumpDisassemblyFor(CodeBlock* codeBlock) -{ - if (JITCode::isOptimizingJIT(codeBlock->jitType()) && Options::dumpDFGDisassembly()) - return true; - return Options::dumpDisassembly(); -} - LinkBuffer::CodeRef LinkBuffer::finalizeCodeWithoutDisassembly() { performFinalization(); @@ -57,57 +47,38 @@ LinkBuffer::CodeRef LinkBuffer::finalizeCodeWithoutDisassembly() LinkBuffer::CodeRef LinkBuffer::finalizeCodeWithDisassembly(const char* format, ...) { + ASSERT(Options::showDisassembly() || Options::showDFGDisassembly()); + CodeRef result = finalizeCodeWithoutDisassembly(); - if (m_alreadyDisassembled) - return result; - - StringPrintStream out; - out.printf("Generated JIT code for "); +#if ENABLE(DISASSEMBLER) + dataLogF("Generated JIT code for "); va_list argList; va_start(argList, format); - out.vprintf(format, argList); + WTF::dataLogFV(format, argList); va_end(argList); - out.printf(":\n"); - - out.printf(" Code at [%p, %p):\n", result.code().executableAddress(), static_cast<char*>(result.code().executableAddress()) + result.size()); - - CString header = out.toCString(); + dataLogF(":\n"); - if (Options::asyncDisassembly()) { - disassembleAsynchronously(header, result, m_size, " "); - return result; - } - - dataLog(header); + dataLogF(" Code at [%p, %p):\n", result.code().executableAddress(), static_cast<char*>(result.code().executableAddress()) + result.size()); disassemble(result.code(), m_size, " ", WTF::dataFile()); +#else + UNUSED_PARAM(format); +#endif // ENABLE(DISASSEMBLER) return result; } #if ENABLE(BRANCH_COMPACTION) -static ALWAYS_INLINE void recordLinkOffsets(AssemblerData& assemblerData, int32_t regionStart, int32_t regionEnd, int32_t offset) -{ - int32_t ptr = regionStart / sizeof(int32_t); - const int32_t end = regionEnd / sizeof(int32_t); - int32_t* offsets = reinterpret_cast<int32_t*>(assemblerData.buffer()); - while (ptr < end) - offsets[ptr++] = offset; -} - template <typename InstructionType> -void LinkBuffer::copyCompactAndLinkCode(MacroAssembler& macroAssembler, void* ownerUID, JITCompilationEffort effort) +void LinkBuffer::copyCompactAndLinkCode(void* ownerUID, JITCompilationEffort effort) { - m_initialSize = macroAssembler.m_assembler.codeSize(); + m_initialSize = m_assembler->m_assembler.codeSize(); allocate(m_initialSize, ownerUID, effort); - if (didFailToAllocate()) - return; - Vector<LinkRecord, 0, UnsafeVectorOverflow>& jumpsToLink = macroAssembler.jumpsToLink(); - m_assemblerStorage = macroAssembler.m_assembler.buffer().releaseAssemblerData(); - uint8_t* inData = reinterpret_cast<uint8_t*>(m_assemblerStorage.buffer()); + 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; @@ -123,7 +94,7 @@ void LinkBuffer::copyCompactAndLinkCode(MacroAssembler& macroAssembler, void* ow ASSERT(!(writePtr % 2)); while (copySource != copyEnd) *copyDst++ = *copySource++; - recordLinkOffsets(m_assemblerStorage, readPtr, jumpsToLink[i].from(), offset); + m_assembler->recordLinkOffsets(readPtr, jumpsToLink[i].from(), offset); readPtr += regionSize; writePtr += regionSize; @@ -133,28 +104,28 @@ void LinkBuffer::copyCompactAndLinkCode(MacroAssembler& macroAssembler, void* ow 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() - executableOffsetFor(jumpsToLink[i].to()); + target = outData + jumpsToLink[i].to() - m_assembler->executableOffsetFor(jumpsToLink[i].to()); - JumpLinkType jumpLinkType = MacroAssembler::computeJumpType(jumpsToLink[i], outData + writePtr, target); + JumpLinkType jumpLinkType = m_assembler->computeJumpType(jumpsToLink[i], outData + writePtr, target); // Compact branch if we can... - if (MacroAssembler::canCompact(jumpsToLink[i].type())) { + if (m_assembler->canCompact(jumpsToLink[i].type())) { // Step back in the write stream - int32_t delta = MacroAssembler::jumpSizeDelta(jumpsToLink[i].type(), jumpLinkType); + int32_t delta = m_assembler->jumpSizeDelta(jumpsToLink[i].type(), jumpLinkType); if (delta) { writePtr -= delta; - recordLinkOffsets(m_assemblerStorage, jumpsToLink[i].from() - delta, readPtr, readPtr - writePtr); + 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); - recordLinkOffsets(m_assemblerStorage, readPtr, m_initialSize, readPtr - writePtr); + 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() - executableOffsetFor(jumpsToLink[i].to()); - MacroAssembler::link(jumpsToLink[i], location, target); + uint8_t* target = outData + jumpsToLink[i].to() - m_assembler->executableOffsetFor(jumpsToLink[i].to()); + m_assembler->link(jumpsToLink[i], location, target); } jumpsToLink.clear(); @@ -170,31 +141,29 @@ void LinkBuffer::copyCompactAndLinkCode(MacroAssembler& macroAssembler, void* ow #endif -void LinkBuffer::linkCode(MacroAssembler& macroAssembler, void* ownerUID, JITCompilationEffort effort) +void LinkBuffer::linkCode(void* ownerUID, JITCompilationEffort effort) { #if !ENABLE(BRANCH_COMPACTION) #if defined(ASSEMBLER_HAS_CONSTANT_POOL) && ASSEMBLER_HAS_CONSTANT_POOL - macroAssembler.m_assembler.buffer().flushConstantPool(false); + m_assembler->m_assembler.buffer().flushConstantPool(false); #endif - AssemblerBuffer& buffer = macroAssembler.m_assembler.buffer(); + AssemblerBuffer& buffer = m_assembler->m_assembler.buffer(); allocate(buffer.codeSize(), ownerUID, effort); if (!m_didAllocate) return; ASSERT(m_code); #if CPU(ARM_TRADITIONAL) - macroAssembler.m_assembler.prepareExecutableCopy(m_code); + m_assembler->m_assembler.prepareExecutableCopy(m_code); #endif memcpy(m_code, buffer.data(), buffer.codeSize()); #if CPU(MIPS) - macroAssembler.m_assembler.relocateJumps(buffer.data(), m_code); + m_assembler->m_assembler.relocateJumps(buffer.data(), m_code); #endif #elif CPU(ARM_THUMB2) - copyCompactAndLinkCode<uint16_t>(macroAssembler, ownerUID, effort); + copyCompactAndLinkCode<uint16_t>(ownerUID, effort); #elif CPU(ARM64) - copyCompactAndLinkCode<uint32_t>(macroAssembler, ownerUID, effort); + copyCompactAndLinkCode<uint32_t>(ownerUID, effort); #endif - - m_linkTasks = WTFMove(macroAssembler.m_linkTasks); } void LinkBuffer::allocate(size_t initialSize, void* ownerUID, JITCompilationEffort effort) @@ -211,6 +180,7 @@ void LinkBuffer::allocate(size_t initialSize, void* ownerUID, JITCompilationEffo m_executableMemory = m_vm->executableAllocator.allocate(*m_vm, initialSize, ownerUID, effort); if (!m_executableMemory) return; + ExecutableAllocator::makeWritable(m_executableMemory->start(), m_executableMemory->sizeInBytes()); m_code = m_executableMemory->start(); m_size = initialSize; m_didAllocate = true; @@ -218,17 +188,12 @@ void LinkBuffer::allocate(size_t initialSize, void* ownerUID, JITCompilationEffo void LinkBuffer::shrink(size_t newSize) { - if (!m_executableMemory) - return; m_size = newSize; m_executableMemory->shrink(m_size); } void LinkBuffer::performFinalization() { - for (auto& task : m_linkTasks) - task->run(*this); - #ifndef NDEBUG ASSERT(!isCompilationThread()); ASSERT(!m_completed); @@ -236,6 +201,11 @@ void LinkBuffer::performFinalization() m_completed = true; #endif +#if ENABLE(BRANCH_COMPACTION) + ExecutableAllocator::makeExecutable(code(), m_initialSize); +#else + ExecutableAllocator::makeExecutable(code(), m_size); +#endif MacroAssembler::cacheFlush(code(), m_size); } |