Mercurial > hg > truffle
annotate src/share/vm/c1/c1_ValueType.cpp @ 8051:12e01444ca2d
8006683: Add WhiteBox API to testing of compiler
Reviewed-by: kvn, vlivanov
author | iignatyev |
---|---|
date | Wed, 13 Feb 2013 08:29:04 -0800 |
parents | 8a02ca5e5576 |
children |
rev | line source |
---|---|
0 | 1 /* |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
2 * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. |
0 | 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 * | |
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 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "c1/c1_ValueType.hpp" | |
27 #include "ci/ciArray.hpp" | |
28 #include "ci/ciInstance.hpp" | |
29 #include "ci/ciNullObject.hpp" | |
0 | 30 |
31 | |
32 // predefined types | |
33 VoidType* voidType = NULL; | |
34 IntType* intType = NULL; | |
35 LongType* longType = NULL; | |
36 FloatType* floatType = NULL; | |
37 DoubleType* doubleType = NULL; | |
38 ObjectType* objectType = NULL; | |
39 ArrayType* arrayType = NULL; | |
40 InstanceType* instanceType = NULL; | |
41 ClassType* classType = NULL; | |
42 AddressType* addressType = NULL; | |
43 IllegalType* illegalType = NULL; | |
44 | |
45 | |
46 // predefined constants | |
47 IntConstant* intZero = NULL; | |
48 IntConstant* intOne = NULL; | |
49 ObjectConstant* objectNull = NULL; | |
50 | |
51 | |
1584 | 52 void ValueType::initialize(Arena* arena) { |
0 | 53 // Note: Must initialize all types for each compilation |
54 // as they are allocated within a ResourceMark! | |
55 | |
56 // types | |
1584 | 57 voidType = new (arena) VoidType(); |
58 intType = new (arena) IntType(); | |
59 longType = new (arena) LongType(); | |
60 floatType = new (arena) FloatType(); | |
61 doubleType = new (arena) DoubleType(); | |
62 objectType = new (arena) ObjectType(); | |
63 arrayType = new (arena) ArrayType(); | |
64 instanceType = new (arena) InstanceType(); | |
65 classType = new (arena) ClassType(); | |
66 addressType = new (arena) AddressType(); | |
67 illegalType = new (arena) IllegalType(); | |
0 | 68 |
1584 | 69 intZero = new (arena) IntConstant(0); |
70 intOne = new (arena) IntConstant(1); | |
71 objectNull = new (arena) ObjectConstant(ciNullObject::make()); | |
0 | 72 }; |
73 | |
74 | |
75 ValueType* ValueType::meet(ValueType* y) const { | |
76 // incomplete & conservative solution for now - fix this! | |
77 assert(tag() == y->tag(), "types must match"); | |
78 return base(); | |
79 } | |
80 | |
81 | |
82 ValueType* ValueType::join(ValueType* y) const { | |
83 Unimplemented(); | |
84 return NULL; | |
85 } | |
86 | |
87 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
88 ciType* ObjectConstant::exact_type() const { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
89 ciObject* c = constant_value(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
90 return (c != NULL && !c->is_null_object()) ? c->klass() : NULL; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
91 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
92 ciType* ArrayConstant::exact_type() const { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
93 ciObject* c = constant_value(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
94 return (c != NULL && !c->is_null_object()) ? c->klass() : NULL; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
95 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
96 ciType* InstanceConstant::exact_type() const { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
97 ciObject* c = constant_value(); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
98 return (c != NULL && !c->is_null_object()) ? c->klass() : NULL; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
99 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
100 ciType* ClassConstant::exact_type() const { |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
101 return Compilation::current()->env()->Class_klass(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
102 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
103 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
104 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
105 jobject ObjectType::encoding() const { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
106 assert(is_constant(), "must be"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
107 return constant_value()->constant_encoding(); |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
108 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
1972
diff
changeset
|
109 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
110 bool ObjectType::is_loaded() const { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
111 assert(is_constant(), "must be"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
112 return constant_value()->is_loaded(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
113 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
114 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
115 bool MetadataType::is_loaded() const { |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
116 assert(is_constant(), "must be"); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
117 return constant_value()->is_loaded(); |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
118 } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
119 |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
120 ciObject* ObjectConstant::constant_value() const { return _value; } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
121 ciObject* ArrayConstant::constant_value() const { return _value; } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
122 ciObject* InstanceConstant::constant_value() const { return _value; } |
0 | 123 |
124 ValueType* as_ValueType(BasicType type) { | |
125 switch (type) { | |
126 case T_VOID : return voidType; | |
127 case T_BYTE : // fall through | |
128 case T_CHAR : // fall through | |
129 case T_SHORT : // fall through | |
130 case T_BOOLEAN: // fall through | |
131 case T_INT : return intType; | |
132 case T_LONG : return longType; | |
133 case T_FLOAT : return floatType; | |
134 case T_DOUBLE : return doubleType; | |
135 case T_ARRAY : return arrayType; | |
136 case T_OBJECT : return objectType; | |
137 case T_ADDRESS: return addressType; | |
138 case T_ILLEGAL: return illegalType; | |
139 } | |
140 ShouldNotReachHere(); | |
141 return illegalType; | |
142 } | |
143 | |
144 | |
145 ValueType* as_ValueType(ciConstant value) { | |
146 switch (value.basic_type()) { | |
147 case T_BYTE : // fall through | |
148 case T_CHAR : // fall through | |
149 case T_SHORT : // fall through | |
150 case T_BOOLEAN: // fall through | |
151 case T_INT : return new IntConstant (value.as_int ()); | |
152 case T_LONG : return new LongConstant (value.as_long ()); | |
153 case T_FLOAT : return new FloatConstant (value.as_float ()); | |
154 case T_DOUBLE : return new DoubleConstant(value.as_double()); | |
155 case T_ARRAY : // fall through (ciConstant doesn't have an array accessor) | |
156 case T_OBJECT : return new ObjectConstant(value.as_object()); | |
157 } | |
158 ShouldNotReachHere(); | |
159 return illegalType; | |
160 } | |
161 | |
162 | |
163 BasicType as_BasicType(ValueType* type) { | |
164 switch (type->tag()) { | |
165 case voidTag: return T_VOID; | |
166 case intTag: return T_INT; | |
167 case longTag: return T_LONG; | |
168 case floatTag: return T_FLOAT; | |
169 case doubleTag: return T_DOUBLE; | |
170 case objectTag: return T_OBJECT; | |
6739
8a02ca5e5576
7195816: NPG: Crash in c1_ValueType - ShouldNotReachHere
roland
parents:
6725
diff
changeset
|
171 case metaDataTag:return T_METADATA; |
0 | 172 case addressTag: return T_ADDRESS; |
173 case illegalTag: return T_ILLEGAL; | |
174 } | |
175 ShouldNotReachHere(); | |
176 return T_ILLEGAL; | |
177 } |