Commit | Line | Data |
---|---|---|
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 | ||
15 | #define BT_LOG_TAG "PLUGIN-CTF-METADATA-META-TRANSLATE" | |
16 | #include "logging.h" | |
17 | ||
18 | #include <babeltrace/babeltrace.h> | |
19 | #include <babeltrace/babeltrace-internal.h> | |
20 | #include <babeltrace/assert-internal.h> | |
21 | #include <glib.h> | |
22 | #include <stdint.h> | |
23 | #include <string.h> | |
24 | #include <inttypes.h> | |
25 | ||
26 | #include "ctf-meta-visitors.h" | |
27 | ||
83ebb7f1 | 28 | struct ctx { |
7fcdb0a9 | 29 | bt_self_component_source *self_comp; |
83ebb7f1 PP |
30 | bt_trace_class *ir_tc; |
31 | bt_stream_class *ir_sc; | |
32 | struct ctf_trace_class *tc; | |
33 | struct ctf_stream_class *sc; | |
34 | struct ctf_event_class *ec; | |
35 | enum ctf_scope scope; | |
36 | }; | |
37 | ||
44c440bc | 38 | static inline |
83ebb7f1 PP |
39 | bt_field_class *ctf_field_class_to_ir(struct ctx *ctx, |
40 | struct ctf_field_class *fc); | |
44c440bc PP |
41 | |
42 | static inline | |
5cd6d0e5 | 43 | void ctf_field_class_int_set_props(struct ctf_field_class_int *fc, |
b19ff26f | 44 | bt_field_class *ir_fc) |
44c440bc | 45 | { |
40f4ba76 | 46 | bt_field_class_integer_set_field_value_range(ir_fc, |
e5be10ef | 47 | fc->base.size); |
40f4ba76 | 48 | bt_field_class_integer_set_preferred_display_base(ir_fc, |
5cd6d0e5 | 49 | fc->disp_base); |
44c440bc PP |
50 | } |
51 | ||
52 | static inline | |
83ebb7f1 | 53 | bt_field_class *ctf_field_class_int_to_ir(struct ctx *ctx, |
e5be10ef | 54 | struct ctf_field_class_int *fc) |
44c440bc | 55 | { |
b19ff26f | 56 | bt_field_class *ir_fc; |
44c440bc | 57 | |
5cd6d0e5 | 58 | if (fc->is_signed) { |
83ebb7f1 | 59 | ir_fc = bt_field_class_signed_integer_create(ctx->ir_tc); |
44c440bc | 60 | } else { |
83ebb7f1 | 61 | ir_fc = bt_field_class_unsigned_integer_create(ctx->ir_tc); |
44c440bc PP |
62 | } |
63 | ||
5cd6d0e5 PP |
64 | BT_ASSERT(ir_fc); |
65 | ctf_field_class_int_set_props(fc, ir_fc); | |
66 | return ir_fc; | |
44c440bc PP |
67 | } |
68 | ||
69 | static inline | |
83ebb7f1 | 70 | bt_field_class *ctf_field_class_enum_to_ir(struct ctx *ctx, |
e5be10ef | 71 | struct ctf_field_class_enum *fc) |
44c440bc PP |
72 | { |
73 | int ret; | |
b19ff26f | 74 | bt_field_class *ir_fc; |
44c440bc PP |
75 | uint64_t i; |
76 | ||
5cd6d0e5 | 77 | if (fc->base.is_signed) { |
83ebb7f1 | 78 | ir_fc = bt_field_class_signed_enumeration_create(ctx->ir_tc); |
44c440bc | 79 | } else { |
83ebb7f1 | 80 | ir_fc = bt_field_class_unsigned_enumeration_create(ctx->ir_tc); |
44c440bc PP |
81 | } |
82 | ||
5cd6d0e5 PP |
83 | BT_ASSERT(ir_fc); |
84 | ctf_field_class_int_set_props((void *) fc, ir_fc); | |
44c440bc | 85 | |
5cd6d0e5 PP |
86 | for (i = 0; i < fc->mappings->len; i++) { |
87 | struct ctf_field_class_enum_mapping *mapping = | |
88 | ctf_field_class_enum_borrow_mapping_by_index(fc, i); | |
44c440bc | 89 | |
5cd6d0e5 | 90 | if (fc->base.is_signed) { |
40f4ba76 | 91 | ret = bt_field_class_signed_enumeration_map_range( |
5cd6d0e5 | 92 | ir_fc, mapping->label->str, |
44c440bc PP |
93 | mapping->range.lower.i, mapping->range.upper.i); |
94 | } else { | |
40f4ba76 | 95 | ret = bt_field_class_unsigned_enumeration_map_range( |
5cd6d0e5 | 96 | ir_fc, mapping->label->str, |
44c440bc PP |
97 | mapping->range.lower.u, mapping->range.upper.u); |
98 | } | |
99 | ||
100 | BT_ASSERT(ret == 0); | |
101 | } | |
102 | ||
5cd6d0e5 | 103 | return ir_fc; |
44c440bc PP |
104 | } |
105 | ||
106 | static inline | |
83ebb7f1 | 107 | bt_field_class *ctf_field_class_float_to_ir(struct ctx *ctx, |
5cd6d0e5 | 108 | struct ctf_field_class_float *fc) |
44c440bc | 109 | { |
b19ff26f | 110 | bt_field_class *ir_fc; |
44c440bc | 111 | |
83ebb7f1 | 112 | ir_fc = bt_field_class_real_create(ctx->ir_tc); |
5cd6d0e5 | 113 | BT_ASSERT(ir_fc); |
44c440bc | 114 | |
5cd6d0e5 | 115 | if (fc->base.size == 32) { |
40f4ba76 | 116 | bt_field_class_real_set_is_single_precision(ir_fc, |
44c440bc | 117 | BT_TRUE); |
44c440bc PP |
118 | } |
119 | ||
5cd6d0e5 | 120 | return ir_fc; |
44c440bc PP |
121 | } |
122 | ||
123 | static inline | |
83ebb7f1 | 124 | bt_field_class *ctf_field_class_string_to_ir(struct ctx *ctx, |
5cd6d0e5 | 125 | struct ctf_field_class_string *fc) |
44c440bc | 126 | { |
83ebb7f1 | 127 | bt_field_class *ir_fc = bt_field_class_string_create(ctx->ir_tc); |
44c440bc | 128 | |
5cd6d0e5 PP |
129 | BT_ASSERT(ir_fc); |
130 | return ir_fc; | |
44c440bc PP |
131 | } |
132 | ||
133 | static inline | |
83ebb7f1 PP |
134 | void translate_struct_field_class_members(struct ctx *ctx, |
135 | struct ctf_field_class_struct *fc, bt_field_class *ir_fc, | |
136 | bool with_header_prefix, | |
137 | struct ctf_field_class_struct *context_fc) | |
44c440bc | 138 | { |
44c440bc | 139 | uint64_t i; |
83ebb7f1 | 140 | int ret; |
44c440bc | 141 | |
5cd6d0e5 PP |
142 | for (i = 0; i < fc->members->len; i++) { |
143 | struct ctf_named_field_class *named_fc = | |
144 | ctf_field_class_struct_borrow_member_by_index(fc, i); | |
b19ff26f | 145 | bt_field_class *member_ir_fc; |
83ebb7f1 | 146 | const char *name = named_fc->name->str; |
44c440bc | 147 | |
5cd6d0e5 | 148 | if (!named_fc->fc->in_ir) { |
44c440bc PP |
149 | continue; |
150 | } | |
151 | ||
83ebb7f1 | 152 | member_ir_fc = ctf_field_class_to_ir(ctx, named_fc->fc); |
5cd6d0e5 | 153 | BT_ASSERT(member_ir_fc); |
83ebb7f1 PP |
154 | ret = bt_field_class_structure_append_member(ir_fc, name, |
155 | member_ir_fc); | |
44c440bc | 156 | BT_ASSERT(ret == 0); |
c5b9b441 | 157 | bt_field_class_put_ref(member_ir_fc); |
44c440bc | 158 | } |
83ebb7f1 | 159 | } |
44c440bc | 160 | |
83ebb7f1 PP |
161 | static inline |
162 | bt_field_class *ctf_field_class_struct_to_ir(struct ctx *ctx, | |
163 | struct ctf_field_class_struct *fc) | |
164 | { | |
165 | bt_field_class *ir_fc = bt_field_class_structure_create(ctx->ir_tc); | |
166 | ||
167 | BT_ASSERT(ir_fc); | |
168 | translate_struct_field_class_members(ctx, fc, ir_fc, false, NULL); | |
5cd6d0e5 | 169 | return ir_fc; |
44c440bc PP |
170 | } |
171 | ||
172 | static inline | |
83ebb7f1 PP |
173 | bt_field_class *borrow_ir_fc_from_field_path(struct ctx *ctx, |
174 | struct ctf_field_path *field_path) | |
44c440bc | 175 | { |
b19ff26f | 176 | bt_field_class *ir_fc = NULL; |
5cd6d0e5 | 177 | struct ctf_field_class *fc = ctf_field_path_borrow_field_class( |
83ebb7f1 | 178 | field_path, ctx->tc, ctx->sc, ctx->ec); |
44c440bc | 179 | |
5cd6d0e5 | 180 | BT_ASSERT(fc); |
44c440bc | 181 | |
5cd6d0e5 PP |
182 | if (fc->in_ir) { |
183 | ir_fc = fc->ir_fc; | |
44c440bc PP |
184 | } |
185 | ||
5cd6d0e5 | 186 | return ir_fc; |
44c440bc PP |
187 | } |
188 | ||
189 | static inline | |
83ebb7f1 PP |
190 | bt_field_class *ctf_field_class_variant_to_ir(struct ctx *ctx, |
191 | struct ctf_field_class_variant *fc) | |
44c440bc PP |
192 | { |
193 | int ret; | |
83ebb7f1 | 194 | bt_field_class *ir_fc = bt_field_class_variant_create(ctx->ir_tc); |
44c440bc PP |
195 | uint64_t i; |
196 | ||
5cd6d0e5 | 197 | BT_ASSERT(ir_fc); |
83ebb7f1 PP |
198 | |
199 | if (fc->tag_path.root != CTF_SCOPE_PACKET_HEADER && | |
200 | fc->tag_path.root != CTF_SCOPE_EVENT_HEADER) { | |
201 | ret = bt_field_class_variant_set_selector_field_class( | |
202 | ir_fc, borrow_ir_fc_from_field_path(ctx, | |
203 | &fc->tag_path)); | |
204 | BT_ASSERT(ret == 0); | |
205 | } | |
44c440bc | 206 | |
5cd6d0e5 PP |
207 | for (i = 0; i < fc->options->len; i++) { |
208 | struct ctf_named_field_class *named_fc = | |
209 | ctf_field_class_variant_borrow_option_by_index(fc, i); | |
b19ff26f | 210 | bt_field_class *option_ir_fc; |
44c440bc | 211 | |
5cd6d0e5 | 212 | BT_ASSERT(named_fc->fc->in_ir); |
83ebb7f1 | 213 | option_ir_fc = ctf_field_class_to_ir(ctx, named_fc->fc); |
5cd6d0e5 | 214 | BT_ASSERT(option_ir_fc); |
40f4ba76 | 215 | ret = bt_field_class_variant_append_option( |
e5be10ef | 216 | ir_fc, named_fc->name->str, option_ir_fc); |
44c440bc | 217 | BT_ASSERT(ret == 0); |
c5b9b441 | 218 | bt_field_class_put_ref(option_ir_fc); |
44c440bc PP |
219 | } |
220 | ||
5cd6d0e5 | 221 | return ir_fc; |
44c440bc PP |
222 | } |
223 | ||
224 | static inline | |
83ebb7f1 PP |
225 | bt_field_class *ctf_field_class_array_to_ir(struct ctx *ctx, |
226 | struct ctf_field_class_array *fc) | |
44c440bc | 227 | { |
b19ff26f PP |
228 | bt_field_class *ir_fc; |
229 | bt_field_class *elem_ir_fc; | |
44c440bc | 230 | |
5cd6d0e5 | 231 | if (fc->base.is_text) { |
83ebb7f1 | 232 | ir_fc = bt_field_class_string_create(ctx->ir_tc); |
5cd6d0e5 | 233 | BT_ASSERT(ir_fc); |
44c440bc PP |
234 | goto end; |
235 | } | |
236 | ||
83ebb7f1 | 237 | elem_ir_fc = ctf_field_class_to_ir(ctx, fc->base.elem_fc); |
5cd6d0e5 | 238 | BT_ASSERT(elem_ir_fc); |
83ebb7f1 | 239 | ir_fc = bt_field_class_static_array_create(ctx->ir_tc, elem_ir_fc, |
e5be10ef | 240 | fc->length); |
5cd6d0e5 | 241 | BT_ASSERT(ir_fc); |
c5b9b441 | 242 | bt_field_class_put_ref(elem_ir_fc); |
44c440bc PP |
243 | |
244 | end: | |
5cd6d0e5 | 245 | return ir_fc; |
44c440bc PP |
246 | } |
247 | ||
248 | static inline | |
83ebb7f1 PP |
249 | bt_field_class *ctf_field_class_sequence_to_ir(struct ctx *ctx, |
250 | struct ctf_field_class_sequence *fc) | |
44c440bc PP |
251 | { |
252 | int ret; | |
b19ff26f PP |
253 | bt_field_class *ir_fc; |
254 | bt_field_class *elem_ir_fc; | |
44c440bc | 255 | |
5cd6d0e5 | 256 | if (fc->base.is_text) { |
83ebb7f1 | 257 | ir_fc = bt_field_class_string_create(ctx->ir_tc); |
5cd6d0e5 | 258 | BT_ASSERT(ir_fc); |
44c440bc PP |
259 | goto end; |
260 | } | |
261 | ||
83ebb7f1 | 262 | elem_ir_fc = ctf_field_class_to_ir(ctx, fc->base.elem_fc); |
5cd6d0e5 | 263 | BT_ASSERT(elem_ir_fc); |
83ebb7f1 | 264 | ir_fc = bt_field_class_dynamic_array_create(ctx->ir_tc, elem_ir_fc); |
5cd6d0e5 | 265 | BT_ASSERT(ir_fc); |
c5b9b441 | 266 | bt_field_class_put_ref(elem_ir_fc); |
5cd6d0e5 | 267 | BT_ASSERT(ir_fc); |
83ebb7f1 PP |
268 | |
269 | if (fc->length_path.root != CTF_SCOPE_PACKET_HEADER && | |
270 | fc->length_path.root != CTF_SCOPE_EVENT_HEADER) { | |
271 | ret = bt_field_class_dynamic_array_set_length_field_class( | |
272 | ir_fc, borrow_ir_fc_from_field_path(ctx, &fc->length_path)); | |
273 | BT_ASSERT(ret == 0); | |
274 | } | |
44c440bc PP |
275 | |
276 | end: | |
5cd6d0e5 | 277 | return ir_fc; |
44c440bc PP |
278 | } |
279 | ||
280 | static inline | |
83ebb7f1 PP |
281 | bt_field_class *ctf_field_class_to_ir(struct ctx *ctx, |
282 | struct ctf_field_class *fc) | |
44c440bc | 283 | { |
b19ff26f | 284 | bt_field_class *ir_fc = NULL; |
44c440bc | 285 | |
5cd6d0e5 PP |
286 | BT_ASSERT(fc); |
287 | BT_ASSERT(fc->in_ir); | |
44c440bc | 288 | |
864cad70 PP |
289 | switch (fc->type) { |
290 | case CTF_FIELD_CLASS_TYPE_INT: | |
83ebb7f1 | 291 | ir_fc = ctf_field_class_int_to_ir(ctx, (void *) fc); |
44c440bc | 292 | break; |
864cad70 | 293 | case CTF_FIELD_CLASS_TYPE_ENUM: |
83ebb7f1 | 294 | ir_fc = ctf_field_class_enum_to_ir(ctx, (void *) fc); |
44c440bc | 295 | break; |
864cad70 | 296 | case CTF_FIELD_CLASS_TYPE_FLOAT: |
83ebb7f1 | 297 | ir_fc = ctf_field_class_float_to_ir(ctx, (void *) fc); |
44c440bc | 298 | break; |
864cad70 | 299 | case CTF_FIELD_CLASS_TYPE_STRING: |
83ebb7f1 | 300 | ir_fc = ctf_field_class_string_to_ir(ctx, (void *) fc); |
44c440bc | 301 | break; |
864cad70 | 302 | case CTF_FIELD_CLASS_TYPE_STRUCT: |
83ebb7f1 | 303 | ir_fc = ctf_field_class_struct_to_ir(ctx, (void *) fc); |
44c440bc | 304 | break; |
864cad70 | 305 | case CTF_FIELD_CLASS_TYPE_ARRAY: |
83ebb7f1 | 306 | ir_fc = ctf_field_class_array_to_ir(ctx, (void *) fc); |
44c440bc | 307 | break; |
864cad70 | 308 | case CTF_FIELD_CLASS_TYPE_SEQUENCE: |
83ebb7f1 | 309 | ir_fc = ctf_field_class_sequence_to_ir(ctx, (void *) fc); |
44c440bc | 310 | break; |
864cad70 | 311 | case CTF_FIELD_CLASS_TYPE_VARIANT: |
83ebb7f1 | 312 | ir_fc = ctf_field_class_variant_to_ir(ctx, (void *) fc); |
44c440bc PP |
313 | break; |
314 | default: | |
315 | abort(); | |
316 | } | |
317 | ||
5cd6d0e5 PP |
318 | fc->ir_fc = ir_fc; |
319 | return ir_fc; | |
44c440bc PP |
320 | } |
321 | ||
322 | static inline | |
5cd6d0e5 PP |
323 | bool ctf_field_class_struct_has_immediate_member_in_ir( |
324 | struct ctf_field_class_struct *fc) | |
44c440bc PP |
325 | { |
326 | uint64_t i; | |
327 | bool has_immediate_member_in_ir = false; | |
328 | ||
5cd6d0e5 PP |
329 | for (i = 0; i < fc->members->len; i++) { |
330 | struct ctf_named_field_class *named_fc = | |
331 | ctf_field_class_struct_borrow_member_by_index(fc, i); | |
44c440bc | 332 | |
5cd6d0e5 | 333 | if (named_fc->fc->in_ir) { |
44c440bc PP |
334 | has_immediate_member_in_ir = true; |
335 | goto end; | |
336 | } | |
337 | } | |
338 | ||
339 | end: | |
340 | return has_immediate_member_in_ir; | |
341 | } | |
342 | ||
343 | static inline | |
83ebb7f1 | 344 | bt_field_class *scope_ctf_field_class_to_ir(struct ctx *ctx) |
44c440bc | 345 | { |
b19ff26f | 346 | bt_field_class *ir_fc = NULL; |
83ebb7f1 | 347 | struct ctf_field_class *fc = NULL; |
44c440bc | 348 | |
83ebb7f1 PP |
349 | switch (ctx->scope) { |
350 | case CTF_SCOPE_PACKET_CONTEXT: | |
351 | fc = ctx->sc->packet_context_fc; | |
352 | break; | |
353 | case CTF_SCOPE_EVENT_COMMON_CONTEXT: | |
354 | fc = ctx->sc->event_common_context_fc; | |
355 | break; | |
356 | case CTF_SCOPE_EVENT_SPECIFIC_CONTEXT: | |
357 | fc = ctx->ec->spec_context_fc; | |
358 | break; | |
359 | case CTF_SCOPE_EVENT_PAYLOAD: | |
360 | fc = ctx->ec->payload_fc; | |
361 | break; | |
362 | default: | |
363 | abort(); | |
44c440bc PP |
364 | } |
365 | ||
83ebb7f1 PP |
366 | if (fc && ctf_field_class_struct_has_immediate_member_in_ir( |
367 | (void *) fc)) { | |
368 | ir_fc = ctf_field_class_to_ir(ctx, fc); | |
44c440bc PP |
369 | } |
370 | ||
5cd6d0e5 | 371 | return ir_fc; |
44c440bc PP |
372 | } |
373 | ||
374 | static inline | |
5cd6d0e5 PP |
375 | struct ctf_field_class_int *borrow_named_int_field_class( |
376 | struct ctf_field_class_struct *struct_fc, const char *name) | |
44c440bc | 377 | { |
5cd6d0e5 PP |
378 | struct ctf_named_field_class *named_fc = NULL; |
379 | struct ctf_field_class_int *int_fc = NULL; | |
44c440bc | 380 | |
5cd6d0e5 | 381 | if (!struct_fc) { |
44c440bc PP |
382 | goto end; |
383 | } | |
384 | ||
5cd6d0e5 PP |
385 | named_fc = ctf_field_class_struct_borrow_member_by_name(struct_fc, name); |
386 | if (!named_fc) { | |
44c440bc PP |
387 | goto end; |
388 | } | |
389 | ||
864cad70 PP |
390 | if (named_fc->fc->type != CTF_FIELD_CLASS_TYPE_INT && |
391 | named_fc->fc->type != CTF_FIELD_CLASS_TYPE_ENUM) { | |
44c440bc PP |
392 | goto end; |
393 | } | |
394 | ||
5cd6d0e5 | 395 | int_fc = (void *) named_fc->fc; |
44c440bc PP |
396 | |
397 | end: | |
5cd6d0e5 | 398 | return int_fc; |
44c440bc PP |
399 | } |
400 | ||
401 | static inline | |
83ebb7f1 | 402 | void ctf_event_class_to_ir(struct ctx *ctx) |
44c440bc PP |
403 | { |
404 | int ret; | |
b19ff26f | 405 | bt_event_class *ir_ec = NULL; |
83ebb7f1 | 406 | bt_field_class *ir_fc; |
44c440bc | 407 | |
83ebb7f1 PP |
408 | BT_ASSERT(ctx->ec); |
409 | ||
410 | if (ctx->ec->is_translated) { | |
40f4ba76 | 411 | ir_ec = bt_stream_class_borrow_event_class_by_id( |
83ebb7f1 | 412 | ctx->ir_sc, ctx->ec->id); |
44c440bc PP |
413 | BT_ASSERT(ir_ec); |
414 | goto end; | |
415 | } | |
416 | ||
83ebb7f1 | 417 | ir_ec = bt_event_class_create_with_id(ctx->ir_sc, ctx->ec->id); |
44c440bc | 418 | BT_ASSERT(ir_ec); |
c5b9b441 | 419 | bt_event_class_put_ref(ir_ec); |
83ebb7f1 PP |
420 | ctx->scope = CTF_SCOPE_EVENT_SPECIFIC_CONTEXT; |
421 | ir_fc = scope_ctf_field_class_to_ir(ctx); | |
422 | if (ir_fc) { | |
423 | ret = bt_event_class_set_specific_context_field_class( | |
424 | ir_ec, ir_fc); | |
425 | BT_ASSERT(ret == 0); | |
426 | bt_field_class_put_ref(ir_fc); | |
44c440bc PP |
427 | } |
428 | ||
83ebb7f1 PP |
429 | ctx->scope = CTF_SCOPE_EVENT_PAYLOAD; |
430 | ir_fc = scope_ctf_field_class_to_ir(ctx); | |
431 | if (ir_fc) { | |
432 | ret = bt_event_class_set_payload_field_class(ir_ec, | |
433 | ir_fc); | |
434 | BT_ASSERT(ret == 0); | |
435 | bt_field_class_put_ref(ir_fc); | |
44c440bc PP |
436 | } |
437 | ||
83ebb7f1 PP |
438 | if (ctx->ec->name->len > 0) { |
439 | ret = bt_event_class_set_name(ir_ec, ctx->ec->name->str); | |
44c440bc PP |
440 | BT_ASSERT(ret == 0); |
441 | } | |
442 | ||
83ebb7f1 PP |
443 | if (ctx->ec->emf_uri->len > 0) { |
444 | ret = bt_event_class_set_emf_uri(ir_ec, ctx->ec->emf_uri->str); | |
44c440bc PP |
445 | BT_ASSERT(ret == 0); |
446 | } | |
447 | ||
83ebb7f1 PP |
448 | if (ctx->ec->log_level != -1) { |
449 | bt_event_class_set_log_level(ir_ec, ctx->ec->log_level); | |
44c440bc PP |
450 | } |
451 | ||
83ebb7f1 PP |
452 | ctx->ec->is_translated = true; |
453 | ctx->ec->ir_ec = ir_ec; | |
44c440bc PP |
454 | |
455 | end: | |
83ebb7f1 | 456 | return; |
44c440bc PP |
457 | } |
458 | ||
459 | ||
460 | static inline | |
83ebb7f1 | 461 | void ctf_stream_class_to_ir(struct ctx *ctx) |
44c440bc PP |
462 | { |
463 | int ret; | |
83ebb7f1 | 464 | bt_field_class *ir_fc; |
44c440bc | 465 | |
83ebb7f1 | 466 | BT_ASSERT(ctx->sc); |
44c440bc | 467 | |
83ebb7f1 PP |
468 | if (ctx->sc->is_translated) { |
469 | ctx->ir_sc = bt_trace_class_borrow_stream_class_by_id( | |
470 | ctx->ir_tc, ctx->sc->id); | |
471 | BT_ASSERT(ctx->ir_sc); | |
472 | goto end; | |
44c440bc PP |
473 | } |
474 | ||
83ebb7f1 PP |
475 | ctx->ir_sc = bt_stream_class_create_with_id(ctx->ir_tc, ctx->sc->id); |
476 | BT_ASSERT(ctx->ir_sc); | |
477 | bt_stream_class_put_ref(ctx->ir_sc); | |
478 | ctx->scope = CTF_SCOPE_PACKET_CONTEXT; | |
479 | ir_fc = scope_ctf_field_class_to_ir(ctx); | |
480 | if (ir_fc) { | |
481 | ret = bt_stream_class_set_packet_context_field_class( | |
482 | ctx->ir_sc, ir_fc); | |
483 | BT_ASSERT(ret == 0); | |
484 | bt_field_class_put_ref(ir_fc); | |
44c440bc PP |
485 | } |
486 | ||
83ebb7f1 PP |
487 | ctx->scope = CTF_SCOPE_EVENT_COMMON_CONTEXT; |
488 | ir_fc = scope_ctf_field_class_to_ir(ctx); | |
489 | if (ir_fc) { | |
490 | ret = bt_stream_class_set_event_common_context_field_class( | |
491 | ctx->ir_sc, ir_fc); | |
492 | BT_ASSERT(ret == 0); | |
493 | bt_field_class_put_ref(ir_fc); | |
44c440bc PP |
494 | } |
495 | ||
83ebb7f1 | 496 | bt_stream_class_set_assigns_automatic_event_class_id(ctx->ir_sc, |
44c440bc | 497 | BT_FALSE); |
83ebb7f1 | 498 | bt_stream_class_set_assigns_automatic_stream_id(ctx->ir_sc, BT_FALSE); |
44c440bc | 499 | |
83ebb7f1 PP |
500 | if (ctx->sc->default_clock_class) { |
501 | BT_ASSERT(ctx->sc->default_clock_class->ir_cc); | |
502 | ret = bt_stream_class_set_default_clock_class(ctx->ir_sc, | |
503 | ctx->sc->default_clock_class->ir_cc); | |
44c440bc PP |
504 | BT_ASSERT(ret == 0); |
505 | } | |
506 | ||
83ebb7f1 PP |
507 | ctx->sc->is_translated = true; |
508 | ctx->sc->ir_sc = ctx->ir_sc; | |
44c440bc PP |
509 | |
510 | end: | |
83ebb7f1 | 511 | return; |
44c440bc PP |
512 | } |
513 | ||
514 | static inline | |
0f2d58c9 PP |
515 | void ctf_clock_class_to_ir(bt_clock_class *ir_cc, struct ctf_clock_class *cc) |
516 | { | |
517 | int ret; | |
518 | ||
519 | if (strlen(cc->name->str) > 0) { | |
520 | ret = bt_clock_class_set_name(ir_cc, cc->name->str); | |
521 | BT_ASSERT(ret == 0); | |
522 | } | |
523 | ||
524 | if (strlen(cc->description->str) > 0) { | |
525 | ret = bt_clock_class_set_description(ir_cc, cc->description->str); | |
526 | BT_ASSERT(ret == 0); | |
527 | } | |
528 | ||
529 | bt_clock_class_set_frequency(ir_cc, cc->frequency); | |
530 | bt_clock_class_set_precision(ir_cc, cc->precision); | |
531 | bt_clock_class_set_offset(ir_cc, cc->offset_seconds, cc->offset_cycles); | |
532 | ||
533 | if (cc->has_uuid) { | |
534 | bt_clock_class_set_uuid(ir_cc, cc->uuid); | |
535 | } | |
536 | ||
5552377a | 537 | bt_clock_class_set_origin_is_unix_epoch(ir_cc, cc->is_absolute); |
0f2d58c9 PP |
538 | } |
539 | ||
540 | static inline | |
83ebb7f1 | 541 | int ctf_trace_class_to_ir(struct ctx *ctx) |
44c440bc PP |
542 | { |
543 | int ret = 0; | |
544 | uint64_t i; | |
545 | ||
83ebb7f1 PP |
546 | BT_ASSERT(ctx->tc); |
547 | BT_ASSERT(ctx->ir_tc); | |
44c440bc | 548 | |
83ebb7f1 PP |
549 | if (ctx->tc->is_translated) { |
550 | goto end; | |
44c440bc PP |
551 | } |
552 | ||
83ebb7f1 PP |
553 | if (ctx->tc->is_uuid_set) { |
554 | bt_trace_class_set_uuid(ctx->ir_tc, ctx->tc->uuid); | |
44c440bc PP |
555 | } |
556 | ||
83ebb7f1 | 557 | for (i = 0; i < ctx->tc->env_entries->len; i++) { |
44c440bc | 558 | struct ctf_trace_class_env_entry *env_entry = |
83ebb7f1 | 559 | ctf_trace_class_borrow_env_entry_by_index(ctx->tc, i); |
44c440bc PP |
560 | |
561 | switch (env_entry->type) { | |
562 | case CTF_TRACE_CLASS_ENV_ENTRY_TYPE_INT: | |
862ca4ed | 563 | ret = bt_trace_class_set_environment_entry_integer( |
83ebb7f1 | 564 | ctx->ir_tc, env_entry->name->str, |
44c440bc PP |
565 | env_entry->value.i); |
566 | break; | |
567 | case CTF_TRACE_CLASS_ENV_ENTRY_TYPE_STR: | |
862ca4ed | 568 | ret = bt_trace_class_set_environment_entry_string( |
83ebb7f1 | 569 | ctx->ir_tc, env_entry->name->str, |
44c440bc PP |
570 | env_entry->value.str->str); |
571 | break; | |
572 | default: | |
573 | abort(); | |
574 | } | |
575 | ||
576 | if (ret) { | |
577 | goto end; | |
578 | } | |
579 | } | |
580 | ||
83ebb7f1 PP |
581 | for (i = 0; i < ctx->tc->clock_classes->len; i++) { |
582 | struct ctf_clock_class *cc = ctx->tc->clock_classes->pdata[i]; | |
0f2d58c9 | 583 | |
7fcdb0a9 FD |
584 | cc->ir_cc = bt_clock_class_create( |
585 | bt_self_component_source_as_self_component( | |
586 | ctx->self_comp)); | |
0f2d58c9 PP |
587 | ctf_clock_class_to_ir(cc->ir_cc, cc); |
588 | } | |
589 | ||
83ebb7f1 | 590 | bt_trace_class_set_assigns_automatic_stream_class_id(ctx->ir_tc, |
44c440bc | 591 | BT_FALSE); |
83ebb7f1 PP |
592 | ctx->tc->is_translated = true; |
593 | ctx->tc->ir_tc = ctx->ir_tc; | |
44c440bc PP |
594 | |
595 | end: | |
596 | return ret; | |
597 | } | |
598 | ||
599 | BT_HIDDEN | |
7fcdb0a9 FD |
600 | int ctf_trace_class_translate(bt_self_component_source *self_comp, |
601 | bt_trace_class *ir_tc, struct ctf_trace_class *tc) | |
44c440bc PP |
602 | { |
603 | int ret = 0; | |
604 | uint64_t i; | |
83ebb7f1 | 605 | struct ctx ctx = { 0 }; |
44c440bc | 606 | |
7fcdb0a9 | 607 | ctx.self_comp = self_comp; |
83ebb7f1 PP |
608 | ctx.tc = tc; |
609 | ctx.ir_tc = ir_tc; | |
610 | ret = ctf_trace_class_to_ir(&ctx); | |
44c440bc PP |
611 | if (ret) { |
612 | goto end; | |
613 | } | |
614 | ||
615 | for (i = 0; i < tc->stream_classes->len; i++) { | |
616 | uint64_t j; | |
83ebb7f1 | 617 | ctx.sc = tc->stream_classes->pdata[i]; |
44c440bc | 618 | |
83ebb7f1 | 619 | ctf_stream_class_to_ir(&ctx); |
44c440bc | 620 | |
83ebb7f1 PP |
621 | for (j = 0; j < ctx.sc->event_classes->len; j++) { |
622 | ctx.ec = ctx.sc->event_classes->pdata[j]; | |
44c440bc | 623 | |
83ebb7f1 PP |
624 | ctf_event_class_to_ir(&ctx); |
625 | ctx.ec = NULL; | |
44c440bc | 626 | } |
83ebb7f1 PP |
627 | |
628 | ctx.sc = NULL; | |
44c440bc PP |
629 | } |
630 | ||
631 | end: | |
632 | return ret; | |
633 | } |