summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/dfg/DFGCapabilities.h
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/dfg/DFGCapabilities.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGCapabilities.h')
-rw-r--r--Source/JavaScriptCore/dfg/DFGCapabilities.h88
1 files changed, 60 insertions, 28 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGCapabilities.h b/Source/JavaScriptCore/dfg/DFGCapabilities.h
index 5bd80c517..dd4d06f5a 100644
--- a/Source/JavaScriptCore/dfg/DFGCapabilities.h
+++ b/Source/JavaScriptCore/dfg/DFGCapabilities.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011, 2012, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2011-2015 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -23,23 +23,21 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef DFGCapabilities_h
-#define DFGCapabilities_h
+#pragma once
#include "CodeBlock.h"
#include "DFGCommon.h"
-#include "DFGNode.h"
-#include "Executable.h"
#include "Interpreter.h"
#include "Intrinsic.h"
#include "Options.h"
-#include <wtf/Platform.h>
namespace JSC { namespace DFG {
#if ENABLE(DFG_JIT)
// Fast check functions; if they return true it is still necessary to
// check opcodes.
+bool isSupported();
+bool isSupportedForInlining(CodeBlock*);
bool mightCompileEval(CodeBlock*);
bool mightCompileProgram(CodeBlock*);
bool mightCompileFunctionForCall(CodeBlock*);
@@ -47,6 +45,7 @@ bool mightCompileFunctionForConstruct(CodeBlock*);
bool mightInlineFunctionForCall(CodeBlock*);
bool mightInlineFunctionForClosureCall(CodeBlock*);
bool mightInlineFunctionForConstruct(CodeBlock*);
+bool canUseOSRExitFuzzing(CodeBlock*);
inline CapabilityLevel capabilityLevel(OpcodeID opcodeID, CodeBlock* codeBlock, Instruction* pc);
@@ -59,6 +58,7 @@ inline bool mightCompileFunctionForConstruct(CodeBlock*) { return false; }
inline bool mightInlineFunctionForCall(CodeBlock*) { return false; }
inline bool mightInlineFunctionForClosureCall(CodeBlock*) { return false; }
inline bool mightInlineFunctionForConstruct(CodeBlock*) { return false; }
+inline bool canUseOSRExitFuzzing(CodeBlock*) { return false; }
inline CapabilityLevel capabilityLevel(OpcodeID, CodeBlock*, Instruction*) { return CannotCompile; }
inline CapabilityLevel capabilityLevel(CodeBlock*) { return CannotCompile; }
@@ -80,35 +80,56 @@ inline CapabilityLevel programCapabilityLevel(CodeBlock* codeBlock)
return capabilityLevel(codeBlock);
}
-inline CapabilityLevel functionForCallCapabilityLevel(CodeBlock* codeBlock)
+inline CapabilityLevel functionCapabilityLevel(bool mightCompile, bool mightInline, CapabilityLevel computedCapabilityLevel)
{
- if (!mightCompileFunctionForCall(codeBlock))
+ if (mightCompile && mightInline)
+ return leastUpperBound(CanCompileAndInline, computedCapabilityLevel);
+ if (mightCompile && !mightInline)
+ return leastUpperBound(CanCompile, computedCapabilityLevel);
+ if (!mightCompile)
return CannotCompile;
-
- return capabilityLevel(codeBlock);
+ RELEASE_ASSERT_NOT_REACHED();
+ return CannotCompile;
+}
+
+inline CapabilityLevel functionForCallCapabilityLevel(CodeBlock* codeBlock)
+{
+ return functionCapabilityLevel(
+ mightCompileFunctionForCall(codeBlock),
+ mightInlineFunctionForCall(codeBlock),
+ capabilityLevel(codeBlock));
}
inline CapabilityLevel functionForConstructCapabilityLevel(CodeBlock* codeBlock)
{
- if (!mightCompileFunctionForConstruct(codeBlock))
- return CannotCompile;
-
- return capabilityLevel(codeBlock);
+ return functionCapabilityLevel(
+ mightCompileFunctionForConstruct(codeBlock),
+ mightInlineFunctionForConstruct(codeBlock),
+ capabilityLevel(codeBlock));
}
-inline bool canInlineFunctionForCall(CodeBlock* codeBlock)
+inline CapabilityLevel inlineFunctionForCallCapabilityLevel(CodeBlock* codeBlock)
{
- return mightInlineFunctionForCall(codeBlock) && canInline(capabilityLevel(codeBlock));
+ if (!mightInlineFunctionForCall(codeBlock))
+ return CannotCompile;
+
+ return capabilityLevel(codeBlock);
}
-inline bool canInlineFunctionForClosureCall(CodeBlock* codeBlock)
+inline CapabilityLevel inlineFunctionForClosureCallCapabilityLevel(CodeBlock* codeBlock)
{
- return mightInlineFunctionForClosureCall(codeBlock) && canInline(capabilityLevel(codeBlock));
+ if (!mightInlineFunctionForClosureCall(codeBlock))
+ return CannotCompile;
+
+ return capabilityLevel(codeBlock);
}
-inline bool canInlineFunctionForConstruct(CodeBlock* codeBlock)
+inline CapabilityLevel inlineFunctionForConstructCapabilityLevel(CodeBlock* codeBlock)
{
- return mightInlineFunctionForConstruct(codeBlock) && canInline(capabilityLevel(codeBlock));
+ if (!mightInlineFunctionForConstruct(codeBlock))
+ return CannotCompile;
+
+ return capabilityLevel(codeBlock);
}
inline bool mightInlineFunctionFor(CodeBlock* codeBlock, CodeSpecializationKind kind)
@@ -119,24 +140,35 @@ inline bool mightInlineFunctionFor(CodeBlock* codeBlock, CodeSpecializationKind
return mightInlineFunctionForConstruct(codeBlock);
}
+inline bool mightCompileFunctionFor(CodeBlock* codeBlock, CodeSpecializationKind kind)
+{
+ if (kind == CodeForCall)
+ return mightCompileFunctionForCall(codeBlock);
+ ASSERT(kind == CodeForConstruct);
+ return mightCompileFunctionForConstruct(codeBlock);
+}
+
inline bool mightInlineFunction(CodeBlock* codeBlock)
{
return mightInlineFunctionFor(codeBlock, codeBlock->specializationKind());
}
-inline bool canInlineFunctionFor(CodeBlock* codeBlock, CodeSpecializationKind kind, bool isClosureCall)
+inline CapabilityLevel inlineFunctionForCapabilityLevel(CodeBlock* codeBlock, CodeSpecializationKind kind, bool isClosureCall)
{
if (isClosureCall) {
- ASSERT(kind == CodeForCall);
- return canInlineFunctionForClosureCall(codeBlock);
+ if (kind != CodeForCall)
+ return CannotCompile;
+ return inlineFunctionForClosureCallCapabilityLevel(codeBlock);
}
if (kind == CodeForCall)
- return canInlineFunctionForCall(codeBlock);
+ return inlineFunctionForCallCapabilityLevel(codeBlock);
ASSERT(kind == CodeForConstruct);
- return canInlineFunctionForConstruct(codeBlock);
+ return inlineFunctionForConstructCapabilityLevel(codeBlock);
}
-} } // namespace JSC::DFG
-
-#endif // DFGCapabilities_h
+inline bool isSmallEnoughToInlineCodeInto(CodeBlock* codeBlock)
+{
+ return codeBlock->instructionCount() <= Options::maximumInliningCallerSize();
+}
+} } // namespace JSC::DFG