Blame liblttng-ust/lttng-ust-dynamic-type.c

Packit c04fcb
/*
Packit c04fcb
 * lttng-ust-dynamic-type.c
Packit c04fcb
 *
Packit c04fcb
 * UST dynamic type implementation.
Packit c04fcb
 *
Packit c04fcb
 * Copyright (C) 2016 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Packit c04fcb
 *
Packit c04fcb
 * This library is free software; you can redistribute it and/or
Packit c04fcb
 * modify it under the terms of the GNU Lesser General Public
Packit c04fcb
 * License as published by the Free Software Foundation; only
Packit c04fcb
 * version 2.1 of the License.
Packit c04fcb
 *
Packit c04fcb
 * This library is distributed in the hope that it will be useful,
Packit c04fcb
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit c04fcb
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Packit c04fcb
 * Lesser General Public License for more details.
Packit c04fcb
 *
Packit c04fcb
 * You should have received a copy of the GNU Lesser General Public
Packit c04fcb
 * License along with this library; if not, write to the Free Software
Packit c04fcb
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Packit c04fcb
 */
Packit c04fcb
Packit c04fcb
#define _GNU_SOURCE
Packit c04fcb
#include <stdio.h>
Packit c04fcb
#include <stdint.h>
Packit c04fcb
#include <stddef.h>
Packit c04fcb
#include <inttypes.h>
Packit c04fcb
Packit c04fcb
#include <helper.h>
Packit c04fcb
#include <lttng/ust-dynamic-type.h>
Packit c04fcb
Packit c04fcb
#define ctf_enum_value(_string, _value)					\
Packit c04fcb
	{								\
Packit c04fcb
		.start = {						\
Packit c04fcb
			.signedness = lttng_is_signed_type(__typeof__(_value)), \
Packit c04fcb
			.value = lttng_is_signed_type(__typeof__(_value)) ? \
Packit c04fcb
				(long long) (_value) : (_value),	\
Packit c04fcb
		},							\
Packit c04fcb
		.end = {						\
Packit c04fcb
			.signedness = lttng_is_signed_type(__typeof__(_value)), \
Packit c04fcb
			.value = lttng_is_signed_type(__typeof__(_value)) ? \
Packit c04fcb
				(long long) (_value) : (_value),	\
Packit c04fcb
		},							\
Packit c04fcb
		.string = (_string),					\
Packit c04fcb
	},
Packit c04fcb
Packit c04fcb
static const struct lttng_enum_entry dt_enum[_NR_LTTNG_UST_DYNAMIC_TYPES] = {
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_NONE] = ctf_enum_value("_none", 0)
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_S8] = ctf_enum_value("_int8", 1)
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_S16] = ctf_enum_value("_int16", 2)
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_S32] = ctf_enum_value("_int32", 3)
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_S64] = ctf_enum_value("_int64", 4)
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_U8] = ctf_enum_value("_uint8", 5)
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_U16] = ctf_enum_value("_uint16", 6)
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_U32] = ctf_enum_value("_uint32", 7)
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_U64] = ctf_enum_value("_uint64", 8)
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_FLOAT] = ctf_enum_value("_float", 9)
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_DOUBLE] = ctf_enum_value("_double", 10)
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_STRING] = ctf_enum_value("_string", 11)
Packit c04fcb
};
Packit c04fcb
Packit c04fcb
static const struct lttng_enum_desc dt_enum_desc = {
Packit c04fcb
	.name = "dynamic_type_enum",
Packit c04fcb
	.entries = dt_enum,
Packit c04fcb
	.nr_entries = LTTNG_ARRAY_SIZE(dt_enum),
Packit c04fcb
};
Packit c04fcb
Packit c04fcb
const struct lttng_event_field dt_var_fields[_NR_LTTNG_UST_DYNAMIC_TYPES] = {
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_NONE] = {
Packit c04fcb
		.name = "none",
Packit c04fcb
		.type = {
Packit c04fcb
			.atype = atype_struct,
Packit c04fcb
			.u._struct.nr_fields = 0,	/* empty struct. */
Packit c04fcb
		},
Packit c04fcb
		.nowrite = 0,
Packit c04fcb
	},
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_S8] = {
Packit c04fcb
		.name = "int8",
Packit c04fcb
		.type = __type_integer(int8_t, BYTE_ORDER, 10, none),
Packit c04fcb
		.nowrite = 0,
Packit c04fcb
	},
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_S16] = {
Packit c04fcb
		.name = "int16",
Packit c04fcb
		.type = __type_integer(int16_t, BYTE_ORDER, 10, none),
Packit c04fcb
		.nowrite = 0,
Packit c04fcb
	},
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_S32] = {
Packit c04fcb
		.name = "int32",
Packit c04fcb
		.type = __type_integer(int32_t, BYTE_ORDER, 10, none),
Packit c04fcb
		.nowrite = 0,
Packit c04fcb
	},
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_S64] = {
Packit c04fcb
		.name = "int64",
Packit c04fcb
		.type = __type_integer(int64_t, BYTE_ORDER, 10, none),
Packit c04fcb
		.nowrite = 0,
Packit c04fcb
	},
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_U8] = {
Packit c04fcb
		.name = "uint8",
Packit c04fcb
		.type = __type_integer(uint8_t, BYTE_ORDER, 10, none),
Packit c04fcb
		.nowrite = 0,
Packit c04fcb
	},
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_U16] = {
Packit c04fcb
		.name = "uint16",
Packit c04fcb
		.type = __type_integer(uint16_t, BYTE_ORDER, 10, none),
Packit c04fcb
		.nowrite = 0,
Packit c04fcb
	},
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_U32] = {
Packit c04fcb
		.name = "uint32",
Packit c04fcb
		.type = __type_integer(uint32_t, BYTE_ORDER, 10, none),
Packit c04fcb
		.nowrite = 0,
Packit c04fcb
	},
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_U64] = {
Packit c04fcb
		.name = "uint64",
Packit c04fcb
		.type = __type_integer(uint64_t, BYTE_ORDER, 10, none),
Packit c04fcb
		.nowrite = 0,
Packit c04fcb
	},
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_FLOAT] = {
Packit c04fcb
		.name = "float",
Packit c04fcb
		.type = __type_float(float),
Packit c04fcb
		.nowrite = 0,
Packit c04fcb
	},
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_DOUBLE] = {
Packit c04fcb
		.name = "double",
Packit c04fcb
		.type = __type_float(double),
Packit c04fcb
		.nowrite = 0,
Packit c04fcb
	},
Packit c04fcb
	[LTTNG_UST_DYNAMIC_TYPE_STRING] = {
Packit c04fcb
		.name = "string",
Packit c04fcb
		.type = {
Packit c04fcb
			.atype = atype_string,
Packit c04fcb
			.u.basic.string.encoding = lttng_encode_UTF8,
Packit c04fcb
		},
Packit c04fcb
		.nowrite = 0,
Packit c04fcb
	},
Packit c04fcb
};
Packit c04fcb
Packit c04fcb
static const struct lttng_event_field dt_enum_field = {
Packit c04fcb
	.name = NULL,
Packit c04fcb
	.type.atype = atype_enum,
Packit c04fcb
	.type.u.basic.enumeration.desc = &dt_enum_desc,
Packit c04fcb
	.type.u.basic.enumeration.container_type = {
Packit c04fcb
		.size = sizeof(char) * CHAR_BIT,
Packit c04fcb
		.alignment = lttng_alignof(char) * CHAR_BIT,
Packit c04fcb
		.signedness = lttng_is_signed_type(char),
Packit c04fcb
		.reverse_byte_order = 0,
Packit c04fcb
		.base = 10,
Packit c04fcb
		.encoding = lttng_encode_none,
Packit c04fcb
	},
Packit c04fcb
	.nowrite = 0,
Packit c04fcb
};
Packit c04fcb
Packit c04fcb
const struct lttng_event_field *lttng_ust_dynamic_type_field(int64_t value)
Packit c04fcb
{
Packit c04fcb
	if (value >= _NR_LTTNG_UST_DYNAMIC_TYPES || value < 0)
Packit c04fcb
		return NULL;
Packit c04fcb
	return &dt_var_fields[value];
Packit c04fcb
}
Packit c04fcb
Packit c04fcb
int lttng_ust_dynamic_type_choices(size_t *nr_choices, const struct lttng_event_field **choices)
Packit c04fcb
{
Packit c04fcb
	*nr_choices = _NR_LTTNG_UST_DYNAMIC_TYPES;
Packit c04fcb
	*choices = dt_var_fields;
Packit c04fcb
	return 0;
Packit c04fcb
}
Packit c04fcb
Packit c04fcb
const struct lttng_event_field *lttng_ust_dynamic_type_tag_field(void)
Packit c04fcb
{
Packit c04fcb
	return &dt_enum_field;
Packit c04fcb
}