src/share/vm/prims/jvmtiEnvFill.java

Sun, 15 Sep 2013 15:28:58 +0200

author
goetz
date
Sun, 15 Sep 2013 15:28:58 +0200
changeset 6470
abe03600372a
parent 1907
c18cbe5936b8
child 6876
710a3c8b516e
permissions
-rw-r--r--

8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
Summary: Implement profiling for c2 jit compilation. Also enable new cppInterpreter features.
Reviewed-by: kvn

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

mercurial