#define fprintf_dbg(fd, fmt, args...) fprintf(fd, "%s: " fmt, __func__, ## args)
+#define _cds_list_first_entry(ptr, type, member) \
+ cds_list_entry((ptr)->next, type, member)
static
int ctf_visitor_print_type_specifier(FILE *fd, int depth, struct ctf_node *node)
return g_ptr_array_index(trace->streams, stream_id);
}
+/*
+ * Also add named variant, struct or enum to the current type scope.
+ */
static
-struct ctf_declaration *ctf_declaration_specifier_visit(FILE *fd,
- int depth, struct list_head *head,
- struct type_scope *type_scope,
- struct declaration_scope *declaration_scope)
+struct ctf_type *ctf_type_specifier_visit(FILE *fd,
+ int depth, struct list_head *head,
+ struct type_scope *type_scope,
+ struct definition_scope *definition_scope)
{
+ struct ctf_type *type;
+ struct node *first;
+
+ first = _cds_list_first_entry(head, struct node, siblings);
+
+ switch (first->type) {
+ case NODE_STRUCT:
+ /* For named struct (without body), lookup in type scope */
+ /* For named struct (with body), create type and add to type scope */
+ /* For unnamed struct, create type */
+ break;
+ case NODE_VARIANT:
+ /* For named variant (without body), lookup in type scope */
+ /* For named variant (with body), create type and add to type scope */
+ /* For unnamed variant, create type */
+ break;
+ case NODE_ENUM:
+ /* For named enum (without body), lookup in type scope */
+ /* For named enum (with body), create type and add to type scope */
+ /* For unnamed enum, create type */
+ break;
+ case NODE_INTEGER:
+ break;
+ case NODE_FLOATING_POINT:
+ break;
+ case NODE_TYPE_SPECIFIER:
+ break;
+ }
}
-/*
- * Use declaration specifier visitor, and add resulting variant, struct
- * or enum to the current type scope.
- */
static
-int ctf_type_specifier_visit(FILE *fd,
- int depth, struct list_head *head,
- struct type_scope *type_scope,
- struct declaration_scope *declaration_scope)
+struct ctf_declaration *ctf_declaration_specifier_visit(FILE *fd,
+ int depth, struct list_head *head,
+ struct type_scope *type_scope,
+ struct definition_scope *definition_scope)
{
-
+ struct ctf_declaration *declaration;
+ struct ctf_type *type;
+
+ type = ctf_type_specifier_visit(fd, depth, head, type_scope,
+ definition_scope);
+ declaration = type->declaration_new(type, definition_scope);
+ if (type->id == CTF_TYPE_VARIANT) {
+ struct declaration_variant *variant =
+ container_of(declaration, struct declaration_variant, p);
+ struct declaration *enum_tag =
+ lookup_field_declaration(enum_tag_name, definition_scope);
+ if (!enum_tag) {
+ fprintf(fd, "[error]: expected enumeration tag field %s for variant\n",
+ enum_tag_name);
+ goto error;
+ }
+ /* TODO find enum tag */
+ ret = variant_declaration_set_tag(variant, enum_tag);
+ }
+ return declaration;
+error:
+ declaration_unref(declaration);
+ type_unref(type);
+ return NULL;
}
static
int ctf_typedef_declarator_visit(FILE *fd, int depth,
struct list_head *declaration_specifier,
struct node *type_declarator, struct type_scope *type_scope,
- struct declaration_scope *declaration_scope)
+ struct definition_scope *definition_scope)
{
/*
- * Build the type using declaration specifier, then apply type
- * declarator, add the resulting type to the current type scope.
+ * Build the type using declaration specifier (creating
+ * declaration from type_specifier), then apply type declarator,
+ * add the resulting type to the current type scope.
*/
cds_list_for_each_entry(iter, declaration_specifier, siblings) {
struct list_head *declaration_specifier,
struct list_head *type_declarators,
struct type_scope *type_scope,
- struct declaration_scope *declaration_scope)
+ struct definition_scope *definition_scope)
{
struct ctf_node *iter;
cds_list_for_each_entry(iter, type_declarators, siblings) {
ret = ctf_typedef_declarator_visit(fd, depth + 1,
&node->u._typedef.declaration_specifier, iter,
- type_scope, declaration_scope);
+ type_scope, definition_scope);
if (ret)
return ret;
}
static
int ctf_typealias_visit(FILE *fd, int depth, struct ctf_node *target,
struct ctf_node *alias, struct type_scope *type_scope,
- struct declaration_scope *declaration_scope)
+ struct definition_scope *definition_scope)
{
/* Build target type, check that it is reachable in current type scope. */
/* Only one type declarator is allowed */
ret = ctf_typedef_visit(fd, depth + 1,
&node->u._typedef.declaration_specifier,
&node->u._typedef.type_declarators,
- event->type_scope, event->declaration_scope);
+ event->type_scope, event->definition_scope);
if (ret)
return ret;
break;
case NODE_TYPEALIAS:
ret = ctf_typealias_visit(fd, depth + 1,
&node->u.typealias.target, &node->u.typealias.alias
- event->type_scope, event->declaration_scope);
+ event->type_scope, event->definition_scope);
if (ret)
return ret;
break;
fprintf(stderr, "[error] %s: stream id %" PRIu64 " cannot be found\n", __func__, event->stream_id);
return -EINVAL;
}
- event->declaration_scope = new_declaration_scope(stream->declaration_scope);
- if (!event->declaration_scope) {
+ event->definition_scope = new_definition_scope(stream->definition_scope);
+ if (!event->definition_scope) {
fprintf(stderr, "[error] %s: Error allocating declaration scope\n", __func__);
return -EPERM;
}
} else if (!strcmp(left, "context")) {
struct declaration *declaration;
- if (!event->declaration_scope)
+ if (!event->definition_scope)
return -EPERM;
declaration = ctf_declaration_specifier_visit(fd, depth,
&node->u.ctf_expression.right,
- event->type_scope, event->declaration_scope);
+ event->type_scope, event->definition_scope);
if (!declaration)
return -EPERM;
if (declaration->type->id != CTF_TYPE_STRUCT)
} else if (!strcmp(left, "fields")) {
struct declaration *declaration;
- if (!event->declaration_scope)
+ if (!event->definition_scope)
return -EPERM;
declaration = ctf_declaration_specifier_visit(fd, depth,
&node->u.ctf_expression.right,
- event->type_scope, event->declaration_scope);
+ event->type_scope, event->definition_scope);
if (!declaration)
return -EPERM;
if (declaration->type->id != CTF_TYPE_STRUCT)
error:
declaration_unref(event->fields);
declaration_unref(event->context);
- free_declaration_scope(event->declaration_scope);
+ free_definition_scope(event->definition_scope);
free_type_scope(event->type_scope);
g_free(event);
return ret;
ret = ctf_typedef_visit(fd, depth + 1,
&node->u._typedef.declaration_specifier,
&node->u._typedef.type_declarators,
- stream->type_scope, stream->declaration_scope);
+ stream->type_scope, stream->definition_scope);
if (ret)
return ret;
break;
case NODE_TYPEALIAS:
ret = ctf_typealias_visit(fd, depth + 1,
&node->u.typealias.target, &node->u.typealias.alias
- stream->type_scope, stream->declaration_scope);
+ stream->type_scope, stream->definition_scope);
if (ret)
return ret;
break;
declaration = ctf_declaration_specifier_visit(fd, depth,
&node->u.ctf_expression.right,
- stream->type_scope, stream->declaration_scope);
+ stream->type_scope, stream->definition_scope);
if (!declaration)
return -EPERM;
if (declaration->type->id != CTF_TYPE_STRUCT)
declaration = ctf_declaration_specifier_visit(fd, depth,
&node->u.ctf_expression.right,
- stream->type_scope, stream->declaration_scope);
+ stream->type_scope, stream->definition_scope);
if (!declaration)
return -EPERM;
if (declaration->type->id != CTF_TYPE_STRUCT)
declaration = ctf_declaration_specifier_visit(fd, depth,
&node->u.ctf_expression.right,
- stream->type_scope, stream->declaration_scope);
+ stream->type_scope, stream->definition_scope);
if (!declaration)
return -EPERM;
if (declaration->type->id != CTF_TYPE_STRUCT)
stream = g_new0(struct ctf_stream, 1);
stream->type_scope = new_type_scope(parent_type_scope);
- stream->declaration_scope = new_declaration_scope(trace->declaration_scope);
+ stream->definition_scope = new_definition_scope(trace->definition_scope);
stream->events_by_id = g_ptr_array_new();
stream->event_quark_to_id = g_hash_table_new(g_int_hash, g_int_equal);
cds_list_for_each_entry(iter, &node->u.stream.declaration_list, siblings) {
declaration_unref(stream->packet_context);
g_ptr_array_free(stream->events_by_id, TRUE);
g_hash_table_free(stream->event_quark_to_id);
- free_declaration_scope(stream->declaration_scope);
+ free_definition_scope(stream->definition_scope);
free_type_scope(stream->type_scope);
g_free(stream);
return ret;
ret = ctf_typedef_visit(fd, depth + 1,
&node->u._typedef.declaration_specifier,
&node->u._typedef.type_declarators,
- trace->type_scope, trace->declaration_scope);
+ trace->type_scope, trace->definition_scope);
if (ret)
return ret;
break;
case NODE_TYPEALIAS:
ret = ctf_typealias_visit(fd, depth + 1,
&node->u.typealias.target, &node->u.typealias.alias
- trace->type_scope, trace->declaration_scope);
+ trace->type_scope, trace->definition_scope);
if (ret)
return ret;
break;
if (trace->type_scope)
return -EEXIST;
trace->type_scope = new_type_scope(trace->root_type_scope);
- trace->declaration_scope = new_declaration_scope(trace->root_declaration_scope);
+ trace->definition_scope = new_definition_scope(trace->root_definition_scope);
trace->streams = g_ptr_array_new();
cds_list_for_each_entry(iter, &node->u.trace.declaration_list, siblings) {
ret = ctf_trace_declaration_visit(fd, depth + 1, iter, trace);
error:
g_ptr_array_free(trace->streams, TRUE);
- free_declaration_scope(stream->declaration_scope);
+ free_definition_scope(stream->definition_scope);
free_type_scope(stream->type_scope);
return ret;
}
ret = ctf_typedef_visit(fd, depth + 1,
&iter->u._typedef.declaration_specifier,
&iter->u._typedef.type_declarators,
- trace->type_scope, trace->declaration_scope);
+ trace->type_scope, trace->definition_scope);
if (ret)
return ret;
}
siblings) {
ret = ctf_typealias_visit(fd, depth + 1,
&iter->u.typealias.target, &iter->u.typealias.alias
- trace->type_scope, trace->declaration_scope);
+ trace->type_scope, trace->definition_scope);
if (ret)
return ret;
}
cds_list_for_each_entry(iter, &node->u.root.declaration_specifier, siblings) {
- ret = ctf_type_specifier_visit(fd, depth, iter,
+ ret = ctf_declaration_specifier_visit(fd, depth, iter,
trace->root_type_scope,
- trace->root_declaration_scope);
+ trace->root_definition_scope);
if (ret)
return ret;
}