annotate src/share/vm/asm/codeBuffer.hpp @ 20543:e7d0505c8a30

8059758: Footprint regressions with JDK-8038423 Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything. Reviewed-by: jwilhelm, brutisso
author tschatzl
date Fri, 10 Oct 2014 15:51:58 +0200
parents 094cbdffa87d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 12146
diff changeset
2 * Copyright (c) 1997, 2014, 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: 1378
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1378
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: 1378
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: 1846
diff changeset
25 #ifndef SHARE_VM_ASM_CODEBUFFER_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
26 #define SHARE_VM_ASM_CODEBUFFER_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
28 #include "code/oopRecorder.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
29 #include "code/relocInfo.hpp"
20435
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
30 #include "utilities/debug.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
31
8767
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
32 class CodeStrings;
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
33 class PhaseCFG;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
34 class Compile;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
35 class BufferBlob;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
36 class CodeBuffer;
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
37 class Label;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class CodeOffsets: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
40 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
41 enum Entries { Entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
42 Verified_Entry,
a61af66fc99e Initial load
duke
parents:
diff changeset
43 Frame_Complete, // Offset in the code where the frame setup is (for forte stackwalks) is complete
a61af66fc99e Initial load
duke
parents:
diff changeset
44 OSR_Entry,
116
018d5b58dd4f 6537506: Provide a mechanism for specifying Java-level USDT-like dtrace probes
kamg
parents: 0
diff changeset
45 Dtrace_trap = OSR_Entry, // dtrace probes can never have an OSR entry so reuse it
0
a61af66fc99e Initial load
duke
parents:
diff changeset
46 Exceptions, // Offset where exception handler lives
a61af66fc99e Initial load
duke
parents:
diff changeset
47 Deopt, // Offset where deopt handler lives
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
48 DeoptMH, // Offset where MethodHandle deopt handler lives
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1204
diff changeset
49 UnwindHandler, // Offset to default unwind handler
0
a61af66fc99e Initial load
duke
parents:
diff changeset
50 max_Entries };
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // special value to note codeBlobs where profile (forte) stack walking is
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // always dangerous and suspect.
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 enum { frame_never_safe = -1 };
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
58 int _values[max_Entries];
a61af66fc99e Initial load
duke
parents:
diff changeset
59
a61af66fc99e Initial load
duke
parents:
diff changeset
60 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
61 CodeOffsets() {
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
62 _values[Entry ] = 0;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
63 _values[Verified_Entry] = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
64 _values[Frame_Complete] = frame_never_safe;
1204
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
65 _values[OSR_Entry ] = 0;
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
66 _values[Exceptions ] = -1;
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
67 _values[Deopt ] = -1;
18a389214829 6921352: JSR 292 needs its own deopt handler
twisti
parents: 1201
diff changeset
68 _values[DeoptMH ] = -1;
1378
9f5b60a14736 6939930: exception unwind changes in 6919934 hurts compilation speed
never
parents: 1204
diff changeset
69 _values[UnwindHandler ] = -1;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
70 }
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 int value(Entries e) { return _values[e]; }
a61af66fc99e Initial load
duke
parents:
diff changeset
73 void set_value(Entries e, int val) { _values[e] = val; }
a61af66fc99e Initial load
duke
parents:
diff changeset
74 };
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // This class represents a stream of code and associated relocations.
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // There are a few in each CodeBuffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // They are filled concurrently, and concatenated at the end.
a61af66fc99e Initial load
duke
parents:
diff changeset
79 class CodeSection VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
80 friend class CodeBuffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
82 typedef int csize_t; // code size type; would be size_t except for history
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
85 address _start; // first byte of contents (instructions)
a61af66fc99e Initial load
duke
parents:
diff changeset
86 address _mark; // user mark, usually an instruction beginning
a61af66fc99e Initial load
duke
parents:
diff changeset
87 address _end; // current end address
a61af66fc99e Initial load
duke
parents:
diff changeset
88 address _limit; // last possible (allocated) end address
a61af66fc99e Initial load
duke
parents:
diff changeset
89 relocInfo* _locs_start; // first byte of relocation information
a61af66fc99e Initial load
duke
parents:
diff changeset
90 relocInfo* _locs_end; // first byte after relocation information
a61af66fc99e Initial load
duke
parents:
diff changeset
91 relocInfo* _locs_limit; // first byte after relocation information buf
a61af66fc99e Initial load
duke
parents:
diff changeset
92 address _locs_point; // last relocated position (grows upward)
a61af66fc99e Initial load
duke
parents:
diff changeset
93 bool _locs_own; // did I allocate the locs myself?
a61af66fc99e Initial load
duke
parents:
diff changeset
94 bool _frozen; // no more expansion of this section
a61af66fc99e Initial load
duke
parents:
diff changeset
95 char _index; // my section number (SECT_INST, etc.)
a61af66fc99e Initial load
duke
parents:
diff changeset
96 CodeBuffer* _outer; // enclosing CodeBuffer
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // (Note: _locs_point used to be called _last_reloc_offset.)
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 CodeSection() {
a61af66fc99e Initial load
duke
parents:
diff changeset
101 _start = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
102 _mark = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 _end = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 _limit = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 _locs_start = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 _locs_end = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
107 _locs_limit = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 _locs_point = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 _locs_own = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 _frozen = false;
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1579
diff changeset
111 debug_only(_index = (char)-1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
112 debug_only(_outer = (CodeBuffer*)badAddress);
a61af66fc99e Initial load
duke
parents:
diff changeset
113 }
a61af66fc99e Initial load
duke
parents:
diff changeset
114
a61af66fc99e Initial load
duke
parents:
diff changeset
115 void initialize_outer(CodeBuffer* outer, int index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
116 _outer = outer;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 _index = index;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 void initialize(address start, csize_t size = 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
121 assert(_start == NULL, "only one init step, please");
a61af66fc99e Initial load
duke
parents:
diff changeset
122 _start = start;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 _mark = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 _end = start;
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 _limit = start + size;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 _locs_point = start;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 void initialize_locs(int locs_capacity);
a61af66fc99e Initial load
duke
parents:
diff changeset
131 void expand_locs(int new_capacity);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 void initialize_locs_from(const CodeSection* source_cs);
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // helper for CodeBuffer::expand()
a61af66fc99e Initial load
duke
parents:
diff changeset
135 void take_over_code_from(CodeSection* cs) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 _start = cs->_start;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 _mark = cs->_mark;
a61af66fc99e Initial load
duke
parents:
diff changeset
138 _end = cs->_end;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 _limit = cs->_limit;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 _locs_point = cs->_locs_point;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
144 address start() const { return _start; }
a61af66fc99e Initial load
duke
parents:
diff changeset
145 address mark() const { return _mark; }
a61af66fc99e Initial load
duke
parents:
diff changeset
146 address end() const { return _end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
147 address limit() const { return _limit; }
a61af66fc99e Initial load
duke
parents:
diff changeset
148 csize_t size() const { return (csize_t)(_end - _start); }
a61af66fc99e Initial load
duke
parents:
diff changeset
149 csize_t mark_off() const { assert(_mark != NULL, "not an offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
150 return (csize_t)(_mark - _start); }
a61af66fc99e Initial load
duke
parents:
diff changeset
151 csize_t capacity() const { return (csize_t)(_limit - _start); }
a61af66fc99e Initial load
duke
parents:
diff changeset
152 csize_t remaining() const { return (csize_t)(_limit - _end); }
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 relocInfo* locs_start() const { return _locs_start; }
a61af66fc99e Initial load
duke
parents:
diff changeset
155 relocInfo* locs_end() const { return _locs_end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
156 int locs_count() const { return (int)(_locs_end - _locs_start); }
a61af66fc99e Initial load
duke
parents:
diff changeset
157 relocInfo* locs_limit() const { return _locs_limit; }
a61af66fc99e Initial load
duke
parents:
diff changeset
158 address locs_point() const { return _locs_point; }
a61af66fc99e Initial load
duke
parents:
diff changeset
159 csize_t locs_point_off() const{ return (csize_t)(_locs_point - _start); }
a61af66fc99e Initial load
duke
parents:
diff changeset
160 csize_t locs_capacity() const { return (csize_t)(_locs_limit - _locs_start); }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 csize_t locs_remaining()const { return (csize_t)(_locs_limit - _locs_end); }
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163 int index() const { return _index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 bool is_allocated() const { return _start != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
165 bool is_empty() const { return _start == _end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
166 bool is_frozen() const { return _frozen; }
a61af66fc99e Initial load
duke
parents:
diff changeset
167 bool has_locs() const { return _locs_end != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 CodeBuffer* outer() const { return _outer; }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 // is a given address in this section? (2nd version is end-inclusive)
a61af66fc99e Initial load
duke
parents:
diff changeset
172 bool contains(address pc) const { return pc >= _start && pc < _end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
173 bool contains2(address pc) const { return pc >= _start && pc <= _end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
174 bool allocates(address pc) const { return pc >= _start && pc < _limit; }
a61af66fc99e Initial load
duke
parents:
diff changeset
175 bool allocates2(address pc) const { return pc >= _start && pc <= _limit; }
a61af66fc99e Initial load
duke
parents:
diff changeset
176
17937
78bbf4d43a14 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 12146
diff changeset
177 void set_end(address pc) { assert(allocates2(pc), err_msg("not in CodeBuffer memory: " PTR_FORMAT " <= " PTR_FORMAT " <= " INTPTR_FORMAT, p2i(_start), p2i(pc), p2i(_limit))); _end = pc; }
1846
d55217dc206f 6829194: JSR 292 needs to support compressed oops
twisti
parents: 1762
diff changeset
178 void set_mark(address pc) { assert(contains2(pc), "not in codeBuffer");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
179 _mark = pc; }
a61af66fc99e Initial load
duke
parents:
diff changeset
180 void set_mark_off(int offset) { assert(contains2(offset+_start),"not in codeBuffer");
a61af66fc99e Initial load
duke
parents:
diff changeset
181 _mark = offset + _start; }
a61af66fc99e Initial load
duke
parents:
diff changeset
182 void set_mark() { _mark = _end; }
a61af66fc99e Initial load
duke
parents:
diff changeset
183 void clear_mark() { _mark = NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 void set_locs_end(relocInfo* p) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 assert(p <= locs_limit(), "locs data fits in allocated buffer");
a61af66fc99e Initial load
duke
parents:
diff changeset
187 _locs_end = p;
a61af66fc99e Initial load
duke
parents:
diff changeset
188 }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 void set_locs_point(address pc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
190 assert(pc >= locs_point(), "relocation addr may not decrease");
a61af66fc99e Initial load
duke
parents:
diff changeset
191 assert(allocates2(pc), "relocation addr must be in this section");
a61af66fc99e Initial load
duke
parents:
diff changeset
192 _locs_point = pc;
a61af66fc99e Initial load
duke
parents:
diff changeset
193 }
a61af66fc99e Initial load
duke
parents:
diff changeset
194
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
195 // Code emission
7198
6ab62ad83507 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 6796
diff changeset
196 void emit_int8 ( int8_t x) { *((int8_t*) end()) = x; set_end(end() + sizeof(int8_t)); }
6ab62ad83507 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 6796
diff changeset
197 void emit_int16( int16_t x) { *((int16_t*) end()) = x; set_end(end() + sizeof(int16_t)); }
6ab62ad83507 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 6796
diff changeset
198 void emit_int32( int32_t x) { *((int32_t*) end()) = x; set_end(end() + sizeof(int32_t)); }
6ab62ad83507 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 6796
diff changeset
199 void emit_int64( int64_t x) { *((int64_t*) end()) = x; set_end(end() + sizeof(int64_t)); }
6ab62ad83507 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 6796
diff changeset
200
6ab62ad83507 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 6796
diff changeset
201 void emit_float( jfloat x) { *((jfloat*) end()) = x; set_end(end() + sizeof(jfloat)); }
6ab62ad83507 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 6796
diff changeset
202 void emit_double(jdouble x) { *((jdouble*) end()) = x; set_end(end() + sizeof(jdouble)); }
6ab62ad83507 8003195: AbstractAssembler should not store code pointers but use the CodeSection directly
twisti
parents: 6796
diff changeset
203 void emit_address(address x) { *((address*) end()) = x; set_end(end() + sizeof(address)); }
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
204
0
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // Share a scratch buffer for relocinfo. (Hacky; saves a resource allocation.)
a61af66fc99e Initial load
duke
parents:
diff changeset
206 void initialize_shared_locs(relocInfo* buf, int length);
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // Manage labels and their addresses.
a61af66fc99e Initial load
duke
parents:
diff changeset
209 address target(Label& L, address branch_pc);
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 // Emit a relocation.
a61af66fc99e Initial load
duke
parents:
diff changeset
212 void relocate(address at, RelocationHolder const& rspec, int format = 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 void relocate(address at, relocInfo::relocType rtype, int format = 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
214 if (rtype != relocInfo::none)
a61af66fc99e Initial load
duke
parents:
diff changeset
215 relocate(at, Relocation::spec_simple(rtype), format);
a61af66fc99e Initial load
duke
parents:
diff changeset
216 }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // alignment requirement for starting offset
a61af66fc99e Initial load
duke
parents:
diff changeset
219 // Requirements are that the instruction area and the
a61af66fc99e Initial load
duke
parents:
diff changeset
220 // stubs area must start on CodeEntryAlignment, and
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // the ctable on sizeof(jdouble)
a61af66fc99e Initial load
duke
parents:
diff changeset
222 int alignment() const { return MAX2((int)sizeof(jdouble), (int)CodeEntryAlignment); }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // Slop between sections, used only when allocating temporary BufferBlob buffers.
a61af66fc99e Initial load
duke
parents:
diff changeset
225 static csize_t end_slop() { return MAX2((int)sizeof(jdouble), (int)CodeEntryAlignment); }
a61af66fc99e Initial load
duke
parents:
diff changeset
226
a61af66fc99e Initial load
duke
parents:
diff changeset
227 csize_t align_at_start(csize_t off) const { return (csize_t) align_size_up(off, alignment()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Mark a section frozen. Assign its remaining space to
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // the following section. It will never expand after this point.
a61af66fc99e Initial load
duke
parents:
diff changeset
231 inline void freeze(); // { _outer->freeze_section(this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // Ensure there's enough space left in the current section.
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // Return true if there was an expansion.
a61af66fc99e Initial load
duke
parents:
diff changeset
235 bool maybe_expand_to_ensure_remaining(csize_t amount);
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
238 void decode();
a61af66fc99e Initial load
duke
parents:
diff changeset
239 void dump();
a61af66fc99e Initial load
duke
parents:
diff changeset
240 void print(const char* name);
a61af66fc99e Initial load
duke
parents:
diff changeset
241 #endif //PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
242 };
a61af66fc99e Initial load
duke
parents:
diff changeset
243
8767
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
244 class CodeString;
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
245 class CodeStrings VALUE_OBJ_CLASS_SPEC {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
246 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
247 #ifndef PRODUCT
8767
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
248 CodeString* _strings;
20435
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
249 #ifdef ASSERT
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
250 // Becomes true after copy-out, forbids further use.
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
251 bool _defunct; // Zero bit pattern is "valid", see memset call in decode_env::decode_env
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
252 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
253 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
254
8767
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
255 CodeString* find(intptr_t offset) const;
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
256 CodeString* find_last(intptr_t offset) const;
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
257
20435
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
258 void set_null_and_invalidate() {
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
259 #ifndef PRODUCT
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
260 _strings = NULL;
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
261 #ifdef ASSERT
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
262 _defunct = true;
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
263 #endif
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
264 #endif
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
265 }
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
266
0
a61af66fc99e Initial load
duke
parents:
diff changeset
267 public:
8767
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
268 CodeStrings() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
269 #ifndef PRODUCT
8767
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
270 _strings = NULL;
20435
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
271 #ifdef ASSERT
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
272 _defunct = false;
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
273 #endif
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
274 #endif
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
275 }
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
276
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
277 bool is_null() {
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
278 #ifdef ASSERT
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
279 return _strings == NULL;
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
280 #else
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
281 return true;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
282 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284
8767
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
285 const char* add_string(const char * string) PRODUCT_RETURN_(return NULL;);
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
286
0
a61af66fc99e Initial load
duke
parents:
diff changeset
287 void add_comment(intptr_t offset, const char * comment) PRODUCT_RETURN;
6796
b31471cdc53e 7200163: add CodeComments functionality to assember stubs
kvn
parents: 6725
diff changeset
288 void print_block_comment(outputStream* stream, intptr_t offset) const PRODUCT_RETURN;
20435
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
289 // MOVE strings from other to this; invalidate other.
8767
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
290 void assign(CodeStrings& other) PRODUCT_RETURN;
20435
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
291 // COPY strings from other to this; leave other valid.
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
292 void copy(CodeStrings& other) PRODUCT_RETURN;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
293 void free() PRODUCT_RETURN;
20435
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
294 // Guarantee that _strings are used at most once; assign invalidates a buffer.
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
295 inline void check_valid() const {
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
296 #ifdef ASSERT
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
297 assert(!_defunct, "Use of invalid CodeStrings");
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
298 #endif
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
299 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
300 };
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // A CodeBuffer describes a memory space into which assembly
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // code is generated. This memory space usually occupies the
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // interior of a single BufferBlob, but in some cases it may be
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // an arbitrary span of memory, even outside the code cache.
a61af66fc99e Initial load
duke
parents:
diff changeset
306 //
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // A code buffer comes in two variants:
a61af66fc99e Initial load
duke
parents:
diff changeset
308 //
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // (1) A CodeBuffer referring to an already allocated piece of memory:
a61af66fc99e Initial load
duke
parents:
diff changeset
310 // This is used to direct 'static' code generation (e.g. for interpreter
a61af66fc99e Initial load
duke
parents:
diff changeset
311 // or stubroutine generation, etc.). This code comes with NO relocation
a61af66fc99e Initial load
duke
parents:
diff changeset
312 // information.
a61af66fc99e Initial load
duke
parents:
diff changeset
313 //
a61af66fc99e Initial load
duke
parents:
diff changeset
314 // (2) A CodeBuffer referring to a piece of memory allocated when the
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // CodeBuffer is allocated. This is used for nmethod generation.
a61af66fc99e Initial load
duke
parents:
diff changeset
316 //
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // The memory can be divided up into several parts called sections.
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // Each section independently accumulates code (or data) an relocations.
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // Sections can grow (at the expense of a reallocation of the BufferBlob
a61af66fc99e Initial load
duke
parents:
diff changeset
320 // and recopying of all active sections). When the buffered code is finally
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // written to an nmethod (or other CodeBlob), the contents (code, data,
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // and relocations) of the sections are padded to an alignment and concatenated.
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // Instructions and data in one section can contain relocatable references to
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // addresses in a sibling section.
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 class CodeBuffer: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
327 friend class CodeSection;
a61af66fc99e Initial load
duke
parents:
diff changeset
328
a61af66fc99e Initial load
duke
parents:
diff changeset
329 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
330 // CodeBuffers must be allocated on the stack except for a single
a61af66fc99e Initial load
duke
parents:
diff changeset
331 // special case during expansion which is handled internally. This
a61af66fc99e Initial load
duke
parents:
diff changeset
332 // is done to guarantee proper cleanup of resources.
12146
9758d9f36299 8021954: VM SIGSEGV during classloading on MacOS; hs_err_pid file produced
coleenp
parents: 8767
diff changeset
333 void* operator new(size_t size) throw() { return ResourceObj::operator new(size); }
9758d9f36299 8021954: VM SIGSEGV during classloading on MacOS; hs_err_pid file produced
coleenp
parents: 8767
diff changeset
334 void operator delete(void* p) { ShouldNotCallThis(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
335
a61af66fc99e Initial load
duke
parents:
diff changeset
336 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
337 typedef int csize_t; // code size type; would be size_t except for history
a61af66fc99e Initial load
duke
parents:
diff changeset
338 enum {
1762
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
339 // Here is the list of all possible sections. The order reflects
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
340 // the final layout.
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
341 SECT_FIRST = 0,
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
342 SECT_CONSTS = SECT_FIRST, // Non-instruction data: Floats, jump tables, etc.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
343 SECT_INSTS, // Executable instructions.
a61af66fc99e Initial load
duke
parents:
diff changeset
344 SECT_STUBS, // Outbound trampolines for supporting call sites.
a61af66fc99e Initial load
duke
parents:
diff changeset
345 SECT_LIMIT, SECT_NONE = -1
a61af66fc99e Initial load
duke
parents:
diff changeset
346 };
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
349 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
350 sect_bits = 2, // assert (SECT_LIMIT <= (1<<sect_bits))
a61af66fc99e Initial load
duke
parents:
diff changeset
351 sect_mask = (1<<sect_bits)-1
a61af66fc99e Initial load
duke
parents:
diff changeset
352 };
a61af66fc99e Initial load
duke
parents:
diff changeset
353
a61af66fc99e Initial load
duke
parents:
diff changeset
354 const char* _name;
a61af66fc99e Initial load
duke
parents:
diff changeset
355
1762
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
356 CodeSection _consts; // constants, jump tables
0
a61af66fc99e Initial load
duke
parents:
diff changeset
357 CodeSection _insts; // instructions (the main section)
a61af66fc99e Initial load
duke
parents:
diff changeset
358 CodeSection _stubs; // stubs (call site support), deopt, exception handling
a61af66fc99e Initial load
duke
parents:
diff changeset
359
a61af66fc99e Initial load
duke
parents:
diff changeset
360 CodeBuffer* _before_expand; // dead buffer, from before the last expansion
a61af66fc99e Initial load
duke
parents:
diff changeset
361
a61af66fc99e Initial load
duke
parents:
diff changeset
362 BufferBlob* _blob; // optional buffer in CodeCache for generated code
a61af66fc99e Initial load
duke
parents:
diff changeset
363 address _total_start; // first address of combined memory buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
364 csize_t _total_size; // size in bytes of combined memory buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 OopRecorder* _oop_recorder;
20435
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
367 CodeStrings _code_strings;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
368 OopRecorder _default_oop_recorder; // override with initialize_oop_recorder
a61af66fc99e Initial load
duke
parents:
diff changeset
369 Arena* _overflow_arena;
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 address _decode_begin; // start address for decode
a61af66fc99e Initial load
duke
parents:
diff changeset
372 address decode_begin();
a61af66fc99e Initial load
duke
parents:
diff changeset
373
a61af66fc99e Initial load
duke
parents:
diff changeset
374 void initialize_misc(const char * name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
375 // all pointers other than code_start/end and those inside the sections
a61af66fc99e Initial load
duke
parents:
diff changeset
376 assert(name != NULL, "must have a name");
a61af66fc99e Initial load
duke
parents:
diff changeset
377 _name = name;
a61af66fc99e Initial load
duke
parents:
diff changeset
378 _before_expand = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
379 _blob = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
380 _oop_recorder = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
381 _decode_begin = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
382 _overflow_arena = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
383 }
a61af66fc99e Initial load
duke
parents:
diff changeset
384
a61af66fc99e Initial load
duke
parents:
diff changeset
385 void initialize(address code_start, csize_t code_size) {
1762
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
386 _consts.initialize_outer(this, SECT_CONSTS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
387 _insts.initialize_outer(this, SECT_INSTS);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 _stubs.initialize_outer(this, SECT_STUBS);
a61af66fc99e Initial load
duke
parents:
diff changeset
389 _total_start = code_start;
a61af66fc99e Initial load
duke
parents:
diff changeset
390 _total_size = code_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // Initialize the main section:
a61af66fc99e Initial load
duke
parents:
diff changeset
392 _insts.initialize(code_start, code_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
393 assert(!_stubs.is_allocated(), "no garbage here");
a61af66fc99e Initial load
duke
parents:
diff changeset
394 assert(!_consts.is_allocated(), "no garbage here");
a61af66fc99e Initial load
duke
parents:
diff changeset
395 _oop_recorder = &_default_oop_recorder;
a61af66fc99e Initial load
duke
parents:
diff changeset
396 }
a61af66fc99e Initial load
duke
parents:
diff changeset
397
a61af66fc99e Initial load
duke
parents:
diff changeset
398 void initialize_section_size(CodeSection* cs, csize_t size);
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 void freeze_section(CodeSection* cs);
a61af66fc99e Initial load
duke
parents:
diff changeset
401
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // helper for CodeBuffer::expand()
a61af66fc99e Initial load
duke
parents:
diff changeset
403 void take_over_code_from(CodeBuffer* cs);
a61af66fc99e Initial load
duke
parents:
diff changeset
404
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // ensure sections are disjoint, ordered, and contained in the blob
4059
44ce519bc3d1 7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents: 2426
diff changeset
406 void verify_section_allocation();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
407
a61af66fc99e Initial load
duke
parents:
diff changeset
408 // copies combined relocations to the blob, returns bytes copied
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // (if target is null, it is a dry run only, just for sizing)
a61af66fc99e Initial load
duke
parents:
diff changeset
410 csize_t copy_relocations_to(CodeBlob* blob) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
411
a61af66fc99e Initial load
duke
parents:
diff changeset
412 // copies combined code to the blob (assumes relocs are already in there)
a61af66fc99e Initial load
duke
parents:
diff changeset
413 void copy_code_to(CodeBlob* blob);
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // moves code sections to new buffer (assumes relocs are already in there)
a61af66fc99e Initial load
duke
parents:
diff changeset
416 void relocate_code_to(CodeBuffer* cb) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
417
a61af66fc99e Initial load
duke
parents:
diff changeset
418 // set up a model of the final layout of my contents
a61af66fc99e Initial load
duke
parents:
diff changeset
419 void compute_final_layout(CodeBuffer* dest) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
420
a61af66fc99e Initial load
duke
parents:
diff changeset
421 // Expand the given section so at least 'amount' is remaining.
a61af66fc99e Initial load
duke
parents:
diff changeset
422 // Creates a new, larger BufferBlob, and rewrites the code & relocs.
a61af66fc99e Initial load
duke
parents:
diff changeset
423 void expand(CodeSection* which_cs, csize_t amount);
a61af66fc99e Initial load
duke
parents:
diff changeset
424
a61af66fc99e Initial load
duke
parents:
diff changeset
425 // Helper for expand.
a61af66fc99e Initial load
duke
parents:
diff changeset
426 csize_t figure_expanded_capacities(CodeSection* which_cs, csize_t amount, csize_t* new_capacity);
a61af66fc99e Initial load
duke
parents:
diff changeset
427
a61af66fc99e Initial load
duke
parents:
diff changeset
428 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
429 // (1) code buffer referring to pre-allocated instruction memory
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
430 CodeBuffer(address code_start, csize_t code_size) {
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
431 assert(code_start != NULL, "sanity");
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
432 initialize_misc("static buffer");
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
433 initialize(code_start, code_size);
4059
44ce519bc3d1 7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents: 2426
diff changeset
434 verify_section_allocation();
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
435 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
436
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
437 // (2) CodeBuffer referring to pre-allocated CodeBlob.
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
438 CodeBuffer(CodeBlob* blob);
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
439
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
440 // (3) code buffer allocating codeBlob memory for code & relocation
0
a61af66fc99e Initial load
duke
parents:
diff changeset
441 // info but with lazy initialization. The name must be something
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // informative.
a61af66fc99e Initial load
duke
parents:
diff changeset
443 CodeBuffer(const char* name) {
a61af66fc99e Initial load
duke
parents:
diff changeset
444 initialize_misc(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
445 }
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
448 // (4) code buffer allocating codeBlob memory for code & relocation
0
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // info. The name must be something informative and code_size must
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // include both code and stubs sizes.
a61af66fc99e Initial load
duke
parents:
diff changeset
451 CodeBuffer(const char* name, csize_t code_size, csize_t locs_size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
452 initialize_misc(name);
a61af66fc99e Initial load
duke
parents:
diff changeset
453 initialize(code_size, locs_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
454 }
a61af66fc99e Initial load
duke
parents:
diff changeset
455
a61af66fc99e Initial load
duke
parents:
diff changeset
456 ~CodeBuffer();
a61af66fc99e Initial load
duke
parents:
diff changeset
457
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
458 // Initialize a CodeBuffer constructed using constructor 3. Using
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
459 // constructor 4 is equivalent to calling constructor 3 and then
0
a61af66fc99e Initial load
duke
parents:
diff changeset
460 // calling this method. It's been factored out for convenience of
a61af66fc99e Initial load
duke
parents:
diff changeset
461 // construction.
a61af66fc99e Initial load
duke
parents:
diff changeset
462 void initialize(csize_t code_size, csize_t locs_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
463
1762
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
464 CodeSection* consts() { return &_consts; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
465 CodeSection* insts() { return &_insts; }
a61af66fc99e Initial load
duke
parents:
diff changeset
466 CodeSection* stubs() { return &_stubs; }
a61af66fc99e Initial load
duke
parents:
diff changeset
467
1762
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
468 // present sections in order; return NULL at end; consts is #0, etc.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
469 CodeSection* code_section(int n) {
1762
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
470 // This makes the slightly questionable but portable assumption
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
471 // that the various members (_consts, _insts, _stubs, etc.) are
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
472 // adjacent in the layout of CodeBuffer.
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
473 CodeSection* cs = &_consts + n;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
474 assert(cs->index() == n || !cs->is_allocated(), "sanity");
a61af66fc99e Initial load
duke
parents:
diff changeset
475 return cs;
a61af66fc99e Initial load
duke
parents:
diff changeset
476 }
a61af66fc99e Initial load
duke
parents:
diff changeset
477 const CodeSection* code_section(int n) const { // yucky const stuff
a61af66fc99e Initial load
duke
parents:
diff changeset
478 return ((CodeBuffer*)this)->code_section(n);
a61af66fc99e Initial load
duke
parents:
diff changeset
479 }
a61af66fc99e Initial load
duke
parents:
diff changeset
480 static const char* code_section_name(int n);
a61af66fc99e Initial load
duke
parents:
diff changeset
481 int section_index_of(address addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
482 bool contains(address addr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
483 // handy for debugging
a61af66fc99e Initial load
duke
parents:
diff changeset
484 return section_index_of(addr) > SECT_NONE;
a61af66fc99e Initial load
duke
parents:
diff changeset
485 }
a61af66fc99e Initial load
duke
parents:
diff changeset
486
a61af66fc99e Initial load
duke
parents:
diff changeset
487 // A stable mapping between 'locators' (small ints) and addresses.
a61af66fc99e Initial load
duke
parents:
diff changeset
488 static int locator_pos(int locator) { return locator >> sect_bits; }
a61af66fc99e Initial load
duke
parents:
diff changeset
489 static int locator_sect(int locator) { return locator & sect_mask; }
a61af66fc99e Initial load
duke
parents:
diff changeset
490 static int locator(int pos, int sect) { return (pos << sect_bits) | sect; }
a61af66fc99e Initial load
duke
parents:
diff changeset
491 int locator(address addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
492 address locator_address(int locator) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
493
7199
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
494 // Heuristic for pre-packing the taken/not-taken bit of a predicted branch.
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
495 bool is_backward_branch(Label& L);
cd3d6a6b95d9 8003240: x86: move MacroAssembler into separate file
twisti
parents: 7198
diff changeset
496
0
a61af66fc99e Initial load
duke
parents:
diff changeset
497 // Properties
a61af66fc99e Initial load
duke
parents:
diff changeset
498 const char* name() const { return _name; }
a61af66fc99e Initial load
duke
parents:
diff changeset
499 CodeBuffer* before_expand() const { return _before_expand; }
a61af66fc99e Initial load
duke
parents:
diff changeset
500 BufferBlob* blob() const { return _blob; }
a61af66fc99e Initial load
duke
parents:
diff changeset
501 void set_blob(BufferBlob* blob);
a61af66fc99e Initial load
duke
parents:
diff changeset
502 void free_blob(); // Free the blob, if we own one.
a61af66fc99e Initial load
duke
parents:
diff changeset
503
a61af66fc99e Initial load
duke
parents:
diff changeset
504 // Properties relative to the insts section:
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
505 address insts_begin() const { return _insts.start(); }
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
506 address insts_end() const { return _insts.end(); }
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
507 void set_insts_end(address end) { _insts.set_end(end); }
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
508 address insts_limit() const { return _insts.limit(); }
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
509 address insts_mark() const { return _insts.mark(); }
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
510 void set_insts_mark() { _insts.set_mark(); }
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
511 void clear_insts_mark() { _insts.clear_mark(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 // is there anything in the buffer other than the current section?
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
514 bool is_pure() const { return insts_size() == total_content_size(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
515
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // size in bytes of output so far in the insts sections
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
517 csize_t insts_size() const { return _insts.size(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
518
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
519 // same as insts_size(), except that it asserts there is no non-code here
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
520 csize_t pure_insts_size() const { assert(is_pure(), "no non-code");
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
521 return insts_size(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // capacity in bytes of the insts sections
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
523 csize_t insts_capacity() const { return _insts.capacity(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
524
a61af66fc99e Initial load
duke
parents:
diff changeset
525 // number of bytes remaining in the insts section
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
526 csize_t insts_remaining() const { return _insts.remaining(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
527
a61af66fc99e Initial load
duke
parents:
diff changeset
528 // is a given address in the insts section? (2nd version is end-inclusive)
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
529 bool insts_contains(address pc) const { return _insts.contains(pc); }
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
530 bool insts_contains2(address pc) const { return _insts.contains2(pc); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
531
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 4059
diff changeset
532 // Record any extra oops required to keep embedded metadata alive
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 4059
diff changeset
533 void finalize_oop_references(methodHandle method);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 4059
diff changeset
534
1748
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
535 // Allocated size in all sections, when aligned and concatenated
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
536 // (this is the eventual state of the content in its final
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
537 // CodeBlob).
3e8fbc61cee8 6978355: renaming for 6961697
twisti
parents: 1689
diff changeset
538 csize_t total_content_size() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
539
1762
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
540 // Combined offset (relative to start of first section) of given
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
541 // section, as eventually found in the final CodeBlob.
0878d7bae69f 6961697: move nmethod constants section before instruction section
twisti
parents: 1748
diff changeset
542 csize_t total_offset_of(CodeSection* cs) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544 // allocated size of all relocation data, including index, rounded up
a61af66fc99e Initial load
duke
parents:
diff changeset
545 csize_t total_relocation_size() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
546
a61af66fc99e Initial load
duke
parents:
diff changeset
547 // allocated size of any and all recorded oops
a61af66fc99e Initial load
duke
parents:
diff changeset
548 csize_t total_oop_size() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
549 OopRecorder* recorder = oop_recorder();
a61af66fc99e Initial load
duke
parents:
diff changeset
550 return (recorder == NULL)? 0: recorder->oop_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
551 }
a61af66fc99e Initial load
duke
parents:
diff changeset
552
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 4059
diff changeset
553 // allocated size of any and all recorded metadata
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 4059
diff changeset
554 csize_t total_metadata_size() const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 4059
diff changeset
555 OopRecorder* recorder = oop_recorder();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 4059
diff changeset
556 return (recorder == NULL)? 0: recorder->metadata_size();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 4059
diff changeset
557 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 4059
diff changeset
558
0
a61af66fc99e Initial load
duke
parents:
diff changeset
559 // Configuration functions, called immediately after the CB is constructed.
a61af66fc99e Initial load
duke
parents:
diff changeset
560 // The section sizes are subtracted from the original insts section.
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // Note: Call them in reverse section order, because each steals from insts.
a61af66fc99e Initial load
duke
parents:
diff changeset
562 void initialize_consts_size(csize_t size) { initialize_section_size(&_consts, size); }
a61af66fc99e Initial load
duke
parents:
diff changeset
563 void initialize_stubs_size(csize_t size) { initialize_section_size(&_stubs, size); }
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // Override default oop recorder.
a61af66fc99e Initial load
duke
parents:
diff changeset
565 void initialize_oop_recorder(OopRecorder* r);
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 OopRecorder* oop_recorder() const { return _oop_recorder; }
20435
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
568 CodeStrings& strings() { return _code_strings; }
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
569
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
570 void free_strings() {
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
571 if (!_code_strings.is_null()) {
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
572 _code_strings.free(); // sets _strings Null as a side-effect.
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
573 }
094cbdffa87d 8054292: code comments leak in fastdebug builds
drchase
parents: 17937
diff changeset
574 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
575
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // Code generation
a61af66fc99e Initial load
duke
parents:
diff changeset
577 void relocate(address at, RelocationHolder const& rspec, int format = 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
578 _insts.relocate(at, rspec, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
579 }
a61af66fc99e Initial load
duke
parents:
diff changeset
580 void relocate(address at, relocInfo::relocType rtype, int format = 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
581 _insts.relocate(at, rtype, format);
a61af66fc99e Initial load
duke
parents:
diff changeset
582 }
a61af66fc99e Initial load
duke
parents:
diff changeset
583
a61af66fc99e Initial load
duke
parents:
diff changeset
584 // Management of overflow storage for binding of Labels.
a61af66fc99e Initial load
duke
parents:
diff changeset
585 GrowableArray<int>* create_patch_overflow();
a61af66fc99e Initial load
duke
parents:
diff changeset
586
a61af66fc99e Initial load
duke
parents:
diff changeset
587 // NMethod generation
a61af66fc99e Initial load
duke
parents:
diff changeset
588 void copy_code_and_locs_to(CodeBlob* blob) {
a61af66fc99e Initial load
duke
parents:
diff changeset
589 assert(blob != NULL, "sane");
a61af66fc99e Initial load
duke
parents:
diff changeset
590 copy_relocations_to(blob);
a61af66fc99e Initial load
duke
parents:
diff changeset
591 copy_code_to(blob);
a61af66fc99e Initial load
duke
parents:
diff changeset
592 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 4059
diff changeset
593 void copy_values_to(nmethod* nm) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
594 if (!oop_recorder()->is_unused()) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 4059
diff changeset
595 oop_recorder()->copy_values_to(nm);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
596 }
a61af66fc99e Initial load
duke
parents:
diff changeset
597 }
a61af66fc99e Initial load
duke
parents:
diff changeset
598
a61af66fc99e Initial load
duke
parents:
diff changeset
599 // Transform an address from the code in this code buffer to a specified code buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
600 address transform_address(const CodeBuffer &cb, address addr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
601
a61af66fc99e Initial load
duke
parents:
diff changeset
602 void block_comment(intptr_t offset, const char * comment) PRODUCT_RETURN;
8767
a5de0cc2f91c 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 7199
diff changeset
603 const char* code_string(const char* str) PRODUCT_RETURN_(return NULL;);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
604
4059
44ce519bc3d1 7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents: 2426
diff changeset
605 // Log a little info about section usage in the CodeBuffer
44ce519bc3d1 7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents: 2426
diff changeset
606 void log_section_sizes(const char* name);
44ce519bc3d1 7104960: JSR 292: +VerifyMethodHandles in product JVM can overflow buffer
never
parents: 2426
diff changeset
607
0
a61af66fc99e Initial load
duke
parents:
diff changeset
608 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
609 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
610 // Printing / Decoding
a61af66fc99e Initial load
duke
parents:
diff changeset
611 // decodes from decode_begin() to code_end() and sets decode_begin to end
a61af66fc99e Initial load
duke
parents:
diff changeset
612 void decode();
a61af66fc99e Initial load
duke
parents:
diff changeset
613 void decode_all(); // decodes all the code
a61af66fc99e Initial load
duke
parents:
diff changeset
614 void skip_decode(); // sets decode_begin to code_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
615 void print();
a61af66fc99e Initial load
duke
parents:
diff changeset
616 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
617
a61af66fc99e Initial load
duke
parents:
diff changeset
618
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // The following header contains architecture-specific implementations
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
620 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
621 # include "codeBuffer_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
622 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
623 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
624 # include "codeBuffer_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
625 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
626 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
627 # include "codeBuffer_zero.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
628 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
629 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
630 # include "codeBuffer_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
631 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
632 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
633 # include "codeBuffer_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
634 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
635
0
a61af66fc99e Initial load
duke
parents:
diff changeset
636 };
a61af66fc99e Initial load
duke
parents:
diff changeset
637
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 inline void CodeSection::freeze() {
a61af66fc99e Initial load
duke
parents:
diff changeset
640 _outer->freeze_section(this);
a61af66fc99e Initial load
duke
parents:
diff changeset
641 }
a61af66fc99e Initial load
duke
parents:
diff changeset
642
a61af66fc99e Initial load
duke
parents:
diff changeset
643 inline bool CodeSection::maybe_expand_to_ensure_remaining(csize_t amount) {
a61af66fc99e Initial load
duke
parents:
diff changeset
644 if (remaining() < amount) { _outer->expand(this, amount); return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
645 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
646 }
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
647
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1846
diff changeset
648 #endif // SHARE_VM_ASM_CODEBUFFER_HPP