src/share/vm/c1/c1_ValueType.hpp

Wed, 31 Aug 2011 16:46:11 -0700

author
never
date
Wed, 31 Aug 2011 16:46:11 -0700
changeset 3099
c124e2e7463e
parent 2314
f95d63e2154a
child 3969
1d7922586cf6
permissions
-rw-r--r--

7083786: dead various dead chunks of code
Reviewed-by: iveresov, kvn

duke@435 1 /*
stefank@2314 2 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef SHARE_VM_C1_C1_VALUETYPE_HPP
stefank@2314 26 #define SHARE_VM_C1_C1_VALUETYPE_HPP
stefank@2314 27
stefank@2314 28 #include "c1/c1_Compilation.hpp"
stefank@2314 29 #include "ci/ciConstant.hpp"
stefank@2314 30
duke@435 31 // type hierarchy
duke@435 32 class ValueType;
duke@435 33 class VoidType;
duke@435 34 class IntType;
duke@435 35 class IntConstant;
duke@435 36 class IntInterval;
duke@435 37 class LongType;
duke@435 38 class LongConstant;
duke@435 39 class FloatType;
duke@435 40 class FloatConstant;
duke@435 41 class DoubleType;
duke@435 42 class DoubleConstant;
duke@435 43 class ObjectType;
duke@435 44 class ObjectConstant;
duke@435 45 class ArrayType;
duke@435 46 class ArrayConstant;
duke@435 47 class InstanceType;
duke@435 48 class InstanceConstant;
duke@435 49 class ClassType;
duke@435 50 class ClassConstant;
duke@435 51 class AddressType;
duke@435 52 class AddressConstant;
duke@435 53 class IllegalType;
duke@435 54
duke@435 55
duke@435 56 // predefined types
duke@435 57 extern VoidType* voidType;
duke@435 58 extern IntType* intType;
duke@435 59 extern LongType* longType;
duke@435 60 extern FloatType* floatType;
duke@435 61 extern DoubleType* doubleType;
duke@435 62 extern ObjectType* objectType;
duke@435 63 extern ArrayType* arrayType;
duke@435 64 extern InstanceType* instanceType;
duke@435 65 extern ClassType* classType;
duke@435 66 extern AddressType* addressType;
duke@435 67 extern IllegalType* illegalType;
duke@435 68
duke@435 69
duke@435 70 // predefined constants
duke@435 71 extern IntConstant* intZero;
duke@435 72 extern IntConstant* intOne;
duke@435 73 extern ObjectConstant* objectNull;
duke@435 74
duke@435 75
duke@435 76 // tags
duke@435 77 enum ValueTag {
duke@435 78 // all legal tags must come first
duke@435 79 intTag,
duke@435 80 longTag,
duke@435 81 floatTag,
duke@435 82 doubleTag,
duke@435 83 objectTag,
duke@435 84 addressTag,
duke@435 85 number_of_legal_tags,
duke@435 86 // all other tags must follow afterwards
duke@435 87 voidTag = number_of_legal_tags,
duke@435 88 illegalTag,
duke@435 89 number_of_tags
duke@435 90 };
duke@435 91
duke@435 92
duke@435 93 class ValueType: public CompilationResourceObj {
duke@435 94 private:
duke@435 95 const int _size;
duke@435 96 const ValueTag _tag;
duke@435 97 ValueType();
duke@435 98 protected:
duke@435 99 ValueType(ValueTag tag, int size): _tag(tag), _size(size) {}
duke@435 100
duke@435 101 public:
duke@435 102 // initialization
iveresov@1939 103 static void initialize(Arena* arena);
duke@435 104
duke@435 105 // accessors
duke@435 106 virtual ValueType* base() const = 0; // the 'canonical' type (e.g., intType for an IntConstant)
duke@435 107 ValueTag tag() const { return _tag; } // the 'canonical' tag (useful for type matching)
duke@435 108 int size() const { // the size of an object of the type in words
duke@435 109 assert(_size > -1, "shouldn't be asking for size");
duke@435 110 return _size;
duke@435 111 }
duke@435 112 virtual const char tchar() const = 0; // the type 'character' for printing
duke@435 113 virtual const char* name() const = 0; // the type name for printing
duke@435 114 virtual bool is_constant() const { return false; }
duke@435 115
duke@435 116 // testers
duke@435 117 bool is_void() { return tag() == voidTag; }
duke@435 118 bool is_int() { return tag() == intTag; }
duke@435 119 bool is_long() { return tag() == longTag; }
duke@435 120 bool is_float() { return tag() == floatTag; }
duke@435 121 bool is_double() { return tag() == doubleTag; }
duke@435 122 bool is_object() { return as_ObjectType() != NULL; }
duke@435 123 bool is_array() { return as_ArrayType() != NULL; }
duke@435 124 bool is_instance() { return as_InstanceType() != NULL; }
duke@435 125 bool is_class() { return as_ClassType() != NULL; }
duke@435 126 bool is_address() { return as_AddressType() != NULL; }
duke@435 127 bool is_illegal() { return tag() == illegalTag; }
duke@435 128
duke@435 129 bool is_int_kind() const { return tag() == intTag || tag() == longTag; }
duke@435 130 bool is_float_kind() const { return tag() == floatTag || tag() == doubleTag; }
duke@435 131 bool is_object_kind() const { return tag() == objectTag; }
duke@435 132
duke@435 133 bool is_single_word() const { return _size == 1; }
duke@435 134 bool is_double_word() const { return _size == 2; }
duke@435 135
duke@435 136 // casting
duke@435 137 virtual VoidType* as_VoidType() { return NULL; }
duke@435 138 virtual IntType* as_IntType() { return NULL; }
duke@435 139 virtual LongType* as_LongType() { return NULL; }
duke@435 140 virtual FloatType* as_FloatType() { return NULL; }
duke@435 141 virtual DoubleType* as_DoubleType() { return NULL; }
duke@435 142 virtual ObjectType* as_ObjectType() { return NULL; }
duke@435 143 virtual ArrayType* as_ArrayType() { return NULL; }
duke@435 144 virtual InstanceType* as_InstanceType() { return NULL; }
duke@435 145 virtual ClassType* as_ClassType() { return NULL; }
duke@435 146 virtual AddressType* as_AddressType() { return NULL; }
duke@435 147 virtual IllegalType* as_IllegalType() { return NULL; }
duke@435 148
duke@435 149 virtual IntConstant* as_IntConstant() { return NULL; }
duke@435 150 virtual LongConstant* as_LongConstant() { return NULL; }
duke@435 151 virtual FloatConstant* as_FloatConstant() { return NULL; }
duke@435 152 virtual DoubleConstant* as_DoubleConstant() { return NULL; }
duke@435 153 virtual ObjectConstant* as_ObjectConstant() { return NULL; }
duke@435 154 virtual InstanceConstant* as_InstanceConstant(){ return NULL; }
duke@435 155 virtual ClassConstant* as_ClassConstant() { return NULL; }
duke@435 156 virtual ArrayConstant* as_ArrayConstant() { return NULL; }
duke@435 157 virtual AddressConstant* as_AddressConstant() { return NULL; }
duke@435 158
duke@435 159 // type operations
duke@435 160 ValueType* meet(ValueType* y) const;
duke@435 161 ValueType* join(ValueType* y) const;
duke@435 162
duke@435 163 // debugging
duke@435 164 void print(outputStream* s = tty) { s->print(name()); }
duke@435 165 };
duke@435 166
duke@435 167
duke@435 168 class VoidType: public ValueType {
duke@435 169 public:
duke@435 170 VoidType(): ValueType(voidTag, 0) {}
duke@435 171 virtual ValueType* base() const { return voidType; }
duke@435 172 virtual const char tchar() const { return 'v'; }
duke@435 173 virtual const char* name() const { return "void"; }
duke@435 174 virtual VoidType* as_VoidType() { return this; }
duke@435 175 };
duke@435 176
duke@435 177
duke@435 178 class IntType: public ValueType {
duke@435 179 public:
duke@435 180 IntType(): ValueType(intTag, 1) {}
duke@435 181 virtual ValueType* base() const { return intType; }
duke@435 182 virtual const char tchar() const { return 'i'; }
duke@435 183 virtual const char* name() const { return "int"; }
duke@435 184 virtual IntType* as_IntType() { return this; }
duke@435 185 };
duke@435 186
duke@435 187
duke@435 188 class IntConstant: public IntType {
duke@435 189 private:
duke@435 190 jint _value;
duke@435 191
duke@435 192 public:
duke@435 193 IntConstant(jint value) { _value = value; }
duke@435 194
duke@435 195 jint value() const { return _value; }
duke@435 196
duke@435 197 virtual bool is_constant() const { return true; }
duke@435 198 virtual IntConstant* as_IntConstant() { return this; }
duke@435 199 };
duke@435 200
duke@435 201
duke@435 202 class IntInterval: public IntType {
duke@435 203 private:
duke@435 204 jint _beg;
duke@435 205 jint _end;
duke@435 206
duke@435 207 public:
duke@435 208 IntInterval(jint beg, jint end) {
duke@435 209 assert(beg <= end, "illegal interval");
duke@435 210 _beg = beg;
duke@435 211 _end = end;
duke@435 212 }
duke@435 213
duke@435 214 jint beg() const { return _beg; }
duke@435 215 jint end() const { return _end; }
duke@435 216
duke@435 217 virtual bool is_interval() const { return true; }
duke@435 218 };
duke@435 219
duke@435 220
duke@435 221 class LongType: public ValueType {
duke@435 222 public:
duke@435 223 LongType(): ValueType(longTag, 2) {}
duke@435 224 virtual ValueType* base() const { return longType; }
duke@435 225 virtual const char tchar() const { return 'l'; }
duke@435 226 virtual const char* name() const { return "long"; }
duke@435 227 virtual LongType* as_LongType() { return this; }
duke@435 228 };
duke@435 229
duke@435 230
duke@435 231 class LongConstant: public LongType {
duke@435 232 private:
duke@435 233 jlong _value;
duke@435 234
duke@435 235 public:
duke@435 236 LongConstant(jlong value) { _value = value; }
duke@435 237
duke@435 238 jlong value() const { return _value; }
duke@435 239
duke@435 240 virtual bool is_constant() const { return true; }
duke@435 241 virtual LongConstant* as_LongConstant() { return this; }
duke@435 242 };
duke@435 243
duke@435 244
duke@435 245 class FloatType: public ValueType {
duke@435 246 public:
duke@435 247 FloatType(): ValueType(floatTag, 1) {}
duke@435 248 virtual ValueType* base() const { return floatType; }
duke@435 249 virtual const char tchar() const { return 'f'; }
duke@435 250 virtual const char* name() const { return "float"; }
duke@435 251 virtual FloatType* as_FloatType() { return this; }
duke@435 252 };
duke@435 253
duke@435 254
duke@435 255 class FloatConstant: public FloatType {
duke@435 256 private:
duke@435 257 jfloat _value;
duke@435 258
duke@435 259 public:
duke@435 260 FloatConstant(jfloat value) { _value = value; }
duke@435 261
duke@435 262 jfloat value() const { return _value; }
duke@435 263
duke@435 264 virtual bool is_constant() const { return true; }
duke@435 265 virtual FloatConstant* as_FloatConstant() { return this; }
duke@435 266 };
duke@435 267
duke@435 268
duke@435 269 class DoubleType: public ValueType {
duke@435 270 public:
duke@435 271 DoubleType(): ValueType(doubleTag, 2) {}
duke@435 272 virtual ValueType* base() const { return doubleType; }
duke@435 273 virtual const char tchar() const { return 'd'; }
duke@435 274 virtual const char* name() const { return "double"; }
duke@435 275 virtual DoubleType* as_DoubleType() { return this; }
duke@435 276 };
duke@435 277
duke@435 278
duke@435 279 class DoubleConstant: public DoubleType {
duke@435 280 private:
duke@435 281 jdouble _value;
duke@435 282
duke@435 283 public:
duke@435 284 DoubleConstant(jdouble value) { _value = value; }
duke@435 285
duke@435 286 jdouble value() const { return _value; }
duke@435 287
duke@435 288 virtual bool is_constant() const { return true; }
duke@435 289 virtual DoubleConstant* as_DoubleConstant() { return this; }
duke@435 290 };
duke@435 291
duke@435 292
duke@435 293 class ObjectType: public ValueType {
duke@435 294 public:
duke@435 295 ObjectType(): ValueType(objectTag, 1) {}
duke@435 296 virtual ValueType* base() const { return objectType; }
duke@435 297 virtual const char tchar() const { return 'a'; }
duke@435 298 virtual const char* name() const { return "object"; }
duke@435 299 virtual ObjectType* as_ObjectType() { return this; }
duke@435 300 virtual ciObject* constant_value() const { ShouldNotReachHere(); return NULL; }
duke@435 301 bool is_loaded() const;
duke@435 302 jobject encoding() const;
duke@435 303 };
duke@435 304
duke@435 305
duke@435 306 class ObjectConstant: public ObjectType {
duke@435 307 private:
duke@435 308 ciObject* _value;
duke@435 309
duke@435 310 public:
duke@435 311 ObjectConstant(ciObject* value) { _value = value; }
duke@435 312
duke@435 313 ciObject* value() const { return _value; }
duke@435 314
duke@435 315 virtual bool is_constant() const { return true; }
duke@435 316 virtual ObjectConstant* as_ObjectConstant() { return this; }
duke@435 317 virtual ciObject* constant_value() const;
duke@435 318 };
duke@435 319
duke@435 320
duke@435 321 class ArrayType: public ObjectType {
duke@435 322 public:
duke@435 323 virtual ArrayType* as_ArrayType() { return this; }
duke@435 324 };
duke@435 325
duke@435 326
duke@435 327 class ArrayConstant: public ArrayType {
duke@435 328 private:
duke@435 329 ciArray* _value;
duke@435 330
duke@435 331 public:
duke@435 332 ArrayConstant(ciArray* value) { _value = value; }
duke@435 333
duke@435 334 ciArray* value() const { return _value; }
duke@435 335
duke@435 336 virtual bool is_constant() const { return true; }
duke@435 337
duke@435 338 virtual ArrayConstant* as_ArrayConstant() { return this; }
duke@435 339 virtual ciObject* constant_value() const;
duke@435 340 };
duke@435 341
duke@435 342
duke@435 343 class InstanceType: public ObjectType {
duke@435 344 public:
duke@435 345 virtual InstanceType* as_InstanceType() { return this; }
duke@435 346 };
duke@435 347
duke@435 348
duke@435 349 class InstanceConstant: public InstanceType {
duke@435 350 private:
duke@435 351 ciInstance* _value;
duke@435 352
duke@435 353 public:
duke@435 354 InstanceConstant(ciInstance* value) { _value = value; }
duke@435 355
duke@435 356 ciInstance* value() const { return _value; }
duke@435 357
duke@435 358 virtual bool is_constant() const { return true; }
duke@435 359
duke@435 360 virtual InstanceConstant* as_InstanceConstant(){ return this; }
duke@435 361 virtual ciObject* constant_value() const;
duke@435 362 };
duke@435 363
duke@435 364
duke@435 365 class ClassType: public ObjectType {
duke@435 366 public:
duke@435 367 virtual ClassType* as_ClassType() { return this; }
duke@435 368 };
duke@435 369
duke@435 370
duke@435 371 class ClassConstant: public ClassType {
duke@435 372 private:
duke@435 373 ciInstanceKlass* _value;
duke@435 374
duke@435 375 public:
duke@435 376 ClassConstant(ciInstanceKlass* value) { _value = value; }
duke@435 377
duke@435 378 ciInstanceKlass* value() const { return _value; }
duke@435 379
duke@435 380 virtual bool is_constant() const { return true; }
duke@435 381
duke@435 382 virtual ClassConstant* as_ClassConstant() { return this; }
duke@435 383 virtual ciObject* constant_value() const;
duke@435 384 };
duke@435 385
duke@435 386
duke@435 387 class AddressType: public ValueType {
duke@435 388 public:
duke@435 389 AddressType(): ValueType(addressTag, 1) {}
duke@435 390 virtual ValueType* base() const { return addressType; }
duke@435 391 virtual const char tchar() const { return 'r'; }
duke@435 392 virtual const char* name() const { return "address"; }
duke@435 393 virtual AddressType* as_AddressType() { return this; }
duke@435 394 };
duke@435 395
duke@435 396
duke@435 397 class AddressConstant: public AddressType {
duke@435 398 private:
duke@435 399 jint _value;
duke@435 400
duke@435 401 public:
duke@435 402 AddressConstant(jint value) { _value = value; }
duke@435 403
duke@435 404 jint value() const { return _value; }
duke@435 405
duke@435 406 virtual bool is_constant() const { return true; }
duke@435 407
duke@435 408 virtual AddressConstant* as_AddressConstant() { return this; }
duke@435 409 };
duke@435 410
duke@435 411
duke@435 412 class IllegalType: public ValueType {
duke@435 413 public:
duke@435 414 IllegalType(): ValueType(illegalTag, -1) {}
duke@435 415 virtual ValueType* base() const { return illegalType; }
duke@435 416 virtual const char tchar() const { return ' '; }
duke@435 417 virtual const char* name() const { return "illegal"; }
duke@435 418 virtual IllegalType* as_IllegalType() { return this; }
duke@435 419 };
duke@435 420
duke@435 421
duke@435 422 // conversion between ValueTypes, BasicTypes, and ciConstants
duke@435 423 ValueType* as_ValueType(BasicType type);
duke@435 424 ValueType* as_ValueType(ciConstant value);
duke@435 425 BasicType as_BasicType(ValueType* type);
duke@435 426
duke@435 427 inline ValueType* as_ValueType(ciType* type) { return as_ValueType(type->basic_type()); }
stefank@2314 428
stefank@2314 429 #endif // SHARE_VM_C1_C1_VALUETYPE_HPP

mercurial