2 * SPDX-License-Identifier: MIT
4 * Copyright 2010 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 * Common Trace Format Metadata Parent Link Creator.
12 #include "logging.hpp"
14 #include "common/list.h"
18 static int ctf_visitor_unary_expression(int depth
, struct ctf_node
*node
,
19 const bt2c::Logger
& logger
)
23 switch (node
->u
.unary_expression
.link
) {
24 case UNARY_LINK_UNKNOWN
:
30 _BT_CPPLOGE_APPEND_CAUSE_LINENO(logger
, node
->lineno
,
31 "Unknown expression link type: type={}\n",
32 (int) node
->u
.unary_expression
.link
);
36 switch (node
->u
.unary_expression
.type
) {
38 case UNARY_SIGNED_CONSTANT
:
39 case UNARY_UNSIGNED_CONSTANT
:
42 node
->u
.unary_expression
.u
.sbrac_exp
->parent
= node
;
43 ret
= ctf_visitor_unary_expression(depth
+ 1, node
->u
.unary_expression
.u
.sbrac_exp
, logger
);
50 _BT_CPPLOGE_APPEND_CAUSE_LINENO(logger
, node
->lineno
,
51 "Unknown expression link type: type={}\n",
52 (int) node
->u
.unary_expression
.link
);
58 static int ctf_visitor_type_specifier(int depth
, struct ctf_node
*node
, const bt2c::Logger
& logger
)
62 switch (node
->u
.field_class_specifier
.type
) {
71 case TYPESPEC_UNSIGNED
:
73 case TYPESPEC_COMPLEX
:
74 case TYPESPEC_IMAGINARY
:
76 case TYPESPEC_ID_TYPE
:
78 case TYPESPEC_FLOATING_POINT
:
79 case TYPESPEC_INTEGER
:
82 case TYPESPEC_VARIANT
:
84 node
->u
.field_class_specifier
.node
->parent
= node
;
85 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
.field_class_specifier
.node
, logger
);
90 case TYPESPEC_UNKNOWN
:
92 _BT_CPPLOGE_APPEND_CAUSE_LINENO(logger
, node
->lineno
, "Unknown type specifier: type={}\n",
93 (int) node
->u
.field_class_specifier
.type
);
99 static int ctf_visitor_field_class_declarator(int depth
, struct ctf_node
*node
,
100 const bt2c::Logger
& logger
)
103 struct ctf_node
*iter
;
107 bt_list_for_each_entry (iter
, &node
->u
.field_class_declarator
.pointers
, siblings
) {
109 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
114 switch (node
->u
.field_class_declarator
.type
) {
118 if (node
->u
.field_class_declarator
.u
.nested
.field_class_declarator
) {
119 node
->u
.field_class_declarator
.u
.nested
.field_class_declarator
->parent
= node
;
120 ret
= ctf_visitor_parent_links(
121 depth
+ 1, node
->u
.field_class_declarator
.u
.nested
.field_class_declarator
, logger
);
125 if (!node
->u
.field_class_declarator
.u
.nested
.abstract_array
) {
126 bt_list_for_each_entry (iter
, &node
->u
.field_class_declarator
.u
.nested
.length
,
129 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
134 if (node
->u
.field_class_declarator
.bitfield_len
) {
135 node
->u
.field_class_declarator
.bitfield_len
= node
;
136 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
.field_class_declarator
.bitfield_len
,
142 case TYPEDEC_UNKNOWN
:
144 _BT_CPPLOGE_APPEND_CAUSE_LINENO(logger
, node
->lineno
, "Unknown type declarator: type={}\n",
145 (int) node
->u
.field_class_declarator
.type
);
152 int ctf_visitor_parent_links(int depth
, struct ctf_node
*node
, const bt2c::Logger
& parentLogger
)
155 struct ctf_node
*iter
;
160 bt2c::Logger logger
{parentLogger
, "PLUGIN/CTF/META/PARENT-LINKS-VISITOR"};
162 switch (node
->type
) {
164 bt_list_for_each_entry (iter
, &node
->u
.root
.declaration_list
, siblings
) {
166 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
170 bt_list_for_each_entry (iter
, &node
->u
.root
.trace
, siblings
) {
172 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
176 bt_list_for_each_entry (iter
, &node
->u
.root
.stream
, siblings
) {
178 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
182 bt_list_for_each_entry (iter
, &node
->u
.root
.event
, siblings
) {
184 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
188 bt_list_for_each_entry (iter
, &node
->u
.root
.clock
, siblings
) {
190 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
194 bt_list_for_each_entry (iter
, &node
->u
.root
.callsite
, siblings
) {
196 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
203 bt_list_for_each_entry (iter
, &node
->u
.event
.declaration_list
, siblings
) {
205 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
211 bt_list_for_each_entry (iter
, &node
->u
.stream
.declaration_list
, siblings
) {
213 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
219 bt_list_for_each_entry (iter
, &node
->u
.env
.declaration_list
, siblings
) {
221 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
227 bt_list_for_each_entry (iter
, &node
->u
.trace
.declaration_list
, siblings
) {
229 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
235 bt_list_for_each_entry (iter
, &node
->u
.clock
.declaration_list
, siblings
) {
237 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
243 bt_list_for_each_entry (iter
, &node
->u
.callsite
.declaration_list
, siblings
) {
245 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
251 case NODE_CTF_EXPRESSION
:
253 bt_list_for_each_entry (iter
, &node
->u
.ctf_expression
.left
, siblings
) {
255 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
259 bt_list_for_each_entry (iter
, &node
->u
.ctf_expression
.right
, siblings
) {
261 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
267 case NODE_UNARY_EXPRESSION
:
268 return ctf_visitor_unary_expression(depth
, node
, logger
);
272 node
->u
.field_class_def
.field_class_specifier_list
->parent
= node
;
273 ret
= ctf_visitor_parent_links(depth
+ 1,
274 node
->u
.field_class_def
.field_class_specifier_list
, logger
);
277 bt_list_for_each_entry (iter
, &node
->u
.field_class_def
.field_class_declarators
, siblings
) {
279 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
285 case NODE_TYPEALIAS_TARGET
:
287 node
->u
.field_class_alias_target
.field_class_specifier_list
->parent
= node
;
288 ret
= ctf_visitor_parent_links(
289 depth
+ 1, node
->u
.field_class_alias_target
.field_class_specifier_list
, logger
);
292 bt_list_for_each_entry (iter
, &node
->u
.field_class_alias_target
.field_class_declarators
,
295 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
301 case NODE_TYPEALIAS_ALIAS
:
303 node
->u
.field_class_alias_name
.field_class_specifier_list
->parent
= node
;
304 ret
= ctf_visitor_parent_links(
305 depth
+ 1, node
->u
.field_class_alias_name
.field_class_specifier_list
, logger
);
308 bt_list_for_each_entry (iter
, &node
->u
.field_class_alias_name
.field_class_declarators
,
311 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
318 node
->u
.field_class_alias
.target
->parent
= node
;
319 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
.field_class_alias
.target
, logger
);
322 node
->u
.field_class_alias
.alias
->parent
= node
;
323 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
.field_class_alias
.alias
, logger
);
328 case NODE_TYPE_SPECIFIER_LIST
:
329 bt_list_for_each_entry (iter
, &node
->u
.field_class_specifier_list
.head
, siblings
) {
331 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
337 case NODE_TYPE_SPECIFIER
:
338 ret
= ctf_visitor_type_specifier(depth
, node
, logger
);
344 case NODE_TYPE_DECLARATOR
:
345 ret
= ctf_visitor_field_class_declarator(depth
, node
, logger
);
350 case NODE_FLOATING_POINT
:
351 bt_list_for_each_entry (iter
, &node
->u
.floating_point
.expressions
, siblings
) {
353 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
359 bt_list_for_each_entry (iter
, &node
->u
.integer
.expressions
, siblings
) {
361 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
367 bt_list_for_each_entry (iter
, &node
->u
.string
.expressions
, siblings
) {
369 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
374 case NODE_ENUMERATOR
:
375 bt_list_for_each_entry (iter
, &node
->u
.enumerator
.values
, siblings
) {
377 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
384 if (node
->u
._enum
.container_field_class
) {
385 ret
= ctf_visitor_parent_links(depth
+ 1, node
->u
._enum
.container_field_class
, logger
);
390 bt_list_for_each_entry (iter
, &node
->u
._enum
.enumerator_list
, siblings
) {
392 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
398 case NODE_STRUCT_OR_VARIANT_DECLARATION
:
399 node
->u
.struct_or_variant_declaration
.field_class_specifier_list
->parent
= node
;
400 ret
= ctf_visitor_parent_links(
401 depth
+ 1, node
->u
.struct_or_variant_declaration
.field_class_specifier_list
, logger
);
404 bt_list_for_each_entry (
405 iter
, &node
->u
.struct_or_variant_declaration
.field_class_declarators
, siblings
) {
407 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
413 bt_list_for_each_entry (iter
, &node
->u
.variant
.declaration_list
, siblings
) {
415 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
421 bt_list_for_each_entry (iter
, &node
->u
._struct
.declaration_list
, siblings
) {
423 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
427 bt_list_for_each_entry (iter
, &node
->u
._struct
.min_align
, siblings
) {
429 ret
= ctf_visitor_parent_links(depth
+ 1, iter
, logger
);
437 _BT_CPPLOGE_APPEND_CAUSE_LINENO(logger
, node
->lineno
, "Unknown node type: type={}\n",