annotate src/share/vm/c1/c1_CFGPrinter.cpp @ 6197:d2a62e0f25eb

6995781: Native Memory Tracking (Phase 1) 7151532: DCmd for hotspot native memory tracking Summary: Implementation of native memory tracking phase 1, which tracks VM native memory usage, and related DCmd Reviewed-by: acorn, coleenp, fparain
author zgu
date Thu, 28 Jun 2012 17:03:16 -0400
parents f95d63e2154a
children b9a9ed0f8eeb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
2 * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
26 #include "c1/c1_CFGPrinter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
27 #include "c1/c1_IR.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
28 #include "c1/c1_InstructionPrinter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
29 #include "c1/c1_LIR.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
30 #include "c1/c1_LinearScan.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1819
diff changeset
31 #include "c1/c1_ValueStack.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
34
a61af66fc99e Initial load
duke
parents:
diff changeset
35
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
36 class CFGPrinterOutput : public CHeapObj<mtCompiler> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
37 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
38 outputStream* _output;
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 Compilation* _compilation;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 bool _do_print_HIR;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 bool _do_print_LIR;
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class PrintBlockClosure: public BlockClosure {
a61af66fc99e Initial load
duke
parents:
diff changeset
45 void block_do(BlockBegin* block) { if (block != NULL) CFGPrinter::output()->print_block(block); }
a61af66fc99e Initial load
duke
parents:
diff changeset
46 };
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 outputStream* output() { assert(_output != NULL, ""); return _output; }
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51 void inc_indent();
a61af66fc99e Initial load
duke
parents:
diff changeset
52 void dec_indent();
a61af66fc99e Initial load
duke
parents:
diff changeset
53 void print(const char* format, ...);
a61af66fc99e Initial load
duke
parents:
diff changeset
54 void print_begin(const char* tag);
a61af66fc99e Initial load
duke
parents:
diff changeset
55 void print_end(const char* tag);
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 char* method_name(ciMethod* method, bool short_name = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
60 CFGPrinterOutput();
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 void set_compilation(Compilation* compilation) { _compilation = compilation; }
a61af66fc99e Initial load
duke
parents:
diff changeset
63 void set_print_flags(bool do_print_HIR, bool do_print_LIR) { _do_print_HIR = do_print_HIR; _do_print_LIR = do_print_LIR; }
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65 void print_compilation();
a61af66fc99e Initial load
duke
parents:
diff changeset
66 void print_intervals(IntervalList* intervals, const char* name);
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 void print_state(BlockBegin* block);
a61af66fc99e Initial load
duke
parents:
diff changeset
69 void print_operand(Value instr);
a61af66fc99e Initial load
duke
parents:
diff changeset
70 void print_HIR(Value instr);
a61af66fc99e Initial load
duke
parents:
diff changeset
71 void print_HIR(BlockBegin* block);
a61af66fc99e Initial load
duke
parents:
diff changeset
72 void print_LIR(BlockBegin* block);
a61af66fc99e Initial load
duke
parents:
diff changeset
73 void print_block(BlockBegin* block);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 void print_cfg(BlockList* blocks, const char* name);
a61af66fc99e Initial load
duke
parents:
diff changeset
75 void print_cfg(IR* blocks, const char* name);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 };
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78 CFGPrinterOutput* CFGPrinter::_output = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 void CFGPrinter::print_compilation(Compilation* compilation) {
a61af66fc99e Initial load
duke
parents:
diff changeset
84 if (_output == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
85 _output = new CFGPrinterOutput();
a61af66fc99e Initial load
duke
parents:
diff changeset
86 }
a61af66fc99e Initial load
duke
parents:
diff changeset
87 output()->set_compilation(compilation);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 output()->print_compilation();
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 void CFGPrinter::print_cfg(BlockList* blocks, const char* name, bool do_print_HIR, bool do_print_LIR) {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 output()->set_print_flags(do_print_HIR, do_print_LIR);
a61af66fc99e Initial load
duke
parents:
diff changeset
93 output()->print_cfg(blocks, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 void CFGPrinter::print_cfg(IR* blocks, const char* name, bool do_print_HIR, bool do_print_LIR) {
a61af66fc99e Initial load
duke
parents:
diff changeset
97 output()->set_print_flags(do_print_HIR, do_print_LIR);
a61af66fc99e Initial load
duke
parents:
diff changeset
98 output()->print_cfg(blocks, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 void CFGPrinter::print_intervals(IntervalList* intervals, const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
103 output()->print_intervals(intervals, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
104 }
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 CFGPrinterOutput::CFGPrinterOutput()
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 1972
diff changeset
109 : _output(new(ResourceObj::C_HEAP, mtCompiler) fileStream("output.cfg"))
0
a61af66fc99e Initial load
duke
parents:
diff changeset
110 {
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 void CFGPrinterOutput::inc_indent() {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 output()->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
117 output()->inc();
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 void CFGPrinterOutput::dec_indent() {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 output()->dec();
a61af66fc99e Initial load
duke
parents:
diff changeset
122 output()->dec();
a61af66fc99e Initial load
duke
parents:
diff changeset
123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125 void CFGPrinterOutput::print(const char* format, ...) {
a61af66fc99e Initial load
duke
parents:
diff changeset
126 output()->indent();
a61af66fc99e Initial load
duke
parents:
diff changeset
127
a61af66fc99e Initial load
duke
parents:
diff changeset
128 va_list ap;
a61af66fc99e Initial load
duke
parents:
diff changeset
129 va_start(ap, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
130 output()->vprint_cr(format, ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
131 va_end(ap);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 void CFGPrinterOutput::print_begin(const char* tag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 output()->indent();
a61af66fc99e Initial load
duke
parents:
diff changeset
136 output()->print_cr("begin_%s", tag);
a61af66fc99e Initial load
duke
parents:
diff changeset
137 inc_indent();
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 void CFGPrinterOutput::print_end(const char* tag) {
a61af66fc99e Initial load
duke
parents:
diff changeset
141 dec_indent();
a61af66fc99e Initial load
duke
parents:
diff changeset
142 output()->indent();
a61af66fc99e Initial load
duke
parents:
diff changeset
143 output()->print_cr("end_%s", tag);
a61af66fc99e Initial load
duke
parents:
diff changeset
144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 char* CFGPrinterOutput::method_name(ciMethod* method, bool short_name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 stringStream name;
a61af66fc99e Initial load
duke
parents:
diff changeset
149 if (short_name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 method->print_short_name(&name);
a61af66fc99e Initial load
duke
parents:
diff changeset
151 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
152 method->print_name(&name);
a61af66fc99e Initial load
duke
parents:
diff changeset
153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
154 return name.as_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 void CFGPrinterOutput::print_compilation() {
a61af66fc99e Initial load
duke
parents:
diff changeset
160 print_begin("compilation");
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 print("name \"%s\"", method_name(_compilation->method(), true));
a61af66fc99e Initial load
duke
parents:
diff changeset
163 print("method \"%s\"", method_name(_compilation->method()));
a61af66fc99e Initial load
duke
parents:
diff changeset
164 print("date "INT64_FORMAT, os::javaTimeMillis());
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 print_end("compilation");
a61af66fc99e Initial load
duke
parents:
diff changeset
167 }
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 void CFGPrinterOutput::print_state(BlockBegin* block) {
a61af66fc99e Initial load
duke
parents:
diff changeset
174 print_begin("states");
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 InstructionPrinter ip(true, output());
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 ValueStack* state = block->state();
a61af66fc99e Initial load
duke
parents:
diff changeset
179 int index;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 Value value;
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 for_each_state(state) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 print_begin("locals");
a61af66fc99e Initial load
duke
parents:
diff changeset
184 print("size %d", state->locals_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
185 print("method \"%s\"", method_name(state->scope()->method()));
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 for_each_local_value(state, index, value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 ip.print_phi(index, value, block);
a61af66fc99e Initial load
duke
parents:
diff changeset
189 print_operand(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
190 output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192 print_end("locals");
1819
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
193
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
194 if (state->stack_size() > 0) {
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
195 print_begin("stack");
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
196 print("size %d", state->stack_size());
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
197 print("method \"%s\"", method_name(state->scope()->method()));
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
198
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
199 for_each_stack_value(state, index, value) {
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
200 ip.print_phi(index, value, block);
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
201 print_operand(value);
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
202 output()->cr();
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
203 }
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
204
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
205 print_end("stack");
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
206 }
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
207
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
208 if (state->locks_size() > 0) {
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
209 print_begin("locks");
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
210 print("size %d", state->locks_size());
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
211 print("method \"%s\"", method_name(state->scope()->method()));
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
212
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
213 for_each_lock_value(state, index, value) {
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
214 ip.print_phi(index, value, block);
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
215 print_operand(value);
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
216 output()->cr();
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
217 }
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
218 print_end("locks");
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
219 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 print_end("states");
a61af66fc99e Initial load
duke
parents:
diff changeset
223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
224
a61af66fc99e Initial load
duke
parents:
diff changeset
225
a61af66fc99e Initial load
duke
parents:
diff changeset
226 void CFGPrinterOutput::print_operand(Value instr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
227 if (instr->operand()->is_virtual()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 output()->print(" \"");
a61af66fc99e Initial load
duke
parents:
diff changeset
229 instr->operand()->print(output());
a61af66fc99e Initial load
duke
parents:
diff changeset
230 output()->print("\" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 }
a61af66fc99e Initial load
duke
parents:
diff changeset
233
a61af66fc99e Initial load
duke
parents:
diff changeset
234 void CFGPrinterOutput::print_HIR(Value instr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 InstructionPrinter ip(true, output());
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 if (instr->is_pinned()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 output()->put('.');
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
1819
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
240
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
241 output()->print("%d %d ", instr->printable_bci(), instr->use_count());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 print_operand(instr);
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 ip.print_temp(instr);
a61af66fc99e Initial load
duke
parents:
diff changeset
246 output()->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
247 ip.print_instr(instr);
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 output()->print_cr(" <|@");
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251
a61af66fc99e Initial load
duke
parents:
diff changeset
252 void CFGPrinterOutput::print_HIR(BlockBegin* block) {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 print_begin("HIR");
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 Value cur = block->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
256 while (cur != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
257 print_HIR(cur);
a61af66fc99e Initial load
duke
parents:
diff changeset
258 cur = cur->next();
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 print_end("HIR");
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 void CFGPrinterOutput::print_LIR(BlockBegin* block) {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 print_begin("LIR");
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 for (int i = 0; i < block->lir()->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
268 block->lir()->at(i)->print_on(output());
a61af66fc99e Initial load
duke
parents:
diff changeset
269 output()->print_cr(" <|@ ");
a61af66fc99e Initial load
duke
parents:
diff changeset
270 }
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 print_end("LIR");
a61af66fc99e Initial load
duke
parents:
diff changeset
273 }
a61af66fc99e Initial load
duke
parents:
diff changeset
274
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 void CFGPrinterOutput::print_block(BlockBegin* block) {
a61af66fc99e Initial load
duke
parents:
diff changeset
277 print_begin("block");
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 print("name \"B%d\"", block->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 print("from_bci %d", block->bci());
1819
f02a8bbe6ed4 6986046: C1 valuestack cleanup
roland
parents: 1552
diff changeset
282 print("to_bci %d", (block->end() == NULL ? -1 : block->end()->printable_bci()));
0
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 output()->indent();
a61af66fc99e Initial load
duke
parents:
diff changeset
285 output()->print("predecessors ");
a61af66fc99e Initial load
duke
parents:
diff changeset
286 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
287 for (i = 0; i < block->number_of_preds(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
288 output()->print("\"B%d\" ", block->pred_at(i)->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
289 }
a61af66fc99e Initial load
duke
parents:
diff changeset
290 output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292 output()->indent();
a61af66fc99e Initial load
duke
parents:
diff changeset
293 output()->print("successors ");
a61af66fc99e Initial load
duke
parents:
diff changeset
294 for (i = 0; i < block->number_of_sux(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 output()->print("\"B%d\" ", block->sux_at(i)->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
297 output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299 output()->indent();
a61af66fc99e Initial load
duke
parents:
diff changeset
300 output()->print("xhandlers");
a61af66fc99e Initial load
duke
parents:
diff changeset
301 for (i = 0; i < block->number_of_exception_handlers(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 output()->print("\"B%d\" ", block->exception_handler_at(i)->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
304 output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
305
a61af66fc99e Initial load
duke
parents:
diff changeset
306 output()->indent();
a61af66fc99e Initial load
duke
parents:
diff changeset
307 output()->print("flags ");
a61af66fc99e Initial load
duke
parents:
diff changeset
308 if (block->is_set(BlockBegin::std_entry_flag)) output()->print("\"std\" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
309 if (block->is_set(BlockBegin::osr_entry_flag)) output()->print("\"osr\" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
310 if (block->is_set(BlockBegin::exception_entry_flag)) output()->print("\"ex\" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
311 if (block->is_set(BlockBegin::subroutine_entry_flag)) output()->print("\"sr\" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
312 if (block->is_set(BlockBegin::backward_branch_target_flag)) output()->print("\"bb\" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
313 if (block->is_set(BlockBegin::parser_loop_header_flag)) output()->print("\"plh\" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
314 if (block->is_set(BlockBegin::critical_edge_split_flag)) output()->print("\"ces\" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
315 if (block->is_set(BlockBegin::linear_scan_loop_header_flag)) output()->print("\"llh\" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
316 if (block->is_set(BlockBegin::linear_scan_loop_end_flag)) output()->print("\"lle\" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
317 output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 if (block->dominator() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 print("dominator \"B%d\"", block->dominator()->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
321 }
a61af66fc99e Initial load
duke
parents:
diff changeset
322 if (block->loop_index() != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
323 print("loop_index %d", block->loop_index());
a61af66fc99e Initial load
duke
parents:
diff changeset
324 print("loop_depth %d", block->loop_depth());
a61af66fc99e Initial load
duke
parents:
diff changeset
325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
326
a61af66fc99e Initial load
duke
parents:
diff changeset
327 if (block->first_lir_instruction_id() != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
328 print("first_lir_id %d", block->first_lir_instruction_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
329 print("last_lir_id %d", block->last_lir_instruction_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 if (_do_print_HIR) {
a61af66fc99e Initial load
duke
parents:
diff changeset
333 print_state(block);
a61af66fc99e Initial load
duke
parents:
diff changeset
334 print_HIR(block);
a61af66fc99e Initial load
duke
parents:
diff changeset
335 }
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 if (_do_print_LIR) {
a61af66fc99e Initial load
duke
parents:
diff changeset
338 print_LIR(block);
a61af66fc99e Initial load
duke
parents:
diff changeset
339 }
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 print_end("block");
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345
a61af66fc99e Initial load
duke
parents:
diff changeset
346 void CFGPrinterOutput::print_cfg(BlockList* blocks, const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
347 print_begin("cfg");
a61af66fc99e Initial load
duke
parents:
diff changeset
348 print("name \"%s\"", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 PrintBlockClosure print_block;
a61af66fc99e Initial load
duke
parents:
diff changeset
351 blocks->iterate_forward(&print_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353 print_end("cfg");
a61af66fc99e Initial load
duke
parents:
diff changeset
354 output()->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
355 }
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 void CFGPrinterOutput::print_cfg(IR* blocks, const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 print_begin("cfg");
a61af66fc99e Initial load
duke
parents:
diff changeset
359 print("name \"%s\"", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 PrintBlockClosure print_block;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 blocks->iterate_preorder(&print_block);
a61af66fc99e Initial load
duke
parents:
diff changeset
363
a61af66fc99e Initial load
duke
parents:
diff changeset
364 print_end("cfg");
a61af66fc99e Initial load
duke
parents:
diff changeset
365 output()->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
366 }
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368
a61af66fc99e Initial load
duke
parents:
diff changeset
369
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 void CFGPrinterOutput::print_intervals(IntervalList* intervals, const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
372 print_begin("intervals");
a61af66fc99e Initial load
duke
parents:
diff changeset
373 print("name \"%s\"", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 for (int i = 0; i < intervals->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 if (intervals->at(i) != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 intervals->at(i)->print(output());
a61af66fc99e Initial load
duke
parents:
diff changeset
378 }
a61af66fc99e Initial load
duke
parents:
diff changeset
379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
380
a61af66fc99e Initial load
duke
parents:
diff changeset
381 print_end("intervals");
a61af66fc99e Initial load
duke
parents:
diff changeset
382 output()->flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
384
a61af66fc99e Initial load
duke
parents:
diff changeset
385
a61af66fc99e Initial load
duke
parents:
diff changeset
386 #endif