2 * SPDX-License-Identifier: MIT
4 * Copyright 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 * Common Trace Format Metadata Parent Link Creator.
17 #define BT_COMP_LOG_SELF_COMP (log_cfg->self_comp)
18 #define BT_LOG_OUTPUT_LEVEL (log_cfg->log_level)
19 #define BT_LOG_TAG "PLUGIN/CTF/META/PARENT-LINKS-VISITOR"
20 #include "logging.hpp"
21 #include "logging/comp-logging.h"
23 #include "common/assert.h"
24 #include "common/list.h"
25 #include "common/macros.h"
28 #include "scanner.hpp"
30 static int ctf_visitor_unary_expression(int depth
, struct ctf_node
*node
,
31 struct meta_log_config
*log_cfg
)
35 switch (node
->u
.unary_expression
.link
) {
36 case UNARY_LINK_UNKNOWN
:
42 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
, "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
;
55 ctf_visitor_unary_expression(depth
+ 1, node
->u
.unary_expression
.u
.sbrac_exp
, log_cfg
);
62 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
, "Unknown expression link type: type=%d\n",
63 node
->u
.unary_expression
.link
);
69 static int ctf_visitor_type_specifier(int depth
, struct ctf_node
*node
,
70 struct meta_log_config
*log_cfg
)
74 switch (node
->u
.field_class_specifier
.type
) {
83 case TYPESPEC_UNSIGNED
:
85 case TYPESPEC_COMPLEX
:
86 case TYPESPEC_IMAGINARY
:
88 case TYPESPEC_ID_TYPE
:
90 case TYPESPEC_FLOATING_POINT
:
91 case TYPESPEC_INTEGER
:
94 case TYPESPEC_VARIANT
:
96 node
->u
.field_class_specifier
.node
->parent
= node
;
97 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
.field_class_specifier
.node
, log_cfg
);
102 case TYPESPEC_UNKNOWN
:
104 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
, "Unknown type specifier: type=%d\n",
105 node
->u
.field_class_specifier
.type
);
111 static int ctf_visitor_field_class_declarator(int depth
, struct ctf_node
*node
,
112 struct meta_log_config
*log_cfg
)
115 struct ctf_node
*iter
;
119 bt_list_for_each_entry (iter
, &node
->u
.field_class_declarator
.pointers
, siblings
) {
121 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
126 switch (node
->u
.field_class_declarator
.type
) {
130 if (node
->u
.field_class_declarator
.u
.nested
.field_class_declarator
) {
131 node
->u
.field_class_declarator
.u
.nested
.field_class_declarator
->parent
= node
;
132 ret
= ctf_visitor_parent_links(
133 depth
+ 1, node
->u
.field_class_declarator
.u
.nested
.field_class_declarator
, log_cfg
);
137 if (!node
->u
.field_class_declarator
.u
.nested
.abstract_array
) {
138 bt_list_for_each_entry (iter
, &node
->u
.field_class_declarator
.u
.nested
.length
,
141 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
146 if (node
->u
.field_class_declarator
.bitfield_len
) {
147 node
->u
.field_class_declarator
.bitfield_len
= node
;
148 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
.field_class_declarator
.bitfield_len
,
154 case TYPEDEC_UNKNOWN
:
156 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
, "Unknown type declarator: type=%d\n",
157 node
->u
.field_class_declarator
.type
);
164 int ctf_visitor_parent_links(int depth
, struct ctf_node
*node
, struct meta_log_config
*log_cfg
)
167 struct ctf_node
*iter
;
172 switch (node
->type
) {
174 bt_list_for_each_entry (iter
, &node
->u
.root
.declaration_list
, siblings
) {
176 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
180 bt_list_for_each_entry (iter
, &node
->u
.root
.trace
, siblings
) {
182 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
186 bt_list_for_each_entry (iter
, &node
->u
.root
.stream
, siblings
) {
188 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
192 bt_list_for_each_entry (iter
, &node
->u
.root
.event
, siblings
) {
194 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
198 bt_list_for_each_entry (iter
, &node
->u
.root
.clock
, siblings
) {
200 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
204 bt_list_for_each_entry (iter
, &node
->u
.root
.callsite
, siblings
) {
206 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
213 bt_list_for_each_entry (iter
, &node
->u
.event
.declaration_list
, siblings
) {
215 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
221 bt_list_for_each_entry (iter
, &node
->u
.stream
.declaration_list
, siblings
) {
223 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
229 bt_list_for_each_entry (iter
, &node
->u
.env
.declaration_list
, siblings
) {
231 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
237 bt_list_for_each_entry (iter
, &node
->u
.trace
.declaration_list
, siblings
) {
239 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
245 bt_list_for_each_entry (iter
, &node
->u
.clock
.declaration_list
, siblings
) {
247 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
253 bt_list_for_each_entry (iter
, &node
->u
.callsite
.declaration_list
, siblings
) {
255 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
261 case NODE_CTF_EXPRESSION
:
263 bt_list_for_each_entry (iter
, &node
->u
.ctf_expression
.left
, siblings
) {
265 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
269 bt_list_for_each_entry (iter
, &node
->u
.ctf_expression
.right
, siblings
) {
271 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
277 case NODE_UNARY_EXPRESSION
:
278 return ctf_visitor_unary_expression(depth
, node
, log_cfg
);
282 node
->u
.field_class_def
.field_class_specifier_list
->parent
= node
;
283 ret
= ctf_visitor_parent_links(depth
+ 1,
284 node
->u
.field_class_def
.field_class_specifier_list
, log_cfg
);
287 bt_list_for_each_entry (iter
, &node
->u
.field_class_def
.field_class_declarators
, siblings
) {
289 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
295 case NODE_TYPEALIAS_TARGET
:
297 node
->u
.field_class_alias_target
.field_class_specifier_list
->parent
= node
;
298 ret
= ctf_visitor_parent_links(
299 depth
+ 1, node
->u
.field_class_alias_target
.field_class_specifier_list
, log_cfg
);
302 bt_list_for_each_entry (iter
, &node
->u
.field_class_alias_target
.field_class_declarators
,
305 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
311 case NODE_TYPEALIAS_ALIAS
:
313 node
->u
.field_class_alias_name
.field_class_specifier_list
->parent
= node
;
314 ret
= ctf_visitor_parent_links(
315 depth
+ 1, node
->u
.field_class_alias_name
.field_class_specifier_list
, log_cfg
);
318 bt_list_for_each_entry (iter
, &node
->u
.field_class_alias_name
.field_class_declarators
,
321 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
328 node
->u
.field_class_alias
.target
->parent
= node
;
329 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
.field_class_alias
.target
, log_cfg
);
332 node
->u
.field_class_alias
.alias
->parent
= node
;
333 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
.field_class_alias
.alias
, log_cfg
);
338 case NODE_TYPE_SPECIFIER_LIST
:
339 bt_list_for_each_entry (iter
, &node
->u
.field_class_specifier_list
.head
, siblings
) {
341 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
347 case NODE_TYPE_SPECIFIER
:
348 ret
= ctf_visitor_type_specifier(depth
, node
, log_cfg
);
354 case NODE_TYPE_DECLARATOR
:
355 ret
= ctf_visitor_field_class_declarator(depth
, node
, log_cfg
);
360 case NODE_FLOATING_POINT
:
361 bt_list_for_each_entry (iter
, &node
->u
.floating_point
.expressions
, siblings
) {
363 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
369 bt_list_for_each_entry (iter
, &node
->u
.integer
.expressions
, siblings
) {
371 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
377 bt_list_for_each_entry (iter
, &node
->u
.string
.expressions
, siblings
) {
379 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
384 case NODE_ENUMERATOR
:
385 bt_list_for_each_entry (iter
, &node
->u
.enumerator
.values
, siblings
) {
387 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
394 if (node
->u
._enum
.container_field_class
) {
395 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
._enum
.container_field_class
, log_cfg
);
400 bt_list_for_each_entry (iter
, &node
->u
._enum
.enumerator_list
, siblings
) {
402 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
408 case NODE_STRUCT_OR_VARIANT_DECLARATION
:
409 node
->u
.struct_or_variant_declaration
.field_class_specifier_list
->parent
= node
;
410 ret
= ctf_visitor_parent_links(
411 depth
+ 1, node
->u
.struct_or_variant_declaration
.field_class_specifier_list
, log_cfg
);
414 bt_list_for_each_entry (
415 iter
, &node
->u
.struct_or_variant_declaration
.field_class_declarators
, siblings
) {
417 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
423 bt_list_for_each_entry (iter
, &node
->u
.variant
.declaration_list
, siblings
) {
425 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
431 bt_list_for_each_entry (iter
, &node
->u
._struct
.declaration_list
, siblings
) {
433 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
437 bt_list_for_each_entry (iter
, &node
->u
._struct
.min_align
, siblings
) {
439 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, log_cfg
);
447 _BT_COMP_LOGE_APPEND_CAUSE_LINENO(node
->lineno
, "Unknown node type: type=%d\n", node
->type
);