| 1 | /* | 
|---|
| 2 | * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. | 
|---|
| 3 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 
|---|
| 4 | * | 
|---|
| 5 | * This code is free software; you can redistribute it and/or modify it | 
|---|
| 6 | * under the terms of the GNU General Public License version 2 only, as | 
|---|
| 7 | * published by the Free Software Foundation. | 
|---|
| 8 | * | 
|---|
| 9 | * This code is distributed in the hope that it will be useful, but WITHOUT | 
|---|
| 10 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 
|---|
| 11 | * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | 
|---|
| 12 | * version 2 for more details (a copy is included in the LICENSE file that | 
|---|
| 13 | * accompanied this code). | 
|---|
| 14 | * | 
|---|
| 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(); | 
|---|
| 58 |  | 
|---|
| 59 | // Then package it right depending on type | 
|---|
| 60 | // Note: the transfer of the data is thru a union that contains | 
|---|
| 61 | // an intptr_t. This is because an interpreter stack slot is | 
|---|
| 62 | // really an intptr_t. The use of a union containing an intptr_t | 
|---|
| 63 | // ensures that on a 64 bit platform we have proper alignment | 
|---|
| 64 | // and that we store the value where the interpreter will expect | 
|---|
| 65 | // to find it (i.e. proper endian). Similarly on a 32bit platform | 
|---|
| 66 | // using the intptr_t ensures that when a value is larger than | 
|---|
| 67 | // a stack slot (jlong/jdouble) that we capture the proper part | 
|---|
| 68 | // of the value for the stack slot in question. | 
|---|
| 69 | // | 
|---|
| 70 | switch( loc.type() ) { | 
|---|
| 71 | case Location::float_in_dbl: { // Holds a float in a double register? | 
|---|
| 72 | // The callee has no clue whether the register holds a float, | 
|---|
| 73 | // double or is unused.  He always saves a double.  Here we know | 
|---|
| 74 | // a double was saved, but we only want a float back.  Narrow the | 
|---|
| 75 | // saved double to the float that the JVM wants. | 
|---|
| 76 | assert( loc.is_register(), "floats always saved to stack in 1 word"); | 
|---|
| 77 | union { intptr_t p; jfloat jf; } value; | 
|---|
| 78 | value.p = (intptr_t) CONST64(0xDEADDEAFDEADDEAF); | 
|---|
| 79 | value.jf = (jfloat) *(jdouble*) value_addr; | 
|---|
| 80 | return new StackValue(value.p); // 64-bit high half is stack junk | 
|---|
| 81 | } | 
|---|
| 82 | case Location::int_in_long: { // Holds an int in a long register? | 
|---|
| 83 | // The callee has no clue whether the register holds an int, | 
|---|
| 84 | // long or is unused.  He always saves a long.  Here we know | 
|---|
| 85 | // a long was saved, but we only want an int back.  Narrow the | 
|---|
| 86 | // saved long to the int that the JVM wants. | 
|---|
| 87 | assert( loc.is_register(), "ints always saved to stack in 1 word"); | 
|---|
| 88 | union { intptr_t p; jint ji;} value; | 
|---|
| 89 | value.p = (intptr_t) CONST64(0xDEADDEAFDEADDEAF); | 
|---|
| 90 | value.ji = (jint) *(jlong*) value_addr; | 
|---|
| 91 | return new StackValue(value.p); // 64-bit high half is stack junk | 
|---|
| 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 (CompressedOops::is_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_SHENANDOAHGC | 
|---|
| 137 | if (UseShenandoahGC) { | 
|---|
| 138 | val = ShenandoahBarrierSet::barrier_set()->load_reference_barrier(val); | 
|---|
| 139 | } | 
|---|
| 140 | #endif | 
|---|
| 141 | assert(oopDesc::is_oop_or_null(val, false), "bad oop found"); | 
|---|
| 142 | Handle h(Thread::current(), val); // Wrap a handle around the oop | 
|---|
| 143 | return new StackValue(h); | 
|---|
| 144 | } | 
|---|
| 145 | case Location::addr: { | 
|---|
| 146 | ShouldNotReachHere(); // both C1 and C2 now inline jsrs | 
|---|
| 147 | } | 
|---|
| 148 | case Location::normal: { | 
|---|
| 149 | // Just copy all other bits straight through | 
|---|
| 150 | union { intptr_t p; jint ji;} value; | 
|---|
| 151 | value.p = (intptr_t) CONST64(0xDEADDEAFDEADDEAF); | 
|---|
| 152 | value.ji = *(jint*)value_addr; | 
|---|
| 153 | return new StackValue(value.p); | 
|---|
| 154 | } | 
|---|
| 155 | case Location::invalid: | 
|---|
| 156 | return new StackValue(); | 
|---|
| 157 | default: | 
|---|
| 158 | ShouldNotReachHere(); | 
|---|
| 159 | } | 
|---|
| 160 |  | 
|---|
| 161 | } else if (sv->is_constant_int()) { | 
|---|
| 162 | // Constant int: treat same as register int. | 
|---|
| 163 | union { intptr_t p; jint ji;} value; | 
|---|
| 164 | value.p = (intptr_t) CONST64(0xDEADDEAFDEADDEAF); | 
|---|
| 165 | value.ji = (jint)((ConstantIntValue*)sv)->value(); | 
|---|
| 166 | return new StackValue(value.p); | 
|---|
| 167 | } else if (sv->is_constant_oop()) { | 
|---|
| 168 | // constant oop | 
|---|
| 169 | return new StackValue(sv->as_ConstantOopReadValue()->value()); | 
|---|
| 170 | #ifdef _LP64 | 
|---|
| 171 | } else if (sv->is_constant_double()) { | 
|---|
| 172 | // Constant double in a single stack slot | 
|---|
| 173 | union { intptr_t p; double d; } value; | 
|---|
| 174 | value.p = (intptr_t) CONST64(0xDEADDEAFDEADDEAF); | 
|---|
| 175 | value.d = ((ConstantDoubleValue *)sv)->value(); | 
|---|
| 176 | return new StackValue(value.p); | 
|---|
| 177 | } else if (sv->is_constant_long()) { | 
|---|
| 178 | // Constant long in a single stack slot | 
|---|
| 179 | union { intptr_t p; jlong jl; } value; | 
|---|
| 180 | value.p = (intptr_t) CONST64(0xDEADDEAFDEADDEAF); | 
|---|
| 181 | value.jl = ((ConstantLongValue *)sv)->value(); | 
|---|
| 182 | return new StackValue(value.p); | 
|---|
| 183 | #endif | 
|---|
| 184 | } else if (sv->is_object()) { // Scalar replaced object in compiled frame | 
|---|
| 185 | Handle ov = ((ObjectValue *)sv)->value(); | 
|---|
| 186 | return new StackValue(ov, (ov.is_null()) ? 1 : 0); | 
|---|
| 187 | } | 
|---|
| 188 |  | 
|---|
| 189 | // Unknown ScopeValue type | 
|---|
| 190 | ShouldNotReachHere(); | 
|---|
| 191 | return new StackValue((intptr_t) 0);   // dummy | 
|---|
| 192 | } | 
|---|
| 193 |  | 
|---|
| 194 |  | 
|---|
| 195 | BasicLock* StackValue::resolve_monitor_lock(const frame* fr, Location location) { | 
|---|
| 196 | assert(location.is_stack(), "for now we only look at the stack"); | 
|---|
| 197 | int word_offset = location.stack_offset() / wordSize; | 
|---|
| 198 | // (stack picture) | 
|---|
| 199 | // high: [     ]  word_offset + 1 | 
|---|
| 200 | // low   [     ]  word_offset | 
|---|
| 201 | // | 
|---|
| 202 | // sp->  [     ]  0 | 
|---|
| 203 | // the word_offset is the distance from the stack pointer to the lowest address | 
|---|
| 204 | // The frame's original stack pointer, before any extension by its callee | 
|---|
| 205 | // (due to Compiler1 linkage on SPARC), must be used. | 
|---|
| 206 | return (BasicLock*) (fr->unextended_sp() + word_offset); | 
|---|
| 207 | } | 
|---|
| 208 |  | 
|---|
| 209 |  | 
|---|
| 210 | #ifndef PRODUCT | 
|---|
| 211 |  | 
|---|
| 212 | void StackValue::print_on(outputStream* st) const { | 
|---|
| 213 | switch(_type) { | 
|---|
| 214 | case T_INT: | 
|---|
| 215 | st->print( "%d (int) %f (float) %x (hex)",  *(int *)&_integer_value, *(float *)&_integer_value,  *(int *)&_integer_value); | 
|---|
| 216 | break; | 
|---|
| 217 |  | 
|---|
| 218 | case T_OBJECT: | 
|---|
| 219 | if (_handle_value() != NULL) { | 
|---|
| 220 | _handle_value()->print_value_on(st); | 
|---|
| 221 | } else { | 
|---|
| 222 | st->print( "NULL"); | 
|---|
| 223 | } | 
|---|
| 224 | st->print( " <"INTPTR_FORMAT ">", p2i((address)_handle_value())); | 
|---|
| 225 | break; | 
|---|
| 226 |  | 
|---|
| 227 | case T_CONFLICT: | 
|---|
| 228 | st->print( "conflict"); | 
|---|
| 229 | break; | 
|---|
| 230 |  | 
|---|
| 231 | default: | 
|---|
| 232 | ShouldNotReachHere(); | 
|---|
| 233 | } | 
|---|
| 234 | } | 
|---|
| 235 |  | 
|---|
| 236 | #endif | 
|---|
| 237 |  | 
|---|