annotate src/share/vm/compiler/oopMap.cpp @ 6862:8a5ea0a9ccc4

7127708: G1: change task num types from int to uint in concurrent mark Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich. Reviewed-by: johnc Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author johnc
date Sat, 06 Oct 2012 01:17:44 -0700
parents d2a62e0f25eb
children 957c266d8bc5 b9a9ed0f8eeb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
2 * Copyright (c) 1998, 2010, 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: 948
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 948
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: 948
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: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "code/codeBlob.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "code/codeCache.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "code/nmethod.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "code/scopeDesc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "compiler/oopMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "gc_interface/collectedHeap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "memory/allocation.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #include "runtime/frame.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #include "runtime/signature.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 #ifdef COMPILER1
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
37 #include "c1/c1_Defs.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
38 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // OopMapStream
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 OopMapStream::OopMapStream(OopMap* oop_map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
43 if(oop_map->omv_data() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
44 _stream = new CompressedReadStream(oop_map->write_stream()->buffer());
a61af66fc99e Initial load
duke
parents:
diff changeset
45 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
46 _stream = new CompressedReadStream(oop_map->omv_data());
a61af66fc99e Initial load
duke
parents:
diff changeset
47 }
a61af66fc99e Initial load
duke
parents:
diff changeset
48 _mask = OopMapValue::type_mask_in_place;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 _size = oop_map->omv_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
50 _position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 _valid_omv = false;
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 OopMapStream::OopMapStream(OopMap* oop_map, int oop_types_mask) {
a61af66fc99e Initial load
duke
parents:
diff changeset
56 if(oop_map->omv_data() == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
57 _stream = new CompressedReadStream(oop_map->write_stream()->buffer());
a61af66fc99e Initial load
duke
parents:
diff changeset
58 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 _stream = new CompressedReadStream(oop_map->omv_data());
a61af66fc99e Initial load
duke
parents:
diff changeset
60 }
a61af66fc99e Initial load
duke
parents:
diff changeset
61 _mask = oop_types_mask;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 _size = oop_map->omv_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
63 _position = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 _valid_omv = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 }
a61af66fc99e Initial load
duke
parents:
diff changeset
66
a61af66fc99e Initial load
duke
parents:
diff changeset
67
a61af66fc99e Initial load
duke
parents:
diff changeset
68 void OopMapStream::find_next() {
a61af66fc99e Initial load
duke
parents:
diff changeset
69 while(_position++ < _size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
70 _omv.read_from(_stream);
a61af66fc99e Initial load
duke
parents:
diff changeset
71 if(((int)_omv.type() & _mask) > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
72 _valid_omv = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
73 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
74 }
a61af66fc99e Initial load
duke
parents:
diff changeset
75 }
a61af66fc99e Initial load
duke
parents:
diff changeset
76 _valid_omv = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
77 }
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // OopMap
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // frame_size units are stack-slots (4 bytes) NOT intptr_t; we can name odd
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // slots to hold 4-byte values like ints and floats in the LP64 build.
a61af66fc99e Initial load
duke
parents:
diff changeset
84 OopMap::OopMap(int frame_size, int arg_count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // OopMaps are usually quite so small, so pick a small initial size
a61af66fc99e Initial load
duke
parents:
diff changeset
86 set_write_stream(new CompressedWriteStream(32));
a61af66fc99e Initial load
duke
parents:
diff changeset
87 set_omv_data(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 set_omv_count(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
91 _locs_length = VMRegImpl::stack2reg(0)->value() + frame_size + arg_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
92 _locs_used = NEW_RESOURCE_ARRAY(OopMapValue::oop_types, _locs_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
93 for(int i = 0; i < _locs_length; i++) _locs_used[i] = OopMapValue::unused_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 #endif
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 OopMap::OopMap(OopMap::DeepCopyToken, OopMap* source) {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // This constructor does a deep copy
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // of the source OopMap.
a61af66fc99e Initial load
duke
parents:
diff changeset
101 set_write_stream(new CompressedWriteStream(source->omv_count() * 2));
a61af66fc99e Initial load
duke
parents:
diff changeset
102 set_omv_data(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
103 set_omv_count(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
104 set_offset(source->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
107 _locs_length = source->_locs_length;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 _locs_used = NEW_RESOURCE_ARRAY(OopMapValue::oop_types, _locs_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 for(int i = 0; i < _locs_length; i++) _locs_used[i] = OopMapValue::unused_value;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
111
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // We need to copy the entries too.
a61af66fc99e Initial load
duke
parents:
diff changeset
113 for (OopMapStream oms(source); !oms.is_done(); oms.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
114 OopMapValue omv = oms.current();
a61af66fc99e Initial load
duke
parents:
diff changeset
115 omv.write_on(write_stream());
a61af66fc99e Initial load
duke
parents:
diff changeset
116 increment_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 OopMap* OopMap::deep_copy() {
a61af66fc99e Initial load
duke
parents:
diff changeset
122 return new OopMap(_deep_copy_token, this);
a61af66fc99e Initial load
duke
parents:
diff changeset
123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 void OopMap::copy_to(address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
127 memcpy(addr,this,sizeof(OopMap));
a61af66fc99e Initial load
duke
parents:
diff changeset
128 memcpy(addr + sizeof(OopMap),write_stream()->buffer(),write_stream()->position());
a61af66fc99e Initial load
duke
parents:
diff changeset
129 OopMap* new_oop = (OopMap*)addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
130 new_oop->set_omv_data_size(write_stream()->position());
a61af66fc99e Initial load
duke
parents:
diff changeset
131 new_oop->set_omv_data((unsigned char *)(addr + sizeof(OopMap)));
a61af66fc99e Initial load
duke
parents:
diff changeset
132 new_oop->set_write_stream(NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 int OopMap::heap_size() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
137 int size = sizeof(OopMap);
a61af66fc99e Initial load
duke
parents:
diff changeset
138 int align = sizeof(void *) - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 if(write_stream() != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
140 size += write_stream()->position();
a61af66fc99e Initial load
duke
parents:
diff changeset
141 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
142 size += omv_data_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // Align to a reasonable ending point
a61af66fc99e Initial load
duke
parents:
diff changeset
145 size = ((size+align) & ~align);
a61af66fc99e Initial load
duke
parents:
diff changeset
146 return size;
a61af66fc99e Initial load
duke
parents:
diff changeset
147 }
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // frame_size units are stack-slots (4 bytes) NOT intptr_t; we can name odd
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // slots to hold 4-byte values like ints and floats in the LP64 build.
a61af66fc99e Initial load
duke
parents:
diff changeset
151 void OopMap::set_xxx(VMReg reg, OopMapValue::oop_types x, VMReg optional) {
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 assert(reg->value() < _locs_length, "too big reg value for stack size");
a61af66fc99e Initial load
duke
parents:
diff changeset
154 assert( _locs_used[reg->value()] == OopMapValue::unused_value, "cannot insert twice" );
a61af66fc99e Initial load
duke
parents:
diff changeset
155 debug_only( _locs_used[reg->value()] = x; )
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 OopMapValue o(reg, x);
a61af66fc99e Initial load
duke
parents:
diff changeset
158
a61af66fc99e Initial load
duke
parents:
diff changeset
159 if(x == OopMapValue::callee_saved_value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // This can never be a stack location, so we don't need to transform it.
a61af66fc99e Initial load
duke
parents:
diff changeset
161 assert(optional->is_reg(), "Trying to callee save a stack location");
a61af66fc99e Initial load
duke
parents:
diff changeset
162 o.set_content_reg(optional);
a61af66fc99e Initial load
duke
parents:
diff changeset
163 } else if(x == OopMapValue::derived_oop_value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
164 o.set_content_reg(optional);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 o.write_on(write_stream());
a61af66fc99e Initial load
duke
parents:
diff changeset
168 increment_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 void OopMap::set_oop(VMReg reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 set_xxx(reg, OopMapValue::oop_value, VMRegImpl::Bad());
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 void OopMap::set_value(VMReg reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // At this time, we only need value entries in our OopMap when ZapDeadCompiledLocals is active.
a61af66fc99e Initial load
duke
parents:
diff changeset
179 if (ZapDeadCompiledLocals)
a61af66fc99e Initial load
duke
parents:
diff changeset
180 set_xxx(reg, OopMapValue::value_value, VMRegImpl::Bad());
a61af66fc99e Initial load
duke
parents:
diff changeset
181 }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
184 void OopMap::set_narrowoop(VMReg reg) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
185 set_xxx(reg, OopMapValue::narrowoop_value, VMRegImpl::Bad());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 void OopMap::set_callee_saved(VMReg reg, VMReg caller_machine_register ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
190 set_xxx(reg, OopMapValue::callee_saved_value, caller_machine_register);
a61af66fc99e Initial load
duke
parents:
diff changeset
191 }
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 void OopMap::set_derived_oop(VMReg reg, VMReg derived_from_local_register ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
195 if( reg == derived_from_local_register ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
196 // Actually an oop, derived shares storage with base,
a61af66fc99e Initial load
duke
parents:
diff changeset
197 set_oop(reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
198 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 set_xxx(reg, OopMapValue::derived_oop_value, derived_from_local_register);
a61af66fc99e Initial load
duke
parents:
diff changeset
200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 // OopMapSet
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 OopMapSet::OopMapSet() {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 set_om_size(MinOopMapAllocation);
a61af66fc99e Initial load
duke
parents:
diff changeset
207 set_om_count(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
208 OopMap** temp = NEW_RESOURCE_ARRAY(OopMap*, om_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
209 set_om_data(temp);
a61af66fc99e Initial load
duke
parents:
diff changeset
210 }
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 void OopMapSet::grow_om_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 int new_size = om_size() * 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
215 OopMap** new_data = NEW_RESOURCE_ARRAY(OopMap*, new_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 memcpy(new_data,om_data(),om_size() * sizeof(OopMap*));
a61af66fc99e Initial load
duke
parents:
diff changeset
217 set_om_size(new_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
218 set_om_data(new_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 }
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 void OopMapSet::copy_to(address addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
223 address temp = addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
224 int align = sizeof(void *) - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // Copy this
a61af66fc99e Initial load
duke
parents:
diff changeset
226 memcpy(addr,this,sizeof(OopMapSet));
a61af66fc99e Initial load
duke
parents:
diff changeset
227 temp += sizeof(OopMapSet);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 temp = (address)((intptr_t)(temp + align) & ~align);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Do the needed fixups to the new OopMapSet
a61af66fc99e Initial load
duke
parents:
diff changeset
230 OopMapSet* new_set = (OopMapSet*)addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
231 new_set->set_om_data((OopMap**)temp);
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // Allow enough space for the OopMap pointers
a61af66fc99e Initial load
duke
parents:
diff changeset
233 temp += (om_count() * sizeof(OopMap*));
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 for(int i=0; i < om_count(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
236 OopMap* map = at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
237 map->copy_to((address)temp);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 new_set->set(i,(OopMap*)temp);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 temp += map->heap_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // This "locks" the OopMapSet
a61af66fc99e Initial load
duke
parents:
diff changeset
242 new_set->set_om_size(-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
243 }
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 void OopMapSet::add_gc_map(int pc_offset, OopMap *map ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
247 assert(om_size() != -1,"Cannot grow a fixed OopMapSet");
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 if(om_count() >= om_size()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 grow_om_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
251 }
a61af66fc99e Initial load
duke
parents:
diff changeset
252 map->set_offset(pc_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
253
a61af66fc99e Initial load
duke
parents:
diff changeset
254 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
255 if(om_count() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
256 OopMap* last = at(om_count()-1);
a61af66fc99e Initial load
duke
parents:
diff changeset
257 if (last->offset() == map->offset() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
258 fatal("OopMap inserted twice");
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 if(last->offset() > map->offset()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
261 tty->print_cr( "WARNING, maps not sorted: pc[%d]=%d, pc[%d]=%d",
a61af66fc99e Initial load
duke
parents:
diff changeset
262 om_count(),last->offset(),om_count()+1,map->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
263 }
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 set(om_count(),map);
a61af66fc99e Initial load
duke
parents:
diff changeset
268 increment_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271
a61af66fc99e Initial load
duke
parents:
diff changeset
272 int OopMapSet::heap_size() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 // The space we use
a61af66fc99e Initial load
duke
parents:
diff changeset
274 int size = sizeof(OopMap);
a61af66fc99e Initial load
duke
parents:
diff changeset
275 int align = sizeof(void *) - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 size = ((size+align) & ~align);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 size += om_count() * sizeof(OopMap*);
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // Now add in the space needed for the indivdiual OopMaps
a61af66fc99e Initial load
duke
parents:
diff changeset
280 for(int i=0; i < om_count(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 size += at(i)->heap_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
282 }
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // We don't need to align this, it will be naturally pointer aligned
a61af66fc99e Initial load
duke
parents:
diff changeset
284 return size;
a61af66fc99e Initial load
duke
parents:
diff changeset
285 }
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 OopMap* OopMapSet::singular_oop_map() {
a61af66fc99e Initial load
duke
parents:
diff changeset
289 guarantee(om_count() == 1, "Make sure we only have a single gc point");
a61af66fc99e Initial load
duke
parents:
diff changeset
290 return at(0);
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293
a61af66fc99e Initial load
duke
parents:
diff changeset
294 OopMap* OopMapSet::find_map_at_offset(int pc_offset) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
295 int i, len = om_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
296 assert( len > 0, "must have pointer maps" );
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // Scan through oopmaps. Stop when current offset is either equal or greater
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // than the one we are looking for.
a61af66fc99e Initial load
duke
parents:
diff changeset
300 for( i = 0; i < len; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 if( at(i)->offset() >= pc_offset )
a61af66fc99e Initial load
duke
parents:
diff changeset
302 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
303 }
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 assert( i < len, "oopmap not found" );
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 OopMap* m = at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
308 assert( m->offset() == pc_offset, "oopmap not found" );
a61af66fc99e Initial load
duke
parents:
diff changeset
309 return m;
a61af66fc99e Initial load
duke
parents:
diff changeset
310 }
a61af66fc99e Initial load
duke
parents:
diff changeset
311
a61af66fc99e Initial load
duke
parents:
diff changeset
312 class DoNothingClosure: public OopClosure {
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
313 public:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
314 void do_oop(oop* p) {}
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
315 void do_oop(narrowOop* p) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
316 };
a61af66fc99e Initial load
duke
parents:
diff changeset
317 static DoNothingClosure do_nothing;
a61af66fc99e Initial load
duke
parents:
diff changeset
318
a61af66fc99e Initial load
duke
parents:
diff changeset
319 static void add_derived_oop(oop* base, oop* derived) {
a61af66fc99e Initial load
duke
parents:
diff changeset
320 #ifndef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
321 COMPILER1_PRESENT(ShouldNotReachHere();)
a61af66fc99e Initial load
duke
parents:
diff changeset
322 #endif // TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
323 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
324 DerivedPointerTable::add(derived, base);
a61af66fc99e Initial load
duke
parents:
diff changeset
325 #endif // COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
330 static void trace_codeblob_maps(const frame *fr, const RegisterMap *reg_map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // Print oopmap and regmap
a61af66fc99e Initial load
duke
parents:
diff changeset
332 tty->print_cr("------ ");
a61af66fc99e Initial load
duke
parents:
diff changeset
333 CodeBlob* cb = fr->cb();
a61af66fc99e Initial load
duke
parents:
diff changeset
334 OopMapSet* maps = cb->oop_maps();
a61af66fc99e Initial load
duke
parents:
diff changeset
335 OopMap* map = cb->oop_map_for_return_address(fr->pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
336 map->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
337 if( cb->is_nmethod() ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
338 nmethod* nm = (nmethod*)cb;
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // native wrappers have no scope data, it is implied
a61af66fc99e Initial load
duke
parents:
diff changeset
340 if (nm->is_native_method()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
341 tty->print("bci: 0 (native)");
a61af66fc99e Initial load
duke
parents:
diff changeset
342 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
343 ScopeDesc* scope = nm->scope_desc_at(fr->pc());
a61af66fc99e Initial load
duke
parents:
diff changeset
344 tty->print("bci: %d ",scope->bci());
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346 }
a61af66fc99e Initial load
duke
parents:
diff changeset
347 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
348 fr->print_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
349 tty->print(" ");
a61af66fc99e Initial load
duke
parents:
diff changeset
350 cb->print_value_on(tty); tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
351 reg_map->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
352 tty->print_cr("------ ");
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
356
a61af66fc99e Initial load
duke
parents:
diff changeset
357 void OopMapSet::oops_do(const frame *fr, const RegisterMap* reg_map, OopClosure* f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // add derived oops to a table
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
359 all_do(fr, reg_map, f, add_derived_oop, &do_nothing);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
360 }
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362
a61af66fc99e Initial load
duke
parents:
diff changeset
363 void OopMapSet::all_do(const frame *fr, const RegisterMap *reg_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
364 OopClosure* oop_fn, void derived_oop_fn(oop*, oop*),
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
365 OopClosure* value_fn) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
366 CodeBlob* cb = fr->cb();
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
367 assert(cb != NULL, "no codeblob");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
368
a61af66fc99e Initial load
duke
parents:
diff changeset
369 NOT_PRODUCT(if (TraceCodeBlobStacks) trace_codeblob_maps(fr, reg_map);)
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 OopMapSet* maps = cb->oop_maps();
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
372 OopMap* map = cb->oop_map_for_return_address(fr->pc());
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
373 assert(map != NULL, "no ptr map found");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
374
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // handle derived pointers first (otherwise base pointer may be
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // changed before derived pointer offset has been collected)
a61af66fc99e Initial load
duke
parents:
diff changeset
377 OopMapValue omv;
a61af66fc99e Initial load
duke
parents:
diff changeset
378 {
a61af66fc99e Initial load
duke
parents:
diff changeset
379 OopMapStream oms(map,OopMapValue::derived_oop_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
380 if (!oms.is_done()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
381 #ifndef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
382 COMPILER1_PRESENT(ShouldNotReachHere();)
a61af66fc99e Initial load
duke
parents:
diff changeset
383 #endif // !TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
384 // Protect the operation on the derived pointers. This
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // protects the addition of derived pointers to the shared
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // derived pointer table in DerivedPointerTable::add().
a61af66fc99e Initial load
duke
parents:
diff changeset
387 MutexLockerEx x(DerivedPointerTableGC_lock, Mutex::_no_safepoint_check_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 do {
a61af66fc99e Initial load
duke
parents:
diff changeset
389 omv = oms.current();
a61af66fc99e Initial load
duke
parents:
diff changeset
390 oop* loc = fr->oopmapreg_to_location(omv.reg(),reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
391 if ( loc != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
392 oop *base_loc = fr->oopmapreg_to_location(omv.content_reg(), reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
393 oop *derived_loc = loc;
858
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
394 oop val = *base_loc;
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
395 if (val == (oop)NULL || Universe::is_narrow_oop_base(val)) {
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
396 // Ignore NULL oops and decoded NULL narrow oops which
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
397 // equal to Universe::narrow_oop_base when a narrow oop
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
398 // implicit null check is used in compiled code.
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
399 // The narrow_oop_base could be NULL or be the address
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
400 // of the page below heap depending on compressed oops mode.
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
401 } else
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
402 derived_oop_fn(base_loc, derived_loc);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
403 }
a61af66fc99e Initial load
duke
parents:
diff changeset
404 oms.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
405 } while (!oms.is_done());
a61af66fc99e Initial load
duke
parents:
diff changeset
406 }
a61af66fc99e Initial load
duke
parents:
diff changeset
407 }
a61af66fc99e Initial load
duke
parents:
diff changeset
408
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
409 // We want coop, value and oop oop_types
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
410 int mask = OopMapValue::oop_value | OopMapValue::value_value | OopMapValue::narrowoop_value;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
411 {
a61af66fc99e Initial load
duke
parents:
diff changeset
412 for (OopMapStream oms(map,mask); !oms.is_done(); oms.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
413 omv = oms.current();
a61af66fc99e Initial load
duke
parents:
diff changeset
414 oop* loc = fr->oopmapreg_to_location(omv.reg(),reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
415 if ( loc != NULL ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
416 if ( omv.type() == OopMapValue::oop_value ) {
858
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
417 oop val = *loc;
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
418 if (val == (oop)NULL || Universe::is_narrow_oop_base(val)) {
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
419 // Ignore NULL oops and decoded NULL narrow oops which
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
420 // equal to Universe::narrow_oop_base when a narrow oop
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
421 // implicit null check is used in compiled code.
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
422 // The narrow_oop_base could be NULL or be the address
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
423 // of the page below heap depending on compressed oops mode.
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
424 continue;
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
425 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
426 #ifdef ASSERT
244
524eca34ea76 6684714: Optimize EA Connection Graph build performance
kvn
parents: 113
diff changeset
427 if ((((uintptr_t)loc & (sizeof(*loc)-1)) != 0) ||
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
428 !Universe::heap()->is_in_or_null(*loc)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
429 tty->print_cr("# Found non oop pointer. Dumping state at failure");
a61af66fc99e Initial load
duke
parents:
diff changeset
430 // try to dump out some helpful debugging information
a61af66fc99e Initial load
duke
parents:
diff changeset
431 trace_codeblob_maps(fr, reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
432 omv.print();
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
433 tty->print_cr("register r");
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
434 omv.reg()->print();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
435 tty->print_cr("loc = %p *loc = %p\n", loc, (address)*loc);
a61af66fc99e Initial load
duke
parents:
diff changeset
436 // do the real assert.
a61af66fc99e Initial load
duke
parents:
diff changeset
437 assert(Universe::heap()->is_in_or_null(*loc), "found non oop pointer");
a61af66fc99e Initial load
duke
parents:
diff changeset
438 }
a61af66fc99e Initial load
duke
parents:
diff changeset
439 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
440 oop_fn->do_oop(loc);
a61af66fc99e Initial load
duke
parents:
diff changeset
441 } else if ( omv.type() == OopMapValue::value_value ) {
858
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
442 assert((*loc) == (oop)NULL || !Universe::is_narrow_oop_base(*loc),
5314d85ffd54 6826736: CMS: core dump with -XX:+UseCompressedOops
kvn
parents: 245
diff changeset
443 "found invalid value pointer");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
444 value_fn->do_oop(loc);
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
445 } else if ( omv.type() == OopMapValue::narrowoop_value ) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
446 narrowOop *nl = (narrowOop*)loc;
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
447 #ifndef VM_LITTLE_ENDIAN
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
448 if (!omv.reg()->is_stack()) {
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
449 // compressed oops in registers only take up 4 bytes of an
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
450 // 8 byte register but they are in the wrong part of the
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
451 // word so adjust loc to point at the right place.
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
452 nl = (narrowOop*)((address)nl + 4);
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
453 }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
454 #endif
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
455 oop_fn->do_oop(nl);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
456 }
a61af66fc99e Initial load
duke
parents:
diff changeset
457 }
a61af66fc99e Initial load
duke
parents:
diff changeset
458 }
a61af66fc99e Initial load
duke
parents:
diff changeset
459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
460 }
a61af66fc99e Initial load
duke
parents:
diff changeset
461
a61af66fc99e Initial load
duke
parents:
diff changeset
462
a61af66fc99e Initial load
duke
parents:
diff changeset
463 // Update callee-saved register info for the following frame
a61af66fc99e Initial load
duke
parents:
diff changeset
464 void OopMapSet::update_register_map(const frame *fr, RegisterMap *reg_map) {
a61af66fc99e Initial load
duke
parents:
diff changeset
465 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
466 CodeBlob* cb = fr->cb();
a61af66fc99e Initial load
duke
parents:
diff changeset
467 assert(cb != NULL, "no codeblob");
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // Any reg might be saved by a safepoint handler (see generate_handler_blob).
a61af66fc99e Initial load
duke
parents:
diff changeset
470 const int max_saved_on_entry_reg_count = ConcreteRegisterImpl::number_of_registers;
a61af66fc99e Initial load
duke
parents:
diff changeset
471 assert( reg_map->_update_for_id == NULL || fr->is_older(reg_map->_update_for_id),
a61af66fc99e Initial load
duke
parents:
diff changeset
472 "already updated this map; do not 'update' it twice!" );
a61af66fc99e Initial load
duke
parents:
diff changeset
473 debug_only(reg_map->_update_for_id = fr->id());
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475 // Check if caller must update oop argument
a61af66fc99e Initial load
duke
parents:
diff changeset
476 assert((reg_map->include_argument_oops() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
477 !cb->caller_must_gc_arguments(reg_map->thread())),
a61af66fc99e Initial load
duke
parents:
diff changeset
478 "include_argument_oops should already be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 int nof_callee = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
481 oop* locs[2*max_saved_on_entry_reg_count+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
482 VMReg regs[2*max_saved_on_entry_reg_count+1];
a61af66fc99e Initial load
duke
parents:
diff changeset
483 // ("+1" because max_saved_on_entry_reg_count might be zero)
a61af66fc99e Initial load
duke
parents:
diff changeset
484
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // Scan through oopmap and find location of all callee-saved registers
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // (we do not do update in place, since info could be overwritten)
a61af66fc99e Initial load
duke
parents:
diff changeset
487
a61af66fc99e Initial load
duke
parents:
diff changeset
488 address pc = fr->pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490 OopMap* map = cb->oop_map_for_return_address(pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 assert(map != NULL, " no ptr map found");
a61af66fc99e Initial load
duke
parents:
diff changeset
493
a61af66fc99e Initial load
duke
parents:
diff changeset
494 OopMapValue omv;
a61af66fc99e Initial load
duke
parents:
diff changeset
495 for(OopMapStream oms(map,OopMapValue::callee_saved_value); !oms.is_done(); oms.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
496 omv = oms.current();
a61af66fc99e Initial load
duke
parents:
diff changeset
497 assert(nof_callee < 2*max_saved_on_entry_reg_count, "overflow");
a61af66fc99e Initial load
duke
parents:
diff changeset
498 regs[nof_callee] = omv.content_reg();
a61af66fc99e Initial load
duke
parents:
diff changeset
499 locs[nof_callee] = fr->oopmapreg_to_location(omv.reg(),reg_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
500 nof_callee++;
a61af66fc99e Initial load
duke
parents:
diff changeset
501 }
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // Check that runtime stubs save all callee-saved registers
a61af66fc99e Initial load
duke
parents:
diff changeset
504 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
505 assert(cb->is_compiled_by_c1() || !cb->is_runtime_stub() ||
a61af66fc99e Initial load
duke
parents:
diff changeset
506 (nof_callee >= SAVED_ON_ENTRY_REG_COUNT || nof_callee >= C_SAVED_ON_ENTRY_REG_COUNT),
a61af66fc99e Initial load
duke
parents:
diff changeset
507 "must save all");
a61af66fc99e Initial load
duke
parents:
diff changeset
508 #endif // COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
509
a61af66fc99e Initial load
duke
parents:
diff changeset
510 // Copy found callee-saved register to reg_map
a61af66fc99e Initial load
duke
parents:
diff changeset
511 for(int i = 0; i < nof_callee; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
512 reg_map->set_location(regs[i], (address)locs[i]);
a61af66fc99e Initial load
duke
parents:
diff changeset
513 }
a61af66fc99e Initial load
duke
parents:
diff changeset
514 }
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 //=============================================================================
a61af66fc99e Initial load
duke
parents:
diff changeset
517 // Non-Product code
a61af66fc99e Initial load
duke
parents:
diff changeset
518
a61af66fc99e Initial load
duke
parents:
diff changeset
519 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 bool OopMap::has_derived_pointer() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
522 #ifndef TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
523 COMPILER1_PRESENT(return false);
a61af66fc99e Initial load
duke
parents:
diff changeset
524 #endif // !TIERED
a61af66fc99e Initial load
duke
parents:
diff changeset
525 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
526 OopMapStream oms((OopMap*)this,OopMapValue::derived_oop_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
527 return oms.is_done();
a61af66fc99e Initial load
duke
parents:
diff changeset
528 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
529 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
530 #endif // COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
531 }
a61af66fc99e Initial load
duke
parents:
diff changeset
532
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 25
diff changeset
533 #endif //PRODUCT
0
a61af66fc99e Initial load
duke
parents:
diff changeset
534
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 25
diff changeset
535 // Printing code is present in product build for -XX:+PrintAssembly.
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 25
diff changeset
536
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 25
diff changeset
537 static
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 25
diff changeset
538 void print_register_type(OopMapValue::oop_types x, VMReg optional,
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 25
diff changeset
539 outputStream* st) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
540 switch( x ) {
a61af66fc99e Initial load
duke
parents:
diff changeset
541 case OopMapValue::oop_value:
25
c5cbd367e4d1 6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents: 0
diff changeset
542 st->print("Oop");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
543 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
544 case OopMapValue::value_value:
25
c5cbd367e4d1 6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents: 0
diff changeset
545 st->print("Value" );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
546 break;
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
547 case OopMapValue::narrowoop_value:
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 100
diff changeset
548 tty->print("NarrowOop" );
0
a61af66fc99e Initial load
duke
parents:
diff changeset
549 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
550 case OopMapValue::callee_saved_value:
25
c5cbd367e4d1 6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents: 0
diff changeset
551 st->print("Callers_" );
c5cbd367e4d1 6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents: 0
diff changeset
552 optional->print_on(st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
553 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
554 case OopMapValue::derived_oop_value:
25
c5cbd367e4d1 6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents: 0
diff changeset
555 st->print("Derived_oop_" );
c5cbd367e4d1 6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents: 0
diff changeset
556 optional->print_on(st);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
557 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
558 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
559 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
560 }
a61af66fc99e Initial load
duke
parents:
diff changeset
561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
562
a61af66fc99e Initial load
duke
parents:
diff changeset
563
25
c5cbd367e4d1 6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents: 0
diff changeset
564 void OopMapValue::print_on(outputStream* st) const {
c5cbd367e4d1 6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents: 0
diff changeset
565 reg()->print_on(st);
c5cbd367e4d1 6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents: 0
diff changeset
566 st->print("=");
c5cbd367e4d1 6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents: 0
diff changeset
567 print_register_type(type(),content_reg(),st);
c5cbd367e4d1 6621094: PrintOptoAssembly is broken for oops information in DebugInfo
kvn
parents: 0
diff changeset
568 st->print(" ");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
569 }
a61af66fc99e Initial load
duke
parents:
diff changeset
570
a61af66fc99e Initial load
duke
parents:
diff changeset
571
a61af66fc99e Initial load
duke
parents:
diff changeset
572 void OopMap::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
573 OopMapValue omv;
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 25
diff changeset
574 st->print("OopMap{");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
575 for(OopMapStream oms((OopMap*)this); !oms.is_done(); oms.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
576 omv = oms.current();
a61af66fc99e Initial load
duke
parents:
diff changeset
577 omv.print_on(st);
a61af66fc99e Initial load
duke
parents:
diff changeset
578 }
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 25
diff changeset
579 st->print("off=%d}", (int) offset());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
580 }
a61af66fc99e Initial load
duke
parents:
diff changeset
581
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 void OopMapSet::print_on(outputStream* st) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
584 int i, len = om_count();
a61af66fc99e Initial load
duke
parents:
diff changeset
585
a61af66fc99e Initial load
duke
parents:
diff changeset
586 st->print_cr("OopMapSet contains %d OopMaps\n",len);
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 for( i = 0; i < len; i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
589 OopMap* m = at(i);
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 25
diff changeset
590 st->print_cr("#%d ",i);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
591 m->print_on(st);
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 25
diff changeset
592 st->cr();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
593 }
a61af66fc99e Initial load
duke
parents:
diff changeset
594 }
100
c7c777385a15 6667042: PrintAssembly option does not work without special plugin
jrose
parents: 25
diff changeset
595
0
a61af66fc99e Initial load
duke
parents:
diff changeset
596
a61af66fc99e Initial load
duke
parents:
diff changeset
597
a61af66fc99e Initial load
duke
parents:
diff changeset
598 //------------------------------DerivedPointerTable---------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
599
a61af66fc99e Initial load
duke
parents:
diff changeset
600 #ifdef COMPILER2
a61af66fc99e Initial load
duke
parents:
diff changeset
601
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 3753
diff changeset
602 class DerivedPointerEntry : public CHeapObj<mtCompiler> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
603 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
604 oop* _location; // Location of derived pointer (also pointing to the base)
a61af66fc99e Initial load
duke
parents:
diff changeset
605 intptr_t _offset; // Offset from base pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
606 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
607 DerivedPointerEntry(oop* location, intptr_t offset) { _location = location; _offset = offset; }
a61af66fc99e Initial load
duke
parents:
diff changeset
608 oop* location() { return _location; }
a61af66fc99e Initial load
duke
parents:
diff changeset
609 intptr_t offset() { return _offset; }
a61af66fc99e Initial load
duke
parents:
diff changeset
610 };
a61af66fc99e Initial load
duke
parents:
diff changeset
611
a61af66fc99e Initial load
duke
parents:
diff changeset
612
a61af66fc99e Initial load
duke
parents:
diff changeset
613 GrowableArray<DerivedPointerEntry*>* DerivedPointerTable::_list = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
614 bool DerivedPointerTable::_active = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
615
a61af66fc99e Initial load
duke
parents:
diff changeset
616
a61af66fc99e Initial load
duke
parents:
diff changeset
617 void DerivedPointerTable::clear() {
a61af66fc99e Initial load
duke
parents:
diff changeset
618 // The first time, we create the list. Otherwise it should be
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // empty. If not, then we have probably forgotton to call
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // update_pointers after last GC/Scavenge.
a61af66fc99e Initial load
duke
parents:
diff changeset
621 assert (!_active, "should not be active");
a61af66fc99e Initial load
duke
parents:
diff changeset
622 assert(_list == NULL || _list->length() == 0, "table not empty");
a61af66fc99e Initial load
duke
parents:
diff changeset
623 if (_list == NULL) {
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 3753
diff changeset
624 _list = new (ResourceObj::C_HEAP, mtCompiler) GrowableArray<DerivedPointerEntry*>(10, true); // Allocated on C heap
0
a61af66fc99e Initial load
duke
parents:
diff changeset
625 }
a61af66fc99e Initial load
duke
parents:
diff changeset
626 _active = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
627 }
a61af66fc99e Initial load
duke
parents:
diff changeset
628
a61af66fc99e Initial load
duke
parents:
diff changeset
629
a61af66fc99e Initial load
duke
parents:
diff changeset
630 // Returns value of location as an int
a61af66fc99e Initial load
duke
parents:
diff changeset
631 intptr_t value_of_loc(oop *pointer) { return (intptr_t)(*pointer); }
a61af66fc99e Initial load
duke
parents:
diff changeset
632
a61af66fc99e Initial load
duke
parents:
diff changeset
633
a61af66fc99e Initial load
duke
parents:
diff changeset
634 void DerivedPointerTable::add(oop *derived_loc, oop *base_loc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
635 assert(Universe::heap()->is_in_or_null(*base_loc), "not an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
636 assert(derived_loc != base_loc, "Base and derived in same location");
a61af66fc99e Initial load
duke
parents:
diff changeset
637 if (_active) {
a61af66fc99e Initial load
duke
parents:
diff changeset
638 assert(*derived_loc != (oop)base_loc, "location already added");
a61af66fc99e Initial load
duke
parents:
diff changeset
639 assert(_list != NULL, "list must exist");
a61af66fc99e Initial load
duke
parents:
diff changeset
640 intptr_t offset = value_of_loc(derived_loc) - value_of_loc(base_loc);
3753
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 1972
diff changeset
641 // This assert is invalid because derived pointers can be
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 1972
diff changeset
642 // arbitrarily far away from their base.
cba7b5c2d53f 7045514: SPARC assembly code for JSR 292 ricochet frames
never
parents: 1972
diff changeset
643 // assert(offset >= -1000000, "wrong derived pointer info");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
644
a61af66fc99e Initial load
duke
parents:
diff changeset
645 if (TraceDerivedPointers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
646 tty->print_cr(
a61af66fc99e Initial load
duke
parents:
diff changeset
647 "Add derived pointer@" INTPTR_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
648 " - Derived: " INTPTR_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
649 " Base: " INTPTR_FORMAT " (@" INTPTR_FORMAT ") (Offset: %d)",
a61af66fc99e Initial load
duke
parents:
diff changeset
650 derived_loc, (address)*derived_loc, (address)*base_loc, base_loc, offset
a61af66fc99e Initial load
duke
parents:
diff changeset
651 );
a61af66fc99e Initial load
duke
parents:
diff changeset
652 }
a61af66fc99e Initial load
duke
parents:
diff changeset
653 // Set derived oop location to point to base.
a61af66fc99e Initial load
duke
parents:
diff changeset
654 *derived_loc = (oop)base_loc;
a61af66fc99e Initial load
duke
parents:
diff changeset
655 assert_lock_strong(DerivedPointerTableGC_lock);
a61af66fc99e Initial load
duke
parents:
diff changeset
656 DerivedPointerEntry *entry = new DerivedPointerEntry(derived_loc, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
657 _list->append(entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
658 }
a61af66fc99e Initial load
duke
parents:
diff changeset
659 }
a61af66fc99e Initial load
duke
parents:
diff changeset
660
a61af66fc99e Initial load
duke
parents:
diff changeset
661
a61af66fc99e Initial load
duke
parents:
diff changeset
662 void DerivedPointerTable::update_pointers() {
a61af66fc99e Initial load
duke
parents:
diff changeset
663 assert(_list != NULL, "list must exist");
a61af66fc99e Initial load
duke
parents:
diff changeset
664 for(int i = 0; i < _list->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
665 DerivedPointerEntry* entry = _list->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
666 oop* derived_loc = entry->location();
a61af66fc99e Initial load
duke
parents:
diff changeset
667 intptr_t offset = entry->offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
668 // The derived oop was setup to point to location of base
a61af66fc99e Initial load
duke
parents:
diff changeset
669 oop base = **(oop**)derived_loc;
a61af66fc99e Initial load
duke
parents:
diff changeset
670 assert(Universe::heap()->is_in_or_null(base), "must be an oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
671
a61af66fc99e Initial load
duke
parents:
diff changeset
672 *derived_loc = (oop)(((address)base) + offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
673 assert(value_of_loc(derived_loc) - value_of_loc(&base) == offset, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
674
a61af66fc99e Initial load
duke
parents:
diff changeset
675 if (TraceDerivedPointers) {
a61af66fc99e Initial load
duke
parents:
diff changeset
676 tty->print_cr("Updating derived pointer@" INTPTR_FORMAT
a61af66fc99e Initial load
duke
parents:
diff changeset
677 " - Derived: " INTPTR_FORMAT " Base: " INTPTR_FORMAT " (Offset: %d)",
a61af66fc99e Initial load
duke
parents:
diff changeset
678 derived_loc, (address)*derived_loc, (address)base, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
679 }
a61af66fc99e Initial load
duke
parents:
diff changeset
680
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // Delete entry
a61af66fc99e Initial load
duke
parents:
diff changeset
682 delete entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
683 _list->at_put(i, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
684 }
a61af66fc99e Initial load
duke
parents:
diff changeset
685 // Clear list, so it is ready for next traversal (this is an invariant)
a61af66fc99e Initial load
duke
parents:
diff changeset
686 if (TraceDerivedPointers && !_list->is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
687 tty->print_cr("--------------------------");
a61af66fc99e Initial load
duke
parents:
diff changeset
688 }
a61af66fc99e Initial load
duke
parents:
diff changeset
689 _list->clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
690 _active = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
691 }
a61af66fc99e Initial load
duke
parents:
diff changeset
692
a61af66fc99e Initial load
duke
parents:
diff changeset
693 #endif // COMPILER2