annotate src/share/vm/code/relocInfo.cpp @ 3992:d1bdeef3e3e2

7098282: G1: assert(interval >= 0) failed: Sanity check, referencePolicy.cpp: 76 Summary: There is a race between one thread successfully forwarding and copying the klass mirror for the SoftReference class (including the static master clock) and another thread attempting to use the master clock while attempting to discover a soft reference object. Maintain a shadow copy of the soft reference master clock and use the shadow during reference discovery and reference processing. Reviewed-by: tonyp, brutisso, ysr
author johnc
date Wed, 12 Oct 2011 10:25:51 -0700
parents 6c97c830fb6f
children da91efe96a93
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2426
1d1603768966 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 2375
diff changeset
2 * Copyright (c) 1997, 2011, 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: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
21 * questions.
0
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: 1762
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
26 #include "code/compiledIC.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
27 #include "code/nmethod.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
28 #include "code/relocInfo.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
29 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
30 #include "runtime/stubCodeGenerator.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
31 #include "utilities/copy.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
32 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
33 # include "assembler_x86.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
34 # include "nativeInst_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
35 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
36 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
37 # include "assembler_sparc.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
38 # include "nativeInst_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
39 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
40 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
41 # include "assembler_zero.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
42 # include "nativeInst_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1762
diff changeset
43 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
44 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
45 # include "assembler_arm.inline.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
46 # include "nativeInst_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
47 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
48 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
49 # include "assembler_ppc.inline.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
50 # include "nativeInst_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
51 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
52
a61af66fc99e Initial load
duke
parents:
diff changeset
53
a61af66fc99e Initial load
duke
parents:
diff changeset
54 const RelocationHolder RelocationHolder::none; // its type is relocInfo::none
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // Implementation of relocInfo
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
60 relocInfo::relocInfo(relocType t, int off, int f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
61 assert(t != data_prefix_tag, "cannot build a prefix this way");
a61af66fc99e Initial load
duke
parents:
diff changeset
62 assert((t & type_mask) == t, "wrong type");
a61af66fc99e Initial load
duke
parents:
diff changeset
63 assert((f & format_mask) == f, "wrong format");
a61af66fc99e Initial load
duke
parents:
diff changeset
64 assert(off >= 0 && off < offset_limit(), "offset out off bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
65 assert((off & (offset_unit-1)) == 0, "misaligned offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
66 (*this) = relocInfo(t, RAW_BITS, off, f);
a61af66fc99e Initial load
duke
parents:
diff changeset
67 }
a61af66fc99e Initial load
duke
parents:
diff changeset
68 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 void relocInfo::initialize(CodeSection* dest, Relocation* reloc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 relocInfo* data = this+1; // here's where the data might go
a61af66fc99e Initial load
duke
parents:
diff changeset
72 dest->set_locs_end(data); // sync end: the next call may read dest.locs_end
a61af66fc99e Initial load
duke
parents:
diff changeset
73 reloc->pack_data_to(dest); // maybe write data into locs, advancing locs_end
a61af66fc99e Initial load
duke
parents:
diff changeset
74 relocInfo* data_limit = dest->locs_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
75 if (data_limit > data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
76 relocInfo suffix = (*this);
a61af66fc99e Initial load
duke
parents:
diff changeset
77 data_limit = this->finish_prefix((short*) data_limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // Finish up with the suffix. (Hack note: pack_data_to might edit this.)
a61af66fc99e Initial load
duke
parents:
diff changeset
79 *data_limit = suffix;
a61af66fc99e Initial load
duke
parents:
diff changeset
80 dest->set_locs_end(data_limit+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 }
a61af66fc99e Initial load
duke
parents:
diff changeset
82 }
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 relocInfo* relocInfo::finish_prefix(short* prefix_limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
85 assert(sizeof(relocInfo) == sizeof(short), "change this code");
a61af66fc99e Initial load
duke
parents:
diff changeset
86 short* p = (short*)(this+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
87 assert(prefix_limit >= p, "must be a valid span of data");
a61af66fc99e Initial load
duke
parents:
diff changeset
88 int plen = prefix_limit - p;
a61af66fc99e Initial load
duke
parents:
diff changeset
89 if (plen == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
90 debug_only(_value = 0xFFFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
91 return this; // no data: remove self completely
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93 if (plen == 1 && fits_into_immediate(p[0])) {
a61af66fc99e Initial load
duke
parents:
diff changeset
94 (*this) = immediate_relocInfo(p[0]); // move data inside self
a61af66fc99e Initial load
duke
parents:
diff changeset
95 return this+1;
a61af66fc99e Initial load
duke
parents:
diff changeset
96 }
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // cannot compact, so just update the count and return the limit pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
98 (*this) = prefix_relocInfo(plen); // write new datalen
a61af66fc99e Initial load
duke
parents:
diff changeset
99 assert(data() + datalen() == prefix_limit, "pointers must line up");
a61af66fc99e Initial load
duke
parents:
diff changeset
100 return (relocInfo*)prefix_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104 void relocInfo::set_type(relocType t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
105 int old_offset = addr_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
106 int old_format = format();
a61af66fc99e Initial load
duke
parents:
diff changeset
107 (*this) = relocInfo(t, old_offset, old_format);
a61af66fc99e Initial load
duke
parents:
diff changeset
108 assert(type()==(int)t, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
109 assert(addr_offset()==old_offset, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
110 assert(format()==old_format, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 void relocInfo::set_format(int f) {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 int old_offset = addr_offset();
a61af66fc99e Initial load
duke
parents:
diff changeset
116 assert((f & format_mask) == f, "wrong format");
a61af66fc99e Initial load
duke
parents:
diff changeset
117 _value = (_value & ~(format_mask << offset_width)) | (f << offset_width);
a61af66fc99e Initial load
duke
parents:
diff changeset
118 assert(addr_offset()==old_offset, "sanity check");
a61af66fc99e Initial load
duke
parents:
diff changeset
119 }
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 void relocInfo::change_reloc_info_for_address(RelocIterator *itr, address pc, relocType old_type, relocType new_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 bool found = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 while (itr->next() && !found) {
a61af66fc99e Initial load
duke
parents:
diff changeset
125 if (itr->addr() == pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
126 assert(itr->type()==old_type, "wrong relocInfo type found");
a61af66fc99e Initial load
duke
parents:
diff changeset
127 itr->current()->set_type(new_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 found=true;
a61af66fc99e Initial load
duke
parents:
diff changeset
129 }
a61af66fc99e Initial load
duke
parents:
diff changeset
130 }
a61af66fc99e Initial load
duke
parents:
diff changeset
131 assert(found, "no relocInfo found for pc");
a61af66fc99e Initial load
duke
parents:
diff changeset
132 }
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 void relocInfo::remove_reloc_info_for_address(RelocIterator *itr, address pc, relocType old_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 change_reloc_info_for_address(itr, pc, old_type, none);
a61af66fc99e Initial load
duke
parents:
diff changeset
137 }
a61af66fc99e Initial load
duke
parents:
diff changeset
138
a61af66fc99e Initial load
duke
parents:
diff changeset
139
a61af66fc99e Initial load
duke
parents:
diff changeset
140 // ----------------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
141 // Implementation of RelocIterator
a61af66fc99e Initial load
duke
parents:
diff changeset
142
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
143 void RelocIterator::initialize(nmethod* nm, address begin, address limit) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
144 initialize_misc();
a61af66fc99e Initial load
duke
parents:
diff changeset
145
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
146 if (nm == NULL && begin != NULL) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
147 // allow nmethod to be deduced from beginning address
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
148 CodeBlob* cb = CodeCache::find_blob(begin);
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
149 nm = cb->as_nmethod_or_null();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
151 assert(nm != NULL, "must be able to deduce nmethod from other arguments");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
152
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
153 _code = nm;
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
154 _current = nm->relocation_begin() - 1;
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
155 _end = nm->relocation_end();
1762
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
156 _addr = nm->content_begin();
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
157
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
158 // Initialize code sections.
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
159 _section_start[CodeBuffer::SECT_CONSTS] = nm->consts_begin();
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
160 _section_start[CodeBuffer::SECT_INSTS ] = nm->insts_begin() ;
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
161 _section_start[CodeBuffer::SECT_STUBS ] = nm->stub_begin() ;
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
162
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
163 _section_end [CodeBuffer::SECT_CONSTS] = nm->consts_end() ;
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
164 _section_end [CodeBuffer::SECT_INSTS ] = nm->insts_end() ;
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
165 _section_end [CodeBuffer::SECT_STUBS ] = nm->stub_end() ;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 assert(!has_current(), "just checking");
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1579
diff changeset
168 assert(begin == NULL || begin >= nm->code_begin(), "in bounds");
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1579
diff changeset
169 assert(limit == NULL || limit <= nm->code_end(), "in bounds");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
170 set_limits(begin, limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
171 }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 RelocIterator::RelocIterator(CodeSection* cs, address begin, address limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 initialize_misc();
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 _current = cs->locs_start()-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
178 _end = cs->locs_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
179 _addr = cs->start();
a61af66fc99e Initial load
duke
parents:
diff changeset
180 _code = NULL; // Not cb->blob();
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 CodeBuffer* cb = cs->outer();
1762
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
183 assert((int) SECT_LIMIT == CodeBuffer::SECT_LIMIT, "my copy must be equal");
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
184 for (int n = (int) CodeBuffer::SECT_FIRST; n < (int) CodeBuffer::SECT_LIMIT; n++) {
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
185 CodeSection* cs = cb->code_section(n);
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
186 _section_start[n] = cs->start();
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
187 _section_end [n] = cs->end();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 assert(!has_current(), "just checking");
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 assert(begin == NULL || begin >= cs->start(), "in bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
193 assert(limit == NULL || limit <= cs->end(), "in bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
194 set_limits(begin, limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 enum { indexCardSize = 128 };
a61af66fc99e Initial load
duke
parents:
diff changeset
199 struct RelocIndexEntry {
a61af66fc99e Initial load
duke
parents:
diff changeset
200 jint addr_offset; // offset from header_end of an addr()
a61af66fc99e Initial load
duke
parents:
diff changeset
201 jint reloc_offset; // offset from header_end of a relocInfo (prefix)
a61af66fc99e Initial load
duke
parents:
diff changeset
202 };
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204
1762
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
205 bool RelocIterator::addr_in_const() const {
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
206 const int n = CodeBuffer::SECT_CONSTS;
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
207 return section_start(n) <= addr() && addr() < section_end(n);
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
208 }
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
209
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
210
0
a61af66fc99e Initial load
duke
parents:
diff changeset
211 static inline int num_cards(int code_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
212 return (code_size-1) / indexCardSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 int RelocIterator::locs_and_index_size(int code_size, int locs_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
217 if (!UseRelocIndex) return locs_size; // no index
a61af66fc99e Initial load
duke
parents:
diff changeset
218 code_size = round_to(code_size, oopSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 locs_size = round_to(locs_size, oopSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
220 int index_size = num_cards(code_size) * sizeof(RelocIndexEntry);
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // format of indexed relocs:
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // relocation_begin: relocInfo ...
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // index: (addr,reloc#) ...
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // indexSize :relocation_end
a61af66fc99e Initial load
duke
parents:
diff changeset
225 return locs_size + index_size + BytesPerInt;
a61af66fc99e Initial load
duke
parents:
diff changeset
226 }
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 void RelocIterator::create_index(relocInfo* dest_begin, int dest_count, relocInfo* dest_end) {
a61af66fc99e Initial load
duke
parents:
diff changeset
230 address relocation_begin = (address)dest_begin;
a61af66fc99e Initial load
duke
parents:
diff changeset
231 address relocation_end = (address)dest_end;
a61af66fc99e Initial load
duke
parents:
diff changeset
232 int total_size = relocation_end - relocation_begin;
a61af66fc99e Initial load
duke
parents:
diff changeset
233 int locs_size = dest_count * sizeof(relocInfo);
a61af66fc99e Initial load
duke
parents:
diff changeset
234 if (!UseRelocIndex) {
a61af66fc99e Initial load
duke
parents:
diff changeset
235 Copy::fill_to_bytes(relocation_begin + locs_size, total_size-locs_size, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
236 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
237 }
a61af66fc99e Initial load
duke
parents:
diff changeset
238 int index_size = total_size - locs_size - BytesPerInt; // find out how much space is left
a61af66fc99e Initial load
duke
parents:
diff changeset
239 int ncards = index_size / sizeof(RelocIndexEntry);
a61af66fc99e Initial load
duke
parents:
diff changeset
240 assert(total_size == locs_size + index_size + BytesPerInt, "checkin'");
a61af66fc99e Initial load
duke
parents:
diff changeset
241 assert(index_size >= 0 && index_size % sizeof(RelocIndexEntry) == 0, "checkin'");
a61af66fc99e Initial load
duke
parents:
diff changeset
242 jint* index_size_addr = (jint*)relocation_end - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 assert(sizeof(jint) == BytesPerInt, "change this code");
a61af66fc99e Initial load
duke
parents:
diff changeset
245
a61af66fc99e Initial load
duke
parents:
diff changeset
246 *index_size_addr = index_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
247 if (index_size != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
248 assert(index_size > 0, "checkin'");
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 RelocIndexEntry* index = (RelocIndexEntry *)(relocation_begin + locs_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
251 assert(index == (RelocIndexEntry*)index_size_addr - ncards, "checkin'");
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 // walk over the relocations, and fill in index entries as we go
a61af66fc99e Initial load
duke
parents:
diff changeset
254 RelocIterator iter;
a61af66fc99e Initial load
duke
parents:
diff changeset
255 const address initial_addr = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
256 relocInfo* const initial_current = dest_begin - 1; // biased by -1 like elsewhere
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 iter._code = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
259 iter._addr = initial_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
260 iter._limit = (address)(intptr_t)(ncards * indexCardSize);
a61af66fc99e Initial load
duke
parents:
diff changeset
261 iter._current = initial_current;
a61af66fc99e Initial load
duke
parents:
diff changeset
262 iter._end = dest_begin + dest_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 int i = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
265 address next_card_addr = (address)indexCardSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
266 int addr_offset = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
267 int reloc_offset = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
268 while (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
269 // Checkpoint the iterator before advancing it.
a61af66fc99e Initial load
duke
parents:
diff changeset
270 addr_offset = iter._addr - initial_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
271 reloc_offset = iter._current - initial_current;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 if (!iter.next()) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
273 while (iter.addr() >= next_card_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 index[i].addr_offset = addr_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 index[i].reloc_offset = reloc_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 i++;
a61af66fc99e Initial load
duke
parents:
diff changeset
277 next_card_addr += indexCardSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
278 }
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 while (i < ncards) {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 index[i].addr_offset = addr_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
282 index[i].reloc_offset = reloc_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
283 i++;
a61af66fc99e Initial load
duke
parents:
diff changeset
284 }
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
a61af66fc99e Initial load
duke
parents:
diff changeset
289 void RelocIterator::set_limits(address begin, address limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 int index_size = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 if (UseRelocIndex && _code != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
292 index_size = ((jint*)_end)[-1];
a61af66fc99e Initial load
duke
parents:
diff changeset
293 _end = (relocInfo*)( (address)_end - index_size - BytesPerInt );
a61af66fc99e Initial load
duke
parents:
diff changeset
294 }
a61af66fc99e Initial load
duke
parents:
diff changeset
295
a61af66fc99e Initial load
duke
parents:
diff changeset
296 _limit = limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // the limit affects this next stuff:
a61af66fc99e Initial load
duke
parents:
diff changeset
299 if (begin != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
300 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // In ASSERT mode we do not actually use the index, but simply
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // check that its contents would have led us to the right answer.
a61af66fc99e Initial load
duke
parents:
diff changeset
303 address addrCheck = _addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
304 relocInfo* infoCheck = _current;
a61af66fc99e Initial load
duke
parents:
diff changeset
305 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
306 if (index_size > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // skip ahead
a61af66fc99e Initial load
duke
parents:
diff changeset
308 RelocIndexEntry* index = (RelocIndexEntry*)_end;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 RelocIndexEntry* index_limit = (RelocIndexEntry*)((address)index + index_size);
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1579
diff changeset
310 assert(_addr == _code->code_begin(), "_addr must be unadjusted");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
311 int card = (begin - _addr) / indexCardSize;
a61af66fc99e Initial load
duke
parents:
diff changeset
312 if (card > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
313 if (index+card-1 < index_limit) index += card-1;
a61af66fc99e Initial load
duke
parents:
diff changeset
314 else index = index_limit - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
315 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
316 addrCheck = _addr + index->addr_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
317 infoCheck = _current + index->reloc_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
318 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // Advance the iterator immediately to the last valid state
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // for the previous card. Calling "next" will then advance
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // it to the first item on the required card.
a61af66fc99e Initial load
duke
parents:
diff changeset
322 _addr += index->addr_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
323 _current += index->reloc_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
324 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
325 }
a61af66fc99e Initial load
duke
parents:
diff changeset
326 }
a61af66fc99e Initial load
duke
parents:
diff changeset
327
a61af66fc99e Initial load
duke
parents:
diff changeset
328 relocInfo* backup;
a61af66fc99e Initial load
duke
parents:
diff changeset
329 address backup_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
330 while (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
331 backup = _current;
a61af66fc99e Initial load
duke
parents:
diff changeset
332 backup_addr = _addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
333 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
334 if (backup == infoCheck) {
a61af66fc99e Initial load
duke
parents:
diff changeset
335 assert(backup_addr == addrCheck, "must match"); addrCheck = NULL; infoCheck = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
336 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
337 assert(addrCheck == NULL || backup_addr <= addrCheck, "must not pass addrCheck");
a61af66fc99e Initial load
duke
parents:
diff changeset
338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
339 #endif // ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
340 if (!next() || addr() >= begin) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
341 }
a61af66fc99e Initial load
duke
parents:
diff changeset
342 assert(addrCheck == NULL || addrCheck == backup_addr, "must have matched addrCheck");
a61af66fc99e Initial load
duke
parents:
diff changeset
343 assert(infoCheck == NULL || infoCheck == backup, "must have matched infoCheck");
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // At this point, either we are at the first matching record,
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // or else there is no such record, and !has_current().
a61af66fc99e Initial load
duke
parents:
diff changeset
346 // In either case, revert to the immediatly preceding state.
a61af66fc99e Initial load
duke
parents:
diff changeset
347 _current = backup;
a61af66fc99e Initial load
duke
parents:
diff changeset
348 _addr = backup_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
349 set_has_current(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
350 }
a61af66fc99e Initial load
duke
parents:
diff changeset
351 }
a61af66fc99e Initial load
duke
parents:
diff changeset
352
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 void RelocIterator::set_limit(address limit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
355 address code_end = (address)code() + code()->size();
a61af66fc99e Initial load
duke
parents:
diff changeset
356 assert(limit == NULL || limit <= code_end, "in bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
357 _limit = limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
358 }
a61af66fc99e Initial load
duke
parents:
diff changeset
359
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 void PatchingRelocIterator:: prepass() {
a61af66fc99e Initial load
duke
parents:
diff changeset
362 // turn breakpoints off during patching
a61af66fc99e Initial load
duke
parents:
diff changeset
363 _init_state = (*this); // save cursor
a61af66fc99e Initial load
duke
parents:
diff changeset
364 while (next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
365 if (type() == relocInfo::breakpoint_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
366 breakpoint_reloc()->set_active(false);
a61af66fc99e Initial load
duke
parents:
diff changeset
367 }
a61af66fc99e Initial load
duke
parents:
diff changeset
368 }
a61af66fc99e Initial load
duke
parents:
diff changeset
369 (RelocIterator&)(*this) = _init_state; // reset cursor for client
a61af66fc99e Initial load
duke
parents:
diff changeset
370 }
a61af66fc99e Initial load
duke
parents:
diff changeset
371
a61af66fc99e Initial load
duke
parents:
diff changeset
372
a61af66fc99e Initial load
duke
parents:
diff changeset
373 void PatchingRelocIterator:: postpass() {
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // turn breakpoints back on after patching
a61af66fc99e Initial load
duke
parents:
diff changeset
375 (RelocIterator&)(*this) = _init_state; // reset cursor again
a61af66fc99e Initial load
duke
parents:
diff changeset
376 while (next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
377 if (type() == relocInfo::breakpoint_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
378 breakpoint_Relocation* bpt = breakpoint_reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
379 bpt->set_active(bpt->enabled());
a61af66fc99e Initial load
duke
parents:
diff changeset
380 }
a61af66fc99e Initial load
duke
parents:
diff changeset
381 }
a61af66fc99e Initial load
duke
parents:
diff changeset
382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // All the strange bit-encodings are in here.
a61af66fc99e Initial load
duke
parents:
diff changeset
386 // The idea is to encode relocation data which are small integers
a61af66fc99e Initial load
duke
parents:
diff changeset
387 // very efficiently (a single extra halfword). Larger chunks of
a61af66fc99e Initial load
duke
parents:
diff changeset
388 // relocation data need a halfword header to hold their size.
a61af66fc99e Initial load
duke
parents:
diff changeset
389 void RelocIterator::advance_over_prefix() {
a61af66fc99e Initial load
duke
parents:
diff changeset
390 if (_current->is_datalen()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
391 _data = (short*) _current->data();
a61af66fc99e Initial load
duke
parents:
diff changeset
392 _datalen = _current->datalen();
a61af66fc99e Initial load
duke
parents:
diff changeset
393 _current += _datalen + 1; // skip the embedded data & header
a61af66fc99e Initial load
duke
parents:
diff changeset
394 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
395 _databuf = _current->immediate();
a61af66fc99e Initial load
duke
parents:
diff changeset
396 _data = &_databuf;
a61af66fc99e Initial load
duke
parents:
diff changeset
397 _datalen = 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
398 _current++; // skip the header
a61af66fc99e Initial load
duke
parents:
diff changeset
399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // The client will see the following relocInfo, whatever that is.
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // It is the reloc to which the preceding data applies.
a61af66fc99e Initial load
duke
parents:
diff changeset
402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404
1762
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
405 void RelocIterator::initialize_misc() {
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
406 set_has_current(false);
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
407 for (int i = (int) CodeBuffer::SECT_FIRST; i < (int) CodeBuffer::SECT_LIMIT; i++) {
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
408 _section_start[i] = NULL; // these will be lazily computed, if needed
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
409 _section_end [i] = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
411 }
a61af66fc99e Initial load
duke
parents:
diff changeset
412
a61af66fc99e Initial load
duke
parents:
diff changeset
413
a61af66fc99e Initial load
duke
parents:
diff changeset
414 Relocation* RelocIterator::reloc() {
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // (take the "switch" out-of-line)
a61af66fc99e Initial load
duke
parents:
diff changeset
416 relocInfo::relocType t = type();
a61af66fc99e Initial load
duke
parents:
diff changeset
417 if (false) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
418 #define EACH_TYPE(name) \
a61af66fc99e Initial load
duke
parents:
diff changeset
419 else if (t == relocInfo::name##_type) { \
a61af66fc99e Initial load
duke
parents:
diff changeset
420 return name##_reloc(); \
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422 APPLY_TO_RELOCATIONS(EACH_TYPE);
a61af66fc99e Initial load
duke
parents:
diff changeset
423 #undef EACH_TYPE
a61af66fc99e Initial load
duke
parents:
diff changeset
424 assert(t == relocInfo::none, "must be padding");
a61af66fc99e Initial load
duke
parents:
diff changeset
425 return new(_rh) Relocation();
a61af66fc99e Initial load
duke
parents:
diff changeset
426 }
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428
a61af66fc99e Initial load
duke
parents:
diff changeset
429 //////// Methods for flyweight Relocation types
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432 RelocationHolder RelocationHolder::plus(int offset) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
433 if (offset != 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
434 switch (type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
435 case relocInfo::none:
a61af66fc99e Initial load
duke
parents:
diff changeset
436 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
437 case relocInfo::oop_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
438 {
a61af66fc99e Initial load
duke
parents:
diff changeset
439 oop_Relocation* r = (oop_Relocation*)reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
440 return oop_Relocation::spec(r->oop_index(), r->offset() + offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
441 }
a61af66fc99e Initial load
duke
parents:
diff changeset
442 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
443 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
444 }
a61af66fc99e Initial load
duke
parents:
diff changeset
445 }
a61af66fc99e Initial load
duke
parents:
diff changeset
446 return (*this);
a61af66fc99e Initial load
duke
parents:
diff changeset
447 }
a61af66fc99e Initial load
duke
parents:
diff changeset
448
a61af66fc99e Initial load
duke
parents:
diff changeset
449
a61af66fc99e Initial load
duke
parents:
diff changeset
450 void Relocation::guarantee_size() {
a61af66fc99e Initial load
duke
parents:
diff changeset
451 guarantee(false, "Make _relocbuf bigger!");
a61af66fc99e Initial load
duke
parents:
diff changeset
452 }
a61af66fc99e Initial load
duke
parents:
diff changeset
453
a61af66fc99e Initial load
duke
parents:
diff changeset
454 // some relocations can compute their own values
a61af66fc99e Initial load
duke
parents:
diff changeset
455 address Relocation::value() {
a61af66fc99e Initial load
duke
parents:
diff changeset
456 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
457 return NULL;
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 void Relocation::set_value(address x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
462 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
463 }
a61af66fc99e Initial load
duke
parents:
diff changeset
464
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 RelocationHolder Relocation::spec_simple(relocInfo::relocType rtype) {
a61af66fc99e Initial load
duke
parents:
diff changeset
467 if (rtype == relocInfo::none) return RelocationHolder::none;
a61af66fc99e Initial load
duke
parents:
diff changeset
468 relocInfo ri = relocInfo(rtype, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
469 RelocIterator itr;
a61af66fc99e Initial load
duke
parents:
diff changeset
470 itr.set_current(ri);
a61af66fc99e Initial load
duke
parents:
diff changeset
471 itr.reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
472 return itr._rh;
a61af66fc99e Initial load
duke
parents:
diff changeset
473 }
a61af66fc99e Initial load
duke
parents:
diff changeset
474
a61af66fc99e Initial load
duke
parents:
diff changeset
475 int32_t Relocation::runtime_address_to_index(address runtime_address) {
2455
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2375
diff changeset
476 assert(!is_reloc_index((intptr_t)runtime_address), "must not look like an index");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478 if (runtime_address == NULL) return 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
479
a61af66fc99e Initial load
duke
parents:
diff changeset
480 StubCodeDesc* p = StubCodeDesc::desc_for(runtime_address);
a61af66fc99e Initial load
duke
parents:
diff changeset
481 if (p != NULL && p->begin() == runtime_address) {
2455
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2375
diff changeset
482 assert(is_reloc_index(p->index()), "there must not be too many stubs");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
483 return (int32_t)p->index();
a61af66fc99e Initial load
duke
parents:
diff changeset
484 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // Known "miscellaneous" non-stub pointers:
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // os::get_polling_page(), SafepointSynchronize::address_of_state()
a61af66fc99e Initial load
duke
parents:
diff changeset
487 if (PrintRelocations) {
a61af66fc99e Initial load
duke
parents:
diff changeset
488 tty->print_cr("random unregistered address in relocInfo: " INTPTR_FORMAT, runtime_address);
a61af66fc99e Initial load
duke
parents:
diff changeset
489 }
a61af66fc99e Initial load
duke
parents:
diff changeset
490 #ifndef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
491 return (int32_t) (intptr_t)runtime_address;
a61af66fc99e Initial load
duke
parents:
diff changeset
492 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
493 // didn't fit return non-index
a61af66fc99e Initial load
duke
parents:
diff changeset
494 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
495 #endif /* _LP64 */
a61af66fc99e Initial load
duke
parents:
diff changeset
496 }
a61af66fc99e Initial load
duke
parents:
diff changeset
497 }
a61af66fc99e Initial load
duke
parents:
diff changeset
498
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 address Relocation::index_to_runtime_address(int32_t index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
501 if (index == 0) return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
502
2455
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2375
diff changeset
503 if (is_reloc_index(index)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
504 StubCodeDesc* p = StubCodeDesc::desc_for_index(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
505 assert(p != NULL, "there must be a stub for this index");
a61af66fc99e Initial load
duke
parents:
diff changeset
506 return p->begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
507 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
508 #ifndef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // this only works on 32bit machines
a61af66fc99e Initial load
duke
parents:
diff changeset
510 return (address) ((intptr_t) index);
a61af66fc99e Initial load
duke
parents:
diff changeset
511 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
512 fatal("Relocation::index_to_runtime_address, int32_t not pointer sized");
a61af66fc99e Initial load
duke
parents:
diff changeset
513 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
514 #endif /* _LP64 */
a61af66fc99e Initial load
duke
parents:
diff changeset
515 }
a61af66fc99e Initial load
duke
parents:
diff changeset
516 }
a61af66fc99e Initial load
duke
parents:
diff changeset
517
a61af66fc99e Initial load
duke
parents:
diff changeset
518 address Relocation::old_addr_for(address newa,
a61af66fc99e Initial load
duke
parents:
diff changeset
519 const CodeBuffer* src, CodeBuffer* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
520 int sect = dest->section_index_of(newa);
a61af66fc99e Initial load
duke
parents:
diff changeset
521 guarantee(sect != CodeBuffer::SECT_NONE, "lost track of this address");
a61af66fc99e Initial load
duke
parents:
diff changeset
522 address ostart = src->code_section(sect)->start();
a61af66fc99e Initial load
duke
parents:
diff changeset
523 address nstart = dest->code_section(sect)->start();
a61af66fc99e Initial load
duke
parents:
diff changeset
524 return ostart + (newa - nstart);
a61af66fc99e Initial load
duke
parents:
diff changeset
525 }
a61af66fc99e Initial load
duke
parents:
diff changeset
526
a61af66fc99e Initial load
duke
parents:
diff changeset
527 address Relocation::new_addr_for(address olda,
a61af66fc99e Initial load
duke
parents:
diff changeset
528 const CodeBuffer* src, CodeBuffer* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
529 debug_only(const CodeBuffer* src0 = src);
a61af66fc99e Initial load
duke
parents:
diff changeset
530 int sect = CodeBuffer::SECT_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
531 // Look for olda in the source buffer, and all previous incarnations
a61af66fc99e Initial load
duke
parents:
diff changeset
532 // if the source buffer has been expanded.
a61af66fc99e Initial load
duke
parents:
diff changeset
533 for (; src != NULL; src = src->before_expand()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
534 sect = src->section_index_of(olda);
a61af66fc99e Initial load
duke
parents:
diff changeset
535 if (sect != CodeBuffer::SECT_NONE) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
536 }
a61af66fc99e Initial load
duke
parents:
diff changeset
537 guarantee(sect != CodeBuffer::SECT_NONE, "lost track of this address");
a61af66fc99e Initial load
duke
parents:
diff changeset
538 address ostart = src->code_section(sect)->start();
a61af66fc99e Initial load
duke
parents:
diff changeset
539 address nstart = dest->code_section(sect)->start();
a61af66fc99e Initial load
duke
parents:
diff changeset
540 return nstart + (olda - ostart);
a61af66fc99e Initial load
duke
parents:
diff changeset
541 }
a61af66fc99e Initial load
duke
parents:
diff changeset
542
a61af66fc99e Initial load
duke
parents:
diff changeset
543 void Relocation::normalize_address(address& addr, const CodeSection* dest, bool allow_other_sections) {
a61af66fc99e Initial load
duke
parents:
diff changeset
544 address addr0 = addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
545 if (addr0 == NULL || dest->allocates2(addr0)) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
546 CodeBuffer* cb = dest->outer();
a61af66fc99e Initial load
duke
parents:
diff changeset
547 addr = new_addr_for(addr0, cb, cb);
a61af66fc99e Initial load
duke
parents:
diff changeset
548 assert(allow_other_sections || dest->contains2(addr),
a61af66fc99e Initial load
duke
parents:
diff changeset
549 "addr must be in required section");
a61af66fc99e Initial load
duke
parents:
diff changeset
550 }
a61af66fc99e Initial load
duke
parents:
diff changeset
551
a61af66fc99e Initial load
duke
parents:
diff changeset
552
a61af66fc99e Initial load
duke
parents:
diff changeset
553 void CallRelocation::set_destination(address x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
554 pd_set_call_destination(x);
a61af66fc99e Initial load
duke
parents:
diff changeset
555 }
a61af66fc99e Initial load
duke
parents:
diff changeset
556
a61af66fc99e Initial load
duke
parents:
diff changeset
557 void CallRelocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
558 // Usually a self-relative reference to an external routine.
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // On some platforms, the reference is absolute (not self-relative).
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // The enhanced use of pd_call_destination sorts this all out.
a61af66fc99e Initial load
duke
parents:
diff changeset
561 address orig_addr = old_addr_for(addr(), src, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
562 address callee = pd_call_destination(orig_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
563 // Reassert the callee address, this time in the new copy of the code.
a61af66fc99e Initial load
duke
parents:
diff changeset
564 pd_set_call_destination(callee);
a61af66fc99e Initial load
duke
parents:
diff changeset
565 }
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567
a61af66fc99e Initial load
duke
parents:
diff changeset
568 //// pack/unpack methods
a61af66fc99e Initial load
duke
parents:
diff changeset
569
a61af66fc99e Initial load
duke
parents:
diff changeset
570 void oop_Relocation::pack_data_to(CodeSection* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
571 short* p = (short*) dest->locs_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
572 p = pack_2_ints_to(p, _oop_index, _offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
573 dest->set_locs_end((relocInfo*) p);
a61af66fc99e Initial load
duke
parents:
diff changeset
574 }
a61af66fc99e Initial load
duke
parents:
diff changeset
575
a61af66fc99e Initial load
duke
parents:
diff changeset
576
a61af66fc99e Initial load
duke
parents:
diff changeset
577 void oop_Relocation::unpack_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
578 unpack_2_ints(_oop_index, _offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
579 }
a61af66fc99e Initial load
duke
parents:
diff changeset
580
a61af66fc99e Initial load
duke
parents:
diff changeset
581
a61af66fc99e Initial load
duke
parents:
diff changeset
582 void virtual_call_Relocation::pack_data_to(CodeSection* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
583 short* p = (short*) dest->locs_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
584 address point = dest->locs_point();
a61af66fc99e Initial load
duke
parents:
diff changeset
585
a61af66fc99e Initial load
duke
parents:
diff changeset
586 // Try to make a pointer NULL first.
a61af66fc99e Initial load
duke
parents:
diff changeset
587 if (_oop_limit >= point &&
a61af66fc99e Initial load
duke
parents:
diff changeset
588 _oop_limit <= point + NativeCall::instruction_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
589 _oop_limit = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
590 }
a61af66fc99e Initial load
duke
parents:
diff changeset
591 // If the _oop_limit is NULL, it "defaults" to the end of the call.
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // See ic_call_Relocation::oop_limit() below.
a61af66fc99e Initial load
duke
parents:
diff changeset
593
a61af66fc99e Initial load
duke
parents:
diff changeset
594 normalize_address(_first_oop, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
595 normalize_address(_oop_limit, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
596 jint x0 = scaled_offset_null_special(_first_oop, point);
a61af66fc99e Initial load
duke
parents:
diff changeset
597 jint x1 = scaled_offset_null_special(_oop_limit, point);
a61af66fc99e Initial load
duke
parents:
diff changeset
598 p = pack_2_ints_to(p, x0, x1);
a61af66fc99e Initial load
duke
parents:
diff changeset
599 dest->set_locs_end((relocInfo*) p);
a61af66fc99e Initial load
duke
parents:
diff changeset
600 }
a61af66fc99e Initial load
duke
parents:
diff changeset
601
a61af66fc99e Initial load
duke
parents:
diff changeset
602
a61af66fc99e Initial load
duke
parents:
diff changeset
603 void virtual_call_Relocation::unpack_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
604 jint x0, x1; unpack_2_ints(x0, x1);
a61af66fc99e Initial load
duke
parents:
diff changeset
605 address point = addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
606 _first_oop = x0==0? NULL: address_from_scaled_offset(x0, point);
a61af66fc99e Initial load
duke
parents:
diff changeset
607 _oop_limit = x1==0? NULL: address_from_scaled_offset(x1, point);
a61af66fc99e Initial load
duke
parents:
diff changeset
608 }
a61af66fc99e Initial load
duke
parents:
diff changeset
609
a61af66fc99e Initial load
duke
parents:
diff changeset
610
a61af66fc99e Initial load
duke
parents:
diff changeset
611 void static_stub_Relocation::pack_data_to(CodeSection* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
612 short* p = (short*) dest->locs_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
613 CodeSection* insts = dest->outer()->insts();
a61af66fc99e Initial load
duke
parents:
diff changeset
614 normalize_address(_static_call, insts);
a61af66fc99e Initial load
duke
parents:
diff changeset
615 p = pack_1_int_to(p, scaled_offset(_static_call, insts->start()));
a61af66fc99e Initial load
duke
parents:
diff changeset
616 dest->set_locs_end((relocInfo*) p);
a61af66fc99e Initial load
duke
parents:
diff changeset
617 }
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 void static_stub_Relocation::unpack_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
620 address base = binding()->section_start(CodeBuffer::SECT_INSTS);
a61af66fc99e Initial load
duke
parents:
diff changeset
621 _static_call = address_from_scaled_offset(unpack_1_int(), base);
a61af66fc99e Initial load
duke
parents:
diff changeset
622 }
a61af66fc99e Initial load
duke
parents:
diff changeset
623
a61af66fc99e Initial load
duke
parents:
diff changeset
624
a61af66fc99e Initial load
duke
parents:
diff changeset
625 void external_word_Relocation::pack_data_to(CodeSection* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
626 short* p = (short*) dest->locs_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
627 int32_t index = runtime_address_to_index(_target);
a61af66fc99e Initial load
duke
parents:
diff changeset
628 #ifndef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
629 p = pack_1_int_to(p, index);
a61af66fc99e Initial load
duke
parents:
diff changeset
630 #else
2455
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2375
diff changeset
631 if (is_reloc_index(index)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
632 p = pack_2_ints_to(p, index, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
633 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
634 jlong t = (jlong) _target;
a61af66fc99e Initial load
duke
parents:
diff changeset
635 int32_t lo = low(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
636 int32_t hi = high(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
637 p = pack_2_ints_to(p, lo, hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
638 DEBUG_ONLY(jlong t1 = jlong_from(hi, lo));
2455
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2375
diff changeset
639 assert(!is_reloc_index(t1) && (address) t1 == _target, "not symmetric");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
640 }
a61af66fc99e Initial load
duke
parents:
diff changeset
641 #endif /* _LP64 */
a61af66fc99e Initial load
duke
parents:
diff changeset
642 dest->set_locs_end((relocInfo*) p);
a61af66fc99e Initial load
duke
parents:
diff changeset
643 }
a61af66fc99e Initial load
duke
parents:
diff changeset
644
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 void external_word_Relocation::unpack_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
647 #ifndef _LP64
a61af66fc99e Initial load
duke
parents:
diff changeset
648 _target = index_to_runtime_address(unpack_1_int());
a61af66fc99e Initial load
duke
parents:
diff changeset
649 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
650 int32_t lo, hi;
a61af66fc99e Initial load
duke
parents:
diff changeset
651 unpack_2_ints(lo, hi);
a61af66fc99e Initial load
duke
parents:
diff changeset
652 jlong t = jlong_from(hi, lo);;
2455
479b4b4b6950 6777083: assert(target != __null,"must not be null")
never
parents: 2375
diff changeset
653 if (is_reloc_index(t)) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
654 _target = index_to_runtime_address(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
655 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
656 _target = (address) t;
a61af66fc99e Initial load
duke
parents:
diff changeset
657 }
a61af66fc99e Initial load
duke
parents:
diff changeset
658 #endif /* _LP64 */
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 internal_word_Relocation::pack_data_to(CodeSection* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
663 short* p = (short*) dest->locs_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
664 normalize_address(_target, dest, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
665
a61af66fc99e Initial load
duke
parents:
diff changeset
666 // Check whether my target address is valid within this section.
a61af66fc99e Initial load
duke
parents:
diff changeset
667 // If not, strengthen the relocation type to point to another section.
a61af66fc99e Initial load
duke
parents:
diff changeset
668 int sindex = _section;
a61af66fc99e Initial load
duke
parents:
diff changeset
669 if (sindex == CodeBuffer::SECT_NONE && _target != NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
670 && (!dest->allocates(_target) || _target == dest->locs_point())) {
a61af66fc99e Initial load
duke
parents:
diff changeset
671 sindex = dest->outer()->section_index_of(_target);
a61af66fc99e Initial load
duke
parents:
diff changeset
672 guarantee(sindex != CodeBuffer::SECT_NONE, "must belong somewhere");
a61af66fc99e Initial load
duke
parents:
diff changeset
673 relocInfo* base = dest->locs_end() - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
674 assert(base->type() == this->type(), "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
675 // Change the written type, to be section_word_type instead.
a61af66fc99e Initial load
duke
parents:
diff changeset
676 base->set_type(relocInfo::section_word_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
677 }
a61af66fc99e Initial load
duke
parents:
diff changeset
678
a61af66fc99e Initial load
duke
parents:
diff changeset
679 // Note: An internal_word relocation cannot refer to its own instruction,
a61af66fc99e Initial load
duke
parents:
diff changeset
680 // because we reserve "0" to mean that the pointer itself is embedded
a61af66fc99e Initial load
duke
parents:
diff changeset
681 // in the code stream. We use a section_word relocation for such cases.
a61af66fc99e Initial load
duke
parents:
diff changeset
682
a61af66fc99e Initial load
duke
parents:
diff changeset
683 if (sindex == CodeBuffer::SECT_NONE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
684 assert(type() == relocInfo::internal_word_type, "must be base class");
a61af66fc99e Initial load
duke
parents:
diff changeset
685 guarantee(_target == NULL || dest->allocates2(_target), "must be within the given code section");
a61af66fc99e Initial load
duke
parents:
diff changeset
686 jint x0 = scaled_offset_null_special(_target, dest->locs_point());
a61af66fc99e Initial load
duke
parents:
diff changeset
687 assert(!(x0 == 0 && _target != NULL), "correct encoding of null target");
a61af66fc99e Initial load
duke
parents:
diff changeset
688 p = pack_1_int_to(p, x0);
a61af66fc99e Initial load
duke
parents:
diff changeset
689 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
690 assert(_target != NULL, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
691 CodeSection* sect = dest->outer()->code_section(sindex);
a61af66fc99e Initial load
duke
parents:
diff changeset
692 guarantee(sect->allocates2(_target), "must be in correct section");
a61af66fc99e Initial load
duke
parents:
diff changeset
693 address base = sect->start();
a61af66fc99e Initial load
duke
parents:
diff changeset
694 jint offset = scaled_offset(_target, base);
a61af66fc99e Initial load
duke
parents:
diff changeset
695 assert((uint)sindex < (uint)CodeBuffer::SECT_LIMIT, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
696 assert(CodeBuffer::SECT_LIMIT <= (1 << section_width), "section_width++");
a61af66fc99e Initial load
duke
parents:
diff changeset
697 p = pack_1_int_to(p, (offset << section_width) | sindex);
a61af66fc99e Initial load
duke
parents:
diff changeset
698 }
a61af66fc99e Initial load
duke
parents:
diff changeset
699
a61af66fc99e Initial load
duke
parents:
diff changeset
700 dest->set_locs_end((relocInfo*) p);
a61af66fc99e Initial load
duke
parents:
diff changeset
701 }
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703
a61af66fc99e Initial load
duke
parents:
diff changeset
704 void internal_word_Relocation::unpack_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
705 jint x0 = unpack_1_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
706 _target = x0==0? NULL: address_from_scaled_offset(x0, addr());
a61af66fc99e Initial load
duke
parents:
diff changeset
707 _section = CodeBuffer::SECT_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
708 }
a61af66fc99e Initial load
duke
parents:
diff changeset
709
a61af66fc99e Initial load
duke
parents:
diff changeset
710
a61af66fc99e Initial load
duke
parents:
diff changeset
711 void section_word_Relocation::unpack_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
712 jint x = unpack_1_int();
a61af66fc99e Initial load
duke
parents:
diff changeset
713 jint offset = (x >> section_width);
a61af66fc99e Initial load
duke
parents:
diff changeset
714 int sindex = (x & ((1<<section_width)-1));
a61af66fc99e Initial load
duke
parents:
diff changeset
715 address base = binding()->section_start(sindex);
a61af66fc99e Initial load
duke
parents:
diff changeset
716
a61af66fc99e Initial load
duke
parents:
diff changeset
717 _section = sindex;
a61af66fc99e Initial load
duke
parents:
diff changeset
718 _target = address_from_scaled_offset(offset, base);
a61af66fc99e Initial load
duke
parents:
diff changeset
719 }
a61af66fc99e Initial load
duke
parents:
diff changeset
720
a61af66fc99e Initial load
duke
parents:
diff changeset
721
a61af66fc99e Initial load
duke
parents:
diff changeset
722 void breakpoint_Relocation::pack_data_to(CodeSection* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
723 short* p = (short*) dest->locs_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
724 address point = dest->locs_point();
a61af66fc99e Initial load
duke
parents:
diff changeset
725
a61af66fc99e Initial load
duke
parents:
diff changeset
726 *p++ = _bits;
a61af66fc99e Initial load
duke
parents:
diff changeset
727
a61af66fc99e Initial load
duke
parents:
diff changeset
728 assert(_target != NULL, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
729
a61af66fc99e Initial load
duke
parents:
diff changeset
730 if (internal()) normalize_address(_target, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
731
a61af66fc99e Initial load
duke
parents:
diff changeset
732 jint target_bits =
a61af66fc99e Initial load
duke
parents:
diff changeset
733 (jint)( internal() ? scaled_offset (_target, point)
a61af66fc99e Initial load
duke
parents:
diff changeset
734 : runtime_address_to_index(_target) );
a61af66fc99e Initial load
duke
parents:
diff changeset
735 if (settable()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
736 // save space for set_target later
a61af66fc99e Initial load
duke
parents:
diff changeset
737 p = add_jint(p, target_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
738 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
739 p = add_var_int(p, target_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
740 }
a61af66fc99e Initial load
duke
parents:
diff changeset
741
a61af66fc99e Initial load
duke
parents:
diff changeset
742 for (int i = 0; i < instrlen(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
743 // put placeholder words until bytes can be saved
a61af66fc99e Initial load
duke
parents:
diff changeset
744 p = add_short(p, (short)0x7777);
a61af66fc99e Initial load
duke
parents:
diff changeset
745 }
a61af66fc99e Initial load
duke
parents:
diff changeset
746
a61af66fc99e Initial load
duke
parents:
diff changeset
747 dest->set_locs_end((relocInfo*) p);
a61af66fc99e Initial load
duke
parents:
diff changeset
748 }
a61af66fc99e Initial load
duke
parents:
diff changeset
749
a61af66fc99e Initial load
duke
parents:
diff changeset
750
a61af66fc99e Initial load
duke
parents:
diff changeset
751 void breakpoint_Relocation::unpack_data() {
a61af66fc99e Initial load
duke
parents:
diff changeset
752 _bits = live_bits();
a61af66fc99e Initial load
duke
parents:
diff changeset
753
a61af66fc99e Initial load
duke
parents:
diff changeset
754 int targetlen = datalen() - 1 - instrlen();
a61af66fc99e Initial load
duke
parents:
diff changeset
755 jint target_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
756 if (targetlen == 0) target_bits = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
757 else if (targetlen == 1) target_bits = *(data()+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
758 else if (targetlen == 2) target_bits = relocInfo::jint_from_data(data()+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
759 else { ShouldNotReachHere(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
760
a61af66fc99e Initial load
duke
parents:
diff changeset
761 _target = internal() ? address_from_scaled_offset(target_bits, addr())
a61af66fc99e Initial load
duke
parents:
diff changeset
762 : index_to_runtime_address (target_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
763 }
a61af66fc99e Initial load
duke
parents:
diff changeset
764
a61af66fc99e Initial load
duke
parents:
diff changeset
765
a61af66fc99e Initial load
duke
parents:
diff changeset
766 //// miscellaneous methods
a61af66fc99e Initial load
duke
parents:
diff changeset
767 oop* oop_Relocation::oop_addr() {
a61af66fc99e Initial load
duke
parents:
diff changeset
768 int n = _oop_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
769 if (n == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
770 // oop is stored in the code stream
a61af66fc99e Initial load
duke
parents:
diff changeset
771 return (oop*) pd_address_in_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
772 } else {
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
773 // oop is stored in table at nmethod::oops_begin
0
a61af66fc99e Initial load
duke
parents:
diff changeset
774 return code()->oop_addr_at(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
775 }
a61af66fc99e Initial load
duke
parents:
diff changeset
776 }
a61af66fc99e Initial load
duke
parents:
diff changeset
777
a61af66fc99e Initial load
duke
parents:
diff changeset
778
a61af66fc99e Initial load
duke
parents:
diff changeset
779 oop oop_Relocation::oop_value() {
a61af66fc99e Initial load
duke
parents:
diff changeset
780 oop v = *oop_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
781 // clean inline caches store a special pseudo-null
a61af66fc99e Initial load
duke
parents:
diff changeset
782 if (v == (oop)Universe::non_oop_word()) v = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
783 return v;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 }
a61af66fc99e Initial load
duke
parents:
diff changeset
785
a61af66fc99e Initial load
duke
parents:
diff changeset
786
a61af66fc99e Initial load
duke
parents:
diff changeset
787 void oop_Relocation::fix_oop_relocation() {
a61af66fc99e Initial load
duke
parents:
diff changeset
788 if (!oop_is_immediate()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
789 // get the oop from the pool, and re-insert it into the instruction:
a61af66fc99e Initial load
duke
parents:
diff changeset
790 set_value(value());
a61af66fc99e Initial load
duke
parents:
diff changeset
791 }
a61af66fc99e Initial load
duke
parents:
diff changeset
792 }
a61af66fc99e Initial load
duke
parents:
diff changeset
793
a61af66fc99e Initial load
duke
parents:
diff changeset
794
2375
d673ef06fe96 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 2192
diff changeset
795 void oop_Relocation::verify_oop_relocation() {
d673ef06fe96 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 2192
diff changeset
796 if (!oop_is_immediate()) {
d673ef06fe96 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 2192
diff changeset
797 // get the oop from the pool, and re-insert it into the instruction:
d673ef06fe96 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 2192
diff changeset
798 verify_value(value());
d673ef06fe96 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 2192
diff changeset
799 }
d673ef06fe96 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 2192
diff changeset
800 }
d673ef06fe96 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 2192
diff changeset
801
d673ef06fe96 7028374: race in fix_oop_relocations for scavengeable nmethods
never
parents: 2192
diff changeset
802
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
803 RelocIterator virtual_call_Relocation::parse_ic(nmethod* &nm, address &ic_call, address &first_oop,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
804 oop* &oop_addr, bool *is_optimized) {
a61af66fc99e Initial load
duke
parents:
diff changeset
805 assert(ic_call != NULL, "ic_call address must be set");
a61af66fc99e Initial load
duke
parents:
diff changeset
806 assert(ic_call != NULL || first_oop != NULL, "must supply a non-null input");
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
807 if (nm == NULL) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
808 CodeBlob* code;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
809 if (ic_call != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
810 code = CodeCache::find_blob(ic_call);
a61af66fc99e Initial load
duke
parents:
diff changeset
811 } else if (first_oop != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
812 code = CodeCache::find_blob(first_oop);
a61af66fc99e Initial load
duke
parents:
diff changeset
813 }
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
814 nm = code->as_nmethod_or_null();
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
815 assert(nm != NULL, "address to parse must be in nmethod");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
816 }
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
817 assert(ic_call == NULL || nm->contains(ic_call), "must be in nmethod");
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
818 assert(first_oop == NULL || nm->contains(first_oop), "must be in nmethod");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
819
a61af66fc99e Initial load
duke
parents:
diff changeset
820 address oop_limit = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
821
a61af66fc99e Initial load
duke
parents:
diff changeset
822 if (ic_call != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
823 // search for the ic_call at the given address
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
824 RelocIterator iter(nm, ic_call, ic_call+1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
825 bool ret = iter.next();
a61af66fc99e Initial load
duke
parents:
diff changeset
826 assert(ret == true, "relocInfo must exist at this address");
a61af66fc99e Initial load
duke
parents:
diff changeset
827 assert(iter.addr() == ic_call, "must find ic_call");
a61af66fc99e Initial load
duke
parents:
diff changeset
828 if (iter.type() == relocInfo::virtual_call_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
829 virtual_call_Relocation* r = iter.virtual_call_reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
830 first_oop = r->first_oop();
a61af66fc99e Initial load
duke
parents:
diff changeset
831 oop_limit = r->oop_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
832 *is_optimized = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
833 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
834 assert(iter.type() == relocInfo::opt_virtual_call_type, "must be a virtual call");
a61af66fc99e Initial load
duke
parents:
diff changeset
835 *is_optimized = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
836 oop_addr = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
837 first_oop = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
838 return iter;
a61af66fc99e Initial load
duke
parents:
diff changeset
839 }
a61af66fc99e Initial load
duke
parents:
diff changeset
840 }
a61af66fc99e Initial load
duke
parents:
diff changeset
841
a61af66fc99e Initial load
duke
parents:
diff changeset
842 // search for the first_oop, to get its oop_addr
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
843 RelocIterator all_oops(nm, first_oop);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
844 RelocIterator iter = all_oops;
a61af66fc99e Initial load
duke
parents:
diff changeset
845 iter.set_limit(first_oop+1);
a61af66fc99e Initial load
duke
parents:
diff changeset
846 bool found_oop = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
847 while (iter.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
848 if (iter.type() == relocInfo::oop_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
849 assert(iter.addr() == first_oop, "must find first_oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
850 oop_addr = iter.oop_reloc()->oop_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
851 found_oop = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
852 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
853 }
a61af66fc99e Initial load
duke
parents:
diff changeset
854 }
a61af66fc99e Initial load
duke
parents:
diff changeset
855 assert(found_oop, "must find first_oop");
a61af66fc99e Initial load
duke
parents:
diff changeset
856
a61af66fc99e Initial load
duke
parents:
diff changeset
857 bool did_reset = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
858 while (ic_call == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
859 // search forward for the ic_call matching the given first_oop
a61af66fc99e Initial load
duke
parents:
diff changeset
860 while (iter.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
861 if (iter.type() == relocInfo::virtual_call_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
862 virtual_call_Relocation* r = iter.virtual_call_reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
863 if (r->first_oop() == first_oop) {
a61af66fc99e Initial load
duke
parents:
diff changeset
864 ic_call = r->addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
865 oop_limit = r->oop_limit();
a61af66fc99e Initial load
duke
parents:
diff changeset
866 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
867 }
a61af66fc99e Initial load
duke
parents:
diff changeset
868 }
a61af66fc99e Initial load
duke
parents:
diff changeset
869 }
a61af66fc99e Initial load
duke
parents:
diff changeset
870 guarantee(!did_reset, "cannot find ic_call");
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
871 iter = RelocIterator(nm); // search the whole nmethod
0
a61af66fc99e Initial load
duke
parents:
diff changeset
872 did_reset = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
873 }
a61af66fc99e Initial load
duke
parents:
diff changeset
874
a61af66fc99e Initial load
duke
parents:
diff changeset
875 assert(oop_limit != NULL && first_oop != NULL && ic_call != NULL, "");
a61af66fc99e Initial load
duke
parents:
diff changeset
876 all_oops.set_limit(oop_limit);
a61af66fc99e Initial load
duke
parents:
diff changeset
877 return all_oops;
a61af66fc99e Initial load
duke
parents:
diff changeset
878 }
a61af66fc99e Initial load
duke
parents:
diff changeset
879
a61af66fc99e Initial load
duke
parents:
diff changeset
880
a61af66fc99e Initial load
duke
parents:
diff changeset
881 address virtual_call_Relocation::first_oop() {
a61af66fc99e Initial load
duke
parents:
diff changeset
882 assert(_first_oop != NULL && _first_oop < addr(), "must precede ic_call");
a61af66fc99e Initial load
duke
parents:
diff changeset
883 return _first_oop;
a61af66fc99e Initial load
duke
parents:
diff changeset
884 }
a61af66fc99e Initial load
duke
parents:
diff changeset
885
a61af66fc99e Initial load
duke
parents:
diff changeset
886
a61af66fc99e Initial load
duke
parents:
diff changeset
887 address virtual_call_Relocation::oop_limit() {
a61af66fc99e Initial load
duke
parents:
diff changeset
888 if (_oop_limit == NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
889 return addr() + NativeCall::instruction_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
890 else
a61af66fc99e Initial load
duke
parents:
diff changeset
891 return _oop_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
892 }
a61af66fc99e Initial load
duke
parents:
diff changeset
893
a61af66fc99e Initial load
duke
parents:
diff changeset
894
a61af66fc99e Initial load
duke
parents:
diff changeset
895
a61af66fc99e Initial load
duke
parents:
diff changeset
896 void virtual_call_Relocation::clear_inline_cache() {
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // No stubs for ICs
a61af66fc99e Initial load
duke
parents:
diff changeset
898 // Clean IC
a61af66fc99e Initial load
duke
parents:
diff changeset
899 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
900 CompiledIC* icache = CompiledIC_at(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
901 icache->set_to_clean();
a61af66fc99e Initial load
duke
parents:
diff changeset
902 }
a61af66fc99e Initial load
duke
parents:
diff changeset
903
a61af66fc99e Initial load
duke
parents:
diff changeset
904
a61af66fc99e Initial load
duke
parents:
diff changeset
905 void opt_virtual_call_Relocation::clear_inline_cache() {
a61af66fc99e Initial load
duke
parents:
diff changeset
906 // No stubs for ICs
a61af66fc99e Initial load
duke
parents:
diff changeset
907 // Clean IC
a61af66fc99e Initial load
duke
parents:
diff changeset
908 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
909 CompiledIC* icache = CompiledIC_at(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
910 icache->set_to_clean();
a61af66fc99e Initial load
duke
parents:
diff changeset
911 }
a61af66fc99e Initial load
duke
parents:
diff changeset
912
a61af66fc99e Initial load
duke
parents:
diff changeset
913
a61af66fc99e Initial load
duke
parents:
diff changeset
914 address opt_virtual_call_Relocation::static_stub() {
a61af66fc99e Initial load
duke
parents:
diff changeset
915 // search for the static stub who points back to this static call
a61af66fc99e Initial load
duke
parents:
diff changeset
916 address static_call_addr = addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
917 RelocIterator iter(code());
a61af66fc99e Initial load
duke
parents:
diff changeset
918 while (iter.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
919 if (iter.type() == relocInfo::static_stub_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
920 if (iter.static_stub_reloc()->static_call() == static_call_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
921 return iter.addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
922 }
a61af66fc99e Initial load
duke
parents:
diff changeset
923 }
a61af66fc99e Initial load
duke
parents:
diff changeset
924 }
a61af66fc99e Initial load
duke
parents:
diff changeset
925 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
926 }
a61af66fc99e Initial load
duke
parents:
diff changeset
927
a61af66fc99e Initial load
duke
parents:
diff changeset
928
a61af66fc99e Initial load
duke
parents:
diff changeset
929 void static_call_Relocation::clear_inline_cache() {
a61af66fc99e Initial load
duke
parents:
diff changeset
930 // Safe call site info
a61af66fc99e Initial load
duke
parents:
diff changeset
931 CompiledStaticCall* handler = compiledStaticCall_at(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
932 handler->set_to_clean();
a61af66fc99e Initial load
duke
parents:
diff changeset
933 }
a61af66fc99e Initial load
duke
parents:
diff changeset
934
a61af66fc99e Initial load
duke
parents:
diff changeset
935
a61af66fc99e Initial load
duke
parents:
diff changeset
936 address static_call_Relocation::static_stub() {
a61af66fc99e Initial load
duke
parents:
diff changeset
937 // search for the static stub who points back to this static call
a61af66fc99e Initial load
duke
parents:
diff changeset
938 address static_call_addr = addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
939 RelocIterator iter(code());
a61af66fc99e Initial load
duke
parents:
diff changeset
940 while (iter.next()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
941 if (iter.type() == relocInfo::static_stub_type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
942 if (iter.static_stub_reloc()->static_call() == static_call_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
943 return iter.addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
944 }
a61af66fc99e Initial load
duke
parents:
diff changeset
945 }
a61af66fc99e Initial load
duke
parents:
diff changeset
946 }
a61af66fc99e Initial load
duke
parents:
diff changeset
947 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
948 }
a61af66fc99e Initial load
duke
parents:
diff changeset
949
a61af66fc99e Initial load
duke
parents:
diff changeset
950
a61af66fc99e Initial load
duke
parents:
diff changeset
951 void static_stub_Relocation::clear_inline_cache() {
a61af66fc99e Initial load
duke
parents:
diff changeset
952 // Call stub is only used when calling the interpreted code.
a61af66fc99e Initial load
duke
parents:
diff changeset
953 // It does not really need to be cleared, except that we want to clean out the methodoop.
a61af66fc99e Initial load
duke
parents:
diff changeset
954 CompiledStaticCall::set_stub_to_clean(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
955 }
a61af66fc99e Initial load
duke
parents:
diff changeset
956
a61af66fc99e Initial load
duke
parents:
diff changeset
957
a61af66fc99e Initial load
duke
parents:
diff changeset
958 void external_word_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
959 address target = _target;
a61af66fc99e Initial load
duke
parents:
diff changeset
960 if (target == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
961 // An absolute embedded reference to an external location,
a61af66fc99e Initial load
duke
parents:
diff changeset
962 // which means there is nothing to fix here.
a61af66fc99e Initial load
duke
parents:
diff changeset
963 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
964 }
a61af66fc99e Initial load
duke
parents:
diff changeset
965 // Probably this reference is absolute, not relative, so the
a61af66fc99e Initial load
duke
parents:
diff changeset
966 // following is probably a no-op.
a61af66fc99e Initial load
duke
parents:
diff changeset
967 assert(src->section_index_of(target) == CodeBuffer::SECT_NONE, "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
968 set_value(target);
a61af66fc99e Initial load
duke
parents:
diff changeset
969 }
a61af66fc99e Initial load
duke
parents:
diff changeset
970
a61af66fc99e Initial load
duke
parents:
diff changeset
971
a61af66fc99e Initial load
duke
parents:
diff changeset
972 address external_word_Relocation::target() {
a61af66fc99e Initial load
duke
parents:
diff changeset
973 address target = _target;
a61af66fc99e Initial load
duke
parents:
diff changeset
974 if (target == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
975 target = pd_get_address_from_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
976 }
a61af66fc99e Initial load
duke
parents:
diff changeset
977 return target;
a61af66fc99e Initial load
duke
parents:
diff changeset
978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
979
a61af66fc99e Initial load
duke
parents:
diff changeset
980
a61af66fc99e Initial load
duke
parents:
diff changeset
981 void internal_word_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dest) {
a61af66fc99e Initial load
duke
parents:
diff changeset
982 address target = _target;
a61af66fc99e Initial load
duke
parents:
diff changeset
983 if (target == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
984 if (addr_in_const()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
985 target = new_addr_for(*(address*)addr(), src, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
986 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
987 target = new_addr_for(pd_get_address_from_code(), src, dest);
a61af66fc99e Initial load
duke
parents:
diff changeset
988 }
a61af66fc99e Initial load
duke
parents:
diff changeset
989 }
a61af66fc99e Initial load
duke
parents:
diff changeset
990 set_value(target);
a61af66fc99e Initial load
duke
parents:
diff changeset
991 }
a61af66fc99e Initial load
duke
parents:
diff changeset
992
a61af66fc99e Initial load
duke
parents:
diff changeset
993
a61af66fc99e Initial load
duke
parents:
diff changeset
994 address internal_word_Relocation::target() {
a61af66fc99e Initial load
duke
parents:
diff changeset
995 address target = _target;
a61af66fc99e Initial load
duke
parents:
diff changeset
996 if (target == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
997 target = pd_get_address_from_code();
a61af66fc99e Initial load
duke
parents:
diff changeset
998 }
a61af66fc99e Initial load
duke
parents:
diff changeset
999 return target;
a61af66fc99e Initial load
duke
parents:
diff changeset
1000 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1001
a61af66fc99e Initial load
duke
parents:
diff changeset
1002
a61af66fc99e Initial load
duke
parents:
diff changeset
1003 breakpoint_Relocation::breakpoint_Relocation(int kind, address target, bool internal) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1004 bool active = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1005 bool enabled = (kind == initialization);
a61af66fc99e Initial load
duke
parents:
diff changeset
1006 bool removable = (kind != safepoint);
a61af66fc99e Initial load
duke
parents:
diff changeset
1007 bool settable = (target == NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
1008
a61af66fc99e Initial load
duke
parents:
diff changeset
1009 int bits = kind;
a61af66fc99e Initial load
duke
parents:
diff changeset
1010 if (enabled) bits |= enabled_state;
a61af66fc99e Initial load
duke
parents:
diff changeset
1011 if (internal) bits |= internal_attr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1012 if (removable) bits |= removable_attr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1013 if (settable) bits |= settable_attr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1014
a61af66fc99e Initial load
duke
parents:
diff changeset
1015 _bits = bits | high_bit;
a61af66fc99e Initial load
duke
parents:
diff changeset
1016 _target = target;
a61af66fc99e Initial load
duke
parents:
diff changeset
1017
a61af66fc99e Initial load
duke
parents:
diff changeset
1018 assert(this->kind() == kind, "kind encoded");
a61af66fc99e Initial load
duke
parents:
diff changeset
1019 assert(this->enabled() == enabled, "enabled encoded");
a61af66fc99e Initial load
duke
parents:
diff changeset
1020 assert(this->active() == active, "active encoded");
a61af66fc99e Initial load
duke
parents:
diff changeset
1021 assert(this->internal() == internal, "internal encoded");
a61af66fc99e Initial load
duke
parents:
diff changeset
1022 assert(this->removable() == removable, "removable encoded");
a61af66fc99e Initial load
duke
parents:
diff changeset
1023 assert(this->settable() == settable, "settable encoded");
a61af66fc99e Initial load
duke
parents:
diff changeset
1024 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1025
a61af66fc99e Initial load
duke
parents:
diff changeset
1026
a61af66fc99e Initial load
duke
parents:
diff changeset
1027 address breakpoint_Relocation::target() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
1028 return _target;
a61af66fc99e Initial load
duke
parents:
diff changeset
1029 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1030
a61af66fc99e Initial load
duke
parents:
diff changeset
1031
a61af66fc99e Initial load
duke
parents:
diff changeset
1032 void breakpoint_Relocation::set_target(address x) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1033 assert(settable(), "must be settable");
a61af66fc99e Initial load
duke
parents:
diff changeset
1034 jint target_bits =
a61af66fc99e Initial load
duke
parents:
diff changeset
1035 (jint)(internal() ? scaled_offset (x, addr())
a61af66fc99e Initial load
duke
parents:
diff changeset
1036 : runtime_address_to_index(x));
a61af66fc99e Initial load
duke
parents:
diff changeset
1037 short* p = &live_bits() + 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1038 p = add_jint(p, target_bits);
a61af66fc99e Initial load
duke
parents:
diff changeset
1039 assert(p == instrs(), "new target must fit");
a61af66fc99e Initial load
duke
parents:
diff changeset
1040 _target = x;
a61af66fc99e Initial load
duke
parents:
diff changeset
1041 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1042
a61af66fc99e Initial load
duke
parents:
diff changeset
1043
a61af66fc99e Initial load
duke
parents:
diff changeset
1044 void breakpoint_Relocation::set_enabled(bool b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1045 if (enabled() == b) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1046
a61af66fc99e Initial load
duke
parents:
diff changeset
1047 if (b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1048 set_bits(bits() | enabled_state);
a61af66fc99e Initial load
duke
parents:
diff changeset
1049 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1050 set_active(false); // remove the actual breakpoint insn, if any
a61af66fc99e Initial load
duke
parents:
diff changeset
1051 set_bits(bits() & ~enabled_state);
a61af66fc99e Initial load
duke
parents:
diff changeset
1052 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1053 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1054
a61af66fc99e Initial load
duke
parents:
diff changeset
1055
a61af66fc99e Initial load
duke
parents:
diff changeset
1056 void breakpoint_Relocation::set_active(bool b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1057 assert(!b || enabled(), "cannot activate a disabled breakpoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
1058
a61af66fc99e Initial load
duke
parents:
diff changeset
1059 if (active() == b) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1060
a61af66fc99e Initial load
duke
parents:
diff changeset
1061 // %%% should probably seize a lock here (might not be the right lock)
a61af66fc99e Initial load
duke
parents:
diff changeset
1062 //MutexLockerEx ml_patch(Patching_lock, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1063 //if (active() == b) return; // recheck state after locking
a61af66fc99e Initial load
duke
parents:
diff changeset
1064
a61af66fc99e Initial load
duke
parents:
diff changeset
1065 if (b) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1066 set_bits(bits() | active_state);
a61af66fc99e Initial load
duke
parents:
diff changeset
1067 if (instrlen() == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1068 fatal("breakpoints in original code must be undoable");
a61af66fc99e Initial load
duke
parents:
diff changeset
1069 pd_swap_in_breakpoint (addr(), instrs(), instrlen());
a61af66fc99e Initial load
duke
parents:
diff changeset
1070 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
1071 set_bits(bits() & ~active_state);
a61af66fc99e Initial load
duke
parents:
diff changeset
1072 pd_swap_out_breakpoint(addr(), instrs(), instrlen());
a61af66fc99e Initial load
duke
parents:
diff changeset
1073 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1074 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1075
a61af66fc99e Initial load
duke
parents:
diff changeset
1076
a61af66fc99e Initial load
duke
parents:
diff changeset
1077 //---------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
1078 // Non-product code
a61af66fc99e Initial load
duke
parents:
diff changeset
1079
a61af66fc99e Initial load
duke
parents:
diff changeset
1080 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
1081
a61af66fc99e Initial load
duke
parents:
diff changeset
1082 static const char* reloc_type_string(relocInfo::relocType t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1083 switch (t) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1084 #define EACH_CASE(name) \
a61af66fc99e Initial load
duke
parents:
diff changeset
1085 case relocInfo::name##_type: \
a61af66fc99e Initial load
duke
parents:
diff changeset
1086 return #name;
a61af66fc99e Initial load
duke
parents:
diff changeset
1087
a61af66fc99e Initial load
duke
parents:
diff changeset
1088 APPLY_TO_RELOCATIONS(EACH_CASE);
a61af66fc99e Initial load
duke
parents:
diff changeset
1089 #undef EACH_CASE
a61af66fc99e Initial load
duke
parents:
diff changeset
1090
a61af66fc99e Initial load
duke
parents:
diff changeset
1091 case relocInfo::none:
a61af66fc99e Initial load
duke
parents:
diff changeset
1092 return "none";
a61af66fc99e Initial load
duke
parents:
diff changeset
1093 case relocInfo::data_prefix_tag:
a61af66fc99e Initial load
duke
parents:
diff changeset
1094 return "prefix";
a61af66fc99e Initial load
duke
parents:
diff changeset
1095 default:
a61af66fc99e Initial load
duke
parents:
diff changeset
1096 return "UNKNOWN RELOC TYPE";
a61af66fc99e Initial load
duke
parents:
diff changeset
1097 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1098 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1099
a61af66fc99e Initial load
duke
parents:
diff changeset
1100
a61af66fc99e Initial load
duke
parents:
diff changeset
1101 void RelocIterator::print_current() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1102 if (!has_current()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1103 tty->print_cr("(no relocs)");
a61af66fc99e Initial load
duke
parents:
diff changeset
1104 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
1105 }
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1106 tty->print("relocInfo@" INTPTR_FORMAT " [type=%d(%s) addr=" INTPTR_FORMAT " offset=%d",
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
1107 _current, type(), reloc_type_string((relocInfo::relocType) type()), _addr, _current->addr_offset());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1108 if (current()->format() != 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
1109 tty->print(" format=%d", current()->format());
a61af66fc99e Initial load
duke
parents:
diff changeset
1110 if (datalen() == 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1111 tty->print(" data=%d", data()[0]);
a61af66fc99e Initial load
duke
parents:
diff changeset
1112 } else if (datalen() > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1113 tty->print(" data={");
a61af66fc99e Initial load
duke
parents:
diff changeset
1114 for (int i = 0; i < datalen(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1115 tty->print("%04x", data()[i] & 0xFFFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
1116 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1117 tty->print("}");
a61af66fc99e Initial load
duke
parents:
diff changeset
1118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1119 tty->print("]");
a61af66fc99e Initial load
duke
parents:
diff changeset
1120 switch (type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1121 case relocInfo::oop_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
1122 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1123 oop_Relocation* r = oop_reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1124 oop* oop_addr = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1125 oop raw_oop = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1126 oop oop_value = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
1127 if (code() != NULL || r->oop_is_immediate()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1128 oop_addr = r->oop_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1129 raw_oop = *oop_addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
1130 oop_value = r->oop_value();
a61af66fc99e Initial load
duke
parents:
diff changeset
1131 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1132 tty->print(" | [oop_addr=" INTPTR_FORMAT " *=" INTPTR_FORMAT " offset=%d]",
a61af66fc99e Initial load
duke
parents:
diff changeset
1133 oop_addr, (address)raw_oop, r->offset());
a61af66fc99e Initial load
duke
parents:
diff changeset
1134 // Do not print the oop by default--we want this routine to
a61af66fc99e Initial load
duke
parents:
diff changeset
1135 // work even during GC or other inconvenient times.
a61af66fc99e Initial load
duke
parents:
diff changeset
1136 if (WizardMode && oop_value != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1137 tty->print("oop_value=" INTPTR_FORMAT ": ", (address)oop_value);
a61af66fc99e Initial load
duke
parents:
diff changeset
1138 oop_value->print_value_on(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
1139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1140 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1142 case relocInfo::external_word_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
1143 case relocInfo::internal_word_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
1144 case relocInfo::section_word_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
1145 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1146 DataRelocation* r = (DataRelocation*) reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1147 tty->print(" | [target=" INTPTR_FORMAT "]", r->value()); //value==target
a61af66fc99e Initial load
duke
parents:
diff changeset
1148 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1150 case relocInfo::static_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
1151 case relocInfo::runtime_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
1152 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1153 CallRelocation* r = (CallRelocation*) reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1154 tty->print(" | [destination=" INTPTR_FORMAT "]", r->destination());
a61af66fc99e Initial load
duke
parents:
diff changeset
1155 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1156 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1157 case relocInfo::virtual_call_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
1158 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1159 virtual_call_Relocation* r = (virtual_call_Relocation*) reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1160 tty->print(" | [destination=" INTPTR_FORMAT " first_oop=" INTPTR_FORMAT " oop_limit=" INTPTR_FORMAT "]",
a61af66fc99e Initial load
duke
parents:
diff changeset
1161 r->destination(), r->first_oop(), r->oop_limit());
a61af66fc99e Initial load
duke
parents:
diff changeset
1162 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1164 case relocInfo::static_stub_type:
a61af66fc99e Initial load
duke
parents:
diff changeset
1165 {
a61af66fc99e Initial load
duke
parents:
diff changeset
1166 static_stub_Relocation* r = (static_stub_Relocation*) reloc();
a61af66fc99e Initial load
duke
parents:
diff changeset
1167 tty->print(" | [static_call=" INTPTR_FORMAT "]", r->static_call());
a61af66fc99e Initial load
duke
parents:
diff changeset
1168 break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1170 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1171 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1172 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1173
a61af66fc99e Initial load
duke
parents:
diff changeset
1174
a61af66fc99e Initial load
duke
parents:
diff changeset
1175 void RelocIterator::print() {
a61af66fc99e Initial load
duke
parents:
diff changeset
1176 RelocIterator save_this = (*this);
a61af66fc99e Initial load
duke
parents:
diff changeset
1177 relocInfo* scan = _current;
a61af66fc99e Initial load
duke
parents:
diff changeset
1178 if (!has_current()) scan += 1; // nothing to scan here!
a61af66fc99e Initial load
duke
parents:
diff changeset
1179
a61af66fc99e Initial load
duke
parents:
diff changeset
1180 bool skip_next = has_current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1181 bool got_next;
a61af66fc99e Initial load
duke
parents:
diff changeset
1182 while (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1183 got_next = (skip_next || next());
a61af66fc99e Initial load
duke
parents:
diff changeset
1184 skip_next = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
1185
a61af66fc99e Initial load
duke
parents:
diff changeset
1186 tty->print(" @" INTPTR_FORMAT ": ", scan);
a61af66fc99e Initial load
duke
parents:
diff changeset
1187 relocInfo* newscan = _current+1;
a61af66fc99e Initial load
duke
parents:
diff changeset
1188 if (!has_current()) newscan -= 1; // nothing to scan here!
a61af66fc99e Initial load
duke
parents:
diff changeset
1189 while (scan < newscan) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1190 tty->print("%04x", *(short*)scan & 0xFFFF);
a61af66fc99e Initial load
duke
parents:
diff changeset
1191 scan++;
a61af66fc99e Initial load
duke
parents:
diff changeset
1192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1193 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
1194
a61af66fc99e Initial load
duke
parents:
diff changeset
1195 if (!got_next) break;
a61af66fc99e Initial load
duke
parents:
diff changeset
1196 print_current();
a61af66fc99e Initial load
duke
parents:
diff changeset
1197 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1198
a61af66fc99e Initial load
duke
parents:
diff changeset
1199 (*this) = save_this;
a61af66fc99e Initial load
duke
parents:
diff changeset
1200 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1201
a61af66fc99e Initial load
duke
parents:
diff changeset
1202 // For the debugger:
a61af66fc99e Initial load
duke
parents:
diff changeset
1203 extern "C"
1563
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
1204 void print_blob_locs(nmethod* nm) {
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
1205 nm->print();
1a5913bf5e19 6951083: oops and relocations should part of nmethod not CodeBlob
twisti
parents: 0
diff changeset
1206 RelocIterator iter(nm);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1207 iter.print();
a61af66fc99e Initial load
duke
parents:
diff changeset
1208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1209 extern "C"
a61af66fc99e Initial load
duke
parents:
diff changeset
1210 void print_buf_locs(CodeBuffer* cb) {
a61af66fc99e Initial load
duke
parents:
diff changeset
1211 FlagSetting fs(PrintRelocations, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
1212 cb->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
1213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
1214 #endif // !PRODUCT