Mercurial > hg > truffle
comparison src/share/vm/compiler/compileLog.cpp @ 6948:e522a00b91aa
Merge with http://hg.openjdk.java.net/hsx/hsx25/hotspot/ after NPG - C++ build works
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Mon, 12 Nov 2012 23:14:12 +0100 |
parents | c3e799c37717 |
children | cc32ccaaf47f |
comparison
equal
deleted
inserted
replaced
6711:ae13cc658b80 | 6948:e522a00b91aa |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
24 | 24 |
25 #include "precompiled.hpp" | 25 #include "precompiled.hpp" |
26 #include "ci/ciMethod.hpp" | 26 #include "ci/ciMethod.hpp" |
27 #include "compiler/compileLog.hpp" | 27 #include "compiler/compileLog.hpp" |
28 #include "memory/allocation.inline.hpp" | 28 #include "memory/allocation.inline.hpp" |
29 #include "oops/methodOop.hpp" | 29 #include "oops/method.hpp" |
30 #include "runtime/mutexLocker.hpp" | 30 #include "runtime/mutexLocker.hpp" |
31 #include "runtime/os.hpp" | 31 #include "runtime/os.hpp" |
32 | 32 |
33 CompileLog* CompileLog::_first = NULL; | 33 CompileLog* CompileLog::_first = NULL; |
34 | 34 |
97 } | 97 } |
98 | 98 |
99 | 99 |
100 // ------------------------------------------------------------------ | 100 // ------------------------------------------------------------------ |
101 // CompileLog::identify | 101 // CompileLog::identify |
102 int CompileLog::identify(ciObject* obj) { | 102 int CompileLog::identify(ciBaseObject* obj) { |
103 if (obj == NULL) return 0; | 103 if (obj == NULL) return 0; |
104 int id = obj->ident(); | 104 int id = obj->ident(); |
105 if (id < 0) return id; | 105 if (id < 0) return id; |
106 // If it has already been identified, just return the id. | 106 // If it has already been identified, just return the id. |
107 if (id < _identities_limit && _identities[id] != 0) return id; | 107 if (id < _identities_limit && _identities[id] != 0) return id; |
119 // Mark this id as processed. | 119 // Mark this id as processed. |
120 // (Be sure to do this before any recursive calls to identify.) | 120 // (Be sure to do this before any recursive calls to identify.) |
121 _identities[id] = 1; // mark | 121 _identities[id] = 1; // mark |
122 | 122 |
123 // Now, print the object's identity once, in detail. | 123 // Now, print the object's identity once, in detail. |
124 if (obj->is_klass()) { | 124 if (obj->is_metadata()) { |
125 ciKlass* klass = obj->as_klass(); | 125 ciMetadata* mobj = obj->as_metadata(); |
126 begin_elem("klass id='%d'", id); | 126 if (mobj->is_klass()) { |
127 name(klass->name()); | 127 ciKlass* klass = mobj->as_klass(); |
128 if (!klass->is_loaded()) { | 128 begin_elem("klass id='%d'", id); |
129 print(" unloaded='1'"); | 129 name(klass->name()); |
130 if (!klass->is_loaded()) { | |
131 print(" unloaded='1'"); | |
132 } else { | |
133 print(" flags='%d'", klass->modifier_flags()); | |
134 } | |
135 end_elem(); | |
136 } else if (mobj->is_method()) { | |
137 ciMethod* method = mobj->as_method(); | |
138 ciSignature* sig = method->signature(); | |
139 // Pre-identify items that we will need! | |
140 identify(sig->return_type()); | |
141 for (int i = 0; i < sig->count(); i++) { | |
142 identify(sig->type_at(i)); | |
143 } | |
144 begin_elem("method id='%d' holder='%d'", | |
145 id, identify(method->holder())); | |
146 name(method->name()); | |
147 print(" return='%d'", identify(sig->return_type())); | |
148 if (sig->count() > 0) { | |
149 print(" arguments='"); | |
150 for (int i = 0; i < sig->count(); i++) { | |
151 print((i == 0) ? "%d" : " %d", identify(sig->type_at(i))); | |
152 } | |
153 print("'"); | |
154 } | |
155 if (!method->is_loaded()) { | |
156 print(" unloaded='1'"); | |
157 } else { | |
158 print(" flags='%d'", (jchar) method->flags().as_int()); | |
159 // output a few metrics | |
160 print(" bytes='%d'", method->code_size()); | |
161 method->log_nmethod_identity(this); | |
162 //print(" count='%d'", method->invocation_count()); | |
163 //int bec = method->backedge_count(); | |
164 //if (bec != 0) print(" backedge_count='%d'", bec); | |
165 print(" iicount='%d'", method->interpreter_invocation_count()); | |
166 } | |
167 end_elem(); | |
168 } else if (mobj->is_type()) { | |
169 BasicType type = mobj->as_type()->basic_type(); | |
170 elem("type id='%d' name='%s'", id, type2name(type)); | |
130 } else { | 171 } else { |
131 print(" flags='%d'", klass->modifier_flags()); | 172 // Should not happen. |
173 elem("unknown id='%d'", id); | |
174 ShouldNotReachHere(); | |
132 } | 175 } |
133 end_elem(); | |
134 } else if (obj->is_method()) { | |
135 ciMethod* method = obj->as_method(); | |
136 ciSignature* sig = method->signature(); | |
137 // Pre-identify items that we will need! | |
138 identify(sig->return_type()); | |
139 for (int i = 0; i < sig->count(); i++) { | |
140 identify(sig->type_at(i)); | |
141 } | |
142 begin_elem("method id='%d' holder='%d'", | |
143 id, identify(method->holder())); | |
144 name(method->name()); | |
145 print(" return='%d'", identify(sig->return_type())); | |
146 if (sig->count() > 0) { | |
147 print(" arguments='"); | |
148 for (int i = 0; i < sig->count(); i++) { | |
149 print((i == 0) ? "%d" : " %d", identify(sig->type_at(i))); | |
150 } | |
151 print("'"); | |
152 } | |
153 if (!method->is_loaded()) { | |
154 print(" unloaded='1'"); | |
155 } else { | |
156 print(" flags='%d'", (jchar) method->flags().as_int()); | |
157 // output a few metrics | |
158 print(" bytes='%d'", method->code_size()); | |
159 method->log_nmethod_identity(this); | |
160 //print(" count='%d'", method->invocation_count()); | |
161 //int bec = method->backedge_count(); | |
162 //if (bec != 0) print(" backedge_count='%d'", bec); | |
163 print(" iicount='%d'", method->interpreter_invocation_count()); | |
164 } | |
165 end_elem(); | |
166 } else if (obj->is_symbol()) { | 176 } else if (obj->is_symbol()) { |
167 begin_elem("symbol id='%d'", id); | 177 begin_elem("symbol id='%d'", id); |
168 name(obj->as_symbol()); | 178 name(obj->as_symbol()); |
169 end_elem(); | 179 end_elem(); |
170 } else if (obj->is_null_object()) { | |
171 elem("null_object id='%d'", id); | |
172 } else if (obj->is_type()) { | |
173 BasicType type = obj->as_type()->basic_type(); | |
174 elem("type id='%d' name='%s'", id, type2name(type)); | |
175 } else { | 180 } else { |
176 // Should not happen. | 181 // Should not happen. |
177 elem("unknown id='%d'", id); | 182 elem("unknown id='%d'", id); |
178 } | 183 } |
179 return id; | 184 return id; |
295 // Just allocate a buffer and call finish_log_on_error(). | 300 // Just allocate a buffer and call finish_log_on_error(). |
296 void CompileLog::finish_log(outputStream* file) { | 301 void CompileLog::finish_log(outputStream* file) { |
297 char buf[4 * K]; | 302 char buf[4 * K]; |
298 finish_log_on_error(file, buf, sizeof(buf)); | 303 finish_log_on_error(file, buf, sizeof(buf)); |
299 } | 304 } |
305 | |
306 // ------------------------------------------------------------------ | |
307 // CompileLog::inline_success | |
308 // | |
309 // Print about successful method inlining. | |
310 void CompileLog::inline_success(const char* reason) { | |
311 begin_elem("inline_success reason='"); | |
312 text(reason); | |
313 end_elem("'"); | |
314 } | |
315 | |
316 // ------------------------------------------------------------------ | |
317 // CompileLog::inline_fail | |
318 // | |
319 // Print about failed method inlining. | |
320 void CompileLog::inline_fail(const char* reason) { | |
321 begin_elem("inline_fail reason='"); | |
322 text(reason); | |
323 end_elem("'"); | |
324 } | |
325 | |
326 // ------------------------------------------------------------------ | |
327 // CompileLog::set_context | |
328 // | |
329 // Set XML tag as an optional marker - it is printed only if | |
330 // there are other entries after until it is reset. | |
331 void CompileLog::set_context(const char* format, ...) { | |
332 va_list ap; | |
333 va_start(ap, format); | |
334 clear_context(); | |
335 _context.print("<"); | |
336 _context.vprint(format, ap); | |
337 _context.print_cr("/>"); | |
338 va_end(ap); | |
339 } | |
340 | |
341 // ------------------------------------------------------------------ | |
342 // CompileLog::code_cache_state | |
343 // | |
344 // Print code cache state. | |
345 void CompileLog::code_cache_state() { | |
346 begin_elem("code_cache"); | |
347 CodeCache::log_state(this); | |
348 end_elem(""); | |
349 } |