Logging: standardize logging tags
[babeltrace.git] / src / plugins / ctf / common / metadata / ctf-meta-update-in-ir.c
CommitLineData
44c440bc
PP
1/*
2 * Copyright 2018 - Philippe Proulx <pproulx@efficios.com>
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
13 */
14
350ad6c1 15#define BT_LOG_TAG "PLUGIN/CTF/META/UPDATE-IN-IR"
44c440bc
PP
16#include "logging.h"
17
3fadfbc0 18#include <babeltrace2/babeltrace.h>
91d81473 19#include "common/macros.h"
578e048b
MJ
20#include "common/assert.h"
21#include "compat/glib.h"
44c440bc
PP
22#include <glib.h>
23#include <stdint.h>
24#include <string.h>
25#include <inttypes.h>
578e048b 26#include "common/assert.h"
44c440bc
PP
27
28#include "ctf-meta-visitors.h"
29
83ebb7f1
PP
30static
31void force_update_field_class_in_ir(struct ctf_field_class *fc, bool in_ir)
32{
33 uint64_t i;
34
35 if (!fc) {
36 goto end;
37 }
38
39 fc->in_ir = in_ir;
40
41 switch (fc->type) {
42 case CTF_FIELD_CLASS_TYPE_STRUCT:
43 {
44 struct ctf_field_class_struct *struct_fc = (void *) fc;
45
46 for (i = 0; i < struct_fc->members->len; i++) {
47 struct ctf_named_field_class *named_fc =
48 ctf_field_class_struct_borrow_member_by_index(
49 struct_fc, i);
50
51 force_update_field_class_in_ir(named_fc->fc, in_ir);
52 }
53
54 break;
55 }
56 case CTF_FIELD_CLASS_TYPE_VARIANT:
57 {
58 struct ctf_named_field_class *named_fc;
59 struct ctf_field_class_variant *var_fc = (void *) fc;
60
61 for (i = 0; i < var_fc->options->len; i++) {
62 named_fc =
63 ctf_field_class_variant_borrow_option_by_index(
64 var_fc, i);
65
66 force_update_field_class_in_ir(named_fc->fc, in_ir);
67 }
68
69 break;
70 }
71 case CTF_FIELD_CLASS_TYPE_ARRAY:
72 case CTF_FIELD_CLASS_TYPE_SEQUENCE:
73 {
74 struct ctf_field_class_array_base *array_fc = (void *) fc;
75
76 force_update_field_class_in_ir(array_fc->elem_fc, in_ir);
77 break;
78 }
79 default:
80 break;
81 }
82
83end:
84 return;
85}
86
44c440bc 87static
5cd6d0e5 88void update_field_class_in_ir(struct ctf_field_class *fc,
44c440bc
PP
89 GHashTable *ft_dependents)
90{
91 int64_t i;
92
5cd6d0e5 93 if (!fc) {
44c440bc
PP
94 goto end;
95 }
96
864cad70
PP
97 switch (fc->type) {
98 case CTF_FIELD_CLASS_TYPE_INT:
99 case CTF_FIELD_CLASS_TYPE_ENUM:
44c440bc 100 {
5cd6d0e5 101 struct ctf_field_class_int *int_fc = (void *) fc;
44c440bc 102
2de73462
PP
103 /*
104 * Conditions to be in trace IR; one of:
105 *
106 * 1. Does NOT have a mapped clock class AND does not
107 * have a special meaning.
108 * 2. Another field class depends on it.
109 */
110 if ((!int_fc->mapped_clock_class &&
111 int_fc->meaning == CTF_FIELD_CLASS_MEANING_NONE) ||
5cd6d0e5 112 bt_g_hash_table_contains(ft_dependents, fc)) {
5cd6d0e5 113 fc->in_ir = true;
44c440bc
PP
114 }
115
116 break;
117 }
864cad70 118 case CTF_FIELD_CLASS_TYPE_STRUCT:
44c440bc 119 {
5cd6d0e5 120 struct ctf_field_class_struct *struct_fc = (void *) fc;
44c440bc 121
b2c863b0
PP
122 /*
123 * Make it part of IR if it's empty because it was
124 * originally empty.
125 */
126 if (struct_fc->members->len == 0) {
127 fc->in_ir = true;
128 }
129
44c440bc 130 /* Reverse order */
5cd6d0e5
PP
131 for (i = (int64_t) struct_fc->members->len - 1; i >= 0; i--) {
132 struct ctf_named_field_class *named_fc =
133 ctf_field_class_struct_borrow_member_by_index(
134 struct_fc, i);
44c440bc 135
5cd6d0e5 136 update_field_class_in_ir(named_fc->fc, ft_dependents);
44c440bc 137
5cd6d0e5 138 if (named_fc->fc->in_ir) {
44c440bc 139 /* At least one member is part of IR */
5cd6d0e5 140 fc->in_ir = true;
44c440bc
PP
141 }
142 }
143
144 break;
145 }
864cad70 146 case CTF_FIELD_CLASS_TYPE_VARIANT:
44c440bc 147 {
5cd6d0e5
PP
148 struct ctf_named_field_class *named_fc;
149 struct ctf_field_class_variant *var_fc = (void *) fc;
44c440bc
PP
150
151 /*
152 * Reverse order, although it is not important for this
5cd6d0e5
PP
153 * loop because a field class within a variant field
154 * type's option cannot depend on a field class in
155 * another option of the same variant field class.
44c440bc 156 */
5cd6d0e5
PP
157 for (i = (int64_t) var_fc->options->len - 1; i >= 0; i--) {
158 named_fc =
159 ctf_field_class_variant_borrow_option_by_index(
160 var_fc, i);
44c440bc 161
5cd6d0e5 162 update_field_class_in_ir(named_fc->fc, ft_dependents);
44c440bc 163
5cd6d0e5 164 if (named_fc->fc->in_ir) {
44c440bc 165 /* At least one option is part of IR */
5cd6d0e5 166 fc->in_ir = true;
44c440bc
PP
167 }
168 }
169
5cd6d0e5 170 if (fc->in_ir) {
44c440bc
PP
171 /*
172 * At least one option will make it to IR. In
173 * this case, make all options part of IR
174 * because the variant's tag could still select
175 * (dynamically) a removed option. This can mean
176 * having an empty structure as an option, for
177 * example, but at least all the options are
178 * selectable.
179 */
5cd6d0e5
PP
180 for (i = 0; i < var_fc->options->len; i++) {
181 ctf_field_class_variant_borrow_option_by_index(
182 var_fc, i)->fc->in_ir = true;
44c440bc
PP
183 }
184
185 /*
5cd6d0e5
PP
186 * This variant field class is part of IR and
187 * depends on a tag field class (which must also
44c440bc
PP
188 * be part of IR).
189 */
5cd6d0e5
PP
190 g_hash_table_insert(ft_dependents, var_fc->tag_fc,
191 var_fc->tag_fc);
44c440bc
PP
192 }
193
194 break;
195 }
864cad70
PP
196 case CTF_FIELD_CLASS_TYPE_ARRAY:
197 case CTF_FIELD_CLASS_TYPE_SEQUENCE:
44c440bc 198 {
5cd6d0e5 199 struct ctf_field_class_array_base *array_fc = (void *) fc;
44c440bc 200
5cd6d0e5
PP
201 update_field_class_in_ir(array_fc->elem_fc, ft_dependents);
202 fc->in_ir = array_fc->elem_fc->in_ir;
44c440bc 203
864cad70 204 if (fc->type == CTF_FIELD_CLASS_TYPE_ARRAY) {
5cd6d0e5 205 struct ctf_field_class_array *arr_fc = (void *) fc;
44c440bc 206
5cd6d0e5
PP
207 assert(arr_fc->meaning == CTF_FIELD_CLASS_MEANING_NONE ||
208 arr_fc->meaning == CTF_FIELD_CLASS_MEANING_UUID);
44c440bc
PP
209
210 /*
5cd6d0e5 211 * UUID field class: nothing depends on this, so
44c440bc
PP
212 * it's not part of IR.
213 */
5cd6d0e5
PP
214 if (arr_fc->meaning == CTF_FIELD_CLASS_MEANING_UUID) {
215 fc->in_ir = false;
216 array_fc->elem_fc->in_ir = false;
44c440bc 217 }
864cad70 218 } else if (fc->type == CTF_FIELD_CLASS_TYPE_SEQUENCE) {
5cd6d0e5
PP
219 if (fc->in_ir) {
220 struct ctf_field_class_sequence *seq_fc = (void *) fc;
44c440bc
PP
221
222 /*
5cd6d0e5
PP
223 * This sequence field class is part of
224 * IR and depends on a length field class
44c440bc
PP
225 * (which must also be part of IR).
226 */
227 g_hash_table_insert(ft_dependents,
5cd6d0e5 228 seq_fc->length_fc, seq_fc->length_fc);
44c440bc
PP
229 }
230 }
231
232 break;
233 }
234 default:
5cd6d0e5 235 fc->in_ir = true;
44c440bc
PP
236 break;
237 }
238
239end:
240 return;
241}
242
243/*
5cd6d0e5
PP
244 * Scopes and field classes are processed in reverse order because we need
245 * to know if a given integer field class has dependents (sequence or
246 * variant field classes) when we reach it. Dependents can only be located
247 * after the length/tag field class in the metadata tree.
44c440bc
PP
248 */
249BT_HIDDEN
250int ctf_trace_class_update_in_ir(struct ctf_trace_class *ctf_tc)
251{
252 int ret = 0;
253 uint64_t i;
254
255 GHashTable *ft_dependents = g_hash_table_new(g_direct_hash,
256 g_direct_equal);
257
258 BT_ASSERT(ft_dependents);
259
260 for (i = 0; i < ctf_tc->stream_classes->len; i++) {
261 struct ctf_stream_class *sc = ctf_tc->stream_classes->pdata[i];
262 uint64_t j;
263
264 for (j = 0; j < sc->event_classes->len; j++) {
265 struct ctf_event_class *ec = sc->event_classes->pdata[j];
266
267 if (ec->is_translated) {
268 continue;
269 }
270
5cd6d0e5
PP
271 update_field_class_in_ir(ec->payload_fc, ft_dependents);
272 update_field_class_in_ir(ec->spec_context_fc,
44c440bc
PP
273 ft_dependents);
274 }
275
276 if (!sc->is_translated) {
5cd6d0e5 277 update_field_class_in_ir(sc->event_common_context_fc,
44c440bc 278 ft_dependents);
83ebb7f1
PP
279 force_update_field_class_in_ir(sc->event_header_fc,
280 false);
5cd6d0e5 281 update_field_class_in_ir(sc->packet_context_fc,
44c440bc
PP
282 ft_dependents);
283 }
284 }
285
286 if (!ctf_tc->is_translated) {
83ebb7f1
PP
287 force_update_field_class_in_ir(ctf_tc->packet_header_fc,
288 false);
44c440bc
PP
289 }
290
291 g_hash_table_destroy(ft_dependents);
292 return ret;
293}
This page took 0.044026 seconds and 4 git commands to generate.