Mercurial > hg > graal-compiler
comparison src/share/vm/adlc/adlparse.cpp @ 6850:d336b3173277
8000592: Improve adlc usability
Summary: several changes to adlc to improve its usability
Reviewed-by: kvn
Contributed-by: goetz.lindenmaier@sap.com
author | kvn |
---|---|
date | Tue, 09 Oct 2012 16:09:31 -0700 |
parents | 8c92982cbbc4 |
children | 39901f2f1abe |
comparison
equal
deleted
inserted
replaced
6849:f6badecb7ea7 | 6850:d336b3173277 |
---|---|
1390 machnode->_machnode_pipe = pipe_class; | 1390 machnode->_machnode_pipe = pipe_class; |
1391 | 1391 |
1392 _AD.addForm(machnode); | 1392 _AD.addForm(machnode); |
1393 } | 1393 } |
1394 else if (!strcmp(ident, "attributes")) { | 1394 else if (!strcmp(ident, "attributes")) { |
1395 bool vsi_seen = false, bhds_seen = false; | 1395 bool vsi_seen = false; |
1396 | 1396 |
1397 skipws(); | 1397 skipws(); |
1398 if ( (_curchar != '%') | 1398 if ( (_curchar != '%') |
1399 || ( next_char(), (_curchar != '{')) ) { | 1399 || ( next_char(), (_curchar != '{')) ) { |
1400 parse_err(SYNERR, "expected '%{'\n"); | 1400 parse_err(SYNERR, "expected '%{'\n"); |
1434 if (_curchar == ';') { | 1434 if (_curchar == ';') { |
1435 next_char(); skipws(); | 1435 next_char(); skipws(); |
1436 } | 1436 } |
1437 | 1437 |
1438 pipeline->_branchHasDelaySlot = true; | 1438 pipeline->_branchHasDelaySlot = true; |
1439 bhds_seen = true; | |
1440 continue; | 1439 continue; |
1441 } | 1440 } |
1442 | 1441 |
1443 if (!strcmp(ident, "max_instructions_per_bundle")) { | 1442 if (!strcmp(ident, "max_instructions_per_bundle")) { |
1444 skipws(); | 1443 skipws(); |
1636 } | 1635 } |
1637 | 1636 |
1638 do { | 1637 do { |
1639 next_char(); // Skip "(" or "," | 1638 next_char(); // Skip "(" or "," |
1640 ident = get_ident(); // Grab next identifier | 1639 ident = get_ident(); // Grab next identifier |
1640 | |
1641 if (_AD._adl_debug > 1) { | |
1642 if (ident != NULL) { | |
1643 fprintf(stderr, "resource_parse: identifier: %s\n", ident); | |
1644 } | |
1645 } | |
1641 | 1646 |
1642 if (ident == NULL) { | 1647 if (ident == NULL) { |
1643 parse_err(SYNERR, "keyword identifier expected at \"%c\"\n", _curchar); | 1648 parse_err(SYNERR, "keyword identifier expected at \"%c\"\n", _curchar); |
1644 return; | 1649 return; |
1645 } | 1650 } |
2425 InstructForm *ADLParser::peep_match_child_parse(PeepMatch &match, int parent, int &position, int input){ | 2430 InstructForm *ADLParser::peep_match_child_parse(PeepMatch &match, int parent, int &position, int input){ |
2426 char *token = NULL; | 2431 char *token = NULL; |
2427 int lparen = 0; // keep track of parenthesis nesting depth | 2432 int lparen = 0; // keep track of parenthesis nesting depth |
2428 int rparen = 0; // position of instruction at this depth | 2433 int rparen = 0; // position of instruction at this depth |
2429 InstructForm *inst_seen = NULL; | 2434 InstructForm *inst_seen = NULL; |
2430 InstructForm *child_seen = NULL; | |
2431 | 2435 |
2432 // Walk the match tree, | 2436 // Walk the match tree, |
2433 // Record <parent, position, instruction name, input position> | 2437 // Record <parent, position, instruction name, input position> |
2434 while ( lparen >= rparen ) { | 2438 while ( lparen >= rparen ) { |
2435 skipws(); | 2439 skipws(); |
2436 // Left paren signals start of an input, collect with recursive call | 2440 // Left paren signals start of an input, collect with recursive call |
2437 if (_curchar == '(') { | 2441 if (_curchar == '(') { |
2438 ++lparen; | 2442 ++lparen; |
2439 next_char(); | 2443 next_char(); |
2440 child_seen = peep_match_child_parse(match, parent, position, rparen); | 2444 ( void ) peep_match_child_parse(match, parent, position, rparen); |
2441 } | 2445 } |
2442 // Right paren signals end of an input, may be more | 2446 // Right paren signals end of an input, may be more |
2443 else if (_curchar == ')') { | 2447 else if (_curchar == ')') { |
2444 ++rparen; | 2448 ++rparen; |
2445 if( rparen == lparen ) { // IF rparen matches an lparen I've seen | 2449 if( rparen == lparen ) { // IF rparen matches an lparen I've seen |
3152 if (_AD._adl_debug > 1) fprintf(stderr, "EncodingClass Form: %s\n", ec_name); | 3156 if (_AD._adl_debug > 1) fprintf(stderr, "EncodingClass Form: %s\n", ec_name); |
3153 } | 3157 } |
3154 | 3158 |
3155 | 3159 |
3156 //------------------------------size_parse----------------------------------- | 3160 //------------------------------size_parse----------------------------------- |
3161 // Parse a 'size(<expr>)' attribute which specifies the size of the | |
3162 // emitted instructions in bytes. <expr> can be a C++ expression, | |
3163 // e.g. a constant. | |
3157 char* ADLParser::size_parse(InstructForm *instr) { | 3164 char* ADLParser::size_parse(InstructForm *instr) { |
3158 char* sizeOfInstr = NULL; | 3165 char* sizeOfInstr = NULL; |
3159 | 3166 |
3160 // Get value of the instruction's size | 3167 // Get value of the instruction's size |
3161 skipws(); | 3168 skipws(); |
4272 c = *end; // Grab character to test | 4279 c = *end; // Grab character to test |
4273 } while ( ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) | 4280 } while ( ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) |
4274 || ((c >= '0') && (c <= '9')) | 4281 || ((c >= '0') && (c <= '9')) |
4275 || ((c == '_')) || ((c == ':')) || ((c == '#')) ); | 4282 || ((c == '_')) || ((c == ':')) || ((c == '#')) ); |
4276 if (start == end) { // We popped out on the first try | 4283 if (start == end) { // We popped out on the first try |
4277 parse_err(SYNERR, "identifier expected at %c\n", c); | 4284 // It can occur that `start' contains the rest of the input file. |
4285 // In this case the output should be truncated. | |
4286 if (strlen(start) > 24) { | |
4287 char buf[32]; | |
4288 strncpy(buf, start, 20); | |
4289 buf[20] = '\0'; | |
4290 strcat(buf, "[...]"); | |
4291 parse_err(SYNERR, "Identifier expected, but found '%s'.", buf); | |
4292 } else { | |
4293 parse_err(SYNERR, "Identifier expected, but found '%s'.", start); | |
4294 } | |
4278 start = NULL; | 4295 start = NULL; |
4279 } | 4296 } |
4280 else { | 4297 else { |
4281 _curchar = c; // Save the first character of next token | 4298 _curchar = c; // Save the first character of next token |
4282 *end = '\0'; // NULL terminate the string in place | 4299 *end = '\0'; // NULL terminate the string in place |