bt2: validate parameters to _TraceClass.create_stream_class before creating the nativ...
[babeltrace.git] / src / plugins / ctf / common / metadata / ctf-meta-translate.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
3fadfbc0 15#include <babeltrace2/babeltrace.h>
91d81473 16#include "common/macros.h"
578e048b 17#include "common/assert.h"
44c440bc 18#include <glib.h>
c4f23e30 19#include <stdbool.h>
44c440bc
PP
20#include <stdint.h>
21#include <string.h>
22#include <inttypes.h>
23
24#include "ctf-meta-visitors.h"
25
83ebb7f1 26struct ctx {
f7b785ac 27 bt_self_component *self_comp;
83ebb7f1
PP
28 bt_trace_class *ir_tc;
29 bt_stream_class *ir_sc;
30 struct ctf_trace_class *tc;
31 struct ctf_stream_class *sc;
32 struct ctf_event_class *ec;
33 enum ctf_scope scope;
34};
35
44c440bc 36static inline
83ebb7f1
PP
37bt_field_class *ctf_field_class_to_ir(struct ctx *ctx,
38 struct ctf_field_class *fc);
44c440bc
PP
39
40static inline
5cd6d0e5 41void ctf_field_class_int_set_props(struct ctf_field_class_int *fc,
b19ff26f 42 bt_field_class *ir_fc)
44c440bc 43{
40f4ba76 44 bt_field_class_integer_set_field_value_range(ir_fc,
e5be10ef 45 fc->base.size);
40f4ba76 46 bt_field_class_integer_set_preferred_display_base(ir_fc,
5cd6d0e5 47 fc->disp_base);
44c440bc
PP
48}
49
50static inline
83ebb7f1 51bt_field_class *ctf_field_class_int_to_ir(struct ctx *ctx,
e5be10ef 52 struct ctf_field_class_int *fc)
44c440bc 53{
b19ff26f 54 bt_field_class *ir_fc;
44c440bc 55
5cd6d0e5 56 if (fc->is_signed) {
9c08c816 57 ir_fc = bt_field_class_integer_signed_create(ctx->ir_tc);
44c440bc 58 } else {
9c08c816 59 ir_fc = bt_field_class_integer_unsigned_create(ctx->ir_tc);
44c440bc
PP
60 }
61
5cd6d0e5
PP
62 BT_ASSERT(ir_fc);
63 ctf_field_class_int_set_props(fc, ir_fc);
64 return ir_fc;
44c440bc
PP
65}
66
67static inline
83ebb7f1 68bt_field_class *ctf_field_class_enum_to_ir(struct ctx *ctx,
e5be10ef 69 struct ctf_field_class_enum *fc)
44c440bc
PP
70{
71 int ret;
b19ff26f 72 bt_field_class *ir_fc;
44c440bc
PP
73 uint64_t i;
74
5cd6d0e5 75 if (fc->base.is_signed) {
9c08c816 76 ir_fc = bt_field_class_enumeration_signed_create(ctx->ir_tc);
44c440bc 77 } else {
9c08c816 78 ir_fc = bt_field_class_enumeration_unsigned_create(ctx->ir_tc);
44c440bc
PP
79 }
80
5cd6d0e5
PP
81 BT_ASSERT(ir_fc);
82 ctf_field_class_int_set_props((void *) fc, ir_fc);
44c440bc 83
5cd6d0e5
PP
84 for (i = 0; i < fc->mappings->len; i++) {
85 struct ctf_field_class_enum_mapping *mapping =
86 ctf_field_class_enum_borrow_mapping_by_index(fc, i);
45c51519
PP
87 void *range_set;
88 uint64_t range_i;
44c440bc 89
5cd6d0e5 90 if (fc->base.is_signed) {
45c51519 91 range_set = bt_integer_range_set_signed_create();
44c440bc 92 } else {
45c51519
PP
93 range_set = bt_integer_range_set_unsigned_create();
94 }
95
96 BT_ASSERT(range_set);
97
98 for (range_i = 0; range_i < mapping->ranges->len; range_i++) {
99 struct ctf_range *range =
100 ctf_field_class_enum_mapping_borrow_range_by_index(
101 mapping, range_i);
102
103 if (fc->base.is_signed) {
104 ret = bt_integer_range_set_signed_add_range(
105 range_set, range->lower.i,
106 range->upper.i);
107 } else {
108 ret = bt_integer_range_set_unsigned_add_range(
109 range_set, range->lower.u,
110 range->upper.u);
111 }
112
113 BT_ASSERT(ret == 0);
114 }
115
116 if (fc->base.is_signed) {
9c08c816 117 ret = bt_field_class_enumeration_signed_add_mapping(
45c51519
PP
118 ir_fc, mapping->label->str, range_set);
119 BT_RANGE_SET_SIGNED_PUT_REF_AND_RESET(range_set);
120 } else {
9c08c816 121 ret = bt_field_class_enumeration_unsigned_add_mapping(
45c51519
PP
122 ir_fc, mapping->label->str, range_set);
123 BT_RANGE_SET_UNSIGNED_PUT_REF_AND_RESET(range_set);
44c440bc
PP
124 }
125
126 BT_ASSERT(ret == 0);
127 }
128
5cd6d0e5 129 return ir_fc;
44c440bc
PP
130}
131
132static inline
83ebb7f1 133bt_field_class *ctf_field_class_float_to_ir(struct ctx *ctx,
5cd6d0e5 134 struct ctf_field_class_float *fc)
44c440bc 135{
b19ff26f 136 bt_field_class *ir_fc;
44c440bc 137
5cd6d0e5 138 if (fc->base.size == 32) {
fe4df857
FD
139 ir_fc = bt_field_class_real_single_precision_create(ctx->ir_tc);
140 } else {
141 ir_fc = bt_field_class_real_double_precision_create(ctx->ir_tc);
44c440bc 142 }
fe4df857 143 BT_ASSERT(ir_fc);
44c440bc 144
5cd6d0e5 145 return ir_fc;
44c440bc
PP
146}
147
148static inline
83ebb7f1 149bt_field_class *ctf_field_class_string_to_ir(struct ctx *ctx,
5cd6d0e5 150 struct ctf_field_class_string *fc)
44c440bc 151{
83ebb7f1 152 bt_field_class *ir_fc = bt_field_class_string_create(ctx->ir_tc);
44c440bc 153
5cd6d0e5
PP
154 BT_ASSERT(ir_fc);
155 return ir_fc;
44c440bc
PP
156}
157
158static inline
83ebb7f1
PP
159void translate_struct_field_class_members(struct ctx *ctx,
160 struct ctf_field_class_struct *fc, bt_field_class *ir_fc,
161 bool with_header_prefix,
162 struct ctf_field_class_struct *context_fc)
44c440bc 163{
44c440bc 164 uint64_t i;
83ebb7f1 165 int ret;
44c440bc 166
5cd6d0e5
PP
167 for (i = 0; i < fc->members->len; i++) {
168 struct ctf_named_field_class *named_fc =
169 ctf_field_class_struct_borrow_member_by_index(fc, i);
b19ff26f 170 bt_field_class *member_ir_fc;
83ebb7f1 171 const char *name = named_fc->name->str;
44c440bc 172
5cd6d0e5 173 if (!named_fc->fc->in_ir) {
44c440bc
PP
174 continue;
175 }
176
83ebb7f1 177 member_ir_fc = ctf_field_class_to_ir(ctx, named_fc->fc);
5cd6d0e5 178 BT_ASSERT(member_ir_fc);
83ebb7f1
PP
179 ret = bt_field_class_structure_append_member(ir_fc, name,
180 member_ir_fc);
44c440bc 181 BT_ASSERT(ret == 0);
c5b9b441 182 bt_field_class_put_ref(member_ir_fc);
44c440bc 183 }
83ebb7f1 184}
44c440bc 185
83ebb7f1
PP
186static inline
187bt_field_class *ctf_field_class_struct_to_ir(struct ctx *ctx,
188 struct ctf_field_class_struct *fc)
189{
190 bt_field_class *ir_fc = bt_field_class_structure_create(ctx->ir_tc);
191
192 BT_ASSERT(ir_fc);
193 translate_struct_field_class_members(ctx, fc, ir_fc, false, NULL);
5cd6d0e5 194 return ir_fc;
44c440bc
PP
195}
196
197static inline
83ebb7f1
PP
198bt_field_class *borrow_ir_fc_from_field_path(struct ctx *ctx,
199 struct ctf_field_path *field_path)
44c440bc 200{
b19ff26f 201 bt_field_class *ir_fc = NULL;
5cd6d0e5 202 struct ctf_field_class *fc = ctf_field_path_borrow_field_class(
83ebb7f1 203 field_path, ctx->tc, ctx->sc, ctx->ec);
44c440bc 204
5cd6d0e5 205 BT_ASSERT(fc);
44c440bc 206
5cd6d0e5
PP
207 if (fc->in_ir) {
208 ir_fc = fc->ir_fc;
44c440bc
PP
209 }
210
5cd6d0e5 211 return ir_fc;
44c440bc
PP
212}
213
45c51519
PP
214static inline
215const void *find_ir_enum_field_class_mapping_by_label(const bt_field_class *fc,
216 const char *label, bool is_signed)
217{
218 const void *mapping = NULL;
219 uint64_t i;
220
221 for (i = 0; i < bt_field_class_enumeration_get_mapping_count(fc); i++) {
222 const bt_field_class_enumeration_mapping *this_mapping;
223 const void *spec_this_mapping;
224
225 if (is_signed) {
226 spec_this_mapping =
9c08c816 227 bt_field_class_enumeration_signed_borrow_mapping_by_index_const(
45c51519
PP
228 fc, i);
229 this_mapping =
9c08c816 230 bt_field_class_enumeration_signed_mapping_as_mapping_const(
45c51519
PP
231 spec_this_mapping);
232 } else {
233 spec_this_mapping =
9c08c816 234 bt_field_class_enumeration_unsigned_borrow_mapping_by_index_const(
45c51519
PP
235 fc, i);
236 this_mapping =
9c08c816 237 bt_field_class_enumeration_unsigned_mapping_as_mapping_const(
45c51519
PP
238 spec_this_mapping);
239 }
240
241 BT_ASSERT(this_mapping);
242 BT_ASSERT(spec_this_mapping);
243
244 if (strcmp(bt_field_class_enumeration_mapping_get_label(
245 this_mapping), label) == 0) {
246 mapping = spec_this_mapping;
247 goto end;
248 }
249 }
250
251end:
252 return mapping;
253}
254
44c440bc 255static inline
83ebb7f1
PP
256bt_field_class *ctf_field_class_variant_to_ir(struct ctx *ctx,
257 struct ctf_field_class_variant *fc)
44c440bc
PP
258{
259 int ret;
45c51519 260 bt_field_class *ir_fc;
44c440bc 261 uint64_t i;
45c51519 262 bt_field_class *ir_tag_fc = NULL;
83ebb7f1
PP
263
264 if (fc->tag_path.root != CTF_SCOPE_PACKET_HEADER &&
265 fc->tag_path.root != CTF_SCOPE_EVENT_HEADER) {
45c51519
PP
266 ir_tag_fc = borrow_ir_fc_from_field_path(ctx, &fc->tag_path);
267 BT_ASSERT(ir_tag_fc);
83ebb7f1 268 }
44c440bc 269
45c51519
PP
270 ir_fc = bt_field_class_variant_create(ctx->ir_tc, ir_tag_fc);
271 BT_ASSERT(ir_fc);
272
5cd6d0e5
PP
273 for (i = 0; i < fc->options->len; i++) {
274 struct ctf_named_field_class *named_fc =
275 ctf_field_class_variant_borrow_option_by_index(fc, i);
b19ff26f 276 bt_field_class *option_ir_fc;
44c440bc 277
5cd6d0e5 278 BT_ASSERT(named_fc->fc->in_ir);
83ebb7f1 279 option_ir_fc = ctf_field_class_to_ir(ctx, named_fc->fc);
5cd6d0e5 280 BT_ASSERT(option_ir_fc);
45c51519
PP
281
282 if (ir_tag_fc) {
283 /*
284 * At this point the trace IR selector
285 * (enumeration) field class already exists if
286 * the variant is tagged (`ir_tag_fc`). This one
287 * already contains range sets for its mappings,
288 * so we just reuse the same, finding them by
289 * matching a variant field class's option's
290 * _original_ name (with a leading underscore,
291 * possibly) with a selector field class's
292 * mapping name.
293 */
294 if (fc->tag_fc->base.is_signed) {
9c08c816 295 const bt_field_class_enumeration_signed_mapping *mapping =
45c51519
PP
296 find_ir_enum_field_class_mapping_by_label(
297 ir_tag_fc,
298 named_fc->orig_name->str, true);
299 const bt_integer_range_set_signed *range_set;
300
301 BT_ASSERT(mapping);
302 range_set =
9c08c816 303 bt_field_class_enumeration_signed_mapping_borrow_ranges_const(
45c51519
PP
304 mapping);
305 BT_ASSERT(range_set);
de821fe5 306 ret = bt_field_class_variant_with_selector_field_integer_signed_append_option(
45c51519
PP
307 ir_fc, named_fc->name->str,
308 option_ir_fc, range_set);
309 } else {
9c08c816 310 const bt_field_class_enumeration_unsigned_mapping *mapping =
45c51519
PP
311 find_ir_enum_field_class_mapping_by_label(
312 ir_tag_fc,
313 named_fc->orig_name->str,
314 false);
315 const bt_integer_range_set_unsigned *range_set;
316
317 BT_ASSERT(mapping);
318 range_set =
9c08c816 319 bt_field_class_enumeration_unsigned_mapping_borrow_ranges_const(
45c51519
PP
320 mapping);
321 BT_ASSERT(range_set);
de821fe5 322 ret = bt_field_class_variant_with_selector_field_integer_unsigned_append_option(
45c51519
PP
323 ir_fc, named_fc->name->str,
324 option_ir_fc, range_set);
325 }
326 } else {
327 ret = bt_field_class_variant_without_selector_append_option(
328 ir_fc, named_fc->name->str, option_ir_fc);
329 }
330
44c440bc 331 BT_ASSERT(ret == 0);
c5b9b441 332 bt_field_class_put_ref(option_ir_fc);
44c440bc
PP
333 }
334
5cd6d0e5 335 return ir_fc;
44c440bc
PP
336}
337
338static inline
83ebb7f1
PP
339bt_field_class *ctf_field_class_array_to_ir(struct ctx *ctx,
340 struct ctf_field_class_array *fc)
44c440bc 341{
b19ff26f
PP
342 bt_field_class *ir_fc;
343 bt_field_class *elem_ir_fc;
44c440bc 344
5cd6d0e5 345 if (fc->base.is_text) {
83ebb7f1 346 ir_fc = bt_field_class_string_create(ctx->ir_tc);
5cd6d0e5 347 BT_ASSERT(ir_fc);
44c440bc
PP
348 goto end;
349 }
350
83ebb7f1 351 elem_ir_fc = ctf_field_class_to_ir(ctx, fc->base.elem_fc);
5cd6d0e5 352 BT_ASSERT(elem_ir_fc);
9c08c816 353 ir_fc = bt_field_class_array_static_create(ctx->ir_tc, elem_ir_fc,
e5be10ef 354 fc->length);
5cd6d0e5 355 BT_ASSERT(ir_fc);
c5b9b441 356 bt_field_class_put_ref(elem_ir_fc);
44c440bc
PP
357
358end:
5cd6d0e5 359 return ir_fc;
44c440bc
PP
360}
361
362static inline
83ebb7f1
PP
363bt_field_class *ctf_field_class_sequence_to_ir(struct ctx *ctx,
364 struct ctf_field_class_sequence *fc)
44c440bc 365{
b19ff26f
PP
366 bt_field_class *ir_fc;
367 bt_field_class *elem_ir_fc;
1367bc7c 368 bt_field_class *length_fc = NULL;
44c440bc 369
5cd6d0e5 370 if (fc->base.is_text) {
83ebb7f1 371 ir_fc = bt_field_class_string_create(ctx->ir_tc);
5cd6d0e5 372 BT_ASSERT(ir_fc);
44c440bc
PP
373 goto end;
374 }
375
83ebb7f1 376 elem_ir_fc = ctf_field_class_to_ir(ctx, fc->base.elem_fc);
5cd6d0e5 377 BT_ASSERT(elem_ir_fc);
83ebb7f1
PP
378
379 if (fc->length_path.root != CTF_SCOPE_PACKET_HEADER &&
380 fc->length_path.root != CTF_SCOPE_EVENT_HEADER) {
1367bc7c
PP
381 length_fc = borrow_ir_fc_from_field_path(ctx, &fc->length_path);
382 BT_ASSERT(length_fc);
83ebb7f1 383 }
44c440bc 384
9c08c816 385 ir_fc = bt_field_class_array_dynamic_create(ctx->ir_tc, elem_ir_fc,
1367bc7c
PP
386 length_fc);
387 BT_ASSERT(ir_fc);
388 bt_field_class_put_ref(elem_ir_fc);
389 BT_ASSERT(ir_fc);
390
44c440bc 391end:
5cd6d0e5 392 return ir_fc;
44c440bc
PP
393}
394
395static inline
83ebb7f1
PP
396bt_field_class *ctf_field_class_to_ir(struct ctx *ctx,
397 struct ctf_field_class *fc)
44c440bc 398{
b19ff26f 399 bt_field_class *ir_fc = NULL;
44c440bc 400
5cd6d0e5
PP
401 BT_ASSERT(fc);
402 BT_ASSERT(fc->in_ir);
44c440bc 403
864cad70
PP
404 switch (fc->type) {
405 case CTF_FIELD_CLASS_TYPE_INT:
83ebb7f1 406 ir_fc = ctf_field_class_int_to_ir(ctx, (void *) fc);
44c440bc 407 break;
864cad70 408 case CTF_FIELD_CLASS_TYPE_ENUM:
83ebb7f1 409 ir_fc = ctf_field_class_enum_to_ir(ctx, (void *) fc);
44c440bc 410 break;
864cad70 411 case CTF_FIELD_CLASS_TYPE_FLOAT:
83ebb7f1 412 ir_fc = ctf_field_class_float_to_ir(ctx, (void *) fc);
44c440bc 413 break;
864cad70 414 case CTF_FIELD_CLASS_TYPE_STRING:
83ebb7f1 415 ir_fc = ctf_field_class_string_to_ir(ctx, (void *) fc);
44c440bc 416 break;
864cad70 417 case CTF_FIELD_CLASS_TYPE_STRUCT:
83ebb7f1 418 ir_fc = ctf_field_class_struct_to_ir(ctx, (void *) fc);
44c440bc 419 break;
864cad70 420 case CTF_FIELD_CLASS_TYPE_ARRAY:
83ebb7f1 421 ir_fc = ctf_field_class_array_to_ir(ctx, (void *) fc);
44c440bc 422 break;
864cad70 423 case CTF_FIELD_CLASS_TYPE_SEQUENCE:
83ebb7f1 424 ir_fc = ctf_field_class_sequence_to_ir(ctx, (void *) fc);
44c440bc 425 break;
864cad70 426 case CTF_FIELD_CLASS_TYPE_VARIANT:
83ebb7f1 427 ir_fc = ctf_field_class_variant_to_ir(ctx, (void *) fc);
44c440bc
PP
428 break;
429 default:
430 abort();
431 }
432
5cd6d0e5
PP
433 fc->ir_fc = ir_fc;
434 return ir_fc;
44c440bc
PP
435}
436
437static inline
5cd6d0e5
PP
438bool ctf_field_class_struct_has_immediate_member_in_ir(
439 struct ctf_field_class_struct *fc)
44c440bc
PP
440{
441 uint64_t i;
442 bool has_immediate_member_in_ir = false;
443
b2c863b0
PP
444 /*
445 * If the structure field class has no members at all, then it
446 * was an empty structure in the beginning, so leave it existing
447 * and empty.
448 */
449 if (fc->members->len == 0) {
450 has_immediate_member_in_ir = true;
451 goto end;
452 }
453
5cd6d0e5
PP
454 for (i = 0; i < fc->members->len; i++) {
455 struct ctf_named_field_class *named_fc =
456 ctf_field_class_struct_borrow_member_by_index(fc, i);
44c440bc 457
5cd6d0e5 458 if (named_fc->fc->in_ir) {
44c440bc
PP
459 has_immediate_member_in_ir = true;
460 goto end;
461 }
462 }
463
464end:
465 return has_immediate_member_in_ir;
466}
467
468static inline
83ebb7f1 469bt_field_class *scope_ctf_field_class_to_ir(struct ctx *ctx)
44c440bc 470{
b19ff26f 471 bt_field_class *ir_fc = NULL;
83ebb7f1 472 struct ctf_field_class *fc = NULL;
44c440bc 473
83ebb7f1
PP
474 switch (ctx->scope) {
475 case CTF_SCOPE_PACKET_CONTEXT:
476 fc = ctx->sc->packet_context_fc;
477 break;
478 case CTF_SCOPE_EVENT_COMMON_CONTEXT:
479 fc = ctx->sc->event_common_context_fc;
480 break;
481 case CTF_SCOPE_EVENT_SPECIFIC_CONTEXT:
482 fc = ctx->ec->spec_context_fc;
483 break;
484 case CTF_SCOPE_EVENT_PAYLOAD:
485 fc = ctx->ec->payload_fc;
486 break;
487 default:
488 abort();
44c440bc
PP
489 }
490
83ebb7f1
PP
491 if (fc && ctf_field_class_struct_has_immediate_member_in_ir(
492 (void *) fc)) {
493 ir_fc = ctf_field_class_to_ir(ctx, fc);
44c440bc
PP
494 }
495
5cd6d0e5 496 return ir_fc;
44c440bc
PP
497}
498
44c440bc 499static inline
83ebb7f1 500void ctf_event_class_to_ir(struct ctx *ctx)
44c440bc
PP
501{
502 int ret;
b19ff26f 503 bt_event_class *ir_ec = NULL;
83ebb7f1 504 bt_field_class *ir_fc;
44c440bc 505
83ebb7f1
PP
506 BT_ASSERT(ctx->ec);
507
508 if (ctx->ec->is_translated) {
40f4ba76 509 ir_ec = bt_stream_class_borrow_event_class_by_id(
83ebb7f1 510 ctx->ir_sc, ctx->ec->id);
44c440bc
PP
511 BT_ASSERT(ir_ec);
512 goto end;
513 }
514
83ebb7f1 515 ir_ec = bt_event_class_create_with_id(ctx->ir_sc, ctx->ec->id);
44c440bc 516 BT_ASSERT(ir_ec);
c5b9b441 517 bt_event_class_put_ref(ir_ec);
83ebb7f1
PP
518 ctx->scope = CTF_SCOPE_EVENT_SPECIFIC_CONTEXT;
519 ir_fc = scope_ctf_field_class_to_ir(ctx);
520 if (ir_fc) {
521 ret = bt_event_class_set_specific_context_field_class(
522 ir_ec, ir_fc);
523 BT_ASSERT(ret == 0);
524 bt_field_class_put_ref(ir_fc);
44c440bc
PP
525 }
526
83ebb7f1
PP
527 ctx->scope = CTF_SCOPE_EVENT_PAYLOAD;
528 ir_fc = scope_ctf_field_class_to_ir(ctx);
529 if (ir_fc) {
530 ret = bt_event_class_set_payload_field_class(ir_ec,
531 ir_fc);
532 BT_ASSERT(ret == 0);
533 bt_field_class_put_ref(ir_fc);
44c440bc
PP
534 }
535
83ebb7f1
PP
536 if (ctx->ec->name->len > 0) {
537 ret = bt_event_class_set_name(ir_ec, ctx->ec->name->str);
44c440bc
PP
538 BT_ASSERT(ret == 0);
539 }
540
83ebb7f1
PP
541 if (ctx->ec->emf_uri->len > 0) {
542 ret = bt_event_class_set_emf_uri(ir_ec, ctx->ec->emf_uri->str);
44c440bc
PP
543 BT_ASSERT(ret == 0);
544 }
545
6da709aa 546 if (ctx->ec->is_log_level_set) {
83ebb7f1 547 bt_event_class_set_log_level(ir_ec, ctx->ec->log_level);
44c440bc
PP
548 }
549
83ebb7f1
PP
550 ctx->ec->is_translated = true;
551 ctx->ec->ir_ec = ir_ec;
44c440bc
PP
552
553end:
83ebb7f1 554 return;
44c440bc
PP
555}
556
557
558static inline
83ebb7f1 559void ctf_stream_class_to_ir(struct ctx *ctx)
44c440bc
PP
560{
561 int ret;
83ebb7f1 562 bt_field_class *ir_fc;
44c440bc 563
83ebb7f1 564 BT_ASSERT(ctx->sc);
44c440bc 565
83ebb7f1
PP
566 if (ctx->sc->is_translated) {
567 ctx->ir_sc = bt_trace_class_borrow_stream_class_by_id(
568 ctx->ir_tc, ctx->sc->id);
569 BT_ASSERT(ctx->ir_sc);
570 goto end;
44c440bc
PP
571 }
572
83ebb7f1
PP
573 ctx->ir_sc = bt_stream_class_create_with_id(ctx->ir_tc, ctx->sc->id);
574 BT_ASSERT(ctx->ir_sc);
575 bt_stream_class_put_ref(ctx->ir_sc);
26fc5aed
PP
576
577 if (ctx->sc->default_clock_class) {
578 BT_ASSERT(ctx->sc->default_clock_class->ir_cc);
579 ret = bt_stream_class_set_default_clock_class(ctx->ir_sc,
580 ctx->sc->default_clock_class->ir_cc);
581 BT_ASSERT(ret == 0);
582 }
583
584 bt_stream_class_set_supports_packets(ctx->ir_sc, BT_TRUE,
585 ctx->sc->packets_have_ts_begin, ctx->sc->packets_have_ts_end);
586 bt_stream_class_set_supports_discarded_events(ctx->ir_sc,
587 ctx->sc->has_discarded_events,
588 ctx->sc->discarded_events_have_default_cs);
589 bt_stream_class_set_supports_discarded_packets(ctx->ir_sc,
590 ctx->sc->has_discarded_packets,
591 ctx->sc->discarded_packets_have_default_cs);
83ebb7f1
PP
592 ctx->scope = CTF_SCOPE_PACKET_CONTEXT;
593 ir_fc = scope_ctf_field_class_to_ir(ctx);
594 if (ir_fc) {
595 ret = bt_stream_class_set_packet_context_field_class(
596 ctx->ir_sc, ir_fc);
597 BT_ASSERT(ret == 0);
598 bt_field_class_put_ref(ir_fc);
44c440bc
PP
599 }
600
83ebb7f1
PP
601 ctx->scope = CTF_SCOPE_EVENT_COMMON_CONTEXT;
602 ir_fc = scope_ctf_field_class_to_ir(ctx);
603 if (ir_fc) {
604 ret = bt_stream_class_set_event_common_context_field_class(
605 ctx->ir_sc, ir_fc);
606 BT_ASSERT(ret == 0);
607 bt_field_class_put_ref(ir_fc);
44c440bc
PP
608 }
609
83ebb7f1 610 bt_stream_class_set_assigns_automatic_event_class_id(ctx->ir_sc,
44c440bc 611 BT_FALSE);
83ebb7f1 612 bt_stream_class_set_assigns_automatic_stream_id(ctx->ir_sc, BT_FALSE);
44c440bc 613
83ebb7f1
PP
614 ctx->sc->is_translated = true;
615 ctx->sc->ir_sc = ctx->ir_sc;
44c440bc
PP
616
617end:
83ebb7f1 618 return;
44c440bc
PP
619}
620
621static inline
0f2d58c9
PP
622void ctf_clock_class_to_ir(bt_clock_class *ir_cc, struct ctf_clock_class *cc)
623{
624 int ret;
625
626 if (strlen(cc->name->str) > 0) {
627 ret = bt_clock_class_set_name(ir_cc, cc->name->str);
628 BT_ASSERT(ret == 0);
629 }
630
631 if (strlen(cc->description->str) > 0) {
632 ret = bt_clock_class_set_description(ir_cc, cc->description->str);
633 BT_ASSERT(ret == 0);
634 }
635
636 bt_clock_class_set_frequency(ir_cc, cc->frequency);
637 bt_clock_class_set_precision(ir_cc, cc->precision);
638 bt_clock_class_set_offset(ir_cc, cc->offset_seconds, cc->offset_cycles);
639
640 if (cc->has_uuid) {
641 bt_clock_class_set_uuid(ir_cc, cc->uuid);
642 }
643
5552377a 644 bt_clock_class_set_origin_is_unix_epoch(ir_cc, cc->is_absolute);
0f2d58c9
PP
645}
646
647static inline
83ebb7f1 648int ctf_trace_class_to_ir(struct ctx *ctx)
44c440bc
PP
649{
650 int ret = 0;
651 uint64_t i;
652
83ebb7f1
PP
653 BT_ASSERT(ctx->tc);
654 BT_ASSERT(ctx->ir_tc);
44c440bc 655
83ebb7f1
PP
656 if (ctx->tc->is_translated) {
657 goto end;
44c440bc
PP
658 }
659
83ebb7f1
PP
660 for (i = 0; i < ctx->tc->clock_classes->len; i++) {
661 struct ctf_clock_class *cc = ctx->tc->clock_classes->pdata[i];
0f2d58c9 662
f7b785ac 663 cc->ir_cc = bt_clock_class_create(ctx->self_comp);
0f2d58c9
PP
664 ctf_clock_class_to_ir(cc->ir_cc, cc);
665 }
666
83ebb7f1 667 bt_trace_class_set_assigns_automatic_stream_class_id(ctx->ir_tc,
44c440bc 668 BT_FALSE);
83ebb7f1
PP
669 ctx->tc->is_translated = true;
670 ctx->tc->ir_tc = ctx->ir_tc;
44c440bc
PP
671
672end:
673 return ret;
674}
675
676BT_HIDDEN
f7b785ac 677int ctf_trace_class_translate(bt_self_component *self_comp,
7fcdb0a9 678 bt_trace_class *ir_tc, struct ctf_trace_class *tc)
44c440bc
PP
679{
680 int ret = 0;
681 uint64_t i;
83ebb7f1 682 struct ctx ctx = { 0 };
44c440bc 683
7fcdb0a9 684 ctx.self_comp = self_comp;
83ebb7f1
PP
685 ctx.tc = tc;
686 ctx.ir_tc = ir_tc;
687 ret = ctf_trace_class_to_ir(&ctx);
44c440bc
PP
688 if (ret) {
689 goto end;
690 }
691
692 for (i = 0; i < tc->stream_classes->len; i++) {
693 uint64_t j;
83ebb7f1 694 ctx.sc = tc->stream_classes->pdata[i];
44c440bc 695
83ebb7f1 696 ctf_stream_class_to_ir(&ctx);
44c440bc 697
83ebb7f1
PP
698 for (j = 0; j < ctx.sc->event_classes->len; j++) {
699 ctx.ec = ctx.sc->event_classes->pdata[j];
44c440bc 700
83ebb7f1
PP
701 ctf_event_class_to_ir(&ctx);
702 ctx.ec = NULL;
44c440bc 703 }
83ebb7f1
PP
704
705 ctx.sc = NULL;
44c440bc
PP
706 }
707
708end:
709 return ret;
710}
This page took 0.083511 seconds and 4 git commands to generate.