Merge r169628 from ftlopt.
[WebKit-https.git] / Source / JavaScriptCore / ftl / FTLState.cpp
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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. 
24  */
25
26 #include "config.h"
27 #include "FTLState.h"
28
29 #if ENABLE(FTL_JIT)
30
31 #include "CodeBlockWithJITType.h"
32 #include "FTLForOSREntryJITCode.h"
33 #include "FTLJITCode.h"
34 #include "FTLJITFinalizer.h"
35 #include "InlineRuntimeSymbolTable.h"
36 #include <llvm/InitializeLLVM.h>
37 #include <stdio.h>
38
39 namespace JSC { namespace FTL {
40
41 using namespace DFG;
42
43 State::State(Graph& graph)
44     : graph(graph)
45     , context(llvm->ContextCreate())
46     , module(0)
47     , function(0)
48     , generatedFunction(0)
49     , compactUnwind(0)
50     , compactUnwindSize(0)
51 {
52
53 #define SYMBOL_TABLE_ADD(symbol, file) \
54     symbolTable.fastAdd(symbol, file);
55     FOR_EACH_LIBRARY_SYMBOL(SYMBOL_TABLE_ADD)
56 #undef SYMBOL_TABLE_ADD
57     
58     switch (graph.m_plan.mode) {
59     case FTLMode: {
60         jitCode = adoptRef(new JITCode());
61         break;
62     }
63     case FTLForOSREntryMode: {
64         RefPtr<ForOSREntryJITCode> code = adoptRef(new ForOSREntryJITCode());
65         code->initializeEntryBuffer(graph.m_vm, graph.m_profiledBlock->m_numCalleeRegisters);
66         code->setBytecodeIndex(graph.m_plan.osrEntryBytecodeIndex);
67         jitCode = code;
68         break;
69     }
70     default:
71         RELEASE_ASSERT_NOT_REACHED();
72         break;
73     }
74     
75     finalizer = new JITFinalizer(graph.m_plan);
76     graph.m_plan.finalizer = adoptPtr(finalizer);
77 }
78
79 State::~State()
80 {
81     llvm->ContextDispose(context);
82 }
83
84 void State::dumpState(const char* when)
85 {
86     dataLog("LLVM IR for ", CodeBlockWithJITType(graph.m_codeBlock, FTL::JITCode::FTLJIT), " ", when, ":\n");
87     dumpModule(module);
88 }
89
90 } } // namespace JSC::FTL
91
92 #endif // ENABLE(FTL_JIT)
93