Home | History | Annotate | Line # | Download | only in include
      1 /* CTF format description.
      2    Copyright (C) 2019-2026 Free Software Foundation, Inc.
      3 
      4    This file is part of libctf.
      5 
      6    libctf is free software; you can redistribute it and/or modify it under
      7    the terms of the GNU General Public License as published by the Free
      8    Software Foundation; either version 3, or (at your option) any later
      9    version.
     10 
     11    This program is distributed in the hope that it will be useful, but
     12    WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     14    See the GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; see the file COPYING.  If not see
     18    <http://www.gnu.org/licenses/>.  */
     19 
     20 #ifndef	_CTF_H
     21 #define	_CTF_H
     22 
     23 #include <sys/types.h>
     24 #include <limits.h>
     25 #include <stdint.h>
     26 
     27 
     28 #ifdef	__cplusplus
     29 extern "C"
     30 {
     31 #endif
     32 
     33 /* CTF - Compact ANSI-C Type Format
     34 
     35    This file format can be used to compactly represent the information needed
     36    by a debugger to interpret the ANSI-C types used by a given program.
     37    Traditionally, this kind of information is generated by the compiler when
     38    invoked with the -g flag and is stored in "stabs" strings or in the more
     39    modern DWARF format.  CTF provides a representation of only the information
     40    that is relevant to debugging a complex, optimized C program such as the
     41    operating system kernel in a form that is significantly more compact than
     42    the equivalent stabs or DWARF representation.  The format is data-model
     43    independent, so consumers do not need different code depending on whether
     44    they are 32-bit or 64-bit programs; libctf automatically compensates for
     45    endianness variations.  CTF assumes that a standard ELF symbol table is
     46    available for use in the debugger, and uses the structure and data of the
     47    symbol table to avoid storing redundant information.  The CTF data may be
     48    compressed on disk or in memory, indicated by a bit in the header.  CTF may
     49    be interpreted in a raw disk file, or it may be stored in an ELF section,
     50    typically named .ctf.  Data structures are aligned so that a raw CTF file or
     51    CTF ELF section may be manipulated using mmap(2).
     52 
     53    The CTF file or section itself has the following structure:
     54 
     55    +--------+--------+---------+----------+--------+----------+...
     56    |  file  |  type  |  data   | function | object | function |...
     57    | header | labels | objects |   info   | index  |  index   |...
     58    +--------+--------+---------+----------+--------+----------+...
     59 
     60    ...+----------+-------+--------+
     61    ...| variable | data  | string |
     62    ...|   info   | types | table  |
     63       +----------+-------+--------+
     64 
     65    The file header stores a magic number and version information, encoding
     66    flags, and the byte offset of each of the sections relative to the end of the
     67    header itself.  If the CTF data has been uniquified against another set of
     68    CTF data, a reference to that data also appears in the the header.  This
     69    reference is the name of the label corresponding to the types uniquified
     70    against.
     71 
     72    Following the header is a list of labels, used to group the types included in
     73    the data types section.  Each label is accompanied by a type ID i.  A given
     74    label refers to the group of types whose IDs are in the range [0, i].
     75 
     76    Data object and function records (collectively, "symtypetabs") are stored in
     77    the same order as they appear in the corresponding symbol table, except that
     78    symbols marked SHN_UNDEF are not stored and symbols that have no type data
     79    are padded out with zeroes.  For each entry in these tables, the type ID (a
     80    small integer) is recorded.  (Functions get CTF_K_FUNCTION types, just like
     81    data objects that are function pointers.)
     82 
     83    For situations in which the order of the symbols in the symtab is not known,
     84    or most symbols have no type in this dict and most entries would be
     85    zero-pads, a pair of optional indexes follow the data object and function
     86    info sections: each of these is an array of strtab indexes, mapped 1:1 to the
     87    corresponding data object / function info section, giving each entry in those
     88    sections a name so that the linker can correlate them with final symtab
     89    entries and reorder them accordingly (dropping the indexes in the process).
     90 
     91    Variable records (as distinct from data objects) provide a modicum of support
     92    for non-ELF systems, mapping a variable or function name to a CTF type ID.
     93    The names are sorted into ASCIIbetical order, permitting binary searching.
     94    We do not define how the consumer maps these variable names to addresses or
     95    anything else, or indeed what these names represent: they might be names
     96    looked up at runtime via dlsym() or names extracted at runtime by a debugger
     97    or anything else the consumer likes.  Variable records with identically-
     98    named entries in the data object or function index section are removed.
     99 
    100    The data types section is a list of variable size records that represent each
    101    type, in order by their ID.  The types themselves form a directed graph,
    102    where each node may contain one or more outgoing edges to other type nodes,
    103    denoted by their ID.  Most type nodes are standalone or point backwards to
    104    earlier nodes, but this is not required: nodes can point to later nodes,
    105    particularly structure and union members.
    106 
    107    Strings are recorded as a string table ID (0 or 1) and a byte offset into the
    108    string table.  String table 0 is the internal CTF string table.  String table
    109    1 is the external string table, which is the string table associated with the
    110    ELF dynamic symbol table for this object.  CTF does not record any strings
    111    that are already in the symbol table, and the CTF string table does not
    112    contain any duplicated strings.
    113 
    114    If the CTF data has been merged with another parent CTF object, some outgoing
    115    edges may refer to type nodes that exist in another CTF object.  The debugger
    116    and libctf library are responsible for connecting the appropriate objects
    117    together so that the full set of types can be explored and manipulated.
    118 
    119    This connection is done purely using the ctf_import() function.  The
    120    ctf_archive machinery (and thus ctf_open et al) automatically imports archive
    121    members named ".ctf" into child dicts if available in the same archive, to
    122    match the relationship set up by the linker, but callers can call ctf_import
    123    themselves as well if need be, if they know a different relationship is in
    124    force.  */
    125 
    126 #define CTF_MAX_TYPE	0xfffffffe	/* Max type identifier value.  */
    127 #define CTF_MAX_PTYPE	0x7fffffff	/* Max parent type identifier value.  */
    128 #define CTF_MAX_NAME 0x7fffffff		/* Max offset into a string table.  */
    129 #define CTF_MAX_VLEN	0xffffff /* Max struct, union, enum members or args.  */
    130 
    131 /* See ctf_type_t */
    132 #define CTF_MAX_SIZE	0xfffffffe	/* Max size of a v2 type in bytes. */
    133 #define CTF_LSIZE_SENT	0xffffffff	/* Sentinel for v2 ctt_size.  */
    134 
    135 # define CTF_MAX_TYPE_V1	0xffff	/* Max type identifier value.  */
    136 # define CTF_MAX_PTYPE_V1	0x7fff	/* Max parent type identifier value.  */
    137 # define CTF_MAX_VLEN_V1	0x3ff	/* Max struct, union, enums or args.  */
    138 # define CTF_MAX_SIZE_V1	0xfffe	/* Max size of a type in bytes. */
    139 # define CTF_LSIZE_SENT_V1	0xffff	/* Sentinel for v1 ctt_size.  */
    140 
    141   /* Start of actual data structure definitions.
    142 
    143      Every field in these structures must have corresponding code in the
    144      endianness-swapping machinery in libctf/ctf-open.c.  */
    145 
    146 typedef struct ctf_preamble
    147 {
    148   unsigned short ctp_magic;	/* Magic number (CTF_MAGIC).  */
    149   unsigned char ctp_version;	/* Data format version number (CTF_VERSION).  */
    150   unsigned char ctp_flags;	/* Flags (see below).  */
    151 } ctf_preamble_t;
    152 
    153 typedef struct ctf_header_v2
    154 {
    155   ctf_preamble_t cth_preamble;
    156   uint32_t cth_parlabel;	/* Ref to name of parent lbl uniq'd against.  */
    157   uint32_t cth_parname;		/* Ref to basename of parent.  */
    158   uint32_t cth_lbloff;		/* Offset of label section.  */
    159   uint32_t cth_objtoff;		/* Offset of object section.  */
    160   uint32_t cth_funcoff;		/* Offset of function section.  */
    161   uint32_t cth_varoff;		/* Offset of variable section.  */
    162   uint32_t cth_typeoff;		/* Offset of type section.  */
    163   uint32_t cth_stroff;		/* Offset of string section.  */
    164   uint32_t cth_strlen;		/* Length of string section in bytes.  */
    165 } ctf_header_v2_t;
    166 
    167 typedef struct ctf_header
    168 {
    169   ctf_preamble_t cth_preamble;
    170   uint32_t cth_parlabel;	/* Ref to name of parent lbl uniq'd against.  */
    171   uint32_t cth_parname;		/* Ref to basename of parent.  */
    172   uint32_t cth_cuname;		/* Ref to CU name (may be 0).  */
    173   uint32_t cth_lbloff;		/* Offset of label section.  */
    174   uint32_t cth_objtoff;		/* Offset of object section.  */
    175   uint32_t cth_funcoff;		/* Offset of function section.  */
    176   uint32_t cth_objtidxoff;	/* Offset of object index section.  */
    177   uint32_t cth_funcidxoff;	/* Offset of function index section.  */
    178   uint32_t cth_varoff;		/* Offset of variable section.  */
    179   uint32_t cth_typeoff;		/* Offset of type section.  */
    180   uint32_t cth_stroff;		/* Offset of string section.  */
    181   uint32_t cth_strlen;		/* Length of string section in bytes.  */
    182 } ctf_header_t;
    183 
    184 #define cth_magic   cth_preamble.ctp_magic
    185 #define cth_version cth_preamble.ctp_version
    186 #define cth_flags   cth_preamble.ctp_flags
    187 
    188 #define CTF_MAGIC	0xdff2	/* Magic number identifying header.  */
    189 
    190 /* Data format version number.  */
    191 
    192 /* v1 upgraded to a later version is not quite the same as the native form,
    193    because the boundary between parent and child types is different but not
    194    recorded anywhere, and you can write it out again via ctf_compress_write(),
    195    so we must track whether the thing was originally v1 or not.  If we were
    196    writing the header from scratch, we would add a *pair* of version number
    197    fields to allow for this, but this will do for now.  (A flag will not do,
    198    because we need to encode both the version we came from and the version we
    199    went to, not just "we were upgraded".) */
    200 
    201 # define CTF_VERSION_1 1
    202 # define CTF_VERSION_1_UPGRADED_3 2
    203 # define CTF_VERSION_2 3
    204 
    205 #define CTF_VERSION_3 4
    206 #define CTF_VERSION CTF_VERSION_3 /* Current version.  */
    207 
    208 /* All of these flags bar CTF_F_COMPRESS and CTF_F_IDXSORTED are bug-workaround
    209    flags and are valid only in format v3: in v2 and below they cannot occur and
    210    in v4 and later, they will be recycled for other purposes.  */
    211 
    212 #define CTF_F_COMPRESS	0x1		/* Data buffer is compressed by libctf.  */
    213 #define CTF_F_NEWFUNCINFO 0x2		/* New v3 func info section format.  */
    214 #define CTF_F_IDXSORTED 0x4		/* Index sections already sorted.  */
    215 #define CTF_F_DYNSTR 0x8		/* Strings come from .dynstr.  */
    216 #define CTF_F_ARRNELEMS 0x10		/* Array elems no longer reversed.  */
    217 #define CTF_F_MAX (CTF_F_COMPRESS | CTF_F_NEWFUNCINFO | CTF_F_IDXSORTED	\
    218 		   | CTF_F_DYNSTR | CTF_F_ARRNELEMS)
    219 
    220 typedef struct ctf_lblent
    221 {
    222   uint32_t ctl_label;		/* Ref to name of label.  */
    223   uint32_t ctl_type;		/* Last type associated with this label.  */
    224 } ctf_lblent_t;
    225 
    226 typedef struct ctf_varent
    227 {
    228   uint32_t ctv_name;		/* Reference to name in string table.  */
    229   uint32_t ctv_type;		/* Index of type of this variable.  */
    230 } ctf_varent_t;
    231 
    232 /* In format v2, type sizes, measured in bytes, come in two flavours.  Nearly
    233    all of them fit into a (UINT_MAX - 1), and thus can be stored in the ctt_size
    234    member of a ctf_stype_t.  The maximum value for these sizes is CTF_MAX_SIZE.
    235    Types larger than this must be stored in the ctf_lsize member of a
    236    ctf_type_t.  Use of this member is indicated by the presence of
    237    CTF_LSIZE_SENT in ctt_size.  */
    238 
    239 /* In v1, the same applies, only the limit is (USHRT_MAX - 1) and
    240    CTF_MAX_SIZE_V1, and CTF_LSIZE_SENT_V1 is the sentinel.  */
    241 
    242 typedef struct ctf_stype_v1
    243 {
    244   uint32_t ctt_name;		/* Reference to name in string table.  */
    245   unsigned short ctt_info;	/* Encoded kind, variant length (see below).  */
    246 #ifndef __GNUC__
    247   union
    248   {
    249     unsigned short _size;	/* Size of entire type in bytes.  */
    250     unsigned short _type;	/* Reference to another type.  */
    251   } _u;
    252 #else
    253   __extension__
    254   union
    255   {
    256     unsigned short ctt_size;	/* Size of entire type in bytes.  */
    257     unsigned short ctt_type;	/* Reference to another type.  */
    258   };
    259 #endif
    260 } ctf_stype_v1_t;
    261 
    262 typedef struct ctf_type_v1
    263 {
    264   uint32_t ctt_name;		/* Reference to name in string table.  */
    265   unsigned short ctt_info;	/* Encoded kind, variant length (see below).  */
    266 #ifndef __GNUC__
    267   union
    268   {
    269     unsigned short _size;	/* Always CTF_LSIZE_SENT_V1.  */
    270     unsigned short _type;	/* Do not use.  */
    271   } _u;
    272 #else
    273   __extension__
    274   union
    275   {
    276     unsigned short ctt_size;	/* Always CTF_LSIZE_SENT_V1.  */
    277     unsigned short ctt_type;	/* Do not use.  */
    278   };
    279 #endif
    280   uint32_t ctt_lsizehi;		/* High 32 bits of type size in bytes.  */
    281   uint32_t ctt_lsizelo;		/* Low 32 bits of type size in bytes.  */
    282 } ctf_type_v1_t;
    283 
    284 
    285 typedef struct ctf_stype
    286 {
    287   uint32_t ctt_name;		/* Reference to name in string table.  */
    288   uint32_t ctt_info;		/* Encoded kind, variant length (see below).  */
    289 #ifndef __GNUC__
    290   union
    291   {
    292     uint32_t _size;		/* Size of entire type in bytes.  */
    293     uint32_t _type;		/* Reference to another type.  */
    294   } _u;
    295 #else
    296   __extension__
    297   union
    298   {
    299     uint32_t ctt_size;		/* Size of entire type in bytes.  */
    300     uint32_t ctt_type;		/* Reference to another type.  */
    301   };
    302 #endif
    303 } ctf_stype_t;
    304 
    305 typedef struct ctf_type
    306 {
    307   uint32_t ctt_name;		/* Reference to name in string table.  */
    308   uint32_t ctt_info;		/* Encoded kind, variant length (see below).  */
    309 #ifndef __GNUC__
    310 union
    311   {
    312     uint32_t _size;		/* Always CTF_LSIZE_SENT.  */
    313     uint32_t _type;		/* Do not use.  */
    314   } _u;
    315 #else
    316   __extension__
    317   union
    318   {
    319     uint32_t ctt_size;		/* Always CTF_LSIZE_SENT.  */
    320     uint32_t ctt_type;		/* Do not use.  */
    321   };
    322 #endif
    323   uint32_t ctt_lsizehi;		/* High 32 bits of type size in bytes.  */
    324   uint32_t ctt_lsizelo;		/* Low 32 bits of type size in bytes.  */
    325 } ctf_type_t;
    326 
    327 #ifndef __GNUC__
    328 #define ctt_size _u._size	/* For fundamental types that have a size.  */
    329 #define ctt_type _u._type	/* For types that reference another type.  */
    330 #endif
    331 
    332 /* The following macros and inline functions compose and decompose values for
    333    ctt_info and ctt_name, as well as other structures that contain name
    334    references.  Use outside libdtrace-ctf itself is explicitly for access to CTF
    335    files directly: types returned from the library will always appear to be
    336    CTF_V2.
    337 
    338    v1: (transparently upgraded to v2 at open time: may be compiled out of the
    339    library)
    340                ------------------------
    341    ctt_info:   | kind | isroot | vlen |
    342                ------------------------
    343                15   11    10    9     0
    344 
    345    v2:
    346                ------------------------
    347    ctt_info:   | kind | isroot | vlen |
    348                ------------------------
    349                31    26    25  24     0
    350 
    351    CTF_V1 and V2 _INFO_VLEN have the same interface:
    352 
    353    kind = CTF_*_INFO_KIND(c.ctt_info);     <-- CTF_K_* value (see below)
    354    vlen = CTF_*_INFO_VLEN(fp, c.ctt_info); <-- length of variable data list
    355 
    356    stid = CTF_NAME_STID(c.ctt_name);     <-- string table id number (0 or 1)
    357    offset = CTF_NAME_OFFSET(c.ctt_name); <-- string table byte offset
    358 
    359    c.ctt_info = CTF_TYPE_INFO(kind, vlen);
    360    c.ctt_name = CTF_TYPE_NAME(stid, offset);  */
    361 
    362 #define CTF_V1_INFO_KIND(info)		(((info) & 0xf800) >> 11)
    363 #define CTF_V1_INFO_ISROOT(info)	(((info) & 0x0400) >> 10)
    364 #define CTF_V1_INFO_VLEN(info)		(((info) & CTF_MAX_VLEN_V1))
    365 
    366 #define CTF_V2_INFO_KIND(info)		(((info) & 0xfc000000) >> 26)
    367 #define CTF_V2_INFO_ISROOT(info)	(((info) & 0x2000000) >> 25)
    368 #define CTF_V2_INFO_VLEN(info)		(((info) & CTF_MAX_VLEN))
    369 
    370 #define CTF_NAME_STID(name)		((name) >> 31)
    371 #define CTF_NAME_OFFSET(name)		((name) & CTF_MAX_NAME)
    372 #define CTF_SET_STID(name, stid)	((name) | ((unsigned int) stid) << 31)
    373 
    374 /* V2 only. */
    375 #define CTF_TYPE_INFO(kind, isroot, vlen) \
    376 	(((kind) << 26) | (((isroot) ? 1 : 0) << 25) | ((vlen) & CTF_MAX_VLEN))
    377 
    378 #define CTF_TYPE_NAME(stid, offset) \
    379 	(((stid) << 31) | ((offset) & CTF_MAX_NAME))
    380 
    381 /* The next set of macros are for public consumption only.  Not used internally,
    382    since the relevant type boundary is dependent upon the version of the file at
    383    *opening* time, not the version after transparent upgrade.  Use
    384    ctf_type_isparent() / ctf_type_ischild() for that.  */
    385 
    386 #define CTF_V2_TYPE_ISPARENT(fp, id)	((id) <= CTF_MAX_PTYPE)
    387 #define CTF_V2_TYPE_ISCHILD(fp, id)	((id) > CTF_MAX_PTYPE)
    388 #define CTF_V2_TYPE_TO_INDEX(id)	((id) & CTF_MAX_PTYPE)
    389 #define CTF_V2_INDEX_TO_TYPE(id, child) ((child) ? ((id) | (CTF_MAX_PTYPE+1)) : (id))
    390 
    391 #define CTF_V1_TYPE_ISPARENT(fp, id)	((id) <= CTF_MAX_PTYPE_V1)
    392 #define CTF_V1_TYPE_ISCHILD(fp, id)	((id) > CTF_MAX_PTYPE_V1)
    393 #define CTF_V1_TYPE_TO_INDEX(id)	((id) & CTF_MAX_PTYPE_V1)
    394 #define CTF_V1_INDEX_TO_TYPE(id, child) ((child) ? ((id) | (CTF_MAX_PTYPE_V1+1)) : (id))
    395 
    396 /* Valid for both V1 and V2. */
    397 #define CTF_TYPE_LSIZE(cttp) \
    398 	(((uint64_t)(cttp)->ctt_lsizehi) << 32 | (cttp)->ctt_lsizelo)
    399 #define CTF_SIZE_TO_LSIZE_HI(size)	((uint32_t)((uint64_t)(size) >> 32))
    400 #define CTF_SIZE_TO_LSIZE_LO(size)	((uint32_t)(size))
    401 
    402 #define CTF_STRTAB_0	0	/* String table id 0 (in-CTF).  */
    403 #define CTF_STRTAB_1	1	/* String table id 1 (ELF strtab).  */
    404 
    405 /* Values for CTF_TYPE_KIND().  If the kind has an associated data list,
    406    CTF_INFO_VLEN() will extract the number of elements in the list, and
    407    the type of each element is shown in the comments below. */
    408 
    409 #define CTF_K_UNKNOWN	0	/* Unknown type (used for padding and
    410 				   unrepresentable types).  */
    411 #define CTF_K_INTEGER	1	/* Variant data is CTF_INT_DATA (see below).  */
    412 #define CTF_K_FLOAT	2	/* Variant data is CTF_FP_DATA (see below).  */
    413 #define CTF_K_POINTER	3	/* ctt_type is referenced type.  */
    414 #define CTF_K_ARRAY	4	/* Variant data is single ctf_array_t.  */
    415 #define CTF_K_FUNCTION	5	/* ctt_type is return type, variant data is
    416 				   list of argument types (unsigned short's for v1,
    417 				   uint32_t's for v2).  */
    418 #define CTF_K_STRUCT	6	/* Variant data is list of ctf_member_t's.  */
    419 #define CTF_K_UNION	7	/* Variant data is list of ctf_member_t's.  */
    420 #define CTF_K_ENUM	8	/* Variant data is list of ctf_enum_t's.  */
    421 #define CTF_K_FORWARD	9	/* No additional data; ctt_name is tag.  */
    422 #define CTF_K_TYPEDEF	10	/* ctt_type is referenced type.  */
    423 #define CTF_K_VOLATILE	11	/* ctt_type is base type.  */
    424 #define CTF_K_CONST	12	/* ctt_type is base type.  */
    425 #define CTF_K_RESTRICT	13	/* ctt_type is base type.  */
    426 #define CTF_K_SLICE	14	/* Variant data is a ctf_slice_t.  */
    427 
    428 #define CTF_K_MAX	63	/* Maximum possible (V2) CTF_K_* value.  */
    429 
    430 /* Values for ctt_type when kind is CTF_K_INTEGER.  The flags, offset in bits,
    431    and size in bits are encoded as a single word using the following macros.
    432    (However, you can also encode the offset and bitness in a slice.)  */
    433 
    434 #define CTF_INT_ENCODING(data) (((data) & 0xff000000) >> 24)
    435 #define CTF_INT_OFFSET(data)   (((data) & 0x00ff0000) >> 16)
    436 #define CTF_INT_BITS(data)     (((data) & 0x0000ffff))
    437 
    438 #define CTF_INT_DATA(encoding, offset, bits) \
    439        (((encoding) << 24) | ((offset) << 16) | (bits))
    440 
    441 #define CTF_INT_SIGNED	0x01	/* Integer is signed (otherwise unsigned).  */
    442 #define CTF_INT_CHAR	0x02	/* Character display format.  */
    443 #define CTF_INT_BOOL	0x04	/* Boolean display format.  */
    444 #define CTF_INT_VARARGS	0x08	/* Varargs display format.  */
    445 
    446 /* Use CTF_CHAR to produce a char that agrees with the system's native
    447    char signedness.  */
    448 #if CHAR_MIN == 0
    449 # define CTF_CHAR (CTF_INT_CHAR)
    450 #else
    451 # define CTF_CHAR (CTF_INT_CHAR | CTF_INT_SIGNED)
    452 #endif
    453 
    454 /* Values for ctt_type when kind is CTF_K_FLOAT.  The encoding, offset in bits,
    455    and size in bits are encoded as a single word using the following macros.
    456    (However, you can also encode the offset and bitness in a slice.)  */
    457 
    458 #define CTF_FP_ENCODING(data)  (((data) & 0xff000000) >> 24)
    459 #define CTF_FP_OFFSET(data)    (((data) & 0x00ff0000) >> 16)
    460 #define CTF_FP_BITS(data)      (((data) & 0x0000ffff))
    461 
    462 #define CTF_FP_DATA(encoding, offset, bits) \
    463        (((encoding) << 24) | ((offset) << 16) | (bits))
    464 
    465 /* Variant data when kind is CTF_K_FLOAT is an encoding in the top eight bits.  */
    466 #define CTF_FP_ENCODING(data)	(((data) & 0xff000000) >> 24)
    467 
    468 #define CTF_FP_SINGLE	1	/* IEEE 32-bit float encoding.  */
    469 #define CTF_FP_DOUBLE	2	/* IEEE 64-bit float encoding.  */
    470 #define CTF_FP_CPLX	3	/* Complex encoding.  */
    471 #define CTF_FP_DCPLX	4	/* Double complex encoding.  */
    472 #define CTF_FP_LDCPLX	5	/* Long double complex encoding.  */
    473 #define CTF_FP_LDOUBLE	6	/* Long double encoding.  */
    474 #define CTF_FP_INTRVL	7	/* Interval (2x32-bit) encoding.  */
    475 #define CTF_FP_DINTRVL	8	/* Double interval (2x64-bit) encoding.  */
    476 #define CTF_FP_LDINTRVL	9	/* Long double interval (2x128-bit) encoding.  */
    477 #define CTF_FP_IMAGRY	10	/* Imaginary (32-bit) encoding.  */
    478 #define CTF_FP_DIMAGRY	11	/* Long imaginary (64-bit) encoding.  */
    479 #define CTF_FP_LDIMAGRY	12	/* Long double imaginary (128-bit) encoding.  */
    480 
    481 #define CTF_FP_MAX	12	/* Maximum possible CTF_FP_* value */
    482 
    483 /* A slice increases the offset and reduces the bitness of the referenced
    484    ctt_type, which must be a type which has an encoding (fp, int, or enum).  We
    485    also store the referenced type in here, because it is easier to keep the
    486    ctt_size correct for the slice than to shuffle the size into here and keep
    487    the ctt_type where it is for other types.
    488 
    489    In a future version, where we loosen requirements on alignment in the CTF
    490    file, the cts_offset and cts_bits will be chars: but for now they must be
    491    shorts or everything after a slice will become unaligned.  */
    492 
    493 typedef struct ctf_slice
    494 {
    495   uint32_t cts_type;
    496   unsigned short cts_offset;
    497   unsigned short cts_bits;
    498 } ctf_slice_t;
    499 
    500 typedef struct ctf_array_v1
    501 {
    502   unsigned short cta_contents;	/* Reference to type of array contents.  */
    503   unsigned short cta_index;	/* Reference to type of array index.  */
    504   uint32_t cta_nelems;		/* Number of elements.  */
    505 } ctf_array_v1_t;
    506 
    507 typedef struct ctf_array
    508 {
    509   uint32_t cta_contents;	/* Reference to type of array contents.  */
    510   uint32_t cta_index;		/* Reference to type of array index.  */
    511   uint32_t cta_nelems;		/* Number of elements.  */
    512 } ctf_array_t;
    513 
    514 /* Most structure members have bit offsets that can be expressed using a short.
    515    Some don't.  ctf_member_t is used for structs which cannot contain any of
    516    these large offsets, whereas ctf_lmember_t is used in the latter case.  If
    517    any member of a given struct has an offset that cannot be expressed using a
    518    uint32_t, all members will be stored as type ctf_lmember_t.  This is expected
    519    to be very rare (but nonetheless possible).  */
    520 
    521 #define CTF_LSTRUCT_THRESH	536870912
    522 
    523 /* In v1, the same is true, except that lmembers are used for structs >= 8192
    524    bytes in size.  (The ordering of members in the ctf_member_* structures is
    525    different to improve padding.)  */
    526 
    527 #define CTF_LSTRUCT_THRESH_V1	8192
    528 
    529 typedef struct ctf_member_v1
    530 {
    531   uint32_t ctm_name;		/* Reference to name in string table.  */
    532   unsigned short ctm_type;	/* Reference to type of member.  */
    533   unsigned short ctm_offset;	/* Offset of this member in bits.  */
    534 } ctf_member_v1_t;
    535 
    536 typedef struct ctf_lmember_v1
    537 {
    538   uint32_t ctlm_name;		/* Reference to name in string table.  */
    539   unsigned short ctlm_type;	/* Reference to type of member.  */
    540   unsigned short ctlm_pad;	/* Padding.  */
    541   uint32_t ctlm_offsethi;	/* High 32 bits of member offset in bits.  */
    542   uint32_t ctlm_offsetlo;	/* Low 32 bits of member offset in bits.  */
    543 } ctf_lmember_v1_t;
    544 
    545 typedef struct ctf_member_v2
    546 {
    547   uint32_t ctm_name;		/* Reference to name in string table.  */
    548   uint32_t ctm_offset;		/* Offset of this member in bits.  */
    549   uint32_t ctm_type;		/* Reference to type of member.  */
    550 } ctf_member_t;
    551 
    552 typedef struct ctf_lmember_v2
    553 {
    554   uint32_t ctlm_name;		/* Reference to name in string table.  */
    555   uint32_t ctlm_offsethi;	/* High 32 bits of member offset in bits.  */
    556   uint32_t ctlm_type;		/* Reference to type of member.  */
    557   uint32_t ctlm_offsetlo;	/* Low 32 bits of member offset in bits.  */
    558 } ctf_lmember_t;
    559 
    560 #define	CTF_LMEM_OFFSET(ctlmp) \
    561 	(((uint64_t)(ctlmp)->ctlm_offsethi) << 32 | (ctlmp)->ctlm_offsetlo)
    562 #define	CTF_OFFSET_TO_LMEMHI(offset)	((uint32_t)((uint64_t)(offset) >> 32))
    563 #define	CTF_OFFSET_TO_LMEMLO(offset)	((uint32_t)(offset))
    564 
    565 typedef struct ctf_enum
    566 {
    567   uint32_t cte_name;		/* Reference to name in string table.  */
    568   int32_t cte_value;		/* Value associated with this name.  */
    569 } ctf_enum_t;
    570 
    571 /* The ctf_archive is a collection of ctf_dict_t's stored together. The format
    572    is suitable for mmap()ing: this control structure merely describes the
    573    mmap()ed archive (and overlaps the first few bytes of it), hence the
    574    greater care taken with integral types.  All CTF files in an archive
    575    must have the same data model.  (This is not validated.)
    576 
    577    All integers in this structure are stored in little-endian byte order.
    578 
    579    The code relies on the fact that everything in this header is a uint64_t
    580    and thus the header needs no padding (in particular, that no padding is
    581    needed between ctfa_ctfs and the unnamed ctfa_archive_modent array
    582    that follows it).
    583 
    584    This is *not* the same as the data structure returned by the ctf_arc_*()
    585    functions:  this is the low-level on-disk representation.  */
    586 
    587 #define CTFA_MAGIC 0x8b47f2a4d7623eeb	/* Random.  */
    588 struct ctf_archive
    589 {
    590   /* Magic number.  (In loaded files, overwritten with the file size
    591      so ctf_arc_close() knows how much to munmap()).  */
    592   uint64_t ctfa_magic;
    593 
    594   /* CTF data model.  */
    595   uint64_t ctfa_model;
    596 
    597   /* Number of CTF dicts in the archive.  */
    598   uint64_t ctfa_ndicts;
    599 
    600   /* Offset of the name table.  */
    601   uint64_t ctfa_names;
    602 
    603   /* Offset of the CTF table.  Each element starts with a size (a little-
    604      endian uint64_t) then a ctf_dict_t of that size.  */
    605   uint64_t ctfa_ctfs;
    606 };
    607 
    608 /* An array of ctfa_ndicts of this structure lies at
    609    ctf_archive[sizeof(struct ctf_archive)] and gives the ctfa_ctfs or
    610    ctfa_names-relative offsets of each name or ctf_dict_t.  */
    611 
    612 typedef struct ctf_archive_modent
    613 {
    614   uint64_t name_offset;
    615   uint64_t ctf_offset;
    616 } ctf_archive_modent_t;
    617 
    618 #ifdef	__cplusplus
    619 }
    620 #endif
    621 
    622 #endif				/* _CTF_H */
    623