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