40 #include "prims/nativeLookup.hpp" |
40 #include "prims/nativeLookup.hpp" |
41 #include "runtime/arguments.hpp" |
41 #include "runtime/arguments.hpp" |
42 #include "runtime/interfaceSupport.hpp" |
42 #include "runtime/interfaceSupport.hpp" |
43 #include "runtime/sharedRuntime.hpp" |
43 #include "runtime/sharedRuntime.hpp" |
44 |
44 |
45 volatile int Compiler::_runtimes = uninitialized; |
|
46 |
45 |
47 Compiler::Compiler() { |
46 Compiler::Compiler () {} |
48 } |
|
49 |
47 |
50 |
48 void Compiler::init_c1_runtime() { |
51 Compiler::~Compiler() { |
|
52 Unimplemented(); |
|
53 } |
|
54 |
|
55 |
|
56 void Compiler::initialize_all() { |
|
57 BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob(); |
49 BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob(); |
58 Arena* arena = new (mtCompiler) Arena(); |
50 Arena* arena = new (mtCompiler) Arena(); |
59 Runtime1::initialize(buffer_blob); |
51 Runtime1::initialize(buffer_blob); |
60 FrameMap::initialize(); |
52 FrameMap::initialize(); |
61 // initialize data structures |
53 // initialize data structures |
62 ValueType::initialize(arena); |
54 ValueType::initialize(arena); |
63 // Instruction::initialize(); |
|
64 // BlockBegin::initialize(); |
|
65 GraphBuilder::initialize(); |
55 GraphBuilder::initialize(); |
66 // note: to use more than one instance of LinearScan at a time this function call has to |
56 // note: to use more than one instance of LinearScan at a time this function call has to |
67 // be moved somewhere outside of this constructor: |
57 // be moved somewhere outside of this constructor: |
68 Interval::initialize(arena); |
58 Interval::initialize(arena); |
69 } |
59 } |
70 |
60 |
71 |
61 |
72 void Compiler::initialize() { |
62 void Compiler::initialize() { |
73 if (_runtimes != initialized) { |
63 // Buffer blob must be allocated per C1 compiler thread at startup |
74 initialize_runtimes( initialize_all, &_runtimes); |
64 BufferBlob* buffer_blob = init_buffer_blob(); |
|
65 |
|
66 if (should_perform_init()) { |
|
67 if (buffer_blob == NULL) { |
|
68 // When we come here we are in state 'initializing'; entire C1 compilation |
|
69 // can be shut down. |
|
70 set_state(failed); |
|
71 } else { |
|
72 init_c1_runtime(); |
|
73 set_state(initialized); |
|
74 } |
75 } |
75 } |
76 mark_initialized(); |
|
77 } |
76 } |
78 |
77 |
79 |
78 BufferBlob* Compiler::init_buffer_blob() { |
80 BufferBlob* Compiler::get_buffer_blob(ciEnv* env) { |
|
81 // Allocate buffer blob once at startup since allocation for each |
79 // Allocate buffer blob once at startup since allocation for each |
82 // compilation seems to be too expensive (at least on Intel win32). |
80 // compilation seems to be too expensive (at least on Intel win32). |
83 BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob(); |
81 assert (CompilerThread::current()->get_buffer_blob() == NULL, "Should initialize only once"); |
84 if (buffer_blob != NULL) { |
|
85 return buffer_blob; |
|
86 } |
|
87 |
82 |
88 // setup CodeBuffer. Preallocate a BufferBlob of size |
83 // setup CodeBuffer. Preallocate a BufferBlob of size |
89 // NMethodSizeLimit plus some extra space for constants. |
84 // NMethodSizeLimit plus some extra space for constants. |
90 int code_buffer_size = Compilation::desired_max_code_buffer_size() + |
85 int code_buffer_size = Compilation::desired_max_code_buffer_size() + |
91 Compilation::desired_max_constant_size(); |
86 Compilation::desired_max_constant_size(); |
92 |
87 |
93 buffer_blob = BufferBlob::create("Compiler1 temporary CodeBuffer", |
88 BufferBlob* buffer_blob = BufferBlob::create("C1 temporary CodeBuffer", code_buffer_size); |
94 code_buffer_size); |
89 if (buffer_blob != NULL) { |
95 if (buffer_blob == NULL) { |
|
96 CompileBroker::handle_full_code_cache(); |
|
97 env->record_failure("CodeCache is full"); |
|
98 } else { |
|
99 CompilerThread::current()->set_buffer_blob(buffer_blob); |
90 CompilerThread::current()->set_buffer_blob(buffer_blob); |
100 } |
91 } |
101 |
92 |
102 return buffer_blob; |
93 return buffer_blob; |
103 } |
94 } |
104 |
95 |
105 |
96 |
106 void Compiler::compile_method(ciEnv* env, ciMethod* method, int entry_bci) { |
97 void Compiler::compile_method(ciEnv* env, ciMethod* method, int entry_bci) { |
107 BufferBlob* buffer_blob = Compiler::get_buffer_blob(env); |
98 BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob(); |
108 if (buffer_blob == NULL) { |
99 assert(buffer_blob != NULL, "Must exist"); |
109 return; |
|
110 } |
|
111 |
|
112 if (!is_initialized()) { |
|
113 initialize(); |
|
114 } |
|
115 |
|
116 // invoke compilation |
100 // invoke compilation |
117 { |
101 { |
118 // We are nested here because we need for the destructor |
102 // We are nested here because we need for the destructor |
119 // of Compilation to occur before we release the any |
103 // of Compilation to occur before we release the any |
120 // competing compiler thread |
104 // competing compiler thread |