Mercurial > hg > graal-jvmci-8
annotate src/share/vm/prims/whitebox.cpp @ 6972:bd7a7ce2e264
6830717: replay of compilations would help with debugging
Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method.
Reviewed-by: kvn, twisti, sspitsyn
Contributed-by: yumin.qi@oracle.com
author | minqi |
---|---|
date | Mon, 12 Nov 2012 14:03:53 -0800 |
parents | da91efe96a93 |
children | 4102b59539ce db9981fd3124 |
rev | line source |
---|---|
5915 | 1 /* |
2 * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. | |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
20 * or visit www.oracle.com if you need additional information or have any | |
21 * questions. | |
22 * | |
23 */ | |
24 | |
25 #include "precompiled.hpp" | |
26 | |
27 #include "memory/universe.hpp" | |
28 #include "oops/oop.inline.hpp" | |
5978
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
29 |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
30 #include "classfile/symbolTable.hpp" |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
31 #include "classfile/classLoaderData.hpp" |
5978
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
32 |
5915 | 33 #include "prims/whitebox.hpp" |
5978
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
34 #include "prims/wbtestmethods/parserTests.hpp" |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
35 |
5915 | 36 #include "runtime/interfaceSupport.hpp" |
37 #include "runtime/os.hpp" | |
38 #include "utilities/debug.hpp" | |
39 | |
40 #ifndef SERIALGC | |
41 #include "gc_implementation/g1/concurrentMark.hpp" | |
42 #include "gc_implementation/g1/g1CollectedHeap.inline.hpp" | |
43 #include "gc_implementation/g1/heapRegionRemSet.hpp" | |
44 #endif // !SERIALGC | |
45 | |
46 bool WhiteBox::_used = false; | |
47 | |
48 WB_ENTRY(jlong, WB_GetObjectAddress(JNIEnv* env, jobject o, jobject obj)) | |
49 return (jlong)(void*)JNIHandles::resolve(obj); | |
50 WB_END | |
51 | |
52 WB_ENTRY(jint, WB_GetHeapOopSize(JNIEnv* env, jobject o)) | |
53 return heapOopSize; | |
54 WB_END | |
55 | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
56 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
57 class WBIsKlassAliveClosure : public KlassClosure { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
58 Symbol* _name; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
59 bool _found; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
60 public: |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
61 WBIsKlassAliveClosure(Symbol* name) : _name(name), _found(false) {} |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
62 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
63 void do_klass(Klass* k) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
64 if (_found) return; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
65 Symbol* ksym = k->name(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
66 if (ksym->fast_compare(_name) == 0) { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
67 _found = true; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
68 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
69 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
70 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
71 bool found() const { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
72 return _found; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
73 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
74 }; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
75 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
76 WB_ENTRY(jboolean, WB_IsClassAlive(JNIEnv* env, jobject target, jstring name)) |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
77 Handle h_name = JNIHandles::resolve(name); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
78 if (h_name.is_null()) return false; |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
79 Symbol* sym = java_lang_String::as_symbol(h_name, CHECK_false); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
80 TempNewSymbol tsym(sym); // Make sure to decrement reference count on sym on return |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
81 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
82 WBIsKlassAliveClosure closure(sym); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
83 ClassLoaderDataGraph::classes_do(&closure); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
84 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
85 return closure.found(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
86 WB_END |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
87 |
5915 | 88 #ifndef SERIALGC |
89 WB_ENTRY(jboolean, WB_G1IsHumongous(JNIEnv* env, jobject o, jobject obj)) | |
90 G1CollectedHeap* g1 = G1CollectedHeap::heap(); | |
91 oop result = JNIHandles::resolve(obj); | |
92 const HeapRegion* hr = g1->heap_region_containing(result); | |
93 return hr->isHumongous(); | |
94 WB_END | |
95 | |
96 WB_ENTRY(jlong, WB_G1NumFreeRegions(JNIEnv* env, jobject o)) | |
97 G1CollectedHeap* g1 = G1CollectedHeap::heap(); | |
98 size_t nr = g1->free_regions(); | |
99 return (jlong)nr; | |
100 WB_END | |
101 | |
102 WB_ENTRY(jboolean, WB_G1InConcurrentMark(JNIEnv* env, jobject o)) | |
103 G1CollectedHeap* g1 = G1CollectedHeap::heap(); | |
104 ConcurrentMark* cm = g1->concurrent_mark(); | |
105 return cm->concurrent_marking_in_progress(); | |
106 WB_END | |
107 | |
108 WB_ENTRY(jint, WB_G1RegionSize(JNIEnv* env, jobject o)) | |
109 return (jint)HeapRegion::GrainBytes; | |
110 WB_END | |
111 #endif // !SERIALGC | |
112 | |
5978
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
113 //Some convenience methods to deal with objects from java |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
114 int WhiteBox::offset_for_field(const char* field_name, oop object, |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
115 Symbol* signature_symbol) { |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
116 assert(field_name != NULL && strlen(field_name) > 0, "Field name not valid"); |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
117 Thread* THREAD = Thread::current(); |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
118 |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
119 //Get the class of our object |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
120 Klass* arg_klass = object->klass(); |
5978
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
121 //Turn it into an instance-klass |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
122 InstanceKlass* ik = InstanceKlass::cast(arg_klass); |
5978
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
123 |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
124 //Create symbols to look for in the class |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
125 TempNewSymbol name_symbol = SymbolTable::lookup(field_name, (int) strlen(field_name), |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
126 THREAD); |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
127 |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
128 //To be filled in with an offset of the field we're looking for |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
129 fieldDescriptor fd; |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
130 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
131 Klass* res = ik->find_field(name_symbol, signature_symbol, &fd); |
5978
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
132 if (res == NULL) { |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
133 tty->print_cr("Invalid layout of %s at %s", ik->external_name(), |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
134 name_symbol->as_C_string()); |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
135 fatal("Invalid layout of preloaded class"); |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
136 } |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
137 |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
138 //fetch the field at the offset we've found |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
139 int dest_offset = fd.offset(); |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
140 |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
141 return dest_offset; |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
142 } |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
143 |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
144 |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
145 const char* WhiteBox::lookup_jstring(const char* field_name, oop object) { |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
146 int offset = offset_for_field(field_name, object, |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
147 vmSymbols::string_signature()); |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
148 oop string = object->obj_field(offset); |
6202
5a1f452f8f90
7178703: Fix handling of quoted arguments and better error messages in dcmd
sla
parents:
5978
diff
changeset
|
149 if (string == NULL) { |
5a1f452f8f90
7178703: Fix handling of quoted arguments and better error messages in dcmd
sla
parents:
5978
diff
changeset
|
150 return NULL; |
5a1f452f8f90
7178703: Fix handling of quoted arguments and better error messages in dcmd
sla
parents:
5978
diff
changeset
|
151 } |
5978
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
152 const char* ret = java_lang_String::as_utf8_string(string); |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
153 return ret; |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
154 } |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
155 |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
156 bool WhiteBox::lookup_bool(const char* field_name, oop object) { |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
157 int offset = |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
158 offset_for_field(field_name, object, vmSymbols::bool_signature()); |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
159 bool ret = (object->bool_field(offset) == JNI_TRUE); |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
160 return ret; |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
161 } |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
162 |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
163 |
5915 | 164 #define CC (char*) |
165 | |
166 static JNINativeMethod methods[] = { | |
167 {CC"getObjectAddress", CC"(Ljava/lang/Object;)J", (void*)&WB_GetObjectAddress }, | |
168 {CC"getHeapOopSize", CC"()I", (void*)&WB_GetHeapOopSize }, | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6202
diff
changeset
|
169 {CC"isClassAlive0", CC"(Ljava/lang/String;)Z", (void*)&WB_IsClassAlive }, |
5978
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
170 {CC "parseCommandLine", |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
171 CC "(Ljava/lang/String;[Lsun/hotspot/parser/DiagnosticCommand;)[Ljava/lang/Object;", |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
172 (void*) &WB_ParseCommandLine |
51612f0c0a79
7148488: Whitebox tests for the Diagnostic Framework Parser
nloodin
parents:
5915
diff
changeset
|
173 }, |
5915 | 174 #ifndef SERIALGC |
175 {CC"g1InConcurrentMark", CC"()Z", (void*)&WB_G1InConcurrentMark}, | |
176 {CC"g1IsHumongous", CC"(Ljava/lang/Object;)Z", (void*)&WB_G1IsHumongous }, | |
177 {CC"g1NumFreeRegions", CC"()J", (void*)&WB_G1NumFreeRegions }, | |
178 {CC"g1RegionSize", CC"()I", (void*)&WB_G1RegionSize }, | |
179 #endif // !SERIALGC | |
180 }; | |
181 | |
182 #undef CC | |
183 | |
184 JVM_ENTRY(void, JVM_RegisterWhiteBoxMethods(JNIEnv* env, jclass wbclass)) | |
185 { | |
186 if (WhiteBoxAPI) { | |
187 // Make sure that wbclass is loaded by the null classloader | |
188 instanceKlassHandle ikh = instanceKlassHandle(JNIHandles::resolve(wbclass)->klass()); | |
189 Handle loader(ikh->class_loader()); | |
190 if (loader.is_null()) { | |
191 ThreadToNativeFromVM ttnfv(thread); // can't be in VM when we call JNI | |
192 jint result = env->RegisterNatives(wbclass, methods, sizeof(methods)/sizeof(methods[0])); | |
193 if (result == 0) { | |
194 WhiteBox::set_used(); | |
195 } | |
196 } | |
197 } | |
198 } | |
199 JVM_END |