src/share/vm/adlc/forms.hpp

Wed, 31 Jan 2018 19:24:57 -0500

author
dbuck
date
Wed, 31 Jan 2018 19:24:57 -0500
changeset 9289
427b2fb1944f
parent 7853
a1642365d69f
child 7994
04ff2f6cd0eb
permissions
-rw-r--r--

8189170: Add option to disable stack overflow checking in primordial thread for use with JNI_CreateJavaJVM
Reviewed-by: dcubed

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

mercurial