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 package com.sun.hotspot.tools.compiler;
26
27 import java.io.PrintStream;
28
29 class UncommonTrapEvent extends BasicLogEvent {
30
31 private final String reason;
32 private final String action;
33 private int count;
34 private String jvms = "";
35
36 UncommonTrapEvent(double s, String i, String r, String a, int c) {
37 super(s, i);
38 reason = r;
39 action = a;
40 count = c;
41 }
42
43
44 public void addJVMS(String method, int bci) {
45 setJvms(getJvms() + " @" + bci + " " + method + "\n");
46 }
47
48 public void updateCount(UncommonTrapEvent trap) {
49 setCount(Math.max(getCount(), trap.getCount()));
50 }
51
52 public void print(PrintStream stream) {
53 stream.printf("%s uncommon trap %.3f %s %s\n", getId(), getStart(), getReason(), getAction());
54 stream.print(getJvms());
55 }
56
57 public String getReason() {
58 return reason;
59 }
60
61 public String getAction() {
62 return action;
63 }
64
65 public int getCount() {
66 return count;
67 }
68
69 public void setCount(int count) {
70 this.count = count;
71 }
72
73 public String getJvms() {
74 return jvms;
75 }
76
77 public void setJvms(String jvms) {
78 this.jvms = jvms;
79 }
80
81 public void setCompilation(Compilation compilation) {
82 this.compilation = compilation;
83 }
84 }
|
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 package com.sun.hotspot.tools.compiler;
25
26 import java.io.PrintStream;
27 import java.util.ArrayList;
28 import java.util.List;
29
30 /**
31 * Represents an uncommon trap encountered during a compilation.
32 */
33 class UncommonTrapEvent extends BasicLogEvent {
34
35 private final String reason;
36 private final String action;
37
38 /**
39 * Denote how many times this trap has been encountered.
40 */
41 private int count;
42
43 /**
44 * The name of the bytecode instruction at which the trap occurred.
45 */
46 private String bytecode;
47
48 private List<String> jvmsMethods = new ArrayList<>();
49
50 private List<Integer> jvmsBCIs = new ArrayList<>();
51
52 UncommonTrapEvent(double s, String i, String r, String a, int c) {
53 super(s, i);
54 reason = r;
55 action = a;
56 count = c;
57 }
58
59 public void updateCount(UncommonTrapEvent trap) {
60 setCount(Math.max(getCount(), trap.getCount()));
61 }
62
63 public void print(PrintStream stream, boolean printID) {
64 if (printID) {
65 stream.print(getId() + " ");
66 }
67 stream.printf("uncommon trap %s %s %s\n", bytecode, getReason(), getAction());
68 int indent = 2;
69 for (int j = 0; j < jvmsMethods.size(); j++) {
70 for (int i = 0; i < indent; i++) {
71 stream.print(' ');
72 }
73 stream.println("@ " + jvmsBCIs.get(j) + " " + jvmsMethods.get(j));
74 indent += 2;
75 }
76 }
77
78
79 public String getReason() {
80 return reason;
81 }
82
83 public String getAction() {
84 return action;
85 }
86
87 public int getCount() {
88 return count;
89 }
90
91 public void setCount(int count) {
92 this.count = count;
93 }
94
95 /**
96 * Set the compilation for this event. This involves identifying the call
97 * site to which this uncommon trap event belongs. In addition to setting
98 * the {@link #compilation} link, this method will consequently also set
99 * the {@link #bytecode} field.
100 */
101 public void setCompilation(Compilation compilation) {
102 super.setCompilation(compilation);
103 // Attempt to associate a bytecode with with this trap
104 CallSite site = compilation.getCall();
105 int i = 0;
106 try {
107 List<UncommonTrap> traps = site.getTraps();
108 while (i + 1 < jvmsMethods.size()) {
109 if (!jvmsMethods.get(i).equals(site.getMethod().getFullName())) {
110 throw new InternalError(jvmsMethods.get(i) + " != " + site.getMethod().getFullName());
111 }
112 CallSite result = null;
113 for (CallSite call : site.getCalls()) {
114 if (call.getBci() == jvmsBCIs.get(i) &&
115 call.getMethod().getFullName().equals(jvmsMethods.get(i + 1)) &&
116 call.getReceiver() == null) {
117 result = call;
118 i++;
119 break;
120 }
121 }
122 if (result == null) {
123 throw new InternalError("couldn't find call site");
124 }
125 site = result;
126 traps = site.getTraps();
127 }
128 for (UncommonTrap trap : traps) {
129 if (trap.getBCI() == jvmsBCIs.get(i) &&
130 trap.getReason().equals(getReason()) &&
131 trap.getAction().equals(getAction())) {
132 bytecode = trap.getBytecode();
133 return;
134 }
135 }
136 throw new InternalError("couldn't find bytecode");
137 } catch (Exception e) {
138 bytecode = "<unknown>";
139 }
140 }
141
142 public void addMethodAndBCI(String method, int bci) {
143 jvmsMethods.add(0, method);
144 jvmsBCIs.add(0, bci);
145 }
146
147 }
|