annotate src/share/vm/code/scopeDesc.cpp @ 7046:b6a8f2d23057

VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
author Lukas Stadler <lukas.stadler@jku.at>
date Tue, 27 Nov 2012 13:43:04 +0100
parents e522a00b91aa
children d4e6c82cd6a1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1253
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1253
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: 1253
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
26 #include "code/debugInfoRec.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
27 #include "code/pcDesc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
28 #include "code/scopeDesc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
29 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
30 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1748
diff changeset
31 #include "runtime/handles.inline.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33
3018
5857923e563c Fixed an issue with frame states in exception dispatch chains (now we are correctly rethrowing the exception immediately at entering the interpreter).
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 1972
diff changeset
34 ScopeDesc::ScopeDesc(const nmethod* code, int decode_offset, int obj_decode_offset, bool reexecute, bool rethrow_exception, bool return_oop) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
35 _code = code;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 _decode_offset = decode_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 _objects = decode_object_values(obj_decode_offset);
931
72088be4b386 6873116: Modify reexecute implementation to use pcDesc to record the reexecute bit
cfang
parents: 900
diff changeset
38 _reexecute = reexecute;
1253
f70b0d9ab095 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 931
diff changeset
39 _return_oop = return_oop;
3018
5857923e563c Fixed an issue with frame states in exception dispatch chains (now we are correctly rethrowing the exception immediately at entering the interpreter).
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 1972
diff changeset
40 _rethrow_exception = rethrow_exception;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
41 decode_body();
a61af66fc99e Initial load
duke
parents:
diff changeset
42 }
a61af66fc99e Initial load
duke
parents:
diff changeset
43
3018
5857923e563c Fixed an issue with frame states in exception dispatch chains (now we are correctly rethrowing the exception immediately at entering the interpreter).
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 1972
diff changeset
44 ScopeDesc::ScopeDesc(const nmethod* code, int decode_offset, bool reexecute, bool rethrow_exception, bool return_oop) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
45 _code = code;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 _decode_offset = decode_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 _objects = decode_object_values(DebugInformationRecorder::serialized_null);
931
72088be4b386 6873116: Modify reexecute implementation to use pcDesc to record the reexecute bit
cfang
parents: 900
diff changeset
48 _reexecute = reexecute;
1253
f70b0d9ab095 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 931
diff changeset
49 _return_oop = return_oop;
3018
5857923e563c Fixed an issue with frame states in exception dispatch chains (now we are correctly rethrowing the exception immediately at entering the interpreter).
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 1972
diff changeset
50 _rethrow_exception = rethrow_exception;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
51 decode_body();
a61af66fc99e Initial load
duke
parents:
diff changeset
52 }
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 ScopeDesc::ScopeDesc(const ScopeDesc* parent) {
a61af66fc99e Initial load
duke
parents:
diff changeset
56 _code = parent->_code;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 _decode_offset = parent->_sender_decode_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 _objects = parent->_objects;
931
72088be4b386 6873116: Modify reexecute implementation to use pcDesc to record the reexecute bit
cfang
parents: 900
diff changeset
59 _reexecute = false; //reexecute only applies to the first scope
3018
5857923e563c Fixed an issue with frame states in exception dispatch chains (now we are correctly rethrowing the exception immediately at entering the interpreter).
Thomas Wuerthinger <thomas@wuerthinger.net>
parents: 1972
diff changeset
60 _rethrow_exception = false;
1253
f70b0d9ab095 6910618: C2: Error: assert(d->is_oop(),"JVM_ArrayCopy: dst not an oop")
kvn
parents: 931
diff changeset
61 _return_oop = false;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
62 decode_body();
a61af66fc99e Initial load
duke
parents:
diff changeset
63 }
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 void ScopeDesc::decode_body() {
a61af66fc99e Initial load
duke
parents:
diff changeset
67 if (decode_offset() == DebugInformationRecorder::serialized_null) {
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // This is a sentinel record, which is only relevant to
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // approximate queries. Decode a reasonable frame.
a61af66fc99e Initial load
duke
parents:
diff changeset
70 _sender_decode_offset = DebugInformationRecorder::serialized_null;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
71 _method = _code->method();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
72 _bci = InvocationEntryBci;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 _locals_decode_offset = DebugInformationRecorder::serialized_null;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 _expressions_decode_offset = DebugInformationRecorder::serialized_null;
a61af66fc99e Initial load
duke
parents:
diff changeset
75 _monitors_decode_offset = DebugInformationRecorder::serialized_null;
7046
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
76 #ifdef GRAAL
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
77 _deferred_writes_decode_offset = DebugInformationRecorder::serialized_null;
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
78 #endif // GRAAL
0
a61af66fc99e Initial load
duke
parents:
diff changeset
79 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // decode header
a61af66fc99e Initial load
duke
parents:
diff changeset
81 DebugInfoReadStream* stream = stream_at(decode_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 _sender_decode_offset = stream->read_int();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
84 _method = stream->read_method();
931
72088be4b386 6873116: Modify reexecute implementation to use pcDesc to record the reexecute bit
cfang
parents: 900
diff changeset
85 _bci = stream->read_bci();
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 196
diff changeset
86
0
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // decode offsets for body and sender
a61af66fc99e Initial load
duke
parents:
diff changeset
88 _locals_decode_offset = stream->read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
89 _expressions_decode_offset = stream->read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
90 _monitors_decode_offset = stream->read_int();
7046
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
91 #ifdef GRAAL
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
92 _deferred_writes_decode_offset = stream->read_int();
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
93 #endif // GRAAL
0
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95 }
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 GrowableArray<ScopeValue*>* ScopeDesc::decode_scope_values(int decode_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 if (decode_offset == DebugInformationRecorder::serialized_null) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 DebugInfoReadStream* stream = stream_at(decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
101 int length = stream->read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
102 GrowableArray<ScopeValue*>* result = new GrowableArray<ScopeValue*> (length);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 for (int index = 0; index < length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
104 result->push(ScopeValue::read_from(stream));
a61af66fc99e Initial load
duke
parents:
diff changeset
105 }
a61af66fc99e Initial load
duke
parents:
diff changeset
106 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 GrowableArray<ScopeValue*>* ScopeDesc::decode_object_values(int decode_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
110 if (decode_offset == DebugInformationRecorder::serialized_null) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 GrowableArray<ScopeValue*>* result = new GrowableArray<ScopeValue*>();
a61af66fc99e Initial load
duke
parents:
diff changeset
112 DebugInfoReadStream* stream = new DebugInfoReadStream(_code, decode_offset, result);
a61af66fc99e Initial load
duke
parents:
diff changeset
113 int length = stream->read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
114 for (int index = 0; index < length; index++) {
44
52fed2ec0afb 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 0
diff changeset
115 // Objects values are pushed to 'result' array during read so that
52fed2ec0afb 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 0
diff changeset
116 // object's fields could reference it (OBJECT_ID_CODE).
52fed2ec0afb 6667620: (Escape Analysis) fix deoptimization for scalar replaced objects
kvn
parents: 0
diff changeset
117 (void)ScopeValue::read_from(stream);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119 assert(result->length() == length, "inconsistent debug information");
a61af66fc99e Initial load
duke
parents:
diff changeset
120 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123
a61af66fc99e Initial load
duke
parents:
diff changeset
124 GrowableArray<MonitorValue*>* ScopeDesc::decode_monitor_values(int decode_offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 if (decode_offset == DebugInformationRecorder::serialized_null) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
126 DebugInfoReadStream* stream = stream_at(decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 int length = stream->read_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
128 GrowableArray<MonitorValue*>* result = new GrowableArray<MonitorValue*> (length);
a61af66fc99e Initial load
duke
parents:
diff changeset
129 for (int index = 0; index < length; index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
130 result->push(new MonitorValue(stream));
a61af66fc99e Initial load
duke
parents:
diff changeset
131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
132 return result;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
7046
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
135 #ifdef GRAAL
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
136
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
137 GrowableArray<DeferredWriteValue*>* ScopeDesc::decode_deferred_writes(int decode_offset) {
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
138 if (decode_offset == DebugInformationRecorder::serialized_null) return NULL;
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
139 DebugInfoReadStream* stream = stream_at(decode_offset);
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
140 int length = stream->read_int();
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
141 GrowableArray<DeferredWriteValue*>* result = new GrowableArray<DeferredWriteValue*> (length);
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
142 for (int index = 0; index < length; index++) {
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
143 result->push(new DeferredWriteValue(stream));
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
144 }
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
145 return result;
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
146 }
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
147
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
148 GrowableArray<DeferredWriteValue*>* ScopeDesc::deferred_writes() {
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
149 return decode_deferred_writes(_deferred_writes_decode_offset);
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
150 }
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
151
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
152 #endif // GRAAL
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
153
0
a61af66fc99e Initial load
duke
parents:
diff changeset
154 DebugInfoReadStream* ScopeDesc::stream_at(int decode_offset) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
155 return new DebugInfoReadStream(_code, decode_offset, _objects);
a61af66fc99e Initial load
duke
parents:
diff changeset
156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 GrowableArray<ScopeValue*>* ScopeDesc::locals() {
a61af66fc99e Initial load
duke
parents:
diff changeset
159 return decode_scope_values(_locals_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
161
a61af66fc99e Initial load
duke
parents:
diff changeset
162 GrowableArray<ScopeValue*>* ScopeDesc::expressions() {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 return decode_scope_values(_expressions_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 GrowableArray<MonitorValue*>* ScopeDesc::monitors() {
a61af66fc99e Initial load
duke
parents:
diff changeset
167 return decode_monitor_values(_monitors_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
168 }
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 GrowableArray<ScopeValue*>* ScopeDesc::objects() {
a61af66fc99e Initial load
duke
parents:
diff changeset
171 return _objects;
a61af66fc99e Initial load
duke
parents:
diff changeset
172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 bool ScopeDesc::is_top() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 return _sender_decode_offset == DebugInformationRecorder::serialized_null;
a61af66fc99e Initial load
duke
parents:
diff changeset
176 }
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 ScopeDesc* ScopeDesc::sender() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
179 if (is_top()) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
180 return new ScopeDesc(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 void ScopeDesc::print_value_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
187 tty->print(" ");
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 1972
diff changeset
188 method()->print_short_name(st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
189 int lineno = method()->line_number_from_bci(bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
190 if (lineno != -1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
191 st->print_cr("@%d (line %d)", bci(), lineno);
a61af66fc99e Initial load
duke
parents:
diff changeset
192 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
193 st->print_cr("@%d", bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 void ScopeDesc::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
198 print_on(st, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
199 }
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 void ScopeDesc::print_on(outputStream* st, PcDesc* pd) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // header
a61af66fc99e Initial load
duke
parents:
diff changeset
203 if (pd != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
204 tty->print_cr("ScopeDesc(pc=" PTR_FORMAT " offset=%x):", pd->real_pc(_code), pd->pc_offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
205 }
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 print_value_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // decode offsets
a61af66fc99e Initial load
duke
parents:
diff changeset
209 if (WizardMode) {
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1552
diff changeset
210 st->print("ScopeDesc[%d]@" PTR_FORMAT " ", _decode_offset, _code->content_begin());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
211 st->print_cr(" offset: %d", _decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
212 st->print_cr(" bci: %d", bci());
900
9987d9d5eb0e 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 196
diff changeset
213 st->print_cr(" reexecute: %s", should_reexecute() ? "true" : "false");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
214 st->print_cr(" locals: %d", _locals_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
215 st->print_cr(" stack: %d", _expressions_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 st->print_cr(" monitor: %d", _monitors_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
217 st->print_cr(" sender: %d", _sender_decode_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // locals
a61af66fc99e Initial load
duke
parents:
diff changeset
220 { GrowableArray<ScopeValue*>* l = ((ScopeDesc*) this)->locals();
a61af66fc99e Initial load
duke
parents:
diff changeset
221 if (l != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 tty->print_cr(" Locals");
a61af66fc99e Initial load
duke
parents:
diff changeset
223 for (int index = 0; index < l->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
224 st->print(" - l%d: ", index);
a61af66fc99e Initial load
duke
parents:
diff changeset
225 l->at(index)->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228 }
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // expressions
a61af66fc99e Initial load
duke
parents:
diff changeset
231 { GrowableArray<ScopeValue*>* l = ((ScopeDesc*) this)->expressions();
a61af66fc99e Initial load
duke
parents:
diff changeset
232 if (l != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
233 st->print_cr(" Expression stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
234 for (int index = 0; index < l->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 st->print(" - @%d: ", index);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 l->at(index)->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
237 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // monitors
a61af66fc99e Initial load
duke
parents:
diff changeset
242 { GrowableArray<MonitorValue*>* l = ((ScopeDesc*) this)->monitors();
a61af66fc99e Initial load
duke
parents:
diff changeset
243 if (l != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
244 st->print_cr(" Monitor stack");
a61af66fc99e Initial load
duke
parents:
diff changeset
245 for (int index = 0; index < l->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 st->print(" - @%d: ", index);
a61af66fc99e Initial load
duke
parents:
diff changeset
247 l->at(index)->print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
248 st->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
249 }
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
252
7046
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
253 #if defined(COMPILER2) || defined(GRAAL)
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
254 if (NOT_GRAAL(DoEscapeAnalysis &&) is_top() && _objects != NULL) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
255 tty->print_cr("Objects");
a61af66fc99e Initial load
duke
parents:
diff changeset
256 for (int i = 0; i < _objects->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
257 ObjectValue* sv = (ObjectValue*) _objects->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
258 tty->print(" - %d: ", sv->id());
a61af66fc99e Initial load
duke
parents:
diff changeset
259 sv->print_fields_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
260 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262 }
7046
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
263 #endif // COMPILER2 || GRAAL
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
264 #ifdef GRAAL
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
265 // deferred writes
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
266 { GrowableArray<DeferredWriteValue*>* l = ((ScopeDesc*) this)->deferred_writes();
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
267 if (l != NULL) {
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
268 st->print_cr(" Deferred writes");
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
269 for (int index = 0; index < l->length(); index++) {
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
270 st->print(" - @%d: ", index);
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
271 l->at(index)->print_on(st);
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
272 st->cr();
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
273 }
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
274 }
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
275 }
b6a8f2d23057 VM support for deferred reads and writes: ScopeDesc, DebugInfo, DebugInfoRecorder
Lukas Stadler <lukas.stadler@jku.at>
parents: 6948
diff changeset
276 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 void ScopeDesc::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 guarantee(method()->is_method(), "type check");
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // check if we have any illegal elements on the expression stack
a61af66fc99e Initial load
duke
parents:
diff changeset
286 { GrowableArray<ScopeValue*>* l = expressions();
a61af66fc99e Initial load
duke
parents:
diff changeset
287 if (l != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
288 for (int index = 0; index < l->length(); index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
289 //guarantee(!l->at(index)->is_illegal(), "expression element cannot be illegal");
a61af66fc99e Initial load
duke
parents:
diff changeset
290 }
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }