annotate src/share/vm/asm/assembler.hpp @ 452:00b023ae2d78

6722113: CMS: Incorrect overflow handling during precleaning of Reference lists Summary: When we encounter marking stack overflow during precleaning of Reference lists, we were using the overflow list mechanism, which can cause problems on account of mutating the mark word of the header because of conflicts with mutator accesses and updates of that field. Instead we should use the usual mechanism for overflow handling in concurrent phases, namely dirtying of the card on which the overflowed object lies. Since precleaning effectively does a form of discovered list processing, albeit with discovery enabled, we needed to adjust some code to be correct in the face of interleaved processing and discovery. Reviewed-by: apetrusenko, jcoomes
author ysr
date Thu, 20 Nov 2008 12:27:41 -0800
parents a61af66fc99e
children 98cb887364d3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
a61af66fc99e Initial load
duke
parents:
diff changeset
2 * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved.
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 *
a61af66fc99e Initial load
duke
parents:
diff changeset
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
a61af66fc99e Initial load
duke
parents:
diff changeset
20 * CA 95054 USA or visit www.sun.com if you need additional information or
a61af66fc99e Initial load
duke
parents:
diff changeset
21 * have any questions.
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
a61af66fc99e Initial load
duke
parents:
diff changeset
25 // This file contains platform-independant assembler declarations.
a61af66fc99e Initial load
duke
parents:
diff changeset
26
a61af66fc99e Initial load
duke
parents:
diff changeset
27 class CodeBuffer;
a61af66fc99e Initial load
duke
parents:
diff changeset
28 class MacroAssembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
29 class AbstractAssembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
30 class Label;
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
33 * Labels represent destinations for control transfer instructions. Such
a61af66fc99e Initial load
duke
parents:
diff changeset
34 * instructions can accept a Label as their target argument. A Label is
a61af66fc99e Initial load
duke
parents:
diff changeset
35 * bound to the current location in the code stream by calling the
a61af66fc99e Initial load
duke
parents:
diff changeset
36 * MacroAssembler's 'bind' method, which in turn calls the Label's 'bind'
a61af66fc99e Initial load
duke
parents:
diff changeset
37 * method. A Label may be referenced by an instruction before it's bound
a61af66fc99e Initial load
duke
parents:
diff changeset
38 * (i.e., 'forward referenced'). 'bind' stores the current code offset
a61af66fc99e Initial load
duke
parents:
diff changeset
39 * in the Label object.
a61af66fc99e Initial load
duke
parents:
diff changeset
40 *
a61af66fc99e Initial load
duke
parents:
diff changeset
41 * If an instruction references a bound Label, the offset field(s) within
a61af66fc99e Initial load
duke
parents:
diff changeset
42 * the instruction are immediately filled in based on the Label's code
a61af66fc99e Initial load
duke
parents:
diff changeset
43 * offset. If an instruction references an unbound label, that
a61af66fc99e Initial load
duke
parents:
diff changeset
44 * instruction is put on a list of instructions that must be patched
a61af66fc99e Initial load
duke
parents:
diff changeset
45 * (i.e., 'resolved') when the Label is bound.
a61af66fc99e Initial load
duke
parents:
diff changeset
46 *
a61af66fc99e Initial load
duke
parents:
diff changeset
47 * 'bind' will call the platform-specific 'patch_instruction' method to
a61af66fc99e Initial load
duke
parents:
diff changeset
48 * fill in the offset field(s) for each unresolved instruction (if there
a61af66fc99e Initial load
duke
parents:
diff changeset
49 * are any). 'patch_instruction' lives in one of the
a61af66fc99e Initial load
duke
parents:
diff changeset
50 * cpu/<arch>/vm/assembler_<arch>* files.
a61af66fc99e Initial load
duke
parents:
diff changeset
51 *
a61af66fc99e Initial load
duke
parents:
diff changeset
52 * Instead of using a linked list of unresolved instructions, a Label has
a61af66fc99e Initial load
duke
parents:
diff changeset
53 * an array of unresolved instruction code offsets. _patch_index
a61af66fc99e Initial load
duke
parents:
diff changeset
54 * contains the total number of forward references. If the Label's array
a61af66fc99e Initial load
duke
parents:
diff changeset
55 * overflows (i.e., _patch_index grows larger than the array size), a
a61af66fc99e Initial load
duke
parents:
diff changeset
56 * GrowableArray is allocated to hold the remaining offsets. (The cache
a61af66fc99e Initial load
duke
parents:
diff changeset
57 * size is 4 for now, which handles over 99.5% of the cases)
a61af66fc99e Initial load
duke
parents:
diff changeset
58 *
a61af66fc99e Initial load
duke
parents:
diff changeset
59 * Labels may only be used within a single CodeSection. If you need
a61af66fc99e Initial load
duke
parents:
diff changeset
60 * to create references between code sections, use explicit relocations.
a61af66fc99e Initial load
duke
parents:
diff changeset
61 */
a61af66fc99e Initial load
duke
parents:
diff changeset
62 class Label VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
63 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
64 enum { PatchCacheSize = 4 };
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // _loc encodes both the binding state (via its sign)
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // and the binding locator (via its value) of a label.
a61af66fc99e Initial load
duke
parents:
diff changeset
68 //
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // _loc >= 0 bound label, loc() encodes the target (jump) position
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // _loc == -1 unbound label
a61af66fc99e Initial load
duke
parents:
diff changeset
71 int _loc;
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // References to instructions that jump to this unresolved label.
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // These instructions need to be patched when the label is bound
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // using the platform-specific patchInstruction() method.
a61af66fc99e Initial load
duke
parents:
diff changeset
76 //
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // To avoid having to allocate from the C-heap each time, we provide
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // a local cache and use the overflow only if we exceed the local cache
a61af66fc99e Initial load
duke
parents:
diff changeset
79 int _patches[PatchCacheSize];
a61af66fc99e Initial load
duke
parents:
diff changeset
80 int _patch_index;
a61af66fc99e Initial load
duke
parents:
diff changeset
81 GrowableArray<int>* _patch_overflow;
a61af66fc99e Initial load
duke
parents:
diff changeset
82
a61af66fc99e Initial load
duke
parents:
diff changeset
83 Label(const Label&) { ShouldNotReachHere(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
88 * After binding, be sure 'patch_instructions' is called later to link
a61af66fc99e Initial load
duke
parents:
diff changeset
89 */
a61af66fc99e Initial load
duke
parents:
diff changeset
90 void bind_loc(int loc) {
a61af66fc99e Initial load
duke
parents:
diff changeset
91 assert(loc >= 0, "illegal locator");
a61af66fc99e Initial load
duke
parents:
diff changeset
92 assert(_loc == -1, "already bound");
a61af66fc99e Initial load
duke
parents:
diff changeset
93 _loc = loc;
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95 void bind_loc(int pos, int sect); // = bind_loc(locator(pos, sect))
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // Iterates over all unresolved instructions for printing
a61af66fc99e Initial load
duke
parents:
diff changeset
99 void print_instructions(MacroAssembler* masm) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
103 * Returns the position of the the Label in the code buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
104 * The position is a 'locator', which encodes both offset and section.
a61af66fc99e Initial load
duke
parents:
diff changeset
105 */
a61af66fc99e Initial load
duke
parents:
diff changeset
106 int loc() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 assert(_loc >= 0, "unbound label");
a61af66fc99e Initial load
duke
parents:
diff changeset
108 return _loc;
a61af66fc99e Initial load
duke
parents:
diff changeset
109 }
a61af66fc99e Initial load
duke
parents:
diff changeset
110 int loc_pos() const; // == locator_pos(loc())
a61af66fc99e Initial load
duke
parents:
diff changeset
111 int loc_sect() const; // == locator_sect(loc())
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 bool is_bound() const { return _loc >= 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
114 bool is_unbound() const { return _loc == -1 && _patch_index > 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
115 bool is_unused() const { return _loc == -1 && _patch_index == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
118 * Adds a reference to an unresolved displacement instruction to
a61af66fc99e Initial load
duke
parents:
diff changeset
119 * this unbound label
a61af66fc99e Initial load
duke
parents:
diff changeset
120 *
a61af66fc99e Initial load
duke
parents:
diff changeset
121 * @param cb the code buffer being patched
a61af66fc99e Initial load
duke
parents:
diff changeset
122 * @param branch_loc the locator of the branch instruction in the code buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
123 */
a61af66fc99e Initial load
duke
parents:
diff changeset
124 void add_patch_at(CodeBuffer* cb, int branch_loc);
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
127 * Iterate over the list of patches, resolving the instructions
a61af66fc99e Initial load
duke
parents:
diff changeset
128 * Call patch_instruction on each 'branch_loc' value
a61af66fc99e Initial load
duke
parents:
diff changeset
129 */
a61af66fc99e Initial load
duke
parents:
diff changeset
130 void patch_instructions(MacroAssembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
131
a61af66fc99e Initial load
duke
parents:
diff changeset
132 void init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
133 _loc = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 _patch_index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
135 _patch_overflow = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 Label() {
a61af66fc99e Initial load
duke
parents:
diff changeset
139 init();
a61af66fc99e Initial load
duke
parents:
diff changeset
140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
141 };
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // The Abstract Assembler: Pure assembler doing NO optimizations on the
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // instruction level; i.e., what you write is what you get.
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // The Assembler is generating code into a CodeBuffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
147 class AbstractAssembler : public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 friend class Label;
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
151 CodeSection* _code_section; // section within the code buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
152 address _code_begin; // first byte of code buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
153 address _code_limit; // first byte after code buffer
a61af66fc99e Initial load
duke
parents:
diff changeset
154 address _code_pos; // current code generation position
a61af66fc99e Initial load
duke
parents:
diff changeset
155 OopRecorder* _oop_recorder; // support for relocInfo::oop_type
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // Code emission & accessing
a61af66fc99e Initial load
duke
parents:
diff changeset
158 address addr_at(int pos) const { return _code_begin + pos; }
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // This routine is called with a label is used for an address.
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Labels and displacements truck in offsets, but target must return a PC.
a61af66fc99e Initial load
duke
parents:
diff changeset
162 address target(Label& L); // return _code_section->target(L)
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 bool is8bit(int x) const { return -0x80 <= x && x < 0x80; }
a61af66fc99e Initial load
duke
parents:
diff changeset
165 bool isByte(int x) const { return 0 <= x && x < 0x100; }
a61af66fc99e Initial load
duke
parents:
diff changeset
166 bool isShiftCount(int x) const { return 0 <= x && x < 32; }
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 void emit_byte(int x); // emit a single byte
a61af66fc99e Initial load
duke
parents:
diff changeset
169 void emit_word(int x); // emit a 16-bit word (not a wordSize word!)
a61af66fc99e Initial load
duke
parents:
diff changeset
170 void emit_long(jint x); // emit a 32-bit word (not a longSize word!)
a61af66fc99e Initial load
duke
parents:
diff changeset
171 void emit_address(address x); // emit an address (not a longSize word!)
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // Instruction boundaries (required when emitting relocatable values).
a61af66fc99e Initial load
duke
parents:
diff changeset
174 class InstructionMark: public StackObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
176 AbstractAssembler* _assm;
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
179 InstructionMark(AbstractAssembler* assm) : _assm(assm) {
a61af66fc99e Initial load
duke
parents:
diff changeset
180 assert(assm->inst_mark() == NULL, "overlapping instructions");
a61af66fc99e Initial load
duke
parents:
diff changeset
181 _assm->set_inst_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183 ~InstructionMark() {
a61af66fc99e Initial load
duke
parents:
diff changeset
184 _assm->clear_inst_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
185 }
a61af66fc99e Initial load
duke
parents:
diff changeset
186 };
a61af66fc99e Initial load
duke
parents:
diff changeset
187 friend class InstructionMark;
a61af66fc99e Initial load
duke
parents:
diff changeset
188 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // Make it return true on platforms which need to verify
a61af66fc99e Initial load
duke
parents:
diff changeset
190 // instruction boundaries for some operations.
a61af66fc99e Initial load
duke
parents:
diff changeset
191 inline static bool pd_check_instruction_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
192 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // Label functions
a61af66fc99e Initial load
duke
parents:
diff changeset
195 void print(Label& L);
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // Creation
a61af66fc99e Initial load
duke
parents:
diff changeset
200 AbstractAssembler(CodeBuffer* code);
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 // save end pointer back to code buf.
a61af66fc99e Initial load
duke
parents:
diff changeset
203 void sync();
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // ensure buf contains all code (call this before using/copying the code)
a61af66fc99e Initial load
duke
parents:
diff changeset
206 void flush();
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
209 CodeBuffer* code() const; // _code_section->outer()
a61af66fc99e Initial load
duke
parents:
diff changeset
210 CodeSection* code_section() const { return _code_section; }
a61af66fc99e Initial load
duke
parents:
diff changeset
211 int sect() const; // return _code_section->index()
a61af66fc99e Initial load
duke
parents:
diff changeset
212 address pc() const { return _code_pos; }
a61af66fc99e Initial load
duke
parents:
diff changeset
213 int offset() const { return _code_pos - _code_begin; }
a61af66fc99e Initial load
duke
parents:
diff changeset
214 int locator() const; // CodeBuffer::locator(offset(), sect())
a61af66fc99e Initial load
duke
parents:
diff changeset
215 OopRecorder* oop_recorder() const { return _oop_recorder; }
a61af66fc99e Initial load
duke
parents:
diff changeset
216 void set_oop_recorder(OopRecorder* r) { _oop_recorder = r; }
a61af66fc99e Initial load
duke
parents:
diff changeset
217
a61af66fc99e Initial load
duke
parents:
diff changeset
218 address inst_mark() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
219 void set_inst_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
220 void clear_inst_mark();
a61af66fc99e Initial load
duke
parents:
diff changeset
221
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // Constants in code
a61af66fc99e Initial load
duke
parents:
diff changeset
223 void a_byte(int x);
a61af66fc99e Initial load
duke
parents:
diff changeset
224 void a_long(jint x);
a61af66fc99e Initial load
duke
parents:
diff changeset
225 void relocate(RelocationHolder const& rspec, int format = 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 void relocate( relocInfo::relocType rtype, int format = 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
227 if (rtype != relocInfo::none)
a61af66fc99e Initial load
duke
parents:
diff changeset
228 relocate(Relocation::spec_simple(rtype), format);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 }
a61af66fc99e Initial load
duke
parents:
diff changeset
230
a61af66fc99e Initial load
duke
parents:
diff changeset
231 static int code_fill_byte(); // used to pad out odd-sized code buffers
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // Associate a comment with the current offset. It will be printed
a61af66fc99e Initial load
duke
parents:
diff changeset
234 // along with the disassembly when printing nmethods. Currently
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // only supported in the instruction section of the code buffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
236 void block_comment(const char* comment);
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 // Label functions
a61af66fc99e Initial load
duke
parents:
diff changeset
239 void bind(Label& L); // binds an unbound label L to the current code position
a61af66fc99e Initial load
duke
parents:
diff changeset
240
a61af66fc99e Initial load
duke
parents:
diff changeset
241 // Move to a different section in the same code buffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
242 void set_code_section(CodeSection* cs);
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // Inform assembler when generating stub code and relocation info
a61af66fc99e Initial load
duke
parents:
diff changeset
245 address start_a_stub(int required_space);
a61af66fc99e Initial load
duke
parents:
diff changeset
246 void end_a_stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // Ditto for constants.
a61af66fc99e Initial load
duke
parents:
diff changeset
248 address start_a_const(int required_space, int required_align = sizeof(double));
a61af66fc99e Initial load
duke
parents:
diff changeset
249 void end_a_const();
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // fp constants support
a61af66fc99e Initial load
duke
parents:
diff changeset
252 address double_constant(jdouble c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
253 address ptr = start_a_const(sizeof(c), sizeof(c));
a61af66fc99e Initial load
duke
parents:
diff changeset
254 if (ptr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
255 *(jdouble*)ptr = c;
a61af66fc99e Initial load
duke
parents:
diff changeset
256 _code_pos = ptr + sizeof(c);
a61af66fc99e Initial load
duke
parents:
diff changeset
257 end_a_const();
a61af66fc99e Initial load
duke
parents:
diff changeset
258 }
a61af66fc99e Initial load
duke
parents:
diff changeset
259 return ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
260 }
a61af66fc99e Initial load
duke
parents:
diff changeset
261 address float_constant(jfloat c) {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 address ptr = start_a_const(sizeof(c), sizeof(c));
a61af66fc99e Initial load
duke
parents:
diff changeset
263 if (ptr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
264 *(jfloat*)ptr = c;
a61af66fc99e Initial load
duke
parents:
diff changeset
265 _code_pos = ptr + sizeof(c);
a61af66fc99e Initial load
duke
parents:
diff changeset
266 end_a_const();
a61af66fc99e Initial load
duke
parents:
diff changeset
267 }
a61af66fc99e Initial load
duke
parents:
diff changeset
268 return ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
269 }
a61af66fc99e Initial load
duke
parents:
diff changeset
270 address address_constant(address c, RelocationHolder const& rspec) {
a61af66fc99e Initial load
duke
parents:
diff changeset
271 address ptr = start_a_const(sizeof(c), sizeof(c));
a61af66fc99e Initial load
duke
parents:
diff changeset
272 if (ptr != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 relocate(rspec);
a61af66fc99e Initial load
duke
parents:
diff changeset
274 *(address*)ptr = c;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 _code_pos = ptr + sizeof(c);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 end_a_const();
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278 return ptr;
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 inline address address_constant(Label& L);
a61af66fc99e Initial load
duke
parents:
diff changeset
281 inline address address_table_constant(GrowableArray<Label*> label);
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283 // Bang stack to trigger StackOverflowError at a safe location
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // implementation delegates to machine-specific bang_stack_with_offset
a61af66fc99e Initial load
duke
parents:
diff changeset
285 void generate_stack_overflow_check( int frame_size_in_bytes );
a61af66fc99e Initial load
duke
parents:
diff changeset
286 virtual void bang_stack_with_offset(int offset) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
290 * A platform-dependent method to patch a jump instruction that refers
a61af66fc99e Initial load
duke
parents:
diff changeset
291 * to this label.
a61af66fc99e Initial load
duke
parents:
diff changeset
292 *
a61af66fc99e Initial load
duke
parents:
diff changeset
293 * @param branch the location of the instruction to patch
a61af66fc99e Initial load
duke
parents:
diff changeset
294 * @param masm the assembler which generated the branch
a61af66fc99e Initial load
duke
parents:
diff changeset
295 */
a61af66fc99e Initial load
duke
parents:
diff changeset
296 void pd_patch_instruction(address branch, address target);
a61af66fc99e Initial load
duke
parents:
diff changeset
297
a61af66fc99e Initial load
duke
parents:
diff changeset
298 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
299 /**
a61af66fc99e Initial load
duke
parents:
diff changeset
300 * Platform-dependent method of printing an instruction that needs to be
a61af66fc99e Initial load
duke
parents:
diff changeset
301 * patched.
a61af66fc99e Initial load
duke
parents:
diff changeset
302 *
a61af66fc99e Initial load
duke
parents:
diff changeset
303 * @param branch the instruction to be patched in the buffer.
a61af66fc99e Initial load
duke
parents:
diff changeset
304 */
a61af66fc99e Initial load
duke
parents:
diff changeset
305 static void pd_print_patched_instruction(address branch);
a61af66fc99e Initial load
duke
parents:
diff changeset
306 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
307 };
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 #include "incls/_assembler_pd.hpp.incl"