Mercurial > hg > graal-compiler
comparison src/share/vm/c1/c1_Compiler.cpp @ 13086:096c224171c4
Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Wed, 20 Nov 2013 00:10:38 +0100 |
parents | 836a62f43af9 469216acdb28 |
children | d8041d695d19 |
comparison
equal
deleted
inserted
replaced
12782:92b7ec34ddfa | 13086:096c224171c4 |
---|---|
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() : AbstractCompiler(c1) { | 46 Compiler::Compiler() : AbstractCompiler(c1) { |
48 } | 47 } |
49 | 48 |
50 | 49 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(); | 50 BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob(); |
58 Arena* arena = new (mtCompiler) Arena(); | 51 Arena* arena = new (mtCompiler) Arena(); |
59 Runtime1::initialize(buffer_blob); | 52 Runtime1::initialize(buffer_blob); |
60 FrameMap::initialize(); | 53 FrameMap::initialize(); |
61 // initialize data structures | 54 // initialize data structures |
62 ValueType::initialize(arena); | 55 ValueType::initialize(arena); |
63 // Instruction::initialize(); | |
64 // BlockBegin::initialize(); | |
65 GraphBuilder::initialize(); | 56 GraphBuilder::initialize(); |
66 // note: to use more than one instance of LinearScan at a time this function call has to | 57 // 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: | 58 // be moved somewhere outside of this constructor: |
68 Interval::initialize(arena); | 59 Interval::initialize(arena); |
69 } | 60 } |
70 | 61 |
71 | 62 |
72 void Compiler::initialize() { | 63 void Compiler::initialize() { |
73 if (_runtimes != initialized) { | 64 // Buffer blob must be allocated per C1 compiler thread at startup |
74 initialize_runtimes( initialize_all, &_runtimes); | 65 BufferBlob* buffer_blob = init_buffer_blob(); |
66 | |
67 if (should_perform_init()) { | |
68 if (buffer_blob == NULL) { | |
69 // When we come here we are in state 'initializing'; entire C1 compilation | |
70 // can be shut down. | |
71 set_state(failed); | |
72 } else { | |
73 init_c1_runtime(); | |
74 set_state(initialized); | |
75 } | |
75 } | 76 } |
76 mark_initialized(); | |
77 } | 77 } |
78 | 78 |
79 | 79 BufferBlob* Compiler::init_buffer_blob() { |
80 BufferBlob* Compiler::get_buffer_blob(ciEnv* env) { | |
81 // Allocate buffer blob once at startup since allocation for each | 80 // Allocate buffer blob once at startup since allocation for each |
82 // compilation seems to be too expensive (at least on Intel win32). | 81 // compilation seems to be too expensive (at least on Intel win32). |
83 BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob(); | 82 assert (CompilerThread::current()->get_buffer_blob() == NULL, "Should initialize only once"); |
84 if (buffer_blob != NULL) { | |
85 return buffer_blob; | |
86 } | |
87 | 83 |
88 // setup CodeBuffer. Preallocate a BufferBlob of size | 84 // setup CodeBuffer. Preallocate a BufferBlob of size |
89 // NMethodSizeLimit plus some extra space for constants. | 85 // NMethodSizeLimit plus some extra space for constants. |
90 int code_buffer_size = Compilation::desired_max_code_buffer_size() + | 86 int code_buffer_size = Compilation::desired_max_code_buffer_size() + |
91 Compilation::desired_max_constant_size(); | 87 Compilation::desired_max_constant_size(); |
92 | 88 |
93 buffer_blob = BufferBlob::create("Compiler1 temporary CodeBuffer", | 89 BufferBlob* buffer_blob = BufferBlob::create("C1 temporary CodeBuffer", code_buffer_size); |
94 code_buffer_size); | 90 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); | 91 CompilerThread::current()->set_buffer_blob(buffer_blob); |
100 } | 92 } |
101 | 93 |
102 return buffer_blob; | 94 return buffer_blob; |
103 } | 95 } |
104 | 96 |
105 | 97 |
106 void Compiler::compile_method(ciEnv* env, ciMethod* method, int entry_bci) { | 98 void Compiler::compile_method(ciEnv* env, ciMethod* method, int entry_bci) { |
107 BufferBlob* buffer_blob = Compiler::get_buffer_blob(env); | 99 BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob(); |
108 if (buffer_blob == NULL) { | 100 assert(buffer_blob != NULL, "Must exist"); |
109 return; | |
110 } | |
111 | |
112 if (!is_initialized()) { | |
113 initialize(); | |
114 } | |
115 | |
116 // invoke compilation | 101 // invoke compilation |
117 { | 102 { |
118 // We are nested here because we need for the destructor | 103 // We are nested here because we need for the destructor |
119 // of Compilation to occur before we release the any | 104 // of Compilation to occur before we release the any |
120 // competing compiler thread | 105 // competing compiler thread |