FTLJITFinalizer.cpp [plain text]
#include "config.h"
#include "FTLJITFinalizer.h"
#if ENABLE(FTL_JIT)
#include "CodeBlockWithJITType.h"
#include "DFGPlan.h"
#include "FTLThunks.h"
#include "ProfilerDatabase.h"
namespace JSC { namespace FTL {
using namespace DFG;
JITFinalizer::JITFinalizer(Plan& plan)
: Finalizer(plan)
{
}
JITFinalizer::~JITFinalizer()
{
}
size_t JITFinalizer::codeSize()
{
size_t result = 0;
if (exitThunksLinkBuffer)
result += exitThunksLinkBuffer->size();
if (entrypointLinkBuffer)
result += entrypointLinkBuffer->size();
if (sideCodeLinkBuffer)
result += sideCodeLinkBuffer->size();
if (handleExceptionsLinkBuffer)
result += handleExceptionsLinkBuffer->size();
for (unsigned i = jitCode->handles().size(); i--;)
result += jitCode->handles()[i]->sizeInBytes();
return result;
}
bool JITFinalizer::finalize()
{
RELEASE_ASSERT_NOT_REACHED();
return false;
}
bool JITFinalizer::finalizeFunction()
{
for (unsigned i = jitCode->handles().size(); i--;) {
MacroAssembler::cacheFlush(
jitCode->handles()[i]->start(), jitCode->handles()[i]->sizeInBytes());
}
if (exitThunksLinkBuffer) {
StackMaps::RecordMap recordMap = jitCode->stackmaps.computeRecordMap();
for (unsigned i = 0; i < osrExit.size(); ++i) {
OSRExitCompilationInfo& info = osrExit[i];
OSRExit& exit = jitCode->osrExit[i];
StackMaps::RecordMap::iterator iter = recordMap.find(exit.m_stackmapID);
if (iter == recordMap.end()) {
continue;
}
exitThunksLinkBuffer->link(
info.m_thunkJump,
CodeLocationLabel(
m_plan.vm.getCTIStub(osrExitGenerationThunkGenerator).code()));
}
jitCode->initializeExitThunks(
FINALIZE_DFG_CODE(
*exitThunksLinkBuffer,
("FTL exit thunks for %s", toCString(CodeBlockWithJITType(m_plan.codeBlock.get(), JITCode::FTLJIT)).data())));
}
if (sideCodeLinkBuffer) {
for (unsigned i = slowPathCalls.size(); i--;) {
SlowPathCall& call = slowPathCalls[i];
sideCodeLinkBuffer->link(
call.call(),
CodeLocationLabel(m_plan.vm.ftlThunks->getSlowPathCallThunk(m_plan.vm, call.key()).code()));
}
jitCode->addHandle(FINALIZE_DFG_CODE(
*sideCodeLinkBuffer,
("FTL side code for %s",
toCString(CodeBlockWithJITType(m_plan.codeBlock.get(), JITCode::FTLJIT)).data()))
.executableMemory());
}
if (handleExceptionsLinkBuffer) {
jitCode->addHandle(FINALIZE_DFG_CODE(
*handleExceptionsLinkBuffer,
("FTL exception handler for %s",
toCString(CodeBlockWithJITType(m_plan.codeBlock.get(), JITCode::FTLJIT)).data()))
.executableMemory());
}
for (unsigned i = 0; i < outOfLineCodeInfos.size(); ++i) {
jitCode->addHandle(FINALIZE_DFG_CODE(
*outOfLineCodeInfos[i].m_linkBuffer,
("FTL out of line code for %s", outOfLineCodeInfos[i].m_codeDescription)).executableMemory());
}
jitCode->initializeArityCheckEntrypoint(
FINALIZE_DFG_CODE(
*entrypointLinkBuffer,
("FTL entrypoint thunk for %s with LLVM generated code at %p", toCString(CodeBlockWithJITType(m_plan.codeBlock.get(), JITCode::FTLJIT)).data(), function)));
m_plan.codeBlock->setJITCode(jitCode);
m_plan.vm.updateFTLLargestStackSize(jitCode->stackmaps.stackSize());
if (m_plan.compilation)
m_plan.vm.m_perBytecodeProfiler->addCompilation(m_plan.compilation);
return true;
}
} }
#endif // ENABLE(FTL_JIT)