< prev index next >

src/hotspot/cpu/ppc/frame_ppc.hpp

Print this page
rev 55858 : 8228649: [PPC64] SA reads wrong slots from interpreter frames
Summary: Make frame layout consistent between dbg and product build and implement offsets accordingly.
Reviewed-by: goetz, gromero


 233   };
 234 
 235   enum {
 236     parent_ijava_frame_abi_size = sizeof(parent_ijava_frame_abi)
 237   };
 238 
 239 #define _parent_ijava_frame_abi(_component) \
 240         (offset_of(frame::parent_ijava_frame_abi, _component))
 241 
 242   struct top_ijava_frame_abi : abi_reg_args {
 243   };
 244 
 245   enum {
 246     top_ijava_frame_abi_size = sizeof(top_ijava_frame_abi)
 247   };
 248 
 249 #define _top_ijava_frame_abi(_component) \
 250         (offset_of(frame::top_ijava_frame_abi, _component))
 251 
 252   struct ijava_state {
 253 #ifdef ASSERT
 254     uint64_t ijava_reserved; // Used for assertion.
 255 #endif
 256     uint64_t method;
 257     uint64_t mirror;
 258     uint64_t locals;
 259     uint64_t monitors;
 260     uint64_t cpoolCache;
 261     uint64_t bcp;
 262     uint64_t esp;
 263     uint64_t mdx;
 264     uint64_t top_frame_sp; // Maybe define parent_frame_abi and move there.
 265     uint64_t sender_sp;
 266     // Slots only needed for native calls. Maybe better to move elsewhere.
 267     uint64_t oop_tmp;
 268     uint64_t lresult;
 269     uint64_t fresult;
 270   };
 271 
 272   enum {
 273     ijava_state_size = sizeof(ijava_state)
 274   };
 275 


 391 
 392   intptr_t* compiled_sender_sp(CodeBlob* cb) const;
 393   address*  compiled_sender_pc_addr(CodeBlob* cb) const;
 394   address*  sender_pc_addr(void) const;
 395 
 396  public:
 397 
 398   inline ijava_state* get_ijava_state() const;
 399   // Some convenient register frame setters/getters for deoptimization.
 400   inline intptr_t* interpreter_frame_esp() const;
 401   inline void interpreter_frame_set_cpcache(ConstantPoolCache* cp);
 402   inline void interpreter_frame_set_esp(intptr_t* esp);
 403   inline void interpreter_frame_set_top_frame_sp(intptr_t* top_frame_sp);
 404   inline void interpreter_frame_set_sender_sp(intptr_t* sender_sp);
 405 
 406   // Size of a monitor in bytes.
 407   static int interpreter_frame_monitor_size_in_bytes();
 408 
 409   // The size of a cInterpreter object.
 410   static inline int interpreter_frame_cinterpreterstate_size_in_bytes();
 411 
 412  private:
 413 
 414   ConstantPoolCache** interpreter_frame_cpoolcache_addr() const;
 415 
 416  public:
 417 
 418   // Additional interface for entry frames:
 419   inline entry_frame_locals* get_entry_frame_locals() const {
 420     return (entry_frame_locals*) (((address) fp()) - entry_frame_locals_size);
 421   }
 422 
 423   enum {
 424     // normal return address is 1 bundle past PC
 425     pc_return_offset = 0
 426   };
 427 
 428   static jint interpreter_frame_expression_stack_direction() { return -1; }
 429 
 430 #endif // CPU_PPC_FRAME_PPC_HPP


 233   };
 234 
 235   enum {
 236     parent_ijava_frame_abi_size = sizeof(parent_ijava_frame_abi)
 237   };
 238 
 239 #define _parent_ijava_frame_abi(_component) \
 240         (offset_of(frame::parent_ijava_frame_abi, _component))
 241 
 242   struct top_ijava_frame_abi : abi_reg_args {
 243   };
 244 
 245   enum {
 246     top_ijava_frame_abi_size = sizeof(top_ijava_frame_abi)
 247   };
 248 
 249 #define _top_ijava_frame_abi(_component) \
 250         (offset_of(frame::top_ijava_frame_abi, _component))
 251 
 252   struct ijava_state {



 253     uint64_t method;
 254     uint64_t mirror;
 255     uint64_t locals;
 256     uint64_t monitors;
 257     uint64_t cpoolCache;
 258     uint64_t bcp;
 259     uint64_t esp;
 260     uint64_t mdx;
 261     uint64_t top_frame_sp; // Maybe define parent_frame_abi and move there.
 262     uint64_t sender_sp;
 263     // Slots only needed for native calls. Maybe better to move elsewhere.
 264     uint64_t oop_tmp;
 265     uint64_t lresult;
 266     uint64_t fresult;
 267   };
 268 
 269   enum {
 270     ijava_state_size = sizeof(ijava_state)
 271   };
 272 


 388 
 389   intptr_t* compiled_sender_sp(CodeBlob* cb) const;
 390   address*  compiled_sender_pc_addr(CodeBlob* cb) const;
 391   address*  sender_pc_addr(void) const;
 392 
 393  public:
 394 
 395   inline ijava_state* get_ijava_state() const;
 396   // Some convenient register frame setters/getters for deoptimization.
 397   inline intptr_t* interpreter_frame_esp() const;
 398   inline void interpreter_frame_set_cpcache(ConstantPoolCache* cp);
 399   inline void interpreter_frame_set_esp(intptr_t* esp);
 400   inline void interpreter_frame_set_top_frame_sp(intptr_t* top_frame_sp);
 401   inline void interpreter_frame_set_sender_sp(intptr_t* sender_sp);
 402 
 403   // Size of a monitor in bytes.
 404   static int interpreter_frame_monitor_size_in_bytes();
 405 
 406   // The size of a cInterpreter object.
 407   static inline int interpreter_frame_cinterpreterstate_size_in_bytes();






 408 
 409   // Additional interface for entry frames:
 410   inline entry_frame_locals* get_entry_frame_locals() const {
 411     return (entry_frame_locals*) (((address) fp()) - entry_frame_locals_size);
 412   }
 413 
 414   enum {
 415     // normal return address is 1 bundle past PC
 416     pc_return_offset = 0
 417   };
 418 
 419   static jint interpreter_frame_expression_stack_direction() { return -1; }
 420 
 421 #endif // CPU_PPC_FRAME_PPC_HPP
< prev index next >