2 * SPDX-License-Identifier: LGPL-2.1-only
4 * Copyright (C) 2016 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
6 * UST dynamic type implementation.
15 #include <ust-helper.h>
16 #include <ust-dynamic-type.h>
18 #define ctf_enum_value(_string, _value) \
21 .signedness = lttng_is_signed_type(__typeof__(_value)), \
22 .value = lttng_is_signed_type(__typeof__(_value)) ? \
23 (long long) (_value) : (_value), \
26 .signedness = lttng_is_signed_type(__typeof__(_value)), \
27 .value = lttng_is_signed_type(__typeof__(_value)) ? \
28 (long long) (_value) : (_value), \
30 .string = (_string), \
33 static const struct lttng_enum_entry dt_enum
[_NR_LTTNG_UST_DYNAMIC_TYPES
] = {
34 [LTTNG_UST_DYNAMIC_TYPE_NONE
] = ctf_enum_value("_none", 0)
35 [LTTNG_UST_DYNAMIC_TYPE_S8
] = ctf_enum_value("_int8", 1)
36 [LTTNG_UST_DYNAMIC_TYPE_S16
] = ctf_enum_value("_int16", 2)
37 [LTTNG_UST_DYNAMIC_TYPE_S32
] = ctf_enum_value("_int32", 3)
38 [LTTNG_UST_DYNAMIC_TYPE_S64
] = ctf_enum_value("_int64", 4)
39 [LTTNG_UST_DYNAMIC_TYPE_U8
] = ctf_enum_value("_uint8", 5)
40 [LTTNG_UST_DYNAMIC_TYPE_U16
] = ctf_enum_value("_uint16", 6)
41 [LTTNG_UST_DYNAMIC_TYPE_U32
] = ctf_enum_value("_uint32", 7)
42 [LTTNG_UST_DYNAMIC_TYPE_U64
] = ctf_enum_value("_uint64", 8)
43 [LTTNG_UST_DYNAMIC_TYPE_FLOAT
] = ctf_enum_value("_float", 9)
44 [LTTNG_UST_DYNAMIC_TYPE_DOUBLE
] = ctf_enum_value("_double", 10)
45 [LTTNG_UST_DYNAMIC_TYPE_STRING
] = ctf_enum_value("_string", 11)
48 static const struct lttng_enum_desc dt_enum_desc
= {
49 .name
= "dynamic_type_enum",
51 .nr_entries
= LTTNG_ARRAY_SIZE(dt_enum
),
54 const struct lttng_ust_event_field
*dt_var_fields
[_NR_LTTNG_UST_DYNAMIC_TYPES
] = {
55 [LTTNG_UST_DYNAMIC_TYPE_NONE
] = __LTTNG_COMPOUND_LITERAL(struct lttng_ust_event_field
, {
56 .struct_size
= sizeof(struct lttng_ust_event_field
),
59 .atype
= atype_struct_nestable
,
60 .u
.struct_nestable
.nr_fields
= 0, /* empty struct. */
61 .u
.struct_nestable
.alignment
= 0,
65 [LTTNG_UST_DYNAMIC_TYPE_S8
] = __LTTNG_COMPOUND_LITERAL(struct lttng_ust_event_field
, {
66 .struct_size
= sizeof(struct lttng_ust_event_field
),
68 .type
= __type_integer(int8_t, BYTE_ORDER
, 10, none
),
71 [LTTNG_UST_DYNAMIC_TYPE_S16
] = __LTTNG_COMPOUND_LITERAL(struct lttng_ust_event_field
, {
72 .struct_size
= sizeof(struct lttng_ust_event_field
),
74 .type
= __type_integer(int16_t, BYTE_ORDER
, 10, none
),
77 [LTTNG_UST_DYNAMIC_TYPE_S32
] = __LTTNG_COMPOUND_LITERAL(struct lttng_ust_event_field
, {
78 .struct_size
= sizeof(struct lttng_ust_event_field
),
80 .type
= __type_integer(int32_t, BYTE_ORDER
, 10, none
),
83 [LTTNG_UST_DYNAMIC_TYPE_S64
] = __LTTNG_COMPOUND_LITERAL(struct lttng_ust_event_field
, {
84 .struct_size
= sizeof(struct lttng_ust_event_field
),
86 .type
= __type_integer(int64_t, BYTE_ORDER
, 10, none
),
89 [LTTNG_UST_DYNAMIC_TYPE_U8
] = __LTTNG_COMPOUND_LITERAL(struct lttng_ust_event_field
, {
90 .struct_size
= sizeof(struct lttng_ust_event_field
),
92 .type
= __type_integer(uint8_t, BYTE_ORDER
, 10, none
),
95 [LTTNG_UST_DYNAMIC_TYPE_U16
] = __LTTNG_COMPOUND_LITERAL(struct lttng_ust_event_field
, {
96 .struct_size
= sizeof(struct lttng_ust_event_field
),
98 .type
= __type_integer(uint16_t, BYTE_ORDER
, 10, none
),
101 [LTTNG_UST_DYNAMIC_TYPE_U32
] = __LTTNG_COMPOUND_LITERAL(struct lttng_ust_event_field
, {
102 .struct_size
= sizeof(struct lttng_ust_event_field
),
104 .type
= __type_integer(uint32_t, BYTE_ORDER
, 10, none
),
107 [LTTNG_UST_DYNAMIC_TYPE_U64
] = __LTTNG_COMPOUND_LITERAL(struct lttng_ust_event_field
, {
108 .struct_size
= sizeof(struct lttng_ust_event_field
),
110 .type
= __type_integer(uint64_t, BYTE_ORDER
, 10, none
),
113 [LTTNG_UST_DYNAMIC_TYPE_FLOAT
] = __LTTNG_COMPOUND_LITERAL(struct lttng_ust_event_field
, {
114 .struct_size
= sizeof(struct lttng_ust_event_field
),
116 .type
= __type_float(float),
119 [LTTNG_UST_DYNAMIC_TYPE_DOUBLE
] = __LTTNG_COMPOUND_LITERAL(struct lttng_ust_event_field
, {
120 .struct_size
= sizeof(struct lttng_ust_event_field
),
122 .type
= __type_float(double),
125 [LTTNG_UST_DYNAMIC_TYPE_STRING
] = __LTTNG_COMPOUND_LITERAL(struct lttng_ust_event_field
, {
126 .struct_size
= sizeof(struct lttng_ust_event_field
),
129 .atype
= atype_string
,
130 .u
.string
.encoding
= lttng_encode_UTF8
,
136 static const struct lttng_ust_event_field dt_enum_field
= {
138 .type
.atype
= atype_enum_nestable
,
139 .type
.u
.enum_nestable
.desc
= &dt_enum_desc
,
140 .type
.u
.enum_nestable
.container_type
=
141 __LTTNG_COMPOUND_LITERAL(struct lttng_type
,
142 __type_integer(char, BYTE_ORDER
, 10, none
)),
146 const struct lttng_ust_event_field
*lttng_ust_dynamic_type_field(int64_t value
)
148 if (value
>= _NR_LTTNG_UST_DYNAMIC_TYPES
|| value
< 0)
150 return dt_var_fields
[value
];
153 int lttng_ust_dynamic_type_choices(size_t *nr_choices
, const struct lttng_ust_event_field
***choices
)
155 *nr_choices
= _NR_LTTNG_UST_DYNAMIC_TYPES
;
156 *choices
= dt_var_fields
;
160 const struct lttng_ust_event_field
*lttng_ust_dynamic_type_tag_field(void)
162 return &dt_enum_field
;