From 4d5fc30304d176a881b8cf5b15969326c885a907 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Fri, 13 May 2011 20:29:35 -0400 Subject: [PATCH 1/1] Integer base update - Test and fix base2 binary formatting. - Use base16 (hex) printout for pointers if the integer does not specify any specific base. Signed-off-by: Mathieu Desnoyers --- formats/ctf-text/types/integer.c | 54 +++++++++++++------ .../metadata/ctf-visitor-generate-io-struct.c | 9 +++- tests/ctf-traces/fail/fail1/metadata | 2 +- 3 files changed, 48 insertions(+), 17 deletions(-) diff --git a/formats/ctf-text/types/integer.c b/formats/ctf-text/types/integer.c index a0128458..34a899dd 100644 --- a/formats/ctf-text/types/integer.c +++ b/formats/ctf-text/types/integer.c @@ -20,6 +20,7 @@ #include #include #include +#include int ctf_text_integer_write(struct stream_pos *ppos, struct definition *definition) { @@ -40,37 +41,60 @@ int ctf_text_integer_write(struct stream_pos *ppos, struct definition *definitio g_quark_to_string(definition->name)); switch (integer_declaration->base) { + case 0: /* default */ + case 10: + if (!integer_declaration->signedness) { + fprintf(pos->fp, "%" PRIu64, + integer_definition->value._unsigned); + } else { + fprintf(pos->fp, "%" PRId64, + integer_definition->value._signed); + } + break; case 2: { int bitnr; - uint64_t v = integer_definition->value._unsigned; + uint64_t v; + + if (!integer_declaration->signedness) + v = integer_definition->value._unsigned; + else + v = (uint64_t) integer_definition->value._signed; fprintf(pos->fp, "b"); - for (bitnr = 0; bitnr < integer_declaration->len; bitnr++) - v <<= 1; - for (; bitnr < sizeof(v) * CHAR_BIT; bitnr++) { - fprintf(pos->fp, "%u", ((v & 1ULL) << 63) ? 1 : 0); - v <<= 1; + v = _bt_piecewise_lshift(v, 64 - integer_declaration->len); + for (bitnr = 0; bitnr < integer_declaration->len; bitnr++) { + fprintf(pos->fp, "%u", (v & (1ULL << 63)) ? 1 : 0); + v = _bt_piecewise_lshift(v, 1); } break; } case 8: + { + uint64_t v; + + if (!integer_declaration->signedness) + v = integer_definition->value._unsigned; + else + v = (uint64_t) integer_definition->value._signed; + fprintf(pos->fp, "0%" PRIo64, integer_definition->value._unsigned); break; - case 10: - if (!integer_declaration->signedness) { - fprintf(pos->fp, "%" PRIu64, - integer_definition->value._unsigned); - } else { - fprintf(pos->fp, "%" PRId64, - integer_definition->value._signed); - } - break; + } case 16: + { + uint64_t v; + + if (!integer_declaration->signedness) + v = integer_definition->value._unsigned; + else + v = (uint64_t) integer_definition->value._signed; + fprintf(pos->fp, "0x%" PRIX64, integer_definition->value._unsigned); break; + } default: return -EINVAL; } diff --git a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c index de760ca0..7688f5f1 100644 --- a/formats/ctf/metadata/ctf-visitor-generate-io-struct.c +++ b/formats/ctf/metadata/ctf-visitor-generate-io-struct.c @@ -313,6 +313,13 @@ struct declaration *ctf_type_declarator_visit(FILE *fd, int depth, fprintf(fd, "[error] %s: cannot find typealias \"%s\".\n", __func__, g_quark_to_string(alias_q)); return NULL; } + if (nested_declaration->id == CTF_TYPE_INTEGER) { + struct declaration_integer *integer_declaration = + container_of(nested_declaration, struct declaration_integer, p); + /* For base to 16 for pointers (expected pretty-print) */ + if (!integer_declaration->base) + integer_declaration->base = 16; + } } else { nested_declaration = ctf_type_specifier_list_visit(fd, depth, type_specifier_list, declaration_scope, trace); @@ -1069,7 +1076,7 @@ struct declaration *ctf_declaration_integer_visit(FILE *fd, int depth, int byte_order = trace->byte_order; int signedness = 0; int has_alignment = 0, has_size = 0; - int base = 10; + int base = 0; struct declaration_integer *integer_declaration; cds_list_for_each_entry(expression, expressions, siblings) { diff --git a/tests/ctf-traces/fail/fail1/metadata b/tests/ctf-traces/fail/fail1/metadata index ffdf52c5..8cd8e416 100644 --- a/tests/ctf-traces/fail/fail1/metadata +++ b/tests/ctf-traces/fail/fail1/metadata @@ -5,7 +5,7 @@ typealias integer { size = 8; align = 8; signed = false; } := uint8_t; typealias integer { size = 63; align = 1; signed = false; } := timestamp_t; typealias integer { size = 32; align = 32; signed = false; base = 10; } := uint32_t; -typealias integer { size = 32; align = 32; signed = false; base = hex; } := void *; +typealias integer { size = 32; align = 32; signed = false; } := void *; trace { -- 2.34.1