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"
24 #include "scanner.hpp"
26 #include "logging.hpp"
28 static int ctf_visitor_unary_expression(int depth
, struct ctf_node
*node
,
29 struct meta_log_config
*log_cfg
)
33 switch (node
->u
.unary_expression
.link
) {
34 case UNARY_LINK_UNKNOWN
:
40 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
, "Unknown expression link type: type=%d\n",
41 node
->u
.unary_expression
.link
);
45 switch (node
->u
.unary_expression
.type
) {
47 case UNARY_SIGNED_CONSTANT
:
48 case UNARY_UNSIGNED_CONSTANT
:
51 node
->u
.unary_expression
.u
.sbrac_exp
->parent
= node
;
53 ctf_visitor_unary_expression(depth
+ 1, node
->u
.unary_expression
.u
.sbrac_exp
, log_cfg
);
60 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
, "Unknown expression link type: type=%d\n",
61 node
->u
.unary_expression
.link
);
67 static int ctf_visitor_type_specifier(int depth
, struct ctf_node
*node
,
68 struct meta_log_config
*log_cfg
)
72 switch (node
->u
.field_class_specifier
.type
) {
81 case TYPESPEC_UNSIGNED
:
83 case TYPESPEC_COMPLEX
:
84 case TYPESPEC_IMAGINARY
:
86 case TYPESPEC_ID_TYPE
:
88 case TYPESPEC_FLOATING_POINT
:
89 case TYPESPEC_INTEGER
:
92 case TYPESPEC_VARIANT
:
94 node
->u
.field_class_specifier
.node
->parent
= node
;
95 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
.field_class_specifier
.node
, log_cfg
);
100 case TYPESPEC_UNKNOWN
:
102 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
, "Unknown type specifier: type=%d\n",
103 node
->u
.field_class_specifier
.type
);
109 static int ctf_visitor_field_class_declarator(int depth
, struct ctf_node
*node
,
110 struct meta_log_config
*log_cfg
)
113 struct ctf_node
*iter
;
117 bt_list_for_each_entry (iter
, &node
->u
.field_class_declarator
.pointers
, siblings
) {
119 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
124 switch (node
->u
.field_class_declarator
.type
) {
128 if (node
->u
.field_class_declarator
.u
.nested
.field_class_declarator
) {
129 node
->u
.field_class_declarator
.u
.nested
.field_class_declarator
->parent
= node
;
130 ret
= ctf_visitor_parent_links(
131 depth
+ 1, node
->u
.field_class_declarator
.u
.nested
.field_class_declarator
, log_cfg
);
135 if (!node
->u
.field_class_declarator
.u
.nested
.abstract_array
) {
136 bt_list_for_each_entry (iter
, &node
->u
.field_class_declarator
.u
.nested
.length
,
139 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
144 if (node
->u
.field_class_declarator
.bitfield_len
) {
145 node
->u
.field_class_declarator
.bitfield_len
= node
;
146 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
.field_class_declarator
.bitfield_len
,
152 case TYPEDEC_UNKNOWN
:
154 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
, "Unknown type declarator: type=%d\n",
155 node
->u
.field_class_declarator
.type
);
162 int ctf_visitor_parent_links(int depth
, struct ctf_node
*node
, struct meta_log_config
*log_cfg
)
165 struct ctf_node
*iter
;
170 switch (node
->type
) {
172 bt_list_for_each_entry (iter
, &node
->u
.root
.declaration_list
, siblings
) {
174 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
178 bt_list_for_each_entry (iter
, &node
->u
.root
.trace
, siblings
) {
180 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
184 bt_list_for_each_entry (iter
, &node
->u
.root
.stream
, siblings
) {
186 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
190 bt_list_for_each_entry (iter
, &node
->u
.root
.event
, siblings
) {
192 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
196 bt_list_for_each_entry (iter
, &node
->u
.root
.clock
, siblings
) {
198 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
202 bt_list_for_each_entry (iter
, &node
->u
.root
.callsite
, siblings
) {
204 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
211 bt_list_for_each_entry (iter
, &node
->u
.event
.declaration_list
, siblings
) {
213 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
219 bt_list_for_each_entry (iter
, &node
->u
.stream
.declaration_list
, siblings
) {
221 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
227 bt_list_for_each_entry (iter
, &node
->u
.env
.declaration_list
, siblings
) {
229 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
235 bt_list_for_each_entry (iter
, &node
->u
.trace
.declaration_list
, siblings
) {
237 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
243 bt_list_for_each_entry (iter
, &node
->u
.clock
.declaration_list
, siblings
) {
245 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
251 bt_list_for_each_entry (iter
, &node
->u
.callsite
.declaration_list
, siblings
) {
253 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
259 case NODE_CTF_EXPRESSION
:
261 bt_list_for_each_entry (iter
, &node
->u
.ctf_expression
.left
, siblings
) {
263 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
267 bt_list_for_each_entry (iter
, &node
->u
.ctf_expression
.right
, siblings
) {
269 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
275 case NODE_UNARY_EXPRESSION
:
276 return ctf_visitor_unary_expression(depth
, node
, log_cfg
);
280 node
->u
.field_class_def
.field_class_specifier_list
->parent
= node
;
281 ret
= ctf_visitor_parent_links(depth
+ 1,
282 node
->u
.field_class_def
.field_class_specifier_list
, log_cfg
);
285 bt_list_for_each_entry (iter
, &node
->u
.field_class_def
.field_class_declarators
, siblings
) {
287 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
293 case NODE_TYPEALIAS_TARGET
:
295 node
->u
.field_class_alias_target
.field_class_specifier_list
->parent
= node
;
296 ret
= ctf_visitor_parent_links(
297 depth
+ 1, node
->u
.field_class_alias_target
.field_class_specifier_list
, log_cfg
);
300 bt_list_for_each_entry (iter
, &node
->u
.field_class_alias_target
.field_class_declarators
,
303 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
309 case NODE_TYPEALIAS_ALIAS
:
311 node
->u
.field_class_alias_name
.field_class_specifier_list
->parent
= node
;
312 ret
= ctf_visitor_parent_links(
313 depth
+ 1, node
->u
.field_class_alias_name
.field_class_specifier_list
, log_cfg
);
316 bt_list_for_each_entry (iter
, &node
->u
.field_class_alias_name
.field_class_declarators
,
319 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
326 node
->u
.field_class_alias
.target
->parent
= node
;
327 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
.field_class_alias
.target
, log_cfg
);
330 node
->u
.field_class_alias
.alias
->parent
= node
;
331 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
.field_class_alias
.alias
, log_cfg
);
336 case NODE_TYPE_SPECIFIER_LIST
:
337 bt_list_for_each_entry (iter
, &node
->u
.field_class_specifier_list
.head
, siblings
) {
339 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
345 case NODE_TYPE_SPECIFIER
:
346 ret
= ctf_visitor_type_specifier(depth
, node
, log_cfg
);
352 case NODE_TYPE_DECLARATOR
:
353 ret
= ctf_visitor_field_class_declarator(depth
, node
, log_cfg
);
358 case NODE_FLOATING_POINT
:
359 bt_list_for_each_entry (iter
, &node
->u
.floating_point
.expressions
, siblings
) {
361 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
367 bt_list_for_each_entry (iter
, &node
->u
.integer
.expressions
, siblings
) {
369 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
375 bt_list_for_each_entry (iter
, &node
->u
.string
.expressions
, siblings
) {
377 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
382 case NODE_ENUMERATOR
:
383 bt_list_for_each_entry (iter
, &node
->u
.enumerator
.values
, siblings
) {
385 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
392 if (node
->u
._enum
.container_field_class
) {
393 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
._enum
.container_field_class
, log_cfg
);
398 bt_list_for_each_entry (iter
, &node
->u
._enum
.enumerator_list
, siblings
) {
400 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
406 case NODE_STRUCT_OR_VARIANT_DECLARATION
:
407 node
->u
.struct_or_variant_declaration
.field_class_specifier_list
->parent
= node
;
408 ret
= ctf_visitor_parent_links(
409 depth
+ 1, node
->u
.struct_or_variant_declaration
.field_class_specifier_list
, log_cfg
);
412 bt_list_for_each_entry (
413 iter
, &node
->u
.struct_or_variant_declaration
.field_class_declarators
, siblings
) {
415 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
421 bt_list_for_each_entry (iter
, &node
->u
.variant
.declaration_list
, siblings
) {
423 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
429 bt_list_for_each_entry (iter
, &node
->u
._struct
.declaration_list
, siblings
) {
431 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
435 bt_list_for_each_entry (iter
, &node
->u
._struct
.min_align
, siblings
) {
437 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
445 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
, "Unknown node type: type=%d\n", node
->type
);