summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp')
-rw-r--r--Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp88
1 files changed, 31 insertions, 57 deletions
diff --git a/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp b/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp
index a8a99b63a..00ea651e1 100644
--- a/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp
+++ b/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2013-2014, 2016 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -30,7 +30,10 @@
#include "CodeBlockWithJITType.h"
#include "DFGPlan.h"
+#include "FTLState.h"
#include "FTLThunks.h"
+#include "JSCInlines.h"
+#include "ProfilerDatabase.h"
namespace JSC { namespace FTL {
@@ -45,6 +48,19 @@ JITFinalizer::~JITFinalizer()
{
}
+size_t JITFinalizer::codeSize()
+{
+ size_t result = 0;
+
+ if (b3CodeLinkBuffer)
+ result += b3CodeLinkBuffer->size();
+
+ if (entrypointLinkBuffer)
+ result += entrypointLinkBuffer->size();
+
+ return result;
+}
+
bool JITFinalizer::finalize()
{
RELEASE_ASSERT_NOT_REACHED();
@@ -53,64 +69,22 @@ bool JITFinalizer::finalize()
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.getRecordMap();
-
- 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()) {
- // It's OK, it was optimized out.
- continue;
- }
-
- exitThunksLinkBuffer->link(
- info.m_thunkJump,
- CodeLocationLabel(
- m_plan.vm.ftlThunks->getOSRExitGenerationThunk(
- m_plan.vm, Location::forStackmaps(
- &jitCode->stackmaps, iter->value.locations[0])).code()));
- }
-
- jitCode->initializeExitThunks(
- FINALIZE_DFG_CODE(
- *exitThunksLinkBuffer,
- ("FTL exit thunks for %s", toCString(CodeBlockWithJITType(m_plan.codeBlock.get(), JITCode::FTLJIT)).data())));
- } // else this function had no OSR exits, so no exit thunks.
-
- if (sideCodeLinkBuffer) {
- // Side code is for special slow paths that we generate ourselves, like for inline
- // caches.
-
- 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());
- }
+ bool dumpDisassembly = shouldDumpDisassembly() || Options::asyncDisassembly();
- MacroAssemblerCodePtr withArityCheck;
- if (arityCheck.isSet())
- withArityCheck = entrypointLinkBuffer->locationOf(arityCheck);
- jitCode->initializeCode(
- 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)));
+ jitCode->initializeB3Code(
+ FINALIZE_CODE_IF(
+ dumpDisassembly, *b3CodeLinkBuffer,
+ ("FTL B3 code for %s", toCString(CodeBlockWithJITType(m_plan.codeBlock, JITCode::FTLJIT)).data())));
+
+ jitCode->initializeArityCheckEntrypoint(
+ FINALIZE_CODE_IF(
+ dumpDisassembly, *entrypointLinkBuffer,
+ ("FTL entrypoint thunk for %s with B3 generated code at %p", toCString(CodeBlockWithJITType(m_plan.codeBlock, JITCode::FTLJIT)).data(), function)));
- m_plan.codeBlock->setJITCode(jitCode, withArityCheck);
+ m_plan.codeBlock->setJITCode(*jitCode);
+
+ if (m_plan.compilation)
+ m_plan.vm->m_perBytecodeProfiler->addCompilation(m_plan.codeBlock, *m_plan.compilation);
return true;
}