< prev index next >

src/hotspot/cpu/ppc/sharedRuntime_ppc.cpp

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


2702 #endif
2703 }
2704 
2705 #if defined(COMPILER1) || defined(COMPILER2)
2706 // Frame generation for deopt and uncommon trap blobs.
2707 static void push_skeleton_frame(MacroAssembler* masm, bool deopt,
2708                                 /* Read */
2709                                 Register unroll_block_reg,
2710                                 /* Update */
2711                                 Register frame_sizes_reg,
2712                                 Register number_of_frames_reg,
2713                                 Register pcs_reg,
2714                                 /* Invalidate */
2715                                 Register frame_size_reg,
2716                                 Register pc_reg) {
2717 
2718   __ ld(pc_reg, 0, pcs_reg);
2719   __ ld(frame_size_reg, 0, frame_sizes_reg);
2720   __ std(pc_reg, _abi(lr), R1_SP);
2721   __ push_frame(frame_size_reg, R0/*tmp*/);
2722 #ifdef ASSERT
2723   __ load_const_optimized(pc_reg, 0x5afe);
2724   __ std(pc_reg, _ijava_state_neg(ijava_reserved), R1_SP);
2725 #endif
2726   __ std(R1_SP, _ijava_state_neg(sender_sp), R1_SP);
2727   __ addi(number_of_frames_reg, number_of_frames_reg, -1);
2728   __ addi(frame_sizes_reg, frame_sizes_reg, wordSize);
2729   __ addi(pcs_reg, pcs_reg, wordSize);
2730 }
2731 
2732 // Loop through the UnrollBlock info and create new frames.
2733 static void push_skeleton_frames(MacroAssembler* masm, bool deopt,
2734                                  /* read */
2735                                  Register unroll_block_reg,
2736                                  /* invalidate */
2737                                  Register frame_sizes_reg,
2738                                  Register number_of_frames_reg,
2739                                  Register pcs_reg,
2740                                  Register frame_size_reg,
2741                                  Register pc_reg) {
2742   Label loop;
2743 
2744  // _number_of_frames is of type int (deoptimization.hpp)
2745   __ lwa(number_of_frames_reg,


2778              Deoptimization::UnrollBlock::caller_adjustment_offset_in_bytes(),
2779              unroll_block_reg);
2780   __ neg(R11_scratch1, R11_scratch1);
2781 
2782   // R11_scratch1 contains size of locals for frame resizing.
2783   // R12_scratch2 contains top frame's lr.
2784 
2785   // Resize frame by complete frame size prevents TOC from being
2786   // overwritten by locals. A more stack space saving way would be
2787   // to copy the TOC to its location in the new abi.
2788   __ addi(R11_scratch1, R11_scratch1, - frame::parent_ijava_frame_abi_size);
2789 
2790   // now, resize the frame
2791   __ resize_frame(R11_scratch1, pc_reg/*tmp*/);
2792 
2793   // In the case where we have resized a c2i frame above, the optional
2794   // alignment below the locals has size 32 (why?).
2795   __ std(R12_scratch2, _abi(lr), R1_SP);
2796 
2797   // Initialize initial_caller_sp.
2798 #ifdef ASSERT
2799  __ load_const_optimized(pc_reg, 0x5afe);
2800  __ std(pc_reg, _ijava_state_neg(ijava_reserved), R1_SP);
2801 #endif
2802  __ std(frame_size_reg, _ijava_state_neg(sender_sp), R1_SP);
2803 
2804 #ifdef ASSERT
2805   // Make sure that there is at least one entry in the array.
2806   __ cmpdi(CCR0, number_of_frames_reg, 0);
2807   __ asm_assert_ne("array_size must be > 0", 0x205);
2808 #endif
2809 
2810   // Now push the new interpreter frames.
2811   //
2812   __ bind(loop);
2813   // Allocate a new frame, fill in the pc.
2814   push_skeleton_frame(masm, deopt,
2815                       unroll_block_reg,
2816                       frame_sizes_reg,
2817                       number_of_frames_reg,
2818                       pcs_reg,
2819                       frame_size_reg,
2820                       pc_reg);
2821   __ cmpdi(CCR0, number_of_frames_reg, 0);




2702 #endif
2703 }
2704 
2705 #if defined(COMPILER1) || defined(COMPILER2)
2706 // Frame generation for deopt and uncommon trap blobs.
2707 static void push_skeleton_frame(MacroAssembler* masm, bool deopt,
2708                                 /* Read */
2709                                 Register unroll_block_reg,
2710                                 /* Update */
2711                                 Register frame_sizes_reg,
2712                                 Register number_of_frames_reg,
2713                                 Register pcs_reg,
2714                                 /* Invalidate */
2715                                 Register frame_size_reg,
2716                                 Register pc_reg) {
2717 
2718   __ ld(pc_reg, 0, pcs_reg);
2719   __ ld(frame_size_reg, 0, frame_sizes_reg);
2720   __ std(pc_reg, _abi(lr), R1_SP);
2721   __ push_frame(frame_size_reg, R0/*tmp*/);




2722   __ std(R1_SP, _ijava_state_neg(sender_sp), R1_SP);
2723   __ addi(number_of_frames_reg, number_of_frames_reg, -1);
2724   __ addi(frame_sizes_reg, frame_sizes_reg, wordSize);
2725   __ addi(pcs_reg, pcs_reg, wordSize);
2726 }
2727 
2728 // Loop through the UnrollBlock info and create new frames.
2729 static void push_skeleton_frames(MacroAssembler* masm, bool deopt,
2730                                  /* read */
2731                                  Register unroll_block_reg,
2732                                  /* invalidate */
2733                                  Register frame_sizes_reg,
2734                                  Register number_of_frames_reg,
2735                                  Register pcs_reg,
2736                                  Register frame_size_reg,
2737                                  Register pc_reg) {
2738   Label loop;
2739 
2740  // _number_of_frames is of type int (deoptimization.hpp)
2741   __ lwa(number_of_frames_reg,


2774              Deoptimization::UnrollBlock::caller_adjustment_offset_in_bytes(),
2775              unroll_block_reg);
2776   __ neg(R11_scratch1, R11_scratch1);
2777 
2778   // R11_scratch1 contains size of locals for frame resizing.
2779   // R12_scratch2 contains top frame's lr.
2780 
2781   // Resize frame by complete frame size prevents TOC from being
2782   // overwritten by locals. A more stack space saving way would be
2783   // to copy the TOC to its location in the new abi.
2784   __ addi(R11_scratch1, R11_scratch1, - frame::parent_ijava_frame_abi_size);
2785 
2786   // now, resize the frame
2787   __ resize_frame(R11_scratch1, pc_reg/*tmp*/);
2788 
2789   // In the case where we have resized a c2i frame above, the optional
2790   // alignment below the locals has size 32 (why?).
2791   __ std(R12_scratch2, _abi(lr), R1_SP);
2792 
2793   // Initialize initial_caller_sp.




2794  __ std(frame_size_reg, _ijava_state_neg(sender_sp), R1_SP);
2795 
2796 #ifdef ASSERT
2797   // Make sure that there is at least one entry in the array.
2798   __ cmpdi(CCR0, number_of_frames_reg, 0);
2799   __ asm_assert_ne("array_size must be > 0", 0x205);
2800 #endif
2801 
2802   // Now push the new interpreter frames.
2803   //
2804   __ bind(loop);
2805   // Allocate a new frame, fill in the pc.
2806   push_skeleton_frame(masm, deopt,
2807                       unroll_block_reg,
2808                       frame_sizes_reg,
2809                       number_of_frames_reg,
2810                       pcs_reg,
2811                       frame_size_reg,
2812                       pc_reg);
2813   __ cmpdi(CCR0, number_of_frames_reg, 0);


< prev index next >