annotate src/share/vm/c1/c1_InstructionPrinter.cpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents c18cbe5936b8
children d5d065957597
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 989
diff changeset
2 * Copyright (c) 1999, 2006, 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: 989
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 989
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: 989
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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_c1_InstructionPrinter.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31 const char* InstructionPrinter::basic_type_name(BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
32 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
33 case T_BOOLEAN: return "boolean";
a61af66fc99e Initial load
duke
parents:
diff changeset
34 case T_BYTE : return "byte";
a61af66fc99e Initial load
duke
parents:
diff changeset
35 case T_CHAR : return "char";
a61af66fc99e Initial load
duke
parents:
diff changeset
36 case T_SHORT : return "short";
a61af66fc99e Initial load
duke
parents:
diff changeset
37 case T_INT : return "int";
a61af66fc99e Initial load
duke
parents:
diff changeset
38 case T_LONG : return "long";
a61af66fc99e Initial load
duke
parents:
diff changeset
39 case T_FLOAT : return "float";
a61af66fc99e Initial load
duke
parents:
diff changeset
40 case T_DOUBLE : return "double";
a61af66fc99e Initial load
duke
parents:
diff changeset
41 case T_ARRAY : return "array";
a61af66fc99e Initial load
duke
parents:
diff changeset
42 case T_OBJECT : return "object";
a61af66fc99e Initial load
duke
parents:
diff changeset
43 default : return "???";
a61af66fc99e Initial load
duke
parents:
diff changeset
44 }
a61af66fc99e Initial load
duke
parents:
diff changeset
45 }
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47
a61af66fc99e Initial load
duke
parents:
diff changeset
48 const char* InstructionPrinter::cond_name(If::Condition cond) {
a61af66fc99e Initial load
duke
parents:
diff changeset
49 switch (cond) {
a61af66fc99e Initial load
duke
parents:
diff changeset
50 case If::eql: return "==";
a61af66fc99e Initial load
duke
parents:
diff changeset
51 case If::neq: return "!=";
a61af66fc99e Initial load
duke
parents:
diff changeset
52 case If::lss: return "<";
a61af66fc99e Initial load
duke
parents:
diff changeset
53 case If::leq: return "<=";
a61af66fc99e Initial load
duke
parents:
diff changeset
54 case If::gtr: return ">";
a61af66fc99e Initial load
duke
parents:
diff changeset
55 case If::geq: return ">=";
a61af66fc99e Initial load
duke
parents:
diff changeset
56 }
a61af66fc99e Initial load
duke
parents:
diff changeset
57 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
58 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 }
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 const char* InstructionPrinter::op_name(Bytecodes::Code op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
63 switch (op) {
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // arithmetic ops
a61af66fc99e Initial load
duke
parents:
diff changeset
65 case Bytecodes::_iadd : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
66 case Bytecodes::_ladd : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
67 case Bytecodes::_fadd : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
68 case Bytecodes::_dadd : return "+";
a61af66fc99e Initial load
duke
parents:
diff changeset
69 case Bytecodes::_isub : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
70 case Bytecodes::_lsub : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
71 case Bytecodes::_fsub : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
72 case Bytecodes::_dsub : return "-";
a61af66fc99e Initial load
duke
parents:
diff changeset
73 case Bytecodes::_imul : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
74 case Bytecodes::_lmul : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
75 case Bytecodes::_fmul : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
76 case Bytecodes::_dmul : return "*";
a61af66fc99e Initial load
duke
parents:
diff changeset
77 case Bytecodes::_idiv : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
78 case Bytecodes::_ldiv : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
79 case Bytecodes::_fdiv : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
80 case Bytecodes::_ddiv : return "/";
a61af66fc99e Initial load
duke
parents:
diff changeset
81 case Bytecodes::_irem : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
82 case Bytecodes::_lrem : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
83 case Bytecodes::_frem : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
84 case Bytecodes::_drem : return "%";
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // shift ops
a61af66fc99e Initial load
duke
parents:
diff changeset
86 case Bytecodes::_ishl : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
87 case Bytecodes::_lshl : return "<<";
a61af66fc99e Initial load
duke
parents:
diff changeset
88 case Bytecodes::_ishr : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
89 case Bytecodes::_lshr : return ">>";
a61af66fc99e Initial load
duke
parents:
diff changeset
90 case Bytecodes::_iushr: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
91 case Bytecodes::_lushr: return ">>>";
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // logic ops
a61af66fc99e Initial load
duke
parents:
diff changeset
93 case Bytecodes::_iand : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
94 case Bytecodes::_land : return "&";
a61af66fc99e Initial load
duke
parents:
diff changeset
95 case Bytecodes::_ior : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
96 case Bytecodes::_lor : return "|";
a61af66fc99e Initial load
duke
parents:
diff changeset
97 case Bytecodes::_ixor : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
98 case Bytecodes::_lxor : return "^";
a61af66fc99e Initial load
duke
parents:
diff changeset
99 }
a61af66fc99e Initial load
duke
parents:
diff changeset
100 return Bytecodes::name(op);
a61af66fc99e Initial load
duke
parents:
diff changeset
101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 bool InstructionPrinter::is_illegal_phi(Value v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
105 Phi* phi = v ? v->as_Phi() : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 if (phi && phi->is_illegal()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109 return false;
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 bool InstructionPrinter::is_phi_of_block(Value v, BlockBegin* b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 Phi* phi = v ? v->as_Phi() : NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 return phi && phi->block() == b;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 void InstructionPrinter::print_klass(ciKlass* klass) {
a61af66fc99e Initial load
duke
parents:
diff changeset
120 klass->name()->print_symbol_on(output());
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 void InstructionPrinter::print_object(Value obj) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 ValueType* type = obj->type();
a61af66fc99e Initial load
duke
parents:
diff changeset
126 if (type->as_ObjectConstant() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
127 ciObject* value = type->as_ObjectConstant()->value();
a61af66fc99e Initial load
duke
parents:
diff changeset
128 if (value->is_null_object()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
129 output()->print("null");
a61af66fc99e Initial load
duke
parents:
diff changeset
130 } else if (!value->is_loaded()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
131 output()->print("<unloaded object 0x%x>", value);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 } else if (value->is_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
133 ciMethod* m = (ciMethod*)value;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 output()->print("<method %s.%s>", m->holder()->name()->as_utf8(), m->name()->as_utf8());
a61af66fc99e Initial load
duke
parents:
diff changeset
135 } else {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
136 output()->print("<object 0x%x>", value->constant_encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
138 } else if (type->as_InstanceConstant() != NULL) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
139 output()->print("<instance 0x%x>", type->as_InstanceConstant()->value()->constant_encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
140 } else if (type->as_ArrayConstant() != NULL) {
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
141 output()->print("<array 0x%x>", type->as_ArrayConstant()->value()->constant_encoding());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
142 } else if (type->as_ClassConstant() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 ciInstanceKlass* klass = type->as_ClassConstant()->value();
a61af66fc99e Initial load
duke
parents:
diff changeset
144 if (!klass->is_loaded()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 output()->print("<unloaded> ");
a61af66fc99e Initial load
duke
parents:
diff changeset
146 }
a61af66fc99e Initial load
duke
parents:
diff changeset
147 output()->print("class ");
a61af66fc99e Initial load
duke
parents:
diff changeset
148 print_klass(klass);
a61af66fc99e Initial load
duke
parents:
diff changeset
149 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
150 output()->print("???");
a61af66fc99e Initial load
duke
parents:
diff changeset
151 }
a61af66fc99e Initial load
duke
parents:
diff changeset
152 }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 void InstructionPrinter::print_temp(Value value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
156 output()->print("%c%d", value->type()->tchar(), value->id());
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 void InstructionPrinter::print_field(AccessField* field) {
a61af66fc99e Initial load
duke
parents:
diff changeset
161 print_value(field->obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
162 output()->print("._%d", field->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 void InstructionPrinter::print_indexed(AccessIndexed* indexed) {
a61af66fc99e Initial load
duke
parents:
diff changeset
167 print_value(indexed->array());
a61af66fc99e Initial load
duke
parents:
diff changeset
168 output()->put('[');
a61af66fc99e Initial load
duke
parents:
diff changeset
169 print_value(indexed->index());
a61af66fc99e Initial load
duke
parents:
diff changeset
170 output()->put(']');
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 void InstructionPrinter::print_monitor(AccessMonitor* monitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 output()->print("monitor[%d](", monitor->monitor_no());
a61af66fc99e Initial load
duke
parents:
diff changeset
176 print_value(monitor->obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
177 output()->put(')');
a61af66fc99e Initial load
duke
parents:
diff changeset
178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 void InstructionPrinter::print_op2(Op2* instr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
182 print_value(instr->x());
a61af66fc99e Initial load
duke
parents:
diff changeset
183 output()->print(" %s ", op_name(instr->op()));
a61af66fc99e Initial load
duke
parents:
diff changeset
184 print_value(instr->y());
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 void InstructionPrinter::print_value(Value value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
189 if (value == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
190 output()->print("NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
191 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
192 print_temp(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 void InstructionPrinter::print_instr(Instruction* instr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 instr->visit(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 void InstructionPrinter::print_stack(ValueStack* stack) {
a61af66fc99e Initial load
duke
parents:
diff changeset
203 int start_position = output()->position();
a61af66fc99e Initial load
duke
parents:
diff changeset
204 if (stack->stack_is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 output()->print("empty stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
206 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 output()->print("stack [");
a61af66fc99e Initial load
duke
parents:
diff changeset
208 for (int i = 0; i < stack->stack_size();) {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 if (i > 0) output()->print(", ");
a61af66fc99e Initial load
duke
parents:
diff changeset
210 output()->print("%d:", i);
a61af66fc99e Initial load
duke
parents:
diff changeset
211 Value value = stack->stack_at_inc(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
212 print_value(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 Phi* phi = value->as_Phi();
a61af66fc99e Initial load
duke
parents:
diff changeset
214 if (phi != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
215 if (phi->operand()->is_valid()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 output()->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
217 phi->operand()->print(output());
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220 }
a61af66fc99e Initial load
duke
parents:
diff changeset
221 output()->put(']');
a61af66fc99e Initial load
duke
parents:
diff changeset
222 }
a61af66fc99e Initial load
duke
parents:
diff changeset
223 if (!stack->no_active_locks()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // print out the lines on the line below this
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // one at the same indentation level.
a61af66fc99e Initial load
duke
parents:
diff changeset
226 output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
227 fill_to(start_position, ' ');
a61af66fc99e Initial load
duke
parents:
diff changeset
228 output()->print("locks [");
a61af66fc99e Initial load
duke
parents:
diff changeset
229 for (int i = i = 0; i < stack->locks_size(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
230 Value t = stack->lock_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 if (i > 0) output()->print(", ");
a61af66fc99e Initial load
duke
parents:
diff changeset
232 output()->print("%d:", i);
a61af66fc99e Initial load
duke
parents:
diff changeset
233 if (t == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // synchronized methods push null on the lock stack
a61af66fc99e Initial load
duke
parents:
diff changeset
235 output()->print("this");
a61af66fc99e Initial load
duke
parents:
diff changeset
236 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 print_value(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240 output()->print("]");
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 void InstructionPrinter::print_inline_level(BlockBegin* block) {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 output()->print_cr("inlining depth %d", block->scope()->level());
a61af66fc99e Initial load
duke
parents:
diff changeset
247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 void InstructionPrinter::print_unsafe_op(UnsafeOp* op, const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 output()->print(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
252 output()->print(".(");
a61af66fc99e Initial load
duke
parents:
diff changeset
253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
254
a61af66fc99e Initial load
duke
parents:
diff changeset
255 void InstructionPrinter::print_unsafe_raw_op(UnsafeRawOp* op, const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
256 print_unsafe_op(op, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
257 output()->print("base ");
a61af66fc99e Initial load
duke
parents:
diff changeset
258 print_value(op->base());
a61af66fc99e Initial load
duke
parents:
diff changeset
259 if (op->has_index()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
260 output()->print(", index "); print_value(op->index());
a61af66fc99e Initial load
duke
parents:
diff changeset
261 output()->print(", log2_scale %d", op->log2_scale());
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 void InstructionPrinter::print_unsafe_object_op(UnsafeObjectOp* op, const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
267 print_unsafe_op(op, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 print_value(op->object());
a61af66fc99e Initial load
duke
parents:
diff changeset
269 output()->print(", ");
a61af66fc99e Initial load
duke
parents:
diff changeset
270 print_value(op->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
271 }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 void InstructionPrinter::print_phi(int i, Value v, BlockBegin* b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
275 Phi* phi = v->as_Phi();
a61af66fc99e Initial load
duke
parents:
diff changeset
276 output()->print("%2d ", i);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 print_value(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // print phi operands
a61af66fc99e Initial load
duke
parents:
diff changeset
279 if (phi && phi->block() == b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
280 output()->print(" [");
a61af66fc99e Initial load
duke
parents:
diff changeset
281 for (int j = 0; j < phi->operand_count(); j ++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 output()->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
283 Value opd = phi->operand_at(j);
a61af66fc99e Initial load
duke
parents:
diff changeset
284 if (opd) print_value(opd);
a61af66fc99e Initial load
duke
parents:
diff changeset
285 else output()->print("NULL");
a61af66fc99e Initial load
duke
parents:
diff changeset
286 }
a61af66fc99e Initial load
duke
parents:
diff changeset
287 output()->print("] ");
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
289 print_alias(v);
a61af66fc99e Initial load
duke
parents:
diff changeset
290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
291
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 void InstructionPrinter::print_alias(Value v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
294 if (v != v->subst()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 output()->print("alias "); print_value(v->subst());
a61af66fc99e Initial load
duke
parents:
diff changeset
296 }
a61af66fc99e Initial load
duke
parents:
diff changeset
297 }
a61af66fc99e Initial load
duke
parents:
diff changeset
298
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 void InstructionPrinter::fill_to(int pos, char filler) {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 while (output()->position() < pos) output()->put(filler);
a61af66fc99e Initial load
duke
parents:
diff changeset
302 }
a61af66fc99e Initial load
duke
parents:
diff changeset
303
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 void InstructionPrinter::print_head() {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 const char filler = '_';
a61af66fc99e Initial load
duke
parents:
diff changeset
307 fill_to(bci_pos , filler); output()->print("bci" );
a61af66fc99e Initial load
duke
parents:
diff changeset
308 fill_to(use_pos , filler); output()->print("use" );
a61af66fc99e Initial load
duke
parents:
diff changeset
309 fill_to(temp_pos , filler); output()->print("tid" );
a61af66fc99e Initial load
duke
parents:
diff changeset
310 fill_to(instr_pos, filler); output()->print("instr");
a61af66fc99e Initial load
duke
parents:
diff changeset
311 fill_to(end_pos , filler);
a61af66fc99e Initial load
duke
parents:
diff changeset
312 output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316 void InstructionPrinter::print_line(Instruction* instr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // print instruction data on one line
a61af66fc99e Initial load
duke
parents:
diff changeset
318 if (instr->is_pinned()) output()->put('.');
a61af66fc99e Initial load
duke
parents:
diff changeset
319 fill_to(bci_pos ); output()->print("%d", instr->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
320 fill_to(use_pos ); output()->print("%d", instr->use_count());
a61af66fc99e Initial load
duke
parents:
diff changeset
321 fill_to(temp_pos ); print_temp(instr);
a61af66fc99e Initial load
duke
parents:
diff changeset
322 fill_to(instr_pos); print_instr(instr);
a61af66fc99e Initial load
duke
parents:
diff changeset
323 output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // add a line for StateSplit instructions w/ non-empty stacks
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // (make it robust so we can print incomplete instructions)
a61af66fc99e Initial load
duke
parents:
diff changeset
326 StateSplit* split = instr->as_StateSplit();
a61af66fc99e Initial load
duke
parents:
diff changeset
327 if (split != NULL && split->state() != NULL && !split->state()->stack_is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
328 fill_to(instr_pos); print_stack(split->state());
a61af66fc99e Initial load
duke
parents:
diff changeset
329 output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
330 }
a61af66fc99e Initial load
duke
parents:
diff changeset
331 }
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333
a61af66fc99e Initial load
duke
parents:
diff changeset
334 void InstructionPrinter::do_Phi(Phi* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
335 output()->print("phi function"); // make that more detailed later
a61af66fc99e Initial load
duke
parents:
diff changeset
336 if (x->is_illegal())
a61af66fc99e Initial load
duke
parents:
diff changeset
337 output()->print(" (illegal)");
a61af66fc99e Initial load
duke
parents:
diff changeset
338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 void InstructionPrinter::do_Local(Local* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
342 output()->print("local[index %d]", x->java_index());
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 InstructionPrinter::do_Constant(Constant* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
347 ValueType* t = x->type();
a61af66fc99e Initial load
duke
parents:
diff changeset
348 switch (t->tag()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
349 case intTag : output()->print("%d" , t->as_IntConstant ()->value()); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
350 case longTag : output()->print(os::jlong_format_specifier(), t->as_LongConstant()->value()); output()->print("L"); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
351 case floatTag : output()->print("%g" , t->as_FloatConstant ()->value()); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
352 case doubleTag : output()->print("%gD" , t->as_DoubleConstant()->value()); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
353 case objectTag : print_object(x); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
354 case addressTag: output()->print("bci:%d", t->as_AddressConstant()->value()); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
355 default : output()->print("???"); break;
a61af66fc99e Initial load
duke
parents:
diff changeset
356 }
a61af66fc99e Initial load
duke
parents:
diff changeset
357 }
a61af66fc99e Initial load
duke
parents:
diff changeset
358
a61af66fc99e Initial load
duke
parents:
diff changeset
359
a61af66fc99e Initial load
duke
parents:
diff changeset
360 void InstructionPrinter::do_LoadField(LoadField* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
361 print_field(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
362 output()->print(" (%c)", type2char(x->field()->type()->basic_type()));
a61af66fc99e Initial load
duke
parents:
diff changeset
363 }
a61af66fc99e Initial load
duke
parents:
diff changeset
364
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 void InstructionPrinter::do_StoreField(StoreField* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
367 print_field(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
368 output()->print(" := ");
a61af66fc99e Initial load
duke
parents:
diff changeset
369 print_value(x->value());
a61af66fc99e Initial load
duke
parents:
diff changeset
370 output()->print(" (%c)", type2char(x->field()->type()->basic_type()));
a61af66fc99e Initial load
duke
parents:
diff changeset
371 }
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 void InstructionPrinter::do_ArrayLength(ArrayLength* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
375 print_value(x->array());
a61af66fc99e Initial load
duke
parents:
diff changeset
376 output()->print(".length");
a61af66fc99e Initial load
duke
parents:
diff changeset
377 }
a61af66fc99e Initial load
duke
parents:
diff changeset
378
a61af66fc99e Initial load
duke
parents:
diff changeset
379
a61af66fc99e Initial load
duke
parents:
diff changeset
380 void InstructionPrinter::do_LoadIndexed(LoadIndexed* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
381 print_indexed(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
382 output()->print(" (%c)", type2char(x->elt_type()));
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 void InstructionPrinter::do_StoreIndexed(StoreIndexed* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
387 print_indexed(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 output()->print(" := ");
a61af66fc99e Initial load
duke
parents:
diff changeset
389 print_value(x->value());
a61af66fc99e Initial load
duke
parents:
diff changeset
390 output()->print(" (%c)", type2char(x->elt_type()));
a61af66fc99e Initial load
duke
parents:
diff changeset
391 }
a61af66fc99e Initial load
duke
parents:
diff changeset
392
a61af66fc99e Initial load
duke
parents:
diff changeset
393 void InstructionPrinter::do_NegateOp(NegateOp* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
394 output()->put('-');
a61af66fc99e Initial load
duke
parents:
diff changeset
395 print_value(x->x());
a61af66fc99e Initial load
duke
parents:
diff changeset
396 }
a61af66fc99e Initial load
duke
parents:
diff changeset
397
a61af66fc99e Initial load
duke
parents:
diff changeset
398
a61af66fc99e Initial load
duke
parents:
diff changeset
399 void InstructionPrinter::do_ArithmeticOp(ArithmeticOp* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
400 print_op2(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
401 }
a61af66fc99e Initial load
duke
parents:
diff changeset
402
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 void InstructionPrinter::do_ShiftOp(ShiftOp* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
405 print_op2(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408
a61af66fc99e Initial load
duke
parents:
diff changeset
409 void InstructionPrinter::do_LogicOp(LogicOp* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
410 print_op2(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413
a61af66fc99e Initial load
duke
parents:
diff changeset
414 void InstructionPrinter::do_CompareOp(CompareOp* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
415 print_op2(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
416 }
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418
a61af66fc99e Initial load
duke
parents:
diff changeset
419 void InstructionPrinter::do_IfOp(IfOp* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
420 print_value(x->x());
a61af66fc99e Initial load
duke
parents:
diff changeset
421 output()->print(" %s ", cond_name(x->cond()));
a61af66fc99e Initial load
duke
parents:
diff changeset
422 print_value(x->y());
a61af66fc99e Initial load
duke
parents:
diff changeset
423 output()->print(" ? ");
a61af66fc99e Initial load
duke
parents:
diff changeset
424 print_value(x->tval());
a61af66fc99e Initial load
duke
parents:
diff changeset
425 output()->print(" : ");
a61af66fc99e Initial load
duke
parents:
diff changeset
426 print_value(x->fval());
a61af66fc99e Initial load
duke
parents:
diff changeset
427 }
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429
a61af66fc99e Initial load
duke
parents:
diff changeset
430 void InstructionPrinter::do_Convert(Convert* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
431 output()->print("%s(", Bytecodes::name(x->op()));
a61af66fc99e Initial load
duke
parents:
diff changeset
432 print_value(x->value());
a61af66fc99e Initial load
duke
parents:
diff changeset
433 output()->put(')');
a61af66fc99e Initial load
duke
parents:
diff changeset
434 }
a61af66fc99e Initial load
duke
parents:
diff changeset
435
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 void InstructionPrinter::do_NullCheck(NullCheck* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
438 output()->print("null_check(");
a61af66fc99e Initial load
duke
parents:
diff changeset
439 print_value(x->obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
440 output()->put(')');
a61af66fc99e Initial load
duke
parents:
diff changeset
441 if (!x->can_trap()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
442 output()->print(" (eliminated)");
a61af66fc99e Initial load
duke
parents:
diff changeset
443 }
a61af66fc99e Initial load
duke
parents:
diff changeset
444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
445
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447 void InstructionPrinter::do_Invoke(Invoke* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
448 if (x->receiver() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
449 print_value(x->receiver());
a61af66fc99e Initial load
duke
parents:
diff changeset
450 output()->print(".");
a61af66fc99e Initial load
duke
parents:
diff changeset
451 }
a61af66fc99e Initial load
duke
parents:
diff changeset
452
a61af66fc99e Initial load
duke
parents:
diff changeset
453 output()->print("%s(", Bytecodes::name(x->code()));
a61af66fc99e Initial load
duke
parents:
diff changeset
454 for (int i = 0; i < x->number_of_arguments(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
455 if (i > 0) output()->print(", ");
a61af66fc99e Initial load
duke
parents:
diff changeset
456 print_value(x->argument_at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
457 }
a61af66fc99e Initial load
duke
parents:
diff changeset
458 output()->print_cr(")");
a61af66fc99e Initial load
duke
parents:
diff changeset
459 fill_to(instr_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
460 output()->print("%s.%s%s",
a61af66fc99e Initial load
duke
parents:
diff changeset
461 x->target()->holder()->name()->as_utf8(),
a61af66fc99e Initial load
duke
parents:
diff changeset
462 x->target()->name()->as_utf8(),
a61af66fc99e Initial load
duke
parents:
diff changeset
463 x->target()->signature()->as_symbol()->as_utf8());
a61af66fc99e Initial load
duke
parents:
diff changeset
464 }
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466
a61af66fc99e Initial load
duke
parents:
diff changeset
467 void InstructionPrinter::do_NewInstance(NewInstance* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
468 output()->print("new instance ");
a61af66fc99e Initial load
duke
parents:
diff changeset
469 print_klass(x->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
470 }
a61af66fc99e Initial load
duke
parents:
diff changeset
471
a61af66fc99e Initial load
duke
parents:
diff changeset
472
a61af66fc99e Initial load
duke
parents:
diff changeset
473 void InstructionPrinter::do_NewTypeArray(NewTypeArray* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
474 output()->print("new %s array [", basic_type_name(x->elt_type()));
a61af66fc99e Initial load
duke
parents:
diff changeset
475 print_value(x->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
476 output()->put(']');
a61af66fc99e Initial load
duke
parents:
diff changeset
477 }
a61af66fc99e Initial load
duke
parents:
diff changeset
478
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 void InstructionPrinter::do_NewObjectArray(NewObjectArray* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
481 output()->print("new object array [");
a61af66fc99e Initial load
duke
parents:
diff changeset
482 print_value(x->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
483 output()->print("] ");
a61af66fc99e Initial load
duke
parents:
diff changeset
484 print_klass(x->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
486
a61af66fc99e Initial load
duke
parents:
diff changeset
487
a61af66fc99e Initial load
duke
parents:
diff changeset
488 void InstructionPrinter::do_NewMultiArray(NewMultiArray* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
489 output()->print("new multi array [");
a61af66fc99e Initial load
duke
parents:
diff changeset
490 Values* dims = x->dims();
a61af66fc99e Initial load
duke
parents:
diff changeset
491 for (int i = 0; i < dims->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
492 if (i > 0) output()->print(", ");
a61af66fc99e Initial load
duke
parents:
diff changeset
493 print_value(dims->at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
494 }
a61af66fc99e Initial load
duke
parents:
diff changeset
495 output()->print("] ");
a61af66fc99e Initial load
duke
parents:
diff changeset
496 print_klass(x->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 void InstructionPrinter::do_MonitorEnter(MonitorEnter* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
501 output()->print("enter ");
a61af66fc99e Initial load
duke
parents:
diff changeset
502 print_monitor(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
503 }
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505
a61af66fc99e Initial load
duke
parents:
diff changeset
506 void InstructionPrinter::do_MonitorExit(MonitorExit* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
507 output()->print("exit ");
a61af66fc99e Initial load
duke
parents:
diff changeset
508 print_monitor(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
509 }
a61af66fc99e Initial load
duke
parents:
diff changeset
510
a61af66fc99e Initial load
duke
parents:
diff changeset
511
a61af66fc99e Initial load
duke
parents:
diff changeset
512 void InstructionPrinter::do_Intrinsic(Intrinsic* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
513 const char* name = vmIntrinsics::name_at(x->id());
a61af66fc99e Initial load
duke
parents:
diff changeset
514 if (name[0] == '_') name++; // strip leading bug from _hashCode, etc.
a61af66fc99e Initial load
duke
parents:
diff changeset
515 const char* kname = vmSymbols::name_for(vmIntrinsics::class_for(x->id()));
a61af66fc99e Initial load
duke
parents:
diff changeset
516 if (strchr(name, '_') == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
517 kname = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
518 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
519 const char* kptr = strrchr(kname, '/');
a61af66fc99e Initial load
duke
parents:
diff changeset
520 if (kptr != NULL) kname = kptr + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
521 }
a61af66fc99e Initial load
duke
parents:
diff changeset
522 if (kname == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
523 output()->print("%s(", name);
a61af66fc99e Initial load
duke
parents:
diff changeset
524 else
a61af66fc99e Initial load
duke
parents:
diff changeset
525 output()->print("%s.%s(", kname, name);
a61af66fc99e Initial load
duke
parents:
diff changeset
526 for (int i = 0; i < x->number_of_arguments(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
527 if (i > 0) output()->print(", ");
a61af66fc99e Initial load
duke
parents:
diff changeset
528 print_value(x->argument_at(i));
a61af66fc99e Initial load
duke
parents:
diff changeset
529 }
a61af66fc99e Initial load
duke
parents:
diff changeset
530 output()->put(')');
a61af66fc99e Initial load
duke
parents:
diff changeset
531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
532
a61af66fc99e Initial load
duke
parents:
diff changeset
533
a61af66fc99e Initial load
duke
parents:
diff changeset
534 void InstructionPrinter::do_BlockBegin(BlockBegin* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
535 // print block id
a61af66fc99e Initial load
duke
parents:
diff changeset
536 BlockEnd* end = x->end();
a61af66fc99e Initial load
duke
parents:
diff changeset
537 output()->print("B%d ", x->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
538
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // print flags
a61af66fc99e Initial load
duke
parents:
diff changeset
540 bool printed_flag = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
541 if (x->is_set(BlockBegin::std_entry_flag)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
542 if (!printed_flag) output()->print("(");
a61af66fc99e Initial load
duke
parents:
diff changeset
543 output()->print("S"); printed_flag = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
544 }
a61af66fc99e Initial load
duke
parents:
diff changeset
545 if (x->is_set(BlockBegin::osr_entry_flag)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
546 if (!printed_flag) output()->print("(");
a61af66fc99e Initial load
duke
parents:
diff changeset
547 output()->print("O"); printed_flag = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
548 }
a61af66fc99e Initial load
duke
parents:
diff changeset
549 if (x->is_set(BlockBegin::exception_entry_flag)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
550 if (!printed_flag) output()->print("(");
a61af66fc99e Initial load
duke
parents:
diff changeset
551 output()->print("E"); printed_flag = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
552 }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 if (x->is_set(BlockBegin::subroutine_entry_flag)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
554 if (!printed_flag) output()->print("(");
a61af66fc99e Initial load
duke
parents:
diff changeset
555 output()->print("s"); printed_flag = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
556 }
a61af66fc99e Initial load
duke
parents:
diff changeset
557 if (x->is_set(BlockBegin::parser_loop_header_flag)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
558 if (!printed_flag) output()->print("(");
a61af66fc99e Initial load
duke
parents:
diff changeset
559 output()->print("LH"); printed_flag = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
561 if (x->is_set(BlockBegin::backward_branch_target_flag)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
562 if (!printed_flag) output()->print("(");
a61af66fc99e Initial load
duke
parents:
diff changeset
563 output()->print("b"); printed_flag = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
564 }
a61af66fc99e Initial load
duke
parents:
diff changeset
565 if (x->is_set(BlockBegin::was_visited_flag)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
566 if (!printed_flag) output()->print("(");
a61af66fc99e Initial load
duke
parents:
diff changeset
567 output()->print("V"); printed_flag = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
568 }
a61af66fc99e Initial load
duke
parents:
diff changeset
569 if (printed_flag) output()->print(") ");
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571 // print block bci range
a61af66fc99e Initial load
duke
parents:
diff changeset
572 output()->print("[%d, %d]", x->bci(), (end == NULL ? -1 : end->bci()));
a61af66fc99e Initial load
duke
parents:
diff changeset
573
a61af66fc99e Initial load
duke
parents:
diff changeset
574 // print block successors
a61af66fc99e Initial load
duke
parents:
diff changeset
575 if (end != NULL && end->number_of_sux() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
576 output()->print(" ->");
a61af66fc99e Initial load
duke
parents:
diff changeset
577 for (int i = 0; i < end->number_of_sux(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
578 output()->print(" B%d", end->sux_at(i)->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
579 }
a61af66fc99e Initial load
duke
parents:
diff changeset
580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
581 // print exception handlers
a61af66fc99e Initial load
duke
parents:
diff changeset
582 if (x->number_of_exception_handlers() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
583 output()->print(" (xhandlers ");
a61af66fc99e Initial load
duke
parents:
diff changeset
584 for (int i = 0; i < x->number_of_exception_handlers(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
585 if (i > 0) output()->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
586 output()->print("B%d", x->exception_handler_at(i)->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
587 }
a61af66fc99e Initial load
duke
parents:
diff changeset
588 output()->put(')');
a61af66fc99e Initial load
duke
parents:
diff changeset
589 }
a61af66fc99e Initial load
duke
parents:
diff changeset
590
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // print dominator block
a61af66fc99e Initial load
duke
parents:
diff changeset
592 if (x->dominator() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
593 output()->print(" dom B%d", x->dominator()->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
594 }
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596 // print predecessors and successors
a61af66fc99e Initial load
duke
parents:
diff changeset
597 if (x->successors()->length() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
598 output()->print(" sux:");
a61af66fc99e Initial load
duke
parents:
diff changeset
599 for (int i = 0; i < x->successors()->length(); i ++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
600 output()->print(" B%d", x->successors()->at(i)->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
601 }
a61af66fc99e Initial load
duke
parents:
diff changeset
602 }
a61af66fc99e Initial load
duke
parents:
diff changeset
603
a61af66fc99e Initial load
duke
parents:
diff changeset
604 if (x->number_of_preds() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
605 output()->print(" pred:");
a61af66fc99e Initial load
duke
parents:
diff changeset
606 for (int i = 0; i < x->number_of_preds(); i ++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
607 output()->print(" B%d", x->pred_at(i)->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
609 }
a61af66fc99e Initial load
duke
parents:
diff changeset
610
a61af66fc99e Initial load
duke
parents:
diff changeset
611 if (!_print_phis) {
a61af66fc99e Initial load
duke
parents:
diff changeset
612 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
613 }
a61af66fc99e Initial load
duke
parents:
diff changeset
614
a61af66fc99e Initial load
duke
parents:
diff changeset
615 // print phi functions
a61af66fc99e Initial load
duke
parents:
diff changeset
616 bool has_phis_in_locals = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
617 bool has_phis_on_stack = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 if (x->end() && x->end()->state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
620 ValueStack* state = x->state();
a61af66fc99e Initial load
duke
parents:
diff changeset
621
a61af66fc99e Initial load
duke
parents:
diff changeset
622 int i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
623 while (!has_phis_on_stack && i < state->stack_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
624 Value v = state->stack_at_inc(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
625 has_phis_on_stack = is_phi_of_block(v, x);
a61af66fc99e Initial load
duke
parents:
diff changeset
626 }
a61af66fc99e Initial load
duke
parents:
diff changeset
627
a61af66fc99e Initial load
duke
parents:
diff changeset
628 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
629 for (i = 0; !has_phis_in_locals && i < state->locals_size();) {
a61af66fc99e Initial load
duke
parents:
diff changeset
630 Value v = state->local_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
631 has_phis_in_locals = is_phi_of_block(v, x);
a61af66fc99e Initial load
duke
parents:
diff changeset
632 // also ignore illegal HiWords
a61af66fc99e Initial load
duke
parents:
diff changeset
633 if (v && !v->type()->is_illegal()) i += v->type()->size(); else i ++;
a61af66fc99e Initial load
duke
parents:
diff changeset
634 }
a61af66fc99e Initial load
duke
parents:
diff changeset
635 state = state->caller_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
636 } while (state != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
637
a61af66fc99e Initial load
duke
parents:
diff changeset
638 }
a61af66fc99e Initial load
duke
parents:
diff changeset
639
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // print values in locals
a61af66fc99e Initial load
duke
parents:
diff changeset
641 if (has_phis_in_locals) {
a61af66fc99e Initial load
duke
parents:
diff changeset
642 output()->cr(); output()->print_cr("Locals:");
a61af66fc99e Initial load
duke
parents:
diff changeset
643
a61af66fc99e Initial load
duke
parents:
diff changeset
644 ValueStack* state = x->state();
a61af66fc99e Initial load
duke
parents:
diff changeset
645 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
646 for (int i = 0; i < state->locals_size();) {
a61af66fc99e Initial load
duke
parents:
diff changeset
647 Value v = state->local_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
648 if (v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
649 print_phi(i, v, x); output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
650 // also ignore illegal HiWords
a61af66fc99e Initial load
duke
parents:
diff changeset
651 i += (v->type()->is_illegal() ? 1 : v->type()->size());
a61af66fc99e Initial load
duke
parents:
diff changeset
652 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
653 i ++;
a61af66fc99e Initial load
duke
parents:
diff changeset
654 }
a61af66fc99e Initial load
duke
parents:
diff changeset
655 }
a61af66fc99e Initial load
duke
parents:
diff changeset
656 output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
657 state = state->caller_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
658 } while (state != NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
660
a61af66fc99e Initial load
duke
parents:
diff changeset
661 // print values on stack
a61af66fc99e Initial load
duke
parents:
diff changeset
662 if (has_phis_on_stack) {
a61af66fc99e Initial load
duke
parents:
diff changeset
663 output()->print_cr("Stack:");
a61af66fc99e Initial load
duke
parents:
diff changeset
664 int i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
665 while (i < x->state()->stack_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
666 int o = i;
a61af66fc99e Initial load
duke
parents:
diff changeset
667 Value v = x->state()->stack_at_inc(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
668 if (v) {
a61af66fc99e Initial load
duke
parents:
diff changeset
669 print_phi(o, v, x); output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
670 }
a61af66fc99e Initial load
duke
parents:
diff changeset
671 }
a61af66fc99e Initial load
duke
parents:
diff changeset
672 }
a61af66fc99e Initial load
duke
parents:
diff changeset
673 }
a61af66fc99e Initial load
duke
parents:
diff changeset
674
a61af66fc99e Initial load
duke
parents:
diff changeset
675
a61af66fc99e Initial load
duke
parents:
diff changeset
676 void InstructionPrinter::do_CheckCast(CheckCast* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
677 output()->print("checkcast(");
a61af66fc99e Initial load
duke
parents:
diff changeset
678 print_value(x->obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
679 output()->print(") ");
a61af66fc99e Initial load
duke
parents:
diff changeset
680 print_klass(x->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
681 }
a61af66fc99e Initial load
duke
parents:
diff changeset
682
a61af66fc99e Initial load
duke
parents:
diff changeset
683
a61af66fc99e Initial load
duke
parents:
diff changeset
684 void InstructionPrinter::do_InstanceOf(InstanceOf* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
685 output()->print("instanceof(");
a61af66fc99e Initial load
duke
parents:
diff changeset
686 print_value(x->obj());
a61af66fc99e Initial load
duke
parents:
diff changeset
687 output()->print(") ");
a61af66fc99e Initial load
duke
parents:
diff changeset
688 print_klass(x->klass());
a61af66fc99e Initial load
duke
parents:
diff changeset
689 }
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691
a61af66fc99e Initial load
duke
parents:
diff changeset
692 void InstructionPrinter::do_Goto(Goto* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
693 output()->print("goto B%d", x->default_sux()->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
694 if (x->is_safepoint()) output()->print(" (safepoint)");
a61af66fc99e Initial load
duke
parents:
diff changeset
695 }
a61af66fc99e Initial load
duke
parents:
diff changeset
696
a61af66fc99e Initial load
duke
parents:
diff changeset
697
a61af66fc99e Initial load
duke
parents:
diff changeset
698 void InstructionPrinter::do_If(If* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
699 output()->print("if ");
a61af66fc99e Initial load
duke
parents:
diff changeset
700 print_value(x->x());
a61af66fc99e Initial load
duke
parents:
diff changeset
701 output()->print(" %s ", cond_name(x->cond()));
a61af66fc99e Initial load
duke
parents:
diff changeset
702 print_value(x->y());
a61af66fc99e Initial load
duke
parents:
diff changeset
703 output()->print(" then B%d else B%d", x->sux_at(0)->block_id(), x->sux_at(1)->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
704 if (x->is_safepoint()) output()->print(" (safepoint)");
a61af66fc99e Initial load
duke
parents:
diff changeset
705 }
a61af66fc99e Initial load
duke
parents:
diff changeset
706
a61af66fc99e Initial load
duke
parents:
diff changeset
707
a61af66fc99e Initial load
duke
parents:
diff changeset
708 void InstructionPrinter::do_IfInstanceOf(IfInstanceOf* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
709 output()->print("<IfInstanceOf>");
a61af66fc99e Initial load
duke
parents:
diff changeset
710 }
a61af66fc99e Initial load
duke
parents:
diff changeset
711
a61af66fc99e Initial load
duke
parents:
diff changeset
712
a61af66fc99e Initial load
duke
parents:
diff changeset
713 void InstructionPrinter::do_TableSwitch(TableSwitch* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
714 output()->print("tableswitch ");
a61af66fc99e Initial load
duke
parents:
diff changeset
715 if (x->is_safepoint()) output()->print("(safepoint) ");
a61af66fc99e Initial load
duke
parents:
diff changeset
716 print_value(x->tag());
a61af66fc99e Initial load
duke
parents:
diff changeset
717 output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
718 int l = x->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
719 for (int i = 0; i < l; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
720 fill_to(instr_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
721 output()->print_cr("case %5d: B%d", x->lo_key() + i, x->sux_at(i)->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
722 }
a61af66fc99e Initial load
duke
parents:
diff changeset
723 fill_to(instr_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
724 output()->print("default : B%d", x->default_sux()->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
725 }
a61af66fc99e Initial load
duke
parents:
diff changeset
726
a61af66fc99e Initial load
duke
parents:
diff changeset
727
a61af66fc99e Initial load
duke
parents:
diff changeset
728 void InstructionPrinter::do_LookupSwitch(LookupSwitch* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
729 output()->print("lookupswitch ");
a61af66fc99e Initial load
duke
parents:
diff changeset
730 if (x->is_safepoint()) output()->print("(safepoint) ");
a61af66fc99e Initial load
duke
parents:
diff changeset
731 print_value(x->tag());
a61af66fc99e Initial load
duke
parents:
diff changeset
732 output()->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
733 int l = x->length();
a61af66fc99e Initial load
duke
parents:
diff changeset
734 for (int i = 0; i < l; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
735 fill_to(instr_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
736 output()->print_cr("case %5d: B%d", x->key_at(i), x->sux_at(i)->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
737 }
a61af66fc99e Initial load
duke
parents:
diff changeset
738 fill_to(instr_pos);
a61af66fc99e Initial load
duke
parents:
diff changeset
739 output()->print("default : B%d", x->default_sux()->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
741
a61af66fc99e Initial load
duke
parents:
diff changeset
742
a61af66fc99e Initial load
duke
parents:
diff changeset
743 void InstructionPrinter::do_Return(Return* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
744 if (x->result() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
745 output()->print("return");
a61af66fc99e Initial load
duke
parents:
diff changeset
746 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
747 output()->print("%creturn ", x->type()->tchar());
a61af66fc99e Initial load
duke
parents:
diff changeset
748 print_value(x->result());
a61af66fc99e Initial load
duke
parents:
diff changeset
749 }
a61af66fc99e Initial load
duke
parents:
diff changeset
750 }
a61af66fc99e Initial load
duke
parents:
diff changeset
751
a61af66fc99e Initial load
duke
parents:
diff changeset
752
a61af66fc99e Initial load
duke
parents:
diff changeset
753 void InstructionPrinter::do_Throw(Throw* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
754 output()->print("throw ");
a61af66fc99e Initial load
duke
parents:
diff changeset
755 print_value(x->exception());
a61af66fc99e Initial load
duke
parents:
diff changeset
756 }
a61af66fc99e Initial load
duke
parents:
diff changeset
757
a61af66fc99e Initial load
duke
parents:
diff changeset
758
a61af66fc99e Initial load
duke
parents:
diff changeset
759 void InstructionPrinter::do_Base(Base* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
760 output()->print("std entry B%d", x->std_entry()->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
761 if (x->number_of_sux() > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
762 output()->print(" osr entry B%d", x->osr_entry()->block_id());
a61af66fc99e Initial load
duke
parents:
diff changeset
763 }
a61af66fc99e Initial load
duke
parents:
diff changeset
764 }
a61af66fc99e Initial load
duke
parents:
diff changeset
765
a61af66fc99e Initial load
duke
parents:
diff changeset
766
a61af66fc99e Initial load
duke
parents:
diff changeset
767 void InstructionPrinter::do_OsrEntry(OsrEntry* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
768 output()->print("osr entry");
a61af66fc99e Initial load
duke
parents:
diff changeset
769 }
a61af66fc99e Initial load
duke
parents:
diff changeset
770
a61af66fc99e Initial load
duke
parents:
diff changeset
771
a61af66fc99e Initial load
duke
parents:
diff changeset
772 void InstructionPrinter::do_ExceptionObject(ExceptionObject* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
773 output()->print("incoming exception");
a61af66fc99e Initial load
duke
parents:
diff changeset
774 }
a61af66fc99e Initial load
duke
parents:
diff changeset
775
a61af66fc99e Initial load
duke
parents:
diff changeset
776
a61af66fc99e Initial load
duke
parents:
diff changeset
777 void InstructionPrinter::do_RoundFP(RoundFP* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
778 output()->print("round_fp ");
a61af66fc99e Initial load
duke
parents:
diff changeset
779 print_value(x->input());
a61af66fc99e Initial load
duke
parents:
diff changeset
780 }
a61af66fc99e Initial load
duke
parents:
diff changeset
781
a61af66fc99e Initial load
duke
parents:
diff changeset
782
a61af66fc99e Initial load
duke
parents:
diff changeset
783 void InstructionPrinter::do_UnsafeGetRaw(UnsafeGetRaw* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
784 print_unsafe_raw_op(x, "UnsafeGetRaw");
a61af66fc99e Initial load
duke
parents:
diff changeset
785 output()->put(')');
a61af66fc99e Initial load
duke
parents:
diff changeset
786 }
a61af66fc99e Initial load
duke
parents:
diff changeset
787
a61af66fc99e Initial load
duke
parents:
diff changeset
788
a61af66fc99e Initial load
duke
parents:
diff changeset
789 void InstructionPrinter::do_UnsafePutRaw(UnsafePutRaw* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
790 print_unsafe_raw_op(x, "UnsafePutRaw");
a61af66fc99e Initial load
duke
parents:
diff changeset
791 output()->print(", value ");
a61af66fc99e Initial load
duke
parents:
diff changeset
792 print_value(x->value());
a61af66fc99e Initial load
duke
parents:
diff changeset
793 output()->put(')');
a61af66fc99e Initial load
duke
parents:
diff changeset
794 }
a61af66fc99e Initial load
duke
parents:
diff changeset
795
a61af66fc99e Initial load
duke
parents:
diff changeset
796
a61af66fc99e Initial load
duke
parents:
diff changeset
797 void InstructionPrinter::do_UnsafeGetObject(UnsafeGetObject* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
798 print_unsafe_object_op(x, "UnsafeGetObject");
a61af66fc99e Initial load
duke
parents:
diff changeset
799 output()->put(')');
a61af66fc99e Initial load
duke
parents:
diff changeset
800 }
a61af66fc99e Initial load
duke
parents:
diff changeset
801
a61af66fc99e Initial load
duke
parents:
diff changeset
802
a61af66fc99e Initial load
duke
parents:
diff changeset
803 void InstructionPrinter::do_UnsafePutObject(UnsafePutObject* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
804 print_unsafe_object_op(x, "UnsafePutObject");
a61af66fc99e Initial load
duke
parents:
diff changeset
805 output()->print(", value ");
a61af66fc99e Initial load
duke
parents:
diff changeset
806 print_value(x->value());
a61af66fc99e Initial load
duke
parents:
diff changeset
807 output()->put(')');
a61af66fc99e Initial load
duke
parents:
diff changeset
808 }
a61af66fc99e Initial load
duke
parents:
diff changeset
809
a61af66fc99e Initial load
duke
parents:
diff changeset
810
a61af66fc99e Initial load
duke
parents:
diff changeset
811 void InstructionPrinter::do_UnsafePrefetchRead(UnsafePrefetchRead* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
812 print_unsafe_object_op(x, "UnsafePrefetchRead");
a61af66fc99e Initial load
duke
parents:
diff changeset
813 output()->put(')');
a61af66fc99e Initial load
duke
parents:
diff changeset
814 }
a61af66fc99e Initial load
duke
parents:
diff changeset
815
a61af66fc99e Initial load
duke
parents:
diff changeset
816
a61af66fc99e Initial load
duke
parents:
diff changeset
817 void InstructionPrinter::do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
818 print_unsafe_object_op(x, "UnsafePrefetchWrite");
a61af66fc99e Initial load
duke
parents:
diff changeset
819 output()->put(')');
a61af66fc99e Initial load
duke
parents:
diff changeset
820 }
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822
a61af66fc99e Initial load
duke
parents:
diff changeset
823 void InstructionPrinter::do_ProfileCall(ProfileCall* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
824 output()->print("profile ");
a61af66fc99e Initial load
duke
parents:
diff changeset
825 print_value(x->recv());
a61af66fc99e Initial load
duke
parents:
diff changeset
826 output()->print(" %s.%s", x->method()->holder()->name()->as_utf8(), x->method()->name()->as_utf8());
a61af66fc99e Initial load
duke
parents:
diff changeset
827 if (x->known_holder() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
828 output()->print(", ");
a61af66fc99e Initial load
duke
parents:
diff changeset
829 print_klass(x->known_holder());
a61af66fc99e Initial load
duke
parents:
diff changeset
830 }
a61af66fc99e Initial load
duke
parents:
diff changeset
831 output()->put(')');
a61af66fc99e Initial load
duke
parents:
diff changeset
832 }
a61af66fc99e Initial load
duke
parents:
diff changeset
833
a61af66fc99e Initial load
duke
parents:
diff changeset
834
a61af66fc99e Initial load
duke
parents:
diff changeset
835 void InstructionPrinter::do_ProfileCounter(ProfileCounter* x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
836
a61af66fc99e Initial load
duke
parents:
diff changeset
837 ObjectConstant* oc = x->mdo()->type()->as_ObjectConstant();
a61af66fc99e Initial load
duke
parents:
diff changeset
838 if (oc != NULL && oc->value()->is_method() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
839 x->offset() == methodOopDesc::interpreter_invocation_counter_offset_in_bytes()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
840 print_value(x->mdo());
a61af66fc99e Initial load
duke
parents:
diff changeset
841 output()->print(".interpreter_invocation_count += %d", x->increment());
a61af66fc99e Initial load
duke
parents:
diff changeset
842 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
843 output()->print("counter [");
a61af66fc99e Initial load
duke
parents:
diff changeset
844 print_value(x->mdo());
a61af66fc99e Initial load
duke
parents:
diff changeset
845 output()->print(" + %d] += %d", x->offset(), x->increment());
a61af66fc99e Initial load
duke
parents:
diff changeset
846 }
a61af66fc99e Initial load
duke
parents:
diff changeset
847 }
a61af66fc99e Initial load
duke
parents:
diff changeset
848
a61af66fc99e Initial load
duke
parents:
diff changeset
849
a61af66fc99e Initial load
duke
parents:
diff changeset
850 #endif // PRODUCT