Parse basic clock descriptions and integer "map = identifiers...;".
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
NODE_EVENT,
NODE_STREAM,
NODE_TRACE,
NODE_EVENT,
NODE_STREAM,
NODE_TRACE,
NODE_CTF_EXPRESSION,
NODE_UNARY_EXPRESSION,
NODE_CTF_EXPRESSION,
NODE_UNARY_EXPRESSION,
struct cds_list_head trace;
struct cds_list_head stream;
struct cds_list_head event;
struct cds_list_head trace;
struct cds_list_head stream;
struct cds_list_head event;
+ struct cds_list_head clock;
*/
struct cds_list_head declaration_list;
} trace;
*/
struct cds_list_head declaration_list;
} trace;
+ struct {
+ /*
+ * Children nodes are ctf_expression, typedef,
+ * typealias and type_specifier_list.
+ */
+ struct cds_list_head declaration_list;
+ } clock;
struct {
struct cds_list_head left; /* Should be string */
struct cds_list_head right; /* Unary exp. or type */
struct {
struct cds_list_head left; /* Should be string */
struct cds_list_head right; /* Unary exp. or type */
align setstring(yyextra, yylval, yytext); return TOK_ALIGN;
const setstring(yyextra, yylval, yytext); return CONST;
char setstring(yyextra, yylval, yytext); return CHAR;
align setstring(yyextra, yylval, yytext); return TOK_ALIGN;
const setstring(yyextra, yylval, yytext); return CONST;
char setstring(yyextra, yylval, yytext); return CHAR;
+clock setstring(yyextra, yylval, yytext); return CLOCK;
double setstring(yyextra, yylval, yytext); return DOUBLE;
enum setstring(yyextra, yylval, yytext); return ENUM;
event setstring(yyextra, yylval, yytext); return EVENT;
double setstring(yyextra, yylval, yytext); return DOUBLE;
enum setstring(yyextra, yylval, yytext); return ENUM;
event setstring(yyextra, yylval, yytext); return EVENT;
[ NODE_EVENT ] = "NODE_EVENT",
[ NODE_STREAM ] = "NODE_STREAM",
[ NODE_TRACE ] = "NODE_TRACE",
[ NODE_EVENT ] = "NODE_EVENT",
[ NODE_STREAM ] = "NODE_STREAM",
[ NODE_TRACE ] = "NODE_TRACE",
+ [ NODE_CLOCK ] = "NODE_CLOCK",
[ NODE_CTF_EXPRESSION ] = "NODE_CTF_EXPRESSION",
[ NODE_UNARY_EXPRESSION ] = "NODE_UNARY_EXPRESSION",
[ NODE_TYPEDEF ] = "NODE_TYPEDEF",
[ NODE_CTF_EXPRESSION ] = "NODE_CTF_EXPRESSION",
[ NODE_UNARY_EXPRESSION ] = "NODE_UNARY_EXPRESSION",
[ NODE_TYPEDEF ] = "NODE_TYPEDEF",
case NODE_TRACE:
CDS_INIT_LIST_HEAD(&node->u.trace.declaration_list);
break;
case NODE_TRACE:
CDS_INIT_LIST_HEAD(&node->u.trace.declaration_list);
break;
+ case NODE_CLOCK:
+ CDS_INIT_LIST_HEAD(&node->u.clock.declaration_list);
+ break;
case NODE_CTF_EXPRESSION:
CDS_INIT_LIST_HEAD(&node->u.ctf_expression.left);
case NODE_CTF_EXPRESSION:
CDS_INIT_LIST_HEAD(&node->u.ctf_expression.left);
case NODE_TRACE:
_cds_list_splice_tail(&node->tmp_head, &parent->u.trace.declaration_list);
break;
case NODE_TRACE:
_cds_list_splice_tail(&node->tmp_head, &parent->u.trace.declaration_list);
break;
+ case NODE_CLOCK:
+ _cds_list_splice_tail(&node->tmp_head, &parent->u.clock.declaration_list);
+ break;
case NODE_FLOATING_POINT:
_cds_list_splice_tail(&node->tmp_head, &parent->u.floating_point.expressions);
break;
case NODE_FLOATING_POINT:
_cds_list_splice_tail(&node->tmp_head, &parent->u.floating_point.expressions);
break;
case NODE_TRACE:
_cds_list_splice_tail(&node->tmp_head, &parent->u.trace.declaration_list);
break;
case NODE_TRACE:
_cds_list_splice_tail(&node->tmp_head, &parent->u.trace.declaration_list);
break;
+ case NODE_CLOCK:
+ _cds_list_splice_tail(&node->tmp_head, &parent->u.clock.declaration_list);
+ break;
case NODE_VARIANT:
_cds_list_splice_tail(&node->tmp_head, &parent->u.variant.declaration_list);
break;
case NODE_VARIANT:
_cds_list_splice_tail(&node->tmp_head, &parent->u.variant.declaration_list);
break;
case NODE_TRACE:
_cds_list_splice_tail(&node->tmp_head, &parent->u.trace.declaration_list);
break;
case NODE_TRACE:
_cds_list_splice_tail(&node->tmp_head, &parent->u.trace.declaration_list);
break;
+ case NODE_CLOCK:
+ _cds_list_splice_tail(&node->tmp_head, &parent->u.clock.declaration_list);
+ break;
case NODE_VARIANT:
_cds_list_splice_tail(&node->tmp_head, &parent->u.variant.declaration_list);
break;
case NODE_VARIANT:
_cds_list_splice_tail(&node->tmp_head, &parent->u.variant.declaration_list);
break;
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_VARIANT:
case NODE_STRUCT:
case NODE_TYPEDEF:
case NODE_VARIANT:
case NODE_STRUCT:
case NODE_TYPEDEF:
case NODE_TRACE:
cds_list_add_tail(&node->siblings, &parent->u.trace.declaration_list);
break;
case NODE_TRACE:
cds_list_add_tail(&node->siblings, &parent->u.trace.declaration_list);
break;
+ case NODE_CLOCK:
+ cds_list_add_tail(&node->siblings, &parent->u.clock.declaration_list);
+ break;
case NODE_VARIANT:
cds_list_add_tail(&node->siblings, &parent->u.variant.declaration_list);
break;
case NODE_VARIANT:
cds_list_add_tail(&node->siblings, &parent->u.variant.declaration_list);
break;
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_VARIANT:
case NODE_STRUCT:
case NODE_TYPEALIAS:
case NODE_VARIANT:
case NODE_STRUCT:
case NODE_TYPEALIAS:
+ case NODE_CLOCK:
+ if (parent->type == NODE_ROOT) {
+ _cds_list_splice_tail(&node->tmp_head, &parent->u.root.clock);
+ } else {
+ return -EPERM;
+ }
+ break;
case NODE_CTF_EXPRESSION:
return reparent_ctf_expression(node, parent);
case NODE_CTF_EXPRESSION:
return reparent_ctf_expression(node, parent);
CDS_INIT_LIST_HEAD(&ast->root.u.root.trace);
CDS_INIT_LIST_HEAD(&ast->root.u.root.stream);
CDS_INIT_LIST_HEAD(&ast->root.u.root.event);
CDS_INIT_LIST_HEAD(&ast->root.u.root.trace);
CDS_INIT_LIST_HEAD(&ast->root.u.root.stream);
CDS_INIT_LIST_HEAD(&ast->root.u.root.event);
+ CDS_INIT_LIST_HEAD(&ast->root.u.root.clock);
-%token CHARACTER_CONSTANT_START SQUOTE STRING_LITERAL_START DQUOTE ESCSEQ CHAR_STRING_TOKEN LSBRAC RSBRAC LPAREN RPAREN LBRAC RBRAC RARROW STAR PLUS MINUS LT GT TYPEASSIGN COLON SEMICOLON DOTDOTDOT DOT EQUAL COMMA CONST CHAR DOUBLE ENUM EVENT FLOATING_POINT FLOAT INTEGER INT LONG SHORT SIGNED STREAM STRING STRUCT TRACE TYPEALIAS TYPEDEF UNSIGNED VARIANT VOID _BOOL _COMPLEX _IMAGINARY DECIMAL_CONSTANT OCTAL_CONSTANT HEXADECIMAL_CONSTANT TOK_ALIGN
+%token CHARACTER_CONSTANT_START SQUOTE STRING_LITERAL_START DQUOTE ESCSEQ CHAR_STRING_TOKEN LSBRAC RSBRAC LPAREN RPAREN LBRAC RBRAC RARROW STAR PLUS MINUS LT GT TYPEASSIGN COLON SEMICOLON DOTDOTDOT DOT EQUAL COMMA CONST CHAR DOUBLE ENUM EVENT FLOATING_POINT FLOAT INTEGER INT LONG SHORT SIGNED STREAM STRING STRUCT TRACE CLOCK TYPEALIAS TYPEDEF UNSIGNED VARIANT VOID _BOOL _COMPLEX _IMAGINARY DECIMAL_CONSTANT OCTAL_CONSTANT HEXADECIMAL_CONSTANT TOK_ALIGN
%token <gs> IDENTIFIER ID_TYPE
%token ERROR
%union
%token <gs> IDENTIFIER ID_TYPE
%token ERROR
%union
%type <n> event_declaration
%type <n> stream_declaration
%type <n> trace_declaration
%type <n> event_declaration
%type <n> stream_declaration
%type <n> trace_declaration
+%type <n> clock_declaration
%type <n> integer_declaration_specifiers
%type <n> declaration_specifiers
%type <n> alias_declaration_specifiers
%type <n> integer_declaration_specifiers
%type <n> declaration_specifiers
%type <n> alias_declaration_specifiers
{ $$ = yylval.gs; }
| TRACE
{ $$ = yylval.gs; }
{ $$ = yylval.gs; }
| TRACE
{ $$ = yylval.gs; }
+ | CLOCK
+ { $$ = yylval.gs; }
| TOK_ALIGN
{ $$ = yylval.gs; }
;
| TOK_ALIGN
{ $$ = yylval.gs; }
;
{ $$ = $1; }
| trace_declaration
{ $$ = $1; }
{ $$ = $1; }
| trace_declaration
{ $$ = $1; }
+ | clock_declaration
+ { $$ = $1; }
| declaration_specifiers TYPEDEF declaration_specifiers type_declarator_list SEMICOLON
{
struct ctf_node *list;
| declaration_specifiers TYPEDEF declaration_specifiers type_declarator_list SEMICOLON
{
struct ctf_node *list;
{ pop_scope(scanner); }
;
{ pop_scope(scanner); }
;
trace_declaration:
trace_declaration_begin trace_declaration_end
{
trace_declaration:
trace_declaration_begin trace_declaration_end
{
{ pop_scope(scanner); }
;
{ pop_scope(scanner); }
;
+clock_declaration:
+ CLOCK clock_declaration_begin clock_declaration_end
+ {
+ $$ = make_node(scanner, NODE_CLOCK);
+ }
+ | CLOCK clock_declaration_begin ctf_assignment_expression_list clock_declaration_end
+ {
+ $$ = make_node(scanner, NODE_CLOCK);
+ if (set_parent_node($3, $$))
+ reparent_error(scanner, "trace_declaration");
+ }
+ ;
+
+clock_declaration_begin:
+ LBRAC
+ { push_scope(scanner); }
+ ;
+
+clock_declaration_end:
+ RBRAC SEMICOLON
+ { pop_scope(scanner); }
+ ;
+
integer_declaration_specifiers:
CONST
{
integer_declaration_specifiers:
CONST
{
return NULL;
}
g_free(s_right);
return NULL;
}
g_free(s_right);
+ } else if (!strcmp(left->u.unary_expression.u.string, "map")) {
+ char *s_right;
+
+ if (right->u.unary_expression.type != UNARY_STRING) {
+ fprintf(fd, "[error] %s: map: expecting identifier\n",
+ __func__);
+ return NULL;
+ }
+ s_right = concatenate_unary_strings(&expression->u.ctf_expression.right);
+ if (!s_right) {
+ fprintf(fd, "[error] %s: unexpected unary expression for integer map\n", __func__);
+ g_free(s_right);
+ return NULL;
+ }
+ /* TODO: lookup */
+
} else {
fprintf(fd, "[error] %s: unknown attribute name %s\n",
__func__, left->u.unary_expression.u.string);
} else {
fprintf(fd, "[error] %s: unknown attribute name %s\n",
__func__, left->u.unary_expression.u.string);
+ cds_list_for_each_entry(iter, &node->u.root.clock, siblings) {
+ iter->parent = node;
+ ret = ctf_visitor_parent_links(fd, depth + 1, iter);
+ if (ret)
+ return ret;
+ }
+ case NODE_CLOCK:
+ cds_list_for_each_entry(iter, &node->u.clock.declaration_list, siblings) {
+ iter->parent = node;
+ ret = ctf_visitor_parent_links(fd, depth + 1, iter);
+ if (ret)
+ return ret;
+ }
+ break;
case NODE_CTF_EXPRESSION:
depth++;
case NODE_CTF_EXPRESSION:
depth++;
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_TYPEDEF:
case NODE_TYPEALIAS_TARGET:
case NODE_TYPEALIAS_ALIAS:
case NODE_TYPEDEF:
case NODE_TYPEALIAS_TARGET:
case NODE_TYPEALIAS_ALIAS:
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_UNARY_EXPRESSION:
case NODE_TYPEALIAS:
case NODE_TYPE_SPECIFIER:
case NODE_UNARY_EXPRESSION:
case NODE_TYPEALIAS:
case NODE_TYPE_SPECIFIER:
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_UNARY_EXPRESSION:
case NODE_TYPEALIAS:
case NODE_TYPE_SPECIFIER:
case NODE_UNARY_EXPRESSION:
case NODE_TYPEALIAS:
case NODE_TYPE_SPECIFIER:
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_CTF_EXPRESSION:
case NODE_UNARY_EXPRESSION:
case NODE_TYPEALIAS:
case NODE_CTF_EXPRESSION:
case NODE_UNARY_EXPRESSION:
case NODE_TYPEALIAS:
+ case NODE_CLOCK:
+ switch (node->parent->type) {
+ case NODE_ROOT:
+ break; /* OK */
+ default:
+ goto errinval;
+ }
+
+ cds_list_for_each_entry(iter, &node->u.clock.declaration_list, siblings) {
+ ret = _ctf_visitor_semantic_check(fd, depth + 1, iter);
+ if (ret)
+ return ret;
+ }
+ break;
+
case NODE_CTF_EXPRESSION:
switch (node->parent->type) {
case NODE_CTF_EXPRESSION:
switch (node->parent->type) {
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_EVENT:
case NODE_STREAM:
case NODE_TRACE:
case NODE_FLOATING_POINT:
case NODE_INTEGER:
case NODE_STRING:
case NODE_FLOATING_POINT:
case NODE_INTEGER:
case NODE_STRING:
case NODE_STRING:
case NODE_ENUMERATOR:
case NODE_ENUM:
case NODE_STRING:
case NODE_ENUMERATOR:
case NODE_ENUM:
default:
goto errinval;
}
default:
goto errinval;
}
case NODE_STRING:
case NODE_ENUMERATOR:
case NODE_ENUM:
case NODE_STRING:
case NODE_ENUMERATOR:
case NODE_ENUM:
default:
goto errinval;
}
default:
goto errinval;
}