summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
1cfda06)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
GQuark *field_name,
struct ctf_node *node_type_declarator,
struct declaration_scope *declaration_scope,
GQuark *field_name,
struct ctf_node *node_type_declarator,
struct declaration_scope *declaration_scope,
- struct declaration *nested_declaration)
+ struct declaration *nested_declaration,
+ struct ctf_trace *trace)
{
/*
* Visit type declarator by first taking care of sequence/array
{
/*
* Visit type declarator by first taking care of sequence/array
- assert(node_type_declarator->u.type_declarator.type != TYPEDEC_UNKNOWN);
+ if (node_type_declarator) {
+ assert(node_type_declarator->u.type_declarator.type != TYPEDEC_UNKNOWN);
- /* TODO: gcc bitfields not supported yet. */
- if (node_type_declarator->u.type_declarator.bitfield_len != NULL) {
- fprintf(stderr, "[error] %s: gcc bitfields are not supported yet.\n", __func__);
- return NULL;
+ /* TODO: gcc bitfields not supported yet. */
+ if (node_type_declarator->u.type_declarator.bitfield_len != NULL) {
+ fprintf(stderr, "[error] %s: gcc bitfields are not supported yet.\n", __func__);
+ return NULL;
+ }
}
if (!nested_declaration) {
}
if (!nested_declaration) {
- if (!cds_list_empty(&node_type_declarator->u.type_declarator.pointers)) {
+ if (node_type_declarator && !cds_list_empty(&node_type_declarator->u.type_declarator.pointers)) {
- nested_declaration = /* parse declaration_specifier */;
+ nested_declaration = ctf_declaration_specifier_visit(fd, depth,
+ declaration_specifier, declaration_scope, trace);
+ if (!node_type_declarator)
+ return nested_declaration;
+
if (node_type_declarator->u.type_declarator.type == TYPEDEC_ID) {
if (node_type_declarator->u.type_declarator.u.id)
*field_name = g_quark_from_string(node_type_declarator->u.type_declarator.u.id);
if (node_type_declarator->u.type_declarator.type == TYPEDEC_ID) {
if (node_type_declarator->u.type_declarator.u.id)
*field_name = g_quark_from_string(node_type_declarator->u.type_declarator.u.id);
if (length) {
switch (length->type) {
case NODE_UNARY_EXPRESSION:
if (length) {
switch (length->type) {
case NODE_UNARY_EXPRESSION:
- /* Array */
- /* TODO */
- .............
- declaration = /* create array */;
+ {
+ struct declaration_array *array_declaration;
+ size_t len;
+
+ if (length->u.unary_expression.type != UNARY_UNSIGNED_CONSTANT) {
+ fprintf(stderr, "[error] %s: array: unexpected unary expression.\n", __func__);
+ return NULL;
+ }
+ len = length->u.unary_expression.u.unsigned_constant;
+ array_declaration = array_declaration_new(len, nested_declaration,
+ declaration_scope);
+ declaration = &array_declaration->p;
case NODE_TYPE_SPECIFIER:
case NODE_TYPE_SPECIFIER:
- /* Sequence */
- declaration = /* create sequence */;
+ {
+ struct declaration_sequence *sequence_declaration;
+ struct declaration_integer *integer_declaration;
+ GQuark dummy_id;
+
+ declaration = ctf_type_declarator_visit(fd, depth,
+ length,
+ &dummy_id, NULL,
+ declaration_scope,
+ NULL, trace);
+ assert(declaration->id == CTF_TYPE_INTEGER);
+ integer_declaration = container_of(declaration, struct declaration_integer, p);
+ declaration_sequence = sequence_declaration_new(integer_declaration,
+ nested_declaration, declaration_scope);
+ declaration = &declaration_sequence->p;
declaration = ctf_type_declarator_visit(fd, depth,
declaration_specifier, field_name,
node_type_declarator->u.type_declarator.u.nested.type_declarator,
declaration = ctf_type_declarator_visit(fd, depth,
declaration_specifier, field_name,
node_type_declarator->u.type_declarator.u.nested.type_declarator,
- declaration_scope, declaration);
+ declaration_scope, declaration, trace);
struct declaration_struct *struct_declaration,
struct cds_list_head *declaration_specifier,
struct cds_list_head *type_declarators,
struct declaration_struct *struct_declaration,
struct cds_list_head *declaration_specifier,
struct cds_list_head *type_declarators,
- struct declaration_scope *declaration_scope)
+ struct declaration_scope *declaration_scope,
+ struct ctf_trace *trace)
{
struct ctf_node *iter;
GQuark field_name;
{
struct ctf_node *iter;
GQuark field_name;
declaration_specifier,
&field_name, iter,
struct_declaration->scope,
declaration_specifier,
&field_name, iter,
struct_declaration->scope,
struct_declaration_add_field(struct_declaration,
g_quark_to_string(field_name),
field_declaration);
struct_declaration_add_field(struct_declaration,
g_quark_to_string(field_name),
field_declaration);
struct declaration_variant *variant_declaration,
struct cds_list_head *declaration_specifier,
struct cds_list_head *type_declarators,
struct declaration_variant *variant_declaration,
struct cds_list_head *declaration_specifier,
struct cds_list_head *type_declarators,
- struct declaration_scope *declaration_scope)
+ struct declaration_scope *declaration_scope,
+ struct ctf_trace *trace)
{
struct ctf_node *iter;
GQuark field_name;
{
struct ctf_node *iter;
GQuark field_name;
declaration_specifier,
&field_name, iter,
variant_declaration->scope,
declaration_specifier,
&field_name, iter,
variant_declaration->scope,
variant_declaration_add_field(variant_declaration,
g_quark_to_string(field_name),
field_declaration);
variant_declaration_add_field(variant_declaration,
g_quark_to_string(field_name),
field_declaration);
static
int ctf_typedef_visit(int fd, int depth, struct declaration_scope *scope,
struct cds_list_head *declaration_specifier,
static
int ctf_typedef_visit(int fd, int depth, struct declaration_scope *scope,
struct cds_list_head *declaration_specifier,
- struct cds_list_head *type_declarators)
+ struct cds_list_head *type_declarators,
+ struct ctf_trace *trace)
{
struct ctf_node *iter;
GQuark identifier;
{
struct ctf_node *iter;
GQuark identifier;
type_declaration = ctf_type_declarator_visit(fd, depth,
declaration_specifier,
&identifier, iter,
type_declaration = ctf_type_declarator_visit(fd, depth,
declaration_specifier,
&identifier, iter,
ret = register_declaration(identifier, type_declaration, scope);
if (ret) {
type_declaration->declaration_free(type_declaration);
ret = register_declaration(identifier, type_declaration, scope);
if (ret) {
type_declaration->declaration_free(type_declaration);
static
int ctf_typealias_visit(int fd, int depth, struct declaration_scope *scope,
static
int ctf_typealias_visit(int fd, int depth, struct declaration_scope *scope,
- struct ctf_node *target, struct ctf_node *alias)
+ struct ctf_node *target, struct ctf_node *alias,
+ struct ctf_trace *trace)
{
struct declaration *type_declaration;
struct ctf_node *iter, *node;
{
struct declaration *type_declaration;
struct ctf_node *iter, *node;
type_declaration = ctf_type_declarator_visit(fd, depth,
&target->u.typealias_target.declaration_specifier,
&dummy_id, &target->u.typealias_target.type_declarators,
type_declaration = ctf_type_declarator_visit(fd, depth,
&target->u.typealias_target.declaration_specifier,
&dummy_id, &target->u.typealias_target.type_declarators,
if (!type_declaration) {
fprintf(stderr, "[error] %s: problem creating type declaration\n", __func__);
err = -EINVAL;
if (!type_declaration) {
fprintf(stderr, "[error] %s: problem creating type declaration\n", __func__);
err = -EINVAL;
static
int ctf_struct_declaration_list_visit(int fd, int depth,
static
int ctf_struct_declaration_list_visit(int fd, int depth,
- struct ctf_node *iter, struct declaration_struct *struct_declaration)
+ struct ctf_node *iter, struct declaration_struct *struct_declaration,
+ struct ctf_trace *trace)
{
struct declaration *declaration;
int ret;
{
struct declaration *declaration;
int ret;
ret = ctf_typedef_visit(fd, depth,
struct_declaration->scope,
&iter->u._typedef.declaration_specifier,
ret = ctf_typedef_visit(fd, depth,
struct_declaration->scope,
&iter->u._typedef.declaration_specifier,
- &iter->u._typedef.type_declarators);
+ &iter->u._typedef.type_declarators, trace);
if (ret)
return ret;
break;
if (ret)
return ret;
break;
ret = ctf_typealias_visit(fd, depth,
struct_declaration->scope,
iter->u.typealias.target,
ret = ctf_typealias_visit(fd, depth,
struct_declaration->scope,
iter->u.typealias.target,
- iter->u.typealias.alias);
+ iter->u.typealias.alias, trace);
if (ret)
return ret;
break;
if (ret)
return ret;
break;
ret = ctf_struct_type_declarators_visit(fd, depth,
struct_declaration,
&iter->u.struct_or_variant_declaration.declaration_specifier,
ret = ctf_struct_type_declarators_visit(fd, depth,
struct_declaration,
&iter->u.struct_or_variant_declaration.declaration_specifier,
- &iter->u.struct_or_variant_declaration.type_declarators);
+ &iter->u.struct_or_variant_declaration.type_declarators, trace);
if (ret)
return ret;
break;
if (ret)
return ret;
break;
static
int ctf_variant_declaration_list_visit(int fd, int depth,
static
int ctf_variant_declaration_list_visit(int fd, int depth,
- struct ctf_node *iter, struct declaration_variant *variant_declaration)
+ struct ctf_node *iter, struct declaration_variant *variant_declaration,
+ struct ctf_trace *trace)
{
struct declaration *declaration;
int ret;
{
struct declaration *declaration;
int ret;
ret = ctf_typedef_visit(fd, depth,
variant_declaration->scope,
&iter->u._typedef.declaration_specifier,
ret = ctf_typedef_visit(fd, depth,
variant_declaration->scope,
&iter->u._typedef.declaration_specifier,
- &iter->u._typedef.type_declarators);
+ &iter->u._typedef.type_declarators, trace);
if (ret)
return ret;
break;
if (ret)
return ret;
break;
ret = ctf_typealias_visit(fd, depth,
variant_declaration->scope,
iter->u.typealias.target,
ret = ctf_typealias_visit(fd, depth,
variant_declaration->scope,
iter->u.typealias.target,
- iter->u.typealias.alias);
+ iter->u.typealias.alias, trace);
if (ret)
return ret;
break;
if (ret)
return ret;
break;
ret = ctf_variant_type_declarators_visit(fd, depth,
variant_declaration,
&iter->u.struct_or_variant_declaration.declaration_specifier,
ret = ctf_variant_type_declarators_visit(fd, depth,
variant_declaration,
&iter->u.struct_or_variant_declaration.declaration_specifier,
- &iter->u.struct_or_variant_declaration.type_declarators);
+ &iter->u.struct_or_variant_declaration.type_declarators, trace);
if (ret)
return ret;
break;
if (ret)
return ret;
break;
static
struct declaration_struct *ctf_declaration_struct_visit(FILE *fd,
int depth, const char *name, struct cds_list_head *declaration_list,
static
struct declaration_struct *ctf_declaration_struct_visit(FILE *fd,
int depth, const char *name, struct cds_list_head *declaration_list,
- int has_body, struct declaration_scope *declaration_scope)
+ int has_body, struct declaration_scope *declaration_scope,
+ struct ctf_trace *trace)
{
struct declaration *declaration;
struct declaration_struct *struct_declaration;
{
struct declaration *declaration;
struct declaration_struct *struct_declaration;
}
struct_declaration = struct_declaration_new(name, declaration_scope);
cds_list_for_each_entry(iter, declaration_list, siblings) {
}
struct_declaration = struct_declaration_new(name, declaration_scope);
cds_list_for_each_entry(iter, declaration_list, siblings) {
- ret = ctf_struct_declaration_list_visit(fd, depth + 1, iter, struct_declaration);
+ ret = ctf_struct_declaration_list_visit(fd, depth + 1, iter,
+ struct_declaration, trace);
static
struct declaration_variant *ctf_declaration_variant_visit(FILE *fd,
int depth, const char *name, struct cds_list_head *declaration_list,
static
struct declaration_variant *ctf_declaration_variant_visit(FILE *fd,
int depth, const char *name, struct cds_list_head *declaration_list,
- int has_body, struct declaration_scope *declaration_scope)
+ int has_body, struct declaration_scope *declaration_scope,
+ struct ctf_trace *trace)
{
struct declaration *declaration;
struct declaration_variant *variant_declaration;
{
struct declaration *declaration;
struct declaration_variant *variant_declaration;
}
variant_declaration = variant_declaration_new(name, declaration_scope);
cds_list_for_each_entry(iter, declaration_list, siblings) {
}
variant_declaration = variant_declaration_new(name, declaration_scope);
cds_list_for_each_entry(iter, declaration_list, siblings) {
- ret = ctf_variant_declaration_list_visit(fd, depth + 1, iter, variant_declaration);
+ ret = ctf_variant_declaration_list_visit(fd, depth + 1, iter,
+ variant_declaration, trace);
case NODE_TYPE_SPECIFIER:
declaration = ctf_type_declarator_visit(fd, depth,
container_type,
case NODE_TYPE_SPECIFIER:
declaration = ctf_type_declarator_visit(fd, depth,
container_type,
assert(declaration->id == CTF_TYPE_INTEGER);
integer_declaration = container_of(declaration, struct declaration_integer, p);
break;
assert(declaration->id == CTF_TYPE_INTEGER);
integer_declaration = container_of(declaration, struct declaration_integer, p);
break;
struct declaration_enum *
enum_declaration_new(struct declaration_integer *integer_declaration);
struct declaration_enum *
enum_declaration_new(struct declaration_integer *integer_declaration);
+struct declaration_string *
+ string_declaration_new(enum ctf_string_encoding encoding);
+
struct declaration_struct *
struct_declaration_new(struct declaration_scope *parent_scope);
void struct_declaration_add_field(struct declaration_struct *struct_declaration,
struct declaration_struct *
struct_declaration_new(struct declaration_scope *parent_scope);
void struct_declaration_add_field(struct declaration_struct *struct_declaration,