src/share/vm/c1/c1_InstructionPrinter.cpp

Tue, 08 Aug 2017 15:57:29 +0800

author
aoqi
date
Tue, 08 Aug 2017 15:57:29 +0800
changeset 6876
710a3c8b516e
parent 6680
78bbf4d43a14
parent 0
f90c822e73f8
permissions
-rw-r--r--

merge

     1 /*
     2  * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #include "precompiled.hpp"
    26 #include "c1/c1_InstructionPrinter.hpp"
    27 #include "c1/c1_ValueStack.hpp"
    28 #include "ci/ciArray.hpp"
    29 #include "ci/ciInstance.hpp"
    30 #include "ci/ciObject.hpp"
    33 #ifndef PRODUCT
    35 const char* InstructionPrinter::basic_type_name(BasicType type) {
    36   switch (type) {
    37     case T_BOOLEAN: return "boolean";
    38     case T_BYTE   : return "byte";
    39     case T_CHAR   : return "char";
    40     case T_SHORT  : return "short";
    41     case T_INT    : return "int";
    42     case T_LONG   : return "long";
    43     case T_FLOAT  : return "float";
    44     case T_DOUBLE : return "double";
    45     case T_ARRAY  : return "array";
    46     case T_OBJECT : return "object";
    47     default       : return "???";
    48   }
    49 }
    52 const char* InstructionPrinter::cond_name(If::Condition cond) {
    53   switch (cond) {
    54     case If::eql: return "==";
    55     case If::neq: return "!=";
    56     case If::lss: return "<";
    57     case If::leq: return "<=";
    58     case If::gtr: return ">";
    59     case If::geq: return ">=";
    60     case If::aeq: return "|>=|";
    61     case If::beq: return "|<=|";
    62   }
    63   ShouldNotReachHere();
    64   return NULL;
    65 }
    68 const char* InstructionPrinter::op_name(Bytecodes::Code op) {
    69   switch (op) {
    70     // arithmetic ops
    71     case Bytecodes::_iadd : // fall through
    72     case Bytecodes::_ladd : // fall through
    73     case Bytecodes::_fadd : // fall through
    74     case Bytecodes::_dadd : return "+";
    75     case Bytecodes::_isub : // fall through
    76     case Bytecodes::_lsub : // fall through
    77     case Bytecodes::_fsub : // fall through
    78     case Bytecodes::_dsub : return "-";
    79     case Bytecodes::_imul : // fall through
    80     case Bytecodes::_lmul : // fall through
    81     case Bytecodes::_fmul : // fall through
    82     case Bytecodes::_dmul : return "*";
    83     case Bytecodes::_idiv : // fall through
    84     case Bytecodes::_ldiv : // fall through
    85     case Bytecodes::_fdiv : // fall through
    86     case Bytecodes::_ddiv : return "/";
    87     case Bytecodes::_irem : // fall through
    88     case Bytecodes::_lrem : // fall through
    89     case Bytecodes::_frem : // fall through
    90     case Bytecodes::_drem : return "%";
    91     // shift ops
    92     case Bytecodes::_ishl : // fall through
    93     case Bytecodes::_lshl : return "<<";
    94     case Bytecodes::_ishr : // fall through
    95     case Bytecodes::_lshr : return ">>";
    96     case Bytecodes::_iushr: // fall through
    97     case Bytecodes::_lushr: return ">>>";
    98     // logic ops
    99     case Bytecodes::_iand : // fall through
   100     case Bytecodes::_land : return "&";
   101     case Bytecodes::_ior  : // fall through
   102     case Bytecodes::_lor  : return "|";
   103     case Bytecodes::_ixor : // fall through
   104     case Bytecodes::_lxor : return "^";
   105   }
   106   return Bytecodes::name(op);
   107 }
   110 bool InstructionPrinter::is_illegal_phi(Value v) {
   111   Phi* phi = v ? v->as_Phi() : NULL;
   112   if (phi && phi->is_illegal()) {
   113     return true;
   114   }
   115   return false;
   116 }
   119 bool InstructionPrinter::is_phi_of_block(Value v, BlockBegin* b) {
   120   Phi* phi = v ? v->as_Phi() : NULL;
   121   return phi && phi->block() == b;
   122 }
   125 void InstructionPrinter::print_klass(ciKlass* klass) {
   126   klass->name()->print_symbol_on(output());
   127 }
   130 void InstructionPrinter::print_object(Value obj) {
   131   ValueType* type = obj->type();
   132   if (type->as_ObjectConstant() != NULL) {
   133     ciObject* value = type->as_ObjectConstant()->value();
   134     if (value->is_null_object()) {
   135       output()->print("null");
   136     } else if (!value->is_loaded()) {
   137       output()->print("<unloaded object " INTPTR_FORMAT ">", p2i(value));
   138     } else {
   139       output()->print("<object " INTPTR_FORMAT " klass=", p2i(value->constant_encoding()));
   140       print_klass(value->klass());
   141       output()->print(">");
   142     }
   143   } else if (type->as_InstanceConstant() != NULL) {
   144     ciInstance* value = type->as_InstanceConstant()->value();
   145     if (value->is_loaded()) {
   146       output()->print("<instance " INTPTR_FORMAT " klass=", p2i(value->constant_encoding()));
   147       print_klass(value->klass());
   148       output()->print(">");
   149     } else {
   150       output()->print("<unloaded instance " INTPTR_FORMAT ">", p2i(value));
   151     }
   152   } else if (type->as_ArrayConstant() != NULL) {
   153     output()->print("<array " INTPTR_FORMAT ">", p2i(type->as_ArrayConstant()->value()->constant_encoding()));
   154   } else if (type->as_ClassConstant() != NULL) {
   155     ciInstanceKlass* klass = type->as_ClassConstant()->value();
   156     if (!klass->is_loaded()) {
   157       output()->print("<unloaded> ");
   158     }
   159     output()->print("class ");
   160     print_klass(klass);
   161   } else if (type->as_MethodConstant() != NULL) {
   162     ciMethod* m = type->as_MethodConstant()->value();
   163     output()->print("<method %s.%s>", m->holder()->name()->as_utf8(), m->name()->as_utf8());
   164   } else {
   165     output()->print("???");
   166   }
   167 }
   170 void InstructionPrinter::print_temp(Value value) {
   171   output()->print("%c%d", value->type()->tchar(), value->id());
   172 }
   175 void InstructionPrinter::print_field(AccessField* field) {
   176   print_value(field->obj());
   177   output()->print("._%d", field->offset());
   178 }
   181 void InstructionPrinter::print_indexed(AccessIndexed* indexed) {
   182   print_value(indexed->array());
   183   output()->put('[');
   184   print_value(indexed->index());
   185   output()->put(']');
   186   if (indexed->length() != NULL) {
   187     output()->put('(');
   188     print_value(indexed->length());
   189     output()->put(')');
   190   }
   191 }
   194 void InstructionPrinter::print_monitor(AccessMonitor* monitor) {
   195   output()->print("monitor[%d](", monitor->monitor_no());
   196   print_value(monitor->obj());
   197   output()->put(')');
   198 }
   201 void InstructionPrinter::print_op2(Op2* instr) {
   202   print_value(instr->x());
   203   output()->print(" %s ", op_name(instr->op()));
   204   print_value(instr->y());
   205 }
   208 void InstructionPrinter::print_value(Value value) {
   209   if (value == NULL) {
   210     output()->print("NULL");
   211   } else {
   212     print_temp(value);
   213   }
   214 }
   217 void InstructionPrinter::print_instr(Instruction* instr) {
   218   instr->visit(this);
   219 }
   222 void InstructionPrinter::print_stack(ValueStack* stack) {
   223   int start_position = output()->position();
   224   if (stack->stack_is_empty()) {
   225     output()->print("empty stack");
   226   } else {
   227     output()->print("stack [");
   228     for (int i = 0; i < stack->stack_size();) {
   229       if (i > 0) output()->print(", ");
   230       output()->print("%d:", i);
   231       Value value = stack->stack_at_inc(i);
   232       print_value(value);
   233       Phi* phi = value->as_Phi();
   234       if (phi != NULL) {
   235         if (phi->operand()->is_valid()) {
   236           output()->print(" ");
   237           phi->operand()->print(output());
   238         }
   239       }
   240     }
   241     output()->put(']');
   242   }
   243   if (!stack->no_active_locks()) {
   244     // print out the lines on the line below this
   245     // one at the same indentation level.
   246     output()->cr();
   247     fill_to(start_position, ' ');
   248     output()->print("locks [");
   249     for (int i = i = 0; i < stack->locks_size(); i++) {
   250       Value t = stack->lock_at(i);
   251       if (i > 0) output()->print(", ");
   252       output()->print("%d:", i);
   253       if (t == NULL) {
   254         // synchronized methods push null on the lock stack
   255         output()->print("this");
   256       } else {
   257         print_value(t);
   258       }
   259     }
   260     output()->print("]");
   261   }
   262 }
   265 void InstructionPrinter::print_inline_level(BlockBegin* block) {
   266   output()->print_cr("inlining depth %d", block->scope()->level());
   267 }
   270 void InstructionPrinter::print_unsafe_op(UnsafeOp* op, const char* name) {
   271   output()->print("%s", name);
   272   output()->print(".(");
   273 }
   275 void InstructionPrinter::print_unsafe_raw_op(UnsafeRawOp* op, const char* name) {
   276   print_unsafe_op(op, name);
   277   output()->print("base ");
   278   print_value(op->base());
   279   if (op->has_index()) {
   280     output()->print(", index "); print_value(op->index());
   281     output()->print(", log2_scale %d", op->log2_scale());
   282   }
   283 }
   286 void InstructionPrinter::print_unsafe_object_op(UnsafeObjectOp* op, const char* name) {
   287   print_unsafe_op(op, name);
   288   print_value(op->object());
   289   output()->print(", ");
   290   print_value(op->offset());
   291 }
   294 void InstructionPrinter::print_phi(int i, Value v, BlockBegin* b) {
   295   Phi* phi = v->as_Phi();
   296   output()->print("%2d  ", i);
   297   print_value(v);
   298   // print phi operands
   299   if (phi && phi->block() == b) {
   300     output()->print(" [");
   301     for (int j = 0; j < phi->operand_count(); j ++) {
   302       output()->print(" ");
   303       Value opd = phi->operand_at(j);
   304       if (opd) print_value(opd);
   305       else output()->print("NULL");
   306     }
   307     output()->print("] ");
   308   }
   309   print_alias(v);
   310 }
   313 void InstructionPrinter::print_alias(Value v) {
   314   if (v != v->subst()) {
   315     output()->print("alias "); print_value(v->subst());
   316   }
   317 }
   320 void InstructionPrinter::fill_to(int pos, char filler) {
   321   while (output()->position() < pos) output()->put(filler);
   322 }
   325 void InstructionPrinter::print_head() {
   326   const char filler = '_';
   327   fill_to(bci_pos  , filler); output()->print("bci"  );
   328   fill_to(use_pos  , filler); output()->print("use"  );
   329   fill_to(temp_pos , filler); output()->print("tid"  );
   330   fill_to(instr_pos, filler); output()->print("instr");
   331   fill_to(end_pos  , filler);
   332   output()->cr();
   333 }
   336 void InstructionPrinter::print_line(Instruction* instr) {
   337   // print instruction data on one line
   338   if (instr->is_pinned()) output()->put('.');
   339   fill_to(bci_pos  ); output()->print("%d", instr->printable_bci());
   340   fill_to(use_pos  ); output()->print("%d", instr->use_count());
   341   fill_to(temp_pos ); print_temp(instr);
   342   fill_to(instr_pos); print_instr(instr);
   343   output()->cr();
   344   // add a line for StateSplit instructions w/ non-empty stacks
   345   // (make it robust so we can print incomplete instructions)
   346   StateSplit* split = instr->as_StateSplit();
   347   if (split != NULL && split->state() != NULL && !split->state()->stack_is_empty()) {
   348     fill_to(instr_pos); print_stack(split->state());
   349     output()->cr();
   350   }
   351 }
   354 void InstructionPrinter::do_Phi(Phi* x) {
   355   output()->print("phi function");  // make that more detailed later
   356   if (x->is_illegal())
   357     output()->print(" (illegal)");
   358 }
   361 void InstructionPrinter::do_Local(Local* x) {
   362   output()->print("local[index %d]", x->java_index());
   363 }
   366 void InstructionPrinter::do_Constant(Constant* x) {
   367   ValueType* t = x->type();
   368   switch (t->tag()) {
   369     case intTag    : output()->print("%d"  , t->as_IntConstant   ()->value());    break;
   370     case longTag   : output()->print(JLONG_FORMAT, t->as_LongConstant()->value()); output()->print("L"); break;
   371     case floatTag  : output()->print("%g"  , t->as_FloatConstant ()->value());    break;
   372     case doubleTag : output()->print("%gD" , t->as_DoubleConstant()->value());    break;
   373     case objectTag : print_object(x);                                        break;
   374     case addressTag: output()->print("bci:%d", t->as_AddressConstant()->value()); break;
   375     default        : output()->print("???");                                      break;
   376   }
   377 }
   380 void InstructionPrinter::do_LoadField(LoadField* x) {
   381   print_field(x);
   382   output()->print(" (%c)", type2char(x->field()->type()->basic_type()));
   383   output()->print(" %s", x->field()->name()->as_utf8());
   384 }
   387 void InstructionPrinter::do_StoreField(StoreField* x) {
   388   print_field(x);
   389   output()->print(" := ");
   390   print_value(x->value());
   391   output()->print(" (%c)", type2char(x->field()->type()->basic_type()));
   392   output()->print(" %s", x->field()->name()->as_utf8());
   393 }
   396 void InstructionPrinter::do_ArrayLength(ArrayLength* x) {
   397   print_value(x->array());
   398   output()->print(".length");
   399 }
   402 void InstructionPrinter::do_LoadIndexed(LoadIndexed* x) {
   403   print_indexed(x);
   404   output()->print(" (%c)", type2char(x->elt_type()));
   405   if (x->check_flag(Instruction::NeedsRangeCheckFlag)) {
   406     output()->print(" [rc]");
   407   }
   408 }
   411 void InstructionPrinter::do_StoreIndexed(StoreIndexed* x) {
   412   print_indexed(x);
   413   output()->print(" := ");
   414   print_value(x->value());
   415   output()->print(" (%c)", type2char(x->elt_type()));
   416   if (x->check_flag(Instruction::NeedsRangeCheckFlag)) {
   417     output()->print(" [rc]");
   418   }
   419 }
   421 void InstructionPrinter::do_NegateOp(NegateOp* x) {
   422   output()->put('-');
   423   print_value(x->x());
   424 }
   427 void InstructionPrinter::do_ArithmeticOp(ArithmeticOp* x) {
   428   print_op2(x);
   429 }
   432 void InstructionPrinter::do_ShiftOp(ShiftOp* x) {
   433   print_op2(x);
   434 }
   437 void InstructionPrinter::do_LogicOp(LogicOp* x) {
   438   print_op2(x);
   439 }
   442 void InstructionPrinter::do_CompareOp(CompareOp* x) {
   443   print_op2(x);
   444 }
   447 void InstructionPrinter::do_IfOp(IfOp* x) {
   448   print_value(x->x());
   449   output()->print(" %s ", cond_name(x->cond()));
   450   print_value(x->y());
   451   output()->print(" ? ");
   452   print_value(x->tval());
   453   output()->print(" : ");
   454   print_value(x->fval());
   455 }
   458 void InstructionPrinter::do_Convert(Convert* x) {
   459   output()->print("%s(", Bytecodes::name(x->op()));
   460   print_value(x->value());
   461   output()->put(')');
   462 }
   465 void InstructionPrinter::do_NullCheck(NullCheck* x) {
   466   output()->print("null_check(");
   467   print_value(x->obj());
   468   output()->put(')');
   469   if (!x->can_trap()) {
   470     output()->print(" (eliminated)");
   471   }
   472 }
   475 void InstructionPrinter::do_TypeCast(TypeCast* x) {
   476   output()->print("type_cast(");
   477   print_value(x->obj());
   478   output()->print(") ");
   479   if (x->declared_type()->is_klass())
   480     print_klass(x->declared_type()->as_klass());
   481   else
   482     output()->print("%s", type2name(x->declared_type()->basic_type()));
   483 }
   486 void InstructionPrinter::do_Invoke(Invoke* x) {
   487   if (x->receiver() != NULL) {
   488     print_value(x->receiver());
   489     output()->print(".");
   490   }
   492   output()->print("%s(", Bytecodes::name(x->code()));
   493   for (int i = 0; i < x->number_of_arguments(); i++) {
   494     if (i > 0) output()->print(", ");
   495     print_value(x->argument_at(i));
   496   }
   497   output()->print_cr(")");
   498   fill_to(instr_pos);
   499   output()->print("%s.%s%s",
   500              x->target()->holder()->name()->as_utf8(),
   501              x->target()->name()->as_utf8(),
   502              x->target()->signature()->as_symbol()->as_utf8());
   503 }
   506 void InstructionPrinter::do_NewInstance(NewInstance* x) {
   507   output()->print("new instance ");
   508   print_klass(x->klass());
   509 }
   512 void InstructionPrinter::do_NewTypeArray(NewTypeArray* x) {
   513   output()->print("new %s array [", basic_type_name(x->elt_type()));
   514   print_value(x->length());
   515   output()->put(']');
   516 }
   519 void InstructionPrinter::do_NewObjectArray(NewObjectArray* x) {
   520   output()->print("new object array [");
   521   print_value(x->length());
   522   output()->print("] ");
   523   print_klass(x->klass());
   524 }
   527 void InstructionPrinter::do_NewMultiArray(NewMultiArray* x) {
   528   output()->print("new multi array [");
   529   Values* dims = x->dims();
   530   for (int i = 0; i < dims->length(); i++) {
   531     if (i > 0) output()->print(", ");
   532     print_value(dims->at(i));
   533   }
   534   output()->print("] ");
   535   print_klass(x->klass());
   536 }
   539 void InstructionPrinter::do_MonitorEnter(MonitorEnter* x) {
   540   output()->print("enter ");
   541   print_monitor(x);
   542 }
   545 void InstructionPrinter::do_MonitorExit(MonitorExit* x) {
   546   output()->print("exit ");
   547   print_monitor(x);
   548 }
   551 void InstructionPrinter::do_Intrinsic(Intrinsic* x) {
   552   const char* name = vmIntrinsics::name_at(x->id());
   553   if (name[0] == '_')  name++;  // strip leading bug from _hashCode, etc.
   554   const char* kname = vmSymbols::name_for(vmIntrinsics::class_for(x->id()));
   555   if (strchr(name, '_') == NULL) {
   556     kname = NULL;
   557   } else {
   558     const char* kptr = strrchr(kname, '/');
   559     if (kptr != NULL)  kname = kptr + 1;
   560   }
   561   if (kname == NULL)
   562     output()->print("%s(", name);
   563   else
   564     output()->print("%s.%s(", kname, name);
   565   for (int i = 0; i < x->number_of_arguments(); i++) {
   566     if (i > 0) output()->print(", ");
   567     print_value(x->argument_at(i));
   568   }
   569   output()->put(')');
   570 }
   573 void InstructionPrinter::do_BlockBegin(BlockBegin* x) {
   574   // print block id
   575   BlockEnd* end = x->end();
   576   output()->print("B%d ", x->block_id());
   578   // print flags
   579   bool printed_flag = false;
   580   if (x->is_set(BlockBegin::std_entry_flag)) {
   581     if (!printed_flag) output()->print("(");
   582     output()->print("S"); printed_flag = true;
   583   }
   584   if (x->is_set(BlockBegin::osr_entry_flag)) {
   585     if (!printed_flag) output()->print("(");
   586     output()->print("O"); printed_flag = true;
   587   }
   588   if (x->is_set(BlockBegin::exception_entry_flag)) {
   589     if (!printed_flag) output()->print("(");
   590     output()->print("E"); printed_flag = true;
   591   }
   592   if (x->is_set(BlockBegin::subroutine_entry_flag)) {
   593     if (!printed_flag) output()->print("(");
   594     output()->print("s"); printed_flag = true;
   595   }
   596   if (x->is_set(BlockBegin::parser_loop_header_flag)) {
   597     if (!printed_flag) output()->print("(");
   598     output()->print("LH"); printed_flag = true;
   599   }
   600   if (x->is_set(BlockBegin::backward_branch_target_flag)) {
   601     if (!printed_flag) output()->print("(");
   602     output()->print("b"); printed_flag = true;
   603   }
   604   if (x->is_set(BlockBegin::was_visited_flag)) {
   605     if (!printed_flag) output()->print("(");
   606     output()->print("V"); printed_flag = true;
   607   }
   608   if (printed_flag) output()->print(") ");
   610   // print block bci range
   611   output()->print("[%d, %d]", x->bci(), (end == NULL ? -1 : end->printable_bci()));
   613   // print block successors
   614   if (end != NULL && end->number_of_sux() > 0) {
   615     output()->print(" ->");
   616     for (int i = 0; i < end->number_of_sux(); i++) {
   617       output()->print(" B%d", end->sux_at(i)->block_id());
   618     }
   619   }
   620   // print exception handlers
   621   if (x->number_of_exception_handlers() > 0) {
   622     output()->print(" (xhandlers ");
   623     for (int i = 0; i < x->number_of_exception_handlers();  i++) {
   624       if (i > 0) output()->print(" ");
   625       output()->print("B%d", x->exception_handler_at(i)->block_id());
   626     }
   627     output()->put(')');
   628   }
   630   // print dominator block
   631   if (x->dominator() != NULL) {
   632     output()->print(" dom B%d", x->dominator()->block_id());
   633   }
   635   // print predecessors and successors
   636   if (x->successors()->length() > 0) {
   637     output()->print(" sux:");
   638     for (int i = 0; i < x->successors()->length(); i ++) {
   639       output()->print(" B%d", x->successors()->at(i)->block_id());
   640     }
   641   }
   643   if (x->number_of_preds() > 0) {
   644     output()->print(" pred:");
   645     for (int i = 0; i < x->number_of_preds(); i ++) {
   646       output()->print(" B%d", x->pred_at(i)->block_id());
   647     }
   648   }
   650   if (!_print_phis) {
   651     return;
   652   }
   654   // print phi functions
   655   bool has_phis_in_locals = false;
   656   bool has_phis_on_stack = false;
   658   if (x->end() && x->end()->state()) {
   659     ValueStack* state = x->state();
   661     int i = 0;
   662     while (!has_phis_on_stack && i < state->stack_size()) {
   663       Value v = state->stack_at_inc(i);
   664       has_phis_on_stack = is_phi_of_block(v, x);
   665     }
   667     do {
   668       for (i = 0; !has_phis_in_locals && i < state->locals_size();) {
   669         Value v = state->local_at(i);
   670         has_phis_in_locals = is_phi_of_block(v, x);
   671         // also ignore illegal HiWords
   672         if (v && !v->type()->is_illegal()) i += v->type()->size(); else i ++;
   673       }
   674       state = state->caller_state();
   675     } while (state != NULL);
   677   }
   679   // print values in locals
   680   if (has_phis_in_locals) {
   681     output()->cr(); output()->print_cr("Locals:");
   683     ValueStack* state = x->state();
   684     do {
   685       for (int i = 0; i < state->locals_size();) {
   686         Value v = state->local_at(i);
   687         if (v) {
   688           print_phi(i, v, x); output()->cr();
   689           // also ignore illegal HiWords
   690           i += (v->type()->is_illegal() ? 1 : v->type()->size());
   691         } else {
   692           i ++;
   693         }
   694       }
   695       output()->cr();
   696       state = state->caller_state();
   697     } while (state != NULL);
   698   }
   700   // print values on stack
   701   if (has_phis_on_stack) {
   702     output()->print_cr("Stack:");
   703     int i = 0;
   704     while (i < x->state()->stack_size()) {
   705       int o = i;
   706       Value v = x->state()->stack_at_inc(i);
   707       if (v) {
   708         print_phi(o, v, x); output()->cr();
   709       }
   710     }
   711   }
   712 }
   715 void InstructionPrinter::do_CheckCast(CheckCast* x) {
   716   output()->print("checkcast(");
   717   print_value(x->obj());
   718   output()->print(") ");
   719   print_klass(x->klass());
   720 }
   723 void InstructionPrinter::do_InstanceOf(InstanceOf* x) {
   724   output()->print("instanceof(");
   725   print_value(x->obj());
   726   output()->print(") ");
   727   print_klass(x->klass());
   728 }
   731 void InstructionPrinter::do_Goto(Goto* x) {
   732   output()->print("goto B%d", x->default_sux()->block_id());
   733   if (x->is_safepoint()) output()->print(" (safepoint)");
   734 }
   737 void InstructionPrinter::do_If(If* x) {
   738   output()->print("if ");
   739   print_value(x->x());
   740   output()->print(" %s ", cond_name(x->cond()));
   741   print_value(x->y());
   742   output()->print(" then B%d else B%d", x->sux_at(0)->block_id(), x->sux_at(1)->block_id());
   743   if (x->is_safepoint()) output()->print(" (safepoint)");
   744 }
   747 void InstructionPrinter::do_IfInstanceOf(IfInstanceOf* x) {
   748   output()->print("<IfInstanceOf>");
   749 }
   752 void InstructionPrinter::do_TableSwitch(TableSwitch* x) {
   753   output()->print("tableswitch ");
   754   if (x->is_safepoint()) output()->print("(safepoint) ");
   755   print_value(x->tag());
   756   output()->cr();
   757   int l = x->length();
   758   for (int i = 0; i < l; i++) {
   759     fill_to(instr_pos);
   760     output()->print_cr("case %5d: B%d", x->lo_key() + i, x->sux_at(i)->block_id());
   761   }
   762   fill_to(instr_pos);
   763   output()->print("default   : B%d", x->default_sux()->block_id());
   764 }
   767 void InstructionPrinter::do_LookupSwitch(LookupSwitch* x) {
   768   output()->print("lookupswitch ");
   769   if (x->is_safepoint()) output()->print("(safepoint) ");
   770   print_value(x->tag());
   771   output()->cr();
   772   int l = x->length();
   773   for (int i = 0; i < l; i++) {
   774     fill_to(instr_pos);
   775     output()->print_cr("case %5d: B%d", x->key_at(i), x->sux_at(i)->block_id());
   776   }
   777   fill_to(instr_pos);
   778   output()->print("default   : B%d", x->default_sux()->block_id());
   779 }
   782 void InstructionPrinter::do_Return(Return* x) {
   783   if (x->result() == NULL) {
   784     output()->print("return");
   785   } else {
   786     output()->print("%creturn ", x->type()->tchar());
   787     print_value(x->result());
   788   }
   789 }
   792 void InstructionPrinter::do_Throw(Throw* x) {
   793   output()->print("throw ");
   794   print_value(x->exception());
   795 }
   798 void InstructionPrinter::do_Base(Base* x) {
   799   output()->print("std entry B%d", x->std_entry()->block_id());
   800   if (x->number_of_sux() > 1) {
   801     output()->print(" osr entry B%d", x->osr_entry()->block_id());
   802   }
   803 }
   806 void InstructionPrinter::do_OsrEntry(OsrEntry* x) {
   807   output()->print("osr entry");
   808 }
   811 void InstructionPrinter::do_ExceptionObject(ExceptionObject* x) {
   812   output()->print("incoming exception");
   813 }
   816 void InstructionPrinter::do_RoundFP(RoundFP* x) {
   817   output()->print("round_fp ");
   818   print_value(x->input());
   819 }
   822 void InstructionPrinter::do_UnsafeGetRaw(UnsafeGetRaw* x) {
   823   print_unsafe_raw_op(x, "UnsafeGetRaw");
   824   output()->put(')');
   825 }
   828 void InstructionPrinter::do_UnsafePutRaw(UnsafePutRaw* x) {
   829   print_unsafe_raw_op(x, "UnsafePutRaw");
   830   output()->print(", value ");
   831   print_value(x->value());
   832   output()->put(')');
   833 }
   836 void InstructionPrinter::do_UnsafeGetObject(UnsafeGetObject* x) {
   837   print_unsafe_object_op(x, "UnsafeGetObject");
   838   output()->put(')');
   839 }
   842 void InstructionPrinter::do_UnsafePutObject(UnsafePutObject* x) {
   843   print_unsafe_object_op(x, "UnsafePutObject");
   844   output()->print(", value ");
   845   print_value(x->value());
   846   output()->put(')');
   847 }
   849 void InstructionPrinter::do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x) {
   850   print_unsafe_object_op(x, x->is_add()?"UnsafeGetAndSetObject (add)":"UnsafeGetAndSetObject");
   851   output()->print(", value ");
   852   print_value(x->value());
   853   output()->put(')');
   854 }
   856 void InstructionPrinter::do_UnsafePrefetchRead(UnsafePrefetchRead* x) {
   857   print_unsafe_object_op(x, "UnsafePrefetchRead");
   858   output()->put(')');
   859 }
   861 void InstructionPrinter::do_RangeCheckPredicate(RangeCheckPredicate* x) {
   863   if (x->x() != NULL && x->y() != NULL) {
   864     output()->print("if ");
   865     print_value(x->x());
   866     output()->print(" %s ", cond_name(x->cond()));
   867     print_value(x->y());
   868     output()->print(" then deoptimize!");
   869   } else {
   870     output()->print("always deoptimize!");
   871   }
   872 }
   874 #ifdef ASSERT
   875 void InstructionPrinter::do_Assert(Assert* x) {
   876   output()->print("assert ");
   877   print_value(x->x());
   878   output()->print(" %s ", cond_name(x->cond()));
   879   print_value(x->y());
   880 }
   881 #endif
   883 void InstructionPrinter::do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) {
   884   print_unsafe_object_op(x, "UnsafePrefetchWrite");
   885   output()->put(')');
   886 }
   888 void InstructionPrinter::do_ProfileCall(ProfileCall* x) {
   889   output()->print("profile ");
   890   print_value(x->recv());
   891   output()->print(" %s.%s", x->method()->holder()->name()->as_utf8(), x->method()->name()->as_utf8());
   892   if (x->known_holder() != NULL) {
   893     output()->print(", ");
   894     print_klass(x->known_holder());
   895     output()->print(" ");
   896   }
   897   for (int i = 0; i < x->nb_profiled_args(); i++) {
   898     if (i > 0) output()->print(", ");
   899     print_value(x->profiled_arg_at(i));
   900     if (x->arg_needs_null_check(i)) {
   901       output()->print(" [NC]");
   902     }
   903   }
   904   output()->put(')');
   905 }
   907 void InstructionPrinter::do_ProfileReturnType(ProfileReturnType* x) {
   908   output()->print("profile ret type ");
   909   print_value(x->ret());
   910   output()->print(" %s.%s", x->method()->holder()->name()->as_utf8(), x->method()->name()->as_utf8());
   911   output()->put(')');
   912 }
   913 void InstructionPrinter::do_ProfileInvoke(ProfileInvoke* x) {
   914   output()->print("profile_invoke ");
   915   output()->print(" %s.%s", x->inlinee()->holder()->name()->as_utf8(), x->inlinee()->name()->as_utf8());
   916   output()->put(')');
   918 }
   920 void InstructionPrinter::do_RuntimeCall(RuntimeCall* x) {
   921   output()->print("call_rt %s(", x->entry_name());
   922   for (int i = 0; i < x->number_of_arguments(); i++) {
   923     if (i > 0) output()->print(", ");
   924     print_value(x->argument_at(i));
   925   }
   926   output()->put(')');
   927 }
   929 void InstructionPrinter::do_MemBar(MemBar* x) {
   930   if (os::is_MP()) {
   931     LIR_Code code = x->code();
   932     switch (code) {
   933       case lir_membar_acquire   : output()->print("membar_acquire"); break;
   934       case lir_membar_release   : output()->print("membar_release"); break;
   935       case lir_membar           : output()->print("membar"); break;
   936       case lir_membar_loadload  : output()->print("membar_loadload"); break;
   937       case lir_membar_storestore: output()->print("membar_storestore"); break;
   938       case lir_membar_loadstore : output()->print("membar_loadstore"); break;
   939       case lir_membar_storeload : output()->print("membar_storeload"); break;
   940       default                   : ShouldNotReachHere(); break;
   941     }
   942   }
   943 }
   945 #endif // PRODUCT

mercurial