15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "code/debugInfo.hpp"
27 #include "oops/compressedOops.inline.hpp"
28 #include "oops/oop.hpp"
29 #include "runtime/frame.inline.hpp"
30 #include "runtime/handles.inline.hpp"
31 #include "runtime/stackValue.hpp"
32 #if INCLUDE_ZGC
33 #include "gc/z/zBarrier.inline.hpp"
34 #endif
35
36 StackValue* StackValue::create_stack_value(const frame* fr, const RegisterMap* reg_map, ScopeValue* sv) {
37 if (sv->is_location()) {
38 // Stack or register value
39 Location loc = ((LocationValue *)sv)->location();
40
41 #ifdef SPARC
42 // %%%%% Callee-save floats will NOT be working on a Sparc until we
43 // handle the case of a 2 floats in a single double register.
44 assert( !(loc.is_register() && loc.type() == Location::float_in_dbl), "Sparc does not handle callee-save floats yet" );
45 #endif // SPARC
46
47 // First find address of value
48
49 address value_addr = loc.is_register()
50 // Value was in a callee-save register
51 ? reg_map->location(VMRegImpl::as_VMReg(loc.register_number()))
52 // Else value was directly saved on the stack. The frame's original stack pointer,
53 // before any extension by its callee (due to Compiler1 linkage on SPARC), must be used.
54 : ((address)fr->unextended_sp()) + loc.stack_offset();
89 }
90 #ifdef _LP64
91 case Location::dbl:
92 // Double value in an aligned adjacent pair
93 return new StackValue(*(intptr_t*)value_addr);
94 case Location::lng:
95 // Long value in an aligned adjacent pair
96 return new StackValue(*(intptr_t*)value_addr);
97 case Location::narrowoop: {
98 union { intptr_t p; narrowOop noop;} value;
99 value.p = (intptr_t) CONST64(0xDEADDEAFDEADDEAF);
100 if (loc.is_register()) {
101 // The callee has no clue whether the register holds an int,
102 // long or is unused. He always saves a long. Here we know
103 // a long was saved, but we only want an int back. Narrow the
104 // saved long to the int that the JVM wants.
105 value.noop = (narrowOop) *(julong*) value_addr;
106 } else {
107 value.noop = *(narrowOop*) value_addr;
108 }
109 // Decode narrowoop and wrap a handle around the oop
110 Handle h(Thread::current(), CompressedOops::decode(value.noop));
111 return new StackValue(h);
112 }
113 #endif
114 case Location::oop: {
115 oop val = *(oop *)value_addr;
116 #ifdef _LP64
117 if (Universe::is_narrow_oop_base(val)) {
118 // Compiled code may produce decoded oop = narrow_oop_base
119 // when a narrow oop implicit null check is used.
120 // The narrow_oop_base could be NULL or be the address
121 // of the page below heap. Use NULL value for both cases.
122 val = (oop)NULL;
123 }
124 #endif
125 #if INCLUDE_ZGC
126 // Deoptimization must make sure all oop have passed load barrier
127 if (UseZGC) {
128 val = ZBarrier::load_barrier_on_oop_field_preloaded((oop*)value_addr, val);
129 }
130 #endif
131
132 Handle h(Thread::current(), val); // Wrap a handle around the oop
133 return new StackValue(h);
134 }
135 case Location::addr: {
136 ShouldNotReachHere(); // both C1 and C2 now inline jsrs
137 }
138 case Location::normal: {
139 // Just copy all other bits straight through
140 union { intptr_t p; jint ji;} value;
141 value.p = (intptr_t) CONST64(0xDEADDEAFDEADDEAF);
142 value.ji = *(jint*)value_addr;
143 return new StackValue(value.p);
144 }
145 case Location::invalid:
146 return new StackValue();
147 default:
148 ShouldNotReachHere();
149 }
150
151 } else if (sv->is_constant_int()) {
|
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "code/debugInfo.hpp"
27 #include "oops/compressedOops.inline.hpp"
28 #include "oops/oop.hpp"
29 #include "runtime/frame.inline.hpp"
30 #include "runtime/handles.inline.hpp"
31 #include "runtime/stackValue.hpp"
32 #if INCLUDE_ZGC
33 #include "gc/z/zBarrier.inline.hpp"
34 #endif
35 #if INCLUDE_SHENANDOAHGC
36 #include "gc/shenandoah/shenandoahBarrierSet.hpp"
37 #endif
38
39 StackValue* StackValue::create_stack_value(const frame* fr, const RegisterMap* reg_map, ScopeValue* sv) {
40 if (sv->is_location()) {
41 // Stack or register value
42 Location loc = ((LocationValue *)sv)->location();
43
44 #ifdef SPARC
45 // %%%%% Callee-save floats will NOT be working on a Sparc until we
46 // handle the case of a 2 floats in a single double register.
47 assert( !(loc.is_register() && loc.type() == Location::float_in_dbl), "Sparc does not handle callee-save floats yet" );
48 #endif // SPARC
49
50 // First find address of value
51
52 address value_addr = loc.is_register()
53 // Value was in a callee-save register
54 ? reg_map->location(VMRegImpl::as_VMReg(loc.register_number()))
55 // Else value was directly saved on the stack. The frame's original stack pointer,
56 // before any extension by its callee (due to Compiler1 linkage on SPARC), must be used.
57 : ((address)fr->unextended_sp()) + loc.stack_offset();
92 }
93 #ifdef _LP64
94 case Location::dbl:
95 // Double value in an aligned adjacent pair
96 return new StackValue(*(intptr_t*)value_addr);
97 case Location::lng:
98 // Long value in an aligned adjacent pair
99 return new StackValue(*(intptr_t*)value_addr);
100 case Location::narrowoop: {
101 union { intptr_t p; narrowOop noop;} value;
102 value.p = (intptr_t) CONST64(0xDEADDEAFDEADDEAF);
103 if (loc.is_register()) {
104 // The callee has no clue whether the register holds an int,
105 // long or is unused. He always saves a long. Here we know
106 // a long was saved, but we only want an int back. Narrow the
107 // saved long to the int that the JVM wants.
108 value.noop = (narrowOop) *(julong*) value_addr;
109 } else {
110 value.noop = *(narrowOop*) value_addr;
111 }
112 // Decode narrowoop
113 oop val = CompressedOops::decode(value.noop);
114 // Deoptimization must make sure all oops have passed load barriers
115 #if INCLUDE_SHENANDOAHGC
116 if (UseShenandoahGC) {
117 val = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(val);
118 }
119 #endif
120 Handle h(Thread::current(), val); // Wrap a handle around the oop
121 return new StackValue(h);
122 }
123 #endif
124 case Location::oop: {
125 oop val = *(oop *)value_addr;
126 #ifdef _LP64
127 if (Universe::is_narrow_oop_base(val)) {
128 // Compiled code may produce decoded oop = narrow_oop_base
129 // when a narrow oop implicit null check is used.
130 // The narrow_oop_base could be NULL or be the address
131 // of the page below heap. Use NULL value for both cases.
132 val = (oop)NULL;
133 }
134 #endif
135 // Deoptimization must make sure all oops have passed load barriers
136 #if INCLUDE_ZGC
137 if (UseZGC) {
138 val = ZBarrier::load_barrier_on_oop_field_preloaded((oop*)value_addr, val);
139 }
140 #endif
141 #if INCLUDE_SHENANDOAHGC
142 if (UseShenandoahGC) {
143 val = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(val);
144 }
145 #endif
146 Handle h(Thread::current(), val); // Wrap a handle around the oop
147 return new StackValue(h);
148 }
149 case Location::addr: {
150 ShouldNotReachHere(); // both C1 and C2 now inline jsrs
151 }
152 case Location::normal: {
153 // Just copy all other bits straight through
154 union { intptr_t p; jint ji;} value;
155 value.p = (intptr_t) CONST64(0xDEADDEAFDEADDEAF);
156 value.ji = *(jint*)value_addr;
157 return new StackValue(value.p);
158 }
159 case Location::invalid:
160 return new StackValue();
161 default:
162 ShouldNotReachHere();
163 }
164
165 } else if (sv->is_constant_int()) {
|