On Wed, Oct 12, 2011 at 7:01 PM, Diego Novillo <[email protected]> wrote:
>
> On 11-10-10 17:47 , Sandeep Soni wrote:
>>
>> 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;
>> +
>> +};
>
> No blank line before '};'
>
> Add 'typedef struct gimple_symtab_entry_def gimple_symtab_entry;' to shorten
> declarations.
>
>> +
>> +/* 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));
>
> Space after DECL_NAME.
>
>> +}
>> +
>> +/* Returns non-zero if ENTRY1 and ENTRY2 points to gimple_symtab_entry_def
>
> s/points/point/
>
>> + 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);
>
> Space after DECL_NAME.
>
>> +}
>> +
>> /* 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;
>
> s/char* /char */
>
>> 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);
>
> No need to use UNKNOWN_LOCATION. Get the location for E.DECL from
> name_token.location.
>
> Additionally, before building the decl, you should make sure that the symbol
> table does not already have it. So, instead of looking up with a DECL, you
> should look it up using IDENTIFIER_NODEs. There are two approaches you can
> use:
>
> 1- Add an identifier field to gimple_symtab_entry_def. Use that field for
> hash table lookups (in this code you'd then fill E.ID with NAME_TOKEN).
>
> 2- Use a pointer_map_t and a VEC(). With this approach, you use a pointer
> map to map identifier nodes to unsigned integers. These integers are the
> index into the VEC() array where the corresponding decl is stored.
>
> In this case, I think #1 is the simplest approach.
>
>> + htab_find_slot (gimple_symtab,&e, INSERT);
>
> This looks wrong. Where are you actually filling in the slot? You need to
> check the returned slot, if it's empty, you fill it in with E.DECL. See other
> uses of htab_*.
I have made all the changes to the earlier patch. I have attached the
new patch. In the new patch, hashing is done by IDENTIFIERs. I just
made a small change of putting the gimple_symtab_entry instance in the
symbol table rather than only the declaration. Is that okay?
ChangeLog is as follows:
2011-11-18 Sandeep Soni <[email protected]>
* 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
>
>> 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);
>
> Do you need to indent it this way? Seems to me that the call to
> htab_create_ggc can fit in the line above.
>
>
> Diego.
--
Cheers
Sandy
--
Cheers
Sandy
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,47 @@
/* EOF token. */
static gimple_token gl_eof_token = { CPP_EOF, 0, 0, 0 };
+/* The GIMPLE symbol table entry. */
+
+struct GTY (()) gimple_symtab_entry_def
+{
+ /* symbol table entry key, an identifier. */
+ tree id;
+
+ /* symbol table entry, a DECL. */
+ tree decl;
+};
+
+typedef struct gimple_symtab_entry_def gimple_symtab_entry;
+
+/* 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 (base->id);
+}
+
+/* Returns non-zero if ENTRY1 and ENTRY2 point 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 *base1 =
+ (const struct gimple_symtab_entry_def *)entry1;
+ const struct gimple_symtab_entry_def *base2 =
+ (const struct gimple_symtab_entry_def *)entry2;
+
+ return (base1->id == base2->id);
+}
+
/* Return the string representation of token TOKEN. */
static const char *
@@ -807,6 +849,7 @@
}
}
+
/* The Declaration section within a .gimple file can consist of
a) Declaration of variables.
b) Declaration of functions.
@@ -870,18 +913,34 @@
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;
+ void **slot;
+ void **new_entry;
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.id = get_identifier(name);
+ slot = htab_find_slot (gimple_symtab, &e, NO_INSERT);
+ if (!slot)
+ {
+ e.decl = build_decl (name_token.location, VAR_DECL, get_identifier(name), void_type_node);
+ new_entry = htab_find_slot (gimple_symtab, &e, INSERT);
+ gcc_assert (*new_entry == NULL);
+ *new_entry = e;
+ }
+
gl_consume_expected_token (parser->lexer, CPP_COMMA);
-
next_token = gl_consume_token (parser->lexer);
code = gl_tree_code_for_token (next_token);
switch (code)
{
case INTEGER_TYPE:
+ gl_consume_expected_token (parser->lexer, CPP_LESS);
gl_consume_expected_token (parser->lexer, CPP_NUMBER);
gl_consume_expected_token (parser->lexer, CPP_RSHIFT);
break;
@@ -981,6 +1040,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 +1463,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);