1 /*
2  * Copyright (c) 1999, 2012, 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 "c1/c1_ValueType.hpp"
27 #include "ci/ciArray.hpp"
28 #include "ci/ciInstance.hpp"
29 #include "ci/ciNullObject.hpp"
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 
initialize(Arena * arena)52 void ValueType::initialize(Arena* arena) {
53   // Note: Must initialize all types for each compilation
54   //       as they are allocated within a ResourceMark!
55 
56   // types
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();
68 
69   intZero     = new (arena) IntConstant(0);
70   intOne      = new (arena) IntConstant(1);
71   objectNull  = new (arena) ObjectConstant(ciNullObject::make());
72 };
73 
74 
meet(ValueType * y) const75 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 
join(ValueType * y) const82 ValueType* ValueType::join(ValueType* y) const {
83   Unimplemented();
84   return NULL;
85 }
86 
87 
exact_type() const88 ciType* ObjectConstant::exact_type() const {
89   ciObject* c = constant_value();
90   return (c != NULL && !c->is_null_object()) ? c->klass() : NULL;
91 }
exact_type() const92 ciType* ArrayConstant::exact_type() const {
93   ciObject* c = constant_value();
94   return (c != NULL && !c->is_null_object()) ? c->klass() : NULL;
95 }
exact_type() const96 ciType* InstanceConstant::exact_type() const {
97   ciObject* c = constant_value();
98   return (c != NULL && !c->is_null_object()) ? c->klass() : NULL;
99 }
exact_type() const100 ciType* ClassConstant::exact_type() const {
101   return Compilation::current()->env()->Class_klass();
102 }
103 
104 
encoding() const105 jobject ObjectType::encoding() const {
106   assert(is_constant(), "must be");
107   return constant_value()->constant_encoding();
108 }
109 
is_loaded() const110 bool ObjectType::is_loaded() const {
111   assert(is_constant(), "must be");
112   return constant_value()->is_loaded();
113 }
114 
is_loaded() const115 bool MetadataType::is_loaded() const {
116   assert(is_constant(), "must be");
117   return constant_value()->is_loaded();
118 }
119 
constant_value() const120 ciObject* ObjectConstant::constant_value() const                   { return _value; }
constant_value() const121 ciObject* ArrayConstant::constant_value() const                    { return _value; }
constant_value() const122 ciObject* InstanceConstant::constant_value() const                 { return _value; }
123 
as_ValueType(BasicType type)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 
as_ValueType(ciConstant value)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 : {
157       // TODO: Common the code with GraphBuilder::load_constant?
158       ciObject* obj = value.as_object();
159       if (obj->is_null_object())
160         return objectNull;
161       if (obj->is_loaded()) {
162         if (obj->is_array())
163           return new ArrayConstant(obj->as_array());
164         else if (obj->is_instance())
165           return new InstanceConstant(obj->as_instance());
166       }
167       return new ObjectConstant(obj);
168     }
169   }
170   ShouldNotReachHere();
171   return illegalType;
172 }
173 
174 
as_BasicType(ValueType * type)175 BasicType as_BasicType(ValueType* type) {
176   switch (type->tag()) {
177     case voidTag:    return T_VOID;
178     case intTag:     return T_INT;
179     case longTag:    return T_LONG;
180     case floatTag:   return T_FLOAT;
181     case doubleTag:  return T_DOUBLE;
182     case objectTag:  return T_OBJECT;
183     case metaDataTag:return T_METADATA;
184     case addressTag: return T_ADDRESS;
185     case illegalTag: return T_ILLEGAL;
186   }
187   ShouldNotReachHere();
188   return T_ILLEGAL;
189 }
190