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