1 /*
2  * Copyright (c) 1997, 2019, 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 #ifndef SHARE_RUNTIME_STACKVALUE_HPP
26 #define SHARE_RUNTIME_STACKVALUE_HPP
27 
28 #include "code/location.hpp"
29 #include "runtime/handles.hpp"
30 
31 class BasicLock;
32 class RegisterMap;
33 class ScopeValue;
34 
35 class StackValue : public ResourceObj {
36  private:
37   BasicType _type;
38   intptr_t  _integer_value; // Blank java stack slot value
39   Handle    _handle_value;  // Java stack slot value interpreted as a Handle
40  public:
41 
StackValue(intptr_t value)42   StackValue(intptr_t value) {
43     _type              = T_INT;
44     _integer_value     = value;
45   }
46 
StackValue(Handle value,intptr_t scalar_replaced=0)47   StackValue(Handle value, intptr_t scalar_replaced = 0) {
48     _type                = T_OBJECT;
49     _integer_value       = scalar_replaced;
50     _handle_value        = value;
51     assert(_integer_value == 0 ||  _handle_value.is_null(), "not null object should not be marked as scalar replaced");
52   }
53 
StackValue()54   StackValue() {
55     _type           = T_CONFLICT;
56     _integer_value  = 0;
57   }
58 
59   // Only used during deopt- preserve object type.
StackValue(intptr_t o,BasicType t)60   StackValue(intptr_t o, BasicType t) {
61     assert(t == T_OBJECT, "should not be used");
62     _type          = t;
63     _integer_value = o;
64   }
65 
get_obj() const66   Handle get_obj() const {
67     assert(type() == T_OBJECT, "type check");
68     return _handle_value;
69   }
70 
obj_is_scalar_replaced() const71   bool obj_is_scalar_replaced() const {
72     assert(type() == T_OBJECT, "type check");
73     return _integer_value != 0;
74   }
75 
set_obj(Handle value)76   void set_obj(Handle value) {
77     assert(type() == T_OBJECT, "type check");
78     _handle_value = value;
79   }
80 
get_int() const81   intptr_t get_int() const {
82     assert(type() == T_INT, "type check");
83     return _integer_value;
84   }
85 
86   // For special case in deopt.
get_int(BasicType t) const87   intptr_t get_int(BasicType t) const {
88     assert(t == T_OBJECT && type() == T_OBJECT, "type check");
89     return _integer_value;
90   }
91 
set_int(intptr_t value)92   void set_int(intptr_t value) {
93     assert(type() == T_INT, "type check");
94     _integer_value = value;
95   }
96 
type() const97   BasicType type() const { return  _type; }
98 
equal(StackValue * value)99   bool equal(StackValue *value) {
100     if (_type != value->_type) return false;
101     if (_type == T_OBJECT)
102       return (_handle_value == value->_handle_value);
103     else {
104       assert(_type == T_INT, "sanity check");
105       // [phh] compare only low addressed portions of intptr_t slots
106       return (*(int *)&_integer_value == *(int *)&value->_integer_value);
107     }
108   }
109 
110   static StackValue* create_stack_value(const frame* fr, const RegisterMap* reg_map, ScopeValue* sv);
111   static BasicLock*  resolve_monitor_lock(const frame* fr, Location location);
112 
113 #ifndef PRODUCT
114  public:
115   // Printing
116   void print_on(outputStream* st) const;
117 #endif
118 };
119 
120 #endif // SHARE_RUNTIME_STACKVALUE_HPP
121