Module Name: src Committed By: simonb Date: Wed Mar 31 06:26:27 UTC 2021
Modified Files: src/external/cddl/osnet/dist/tools/ctf/cvt: dwarf.c Log Message: Simplify the CTF float encoding type logic: all floating point types of 4 bytes or less are "float", 8 bytes or less are "double" and 16 bytes or less are "long double". Make ctfconvert much happier with N32 ABI where we have 4 byte pointers and 16 byte long doubles. Will also help ctfconvert if ever used on m68k or 32-bit RISC-V. @christos: LGTM To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 src/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c diff -u src/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c:1.25 src/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c:1.26 --- src/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c:1.25 Mon May 28 21:05:06 2018 +++ src/external/cddl/osnet/dist/tools/ctf/cvt/dwarf.c Wed Mar 31 06:26:27 2021 @@ -1419,41 +1419,53 @@ die_base_name_parse(const char *name, ch return (intr); } +/* + * Return the CTF float encoding type. The logic is all floating + * point types of 4 bytes or less are "float", 8 bytes or less are + * "double" and 16 bytes or less are "long double". Anything bigger + * will error. + */ +#define FLOAT_SIZE_SINGLE 4 +#define FLOAT_SIZE_DOUBLE 8 +#define FLOAT_SIZE_LONG_DOUBLE 16 + typedef struct fp_size_map { - size_t fsm_typesz[2]; /* size of {32,64} type */ + size_t fsm_typesz; /* size of type */ uint_t fsm_enc[3]; /* CTF_FP_* for {bare,cplx,imagry} type */ } fp_size_map_t; static const fp_size_map_t fp_encodings[] = { - { { 4, 4 }, { CTF_FP_SINGLE, CTF_FP_CPLX, CTF_FP_IMAGRY } }, - { { 8, 8 }, { CTF_FP_DOUBLE, CTF_FP_DCPLX, CTF_FP_DIMAGRY } }, -#ifdef __sparc - { { 16, 16 }, { CTF_FP_LDOUBLE, CTF_FP_LDCPLX, CTF_FP_LDIMAGRY } }, -#else - { { 12, 16 }, { CTF_FP_LDOUBLE, CTF_FP_LDCPLX, CTF_FP_LDIMAGRY } }, -#endif - { { 0, 0 }, { 0, 0, 0 } } + { FLOAT_SIZE_SINGLE, { CTF_FP_SINGLE, CTF_FP_CPLX, CTF_FP_IMAGRY } }, + { FLOAT_SIZE_DOUBLE, { CTF_FP_DOUBLE, CTF_FP_DCPLX, CTF_FP_DIMAGRY } }, + { FLOAT_SIZE_LONG_DOUBLE, + { CTF_FP_LDOUBLE, CTF_FP_LDCPLX, CTF_FP_LDIMAGRY } }, + { 0, { 0, 0, 0 } } }; static uint_t die_base_type2enc(dwarf_t *dw, Dwarf_Off off, Dwarf_Signed enc, size_t sz) { const fp_size_map_t *map = fp_encodings; - uint_t szidx = dw->dw_ptrsz == sizeof (uint64_t); uint_t mult = 1, col = 0; - if (enc == DW_ATE_complex_float) { + switch (enc) { + case DW_ATE_complex_float: +#if defined(DW_ATE_SUN_interval_float) + case DW_ATE_SUN_interval_float: +#endif mult = 2; col = 1; - } else if (enc == DW_ATE_imaginary_float -#if defined(sun) - || enc == DW_ATE_SUN_imaginary_float + break; + case DW_ATE_imaginary_float: +#if defined(DW_ATE_SUN_imaginary_float) + case DW_ATE_SUN_imaginary_float: #endif - ) col = 2; + break; + } - while (map->fsm_typesz[szidx] != 0) { - if (map->fsm_typesz[szidx] * mult == sz) + while (map->fsm_typesz != 0) { + if (sz <= map->fsm_typesz * mult) return (map->fsm_enc[col]); map++; }