Mercurial > hg > graal-jvmci-8
annotate src/share/vm/prims/jvmtiEnvFill.java @ 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 | c18cbe5936b8 |
children |
rev | line source |
---|---|
0 | 1 /* |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
2 * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. |
0 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
0
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 import java.io.*; | |
26 import java.util.*; | |
27 | |
28 class jvmtiEnvFill { | |
29 | |
30 public static void main(String[] args) throws IOException { | |
31 if (args.length != 3) { | |
32 System.err.println("usage: <filledFile> <stubFile> <resultFile>"); | |
33 System.exit(1); | |
34 } | |
35 String filledFN = args[0]; | |
36 String stubFN = args[1]; | |
37 String resultFN = args[2]; | |
38 | |
39 SourceFile filledSF = new SourceFile(filledFN); | |
40 SourceFile stubSF = new SourceFile(stubFN); | |
41 | |
42 | |
43 stubSF.fill(filledSF); | |
44 | |
45 PrintWriter out = new PrintWriter(new FileWriter(resultFN)); | |
46 stubSF.output(out); | |
47 out.close(); | |
48 } | |
49 } | |
50 | |
51 class SourceFile { | |
52 | |
53 static final String endFilePrefix = "// end file prefix"; | |
54 static final String functionPrefix = "JvmtiEnv::"; | |
55 | |
56 final String fn; | |
57 LineNumberReader in; | |
58 String line; | |
59 List<String> top = new ArrayList<String>(); | |
60 List<String> before = new ArrayList<String>(); | |
61 boolean inFilePrefix = true; | |
62 List<Function> functions = new ArrayList<Function>(); | |
63 Map<String, Function> functionMap = new HashMap<String, Function>(); | |
64 | |
65 class Function { | |
66 String name; | |
67 String args; | |
68 String compareArgs; | |
69 List comment; | |
70 List<String> body = new ArrayList<String>(); | |
71 | |
72 Function() throws IOException { | |
73 line = in.readLine(); | |
74 String trimmed = line.trim(); | |
75 if (!trimmed.startsWith(functionPrefix)) { | |
76 error("expected '" + functionPrefix + "'"); | |
77 } | |
78 int index = trimmed.indexOf('(', functionPrefix.length()); | |
79 if (index == -1) { | |
80 error("missing open paren"); | |
81 } | |
82 name = trimmed.substring(functionPrefix.length(), index); | |
83 int index2 = trimmed.indexOf(')', index); | |
84 if (index2 == -1) { | |
85 error("missing close paren - must be on same line"); | |
86 } | |
87 args = trimmed.substring(index+1, index2); | |
88 compareArgs = args.replaceAll("\\s", ""); | |
89 String tail = trimmed.substring(index2+1).trim(); | |
90 if (!tail.equals("{")) { | |
91 error("function declaration first line must end with open bracket '{', instead got '" + | |
92 tail + "'"); | |
93 } | |
94 while(true) { | |
95 line = in.readLine(); | |
96 if (line == null) { | |
97 line = ""; // so error does not look wierd | |
98 error("unexpected end of file"); | |
99 } | |
100 if (line.startsWith("}")) { | |
101 break; | |
102 } | |
103 body.add(line); | |
104 } | |
105 String expected = "} /* end " + name + " */"; | |
106 trimmed = line.replaceAll("\\s",""); | |
107 if (!trimmed.equals(expected.replaceAll("\\s",""))) { | |
108 error("function end is malformed - should be: " + expected); | |
109 } | |
110 // copy over the comment prefix | |
111 comment = before; | |
112 before = new ArrayList<String>(); | |
113 } | |
114 | |
115 void remove() { | |
116 functionMap.remove(name); | |
117 } | |
118 | |
119 String fileName() { | |
120 return fn; | |
121 } | |
122 | |
123 void fill(Function filledFunc) { | |
124 if (filledFunc == null) { | |
125 System.err.println("Warning: function " + name + " missing from filled file"); | |
126 body.add(0, " /*** warning: function added and not filled in ***/"); | |
127 } else { | |
128 int fbsize = filledFunc.body.size(); | |
129 int bsize = body.size(); | |
130 if (fbsize > bsize || !body.subList(bsize-fbsize,bsize).equals(filledFunc.body)) { | |
131 // it has actually been filled in | |
132 body = filledFunc.body; | |
133 if (!compareArgs.equals(filledFunc.compareArgs)) { | |
134 System.err.println("Warning: function " + name + | |
135 ": filled and stub arguments differ"); | |
136 System.err.println(" old (filled): " + filledFunc.args); | |
137 System.err.println(" new (stub): " + args); | |
138 body.add(0, " /*** warning: arguments changed, were: " + | |
139 filledFunc.args + " ***/"); | |
140 } | |
141 } | |
142 filledFunc.remove(); // mark used | |
143 } | |
144 } | |
145 | |
146 void output(PrintWriter out) { | |
147 Iterator it = comment.iterator(); | |
148 while (it.hasNext()) { | |
149 out.println(it.next()); | |
150 } | |
151 out.println("jvmtiError"); | |
152 out.print(functionPrefix); | |
153 out.print(name); | |
154 out.print('('); | |
155 out.print(args); | |
156 out.println(") {"); | |
157 it = body.iterator(); | |
158 while (it.hasNext()) { | |
159 out.println(it.next()); | |
160 } | |
161 out.print("} /* end "); | |
162 out.print(name); | |
163 out.println(" */"); | |
164 } | |
165 } | |
166 | |
167 SourceFile(String fn) throws IOException { | |
168 this.fn = fn; | |
169 Reader reader = new FileReader(fn); | |
170 in = new LineNumberReader(reader); | |
171 | |
172 while (readGaps()) { | |
173 Function func = new Function(); | |
174 functionMap.put(func.name, func); | |
175 functions.add(func); | |
176 } | |
177 | |
178 in.close(); | |
179 } | |
180 | |
181 void error(String msg) { | |
182 System.err.println("Fatal error parsing file: " + fn); | |
183 System.err.println("Line number: " + in.getLineNumber()); | |
184 System.err.println("Error message: " + msg); | |
185 System.err.println("Source line: " + line); | |
186 System.exit(1); | |
187 } | |
188 | |
189 boolean readGaps() throws IOException { | |
190 while(true) { | |
191 line = in.readLine(); | |
192 if (line == null) { | |
193 return false; // end of file | |
194 } | |
195 if (!inFilePrefix && line.startsWith("}")) { | |
196 error("unexpected close bracket in first column, outside of function.\n"); | |
197 } | |
198 String trimmed = line.trim(); | |
199 if (line.startsWith("jvmtiError")) { | |
200 if (trimmed.equals("jvmtiError")) { | |
201 if (inFilePrefix) { | |
202 error("unexpected 'jvmtiError' line in file prefix.\n" + | |
203 "is '" + endFilePrefix + "'... line missing?"); | |
204 } | |
205 return true; // beginning of a function | |
206 } else { | |
207 error("extra characters at end of 'jvmtiError'"); | |
208 } | |
209 } | |
210 if (inFilePrefix) { | |
211 top.add(line); | |
212 } else { | |
213 trimmed = line.trim(); | |
214 if (!trimmed.equals("") && !trimmed.startsWith("//") && !trimmed.startsWith("#")) { | |
215 error("only comments and blank lines allowed between functions"); | |
216 } | |
217 before.add(line); | |
218 } | |
219 if (line.replaceAll("\\s","").toLowerCase().startsWith(endFilePrefix.replaceAll("\\s",""))) { | |
220 if (!inFilePrefix) { | |
221 error("excess '" + endFilePrefix + "'"); | |
222 } | |
223 inFilePrefix = false; | |
224 } | |
225 } | |
226 } | |
227 | |
228 void fill(SourceFile filledSF) { | |
229 // copy beginning of file straight from filled file | |
230 top = filledSF.top; | |
231 | |
232 // file in functions | |
233 Iterator it = functions.iterator(); | |
234 while (it.hasNext()) { | |
235 Function stubFunc = (Function)(it.next()); | |
236 Function filledFunc = (Function)filledSF.functionMap.get(stubFunc.name); | |
237 stubFunc.fill(filledFunc); | |
238 } | |
239 if (filledSF.functionMap.size() > 0) { | |
240 System.err.println("Warning: the following functions were present in the " + | |
241 "filled file but missing in the stub file and thus not copied:"); | |
242 it = filledSF.functionMap.values().iterator(); | |
243 while (it.hasNext()) { | |
244 System.err.println(" " + ((Function)(it.next())).name); | |
245 } | |
246 } | |
247 } | |
248 | |
249 void output(PrintWriter out) { | |
250 Iterator it = top.iterator(); | |
251 while (it.hasNext()) { | |
252 out.println(it.next()); | |
253 } | |
254 it = functions.iterator(); | |
255 while (it.hasNext()) { | |
256 Function stubFunc = (Function)(it.next()); | |
257 stubFunc.output(out); | |
258 } | |
259 } | |
260 } |