summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp')
-rw-r--r--Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp87
1 files changed, 57 insertions, 30 deletions
diff --git a/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp b/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp
index 56bd9ee5e..a8a99b63a 100644
--- a/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp
+++ b/Source/JavaScriptCore/ftl/FTLJITFinalizer.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 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
@@ -30,9 +30,7 @@
#include "CodeBlockWithJITType.h"
#include "DFGPlan.h"
-#include "FTLState.h"
#include "FTLThunks.h"
-#include "ProfilerDatabase.h"
namespace JSC { namespace FTL {
@@ -47,19 +45,6 @@ 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();
@@ -68,22 +53,64 @@ bool JITFinalizer::finalize()
bool JITFinalizer::finalizeFunction()
{
- bool dumpDisassembly = shouldDumpDisassembly() || Options::asyncDisassembly();
+ for (unsigned i = jitCode->handles().size(); i--;) {
+ MacroAssembler::cacheFlush(
+ jitCode->handles()[i]->start(), jitCode->handles()[i]->sizeInBytes());
+ }
- 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)));
+ 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.
- m_plan.codeBlock->setJITCode(jitCode);
-
- if (m_plan.compilation)
- m_plan.vm.m_perBytecodeProfiler->addCompilation(m_plan.compilation);
+ 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());
+ }
+
+ 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)));
+
+ m_plan.codeBlock->setJITCode(jitCode, withArityCheck);
return true;
}