Mercurial > hg > graal-compiler
comparison src/cpu/ppc/vm/frame_ppc.hpp @ 14684:e5e8aa897002
8035647: PPC64: Support for elf v2 abi.
Summary: ELFv2 ABI used by the little endian PowerPC64 on Linux.
Reviewed-by: kvn
Contributed-by: asmundak@google.com
author | goetz |
---|---|
date | Thu, 06 Mar 2014 10:55:28 -0800 |
parents | 67fa91961822 |
children | 58cf34613a72 |
comparison
equal
deleted
inserted
replaced
14682:84eafecdb9a9 | 14684:e5e8aa897002 |
---|---|
48 // [C_FRAME] <-- SP before prolog | 48 // [C_FRAME] <-- SP before prolog |
49 // ... | 49 // ... |
50 // [C_FRAME] | 50 // [C_FRAME] |
51 // | 51 // |
52 // C_FRAME: | 52 // C_FRAME: |
53 // 0 [ABI_112] | 53 // 0 [ABI_REG_ARGS] |
54 // 112 CARG_9: outgoing arg 9 (arg_1 ... arg_8 via gpr_3 ... gpr_{10}) | 54 // 112 CARG_9: outgoing arg 9 (arg_1 ... arg_8 via gpr_3 ... gpr_{10}) |
55 // ... | 55 // ... |
56 // 40+M*8 CARG_M: outgoing arg M (M is the maximum of outgoing args taken over all call sites in the procedure) | 56 // 40+M*8 CARG_M: outgoing arg M (M is the maximum of outgoing args taken over all call sites in the procedure) |
57 // local 1 | 57 // local 1 |
58 // ... | 58 // ... |
75 // 16 space for link register (LR) for next call | 75 // 16 space for link register (LR) for next call |
76 // 24 reserved | 76 // 24 reserved |
77 // 32 reserved | 77 // 32 reserved |
78 // 40 space for TOC (=R2) register for next call | 78 // 40 space for TOC (=R2) register for next call |
79 // | 79 // |
80 // ABI_112: | 80 // ABI_REG_ARGS: |
81 // 0 [ABI_48] | 81 // 0 [ABI_48] |
82 // 48 CARG_1: spill slot for outgoing arg 1. used by next callee. | 82 // 48 CARG_1: spill slot for outgoing arg 1. used by next callee. |
83 // ... ... | 83 // ... ... |
84 // 104 CARG_8: spill slot for outgoing arg 8. used by next callee. | 84 // 104 CARG_8: spill slot for outgoing arg 8. used by next callee. |
85 // | 85 // |
93 alignment_in_bytes = 16, | 93 alignment_in_bytes = 16, |
94 // log_2(16*8 bits) = 7. | 94 // log_2(16*8 bits) = 7. |
95 log_2_of_alignment_in_bits = 7 | 95 log_2_of_alignment_in_bits = 7 |
96 }; | 96 }; |
97 | 97 |
98 // ABI_48: | 98 // ABI_MINFRAME: |
99 struct abi_48 { | 99 struct abi_minframe { |
100 uint64_t callers_sp; | 100 uint64_t callers_sp; |
101 uint64_t cr; //_16 | 101 uint64_t cr; //_16 |
102 uint64_t lr; | 102 uint64_t lr; |
103 #if !defined(ABI_ELFv2) | |
103 uint64_t reserved1; //_16 | 104 uint64_t reserved1; //_16 |
104 uint64_t reserved2; | 105 uint64_t reserved2; |
106 #endif | |
105 uint64_t toc; //_16 | 107 uint64_t toc; //_16 |
106 // nothing to add here! | 108 // nothing to add here! |
107 // aligned to frame::alignment_in_bytes (16) | 109 // aligned to frame::alignment_in_bytes (16) |
108 }; | 110 }; |
109 | 111 |
110 enum { | 112 enum { |
111 abi_48_size = sizeof(abi_48) | 113 abi_minframe_size = sizeof(abi_minframe) |
112 }; | 114 }; |
113 | 115 |
114 struct abi_112 : abi_48 { | 116 struct abi_reg_args : abi_minframe { |
115 uint64_t carg_1; | 117 uint64_t carg_1; |
116 uint64_t carg_2; //_16 | 118 uint64_t carg_2; //_16 |
117 uint64_t carg_3; | 119 uint64_t carg_3; |
118 uint64_t carg_4; //_16 | 120 uint64_t carg_4; //_16 |
119 uint64_t carg_5; | 121 uint64_t carg_5; |
122 uint64_t carg_8; //_16 | 124 uint64_t carg_8; //_16 |
123 // aligned to frame::alignment_in_bytes (16) | 125 // aligned to frame::alignment_in_bytes (16) |
124 }; | 126 }; |
125 | 127 |
126 enum { | 128 enum { |
127 abi_112_size = sizeof(abi_112) | 129 abi_reg_args_size = sizeof(abi_reg_args) |
128 }; | 130 }; |
129 | 131 |
130 #define _abi(_component) \ | 132 #define _abi(_component) \ |
131 (offset_of(frame::abi_112, _component)) | 133 (offset_of(frame::abi_reg_args, _component)) |
132 | 134 |
133 struct abi_112_spill : abi_112 { | 135 struct abi_reg_args_spill : abi_reg_args { |
134 // additional spill slots | 136 // additional spill slots |
135 uint64_t spill_ret; | 137 uint64_t spill_ret; |
136 uint64_t spill_fret; //_16 | 138 uint64_t spill_fret; //_16 |
137 // aligned to frame::alignment_in_bytes (16) | 139 // aligned to frame::alignment_in_bytes (16) |
138 }; | 140 }; |
139 | 141 |
140 enum { | 142 enum { |
141 abi_112_spill_size = sizeof(abi_112_spill) | 143 abi_reg_args_spill_size = sizeof(abi_reg_args_spill) |
142 }; | 144 }; |
143 | 145 |
144 #define _abi_112_spill(_component) \ | 146 #define _abi_reg_args_spill(_component) \ |
145 (offset_of(frame::abi_112_spill, _component)) | 147 (offset_of(frame::abi_reg_args_spill, _component)) |
146 | 148 |
147 // non-volatile GPRs: | 149 // non-volatile GPRs: |
148 | 150 |
149 struct spill_nonvolatiles { | 151 struct spill_nonvolatiles { |
150 uint64_t r14; | 152 uint64_t r14; |
240 // [callee's locals w/o arguments] | 242 // [callee's locals w/o arguments] |
241 // [outgoing arguments] | 243 // [outgoing arguments] |
242 // [ENTRY_FRAME_LOCALS] | 244 // [ENTRY_FRAME_LOCALS] |
243 // | 245 // |
244 // PARENT_IJAVA_FRAME_ABI: | 246 // PARENT_IJAVA_FRAME_ABI: |
245 // 0 [ABI_48] | 247 // 0 [ABI_MINFRAME] |
246 // top_frame_sp | 248 // top_frame_sp |
247 // initial_caller_sp | 249 // initial_caller_sp |
248 // | 250 // |
249 // TOP_IJAVA_FRAME_ABI: | 251 // TOP_IJAVA_FRAME_ABI: |
250 // 0 [PARENT_IJAVA_FRAME_ABI] | 252 // 0 [PARENT_IJAVA_FRAME_ABI] |
256 // frame_manager_lr | 258 // frame_manager_lr |
257 // | 259 // |
258 | 260 |
259 // PARENT_IJAVA_FRAME_ABI | 261 // PARENT_IJAVA_FRAME_ABI |
260 | 262 |
261 struct parent_ijava_frame_abi : abi_48 { | 263 struct parent_ijava_frame_abi : abi_minframe { |
262 // SOE registers. | 264 // SOE registers. |
263 // C2i adapters spill their top-frame stack-pointer here. | 265 // C2i adapters spill their top-frame stack-pointer here. |
264 uint64_t top_frame_sp; // carg_1 | 266 uint64_t top_frame_sp; // carg_1 |
265 // Sp of calling compiled frame before it was resized by the c2i | 267 // Sp of calling compiled frame before it was resized by the c2i |
266 // adapter or sp of call stub. Does not contain a valid value for | 268 // adapter or sp of call stub. Does not contain a valid value for |
283 uint64_t card_4_unused; //_16 carg_4 | 285 uint64_t card_4_unused; //_16 carg_4 |
284 uint64_t carg_5_unused; // carg_5 | 286 uint64_t carg_5_unused; // carg_5 |
285 uint64_t carg_6_unused; //_16 carg_6 | 287 uint64_t carg_6_unused; //_16 carg_6 |
286 uint64_t carg_7_unused; // carg_7 | 288 uint64_t carg_7_unused; // carg_7 |
287 // Use arg8 for storing frame_manager_lr. The size of | 289 // Use arg8 for storing frame_manager_lr. The size of |
288 // top_ijava_frame_abi must match abi_112. | 290 // top_ijava_frame_abi must match abi_reg_args. |
289 uint64_t frame_manager_lr; //_16 carg_8 | 291 uint64_t frame_manager_lr; //_16 carg_8 |
290 // nothing to add here! | 292 // nothing to add here! |
291 // aligned to frame::alignment_in_bytes (16) | 293 // aligned to frame::alignment_in_bytes (16) |
292 }; | 294 }; |
293 | 295 |
393 | 395 |
394 // Accessors for fields | 396 // Accessors for fields |
395 intptr_t* fp() const { return _fp; } | 397 intptr_t* fp() const { return _fp; } |
396 | 398 |
397 // Accessors for ABIs | 399 // Accessors for ABIs |
398 inline abi_48* own_abi() const { return (abi_48*) _sp; } | 400 inline abi_minframe* own_abi() const { return (abi_minframe*) _sp; } |
399 inline abi_48* callers_abi() const { return (abi_48*) _fp; } | 401 inline abi_minframe* callers_abi() const { return (abi_minframe*) _fp; } |
400 | 402 |
401 private: | 403 private: |
402 | 404 |
403 // Find codeblob and set deopt_state. | 405 // Find codeblob and set deopt_state. |
404 inline void find_codeblob_and_set_pc_and_deopt_state(address pc); | 406 inline void find_codeblob_and_set_pc_and_deopt_state(address pc); |