annotate src/share/vm/c1/c1_FrameMap.cpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents 126ea7725993
children f95d63e2154a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 337
diff changeset
2 * Copyright (c) 2000, 2008, 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: 337
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 337
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: 337
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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 # include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 # include "incls/_c1_FrameMap.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 //-----------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // Convert method signature into an array of BasicTypes for the arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
33 BasicTypeArray* FrameMap::signature_type_array_for(const ciMethod* method) {
a61af66fc99e Initial load
duke
parents:
diff changeset
34 ciSignature* sig = method->signature();
a61af66fc99e Initial load
duke
parents:
diff changeset
35 BasicTypeList* sta = new BasicTypeList(method->arg_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // add receiver, if any
a61af66fc99e Initial load
duke
parents:
diff changeset
37 if (!method->is_static()) sta->append(T_OBJECT);
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // add remaining arguments
a61af66fc99e Initial load
duke
parents:
diff changeset
39 for (int i = 0; i < sig->count(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
40 ciType* type = sig->type_at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
41 BasicType t = type->basic_type();
a61af66fc99e Initial load
duke
parents:
diff changeset
42 if (t == T_ARRAY) {
a61af66fc99e Initial load
duke
parents:
diff changeset
43 t = T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
44 }
a61af66fc99e Initial load
duke
parents:
diff changeset
45 sta->append(t);
a61af66fc99e Initial load
duke
parents:
diff changeset
46 }
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // done
a61af66fc99e Initial load
duke
parents:
diff changeset
48 return sta;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 }
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 CallingConvention* FrameMap::java_calling_convention(const BasicTypeArray* signature, bool outgoing) {
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // compute the size of the arguments first. The signature array
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // that java_calling_convention takes includes a T_VOID after double
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // work items but our signatures do not.
a61af66fc99e Initial load
duke
parents:
diff changeset
56 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 int sizeargs = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 for (i = 0; i < signature->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
59 sizeargs += type2size[signature->at(i)];
a61af66fc99e Initial load
duke
parents:
diff changeset
60 }
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62 BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, sizeargs);
a61af66fc99e Initial load
duke
parents:
diff changeset
63 VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair, sizeargs);
a61af66fc99e Initial load
duke
parents:
diff changeset
64 int sig_index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 for (i = 0; i < sizeargs; i++, sig_index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
66 sig_bt[i] = signature->at(sig_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
67 if (sig_bt[i] == T_LONG || sig_bt[i] == T_DOUBLE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
68 sig_bt[i + 1] = T_VOID;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 i++;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 }
a61af66fc99e Initial load
duke
parents:
diff changeset
71 }
a61af66fc99e Initial load
duke
parents:
diff changeset
72
a61af66fc99e Initial load
duke
parents:
diff changeset
73 intptr_t out_preserve = SharedRuntime::java_calling_convention(sig_bt, regs, sizeargs, outgoing);
a61af66fc99e Initial load
duke
parents:
diff changeset
74 LIR_OprList* args = new LIR_OprList(signature->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
75 for (i = 0; i < sizeargs;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
76 BasicType t = sig_bt[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
77 assert(t != T_VOID, "should be skipping these");
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 LIR_Opr opr = map_to_opr(t, regs + i, outgoing);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 args->append(opr);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 if (opr->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
82 LIR_Address* addr = opr->as_address_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
83 assert(addr->disp() == (int)addr->disp(), "out of range value");
a61af66fc99e Initial load
duke
parents:
diff changeset
84 out_preserve = MAX2(out_preserve, (intptr_t)addr->disp() / 4);
a61af66fc99e Initial load
duke
parents:
diff changeset
85 }
a61af66fc99e Initial load
duke
parents:
diff changeset
86 i += type2size[t];
a61af66fc99e Initial load
duke
parents:
diff changeset
87 }
a61af66fc99e Initial load
duke
parents:
diff changeset
88 assert(args->length() == signature->length(), "size mismatch");
a61af66fc99e Initial load
duke
parents:
diff changeset
89 out_preserve += SharedRuntime::out_preserve_stack_slots();
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 if (outgoing) {
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // update the space reserved for arguments.
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1584
diff changeset
93 update_reserved_argument_area_size(out_preserve * BytesPerWord);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
94 }
a61af66fc99e Initial load
duke
parents:
diff changeset
95 return new CallingConvention(args, out_preserve);
a61af66fc99e Initial load
duke
parents:
diff changeset
96 }
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 CallingConvention* FrameMap::c_calling_convention(const BasicTypeArray* signature) {
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // compute the size of the arguments first. The signature array
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // that java_calling_convention takes includes a T_VOID after double
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // work items but our signatures do not.
a61af66fc99e Initial load
duke
parents:
diff changeset
103 int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 int sizeargs = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 for (i = 0; i < signature->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 sizeargs += type2size[signature->at(i)];
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, sizeargs);
a61af66fc99e Initial load
duke
parents:
diff changeset
110 VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair, sizeargs);
a61af66fc99e Initial load
duke
parents:
diff changeset
111 int sig_index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 for (i = 0; i < sizeargs; i++, sig_index++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
113 sig_bt[i] = signature->at(sig_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
114 if (sig_bt[i] == T_LONG || sig_bt[i] == T_DOUBLE) {
a61af66fc99e Initial load
duke
parents:
diff changeset
115 sig_bt[i + 1] = T_VOID;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 i++;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 }
a61af66fc99e Initial load
duke
parents:
diff changeset
118 }
a61af66fc99e Initial load
duke
parents:
diff changeset
119
a61af66fc99e Initial load
duke
parents:
diff changeset
120 intptr_t out_preserve = SharedRuntime::c_calling_convention(sig_bt, regs, sizeargs);
a61af66fc99e Initial load
duke
parents:
diff changeset
121 LIR_OprList* args = new LIR_OprList(signature->length());
a61af66fc99e Initial load
duke
parents:
diff changeset
122 for (i = 0; i < sizeargs;) {
a61af66fc99e Initial load
duke
parents:
diff changeset
123 BasicType t = sig_bt[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
124 assert(t != T_VOID, "should be skipping these");
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 // C calls are always outgoing
a61af66fc99e Initial load
duke
parents:
diff changeset
127 bool outgoing = true;
a61af66fc99e Initial load
duke
parents:
diff changeset
128 LIR_Opr opr = map_to_opr(t, regs + i, outgoing);
a61af66fc99e Initial load
duke
parents:
diff changeset
129 // they might be of different types if for instance floating point
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // values are passed in cpu registers, but the sizes must match.
a61af66fc99e Initial load
duke
parents:
diff changeset
131 assert(type2size[opr->type()] == type2size[t], "type mismatch");
a61af66fc99e Initial load
duke
parents:
diff changeset
132 args->append(opr);
a61af66fc99e Initial load
duke
parents:
diff changeset
133 if (opr->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
134 LIR_Address* addr = opr->as_address_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
135 out_preserve = MAX2(out_preserve, (intptr_t)addr->disp() / 4);
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 i += type2size[t];
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139 assert(args->length() == signature->length(), "size mismatch");
a61af66fc99e Initial load
duke
parents:
diff changeset
140 out_preserve += SharedRuntime::out_preserve_stack_slots();
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1584
diff changeset
141 update_reserved_argument_area_size(out_preserve * BytesPerWord);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
142 return new CallingConvention(args, out_preserve);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 }
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145
a61af66fc99e Initial load
duke
parents:
diff changeset
146 //--------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // FrameMap
a61af66fc99e Initial load
duke
parents:
diff changeset
148 //--------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 bool FrameMap::_init_done = false;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 Register FrameMap::_cpu_rnr2reg [FrameMap::nof_cpu_regs];
a61af66fc99e Initial load
duke
parents:
diff changeset
152 int FrameMap::_cpu_reg2rnr [FrameMap::nof_cpu_regs];
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155 FrameMap::FrameMap(ciMethod* method, int monitors, int reserved_argument_area_size) {
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
156 assert(_init_done, "should already be completed");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 _framesize = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 _num_spills = -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 assert(monitors >= 0, "not set");
a61af66fc99e Initial load
duke
parents:
diff changeset
162 _num_monitors = monitors;
a61af66fc99e Initial load
duke
parents:
diff changeset
163 assert(reserved_argument_area_size >= 0, "not set");
a61af66fc99e Initial load
duke
parents:
diff changeset
164 _reserved_argument_area_size = MAX2(4, reserved_argument_area_size) * BytesPerWord;
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 _argcount = method->arg_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
167 _argument_locations = new intArray(_argcount, -1);
a61af66fc99e Initial load
duke
parents:
diff changeset
168 _incoming_arguments = java_calling_convention(signature_type_array_for(method), false);
a61af66fc99e Initial load
duke
parents:
diff changeset
169 _oop_map_arg_count = _incoming_arguments->reserved_stack_slots();
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 int java_index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
172 for (int i = 0; i < _incoming_arguments->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 LIR_Opr opr = _incoming_arguments->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
174 if (opr->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
175 LIR_Address* address = opr->as_address_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
176 _argument_locations->at_put(java_index, address->disp() - STACK_BIAS);
a61af66fc99e Initial load
duke
parents:
diff changeset
177 _incoming_arguments->args()->at_put(i, LIR_OprFact::stack(java_index, as_BasicType(as_ValueType(address->type()))));
a61af66fc99e Initial load
duke
parents:
diff changeset
178 }
a61af66fc99e Initial load
duke
parents:
diff changeset
179 java_index += type2size[opr->type()];
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 }
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184
a61af66fc99e Initial load
duke
parents:
diff changeset
185 bool FrameMap::finalize_frame(int nof_slots) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 assert(nof_slots >= 0, "must be positive");
a61af66fc99e Initial load
duke
parents:
diff changeset
187 assert(_num_spills == -1, "can only be set once");
a61af66fc99e Initial load
duke
parents:
diff changeset
188 _num_spills = nof_slots;
a61af66fc99e Initial load
duke
parents:
diff changeset
189 assert(_framesize == -1, "should only be calculated once");
a61af66fc99e Initial load
duke
parents:
diff changeset
190 _framesize = round_to(in_bytes(sp_offset_for_monitor_base(0)) +
a61af66fc99e Initial load
duke
parents:
diff changeset
191 _num_monitors * sizeof(BasicObjectLock) +
a61af66fc99e Initial load
duke
parents:
diff changeset
192 sizeof(intptr_t) + // offset of deopt orig pc
a61af66fc99e Initial load
duke
parents:
diff changeset
193 frame_pad_in_bytes,
a61af66fc99e Initial load
duke
parents:
diff changeset
194 StackAlignmentInBytes) / 4;
a61af66fc99e Initial load
duke
parents:
diff changeset
195 int java_index = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
196 for (int i = 0; i < _incoming_arguments->length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 LIR_Opr opr = _incoming_arguments->at(i);
a61af66fc99e Initial load
duke
parents:
diff changeset
198 if (opr->is_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
199 _argument_locations->at_put(java_index, in_bytes(framesize_in_bytes()) +
a61af66fc99e Initial load
duke
parents:
diff changeset
200 _argument_locations->at(java_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
201 }
a61af66fc99e Initial load
duke
parents:
diff changeset
202 java_index += type2size[opr->type()];
a61af66fc99e Initial load
duke
parents:
diff changeset
203 }
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // make sure it's expressible on the platform
a61af66fc99e Initial load
duke
parents:
diff changeset
205 return validate_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 VMReg FrameMap::sp_offset2vmreg(ByteSize offset) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
209 int offset_in_bytes = in_bytes(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
210 assert(offset_in_bytes % 4 == 0, "must be multiple of 4 bytes");
a61af66fc99e Initial load
duke
parents:
diff changeset
211 assert(offset_in_bytes / 4 < framesize() + oop_map_arg_count(), "out of range");
a61af66fc99e Initial load
duke
parents:
diff changeset
212 return VMRegImpl::stack2reg(offset_in_bytes / 4);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215
a61af66fc99e Initial load
duke
parents:
diff changeset
216 bool FrameMap::location_for_sp_offset(ByteSize byte_offset_from_sp,
a61af66fc99e Initial load
duke
parents:
diff changeset
217 Location::Type loc_type,
a61af66fc99e Initial load
duke
parents:
diff changeset
218 Location* loc) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
219 int offset = in_bytes(byte_offset_from_sp);
a61af66fc99e Initial load
duke
parents:
diff changeset
220 assert(offset >= 0, "incorrect offset");
a61af66fc99e Initial load
duke
parents:
diff changeset
221 if (!Location::legal_offset_in_bytes(offset)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
222 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
223 }
a61af66fc99e Initial load
duke
parents:
diff changeset
224 Location tmp_loc = Location::new_stk_loc(loc_type, offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
225 *loc = tmp_loc;
a61af66fc99e Initial load
duke
parents:
diff changeset
226 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229
a61af66fc99e Initial load
duke
parents:
diff changeset
230 bool FrameMap::locations_for_slot (int index, Location::Type loc_type,
a61af66fc99e Initial load
duke
parents:
diff changeset
231 Location* loc, Location* second) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
232 ByteSize offset_from_sp = sp_offset_for_slot(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
233 if (!location_for_sp_offset(offset_from_sp, loc_type, loc)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
234 return false;
a61af66fc99e Initial load
duke
parents:
diff changeset
235 }
a61af66fc99e Initial load
duke
parents:
diff changeset
236 if (second != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 // two word item
a61af66fc99e Initial load
duke
parents:
diff changeset
238 offset_from_sp = offset_from_sp + in_ByteSize(4);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 return location_for_sp_offset(offset_from_sp, loc_type, second);
a61af66fc99e Initial load
duke
parents:
diff changeset
240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
241 return true;
a61af66fc99e Initial load
duke
parents:
diff changeset
242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 //////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
245 // Public accessors //
a61af66fc99e Initial load
duke
parents:
diff changeset
246 //////////////////////
a61af66fc99e Initial load
duke
parents:
diff changeset
247
a61af66fc99e Initial load
duke
parents:
diff changeset
248
a61af66fc99e Initial load
duke
parents:
diff changeset
249 ByteSize FrameMap::sp_offset_for_slot(const int index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 if (index < argcount()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 int offset = _argument_locations->at(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
252 assert(offset != -1, "not a memory argument");
a61af66fc99e Initial load
duke
parents:
diff changeset
253 assert(offset >= framesize() * 4, "argument inside of frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
254 return in_ByteSize(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
255 }
a61af66fc99e Initial load
duke
parents:
diff changeset
256 ByteSize offset = sp_offset_for_spill(index - argcount());
a61af66fc99e Initial load
duke
parents:
diff changeset
257 assert(in_bytes(offset) < framesize() * 4, "spill outside of frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
258 return offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
259 }
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261
a61af66fc99e Initial load
duke
parents:
diff changeset
262 ByteSize FrameMap::sp_offset_for_double_slot(const int index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 ByteSize offset = sp_offset_for_slot(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
264 if (index >= argcount()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
265 assert(in_bytes(offset) + 4 < framesize() * 4, "spill outside of frame");
a61af66fc99e Initial load
duke
parents:
diff changeset
266 }
a61af66fc99e Initial load
duke
parents:
diff changeset
267 return offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
268 }
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 ByteSize FrameMap::sp_offset_for_spill(const int index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
272 assert(index >= 0 && index < _num_spills, "out of range");
a61af66fc99e Initial load
duke
parents:
diff changeset
273 int offset = round_to(first_available_sp_in_frame + _reserved_argument_area_size, sizeof(double)) +
a61af66fc99e Initial load
duke
parents:
diff changeset
274 index * spill_slot_size_in_bytes;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 return in_ByteSize(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 }
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 ByteSize FrameMap::sp_offset_for_monitor_base(const int index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
279 int end_of_spills = round_to(first_available_sp_in_frame + _reserved_argument_area_size, sizeof(double)) +
a61af66fc99e Initial load
duke
parents:
diff changeset
280 _num_spills * spill_slot_size_in_bytes;
304
dc7f315e41f7 5108146: Merge i486 and amd64 cpu directories
never
parents: 0
diff changeset
281 int offset = (int) round_to(end_of_spills, HeapWordSize) + index * sizeof(BasicObjectLock);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
282 return in_ByteSize(offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284
a61af66fc99e Initial load
duke
parents:
diff changeset
285 ByteSize FrameMap::sp_offset_for_monitor_lock(int index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
286 check_monitor_index(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
287 return sp_offset_for_monitor_base(index) + in_ByteSize(BasicObjectLock::lock_offset_in_bytes());;
a61af66fc99e Initial load
duke
parents:
diff changeset
288 }
a61af66fc99e Initial load
duke
parents:
diff changeset
289
a61af66fc99e Initial load
duke
parents:
diff changeset
290 ByteSize FrameMap::sp_offset_for_monitor_object(int index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
291 check_monitor_index(index);
a61af66fc99e Initial load
duke
parents:
diff changeset
292 return sp_offset_for_monitor_base(index) + in_ByteSize(BasicObjectLock::obj_offset_in_bytes());
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 void FrameMap::print_frame_layout() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
296 int svar;
a61af66fc99e Initial load
duke
parents:
diff changeset
297 tty->print_cr("#####################################");
a61af66fc99e Initial load
duke
parents:
diff changeset
298 tty->print_cr("Frame size in words %d", framesize());
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300 if( _num_monitors > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
301 tty->print_cr("monitor [0]:%d | [%2d]:%d",
a61af66fc99e Initial load
duke
parents:
diff changeset
302 in_bytes(sp_offset_for_monitor_base(0)),
a61af66fc99e Initial load
duke
parents:
diff changeset
303 in_bytes(sp_offset_for_monitor_base(_num_monitors)));
a61af66fc99e Initial load
duke
parents:
diff changeset
304 }
a61af66fc99e Initial load
duke
parents:
diff changeset
305 if( _num_spills > 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
306 svar = _num_spills - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
307 if(svar == 0)
a61af66fc99e Initial load
duke
parents:
diff changeset
308 tty->print_cr("spill [0]:%d", in_bytes(sp_offset_for_spill(0)));
a61af66fc99e Initial load
duke
parents:
diff changeset
309 else
a61af66fc99e Initial load
duke
parents:
diff changeset
310 tty->print_cr("spill [0]:%d | [%2d]:%d", in_bytes(sp_offset_for_spill(0)),
a61af66fc99e Initial load
duke
parents:
diff changeset
311 svar,
a61af66fc99e Initial load
duke
parents:
diff changeset
312 in_bytes(sp_offset_for_spill(svar)));
a61af66fc99e Initial load
duke
parents:
diff changeset
313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // For OopMaps, map a local variable or spill index to an VMReg.
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // This is the offset from sp() in the frame of the slot for the index,
a61af66fc99e Initial load
duke
parents:
diff changeset
319 // skewed by SharedInfo::stack0 to indicate a stack location (vs.a register.)
a61af66fc99e Initial load
duke
parents:
diff changeset
320 //
a61af66fc99e Initial load
duke
parents:
diff changeset
321 // C ABI size +
a61af66fc99e Initial load
duke
parents:
diff changeset
322 // framesize + framesize +
a61af66fc99e Initial load
duke
parents:
diff changeset
323 // stack0 stack0 stack0 0 <- VMReg->value()
a61af66fc99e Initial load
duke
parents:
diff changeset
324 // | | | <registers> |
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // ..........|..............|..............|.............|
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // 0 1 2 3 | <C ABI area> | 4 5 6 ...... | <- local indices
a61af66fc99e Initial load
duke
parents:
diff changeset
327 // ^ ^ sp()
a61af66fc99e Initial load
duke
parents:
diff changeset
328 // | |
a61af66fc99e Initial load
duke
parents:
diff changeset
329 // arguments non-argument locals
a61af66fc99e Initial load
duke
parents:
diff changeset
330
a61af66fc99e Initial load
duke
parents:
diff changeset
331
a61af66fc99e Initial load
duke
parents:
diff changeset
332 VMReg FrameMap::regname(LIR_Opr opr) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
333 if (opr->is_single_cpu()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 assert(!opr->is_virtual(), "should not see virtual registers here");
a61af66fc99e Initial load
duke
parents:
diff changeset
335 return opr->as_register()->as_VMReg();
a61af66fc99e Initial load
duke
parents:
diff changeset
336 } else if (opr->is_single_stack()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
337 return sp_offset2vmreg(sp_offset_for_slot(opr->single_stack_ix()));
a61af66fc99e Initial load
duke
parents:
diff changeset
338 } else if (opr->is_address()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
339 LIR_Address* addr = opr->as_address_ptr();
a61af66fc99e Initial load
duke
parents:
diff changeset
340 assert(addr->base() == stack_pointer(), "sp based addressing only");
a61af66fc99e Initial load
duke
parents:
diff changeset
341 return sp_offset2vmreg(in_ByteSize(addr->index()->as_jint()));
a61af66fc99e Initial load
duke
parents:
diff changeset
342 }
a61af66fc99e Initial load
duke
parents:
diff changeset
343 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
344 return VMRegImpl::Bad();
a61af66fc99e Initial load
duke
parents:
diff changeset
345 }
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347
a61af66fc99e Initial load
duke
parents:
diff changeset
348
a61af66fc99e Initial load
duke
parents:
diff changeset
349
a61af66fc99e Initial load
duke
parents:
diff changeset
350 // ------------ extra spill slots ---------------