c1_ValueType.cpp revision 3602:da91efe96a93
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 33VoidType* voidType = NULL; 34IntType* intType = NULL; 35LongType* longType = NULL; 36FloatType* floatType = NULL; 37DoubleType* doubleType = NULL; 38ObjectType* objectType = NULL; 39ArrayType* arrayType = NULL; 40InstanceType* instanceType = NULL; 41ClassType* classType = NULL; 42AddressType* addressType = NULL; 43IllegalType* illegalType = NULL; 44 45 46// predefined constants 47IntConstant* intZero = NULL; 48IntConstant* intOne = NULL; 49ObjectConstant* objectNull = NULL; 50 51 52void 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 75ValueType* 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 82ValueType* ValueType::join(ValueType* y) const { 83 Unimplemented(); 84 return NULL; 85} 86 87 88ciType* ObjectConstant::exact_type() const { 89 ciObject* c = constant_value(); 90 return (c != NULL && !c->is_null_object()) ? c->klass() : NULL; 91} 92ciType* ArrayConstant::exact_type() const { 93 ciObject* c = constant_value(); 94 return (c != NULL && !c->is_null_object()) ? c->klass() : NULL; 95} 96ciType* InstanceConstant::exact_type() const { 97 ciObject* c = constant_value(); 98 return (c != NULL && !c->is_null_object()) ? c->klass() : NULL; 99} 100ciType* ClassConstant::exact_type() const { 101 return Compilation::current()->env()->Class_klass(); 102} 103 104 105jobject ObjectType::encoding() const { 106 assert(is_constant(), "must be"); 107 return constant_value()->constant_encoding(); 108} 109 110bool ObjectType::is_loaded() const { 111 assert(is_constant(), "must be"); 112 return constant_value()->is_loaded(); 113} 114 115bool MetadataType::is_loaded() const { 116 assert(is_constant(), "must be"); 117 return constant_value()->is_loaded(); 118} 119 120ciObject* ObjectConstant::constant_value() const { return _value; } 121ciObject* ArrayConstant::constant_value() const { return _value; } 122ciObject* InstanceConstant::constant_value() const { return _value; } 123 124ValueType* 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 145ValueType* 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 163BasicType 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; 171 case addressTag: return T_ADDRESS; 172 case illegalTag: return T_ILLEGAL; 173 } 174 ShouldNotReachHere(); 175 return T_ILLEGAL; 176} 177