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