Fri, 08 Jan 2010 15:17:42 -0800
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 }