#include "config.h"
#include "DFGDriver.h"
#if ENABLE(DFG_JIT)
#include "DFGByteCodeParser.h"
#include "DFGJITCompiler.h"
#include "DFGPropagator.h"
namespace JSC { namespace DFG {
enum CompileMode { CompileFunction, CompileOther };
inline bool compile(CompileMode compileMode, ExecState* exec, CodeBlock* codeBlock, JITCode& jitCode, MacroAssemblerCodePtr* jitCodeWithArityCheck)
{
SamplingRegion samplingRegion("DFG Compilation (Driver)");
ASSERT(codeBlock);
ASSERT(codeBlock->alternative());
ASSERT(codeBlock->alternative()->getJITType() == JITCode::BaselineJIT);
#if DFG_ENABLE(DEBUG_VERBOSE)
fprintf(stderr, "DFG compiling code block %p(%p), number of instructions = %u.\n", codeBlock, codeBlock->alternative(), codeBlock->instructionCount());
#endif
JSGlobalData* globalData = &exec->globalData();
Graph dfg;
if (!parse(dfg, globalData, codeBlock))
return false;
if (compileMode == CompileFunction)
dfg.predictArgumentTypes(codeBlock);
propagate(dfg, globalData, codeBlock);
JITCompiler dataFlowJIT(globalData, dfg, codeBlock);
if (compileMode == CompileFunction) {
ASSERT(jitCodeWithArityCheck);
dataFlowJIT.compileFunction(jitCode, *jitCodeWithArityCheck);
} else {
ASSERT(compileMode == CompileOther);
ASSERT(!jitCodeWithArityCheck);
dataFlowJIT.compile(jitCode);
}
return true;
}
bool tryCompile(ExecState* exec, CodeBlock* codeBlock, JITCode& jitCode)
{
return compile(CompileOther, exec, codeBlock, jitCode, 0);
}
bool tryCompileFunction(ExecState* exec, CodeBlock* codeBlock, JITCode& jitCode, MacroAssemblerCodePtr& jitCodeWithArityCheck)
{
return compile(CompileFunction, exec, codeBlock, jitCode, &jitCodeWithArityCheck);
}
} }
#endif // ENABLE(DFG_JIT)