]>
git.saurik.com Git - apple/javascriptcore.git/blob - dfg/DFGDriver.cpp
2 * Copyright (C) 2011 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include "DFGDriver.h"
31 #include "DFGByteCodeParser.h"
32 #include "DFGCFAPhase.h"
33 #include "DFGCSEPhase.h"
34 #include "DFGFixupPhase.h"
35 #include "DFGJITCompiler.h"
36 #include "DFGPredictionPropagationPhase.h"
37 #include "DFGRedundantPhiEliminationPhase.h"
38 #include "DFGVirtualRegisterAllocationPhase.h"
40 namespace JSC
{ namespace DFG
{
42 enum CompileMode
{ CompileFunction
, CompileOther
};
43 inline bool compile(CompileMode compileMode
, JSGlobalData
& globalData
, CodeBlock
* codeBlock
, JITCode
& jitCode
, MacroAssemblerCodePtr
* jitCodeWithArityCheck
)
45 SamplingRegion
samplingRegion("DFG Compilation (Driver)");
48 ASSERT(codeBlock
->alternative());
49 ASSERT(codeBlock
->alternative()->getJITType() == JITCode::BaselineJIT
);
51 #if DFG_ENABLE(DEBUG_VERBOSE)
52 dataLog("DFG compiling code block %p(%p), number of instructions = %u.\n", codeBlock
, codeBlock
->alternative(), codeBlock
->instructionCount());
55 Graph
dfg(globalData
, codeBlock
);
59 if (compileMode
== CompileFunction
)
60 dfg
.predictArgumentTypes();
62 performRedundantPhiElimination(dfg
);
63 performPredictionPropagation(dfg
);
66 performVirtualRegisterAllocation(dfg
);
69 #if DFG_ENABLE(DEBUG_VERBOSE)
70 dataLog("Graph after optimization:\n");
74 JITCompiler
dataFlowJIT(dfg
);
76 if (compileMode
== CompileFunction
) {
77 ASSERT(jitCodeWithArityCheck
);
79 result
= dataFlowJIT
.compileFunction(jitCode
, *jitCodeWithArityCheck
);
81 ASSERT(compileMode
== CompileOther
);
82 ASSERT(!jitCodeWithArityCheck
);
84 result
= dataFlowJIT
.compile(jitCode
);
90 bool tryCompile(JSGlobalData
& globalData
, CodeBlock
* codeBlock
, JITCode
& jitCode
)
92 return compile(CompileOther
, globalData
, codeBlock
, jitCode
, 0);
95 bool tryCompileFunction(JSGlobalData
& globalData
, CodeBlock
* codeBlock
, JITCode
& jitCode
, MacroAssemblerCodePtr
& jitCodeWithArityCheck
)
97 return compile(CompileFunction
, globalData
, codeBlock
, jitCode
, &jitCodeWithArityCheck
);
100 } } // namespace JSC::DFG
102 #endif // ENABLE(DFG_JIT)