annotate src/share/vm/c1/c1_FrameMap.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 55fb97c4c58d
children 4ca6dc0799b6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
17467
55fb97c4c58d 8029233: Update copyright year to match last edit in jdk8 hotspot repository for 2013
mikael
parents: 8668
diff changeset
2 * Copyright (c) 2000, 2013, 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
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
79 max_nof_caller_save_cpu_regs = pd_nof_caller_save_cpu_regs_frame_map,
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
80 nof_caller_save_fpu_regs = pd_nof_caller_save_fpu_regs_frame_map,
0
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
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
91 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
92 # include "c1_FrameMap_arm.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
93 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
94 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
95 # include "c1_FrameMap_ppc.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 2002
diff changeset
96 #endif
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
97
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 friend class LIR_OprDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
100
a61af66fc99e Initial load
duke
parents:
diff changeset
101 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
102 static bool _init_done;
a61af66fc99e Initial load
duke
parents:
diff changeset
103 static Register _cpu_rnr2reg [nof_cpu_regs];
a61af66fc99e Initial load
duke
parents:
diff changeset
104 static int _cpu_reg2rnr [nof_cpu_regs];
a61af66fc99e Initial load
duke
parents:
diff changeset
105
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
106 static LIR_Opr _caller_save_cpu_regs [max_nof_caller_save_cpu_regs];
0
a61af66fc99e Initial load
duke
parents:
diff changeset
107 static LIR_Opr _caller_save_fpu_regs [nof_caller_save_fpu_regs];
a61af66fc99e Initial load
duke
parents:
diff changeset
108
a61af66fc99e Initial load
duke
parents:
diff changeset
109 int _framesize;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 int _argcount;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 int _num_monitors;
a61af66fc99e Initial load
duke
parents:
diff changeset
112 int _num_spills;
a61af66fc99e Initial load
duke
parents:
diff changeset
113 int _reserved_argument_area_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 int _oop_map_arg_count;
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 CallingConvention* _incoming_arguments;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 intArray* _argument_locations;
a61af66fc99e Initial load
duke
parents:
diff changeset
118
a61af66fc99e Initial load
duke
parents:
diff changeset
119 void check_spill_index (int spill_index) const { assert(spill_index >= 0, "bad index"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
120 void check_monitor_index (int monitor_index) const { assert(monitor_index >= 0 &&
a61af66fc99e Initial load
duke
parents:
diff changeset
121 monitor_index < _num_monitors, "bad index"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 static Register cpu_rnr2reg (int rnr) {
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(rnr);)
a61af66fc99e Initial load
duke
parents:
diff changeset
126 return _cpu_rnr2reg[rnr];
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 int cpu_reg2rnr (Register reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
130 assert(_init_done, "tables not initialized");
a61af66fc99e Initial load
duke
parents:
diff changeset
131 debug_only(cpu_range_check(reg->encoding());)
a61af66fc99e Initial load
duke
parents:
diff changeset
132 return _cpu_reg2rnr[reg->encoding()];
a61af66fc99e Initial load
duke
parents:
diff changeset
133 }
a61af66fc99e Initial load
duke
parents:
diff changeset
134
a61af66fc99e Initial load
duke
parents:
diff changeset
135 static void map_register(int rnr, Register reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 debug_only(cpu_range_check(rnr);)
a61af66fc99e Initial load
duke
parents:
diff changeset
137 debug_only(cpu_range_check(reg->encoding());)
a61af66fc99e Initial load
duke
parents:
diff changeset
138 _cpu_rnr2reg[rnr] = reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
139 _cpu_reg2rnr[reg->encoding()] = rnr;
a61af66fc99e Initial load
duke
parents:
diff changeset
140 }
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 void update_reserved_argument_area_size (int size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
143 assert(size >= 0, "check");
a61af66fc99e Initial load
duke
parents:
diff changeset
144 _reserved_argument_area_size = MAX2(_reserved_argument_area_size, size);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 }
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
148 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
149 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
150 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
151 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153
a61af66fc99e Initial load
duke
parents:
diff changeset
154 ByteSize sp_offset_for_monitor_base(const int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 Address make_new_address(ByteSize sp_offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 ByteSize sp_offset_for_slot(const int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
159 ByteSize sp_offset_for_double_slot(const int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
160 ByteSize sp_offset_for_spill(const int idx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
161 ByteSize sp_offset_for_monitor_lock(int monitor_index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
162 ByteSize sp_offset_for_monitor_object(int monitor_index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 VMReg sp_offset2vmreg(ByteSize offset) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // platform dependent hook used to check that frame is properly
a61af66fc99e Initial load
duke
parents:
diff changeset
167 // addressable on the platform. Used by sparc to verify that all
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // stack addresses are expressable in a simm13.
a61af66fc99e Initial load
duke
parents:
diff changeset
169 bool validate_frame();
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171 static LIR_Opr map_to_opr(BasicType type, VMRegPair* reg, bool incoming);
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
174 // Opr representing the stack_pointer on this platform
a61af66fc99e Initial load
duke
parents:
diff changeset
175 static LIR_Opr stack_pointer();
a61af66fc99e Initial load
duke
parents:
diff changeset
176
1564
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 0
diff changeset
177 // JSR 292
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 0
diff changeset
178 static LIR_Opr method_handle_invoke_SP_save_opr();
61b2245abf36 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 0
diff changeset
179
0
a61af66fc99e Initial load
duke
parents:
diff changeset
180 static BasicTypeArray* signature_type_array_for(const ciMethod* method);
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // for outgoing calls, these also update the reserved area to
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // include space for arguments and any ABI area.
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 2426
diff changeset
184 CallingConvention* c_calling_convention(const BasicTypeArray* signature);
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 2426
diff changeset
185 CallingConvention* java_calling_convention(const BasicTypeArray* signature, bool outgoing);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // deopt support
a61af66fc99e Initial load
duke
parents:
diff changeset
188 ByteSize sp_offset_for_orig_pc() { return sp_offset_for_monitor_base(_num_monitors); }
a61af66fc99e Initial load
duke
parents:
diff changeset
189
a61af66fc99e Initial load
duke
parents:
diff changeset
190 static LIR_Opr as_opr(Register r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
191 return LIR_OprFact::single_cpu(cpu_reg2rnr(r));
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193 static LIR_Opr as_oop_opr(Register r) {
a61af66fc99e Initial load
duke
parents:
diff changeset
194 return LIR_OprFact::single_cpu_oop(cpu_reg2rnr(r));
a61af66fc99e Initial load
duke
parents:
diff changeset
195 }
a61af66fc99e Initial load
duke
parents:
diff changeset
196
6739
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6266
diff changeset
197 static LIR_Opr as_metadata_opr(Register r) {
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6266
diff changeset
198 return LIR_OprFact::single_cpu_metadata(cpu_reg2rnr(r));
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6266
diff changeset
199 }
8a02ca5e5576 7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents: 6266
diff changeset
200
0
a61af66fc99e Initial load
duke
parents:
diff changeset
201 FrameMap(ciMethod* method, int monitors, int reserved_argument_area_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
202 bool finalize_frame(int nof_slots);
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 int reserved_argument_area_size () const { return _reserved_argument_area_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
205 int framesize () const { assert(_framesize != -1, "hasn't been calculated"); return _framesize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
206 ByteSize framesize_in_bytes () const { return in_ByteSize(framesize() * 4); }
a61af66fc99e Initial load
duke
parents:
diff changeset
207 int num_monitors () const { return _num_monitors; }
a61af66fc99e Initial load
duke
parents:
diff changeset
208 int num_spills () const { assert(_num_spills >= 0, "not set"); return _num_spills; }
a61af66fc99e Initial load
duke
parents:
diff changeset
209 int argcount () const { assert(_argcount >= 0, "not set"); return _argcount; }
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 int oop_map_arg_count() const { return _oop_map_arg_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
212
a61af66fc99e Initial load
duke
parents:
diff changeset
213 CallingConvention* incoming_arguments() const { return _incoming_arguments; }
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // convenience routines
a61af66fc99e Initial load
duke
parents:
diff changeset
216 Address address_for_slot(int index, int sp_adjust = 0) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
217 return make_new_address(sp_offset_for_slot(index) + in_ByteSize(sp_adjust));
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219 Address address_for_double_slot(int index, int sp_adjust = 0) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
220 return make_new_address(sp_offset_for_double_slot(index) + in_ByteSize(sp_adjust));
a61af66fc99e Initial load
duke
parents:
diff changeset
221 }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 Address address_for_monitor_lock(int monitor_index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
223 return make_new_address(sp_offset_for_monitor_lock(monitor_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
224 }
a61af66fc99e Initial load
duke
parents:
diff changeset
225 Address address_for_monitor_object(int monitor_index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
226 return make_new_address(sp_offset_for_monitor_object(monitor_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
227 }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // Creates Location describing desired slot and returns it via pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
230 // to Location object. Returns true if the stack frame offset was legal
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // (as defined by Location::legal_offset_in_bytes()), false otherwise.
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // Do not use the returned location if this returns false.
a61af66fc99e Initial load
duke
parents:
diff changeset
233 bool location_for_sp_offset(ByteSize byte_offset_from_sp,
a61af66fc99e Initial load
duke
parents:
diff changeset
234 Location::Type loc_type, Location* loc) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 bool location_for_monitor_lock (int monitor_index, Location* loc) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 return location_for_sp_offset(sp_offset_for_monitor_lock(monitor_index), Location::normal, loc);
a61af66fc99e Initial load
duke
parents:
diff changeset
238 }
a61af66fc99e Initial load
duke
parents:
diff changeset
239 bool location_for_monitor_object(int monitor_index, Location* loc) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
240 return location_for_sp_offset(sp_offset_for_monitor_object(monitor_index), Location::oop, loc);
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242 bool locations_for_slot (int index, Location::Type loc_type,
a61af66fc99e Initial load
duke
parents:
diff changeset
243 Location* loc, Location* second = NULL) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 VMReg slot_regname(int index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
246 return sp_offset2vmreg(sp_offset_for_slot(index));
a61af66fc99e Initial load
duke
parents:
diff changeset
247 }
a61af66fc99e Initial load
duke
parents:
diff changeset
248 VMReg monitor_object_regname(int monitor_index) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
249 return sp_offset2vmreg(sp_offset_for_monitor_object(monitor_index));
a61af66fc99e Initial load
duke
parents:
diff changeset
250 }
a61af66fc99e Initial load
duke
parents:
diff changeset
251 VMReg regname(LIR_Opr opr) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
252
a61af66fc99e Initial load
duke
parents:
diff changeset
253 static LIR_Opr caller_save_cpu_reg_at(int i) {
2002
ac637b7220d1 6985015: C1 needs to support compressed oops
iveresov
parents: 1972
diff changeset
254 assert(i >= 0 && i < max_nof_caller_save_cpu_regs, "out of bounds");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
255 return _caller_save_cpu_regs[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
256 }
a61af66fc99e Initial load
duke
parents:
diff changeset
257
a61af66fc99e Initial load
duke
parents:
diff changeset
258 static LIR_Opr caller_save_fpu_reg_at(int i) {
a61af66fc99e Initial load
duke
parents:
diff changeset
259 assert(i >= 0 && i < nof_caller_save_fpu_regs, "out of bounds");
a61af66fc99e Initial load
duke
parents:
diff changeset
260 return _caller_save_fpu_regs[i];
a61af66fc99e Initial load
duke
parents:
diff changeset
261 }
a61af66fc99e Initial load
duke
parents:
diff changeset
262
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1579
diff changeset
263 static void initialize();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
264 };
a61af66fc99e Initial load
duke
parents:
diff changeset
265
a61af66fc99e Initial load
duke
parents:
diff changeset
266 // CallingConvention
a61af66fc99e Initial load
duke
parents:
diff changeset
267 //--------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
268
a61af66fc99e Initial load
duke
parents:
diff changeset
269 class CallingConvention: public ResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
271 LIR_OprList* _args;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 int _reserved_stack_slots;
a61af66fc99e Initial load
duke
parents:
diff changeset
273
a61af66fc99e Initial load
duke
parents:
diff changeset
274 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
275 CallingConvention (LIR_OprList* args, int reserved_stack_slots)
a61af66fc99e Initial load
duke
parents:
diff changeset
276 : _args(args)
a61af66fc99e Initial load
duke
parents:
diff changeset
277 , _reserved_stack_slots(reserved_stack_slots) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 LIR_OprList* args() { return _args; }
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 LIR_Opr at(int i) const { return _args->at(i); }
a61af66fc99e Initial load
duke
parents:
diff changeset
282 int length() const { return _args->length(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // Indicates number of real frame slots used by arguments passed on stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
285 int reserved_stack_slots() const { return _reserved_stack_slots; }
a61af66fc99e Initial load
duke
parents:
diff changeset
286
a61af66fc99e Initial load
duke
parents:
diff changeset
287 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
288 void print () const {
a61af66fc99e Initial load
duke
parents:
diff changeset
289 for (int i = 0; i < length(); i++) {
a61af66fc99e Initial load
duke
parents:
diff changeset
290 at(i)->print();
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292 }
a61af66fc99e Initial load
duke
parents:
diff changeset
293 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
294 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
295
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1681
diff changeset
296 #endif // SHARE_VM_C1_C1_FRAMEMAP_HPP