Merge

Fri, 08 Jan 2010 15:17:42 -0800

author
jrose
date
Fri, 08 Jan 2010 15:17:42 -0800
changeset 1591
136ac23d6ded
parent 1589
174ade00803b
parent 1590
4e6abf09f540
child 1594
5b06c5db3e89

Merge

     1.1 --- a/src/share/vm/code/codeBlob.hpp	Fri Jan 08 09:51:24 2010 -0800
     1.2 +++ b/src/share/vm/code/codeBlob.hpp	Fri Jan 08 15:17:42 2010 -0800
     1.3 @@ -204,7 +204,8 @@
     1.4    virtual void print_value_on(outputStream* st) const PRODUCT_RETURN;
     1.5  
     1.6    // Print the comment associated with offset on stream, if there is one
     1.7 -  void print_block_comment(outputStream* stream, intptr_t offset) {
     1.8 +  virtual void print_block_comment(outputStream* stream, address block_begin) {
     1.9 +    intptr_t offset = (intptr_t)(block_begin - instructions_begin());
    1.10      _comments.print_block_comment(stream, offset);
    1.11    }
    1.12  
     2.1 --- a/src/share/vm/code/nmethod.cpp	Fri Jan 08 09:51:24 2010 -0800
     2.2 +++ b/src/share/vm/code/nmethod.cpp	Fri Jan 08 15:17:42 2010 -0800
     2.3 @@ -56,13 +56,13 @@
     2.4  #endif
     2.5  
     2.6  bool nmethod::is_compiled_by_c1() const {
     2.7 +  if (compiler() == NULL || method() == NULL)  return false;  // can happen during debug printing
     2.8    if (is_native_method()) return false;
     2.9 -  assert(compiler() != NULL, "must be");
    2.10    return compiler()->is_c1();
    2.11  }
    2.12  bool nmethod::is_compiled_by_c2() const {
    2.13 +  if (compiler() == NULL || method() == NULL)  return false;  // can happen during debug printing
    2.14    if (is_native_method()) return false;
    2.15 -  assert(compiler() != NULL, "must be");
    2.16    return compiler()->is_c2();
    2.17  }
    2.18  
    2.19 @@ -2399,6 +2399,107 @@
    2.20    return NULL;
    2.21  }
    2.22  
    2.23 +void nmethod::print_nmethod_labels(outputStream* stream, address block_begin) {
    2.24 +  if (block_begin == entry_point())             stream->print_cr("[Entry Point]");
    2.25 +  if (block_begin == verified_entry_point())    stream->print_cr("[Verified Entry Point]");
    2.26 +  if (block_begin == exception_begin())         stream->print_cr("[Exception Handler]");
    2.27 +  if (block_begin == stub_begin())              stream->print_cr("[Stub Code]");
    2.28 +  if (block_begin == consts_begin())            stream->print_cr("[Constants]");
    2.29 +  if (block_begin == entry_point()) {
    2.30 +    methodHandle m = method();
    2.31 +    if (m.not_null()) {
    2.32 +      stream->print("  # ");
    2.33 +      m->print_value_on(stream);
    2.34 +      stream->cr();
    2.35 +    }
    2.36 +    if (m.not_null() && !is_osr_method()) {
    2.37 +      ResourceMark rm;
    2.38 +      int sizeargs = m->size_of_parameters();
    2.39 +      BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, sizeargs);
    2.40 +      VMRegPair* regs   = NEW_RESOURCE_ARRAY(VMRegPair, sizeargs);
    2.41 +      {
    2.42 +        int sig_index = 0;
    2.43 +        if (!m->is_static())
    2.44 +          sig_bt[sig_index++] = T_OBJECT; // 'this'
    2.45 +        for (SignatureStream ss(m->signature()); !ss.at_return_type(); ss.next()) {
    2.46 +          BasicType t = ss.type();
    2.47 +          sig_bt[sig_index++] = t;
    2.48 +          if (type2size[t] == 2) {
    2.49 +            sig_bt[sig_index++] = T_VOID;
    2.50 +          } else {
    2.51 +            assert(type2size[t] == 1, "size is 1 or 2");
    2.52 +          }
    2.53 +        }
    2.54 +        assert(sig_index == sizeargs, "");
    2.55 +      }
    2.56 +      const char* spname = "sp"; // make arch-specific?
    2.57 +      intptr_t out_preserve = SharedRuntime::java_calling_convention(sig_bt, regs, sizeargs, false);
    2.58 +      int stack_slot_offset = this->frame_size() * wordSize;
    2.59 +      int tab1 = 14, tab2 = 24;
    2.60 +      int sig_index = 0;
    2.61 +      int arg_index = (m->is_static() ? 0 : -1);
    2.62 +      bool did_old_sp = false;
    2.63 +      for (SignatureStream ss(m->signature()); !ss.at_return_type(); ) {
    2.64 +        bool at_this = (arg_index == -1);
    2.65 +        bool at_old_sp = false;
    2.66 +        BasicType t = (at_this ? T_OBJECT : ss.type());
    2.67 +        assert(t == sig_bt[sig_index], "sigs in sync");
    2.68 +        if (at_this)
    2.69 +          stream->print("  # this: ");
    2.70 +        else
    2.71 +          stream->print("  # parm%d: ", arg_index);
    2.72 +        stream->move_to(tab1);
    2.73 +        VMReg fst = regs[sig_index].first();
    2.74 +        VMReg snd = regs[sig_index].second();
    2.75 +        if (fst->is_reg()) {
    2.76 +          stream->print("%s", fst->name());
    2.77 +          if (snd->is_valid())  {
    2.78 +            stream->print(":%s", snd->name());
    2.79 +          }
    2.80 +        } else if (fst->is_stack()) {
    2.81 +          int offset = fst->reg2stack() * VMRegImpl::stack_slot_size + stack_slot_offset;
    2.82 +          if (offset == stack_slot_offset)  at_old_sp = true;
    2.83 +          stream->print("[%s+0x%x]", spname, offset);
    2.84 +        } else {
    2.85 +          stream->print("reg%d:%d??", (int)(intptr_t)fst, (int)(intptr_t)snd);
    2.86 +        }
    2.87 +        stream->print(" ");
    2.88 +        stream->move_to(tab2);
    2.89 +        stream->print("= ");
    2.90 +        if (at_this) {
    2.91 +          m->method_holder()->print_value_on(stream);
    2.92 +        } else {
    2.93 +          bool did_name = false;
    2.94 +          if (!at_this && ss.is_object()) {
    2.95 +            symbolOop name = ss.as_symbol_or_null();
    2.96 +            if (name != NULL) {
    2.97 +              name->print_value_on(stream);
    2.98 +              did_name = true;
    2.99 +            }
   2.100 +          }
   2.101 +          if (!did_name)
   2.102 +            stream->print("%s", type2name(t));
   2.103 +        }
   2.104 +        if (at_old_sp) {
   2.105 +          stream->print("  (%s of caller)", spname);
   2.106 +          did_old_sp = true;
   2.107 +        }
   2.108 +        stream->cr();
   2.109 +        sig_index += type2size[t];
   2.110 +        arg_index += 1;
   2.111 +        if (!at_this)  ss.next();
   2.112 +      }
   2.113 +      if (!did_old_sp) {
   2.114 +        stream->print("  # ");
   2.115 +        stream->move_to(tab1);
   2.116 +        stream->print("[%s+0x%x]", spname, stack_slot_offset);
   2.117 +        stream->print("  (%s of caller)", spname);
   2.118 +        stream->cr();
   2.119 +      }
   2.120 +    }
   2.121 +  }
   2.122 +}
   2.123 +
   2.124  void nmethod::print_code_comment_on(outputStream* st, int column, u_char* begin, u_char* end) {
   2.125    // First, find an oopmap in (begin, end].
   2.126    // We use the odd half-closed interval so that oop maps and scope descs
     3.1 --- a/src/share/vm/code/nmethod.hpp	Fri Jan 08 09:51:24 2010 -0800
     3.2 +++ b/src/share/vm/code/nmethod.hpp	Fri Jan 08 15:17:42 2010 -0800
     3.3 @@ -576,6 +576,13 @@
     3.4    void log_new_nmethod() const;
     3.5    void log_state_change() const;
     3.6  
     3.7 +  // Prints block-level comments, including nmethod specific block labels:
     3.8 +  virtual void print_block_comment(outputStream* stream, address block_begin) {
     3.9 +    print_nmethod_labels(stream, block_begin);
    3.10 +    CodeBlob::print_block_comment(stream, block_begin);
    3.11 +  }
    3.12 +  void print_nmethod_labels(outputStream* stream, address block_begin);
    3.13 +
    3.14    // Prints a comment for one native instruction (reloc info, pc desc)
    3.15    void print_code_comment_on(outputStream* st, int column, address begin, address end);
    3.16    static void print_statistics()                  PRODUCT_RETURN;
     4.1 --- a/src/share/vm/compiler/compilerOracle.cpp	Fri Jan 08 09:51:24 2010 -0800
     4.2 +++ b/src/share/vm/compiler/compilerOracle.cpp	Fri Jan 08 15:17:42 2010 -0800
     4.3 @@ -392,18 +392,18 @@
     4.4  };
     4.5  
     4.6  static MethodMatcher::Mode check_mode(char name[], const char*& error_msg) {
     4.7 -  if (strcmp(name, "*") == 0) return MethodMatcher::Any;
     4.8 -
     4.9    int match = MethodMatcher::Exact;
    4.10 -  if (name[0] == '*') {
    4.11 +  while (name[0] == '*') {
    4.12      match |= MethodMatcher::Suffix;
    4.13      strcpy(name, name + 1);
    4.14    }
    4.15  
    4.16 +  if (strcmp(name, "*") == 0) return MethodMatcher::Any;
    4.17 +
    4.18    size_t len = strlen(name);
    4.19 -  if (len > 0 && name[len - 1] == '*') {
    4.20 +  while (len > 0 && name[len - 1] == '*') {
    4.21      match |= MethodMatcher::Prefix;
    4.22 -    name[len - 1] = '\0';
    4.23 +    name[--len] = '\0';
    4.24    }
    4.25  
    4.26    if (strstr(name, "*") != NULL) {
    4.27 @@ -610,6 +610,14 @@
    4.28    CompilerOracle::parse_from_string(CompileCommand, CompilerOracle::parse_from_line);
    4.29    CompilerOracle::parse_from_string(CompileOnly, CompilerOracle::parse_compile_only);
    4.30    CompilerOracle::parse_from_file();
    4.31 +  if (lists[PrintCommand] != NULL) {
    4.32 +    if (PrintAssembly) {
    4.33 +      warning("CompileCommand and/or .hotspot_compiler file contains 'print' commands, but PrintAssembly is also enabled");
    4.34 +    } else if (FLAG_IS_DEFAULT(DebugNonSafepoints)) {
    4.35 +      warning("printing of assembly code is enabled; turning on DebugNonSafepoints to gain additional output");
    4.36 +      DebugNonSafepoints = true;
    4.37 +    }
    4.38 +  }
    4.39  }
    4.40  
    4.41  
     5.1 --- a/src/share/vm/compiler/disassembler.cpp	Fri Jan 08 09:51:24 2010 -0800
     5.2 +++ b/src/share/vm/compiler/disassembler.cpp	Fri Jan 08 15:17:42 2010 -0800
     5.3 @@ -151,8 +151,10 @@
     5.4      outputStream* st = output();
     5.5      if (_print_bytes && pc > pc0)
     5.6        print_insn_bytes(pc0, pc);
     5.7 -    if (_nm != NULL)
     5.8 +    if (_nm != NULL) {
     5.9        _nm->print_code_comment_on(st, COMMENT_COLUMN, pc0, pc);
    5.10 +      // this calls reloc_string_for which calls oop::print_value_on
    5.11 +    }
    5.12  
    5.13      // Output pc bucket ticks if we have any
    5.14      if (total_ticks() != 0) {
    5.15 @@ -273,8 +275,15 @@
    5.16      oop obj;
    5.17      if (_nm != NULL
    5.18          && (obj = _nm->embeddedOop_at(cur_insn())) != NULL
    5.19 -        && (address) obj == adr) {
    5.20 +        && (address) obj == adr
    5.21 +        && Universe::heap()->is_in(obj)
    5.22 +        && Universe::heap()->is_in(obj->klass())) {
    5.23 +      julong c = st->count();
    5.24        obj->print_value_on(st);
    5.25 +      if (st->count() == c) {
    5.26 +        // No output.  (Can happen in product builds.)
    5.27 +        st->print("(a %s)", Klass::cast(obj->klass())->external_name());
    5.28 +      }
    5.29        return;
    5.30      }
    5.31    }
    5.32 @@ -286,17 +295,9 @@
    5.33  void decode_env::print_insn_labels() {
    5.34    address p = cur_insn();
    5.35    outputStream* st = output();
    5.36 -  nmethod* nm = _nm;
    5.37 -  if (nm != NULL) {
    5.38 -    if (p == nm->entry_point())             st->print_cr("[Entry Point]");
    5.39 -    if (p == nm->verified_entry_point())    st->print_cr("[Verified Entry Point]");
    5.40 -    if (p == nm->exception_begin())         st->print_cr("[Exception Handler]");
    5.41 -    if (p == nm->stub_begin())              st->print_cr("[Stub Code]");
    5.42 -    if (p == nm->consts_begin())            st->print_cr("[Constants]");
    5.43 -  }
    5.44    CodeBlob* cb = _code;
    5.45    if (cb != NULL) {
    5.46 -    cb->print_block_comment(st, (intptr_t)(p - cb->instructions_begin()));
    5.47 +    cb->print_block_comment(st, p);
    5.48    }
    5.49    if (_print_pc) {
    5.50      st->print("  " INTPTR_FORMAT ": ", (intptr_t) p);
     6.1 --- a/src/share/vm/includeDB_core	Fri Jan 08 09:51:24 2010 -0800
     6.2 +++ b/src/share/vm/includeDB_core	Fri Jan 08 15:17:42 2010 -0800
     6.3 @@ -1525,6 +1525,7 @@
     6.4  disassembler.cpp                        fprofiler.hpp
     6.5  disassembler.cpp                        handles.inline.hpp
     6.6  disassembler.cpp                        hpi.hpp
     6.7 +disassembler.cpp                        javaClasses.hpp
     6.8  disassembler.cpp                        stubCodeGenerator.hpp
     6.9  disassembler.cpp                        stubRoutines.hpp
    6.10  
     7.1 --- a/src/share/vm/memory/genCollectedHeap.cpp	Fri Jan 08 09:51:24 2010 -0800
     7.2 +++ b/src/share/vm/memory/genCollectedHeap.cpp	Fri Jan 08 15:17:42 2010 -0800
     7.3 @@ -925,6 +925,8 @@
     7.4    guarantee(VerifyBeforeGC   ||
     7.5              VerifyDuringGC   ||
     7.6              VerifyBeforeExit ||
     7.7 +            PrintAssembly    ||
     7.8 +            tty->count() != 0 ||   // already printing
     7.9              VerifyAfterGC, "too expensive");
    7.10    #endif
    7.11    // This might be sped up with a cache of the last generation that
     8.1 --- a/src/share/vm/oops/arrayKlassKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
     8.2 +++ b/src/share/vm/oops/arrayKlassKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
     8.3 @@ -159,7 +159,7 @@
     8.4    assert(obj->is_klass(), "must be klass");
     8.5    klassKlass::oop_print_on(obj, st);
     8.6  }
     8.7 -
     8.8 +#endif //PRODUCT
     8.9  
    8.10  void arrayKlassKlass::oop_print_value_on(oop obj, outputStream* st) {
    8.11    assert(obj->is_klass(), "must be klass");
    8.12 @@ -168,7 +168,6 @@
    8.13      st->print("[]");
    8.14    }
    8.15  }
    8.16 -#endif
    8.17  
    8.18  
    8.19  const char* arrayKlassKlass::internal_name() const {
     9.1 --- a/src/share/vm/oops/arrayKlassKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
     9.2 +++ b/src/share/vm/oops/arrayKlassKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
     9.3 @@ -55,14 +55,13 @@
     9.4    int oop_oop_iterate(oop obj, OopClosure* blk);
     9.5    int oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr);
     9.6  
     9.7 -#ifndef PRODUCT
     9.8   public:
     9.9    // Printing
    9.10 +  void oop_print_value_on(oop obj, outputStream* st);
    9.11 +#ifndef PRODUCT
    9.12    void oop_print_on(oop obj, outputStream* st);
    9.13 -  void oop_print_value_on(oop obj, outputStream* st);
    9.14 -#endif
    9.15 +#endif //PRODUCT
    9.16  
    9.17 - public:
    9.18    // Verification
    9.19    const char* internal_name() const;
    9.20    void oop_verify_on(oop obj, outputStream* st);
    10.1 --- a/src/share/vm/oops/compiledICHolderKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
    10.2 +++ b/src/share/vm/oops/compiledICHolderKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
    10.3 @@ -166,12 +166,12 @@
    10.4    st->print(" - klass:  "); c->holder_klass()->print_value_on(st); st->cr();
    10.5  }
    10.6  
    10.7 +#endif //PRODUCT
    10.8  
    10.9  void compiledICHolderKlass::oop_print_value_on(oop obj, outputStream* st) {
   10.10    assert(obj->is_compiledICHolder(), "must be compiledICHolder");
   10.11    Klass::oop_print_value_on(obj, st);
   10.12  }
   10.13 -#endif
   10.14  
   10.15  const char* compiledICHolderKlass::internal_name() const {
   10.16    return "{compiledICHolder}";
    11.1 --- a/src/share/vm/oops/compiledICHolderKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
    11.2 +++ b/src/share/vm/oops/compiledICHolderKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
    11.3 @@ -68,14 +68,13 @@
    11.4    int  oop_oop_iterate(oop obj, OopClosure* blk);
    11.5    int  oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr);
    11.6  
    11.7 -#ifndef PRODUCT
    11.8   public:
    11.9    // Printing
   11.10 +  void oop_print_value_on(oop obj, outputStream* st);
   11.11 +#ifndef PRODUCT
   11.12    void oop_print_on      (oop obj, outputStream* st);
   11.13 -  void oop_print_value_on(oop obj, outputStream* st);
   11.14 -#endif
   11.15 +#endif //PRODUCT
   11.16  
   11.17 - public:
   11.18    // Verification
   11.19    const char* internal_name() const;
   11.20    void oop_verify_on(oop obj, outputStream* st);
    12.1 --- a/src/share/vm/oops/constMethodKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
    12.2 +++ b/src/share/vm/oops/constMethodKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
    12.3 @@ -216,6 +216,7 @@
    12.4    }
    12.5  }
    12.6  
    12.7 +#endif //PRODUCT
    12.8  
    12.9  // Short version of printing constMethodOop - just print the name of the
   12.10  // method it belongs to.
   12.11 @@ -226,8 +227,6 @@
   12.12    m->method()->print_value_on(st);
   12.13  }
   12.14  
   12.15 -#endif // PRODUCT
   12.16 -
   12.17  const char* constMethodKlass::internal_name() const {
   12.18    return "{constMethod}";
   12.19  }
    13.1 --- a/src/share/vm/oops/constMethodKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
    13.2 +++ b/src/share/vm/oops/constMethodKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
    13.3 @@ -77,15 +77,13 @@
    13.4    int oop_oop_iterate(oop obj, OopClosure* blk);
    13.5    int oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr);
    13.6  
    13.7 -#ifndef PRODUCT
    13.8   public:
    13.9    // Printing
   13.10 +  void oop_print_value_on(oop obj, outputStream* st);
   13.11 +#ifndef PRODUCT
   13.12    void oop_print_on      (oop obj, outputStream* st);
   13.13 -  void oop_print_value_on(oop obj, outputStream* st);
   13.14 +#endif //PRODUCT
   13.15  
   13.16 -#endif
   13.17 -
   13.18 - public:
   13.19    // Verify operations
   13.20    const char* internal_name() const;
   13.21    void oop_verify_on(oop obj, outputStream* st);
    14.1 --- a/src/share/vm/oops/constantPoolKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
    14.2 +++ b/src/share/vm/oops/constantPoolKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
    14.3 @@ -387,8 +387,18 @@
    14.4    cp->set_cache(cache());
    14.5  }
    14.6  
    14.7 +#endif
    14.8  
    14.9 -#endif
   14.10 +void constantPoolKlass::oop_print_value_on(oop obj, outputStream* st) {
   14.11 +  assert(obj->is_constantPool(), "must be constantPool");
   14.12 +  constantPoolOop cp = constantPoolOop(obj);
   14.13 +  st->print("constant pool [%d]", cp->length());
   14.14 +  if (cp->has_pseudo_string()) st->print("/pseudo_string");
   14.15 +  if (cp->has_invokedynamic()) st->print("/invokedynamic");
   14.16 +  cp->print_address_on(st);
   14.17 +  st->print(" for ");
   14.18 +  cp->pool_holder()->print_value_on(st);
   14.19 +}
   14.20  
   14.21  const char* constantPoolKlass::internal_name() const {
   14.22    return "{constant pool}";
    15.1 --- a/src/share/vm/oops/constantPoolKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
    15.2 +++ b/src/share/vm/oops/constantPoolKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
    15.3 @@ -65,9 +65,10 @@
    15.4    juint alloc_size() const              { return _alloc_size; }
    15.5    void set_alloc_size(juint n)          { _alloc_size = n; }
    15.6  
    15.7 -#ifndef PRODUCT
    15.8   public:
    15.9    // Printing
   15.10 +  void oop_print_value_on(oop obj, outputStream* st);
   15.11 +#ifndef PRODUCT
   15.12    void oop_print_on(oop obj, outputStream* st);
   15.13  #endif
   15.14  
    16.1 --- a/src/share/vm/oops/cpCacheKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
    16.2 +++ b/src/share/vm/oops/cpCacheKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
    16.3 @@ -261,6 +261,15 @@
    16.4  
    16.5  #endif
    16.6  
    16.7 +void constantPoolCacheKlass::oop_print_value_on(oop obj, outputStream* st) {
    16.8 +  assert(obj->is_constantPoolCache(), "obj must be constant pool cache");
    16.9 +  constantPoolCacheOop cache = (constantPoolCacheOop)obj;
   16.10 +  st->print("cache [%d]", cache->length());
   16.11 +  cache->print_address_on(st);
   16.12 +  st->print(" for ");
   16.13 +  cache->constant_pool()->print_value_on(st);
   16.14 +}
   16.15 +
   16.16  void constantPoolCacheKlass::oop_verify_on(oop obj, outputStream* st) {
   16.17    guarantee(obj->is_constantPoolCache(), "obj must be constant pool cache");
   16.18    constantPoolCacheOop cache = (constantPoolCacheOop)obj;
    17.1 --- a/src/share/vm/oops/cpCacheKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
    17.2 +++ b/src/share/vm/oops/cpCacheKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
    17.3 @@ -61,9 +61,10 @@
    17.4    juint alloc_size() const              { return _alloc_size; }
    17.5    void set_alloc_size(juint n)          { _alloc_size = n; }
    17.6  
    17.7 -#ifndef PRODUCT
    17.8   public:
    17.9    // Printing
   17.10 +  void oop_print_value_on(oop obj, outputStream* st);
   17.11 +#ifndef PRODUCT
   17.12    void oop_print_on(oop obj, outputStream* st);
   17.13  #endif
   17.14  
    18.1 --- a/src/share/vm/oops/instanceKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
    18.2 +++ b/src/share/vm/oops/instanceKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
    18.3 @@ -2268,6 +2268,8 @@
    18.4    }
    18.5  }
    18.6  
    18.7 +#endif //PRODUCT
    18.8 +
    18.9  void instanceKlass::oop_print_value_on(oop obj, outputStream* st) {
   18.10    st->print("a ");
   18.11    name()->print_value_on(st);
   18.12 @@ -2299,8 +2301,6 @@
   18.13    }
   18.14  }
   18.15  
   18.16 -#endif // ndef PRODUCT
   18.17 -
   18.18  const char* instanceKlass::internal_name() const {
   18.19    return external_name();
   18.20  }
    19.1 --- a/src/share/vm/oops/instanceKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
    19.2 +++ b/src/share/vm/oops/instanceKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
    19.3 @@ -839,17 +839,16 @@
    19.4    // JVMTI support
    19.5    jint jvmti_class_status() const;
    19.6  
    19.7 -#ifndef PRODUCT
    19.8   public:
    19.9    // Printing
   19.10 +  void oop_print_value_on(oop obj, outputStream* st);
   19.11 +#ifndef PRODUCT
   19.12    void oop_print_on      (oop obj, outputStream* st);
   19.13 -  void oop_print_value_on(oop obj, outputStream* st);
   19.14  
   19.15    void print_dependent_nmethods(bool verbose = false);
   19.16    bool is_dependent_nmethod(nmethod* nm);
   19.17  #endif
   19.18  
   19.19 - public:
   19.20    // Verification
   19.21    const char* internal_name() const;
   19.22    void oop_verify_on(oop obj, outputStream* st);
    20.1 --- a/src/share/vm/oops/instanceKlassKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
    20.2 +++ b/src/share/vm/oops/instanceKlassKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
    20.3 @@ -638,6 +638,7 @@
    20.4    st->cr();
    20.5  }
    20.6  
    20.7 +#endif //PRODUCT
    20.8  
    20.9  void instanceKlassKlass::oop_print_value_on(oop obj, outputStream* st) {
   20.10    assert(obj->is_klass(), "must be klass");
   20.11 @@ -645,8 +646,6 @@
   20.12    ik->name()->print_value_on(st);
   20.13  }
   20.14  
   20.15 -#endif // PRODUCT
   20.16 -
   20.17  const char* instanceKlassKlass::internal_name() const {
   20.18    return "{instance class}";
   20.19  }
    21.1 --- a/src/share/vm/oops/instanceKlassKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
    21.2 +++ b/src/share/vm/oops/instanceKlassKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
    21.3 @@ -69,14 +69,13 @@
    21.4    // Apply closure to the InstanceKlass oops that are outside the java heap.
    21.5    inline void iterate_c_heap_oops(instanceKlass* ik, OopClosure* closure);
    21.6  
    21.7 -#ifndef PRODUCT
    21.8   public:
    21.9    // Printing
   21.10 +  void oop_print_value_on(oop obj, outputStream* st);
   21.11 +#ifndef PRODUCT
   21.12    void oop_print_on(oop obj, outputStream* st);
   21.13 -  void oop_print_value_on(oop obj, outputStream* st);
   21.14  #endif
   21.15  
   21.16 - public:
   21.17    // Verification
   21.18    const char* internal_name() const;
   21.19    void oop_verify_on(oop obj, outputStream* st);
    22.1 --- a/src/share/vm/oops/klass.cpp	Fri Jan 08 09:51:24 2010 -0800
    22.2 +++ b/src/share/vm/oops/klass.cpp	Fri Jan 08 15:17:42 2010 -0800
    22.3 @@ -541,6 +541,7 @@
    22.4    st->cr();
    22.5  }
    22.6  
    22.7 +#endif //PRODUCT
    22.8  
    22.9  void Klass::oop_print_value_on(oop obj, outputStream* st) {
   22.10    // print title
   22.11 @@ -549,8 +550,6 @@
   22.12    obj->print_address_on(st);
   22.13  }
   22.14  
   22.15 -#endif
   22.16 -
   22.17  // Verification
   22.18  
   22.19  void Klass::oop_verify_on(oop obj, outputStream* st) {
    23.1 --- a/src/share/vm/oops/klass.hpp	Fri Jan 08 09:51:24 2010 -0800
    23.2 +++ b/src/share/vm/oops/klass.hpp	Fri Jan 08 15:17:42 2010 -0800
    23.3 @@ -776,14 +776,13 @@
    23.4    // JVMTI support
    23.5    virtual jint jvmti_class_status() const;
    23.6  
    23.7 -#ifndef PRODUCT
    23.8   public:
    23.9    // Printing
   23.10 +  virtual void oop_print_value_on(oop obj, outputStream* st);
   23.11 +#ifndef PRODUCT
   23.12    virtual void oop_print_on      (oop obj, outputStream* st);
   23.13 -  virtual void oop_print_value_on(oop obj, outputStream* st);
   23.14 -#endif
   23.15 +#endif //PRODUCT
   23.16  
   23.17 - public:
   23.18    // Verification
   23.19    virtual const char* internal_name() const = 0;
   23.20    virtual void oop_verify_on(oop obj, outputStream* st);
    24.1 --- a/src/share/vm/oops/klassKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
    24.2 +++ b/src/share/vm/oops/klassKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
    24.3 @@ -202,13 +202,12 @@
    24.4    Klass::oop_print_on(obj, st);
    24.5  }
    24.6  
    24.7 +#endif //PRODUCT
    24.8  
    24.9  void klassKlass::oop_print_value_on(oop obj, outputStream* st) {
   24.10    Klass::oop_print_value_on(obj, st);
   24.11  }
   24.12  
   24.13 -#endif
   24.14 -
   24.15  const char* klassKlass::internal_name() const {
   24.16    return "{other class}";
   24.17  }
    25.1 --- a/src/share/vm/oops/klassKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
    25.2 +++ b/src/share/vm/oops/klassKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
    25.3 @@ -67,14 +67,13 @@
    25.4    juint alloc_size() const              { return _alloc_size; }
    25.5    void set_alloc_size(juint n)          { _alloc_size = n; }
    25.6  
    25.7 -#ifndef PRODUCT
    25.8   public:
    25.9    // Printing
   25.10 +  void oop_print_value_on(oop obj, outputStream* st);
   25.11 +#ifndef PRODUCT
   25.12    void oop_print_on      (oop obj, outputStream* st);
   25.13 -  void oop_print_value_on(oop obj, outputStream* st);
   25.14 -#endif
   25.15 +#endif //PRODUCT
   25.16  
   25.17 - public:
   25.18    // Verification
   25.19    const char* internal_name() const;
   25.20    void oop_verify_on(oop obj, outputStream* st);
    26.1 --- a/src/share/vm/oops/methodDataKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
    26.2 +++ b/src/share/vm/oops/methodDataKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
    26.3 @@ -214,6 +214,8 @@
    26.4    m->print_data_on(st);
    26.5  }
    26.6  
    26.7 +#endif //PRODUCT
    26.8 +
    26.9  void methodDataKlass::oop_print_value_on(oop obj, outputStream* st) {
   26.10    assert(obj->is_methodData(), "should be method data");
   26.11    methodDataOop m = methodDataOop(obj);
   26.12 @@ -221,8 +223,6 @@
   26.13    m->method()->print_value_on(st);
   26.14  }
   26.15  
   26.16 -#endif // !PRODUCT
   26.17 -
   26.18  const char* methodDataKlass::internal_name() const {
   26.19    return "{method data}";
   26.20  }
    27.1 --- a/src/share/vm/oops/methodDataKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
    27.2 +++ b/src/share/vm/oops/methodDataKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
    27.3 @@ -71,14 +71,13 @@
    27.4    int oop_oop_iterate(oop obj, OopClosure* blk);
    27.5    int oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr);
    27.6  
    27.7 -#ifndef PRODUCT
    27.8   public:
    27.9    // Printing
   27.10 +  void oop_print_value_on(oop obj, outputStream* st);
   27.11 +#ifndef PRODUCT
   27.12    void oop_print_on      (oop obj, outputStream* st);
   27.13 -  void oop_print_value_on(oop obj, outputStream* st);
   27.14 -#endif // !PRODUCT
   27.15 +#endif //PRODUCT
   27.16  
   27.17 - public:
   27.18    // Verify operations
   27.19    const char* internal_name() const;
   27.20    void oop_verify_on(oop obj, outputStream* st);
    28.1 --- a/src/share/vm/oops/methodKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
    28.2 +++ b/src/share/vm/oops/methodKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
    28.3 @@ -308,6 +308,7 @@
    28.4    }
    28.5  }
    28.6  
    28.7 +#endif //PRODUCT
    28.8  
    28.9  void methodKlass::oop_print_value_on(oop obj, outputStream* st) {
   28.10    assert(obj->is_method(), "must be method");
   28.11 @@ -323,8 +324,6 @@
   28.12    if (WizardMode && m->code() != NULL) st->print(" ((nmethod*)%p)", m->code());
   28.13  }
   28.14  
   28.15 -#endif // PRODUCT
   28.16 -
   28.17  const char* methodKlass::internal_name() const {
   28.18    return "{method}";
   28.19  }
    29.1 --- a/src/share/vm/oops/methodKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
    29.2 +++ b/src/share/vm/oops/methodKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
    29.3 @@ -68,14 +68,13 @@
    29.4    int oop_oop_iterate(oop obj, OopClosure* blk);
    29.5    int oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr);
    29.6  
    29.7 -#ifndef PRODUCT
    29.8   public:
    29.9    // Printing
   29.10 +  void oop_print_value_on(oop obj, outputStream* st);
   29.11 +#ifndef PRODUCT
   29.12    void oop_print_on      (oop obj, outputStream* st);
   29.13 -  void oop_print_value_on(oop obj, outputStream* st);
   29.14 -#endif
   29.15 +#endif //PRODUCT
   29.16  
   29.17 - public:
   29.18    // Verify operations
   29.19    const char* internal_name() const;
   29.20    void oop_verify_on(oop obj, outputStream* st);
    30.1 --- a/src/share/vm/oops/objArrayKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
    30.2 +++ b/src/share/vm/oops/objArrayKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
    30.3 @@ -499,6 +499,8 @@
    30.4    }
    30.5  }
    30.6  
    30.7 +#endif //PRODUCT
    30.8 +
    30.9  static int max_objArray_print_length = 4;
   30.10  
   30.11  void objArrayKlass::oop_print_value_on(oop obj, outputStream* st) {
   30.12 @@ -508,7 +510,7 @@
   30.13    int len = objArrayOop(obj)->length();
   30.14    st->print("[%d] ", len);
   30.15    obj->print_address_on(st);
   30.16 -  if (PrintOopAddress || PrintMiscellaneous && (WizardMode || Verbose)) {
   30.17 +  if (NOT_PRODUCT(PrintOopAddress ||) PrintMiscellaneous && (WizardMode || Verbose)) {
   30.18      st->print("{");
   30.19      for (int i = 0; i < len; i++) {
   30.20        if (i > max_objArray_print_length) {
   30.21 @@ -520,8 +522,6 @@
   30.22    }
   30.23  }
   30.24  
   30.25 -#endif // PRODUCT
   30.26 -
   30.27  const char* objArrayKlass::internal_name() const {
   30.28    return external_name();
   30.29  }
    31.1 --- a/src/share/vm/oops/objArrayKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
    31.2 +++ b/src/share/vm/oops/objArrayKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
    31.3 @@ -119,14 +119,13 @@
    31.4   private:
    31.5     static klassOop array_klass_impl   (objArrayKlassHandle this_oop, bool or_null, int n, TRAPS);
    31.6  
    31.7 -#ifndef PRODUCT
    31.8   public:
    31.9    // Printing
   31.10 +  void oop_print_value_on(oop obj, outputStream* st);
   31.11 +#ifndef PRODUCT
   31.12    void oop_print_on      (oop obj, outputStream* st);
   31.13 -  void oop_print_value_on(oop obj, outputStream* st);
   31.14 -#endif
   31.15 +#endif //PRODUCT
   31.16  
   31.17 - public:
   31.18    // Verification
   31.19    const char* internal_name() const;
   31.20    void oop_verify_on(oop obj, outputStream* st);
    32.1 --- a/src/share/vm/oops/objArrayKlassKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
    32.2 +++ b/src/share/vm/oops/objArrayKlassKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
    32.3 @@ -278,6 +278,7 @@
    32.4    st->cr();
    32.5  }
    32.6  
    32.7 +#endif //PRODUCT
    32.8  
    32.9  void objArrayKlassKlass::oop_print_value_on(oop obj, outputStream* st) {
   32.10    assert(obj->is_klass(), "must be klass");
   32.11 @@ -287,8 +288,6 @@
   32.12    st->print("[]");
   32.13  }
   32.14  
   32.15 -#endif
   32.16 -
   32.17  const char* objArrayKlassKlass::internal_name() const {
   32.18    return "{object array class}";
   32.19  }
    33.1 --- a/src/share/vm/oops/objArrayKlassKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
    33.2 +++ b/src/share/vm/oops/objArrayKlassKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
    33.3 @@ -64,14 +64,13 @@
    33.4    // helpers
    33.5    static klassOop allocate_objArray_klass_impl(objArrayKlassKlassHandle this_oop, int n, KlassHandle element_klass, TRAPS);
    33.6  
    33.7 -#ifndef PRODUCT
    33.8   public:
    33.9    // Printing
   33.10 +  void oop_print_value_on(oop obj, outputStream* st);
   33.11 +#ifndef PRODUCT
   33.12    void oop_print_on(oop obj, outputStream* st);
   33.13 -  void oop_print_value_on(oop obj, outputStream* st);
   33.14 -#endif
   33.15 +#endif //PRODUCT
   33.16  
   33.17 - public:
   33.18    // Verification
   33.19    const char* internal_name() const;
   33.20    void oop_verify_on(oop obj, outputStream* st);
    34.1 --- a/src/share/vm/oops/oop.cpp	Fri Jan 08 09:51:24 2010 -0800
    34.2 +++ b/src/share/vm/oops/oop.cpp	Fri Jan 08 15:17:42 2010 -0800
    34.3 @@ -31,14 +31,13 @@
    34.4  
    34.5  #ifdef PRODUCT
    34.6  void oopDesc::print_on(outputStream* st) const {}
    34.7 -void oopDesc::print_value_on(outputStream* st) const {}
    34.8  void oopDesc::print_address_on(outputStream* st) const {}
    34.9 -char* oopDesc::print_value_string() { return NULL; }
   34.10  char* oopDesc::print_string() { return NULL; }
   34.11  void oopDesc::print()         {}
   34.12 -void oopDesc::print_value()   {}
   34.13  void oopDesc::print_address() {}
   34.14 -#else
   34.15 +
   34.16 +#else //PRODUCT
   34.17 +
   34.18  void oopDesc::print_on(outputStream* st) const {
   34.19    if (this == NULL) {
   34.20      st->print_cr("NULL");
   34.21 @@ -47,22 +46,6 @@
   34.22    }
   34.23  }
   34.24  
   34.25 -void oopDesc::print_value_on(outputStream* st) const {
   34.26 -  oop obj = oop(this);
   34.27 -  if (this == NULL) {
   34.28 -    st->print("NULL");
   34.29 -  } else if (java_lang_String::is_instance(obj)) {
   34.30 -    java_lang_String::print(obj, st);
   34.31 -    if (PrintOopAddress) print_address_on(st);
   34.32 -#ifdef ASSERT
   34.33 -  } else if (!Universe::heap()->is_in(obj) || !Universe::heap()->is_in(klass())) {
   34.34 -    st->print("### BAD OOP %p ###", (address)obj);
   34.35 -#endif
   34.36 -  } else {
   34.37 -    blueprint()->oop_print_value_on(obj, st);
   34.38 -  }
   34.39 -}
   34.40 -
   34.41  void oopDesc::print_address_on(outputStream* st) const {
   34.42    if (PrintOopAddress) {
   34.43      st->print("{"INTPTR_FORMAT"}", this);
   34.44 @@ -71,23 +54,47 @@
   34.45  
   34.46  void oopDesc::print()         { print_on(tty);         }
   34.47  
   34.48 -void oopDesc::print_value()   { print_value_on(tty);   }
   34.49 -
   34.50  void oopDesc::print_address() { print_address_on(tty); }
   34.51  
   34.52  char* oopDesc::print_string() {
   34.53 -  stringStream* st = new stringStream();
   34.54 -  print_on(st);
   34.55 -  return st->as_string();
   34.56 +  stringStream st;
   34.57 +  print_on(&st);
   34.58 +  return st.as_string();
   34.59 +}
   34.60 +
   34.61 +#endif // PRODUCT
   34.62 +
   34.63 +// The print_value functions are present in all builds, to support the disassembler.
   34.64 +
   34.65 +void oopDesc::print_value() {
   34.66 +  print_value_on(tty);
   34.67  }
   34.68  
   34.69  char* oopDesc::print_value_string() {
   34.70 -  stringStream* st = new stringStream();
   34.71 -  print_value_on(st);
   34.72 -  return st->as_string();
   34.73 +  char buf[100];
   34.74 +  stringStream st(buf, sizeof(buf));
   34.75 +  print_value_on(&st);
   34.76 +  return st.as_string();
   34.77  }
   34.78  
   34.79 -#endif // PRODUCT
   34.80 +void oopDesc::print_value_on(outputStream* st) const {
   34.81 +  oop obj = oop(this);
   34.82 +  if (this == NULL) {
   34.83 +    st->print("NULL");
   34.84 +  } else if (java_lang_String::is_instance(obj)) {
   34.85 +    java_lang_String::print(obj, st);
   34.86 +#ifndef PRODUCT
   34.87 +    if (PrintOopAddress) print_address_on(st);
   34.88 +#endif //PRODUCT
   34.89 +#ifdef ASSERT
   34.90 +  } else if (!Universe::heap()->is_in(obj) || !Universe::heap()->is_in(klass())) {
   34.91 +    st->print("### BAD OOP %p ###", (address)obj);
   34.92 +#endif //ASSERT
   34.93 +  } else {
   34.94 +    blueprint()->oop_print_value_on(obj, st);
   34.95 +  }
   34.96 +}
   34.97 +
   34.98  
   34.99  void oopDesc::verify_on(outputStream* st) {
  34.100    if (this != NULL) {
    35.1 --- a/src/share/vm/oops/symbolKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
    35.2 +++ b/src/share/vm/oops/symbolKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
    35.3 @@ -213,6 +213,8 @@
    35.4    st->print("'");
    35.5  }
    35.6  
    35.7 +#endif //PRODUCT
    35.8 +
    35.9  void symbolKlass::oop_print_value_on(oop obj, outputStream* st) {
   35.10    symbolOop sym = symbolOop(obj);
   35.11    st->print("'");
   35.12 @@ -222,8 +224,6 @@
   35.13    st->print("'");
   35.14  }
   35.15  
   35.16 -#endif //PRODUCT
   35.17 -
   35.18  const char* symbolKlass::internal_name() const {
   35.19    return "{symbol}";
   35.20  }
    36.1 --- a/src/share/vm/oops/symbolKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
    36.2 +++ b/src/share/vm/oops/symbolKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
    36.3 @@ -65,10 +65,10 @@
    36.4    int  oop_oop_iterate(oop obj, OopClosure* blk);
    36.5    int  oop_oop_iterate_m(oop obj, OopClosure* blk, MemRegion mr);
    36.6  
    36.7 -#ifndef PRODUCT
    36.8    // Printing
    36.9    void oop_print_value_on(oop obj, outputStream* st);
   36.10 +#ifndef PRODUCT
   36.11    void oop_print_on(oop obj, outputStream* st);
   36.12 -#endif
   36.13 +#endif //PRODUCT
   36.14    const char* internal_name() const;
   36.15  };
    37.1 --- a/src/share/vm/oops/typeArrayKlassKlass.cpp	Fri Jan 08 09:51:24 2010 -0800
    37.2 +++ b/src/share/vm/oops/typeArrayKlassKlass.cpp	Fri Jan 08 15:17:42 2010 -0800
    37.3 @@ -45,6 +45,7 @@
    37.4    Klass:: oop_print_on(obj, st);
    37.5  }
    37.6  
    37.7 +#endif //PRODUCT
    37.8  
    37.9  void typeArrayKlassKlass::oop_print_value_on(oop obj, outputStream* st) {
   37.10    assert(obj->is_klass(), "must be klass");
   37.11 @@ -63,8 +64,6 @@
   37.12    st->print("}");
   37.13  }
   37.14  
   37.15 -#endif
   37.16 -
   37.17  const char* typeArrayKlassKlass::internal_name() const {
   37.18    return "{type array class}";
   37.19  }
    38.1 --- a/src/share/vm/oops/typeArrayKlassKlass.hpp	Fri Jan 08 09:51:24 2010 -0800
    38.2 +++ b/src/share/vm/oops/typeArrayKlassKlass.hpp	Fri Jan 08 15:17:42 2010 -0800
    38.3 @@ -47,12 +47,12 @@
    38.4    static int header_size() { return oopDesc::header_size() + sizeof(typeArrayKlassKlass)/HeapWordSize; }
    38.5    int object_size() const  { return align_object_size(header_size()); }
    38.6  
    38.7 -#ifndef PRODUCT
    38.8   public:
    38.9    // Printing
   38.10 +  void oop_print_value_on(oop obj, outputStream* st);
   38.11 +#ifndef PRODUCT
   38.12    void oop_print_on(oop obj, outputStream* st);
   38.13 -  void oop_print_value_on(oop obj, outputStream* st);
   38.14 -#endif
   38.15 - public:
   38.16 +#endif //PRODUCT
   38.17 +
   38.18    const char* internal_name() const;
   38.19  };
    39.1 --- a/src/share/vm/runtime/arguments.cpp	Fri Jan 08 09:51:24 2010 -0800
    39.2 +++ b/src/share/vm/runtime/arguments.cpp	Fri Jan 08 15:17:42 2010 -0800
    39.3 @@ -2795,6 +2795,11 @@
    39.4    }
    39.5  #endif
    39.6  
    39.7 +  if (PrintAssembly && FLAG_IS_DEFAULT(DebugNonSafepoints)) {
    39.8 +    warning("PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output");
    39.9 +    DebugNonSafepoints = true;
   39.10 +  }
   39.11 +
   39.12    if (PrintCommandLineFlags) {
   39.13      CommandLineFlags::printSetFlags();
   39.14    }

mercurial