===================================================================
@@ -234,7 +271,7 @@
gl_token_starts_decl (gimple_token *token)
{
enum tree_code code = gl_tree_code_for_token (token);
- return code == VAR_DECL;
+ return code == VAR_DECL || code == FUNCTION_DECL;
}
@@ -746,6 +817,24 @@
}
+/* Helper for gp_parse_function_decl. The parm_decl's
+ are read from gimple_parser PARSER. */
+
+static void
+gp_parse_parm_decl (gimple_parser *parser)
+{
+ gl_consume_expected_token (parser->lexer, CPP_LESS);
+ gl_consume_expected_token (parser->lexer, CPP_NAME);
+ gl_consume_expected_token (parser->lexer, CPP_COMMA);
+ gl_consume_expected_token (parser->lexer, CPP_NAME);
+ gl_consume_expected_token (parser->lexer, CPP_LESS);
+ gl_consume_expected_token (parser->lexer, CPP_NUMBER);
+ gl_consume_expected_token (parser->lexer, CPP_GREATER);
+ gl_consume_expected_token (parser->lexer, CPP_GREATER);
+
+}
+
+
/* Helper for gp_parse_expect_record_type and
gp_parse_expect_union_type. The field_decl's
are read from gimple_parser PARSER. */
@@ -939,6 +1028,27 @@
}
+/* Recognizes the return type of the function. The tuple is read from
+ PARSER. */
+
+static void
+gp_parse_return_type (gimple_parser *parser)
+{
+ gimple_token *next_token = gl_consume_token (parser->lexer);
+ enum tree_code code = gl_tree_code_for_token (next_token);
+
+ switch (code)
+ {
+ case INTEGER_TYPE:
+ case REAL_TYPE:
+ gl_consume_expected_token (parser->lexer, CPP_LESS);
+ gl_consume_expected_token (parser->lexer, CPP_NUMBER);
+ gl_consume_expected_token (parser->lexer, CPP_GREATER);
+ break;
+ }
+}
+
+
/* The Declaration section within a .gimple file can consist of
a) Declaration of variables.
b) Declaration of functions.
@@ -1070,6 +1180,103 @@
}
+/* The syntax of a function declaration is as follows:
+
+ FUNCTION_DECL<Name, Type, Parms>
+ <
+ function body
+ >
+
+ Here, each of the PARMS in itself is a parameter declaration similar to a
+ variable declaration, TYPE is the type of the variable that this
+ function returns and FUNCTION BODY is the series of statements that define
+ the beahavior of the function.
+
+ Following are some of the examples for which the syntax of the function
+ declarations are described.
+
+ 1. C-like function as
+ void foo (int first, float second)
+ {
+ first = second;
+ }
+
+ The corresponding gimple syntax is:
+ FUNCTION_DECL <foo, VOID_TYPE,
+ PARM_DECL<first, INTEGER_TYPE<4>>,
+ PARM_DECL<second, REAL_TYPE<4>>>
+ <
+ GIMPLE_ASSIGN <PARM_DECL,first, second, NULL>
+ >
+
+ 2. C-like function as
+ int foo (int first, float second)
+ {
+ int local_first;
+ float local_second;
+
+ local_first = first;
+ local_second = second;
+
+ return local_first;
+ }
+
+ The corresponding gimple syntax is:
+ FUNCTION_DECL <foo, INTEGER_TYPE<4>,
+ PARM_DECL<first, INTEGER_TYPE<4>>,
+ PARM_DECL<second, REAL_TYPE<4>>>
+ <
+ VAR_DECL <local_first, INTEGER_TYPE<4>>
+ VAR_DECL <local_second, REAL_TYPE<4>>
+ VAR_DECL <return_var, INTEGER_TYPE<4>>
+
+ gimple_assign <parm_decl, local_first, first, NULL>
+ gimple_assign <parm_decl, local_second, second, NULL>
+ gimple_assign <parm_decl, return_var, first, NULL>
+ gimple_return <return_var>
+ >
+
+ Note: 1) The syntax closely mimics the -fdump-tree-gimple-raw option.
+ 2) The function declaration tuple needs to be checked against the
+ call of the function for order and the number of arguments.
+ 3) A symbol table entry for the function should be made. The
+ variables defined within the function should be made to have
+ function scope. */
+
+/* Recognizer function for function declarations. The declaration tuple is read
+ from gimple_parser PARSER. */
+
+static void
+gp_parse_function_decl (gimple_parser *parser)
+{
+ const gimple_token *next_token;
+
+ gl_consume_expected_token (parser->lexer, CPP_LESS);
+ gl_consume_expected_token (parser->lexer, CPP_NAME);
+ gl_consume_expected_token (parser->lexer, CPP_COMMA);
+ gp_parse_return_type (parser);
+
+ next_token = gl_consume_token (parser->lexer);
+ while (!gl_at_eof(parser->lexer))
+ {
+ if (next_token->type == CPP_COMMA)
+ {
+ next_token = gl_consume_token (parser->lexer);
+ if (gl_tree_code_for_token (next_token) == PARM_DECL)
+ gp_parse_parm_decl (parser);
+ else
+ error_at (next_token->location,
+ "Unsupported declaration of parameters");
+ else if (next_token->type == CPP_GREATER)
+ break;
+ }
+
+ /* TODO The function signature should be changed to parse a gimple
+ function and the call to parse the function body should be made
+ here. */
+}
+
+
/* The token TOKEN read from the reader PARSER is looked up for a match.
Calls the corresponding function to do the parsing for the match.
Gets called for recognizing variable and function declarations. */
@@ -1084,6 +1291,10 @@
gp_parse_var_decl (parser);
break;
+ case FUNCTION_DECL:
+ gp_parse_function_decl (parser);
+ break;
+
default:
break;
}
@@ -1211,6 +1422,7 @@
return itk_none;
}
+
/* Returns true if the type of the TOKEN is equal to EXPECTED. */
static bool
@@ -1219,6 +1431,7 @@
return (token->type == expected);
}
+
/* Splits the token TOKEN into two tokens FIRST_TOKEN and SECOND_TOKEN.
Note that the split should work only if the type of the TOKEN is
either CPP_RSHIFT or CPP_LSHIFT which gets split into two tokens
@@ -1249,6 +1462,7 @@
first_token->value = second_token->value = token->value;
}
+
/* Interpret TOKEN, an integer with FLAGS as classified by cpplib. */
static tree