annotate src/share/vm/c1/c1_FrameMap.hpp @ 1994:6cd6d394f280

7001033: assert(gch->gc_cause() == GCCause::_scavenge_alot || !gch->incremental_collection_failed()) 7002546: regression on SpecJbb2005 on 7b118 comparing to 7b117 on small heaps Summary: Relaxed assertion checking related to incremental_collection_failed flag to allow for ExplicitGCInvokesConcurrent behaviour where we do not want a failing scavenge to bail to a stop-world collection. Parameterized incremental_collection_will_fail() so we can selectively use, or not use, as appropriate, the statistical prediction at specific use sites. This essentially reverts the scavenge bail-out logic to what it was prior to some recent changes that had inadvertently started using the statistical prediction which can be noisy in the presence of bursty loads. Added some associated verbose non-product debugging messages. Reviewed-by: johnc, tonyp
author ysr
date Tue, 07 Dec 2010 21:55:53 -0800
parents f95d63e2154a
children ac637b7220d1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1579
jrose
parents: 1552 1564
diff changeset
2 * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
25 #ifndef SHARE_VM_C1_C1_FRAMEMAP_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
26 #define SHARE_VM_C1_C1_FRAMEMAP_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
28 #include "asm/assembler.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
29 #include "c1/c1_Defs.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
30 #include "c1/c1_LIR.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
31 #include "code/vmreg.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
32 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
33 #include "runtime/frame.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
34 #include "runtime/synchronizer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
35 #include "utilities/globalDefinitions.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
36
0
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class ciMethod;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 class CallingConvention;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 class BasicTypeArray;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 class BasicTypeList;
a61af66fc99e Initial load
duke
parents:
diff changeset
41
a61af66fc99e Initial load
duke
parents:
diff changeset
42 //--------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // FrameMap
a61af66fc99e Initial load
duke
parents:
diff changeset
44 //--------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // This class is responsible of mapping items (locals, monitors, spill
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // slots and registers to their frame location
a61af66fc99e Initial load
duke
parents:
diff changeset
48 //
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // The monitors are specified by a consecutive index, although each monitor entry
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // occupies two words. The monitor_index is 0.._num_monitors
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // The spill index is similar to local index; it is in range 0..(open)
a61af66fc99e Initial load
duke
parents:
diff changeset
52 //
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // The CPU registers are mapped using a fixed table; register with number 0
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // is the most used one.
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // stack grow direction --> SP
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // +----------+---+----------+-------+------------------------+-----+
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // |arguments | x | monitors | spill | reserved argument area | ABI |
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // +----------+---+----------+-------+------------------------+-----+
a61af66fc99e Initial load
duke
parents:
diff changeset
61 //
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // x = ABI area (SPARC) or return adress and link (i486)
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // ABI = ABI area (SPARC) or nothing (i486)
a61af66fc99e Initial load
duke
parents:
diff changeset
64
a61af66fc99e Initial load
duke
parents:
diff changeset
65
a61af66fc99e Initial load
duke
parents:
diff changeset
66 class LIR_OprDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 typedef LIR_OprDesc* LIR_Opr;
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69
a61af66fc99e Initial load
duke
parents:
diff changeset
70 class FrameMap : public CompilationResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
71 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
72 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
73 nof_cpu_regs = pd_nof_cpu_regs_frame_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
74 nof_fpu_regs = pd_nof_fpu_regs_frame_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 nof_cpu_regs_reg_alloc = pd_nof_cpu_regs_reg_alloc,
a61af66fc99e Initial load
duke
parents:
diff changeset
77 nof_fpu_regs_reg_alloc = pd_nof_fpu_regs_reg_alloc,
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 nof_caller_save_cpu_regs = pd_nof_caller_save_cpu_regs_frame_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
80 nof_caller_save_fpu_regs = pd_nof_caller_save_fpu_regs_frame_map,
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 spill_slot_size_in_bytes = 4
a61af66fc99e Initial load
duke
parents:
diff changeset
83 };
a61af66fc99e Initial load
duke
parents:
diff changeset
84
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
85 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
86 # include "c1_FrameMap_x86.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
87 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
88 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
89 # include "c1_FrameMap_sparc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
90 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
91
0
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 friend class LIR_OprDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
96 static bool _init_done;
a61af66fc99e Initial load
duke
parents:
diff changeset
97 static Register _cpu_rnr2reg [nof_cpu_regs];
a61af66fc99e Initial load
duke
parents:
diff changeset
98 static int _cpu_reg2rnr [nof_cpu_regs];
a61af66fc99e Initial load
duke
parents:
diff changeset
99
a61af66fc99e Initial load
duke
parents:
diff changeset
100 static LIR_Opr _caller_save_cpu_regs [nof_caller_save_cpu_regs];
a61af66fc99e Initial load
duke
parents:
diff changeset
101 static LIR_Opr _caller_save_fpu_regs [nof_caller_save_fpu_regs];
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 int _framesize;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 int _argcount;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 int _num_monitors;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 int _num_spills;
a61af66fc99e Initial load
duke
parents:
diff changeset
107 int _reserved_argument_area_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 int _oop_map_arg_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 CallingConvention* _incoming_arguments;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 intArray* _argument_locations;
a61af66fc99e Initial load
duke
parents:
diff changeset
112
a61af66fc99e Initial load
duke
parents:
diff changeset
113 void check_spill_index (int spill_index) const { assert(spill_index >= 0, "bad index"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
114 void check_monitor_index (int monitor_index) const { assert(monitor_index >= 0 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
115 monitor_index < _num_monitors, "bad index"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 static Register cpu_rnr2reg (int rnr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 assert(_init_done, "tables not initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
119 debug_only(cpu_range_check(rnr);)
a61af66fc99e Initial load
duke
parents:
diff changeset
120 return _cpu_rnr2reg[rnr];
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 static int cpu_reg2rnr (Register reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 assert(_init_done, "tables not initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
125 debug_only(cpu_range_check(reg->encoding());)
a61af66fc99e Initial load
duke
parents:
diff changeset
126 return _cpu_reg2rnr[reg->encoding()];
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 static void map_register(int rnr, Register reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
130 debug_only(cpu_range_check(rnr);)
a61af66fc99e Initial load
duke
parents:
diff changeset
131 debug_only(cpu_range_check(reg->encoding());)
a61af66fc99e Initial load
duke
parents:
diff changeset
132 _cpu_rnr2reg[rnr] = reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
133 _cpu_reg2rnr[reg->encoding()] = rnr;
a61af66fc99e Initial load
duke
parents:
diff changeset
134 }
a61af66fc99e Initial load
duke
parents:
diff changeset
135
a61af66fc99e Initial load
duke
parents:
diff changeset
136 void update_reserved_argument_area_size (int size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
137 assert(size >= 0, "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
138 _reserved_argument_area_size = MAX2(_reserved_argument_area_size, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
139 }
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
142 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
143 static void cpu_range_check (int rnr) { assert(0 <= rnr && rnr < nof_cpu_regs, "cpu register number is too big"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
144 static void fpu_range_check (int rnr) { assert(0 <= rnr && rnr < nof_fpu_regs, "fpu register number is too big"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
145 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147
a61af66fc99e Initial load
duke
parents:
diff changeset
148 ByteSize sp_offset_for_monitor_base(const int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 Address make_new_address(ByteSize sp_offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
151
a61af66fc99e Initial load
duke
parents:
diff changeset
152 ByteSize sp_offset_for_slot(const int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 ByteSize sp_offset_for_double_slot(const int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 ByteSize sp_offset_for_spill(const int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
155 ByteSize sp_offset_for_monitor_lock(int monitor_index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
156 ByteSize sp_offset_for_monitor_object(int monitor_index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 VMReg sp_offset2vmreg(ByteSize offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // platform dependent hook used to check that frame is properly
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // addressable on the platform. Used by sparc to verify that all
a61af66fc99e Initial load
duke
parents:
diff changeset
162 // stack addresses are expressable in a simm13.
a61af66fc99e Initial load
duke
parents:
diff changeset
163 bool validate_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 static LIR_Opr map_to_opr(BasicType type, VMRegPair* reg, bool incoming);
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // Opr representing the stack_pointer on this platform
a61af66fc99e Initial load
duke
parents:
diff changeset
169 static LIR_Opr stack_pointer();
a61af66fc99e Initial load
duke
parents:
diff changeset
170
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 0
diff changeset
171 // JSR 292
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 0
diff changeset
172 static LIR_Opr method_handle_invoke_SP_save_opr();
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 0
diff changeset
173
0
a61af66fc99e Initial load
duke
parents:
diff changeset
174 static BasicTypeArray* signature_type_array_for(const ciMethod* method);
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // for outgoing calls, these also update the reserved area to
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // include space for arguments and any ABI area.
a61af66fc99e Initial load
duke
parents:
diff changeset
178 CallingConvention* c_calling_convention (const BasicTypeArray* signature);
a61af66fc99e Initial load
duke
parents:
diff changeset
179 CallingConvention* java_calling_convention (const BasicTypeArray* signature, bool outgoing);
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 // deopt support
a61af66fc99e Initial load
duke
parents:
diff changeset
182 ByteSize sp_offset_for_orig_pc() { return sp_offset_for_monitor_base(_num_monitors); }
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 static LIR_Opr as_opr(Register r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
185 return LIR_OprFact::single_cpu(cpu_reg2rnr(r));
a61af66fc99e Initial load
duke
parents:
diff changeset
186 }
a61af66fc99e Initial load
duke
parents:
diff changeset
187 static LIR_Opr as_oop_opr(Register r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
188 return LIR_OprFact::single_cpu_oop(cpu_reg2rnr(r));
a61af66fc99e Initial load
duke
parents:
diff changeset
189 }
a61af66fc99e Initial load
duke
parents:
diff changeset
190
a61af66fc99e Initial load
duke
parents:
diff changeset
191 FrameMap(ciMethod* method, int monitors, int reserved_argument_area_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
192 bool finalize_frame(int nof_slots);
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 int reserved_argument_area_size () const { return _reserved_argument_area_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
195 int framesize () const { assert(_framesize != -1, "hasn't been calculated"); return _framesize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
196 ByteSize framesize_in_bytes () const { return in_ByteSize(framesize() * 4); }
a61af66fc99e Initial load
duke
parents:
diff changeset
197 int num_monitors () const { return _num_monitors; }
a61af66fc99e Initial load
duke
parents:
diff changeset
198 int num_spills () const { assert(_num_spills >= 0, "not set"); return _num_spills; }
a61af66fc99e Initial load
duke
parents:
diff changeset
199 int argcount () const { assert(_argcount >= 0, "not set"); return _argcount; }
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 int oop_map_arg_count() const { return _oop_map_arg_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
202
a61af66fc99e Initial load
duke
parents:
diff changeset
203 CallingConvention* incoming_arguments() const { return _incoming_arguments; }
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 // convenience routines
a61af66fc99e Initial load
duke
parents:
diff changeset
206 Address address_for_slot(int index, int sp_adjust = 0) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 return make_new_address(sp_offset_for_slot(index) + in_ByteSize(sp_adjust));
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209 Address address_for_double_slot(int index, int sp_adjust = 0) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
210 return make_new_address(sp_offset_for_double_slot(index) + in_ByteSize(sp_adjust));
a61af66fc99e Initial load
duke
parents:
diff changeset
211 }
a61af66fc99e Initial load
duke
parents:
diff changeset
212 Address address_for_monitor_lock(int monitor_index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
213 return make_new_address(sp_offset_for_monitor_lock(monitor_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }
a61af66fc99e Initial load
duke
parents:
diff changeset
215 Address address_for_monitor_object(int monitor_index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 return make_new_address(sp_offset_for_monitor_object(monitor_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
217 }
a61af66fc99e Initial load
duke
parents:
diff changeset
218
a61af66fc99e Initial load
duke
parents:
diff changeset
219 void print_frame_layout() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // Creates Location describing desired slot and returns it via pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // to Location object. Returns true if the stack frame offset was legal
a61af66fc99e Initial load
duke
parents:
diff changeset
223 // (as defined by Location::legal_offset_in_bytes()), false otherwise.
a61af66fc99e Initial load
duke
parents:
diff changeset
224 // Do not use the returned location if this returns false.
a61af66fc99e Initial load
duke
parents:
diff changeset
225 bool location_for_sp_offset(ByteSize byte_offset_from_sp,
a61af66fc99e Initial load
duke
parents:
diff changeset
226 Location::Type loc_type, Location* loc) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
227
a61af66fc99e Initial load
duke
parents:
diff changeset
228 bool location_for_monitor_lock (int monitor_index, Location* loc) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
229 return location_for_sp_offset(sp_offset_for_monitor_lock(monitor_index), Location::normal, loc);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 }
a61af66fc99e Initial load
duke
parents:
diff changeset
231 bool location_for_monitor_object(int monitor_index, Location* loc) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
232 return location_for_sp_offset(sp_offset_for_monitor_object(monitor_index), Location::oop, loc);
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234 bool locations_for_slot (int index, Location::Type loc_type,
a61af66fc99e Initial load
duke
parents:
diff changeset
235 Location* loc, Location* second = NULL) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237 VMReg slot_regname(int index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 return sp_offset2vmreg(sp_offset_for_slot(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
239 }
a61af66fc99e Initial load
duke
parents:
diff changeset
240 VMReg monitor_object_regname(int monitor_index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
241 return sp_offset2vmreg(sp_offset_for_monitor_object(monitor_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
243 VMReg regname(LIR_Opr opr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 static LIR_Opr caller_save_cpu_reg_at(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 assert(i >= 0 && i < nof_caller_save_cpu_regs, "out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
247 return _caller_save_cpu_regs[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
248 }
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 static LIR_Opr caller_save_fpu_reg_at(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
251 assert(i >= 0 && i < nof_caller_save_fpu_regs, "out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
252 return _caller_save_fpu_regs[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
253 }
a61af66fc99e Initial load
duke
parents:
diff changeset
254
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1579
diff changeset
255 static void initialize();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
256 };
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 // CallingConvention
a61af66fc99e Initial load
duke
parents:
diff changeset
259 //--------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 class CallingConvention: public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
263 LIR_OprList* _args;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 int _reserved_stack_slots;
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
267 CallingConvention (LIR_OprList* args, int reserved_stack_slots)
a61af66fc99e Initial load
duke
parents:
diff changeset
268 : _args(args)
a61af66fc99e Initial load
duke
parents:
diff changeset
269 , _reserved_stack_slots(reserved_stack_slots) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 LIR_OprList* args() { return _args; }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 LIR_Opr at(int i) const { return _args->at(i); }
a61af66fc99e Initial load
duke
parents:
diff changeset
274 int length() const { return _args->length(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
275
a61af66fc99e Initial load
duke
parents:
diff changeset
276 // Indicates number of real frame slots used by arguments passed on stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
277 int reserved_stack_slots() const { return _reserved_stack_slots; }
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
280 void print () const {
a61af66fc99e Initial load
duke
parents:
diff changeset
281 for (int i = 0; i < length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
282 at(i)->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
283 }
a61af66fc99e Initial load
duke
parents:
diff changeset
284 }
a61af66fc99e Initial load
duke
parents:
diff changeset
285 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
286 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
287
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
288 #endif // SHARE_VM_C1_C1_FRAMEMAP_HPP