2 * SPDX-License-Identifier: MIT
4 * Copyright 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 * Common Trace Format Metadata Parent Link Creator.
9 #define BT_COMP_LOG_SELF_COMP (log_cfg->self_comp)
10 #define BT_LOG_OUTPUT_LEVEL (log_cfg->log_level)
11 #define BT_LOG_TAG "PLUGIN/CTF/META/PARENT-LINKS-VISITOR"
12 #include "logging/comp-logging.h"
18 #include "common/assert.h"
22 #include "common/macros.h"
23 #include "common/list.h"
29 int ctf_visitor_unary_expression(int depth
, struct ctf_node
*node
,
30 struct meta_log_config
*log_cfg
)
34 switch (node
->u
.unary_expression
.link
) {
35 case UNARY_LINK_UNKNOWN
:
41 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
,
42 "Unknown expression link type: type=%d\n",
43 node
->u
.unary_expression
.link
);
47 switch (node
->u
.unary_expression
.type
) {
49 case UNARY_SIGNED_CONSTANT
:
50 case UNARY_UNSIGNED_CONSTANT
:
53 node
->u
.unary_expression
.u
.sbrac_exp
->parent
= node
;
54 ret
= ctf_visitor_unary_expression(depth
+ 1,
55 node
->u
.unary_expression
.u
.sbrac_exp
,
63 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
,
64 "Unknown expression link type: type=%d\n",
65 node
->u
.unary_expression
.link
);
72 int ctf_visitor_type_specifier(int depth
, struct ctf_node
*node
,
73 struct meta_log_config
*log_cfg
)
77 switch (node
->u
.field_class_specifier
.type
) {
86 case TYPESPEC_UNSIGNED
:
88 case TYPESPEC_COMPLEX
:
89 case TYPESPEC_IMAGINARY
:
91 case TYPESPEC_ID_TYPE
:
93 case TYPESPEC_FLOATING_POINT
:
94 case TYPESPEC_INTEGER
:
97 case TYPESPEC_VARIANT
:
99 node
->u
.field_class_specifier
.node
->parent
= node
;
100 ret
= ctf_visitor_parent_links(depth
+ 1,
101 node
->u
.field_class_specifier
.node
,
107 case TYPESPEC_UNKNOWN
:
109 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
,
110 "Unknown type specifier: type=%d\n",
111 node
->u
.field_class_specifier
.type
);
118 int ctf_visitor_field_class_declarator(int depth
, struct ctf_node
*node
,
119 struct meta_log_config
*log_cfg
)
122 struct ctf_node
*iter
;
126 bt_list_for_each_entry(iter
, &node
->u
.field_class_declarator
.pointers
,
129 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
134 switch (node
->u
.field_class_declarator
.type
) {
138 if (node
->u
.field_class_declarator
.u
.nested
.field_class_declarator
) {
139 node
->u
.field_class_declarator
.u
.nested
.field_class_declarator
->parent
= node
;
140 ret
= ctf_visitor_parent_links(depth
+ 1,
141 node
->u
.field_class_declarator
.u
.nested
.field_class_declarator
,
146 if (!node
->u
.field_class_declarator
.u
.nested
.abstract_array
) {
147 bt_list_for_each_entry(iter
, &node
->u
.field_class_declarator
.u
.nested
.length
,
150 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
156 if (node
->u
.field_class_declarator
.bitfield_len
) {
157 node
->u
.field_class_declarator
.bitfield_len
= node
;
158 ret
= ctf_visitor_parent_links(depth
+ 1,
159 node
->u
.field_class_declarator
.bitfield_len
,
165 case TYPEDEC_UNKNOWN
:
167 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
,
168 "Unknown type declarator: type=%d\n",
169 node
->u
.field_class_declarator
.type
);
176 int ctf_visitor_parent_links(int depth
, struct ctf_node
*node
,
177 struct meta_log_config
*log_cfg
)
180 struct ctf_node
*iter
;
185 switch (node
->type
) {
187 bt_list_for_each_entry(iter
, &node
->u
.root
.declaration_list
, siblings
) {
189 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
194 bt_list_for_each_entry(iter
, &node
->u
.root
.trace
, siblings
) {
196 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
201 bt_list_for_each_entry(iter
, &node
->u
.root
.stream
, siblings
) {
203 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
208 bt_list_for_each_entry(iter
, &node
->u
.root
.event
, siblings
) {
210 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
215 bt_list_for_each_entry(iter
, &node
->u
.root
.clock
, siblings
) {
217 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
222 bt_list_for_each_entry(iter
, &node
->u
.root
.callsite
, siblings
) {
224 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
232 bt_list_for_each_entry(iter
, &node
->u
.event
.declaration_list
, siblings
) {
234 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
241 bt_list_for_each_entry(iter
, &node
->u
.stream
.declaration_list
, siblings
) {
243 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
250 bt_list_for_each_entry(iter
, &node
->u
.env
.declaration_list
, siblings
) {
252 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
259 bt_list_for_each_entry(iter
, &node
->u
.trace
.declaration_list
, siblings
) {
261 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
268 bt_list_for_each_entry(iter
, &node
->u
.clock
.declaration_list
, siblings
) {
270 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
277 bt_list_for_each_entry(iter
, &node
->u
.callsite
.declaration_list
, siblings
) {
279 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
286 case NODE_CTF_EXPRESSION
:
288 bt_list_for_each_entry(iter
, &node
->u
.ctf_expression
.left
, siblings
) {
290 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
295 bt_list_for_each_entry(iter
, &node
->u
.ctf_expression
.right
, siblings
) {
297 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
304 case NODE_UNARY_EXPRESSION
:
305 return ctf_visitor_unary_expression(depth
, node
, log_cfg
);
309 node
->u
.field_class_def
.field_class_specifier_list
->parent
= node
;
310 ret
= ctf_visitor_parent_links(depth
+ 1,
311 node
->u
.field_class_def
.field_class_specifier_list
,
315 bt_list_for_each_entry(iter
, &node
->u
.field_class_def
.field_class_declarators
, siblings
) {
317 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
324 case NODE_TYPEALIAS_TARGET
:
326 node
->u
.field_class_alias_target
.field_class_specifier_list
->parent
= node
;
327 ret
= ctf_visitor_parent_links(depth
+ 1,
328 node
->u
.field_class_alias_target
.field_class_specifier_list
,
332 bt_list_for_each_entry(iter
, &node
->u
.field_class_alias_target
.field_class_declarators
, siblings
) {
334 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
341 case NODE_TYPEALIAS_ALIAS
:
343 node
->u
.field_class_alias_name
.field_class_specifier_list
->parent
= node
;
344 ret
= ctf_visitor_parent_links(depth
+ 1,
345 node
->u
.field_class_alias_name
.field_class_specifier_list
,
349 bt_list_for_each_entry(iter
, &node
->u
.field_class_alias_name
.field_class_declarators
, siblings
) {
351 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
359 node
->u
.field_class_alias
.target
->parent
= node
;
360 ret
= ctf_visitor_parent_links(depth
+ 1,
361 node
->u
.field_class_alias
.target
, log_cfg
);
364 node
->u
.field_class_alias
.alias
->parent
= node
;
365 ret
= ctf_visitor_parent_links(depth
+ 1,
366 node
->u
.field_class_alias
.alias
, log_cfg
);
371 case NODE_TYPE_SPECIFIER_LIST
:
372 bt_list_for_each_entry(iter
, &node
->u
.field_class_specifier_list
.head
, siblings
) {
374 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
381 case NODE_TYPE_SPECIFIER
:
382 ret
= ctf_visitor_type_specifier(depth
, node
, log_cfg
);
388 case NODE_TYPE_DECLARATOR
:
389 ret
= ctf_visitor_field_class_declarator(depth
, node
,
395 case NODE_FLOATING_POINT
:
396 bt_list_for_each_entry(iter
, &node
->u
.floating_point
.expressions
, siblings
) {
398 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
405 bt_list_for_each_entry(iter
, &node
->u
.integer
.expressions
, siblings
) {
407 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
414 bt_list_for_each_entry(iter
, &node
->u
.string
.expressions
, siblings
) {
416 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
422 case NODE_ENUMERATOR
:
423 bt_list_for_each_entry(iter
, &node
->u
.enumerator
.values
, siblings
) {
425 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
433 if (node
->u
._enum
.container_field_class
) {
434 ret
= ctf_visitor_parent_links(depth
+ 1,
435 node
->u
._enum
.container_field_class
, log_cfg
);
440 bt_list_for_each_entry(iter
, &node
->u
._enum
.enumerator_list
, siblings
) {
442 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
449 case NODE_STRUCT_OR_VARIANT_DECLARATION
:
450 node
->u
.struct_or_variant_declaration
.field_class_specifier_list
->parent
= node
;
451 ret
= ctf_visitor_parent_links(depth
+ 1,
452 node
->u
.struct_or_variant_declaration
.field_class_specifier_list
,
456 bt_list_for_each_entry(iter
, &node
->u
.struct_or_variant_declaration
.field_class_declarators
, siblings
) {
458 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
465 bt_list_for_each_entry(iter
, &node
->u
.variant
.declaration_list
, siblings
) {
467 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
474 bt_list_for_each_entry(iter
, &node
->u
._struct
.declaration_list
, siblings
) {
476 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
481 bt_list_for_each_entry(iter
, &node
->u
._struct
.min_align
,
484 ret
= ctf_visitor_parent_links(depth
+ 1, iter
,
493 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
,
494 "Unknown node type: type=%d\n", node
->type
);