annotate src/share/vm/c1/c1_ValueType.cpp @ 2607:008adfd6d850

Fixed the stateBefore of invokes and monitorenter instructions to include the arguments of the instruction. This is necessary to ensure correct continuation in the interpreter when the stateBefore is used as a deoptimization point.
author Thomas Wuerthinger <thomas@wuerthinger.net>
date Fri, 06 May 2011 17:47:17 +0200
parents f95d63e2154a
children 1d7922586cf6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1584
diff changeset
2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 989
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 989
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 989
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1584
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1584
diff changeset
26 #include "c1/c1_ValueType.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1584
diff changeset
27 #include "ci/ciArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1584
diff changeset
28 #include "ci/ciInstance.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1584
diff changeset
29 #include "ci/ciNullObject.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
30
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // predefined types
a61af66fc99e Initial load
duke
parents:
diff changeset
33 VoidType* voidType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
34 IntType* intType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 LongType* longType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 FloatType* floatType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 DoubleType* doubleType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 ObjectType* objectType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
39 ArrayType* arrayType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
40 InstanceType* instanceType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 ClassType* classType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 AddressType* addressType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
43 IllegalType* illegalType = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
44
a61af66fc99e Initial load
duke
parents:
diff changeset
45
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // predefined constants
a61af66fc99e Initial load
duke
parents:
diff changeset
47 IntConstant* intZero = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 IntConstant* intOne = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 ObjectConstant* objectNull = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
50
a61af66fc99e Initial load
duke
parents:
diff changeset
51
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
52 void ValueType::initialize(Arena* arena) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // Note: Must initialize all types for each compilation
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // as they are allocated within a ResourceMark!
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // types
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
57 voidType = new (arena) VoidType();
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
58 intType = new (arena) IntType();
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
59 longType = new (arena) LongType();
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
60 floatType = new (arena) FloatType();
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
61 doubleType = new (arena) DoubleType();
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
62 objectType = new (arena) ObjectType();
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
63 arrayType = new (arena) ArrayType();
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
64 instanceType = new (arena) InstanceType();
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
65 classType = new (arena) ClassType();
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
66 addressType = new (arena) AddressType();
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
67 illegalType = new (arena) IllegalType();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
68
1584
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
69 intZero = new (arena) IntConstant(0);
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
70 intOne = new (arena) IntConstant(1);
b812ff5abc73 6958292: C1: Enable parallel compilation
iveresov
parents: 1552
diff changeset
71 objectNull = new (arena) ObjectConstant(ciNullObject::make());
0
a61af66fc99e Initial load
duke
parents:
diff changeset
72 };
a61af66fc99e Initial load
duke
parents:
diff changeset
73
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 ValueType* ValueType::meet(ValueType* y) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // incomplete & conservative solution for now - fix this!
a61af66fc99e Initial load
duke
parents:
diff changeset
77 assert(tag() == y->tag(), "types must match");
a61af66fc99e Initial load
duke
parents:
diff changeset
78 return base();
a61af66fc99e Initial load
duke
parents:
diff changeset
79 }
a61af66fc99e Initial load
duke
parents:
diff changeset
80
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 ValueType* ValueType::join(ValueType* y) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 Unimplemented();
a61af66fc99e Initial load
duke
parents:
diff changeset
84 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
85 }
a61af66fc99e Initial load
duke
parents:
diff changeset
86
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89 jobject ObjectType::encoding() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
90 assert(is_constant(), "must be");
989
148e5441d916 6863023: need non-perm oops in code cache for JSR 292
jrose
parents: 0
diff changeset
91 return constant_value()->constant_encoding();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
92 }
a61af66fc99e Initial load
duke
parents:
diff changeset
93
a61af66fc99e Initial load
duke
parents:
diff changeset
94 bool ObjectType::is_loaded() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
95 assert(is_constant(), "must be");
a61af66fc99e Initial load
duke
parents:
diff changeset
96 return constant_value()->is_loaded();
a61af66fc99e Initial load
duke
parents:
diff changeset
97 }
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 ciObject* ObjectConstant::constant_value() const { return _value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
100 ciObject* ArrayConstant::constant_value() const { return _value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
101 ciObject* InstanceConstant::constant_value() const { return _value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
102 ciObject* ClassConstant::constant_value() const { return _value; }
a61af66fc99e Initial load
duke
parents:
diff changeset
103
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 ValueType* as_ValueType(BasicType type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 switch (type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 case T_VOID : return voidType;
a61af66fc99e Initial load
duke
parents:
diff changeset
108 case T_BYTE : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
109 case T_CHAR : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
110 case T_SHORT : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
111 case T_BOOLEAN: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
112 case T_INT : return intType;
a61af66fc99e Initial load
duke
parents:
diff changeset
113 case T_LONG : return longType;
a61af66fc99e Initial load
duke
parents:
diff changeset
114 case T_FLOAT : return floatType;
a61af66fc99e Initial load
duke
parents:
diff changeset
115 case T_DOUBLE : return doubleType;
a61af66fc99e Initial load
duke
parents:
diff changeset
116 case T_ARRAY : return arrayType;
a61af66fc99e Initial load
duke
parents:
diff changeset
117 case T_OBJECT : return objectType;
a61af66fc99e Initial load
duke
parents:
diff changeset
118 case T_ADDRESS: return addressType;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 case T_ILLEGAL: return illegalType;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 }
a61af66fc99e Initial load
duke
parents:
diff changeset
121 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
122 return illegalType;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 }
a61af66fc99e Initial load
duke
parents:
diff changeset
124
a61af66fc99e Initial load
duke
parents:
diff changeset
125
a61af66fc99e Initial load
duke
parents:
diff changeset
126 ValueType* as_ValueType(ciConstant value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
127 switch (value.basic_type()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
128 case T_BYTE : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
129 case T_CHAR : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
130 case T_SHORT : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
131 case T_BOOLEAN: // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
132 case T_INT : return new IntConstant (value.as_int ());
a61af66fc99e Initial load
duke
parents:
diff changeset
133 case T_LONG : return new LongConstant (value.as_long ());
a61af66fc99e Initial load
duke
parents:
diff changeset
134 case T_FLOAT : return new FloatConstant (value.as_float ());
a61af66fc99e Initial load
duke
parents:
diff changeset
135 case T_DOUBLE : return new DoubleConstant(value.as_double());
a61af66fc99e Initial load
duke
parents:
diff changeset
136 case T_ARRAY : // fall through (ciConstant doesn't have an array accessor)
a61af66fc99e Initial load
duke
parents:
diff changeset
137 case T_OBJECT : return new ObjectConstant(value.as_object());
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
140 return illegalType;
a61af66fc99e Initial load
duke
parents:
diff changeset
141 }
a61af66fc99e Initial load
duke
parents:
diff changeset
142
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144 BasicType as_BasicType(ValueType* type) {
a61af66fc99e Initial load
duke
parents:
diff changeset
145 switch (type->tag()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 case voidTag: return T_VOID;
a61af66fc99e Initial load
duke
parents:
diff changeset
147 case intTag: return T_INT;
a61af66fc99e Initial load
duke
parents:
diff changeset
148 case longTag: return T_LONG;
a61af66fc99e Initial load
duke
parents:
diff changeset
149 case floatTag: return T_FLOAT;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 case doubleTag: return T_DOUBLE;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 case objectTag: return T_OBJECT;
a61af66fc99e Initial load
duke
parents:
diff changeset
152 case addressTag: return T_ADDRESS;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 case illegalTag: return T_ILLEGAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
155 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
156 return T_ILLEGAL;
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }