hotspot/src/share/vm/adlc/adlparse.cpp
changeset 2129 e810a33b5c67
parent 1675 cc1a5096e88f
child 2131 98f9cef66a34
equal deleted inserted replaced
2128:c08c265de2f5 2129:e810a33b5c67
     1 /*
     1 /*
     2  * Copyright 1997-2008 Sun Microsystems, Inc.  All Rights Reserved.
     2  * Copyright 1997-2009 Sun Microsystems, Inc.  All Rights Reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     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
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     7  * published by the Free Software Foundation.
   296   // Check for commutative operations with tree operands.
   296   // Check for commutative operations with tree operands.
   297   int count = 0;
   297   int count = 0;
   298   rule->count_commutative_op(count);
   298   rule->count_commutative_op(count);
   299   if (count > 0) {
   299   if (count > 0) {
   300     // Clone match rule and swap commutative operation's operands.
   300     // Clone match rule and swap commutative operation's operands.
   301     rule->swap_commutative_op(instr_ident, count, match_rules_cnt);
   301     rule->matchrule_swap_commutative_op(instr_ident, count, match_rules_cnt);
   302   }
   302   }
   303 }
   303 }
   304 
   304 
   305 //------------------------------adjust_set_rule--------------------------------
   305 //------------------------------adjust_set_rule--------------------------------
   306 // Check for "Set" form of chain rule
   306 // Check for "Set" form of chain rule
  2584   // Check for a constraint
  2584   // Check for a constraint
  2585   skipws();
  2585   skipws();
  2586   while( _curchar != ')' ) {
  2586   while( _curchar != ')' ) {
  2587     // Get information on the left instruction and its operand
  2587     // Get information on the left instruction and its operand
  2588     // left-instructions's number
  2588     // left-instructions's number
  2589     intptr_t   left_inst = get_int();
  2589     int left_inst = get_int();
  2590     // Left-instruction's operand
  2590     // Left-instruction's operand
  2591     skipws();
  2591     skipws();
  2592     if( _curchar != '.' ) {
  2592     if( _curchar != '.' ) {
  2593       parse_err(SYNERR, "missing '.' in peepconstraint after instruction number.\n");
  2593       parse_err(SYNERR, "missing '.' in peepconstraint after instruction number.\n");
  2594       return;
  2594       return;
  2600     // Collect relational operator
  2600     // Collect relational operator
  2601     char *relation = get_relation_dup();
  2601     char *relation = get_relation_dup();
  2602 
  2602 
  2603     skipws();
  2603     skipws();
  2604     // Get information on the right instruction and its operand
  2604     // Get information on the right instruction and its operand
  2605     intptr_t right_inst;        // Right-instructions's number
  2605     int right_inst;        // Right-instructions's number
  2606     if( isdigit(_curchar) ) {
  2606     if( isdigit(_curchar) ) {
  2607       right_inst = get_int();
  2607       right_inst = get_int();
  2608       // Right-instruction's operand
  2608       // Right-instruction's operand
  2609       skipws();
  2609       skipws();
  2610       if( _curchar != '.' ) {
  2610       if( _curchar != '.' ) {
  3495   skipws();
  3495   skipws();
  3496   while ( (_curchar != '%') && (*(_ptr+1) != '}') ) {
  3496   while ( (_curchar != '%') && (*(_ptr+1) != '}') ) {
  3497 
  3497 
  3498     // (1)
  3498     // (1)
  3499     // Check if there is a string to pass through to output
  3499     // Check if there is a string to pass through to output
  3500     char *start = _ptr;       // Record start of the next string
  3500     {
  3501     while ((_curchar != '$') && ((_curchar != '%') || (*(_ptr+1) != '}')) ) {
  3501       char *start = _ptr;       // Record start of the next string
  3502       // If at the start of a comment, skip past it
  3502       while ((_curchar != '$') && ((_curchar != '%') || (*(_ptr+1) != '}')) ) {
  3503       if( (_curchar == '/') && ((*(_ptr+1) == '/') || (*(_ptr+1) == '*')) ) {
  3503         // If at the start of a comment, skip past it
  3504         skipws_no_preproc();
  3504         if( (_curchar == '/') && ((*(_ptr+1) == '/') || (*(_ptr+1) == '*')) ) {
  3505       } else {
  3505           skipws_no_preproc();
  3506         // ELSE advance to the next character, or start of the next line
  3506         } else {
  3507         next_char_or_line();
  3507           // ELSE advance to the next character, or start of the next line
  3508       }
  3508           next_char_or_line();
  3509     }
  3509         }
  3510     // If a string was found, terminate it and record in EncClass
  3510       }
  3511     if ( start != _ptr ) {
  3511       // If a string was found, terminate it and record in EncClass
  3512       *_ptr  = '\0';          // Terminate the string
  3512       if ( start != _ptr ) {
  3513       // Add flag to _strings list indicating we should check _rep_vars
  3513         *_ptr  = '\0';          // Terminate the string
  3514       format->_strings.addName(NameList::_signal2);
  3514         // Add flag to _strings list indicating we should check _rep_vars
  3515       format->_strings.addName(start);
  3515         format->_strings.addName(NameList::_signal2);
       
  3516         format->_strings.addName(start);
       
  3517       }
  3516     }
  3518     }
  3517 
  3519 
  3518     // (2)
  3520     // (2)
  3519     // If we are at a replacement variable,
  3521     // If we are at a replacement variable,
  3520     // copy it and record in EncClass
  3522     // copy it and record in EncClass
  3561             // (2)
  3563             // (2)
  3562             // If we are at a replacement variable,
  3564             // If we are at a replacement variable,
  3563             // copy it and record in FormatRule
  3565             // copy it and record in FormatRule
  3564             if ( _curchar == '$' ) {
  3566             if ( _curchar == '$' ) {
  3565               next_char();          // Move past the '$'
  3567               next_char();          // Move past the '$'
  3566               char* rep_var = get_ident(); // Nil terminate the variable name
  3568               char* next_rep_var = get_ident(); // Nil terminate the variable name
  3567               rep_var = strdup(rep_var);// Copy the string
  3569               next_rep_var = strdup(next_rep_var);// Copy the string
  3568               *_ptr   = _curchar;     // and replace Nil with original character
  3570               *_ptr   = _curchar;     // and replace Nil with original character
  3569               format->_rep_vars.addName(rep_var);
  3571               format->_rep_vars.addName(next_rep_var);
  3570               // Add flag to _strings list indicating we should check _rep_vars
  3572               // Add flag to _strings list indicating we should check _rep_vars
  3571               format->_strings.addName(NameList::_signal);
  3573               format->_strings.addName(NameList::_signal);
  3572             }
  3574             }
  3573 
  3575 
  3574             // (3)
  3576             // (3)
  3712         skipws();
  3714         skipws();
  3713         if (ident2 == NULL) {
  3715         if (ident2 == NULL) {
  3714           parse_err(SYNERR, "identifier expected at %c\n", _curchar);
  3716           parse_err(SYNERR, "identifier expected at %c\n", _curchar);
  3715           continue;
  3717           continue;
  3716         }                            // Check that you have a valid operand
  3718         }                            // Check that you have a valid operand
  3717         const Form *form = instr->_localNames[ident2];
  3719         const Form *form2 = instr->_localNames[ident2];
  3718         if (!form) {
  3720         if (!form2) {
  3719           parse_err(SYNERR, "operand name expected at %s\n", ident2);
  3721           parse_err(SYNERR, "operand name expected at %s\n", ident2);
  3720           continue;
  3722           continue;
  3721         }
  3723         }
  3722         oper = form->is_operand();
  3724         oper = form2->is_operand();
  3723         if (oper == NULL && !form->is_opclass()) {
  3725         if (oper == NULL && !form2->is_opclass()) {
  3724           parse_err(SYNERR, "operand name expected at %s\n", ident2);
  3726           parse_err(SYNERR, "operand name expected at %s\n", ident2);
  3725           continue;
  3727           continue;
  3726         }                            // Add operand to list
  3728         }                            // Add operand to list
  3727         instr_and_operands->add_entry(ident2);
  3729         instr_and_operands->add_entry(ident2);
  3728       } while(_curchar == ',');
  3730       } while(_curchar == ',');
  4269   char         *start;            // Pointer to start of token
  4271   char         *start;            // Pointer to start of token
  4270   char         *end;              // Pointer to end of token
  4272   char         *end;              // Pointer to end of token
  4271   int           result;           // Storage for integer result
  4273   int           result;           // Storage for integer result
  4272 
  4274 
  4273   if( _curline == NULL )          // Return NULL at EOF.
  4275   if( _curline == NULL )          // Return NULL at EOF.
  4274     return NULL;
  4276     return 0;
  4275 
  4277 
  4276   skipws();                       // Skip whitespace before identifier
  4278   skipws();                       // Skip whitespace before identifier
  4277   start = end = _ptr;             // Start points at first character
  4279   start = end = _ptr;             // Start points at first character
  4278   c = *end;                       // Grab character to test
  4280   c = *end;                       // Grab character to test
  4279   while ((c >= '0') && (c <= '9')
  4281   while ((c >= '0') && (c <= '9')