This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [gimplefe] creating individual gimple_assign statements


On 12-06-20 23:04 , Sandeep Soni wrote:
Hi,

This patch creates basic gimple_assign statements. It is a little raw
not considering all types of gimple_assign statements for which I have
already started working.

Here is the Changelog.

2012-06-09 Sandeep Soni <soni.sandeepb@gmail.com>

	* parser.c (gimple_symtab_get): New.
           (gimple_symtab_get_token): New.
           (gp_parse_expect_lhs): Returns tree node.
           (gp_parse_expect_rhs_op): Returns the op as tree node.
           (gp_parse_assign_stmt) : Builds gimple_assign statement.

Align the '(' with the '*'.



Index: gcc/gimple/parser.c =================================================================== --- gcc/gimple/parser.c (revision 188546) +++ gcc/gimple/parser.c (working copy) @@ -105,6 +105,7 @@ gimple_symtab_eq_hash, NULL); }

+
  /* Registers DECL with the gimple symbol table as having identifier ID.  */

  static void
@@ -123,6 +124,41 @@
      *slot = new_entry;
  }

+
+/* Gets the tree node for the corresponding identifier ID  */
+
+static tree
+gimple_symtab_get (tree id)
+{
+  struct gimple_symtab_entry_def temp;
+  gimple_symtab_entry_t entry;
+  void **slot;
+
+  gimple_symtab_maybe_init_hash_table();
+  temp.id = id;
+  slot = htab_find_slot (gimple_symtab, &temp, NO_INSERT);
+  if (slot)
+    {
+      entry = (gimple_symtab_entry_t) *slot;
+      return entry->decl;
+    }
+  else
+    return NULL;
+}
+
+
+/* Gets the tree node of token TOKEN from the global gimple symbol table.  */
+
+static tree
+gimple_symtab_get_token (const gimple_token *token)
+{
+  const char *name = gl_token_as_text(token);
+  tree id = get_identifier(name);

Space before '('.


+  tree decl = gimple_symtab_get (id);
+  return decl;
+}
+
+
  /* Return the string representation of token TOKEN.  */

  static const char *
@@ -360,10 +396,11 @@
  /* Helper for gp_parse_assign_stmt. The token read from reader PARSER should
     be the lhs of the tuple.  */

-static void
+static tree
  gp_parse_expect_lhs (gimple_parser *parser)
  {
    const gimple_token *next_token;
+  tree lhs;

    /* Just before the name of the identifier we might get the symbol
       of dereference too. If we do get it then consume that token, else
@@ -372,18 +409,22 @@
    if (next_token->type == CPP_MULT)
      next_token = gl_consume_token (parser->lexer);

-  gl_consume_expected_token (parser->lexer, CPP_NAME);
+  next_token = gl_consume_token (parser->lexer);
+  lhs = gimple_symtab_get_token (next_token);
    gl_consume_expected_token (parser->lexer, CPP_COMMA);
+  return lhs;
+
  }


/* Helper for gp_parse_assign_stmt. The token read from reader PARSER should be the first operand in rhs of the tuple. */

-static void
+static tree
  gp_parse_expect_rhs_op (gimple_parser *parser)
  {
    const gimple_token *next_token;
+  tree rhs = NULL_TREE;

next_token = gl_peek_token (parser->lexer);

@@ -402,11 +443,13 @@
      case CPP_NUMBER:
      case CPP_STRING:
        next_token = gl_consume_token (parser->lexer);
+      rhs = gimple_symtab_get_token (next_token);
        break;

      default:
        break;
      }
+
  }

No empty line here.


The function returns nothing?



@@ -420,9 +463,10 @@
    gimple_token *optoken;
    enum tree_code opcode;
    enum gimple_rhs_class rhs_class;
+  tree op1 = NULL_TREE, op2 = NULL_TREE, op3 = NULL_TREE;

    opcode = gp_parse_expect_subcode (parser, &optoken);
-  gp_parse_expect_lhs (parser);
+  tree lhs = gp_parse_expect_lhs (parser);

    rhs_class = get_gimple_rhs_class (opcode);
    switch (rhs_class)
@@ -436,16 +480,16 @@
        case GIMPLE_UNARY_RHS:
        case GIMPLE_BINARY_RHS:
        case GIMPLE_TERNARY_RHS:
-	gp_parse_expect_rhs_op (parser);
+	op1 = gp_parse_expect_rhs_op (parser);
  	if (rhs_class == GIMPLE_BINARY_RHS || rhs_class == GIMPLE_TERNARY_RHS)
  	  {
  	    gl_consume_expected_token (parser->lexer, CPP_COMMA);
-	    gp_parse_expect_rhs_op (parser);
+	    op2 = gp_parse_expect_rhs_op (parser);
  	  }
  	if (rhs_class == GIMPLE_TERNARY_RHS)
  	  {
  	    gl_consume_expected_token (parser->lexer, CPP_COMMA);
-	    gp_parse_expect_rhs_op (parser);
+	    op3 = gp_parse_expect_rhs_op (parser);
  	  }
  	break;

@@ -454,6 +498,9 @@
      }

    gl_consume_expected_token (parser->lexer, CPP_GREATER);
+
+  gimple stmt = gimple_build_assign_with_ops (code, lhs, op1, op2, op3);
+  gcc_assert(verify_gimple_stmt(stmt));

Space before '('s.


Do we already have tests with assignments in the testsuite?



Diego.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]