Author: asl
Date: Tue Aug 28 10:57:24 2007
New Revision: 41538

URL: http://llvm.org/viewvc/llvm-project?rev=41538&view=rev
Log:
Fix handling of cw-style asm blocks.

Modified:
    llvm-gcc-4.2/trunk/gcc/c-parser.c
    llvm-gcc-4.2/trunk/gcc/cp/parser.c

Modified: llvm-gcc-4.2/trunk/gcc/c-parser.c
URL: 
http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/c-parser.c?rev=41538&r1=41537&r2=41538&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/c-parser.c (original)
+++ llvm-gcc-4.2/trunk/gcc/c-parser.c Tue Aug 28 10:57:24 2007
@@ -4464,12 +4464,14 @@
        }
       return NULL_TREE;
     }
-  if (c_parser_next_token_is (parser, CPP_DOT)
-      || c_parser_next_token_is (parser, CPP_ATSIGN)
-      || c_parser_next_token_is (parser, CPP_NAME)
-      || c_parser_next_token_is_keyword (parser, RID_ASM)
-      || c_parser_next_token_is (parser, CPP_SEMICOLON)
-      || c_parser_iasm_bol (parser))
+  if (quals == NULL_TREE
+      && (c_parser_next_token_is (parser, CPP_DOT)
+         || c_parser_next_token_is (parser, CPP_ATSIGN)
+         || c_parser_next_token_is (parser, CPP_NAME)
+         || c_parser_next_token_is_keyword (parser, RID_ASM)
+         || c_parser_next_token_is (parser, CPP_SEMICOLON)
+         || (c_parser_iasm_bol (parser)
+             && ! c_parser_next_token_is (parser, CPP_OPEN_PAREN))))
     {
       if (flag_iasm_blocks)
        c_parser_iasm_top_statement (parser);
@@ -5338,6 +5340,8 @@
      postfix-expression [ expression ]
      postfix-expression ( argument-expression-list[opt] )
      postfix-expression . identifier
+     APPLE LOCAL CW asm blocks
+     typedef-name . identifier
      postfix-expression -> identifier
      postfix-expression ++
      postfix-expression --
@@ -5351,7 +5355,11 @@
      argument-expression-list , argument-expression
 
    primary-expression:
+     APPLE LOCAL CW asm blocks
+     .
      identifier
+     APPLE LOCAL CW asm blocks
+     @identifier
      constant
      string-literal
      ( expression )
@@ -5442,6 +5450,16 @@
       /* APPLE LOCAL end radar 5277239 */
       if (c_parser_peek_token (parser)->id_kind != C_ID_ID)
        {
+         /* APPLE LOCAL begin CW asm blocks (in 4.2 bf) */
+         if (inside_iasm_block
+             && c_parser_peek_2nd_token (parser)->type == CPP_DOT)
+           {
+             expr.value = c_parser_peek_token (parser)->value;
+             expr.original_code = ERROR_MARK;
+             c_parser_consume_token (parser);
+             break;
+           }
+         /* APPLE LOCAL end CW asm blocks (in 4.2 bf) */
          c_parser_error (parser, "expected expression");
          expr.value = error_mark_node;
          expr.original_code = ERROR_MARK;
@@ -5828,6 +5846,29 @@
              expr.original_code = ERROR_MARK;
              break;
            }
+         /* (in 4.2 be) */
+         if (c_parser_next_token_is (parser, CPP_ATSIGN))
+           {
+             tree id;
+             location_t loc = c_parser_peek_token (parser)->location;
+             c_parser_consume_token (parser);
+             if (c_parser_peek_token (parser)->id_kind != C_ID_ID)
+               {
+                 c_parser_error (parser, "expected identifier");
+                 expr.value = error_mark_node;
+                 expr.original_code = ERROR_MARK;
+                 break;
+               }
+
+             id = c_parser_peek_token (parser)->value;
+             c_parser_consume_token (parser);
+             id = prepend_char_identifier (id, '@');
+             expr.value = build_external_ref (id,
+                                              (c_parser_peek_token 
(parser)->type
+                                               == CPP_OPEN_PAREN), loc);
+             expr.original_code = ERROR_MARK;
+             break;
+           }
        }
       /* APPLE LOCAL end CW asm blocks */
       c_parser_error (parser, "expected expression");
@@ -5882,6 +5923,11 @@
   tree ident, idx, exprlist;
   while (true)
     {
+      /* APPLE LOCAL begin CW asm blocks */
+      if (inside_iasm_block
+         && c_parser_iasm_bol (parser))
+       return expr;
+      /* APPLE LOCAL end CW asm blocks */
       switch (c_parser_peek_token (parser)->type)
        {
        case CPP_OPEN_SQUARE:
@@ -5894,6 +5940,10 @@
          expr.original_code = ERROR_MARK;
          break;
        case CPP_OPEN_PAREN:
+         /* APPLE LOCAL begin CW asm blocks (in 4.2 bd) */
+         if (inside_iasm_block)
+           return expr;
+         /* APPLE LOCAL end CW asm blocks (in 4.2 bd) */
          /* Function call.  */
          c_parser_consume_token (parser);
          if (c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
@@ -5909,19 +5959,24 @@
          /* Structure element reference.  */
          c_parser_consume_token (parser);
          expr = default_function_array_conversion (expr);
-         if (c_parser_next_token_is (parser, CPP_NAME))
-           ident = c_parser_peek_token (parser)->value;
-         /* APPLE LOCAL begin CW asm blocks (in 4.2 bc) */
-         else if (inside_iasm_block
-                  && c_parser_next_token_is (parser, CPP_NUMBER))
+         /* APPLE LOCAL begin CW asm blocks */
+         if (inside_iasm_block)
            {
-             tree c = c_parser_peek_token (parser)->value;
-             c_parser_consume_token (parser);
-             expr.value = iasm_c_build_component_ref (expr.value, c);
-             expr.original_code = ERROR_MARK;
-             break;
+             /* (in 4.2 bf) */
+             if (c_parser_next_token_is (parser, CPP_NAME)
+                 /* (in 4.2 bc) */
+                 || c_parser_next_token_is (parser, CPP_NUMBER))
+               {
+                 tree c = c_parser_peek_token (parser)->value;
+                 c_parser_consume_token (parser);
+                 expr.value = iasm_c_build_component_ref (expr.value, c);
+                 expr.original_code = ERROR_MARK;
+                 break;
+               }
            }
          /* APPLE LOCAL end CW asm blocks */
+         if (c_parser_next_token_is (parser, CPP_NAME))
+           ident = c_parser_peek_token (parser)->value;
          else
            {
              c_parser_error (parser, "expected identifier");
@@ -8660,13 +8715,16 @@
 static bool
 c_parser_iasm_bol (c_parser *parser)
 {
+  location_t loc;
   c_token *token;
   /* We can't use c_parser_peek_token here, as it will give errors for things 
like
      1st in MS-stype asm.  */
   if (parser->tokens_avail == 0)
     {
+      loc = input_location;
       parser->tokens_avail = 1;
       c_lex_one_token (&parser->tokens[0], parser);
+      input_location = loc;
     }
   token = &parser->tokens[0];
 
@@ -8719,6 +8777,8 @@
        {
          /* Parse a single statement.  */
          c_parser_iasm_statement (parser);
+         /* Resynchronize from c_parser_iasm_bol.  */
+         input_location = c_parser_peek_token (parser)->location;
          check = 1;
        }
 
@@ -9003,6 +9063,17 @@
   /* Jump into the usual operand precedence stack.  */
   operand = c_parser_binary_expression (parser, false).value;
 
+  /* (in 4.2 bd) */
+  while (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
+    {
+      struct c_expr op2;
+      c_parser_consume_token (parser);
+      op2 = c_parser_expr_no_commas (parser, NULL);
+      c_parser_skip_until_found (parser, CPP_CLOSE_PAREN,
+                                "expected %<)%>");
+      operand = iasm_build_register_offset (operand, op2.value);
+    }
+
   return operand;
 }
 

Modified: llvm-gcc-4.2/trunk/gcc/cp/parser.c
URL: 
http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/cp/parser.c?rev=41538&r1=41537&r2=41538&view=diff

==============================================================================
--- llvm-gcc-4.2/trunk/gcc/cp/parser.c (original)
+++ llvm-gcc-4.2/trunk/gcc/cp/parser.c Tue Aug 28 10:57:24 2007
@@ -11791,7 +11791,8 @@
       || cp_lexer_next_token_is (parser->lexer, CPP_NAME)
       || cp_lexer_next_token_is_keyword (parser->lexer, RID_ASM)
       || cp_lexer_next_token_is (parser->lexer, CPP_SEMICOLON)
-      || cp_lexer_iasm_bol (parser->lexer))
+      || (cp_lexer_iasm_bol (parser->lexer)
+          && !cp_lexer_next_token_is (parser->lexer, CPP_OPEN_PAREN)))
     {
       if (flag_iasm_blocks)
        cp_parser_iasm_top_statement (parser);


_______________________________________________
llvm-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to