[gimplefe][patch] The symbol table for declarations

Sandeep Soni soni.sandeepb@gmail.com
Mon Oct 10 22:38:00 GMT 2011


Hi,
The following patch is a basic attempt to build a symbol table that
stores the names of all the declarations made in the input file.

Index: gcc/gimple/parser.c
===================================================================
--- gcc/gimple/parser.c	(revision 174754)
+++ gcc/gimple/parser.c	(working copy)
@@ -28,6 +28,7 @@
 #include "tree.h"
 #include "gimple.h"
 #include "parser.h"
+#include "hashtab.h"
 #include "ggc.h"

 /* The GIMPLE parser.  Note: do not use this variable directly.  It is
@@ -44,6 +45,43 @@
 /* EOF token.  */
 static gimple_token gl_eof_token = { CPP_EOF, 0, 0, 0 };

+/* The GIMPLE symbol table entry.  */
+
+struct GTY (()) gimple_symtab_entry_def
+{
+  /* Variable that is declared.  */
+  tree decl;
+
+};
+
+/* Gimple symbol table.  */
+static htab_t gimple_symtab;
+
+/* Return the hash value of the declaration name of a gimple_symtab_entry_def
+   object pointed by ENTRY.  */
+
+static hashval_t
+gimple_symtab_entry_hash (const void *entry)
+{
+  const struct gimple_symtab_entry_def *base =
+    (const struct gimple_symtab_entry_def *)entry;
+  return IDENTIFIER_HASH_VALUE (DECL_NAME(base->decl));
+}
+
+/* Returns non-zero if ENTRY1 and ENTRY2 points to gimple_symtab_entry_def
+   objects corresponding to the same declaration.  */
+
+static int
+gimple_symtab_eq_hash (const void *entry1, const void *entry2)
+{
+  const struct gimple_symtab_entry_def *p1 =
+    (const struct gimple_symtab_entry_def *)entry1;
+  const struct gimple_symtab_entry_def *p2 =
+    (const struct gimple_symtab_entry_def *)entry2;
+
+  return DECL_NAME(p1->decl) == DECL_NAME(p2->decl);
+}
+
 /* Return the string representation of token TOKEN.  */

 static const char *
@@ -807,6 +845,7 @@
     }
 }

+
 /* The Declaration section within a .gimple file can consist of
    a) Declaration of variables.
    b) Declaration of functions.
@@ -870,11 +909,17 @@
 static void
 gp_parse_var_decl (gimple_parser *parser)
 {
-  const gimple_token *next_token;
+  const gimple_token *next_token, *name_token;
+  const char* name;
   enum tree_code code ;
+  struct gimple_symtab_entry_def e;

   gl_consume_expected_token (parser->lexer, CPP_LESS);
-  gl_consume_expected_token (parser->lexer, CPP_NAME);
+  name_token = gl_consume_expected_token (parser->lexer, CPP_NAME);
+  name = gl_token_as_text (name_token);
+  e.decl =
+  build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier(name),
void_type_node);
+  htab_find_slot (gimple_symtab, &e, INSERT);
   gl_consume_expected_token (parser->lexer, CPP_COMMA);

   next_token = gl_consume_token (parser->lexer);
@@ -981,6 +1027,7 @@
   gimple_parser *parser = ggc_alloc_cleared_gimple_parser ();
   line_table = parser->line_table = ggc_alloc_cleared_line_maps ();
   parser->ident_hash = ident_hash;
+
   linemap_init (parser->line_table);
   parser->lexer = gl_init (parser, fname);

@@ -1403,6 +1450,9 @@
   if (parser->lexer->filename == NULL)
     return;

+  gimple_symtab =
+    htab_create_ggc (1021, gimple_symtab_entry_hash,
+		     gimple_symtab_eq_hash, NULL);
   gl_lex (parser->lexer);
   gp_parse (parser);
   gp_finish (parser);

The changelog is as follows:

2011-10-11  Sandeep Soni  <soni.sandeepb@gmail.com>

	* parser.c : Include hashtab.h.
	(struct gimple_symtab_entry_def): New.
	(gimple_symtab): New. The symbol table.
	(gimple_symtab_entry_hash): New.
	(gimple_symtab_eq_hash): New.
	(gp_parse_var_decl): Build the declaration and put it in the symbol
	table.
	(gimple_main): Creates the symbol table

-- 
Cheers
Sandy



More information about the Gcc-patches mailing list