src/share/vm/adlc/forms.hpp

Mon, 25 Jun 2012 21:33:35 -0400

author
coleenp
date
Mon, 25 Jun 2012 21:33:35 -0400
changeset 3875
246d977b51f2
parent 2314
f95d63e2154a
child 3882
8c92982cbbc4
permissions
-rw-r--r--

7178670: runtime/7158800/BadUtf8.java fails in SymbolTable::rehash_table
Summary: Cannot delete _buckets and HashtableEntries in shared space (CDS)
Reviewed-by: acorn, kvn, dlong, dcubed, kamg

duke@435 1 /*
stefank@2314 2 * Copyright (c) 1997, 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_ADLC_FORMS_HPP
stefank@2314 26 #define SHARE_VM_ADLC_FORMS_HPP
stefank@2314 27
duke@435 28 // FORMS.HPP - ADL Parser Generic and Utility Forms Classes
duke@435 29
duke@435 30 #define TRUE 1
duke@435 31 #define FALSE 0
duke@435 32
duke@435 33 // DEFINITIONS OF LEGAL ATTRIBUTE TYPES
duke@435 34 #define INS_ATTR 0
duke@435 35 #define OP_ATTR 1
duke@435 36
duke@435 37 // DEFINITIONS OF LEGAL CONSTRAINT TYPES
duke@435 38
duke@435 39 // Class List
duke@435 40 class Form;
duke@435 41 class InstructForm;
duke@435 42 class MachNodeForm;
duke@435 43 class OperandForm;
duke@435 44 class OpClassForm;
duke@435 45 class AttributeForm;
duke@435 46 class RegisterForm;
duke@435 47 class PipelineForm;
duke@435 48 class SourceForm;
duke@435 49 class EncodeForm;
duke@435 50 class Component;
duke@435 51 class Constraint;
duke@435 52 class Predicate;
duke@435 53 class MatchRule;
duke@435 54 class Attribute;
duke@435 55 class Effect;
duke@435 56 class ExpandRule;
duke@435 57 class RewriteRule;
duke@435 58 class ConstructRule;
duke@435 59 class FormatRule;
duke@435 60 class Peephole;
duke@435 61 class EncClass;
duke@435 62 class Interface;
duke@435 63 class RegInterface;
duke@435 64 class ConstInterface;
duke@435 65 class MemInterface;
duke@435 66 class CondInterface;
duke@435 67 class Opcode;
duke@435 68 class InsEncode;
duke@435 69 class RegDef;
duke@435 70 class RegClass;
duke@435 71 class AllocClass;
duke@435 72 class ResourceForm;
duke@435 73 class PipeClassForm;
duke@435 74 class PeepMatch;
duke@435 75 class PeepConstraint;
duke@435 76 class PeepReplace;
duke@435 77 class MatchList;
duke@435 78
duke@435 79 class ArchDesc;
duke@435 80
duke@435 81 //------------------------------FormDict---------------------------------------
duke@435 82 // Dictionary containing Forms, and objects derived from forms
duke@435 83 class FormDict {
duke@435 84 private:
duke@435 85 Dict _form; // map names, char*, to their Form* or NULL
duke@435 86
duke@435 87 // Disable public use of constructor, copy-ctor, operator =, operator ==
duke@435 88 FormDict( );
duke@435 89 FormDict &operator =( const FormDict & );
duke@435 90 // == compares two dictionaries; they must have the same keys (their keys
duke@435 91 // must match using CmpKey) and they must have the same values (pointer
duke@435 92 // comparison). If so 1 is returned, if not 0 is returned.
duke@435 93 bool operator ==(const FormDict &d) const; // Compare dictionaries for equal
duke@435 94
duke@435 95 public:
duke@435 96 // cmp is a key comparision routine. hash is a routine to hash a key.
duke@435 97 // FormDict( CmpKey cmp, Hash hash );
duke@435 98 FormDict( CmpKey cmp, Hash hash, Arena *arena );
duke@435 99 FormDict( const FormDict & fd ); // Deep-copy guts
duke@435 100 ~FormDict();
duke@435 101
duke@435 102 // Return # of key-value pairs in dict
duke@435 103 int Size(void) const;
duke@435 104
duke@435 105 // Insert inserts the given key-value pair into the dictionary. The prior
duke@435 106 // value of the key is returned; NULL if the key was not previously defined.
duke@435 107 const Form *Insert(const char *name, Form *form); // A new key-value
duke@435 108
duke@435 109 // Find finds the value of a given key; or NULL if not found.
duke@435 110 // The dictionary is NOT changed.
duke@435 111 const Form *operator [](const char *name) const; // Do a lookup
duke@435 112
duke@435 113 void dump();
duke@435 114 };
duke@435 115
duke@435 116 // ***** Master Class for ADL Parser Forms *****
duke@435 117 //------------------------------Form-------------------------------------------
duke@435 118 class Form {
duke@435 119 public:
duke@435 120 static Arena *arena; // arena used by forms
duke@435 121 private:
duke@435 122 static Arena *generate_arena(); // allocate arena used by forms
duke@435 123
duke@435 124 protected:
duke@435 125 int _ftype; // Indicator for derived class type
duke@435 126
duke@435 127 public:
duke@435 128 // Public Data
duke@435 129 Form *_next; // Next pointer for form lists
twisti@1038 130 int _linenum; // Line number for debugging
duke@435 131
duke@435 132 // Dynamic type check for common forms.
duke@435 133 virtual OpClassForm *is_opclass() const;
duke@435 134 virtual OperandForm *is_operand() const;
duke@435 135 virtual InstructForm *is_instruction() const;
duke@435 136 virtual MachNodeForm *is_machnode() const;
duke@435 137 virtual AttributeForm *is_attribute() const;
duke@435 138 virtual Effect *is_effect() const;
duke@435 139 virtual ResourceForm *is_resource() const;
duke@435 140 virtual PipeClassForm *is_pipeclass() const;
duke@435 141
duke@435 142 // Check if this form is an operand usable for cisc-spilling
duke@435 143 virtual bool is_cisc_reg(FormDict &globals) const { return false; }
duke@435 144 virtual bool is_cisc_mem(FormDict &globals) const { return false; }
duke@435 145
duke@435 146 // Public Methods
duke@435 147 Form(int formType=0, int line=0)
duke@435 148 : _next(NULL), _linenum(line), _ftype(formType) { };
duke@435 149 ~Form() {};
duke@435 150
duke@435 151 virtual bool ideal_only() const {
duke@435 152 assert(0,"Check of ideal status on non-instruction/operand form.\n");
duke@435 153 return FALSE;
duke@435 154 }
duke@435 155
duke@435 156 // Check constraints after parsing
duke@435 157 virtual bool verify() { return true; }
duke@435 158
duke@435 159 virtual void dump() { output(stderr); } // Debug printer
duke@435 160 // Write info to output files
duke@435 161 virtual void output(FILE *fp) { fprintf(fp,"Form Output"); }
duke@435 162
duke@435 163 public:
duke@435 164 // ADLC types, match the last character on ideal operands and instructions
duke@435 165 enum DataType {
duke@435 166 none = 0, // Not a simple type
duke@435 167 idealI = 1, // Integer type
duke@435 168 idealP = 2, // Pointer types, oop(s)
duke@435 169 idealL = 3, // Long type
duke@435 170 idealF = 4, // Float type
duke@435 171 idealD = 5, // Double type
duke@435 172 idealB = 6, // Byte type
duke@435 173 idealC = 7, // Char type
coleenp@548 174 idealS = 8, // String type
coleenp@548 175 idealN = 9 // Narrow oop types
duke@435 176 };
duke@435 177 // Convert ideal name to a DataType, return DataType::none if not a 'ConX'
duke@435 178 Form::DataType ideal_to_const_type(const char *ideal_type_name) const;
duke@435 179 // Convert ideal name to a DataType, return DataType::none if not a 'sRegX
duke@435 180 Form::DataType ideal_to_sReg_type(const char *name) const;
duke@435 181 // Convert ideal name to a DataType, return DataType::none if not a 'RegX
duke@435 182 Form::DataType ideal_to_Reg_type(const char *name) const;
duke@435 183
duke@435 184 // Convert ideal name to a DataType, return DataType::none if not a 'LoadX
duke@435 185 Form::DataType is_load_from_memory(const char *opType) const;
duke@435 186 // Convert ideal name to a DataType, return DataType::none if not a 'StoreX
duke@435 187 Form::DataType is_store_to_memory(const char *opType) const;
duke@435 188
duke@435 189 // ADLC call types, matched with ideal world
duke@435 190 enum CallType {
duke@435 191 invalid_type = 0, // invalid call type
duke@435 192 JAVA_STATIC = 1, // monomorphic entry
duke@435 193 JAVA_DYNAMIC = 2, // possibly megamorphic, inline cache call
duke@435 194 JAVA_COMPILED = 3, // callee will be compiled java
duke@435 195 JAVA_INTERP = 4, // callee will be executed by interpreter
duke@435 196 JAVA_NATIVE = 5, // native entrypoint
duke@435 197 JAVA_RUNTIME = 6, // runtime entrypoint
duke@435 198 JAVA_LEAF = 7 // calling leaf
duke@435 199 };
duke@435 200
duke@435 201 // Interface types for operands and operand classes
duke@435 202 enum InterfaceType {
duke@435 203 no_interface = 0, // unknown or inconsistent interface type
duke@435 204 constant_interface = 1, // interface to constants
duke@435 205 register_interface = 2, // interface to registers
duke@435 206 memory_interface = 3, // interface to memory
duke@435 207 conditional_interface = 4 // interface for condition codes
duke@435 208 };
duke@435 209 virtual Form::InterfaceType interface_type(FormDict &globals) const;
duke@435 210
duke@435 211 enum CiscSpillInfo {
duke@435 212 Not_cisc_spillable = AdlcVMDeps::Not_cisc_spillable,
duke@435 213 Maybe_cisc_spillable = 0,
duke@435 214 Is_cisc_spillable = 1
duke@435 215 // ...
duke@435 216 };
duke@435 217
duke@435 218 // LEGAL FORM TYPES
duke@435 219 enum {
duke@435 220 INS,
duke@435 221 OPER,
duke@435 222 OPCLASS,
duke@435 223 SRC,
duke@435 224 ADEF,
duke@435 225 REG,
duke@435 226 PIPE,
duke@435 227 CNST,
duke@435 228 PRED,
duke@435 229 ATTR,
duke@435 230 MAT,
duke@435 231 ENC,
duke@435 232 FOR,
duke@435 233 EXP,
duke@435 234 REW,
duke@435 235 EFF,
duke@435 236 RDEF,
duke@435 237 RCL,
duke@435 238 ACL,
duke@435 239 RES,
duke@435 240 PCL,
duke@435 241 PDEF,
duke@435 242 REGL,
duke@435 243 RESL,
duke@435 244 STAL,
duke@435 245 COMP,
duke@435 246 PEEP,
duke@435 247 RESO
duke@435 248 };
duke@435 249
duke@435 250 };
duke@435 251
duke@435 252 //------------------------------FormList---------------------------------------
duke@435 253 class FormList {
duke@435 254 private:
duke@435 255 Form *_root;
duke@435 256 Form *_tail;
duke@435 257 Form *_cur;
duke@435 258 int _justReset; // Set immediately after reset
duke@435 259 Form *_cur2; // Nested iterator
duke@435 260 int _justReset2;
duke@435 261
duke@435 262 public:
duke@435 263 void addForm(Form * entry) {
duke@435 264 if (_tail==NULL) { _root = _tail = _cur = entry;}
duke@435 265 else { _tail->_next = entry; _tail = entry;}
duke@435 266 };
duke@435 267 Form * current() { return _cur; };
duke@435 268 Form * iter() { if (_justReset) _justReset = 0;
duke@435 269 else if (_cur) _cur = _cur->_next;
duke@435 270 return _cur;};
duke@435 271 void reset() { if (_root) {_cur = _root; _justReset = 1;} };
duke@435 272
duke@435 273 // Second iterator, state is internal
duke@435 274 Form * current2(){ return _cur2; };
duke@435 275 Form * iter2() { if (_justReset2) _justReset2 = 0;
duke@435 276 else if (_cur2) _cur2 = _cur2->_next;
duke@435 277 return _cur2;};
duke@435 278 void reset2() { if (_root) {_cur2 = _root; _justReset2 = 1;} };
duke@435 279
duke@435 280 int count() {
duke@435 281 int count = 0; reset();
duke@435 282 for( Form *cur; (cur = iter()) != NULL; ) { ++count; };
duke@435 283 return count;
duke@435 284 }
duke@435 285
duke@435 286 void dump() {
duke@435 287 reset();
duke@435 288 Form *cur;
duke@435 289 for(; (cur = iter()) != NULL; ) {
duke@435 290 cur->dump();
duke@435 291 };
duke@435 292 }
duke@435 293
duke@435 294 bool verify() {
duke@435 295 bool verified = true;
duke@435 296
duke@435 297 reset();
duke@435 298 Form *cur;
duke@435 299 for(; (cur = iter()) != NULL; ) {
duke@435 300 if ( ! cur->verify() ) verified = false;
duke@435 301 };
duke@435 302
duke@435 303 return verified;
duke@435 304 }
duke@435 305
duke@435 306 void output(FILE* fp) {
duke@435 307 reset();
duke@435 308 Form *cur;
duke@435 309 for( ; (cur = iter()) != NULL; ) {
duke@435 310 cur->output(fp);
duke@435 311 };
duke@435 312 }
duke@435 313
duke@435 314 FormList() { _justReset = 1; _justReset2 = 1; _root = NULL; _tail = NULL; _cur = NULL; _cur2 = NULL;};
duke@435 315 ~FormList();
duke@435 316 };
duke@435 317
duke@435 318 //------------------------------NameList---------------------------------------
duke@435 319 // Extendable list of pointers, <char *>
duke@435 320 class NameList {
duke@435 321 friend class PreserveIter;
duke@435 322
duke@435 323 private:
duke@435 324 int _cur; // Insert next entry here; count of entries
duke@435 325 int _max; // Number of spaces allocated
duke@435 326 const char **_names; // Array of names
duke@435 327
duke@435 328 protected:
duke@435 329 int _iter; // position during iteration
duke@435 330 bool _justReset; // Set immediately after reset
duke@435 331
duke@435 332
duke@435 333 public:
duke@435 334 static const char *_signal; // reserved user-defined string
never@850 335 static const char *_signal2; // reserved user-defined string
never@850 336 static const char *_signal3; // reserved user-defined string
duke@435 337 enum { Not_in_list = -1 };
duke@435 338
duke@435 339 void addName(const char *name);
duke@435 340 void add_signal();
duke@435 341 void clear(); // Remove all entries
duke@435 342
duke@435 343 int count() const;
duke@435 344
duke@435 345 void reset(); // Reset iteration
duke@435 346 const char *iter(); // after reset(), first element : else next
duke@435 347 const char *current(); // return current element in iteration.
twisti@1059 348 const char *peek(int skip = 1); // returns element + skip in iteration if there is one
duke@435 349
duke@435 350 bool current_is_signal(); // Return 'true' if current entry is signal
duke@435 351 bool is_signal(const char *entry); // Return true if entry is a signal
duke@435 352
duke@435 353 bool search(const char *); // Search for a name in the list
duke@435 354 int index(const char *); // Return index of name in list
duke@435 355 const char *name (intptr_t index);// Return name at index in list
duke@435 356
duke@435 357 void dump(); // output to stderr
duke@435 358 void output(FILE *fp); // Output list of names to 'fp'
duke@435 359
duke@435 360 NameList();
duke@435 361 ~NameList();
duke@435 362 };
duke@435 363
duke@435 364
duke@435 365 // Convenience class to preserve iteration state since iterators are
duke@435 366 // internal instead of being external.
duke@435 367 class PreserveIter {
duke@435 368 private:
duke@435 369 NameList* _list;
duke@435 370 int _iter;
duke@435 371 bool _justReset;
duke@435 372
duke@435 373 public:
duke@435 374 PreserveIter(NameList* nl) {
duke@435 375 _list = nl;
duke@435 376 _iter = _list->_iter;
duke@435 377 _justReset = _list->_justReset;
duke@435 378 }
duke@435 379 ~PreserveIter() {
duke@435 380 _list->_iter = _iter;
duke@435 381 _list->_justReset = _justReset;
duke@435 382 }
duke@435 383
duke@435 384 };
duke@435 385
duke@435 386
duke@435 387 //------------------------------NameAndList------------------------------------
duke@435 388 // Storage for a name and an associated list of names
duke@435 389 class NameAndList {
duke@435 390 private:
duke@435 391 const char *_name;
duke@435 392 NameList _list;
duke@435 393
duke@435 394 public:
duke@435 395 NameAndList(char *name);
duke@435 396 ~NameAndList();
duke@435 397
duke@435 398 // Add to entries in list
duke@435 399 void add_entry(const char *entry);
duke@435 400
duke@435 401 // Access the name and its associated list.
duke@435 402 const char *name() const;
duke@435 403 void reset();
duke@435 404 const char *iter();
duke@435 405
duke@435 406 int count() { return _list.count(); }
duke@435 407
duke@435 408 // Return the "index" entry in the list, zero-based
duke@435 409 const char *operator[](int index);
duke@435 410
duke@435 411
duke@435 412 void dump(); // output to stderr
duke@435 413 void output(FILE *fp); // Output list of names to 'fp'
duke@435 414 };
duke@435 415
duke@435 416 //------------------------------ComponentList---------------------------------
duke@435 417 // Component lists always have match rule operands first, followed by parameter
duke@435 418 // operands which do not appear in the match list (in order of declaration).
duke@435 419 class ComponentList : private NameList {
duke@435 420 private:
duke@435 421 int _matchcnt; // Count of match rule operands
duke@435 422
duke@435 423 public:
duke@435 424
duke@435 425 // This is a batch program. (And I have a destructor bug!)
duke@435 426 void operator delete( void *ptr ) {}
duke@435 427
duke@435 428 void insert(Component *component, bool mflag);
duke@435 429 void insert(const char *name, const char *opType, int usedef, bool mflag);
duke@435 430
duke@435 431 int count();
duke@435 432 int match_count() { return _matchcnt; } // Get count of match rule opers
duke@435 433
duke@435 434 Component *iter(); // after reset(), first element : else next
duke@435 435 Component *match_iter(); // after reset(), first element : else next
duke@435 436 Component *post_match_iter(); // after reset(), first element : else next
duke@435 437 void reset(); // Reset iteration
duke@435 438 Component *current(); // return current element in iteration.
duke@435 439
duke@435 440 // Return element at "position", else NULL
duke@435 441 Component *operator[](int position);
duke@435 442 Component *at(int position) { return (*this)[position]; }
duke@435 443
duke@435 444 // Return first component having this name.
duke@435 445 const Component *search(const char *name);
duke@435 446
duke@435 447 // Return number of USEs + number of DEFs
duke@435 448 int num_operands();
duke@435 449 // Return zero-based position in list; -1 if not in list.
duke@435 450 int operand_position(const char *name, int usedef);
duke@435 451 // Find position for this name, regardless of use/def information
duke@435 452 int operand_position(const char *name);
duke@435 453 // Find position for this name when looked up for output via "format"
duke@435 454 int operand_position_format(const char *name);
duke@435 455 // Find position for the Label when looked up for output via "format"
duke@435 456 int label_position();
duke@435 457 // Find position for the Method when looked up for output via "format"
duke@435 458 int method_position();
duke@435 459
duke@435 460 void dump(); // output to stderr
duke@435 461 void output(FILE *fp); // Output list of names to 'fp'
duke@435 462
duke@435 463 ComponentList();
duke@435 464 ~ComponentList();
duke@435 465 };
duke@435 466
duke@435 467 //------------------------------SourceForm-------------------------------------
duke@435 468 class SourceForm : public Form {
duke@435 469 private:
duke@435 470
duke@435 471 public:
duke@435 472 // Public Data
duke@435 473 char *_code; // Buffer for storing code text
duke@435 474
duke@435 475 // Public Methods
duke@435 476 SourceForm(char* code);
duke@435 477 ~SourceForm();
duke@435 478
duke@435 479 virtual const char* classname() { return "SourceForm"; }
duke@435 480
duke@435 481 void dump(); // Debug printer
duke@435 482 void output(FILE *fp); // Write output files
duke@435 483 };
duke@435 484
duke@435 485 class HeaderForm : public SourceForm {
duke@435 486 public:
duke@435 487 HeaderForm(char* code) : SourceForm(code) { }
duke@435 488
duke@435 489 virtual const char* classname() { return "HeaderForm"; }
duke@435 490 };
duke@435 491
duke@435 492 class PreHeaderForm : public SourceForm {
duke@435 493 public:
duke@435 494 PreHeaderForm(char* code) : SourceForm(code) { }
duke@435 495
duke@435 496 virtual const char* classname() { return "PreHeaderForm"; }
duke@435 497 };
duke@435 498
duke@435 499
duke@435 500
duke@435 501
duke@435 502 //------------------------------Expr------------------------------------------
duke@435 503 #define STRING_BUFFER_LENGTH 2048
duke@435 504 // class Expr represents integer expressions containing constants and addition
duke@435 505 // Value must be in range zero through maximum positive integer. 32bits.
duke@435 506 // Expected use: instruction and operand costs
duke@435 507 class Expr {
duke@435 508 public:
duke@435 509 enum {
duke@435 510 Zero = 0,
duke@435 511 Max = 0x7fffffff
duke@435 512 };
duke@435 513 const char *_external_name; // if !NULL, then print this instead of _expr
duke@435 514 const char *_expr;
duke@435 515 int _min_value;
duke@435 516 int _max_value;
duke@435 517
duke@435 518 Expr();
duke@435 519 Expr(const char *cost);
duke@435 520 Expr(const char *name, const char *expression, int min_value, int max_value);
duke@435 521 Expr *clone() const;
duke@435 522
duke@435 523 bool is_unknown() const { return (this == Expr::get_unknown()); }
duke@435 524 bool is_zero() const { return (_min_value == Expr::Zero && _max_value == Expr::Zero); }
duke@435 525 bool less_than_or_equal(const Expr *c) const { return (_max_value <= c->_min_value); }
duke@435 526
duke@435 527 void add(const Expr *c);
duke@435 528 void add(const char *c);
duke@435 529 void add(const char *c, ArchDesc &AD); // check if 'c' is defined in <arch>.ad
duke@435 530 void set_external_name(const char *name) { _external_name = name; }
duke@435 531
duke@435 532 const char *as_string() const { return (_external_name != NULL ? _external_name : _expr); }
duke@435 533 void print() const;
duke@435 534 void print_define(FILE *fp) const;
duke@435 535 void print_assert(FILE *fp) const;
duke@435 536
duke@435 537 static Expr *get_unknown(); // Returns pointer to shared unknown cost instance
duke@435 538
duke@435 539 static char *buffer() { return &external_buffer[0]; }
duke@435 540 static bool init_buffers(); // Fill buffers with 0
duke@435 541 static bool check_buffers(); // if buffer use may have overflowed, assert
duke@435 542
duke@435 543 private:
duke@435 544 static Expr *_unknown_expr;
duke@435 545 static char string_buffer[STRING_BUFFER_LENGTH];
duke@435 546 static char external_buffer[STRING_BUFFER_LENGTH];
duke@435 547 static bool _init_buffers;
duke@435 548 const char *compute_expr(const Expr *c1, const Expr *c2); // cost as string after adding 'c1' and 'c2'
duke@435 549 int compute_min (const Expr *c1, const Expr *c2); // minimum after adding 'c1' and 'c2'
duke@435 550 int compute_max (const Expr *c1, const Expr *c2); // maximum after adding 'c1' and 'c2'
duke@435 551 const char *compute_external(const Expr *c1, const Expr *c2); // external name after adding 'c1' and 'c2'
duke@435 552 };
duke@435 553
duke@435 554 //------------------------------ExprDict---------------------------------------
duke@435 555 // Dictionary containing Exprs
duke@435 556 class ExprDict {
duke@435 557 private:
duke@435 558 Dict _expr; // map names, char*, to their Expr* or NULL
duke@435 559 NameList _defines; // record the order of definitions entered with define call
duke@435 560
duke@435 561 // Disable public use of constructor, copy-ctor, operator =, operator ==
duke@435 562 ExprDict( );
duke@435 563 ExprDict( const ExprDict & ); // Deep-copy guts
duke@435 564 ExprDict &operator =( const ExprDict & );
duke@435 565 // == compares two dictionaries; they must have the same keys (their keys
duke@435 566 // must match using CmpKey) and they must have the same values (pointer
duke@435 567 // comparison). If so 1 is returned, if not 0 is returned.
duke@435 568 bool operator ==(const ExprDict &d) const; // Compare dictionaries for equal
duke@435 569
duke@435 570 public:
duke@435 571 // cmp is a key comparision routine. hash is a routine to hash a key.
duke@435 572 ExprDict( CmpKey cmp, Hash hash, Arena *arena );
duke@435 573 ~ExprDict();
duke@435 574
duke@435 575 // Return # of key-value pairs in dict
duke@435 576 int Size(void) const;
duke@435 577
duke@435 578 // define inserts the given key-value pair into the dictionary,
duke@435 579 // and records the name in order for later output, ...
duke@435 580 const Expr *define(const char *name, Expr *expr);
duke@435 581
duke@435 582 // Insert inserts the given key-value pair into the dictionary. The prior
duke@435 583 // value of the key is returned; NULL if the key was not previously defined.
duke@435 584 const Expr *Insert(const char *name, Expr *expr); // A new key-value
duke@435 585
duke@435 586 // Find finds the value of a given key; or NULL if not found.
duke@435 587 // The dictionary is NOT changed.
duke@435 588 const Expr *operator [](const char *name) const; // Do a lookup
duke@435 589
duke@435 590 void print_defines(FILE *fp);
duke@435 591 void print_asserts(FILE *fp);
duke@435 592 void dump();
duke@435 593 };
stefank@2314 594
stefank@2314 595 #endif // SHARE_VM_ADLC_FORMS_HPP

mercurial