summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/assembler/LinkBuffer.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2015-05-20 09:56:07 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2015-05-20 09:56:07 +0000
commit41386e9cb918eed93b3f13648cbef387e371e451 (patch)
treea97f9d7bd1d9d091833286085f72da9d83fd0606 /Source/JavaScriptCore/assembler/LinkBuffer.cpp
parente15dd966d523731101f70ccf768bba12435a0208 (diff)
downloadWebKitGtk-tarball-41386e9cb918eed93b3f13648cbef387e371e451.tar.gz
webkitgtk-2.4.9webkitgtk-2.4.9
Diffstat (limited to 'Source/JavaScriptCore/assembler/LinkBuffer.cpp')
-rw-r--r--Source/JavaScriptCore/assembler/LinkBuffer.cpp93
1 files changed, 31 insertions, 62 deletions
diff --git a/Source/JavaScriptCore/assembler/LinkBuffer.cpp b/Source/JavaScriptCore/assembler/LinkBuffer.cpp
index d53ef451b..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 shouldShowDisassemblyFor(CodeBlock* codeBlock)
-{
- if (JITCode::isOptimizingJIT(codeBlock->jitType()) && Options::showDFGDisassembly())
- return true;
- return Options::showDisassembly();
-}
-
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();
-
- if (Options::asyncDisassembly()) {
- disassembleAsynchronously(header, result, m_size, " ");
- return result;
- }
+ dataLogF(":\n");
- 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,28 +141,28 @@ 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
}
@@ -217,8 +188,6 @@ 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);
}