]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - include/ctf.h
libctf: symbol type linking support
[thirdparty/binutils-gdb.git] / include / ctf.h
CommitLineData
fceac76e 1/* CTF format description.
b3adc24a 2 Copyright (C) 2019-2020 Free Software Foundation, Inc.
fceac76e
NA
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
29extern "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
2db912ba
NA
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 +----------+-------+--------+
fceac76e
NA
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
1136c379
NA
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.)
fceac76e 82
2db912ba 83 For situations in which the order of the symbols in the symtab is not known,
1136c379
NA
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).
2db912ba 90
fceac76e
NA
91 Variable records (as distinct from data objects) provide a modicum of support
92 for non-ELF systems, mapping a variable name to a CTF type ID. The variable
2db912ba
NA
93 names are sorted into ASCIIbetical order, permitting binary searching. We do
94 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
1136c379
NA
97 or anything else the consumer likes. Variable records with identically-
98 named entries in the data object section are removed.
fceac76e
NA
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,
2db912ba
NA
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.
fceac76e
NA
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
1136c379
NA
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.
fceac76e
NA
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. There is no
120 notation anywhere in the child CTF file indicating which parent it is
121 connected to: it is the debugger's responsibility to track this. */
122
123#define CTF_MAX_TYPE 0xfffffffe /* Max type identifier value. */
124#define CTF_MAX_PTYPE 0x7fffffff /* Max parent type identifier value. */
125#define CTF_MAX_NAME 0x7fffffff /* Max offset into a string table. */
126#define CTF_MAX_VLEN 0xffffff /* Max struct, union, enum members or args. */
127
128/* See ctf_type_t */
129#define CTF_MAX_SIZE 0xfffffffe /* Max size of a v2 type in bytes. */
130#define CTF_LSIZE_SENT 0xffffffff /* Sentinel for v2 ctt_size. */
131
132# define CTF_MAX_TYPE_V1 0xffff /* Max type identifier value. */
133# define CTF_MAX_PTYPE_V1 0x7fff /* Max parent type identifier value. */
134# define CTF_MAX_VLEN_V1 0x3ff /* Max struct, union, enums or args. */
135# define CTF_MAX_SIZE_V1 0xfffe /* Max size of a type in bytes. */
136# define CTF_LSIZE_SENT_V1 0xffff /* Sentinel for v1 ctt_size. */
137
138 /* Start of actual data structure definitions.
139
140 Every field in these structures must have corresponding code in the
141 endianness-swapping machinery in libctf/ctf-open.c. */
142
143typedef struct ctf_preamble
144{
145 unsigned short ctp_magic; /* Magic number (CTF_MAGIC). */
146 unsigned char ctp_version; /* Data format version number (CTF_VERSION). */
147 unsigned char ctp_flags; /* Flags (see below). */
148} ctf_preamble_t;
149
fd55eae8
NA
150typedef struct ctf_header_v2
151{
152 ctf_preamble_t cth_preamble;
153 uint32_t cth_parlabel; /* Ref to name of parent lbl uniq'd against. */
154 uint32_t cth_parname; /* Ref to basename of parent. */
155 uint32_t cth_lbloff; /* Offset of label section. */
156 uint32_t cth_objtoff; /* Offset of object section. */
157 uint32_t cth_funcoff; /* Offset of function section. */
158 uint32_t cth_varoff; /* Offset of variable section. */
159 uint32_t cth_typeoff; /* Offset of type section. */
160 uint32_t cth_stroff; /* Offset of string section. */
161 uint32_t cth_strlen; /* Length of string section in bytes. */
162} ctf_header_v2_t;
163
fceac76e
NA
164typedef struct ctf_header
165{
166 ctf_preamble_t cth_preamble;
167 uint32_t cth_parlabel; /* Ref to name of parent lbl uniq'd against. */
168 uint32_t cth_parname; /* Ref to basename of parent. */
fd55eae8 169 uint32_t cth_cuname; /* Ref to CU name (may be 0). */
fceac76e
NA
170 uint32_t cth_lbloff; /* Offset of label section. */
171 uint32_t cth_objtoff; /* Offset of object section. */
172 uint32_t cth_funcoff; /* Offset of function section. */
2db912ba
NA
173 uint32_t cth_objtidxoff; /* Offset of object index section. */
174 uint32_t cth_funcidxoff; /* Offset of function index section. */
fceac76e
NA
175 uint32_t cth_varoff; /* Offset of variable section. */
176 uint32_t cth_typeoff; /* Offset of type section. */
177 uint32_t cth_stroff; /* Offset of string section. */
178 uint32_t cth_strlen; /* Length of string section in bytes. */
179} ctf_header_t;
180
181#define cth_magic cth_preamble.ctp_magic
182#define cth_version cth_preamble.ctp_version
183#define cth_flags cth_preamble.ctp_flags
184
185#define CTF_MAGIC 0xdff2 /* Magic number identifying header. */
186
187/* Data format version number. */
188
fd55eae8
NA
189/* v1 upgraded to a later version is not quite the same as the native form,
190 because the boundary between parent and child types is different but not
191 recorded anywhere, and you can write it out again via ctf_compress_write(),
192 so we must track whether the thing was originally v1 or not. If we were
193 writing the header from scratch, we would add a *pair* of version number
194 fields to allow for this, but this will do for now. (A flag will not do,
195 because we need to encode both the version we came from and the version we
196 went to, not just "we were upgraded".) */
fceac76e
NA
197
198# define CTF_VERSION_1 1
199# define CTF_VERSION_1_UPGRADED_3 2
200# define CTF_VERSION_2 3
201
202#define CTF_VERSION_3 4
203#define CTF_VERSION CTF_VERSION_3 /* Current version. */
204
1136c379
NA
205/* All of these flags bar CTF_F_COMPRESS and CTF_F_IDXSORTED are bug-workaround
206 flags and are valid only in format v3: in v2 and below they cannot occur and
207 in v4 and later, they will be recycled for other purposes. */
208
ec388c16 209#define CTF_F_COMPRESS 0x1 /* Data buffer is compressed by libctf. */
1136c379
NA
210#define CTF_F_NEWFUNCINFO 0x2 /* New v3 func info section format. */
211#define CTF_F_IDXSORTED 0x4 /* Index sections already sorted. */
3d16b64e 212#define CTF_F_DYNSTR 0x8 /* Strings come from .dynstr. */
1136c379
NA
213#define CTF_F_MAX (CTF_F_COMPRESS | CTF_F_NEWFUNCINFO | CTF_F_IDXSORTED \
214 | CTF_F_DYNSTR)
fceac76e
NA
215
216typedef struct ctf_lblent
217{
218 uint32_t ctl_label; /* Ref to name of label. */
219 uint32_t ctl_type; /* Last type associated with this label. */
220} ctf_lblent_t;
221
222typedef struct ctf_varent
223{
224 uint32_t ctv_name; /* Reference to name in string table. */
225 uint32_t ctv_type; /* Index of type of this variable. */
226} ctf_varent_t;
227
228/* In format v2, type sizes, measured in bytes, come in two flavours. Nearly
229 all of them fit into a (UINT_MAX - 1), and thus can be stored in the ctt_size
230 member of a ctf_stype_t. The maximum value for these sizes is CTF_MAX_SIZE.
231 Types larger than this must be stored in the ctf_lsize member of a
232 ctf_type_t. Use of this member is indicated by the presence of
233 CTF_LSIZE_SENT in ctt_size. */
234
235/* In v1, the same applies, only the limit is (USHRT_MAX - 1) and
236 CTF_MAX_SIZE_V1, and CTF_LSIZE_SENT_V1 is the sentinel. */
237
238typedef struct ctf_stype_v1
239{
240 uint32_t ctt_name; /* Reference to name in string table. */
241 unsigned short ctt_info; /* Encoded kind, variant length (see below). */
242#ifndef __GNUC__
243 union
244 {
245 unsigned short _size; /* Size of entire type in bytes. */
246 unsigned short _type; /* Reference to another type. */
247 } _u;
248#else
249 __extension__
250 union
251 {
252 unsigned short ctt_size; /* Size of entire type in bytes. */
253 unsigned short ctt_type; /* Reference to another type. */
254 };
255#endif
256} ctf_stype_v1_t;
257
258typedef struct ctf_type_v1
259{
260 uint32_t ctt_name; /* Reference to name in string table. */
261 unsigned short ctt_info; /* Encoded kind, variant length (see below). */
262#ifndef __GNUC__
263 union
264 {
265 unsigned short _size; /* Always CTF_LSIZE_SENT_V1. */
266 unsigned short _type; /* Do not use. */
267 } _u;
268#else
269 __extension__
270 union
271 {
272 unsigned short ctt_size; /* Always CTF_LSIZE_SENT_V1. */
273 unsigned short ctt_type; /* Do not use. */
274 };
275#endif
276 uint32_t ctt_lsizehi; /* High 32 bits of type size in bytes. */
277 uint32_t ctt_lsizelo; /* Low 32 bits of type size in bytes. */
278} ctf_type_v1_t;
279
280
281typedef struct ctf_stype
282{
283 uint32_t ctt_name; /* Reference to name in string table. */
284 uint32_t ctt_info; /* Encoded kind, variant length (see below). */
285#ifndef __GNUC__
286 union
287 {
288 uint32_t _size; /* Size of entire type in bytes. */
289 uint32_t _type; /* Reference to another type. */
290 } _u;
291#else
292 __extension__
293 union
294 {
295 uint32_t ctt_size; /* Size of entire type in bytes. */
296 uint32_t ctt_type; /* Reference to another type. */
297 };
298#endif
299} ctf_stype_t;
300
301typedef struct ctf_type
302{
303 uint32_t ctt_name; /* Reference to name in string table. */
304 uint32_t ctt_info; /* Encoded kind, variant length (see below). */
305#ifndef __GNUC__
306union
307 {
308 uint32_t _size; /* Always CTF_LSIZE_SENT. */
309 uint32_t _type; /* Do not use. */
310 } _u;
311#else
312 __extension__
313 union
314 {
315 uint32_t ctt_size; /* Always CTF_LSIZE_SENT. */
316 uint32_t ctt_type; /* Do not use. */
317 };
318#endif
319 uint32_t ctt_lsizehi; /* High 32 bits of type size in bytes. */
320 uint32_t ctt_lsizelo; /* Low 32 bits of type size in bytes. */
321} ctf_type_t;
322
323#ifndef __GNUC__
324#define ctt_size _u._size /* For fundamental types that have a size. */
325#define ctt_type _u._type /* For types that reference another type. */
326#endif
327
328/* The following macros and inline functions compose and decompose values for
329 ctt_info and ctt_name, as well as other structures that contain name
330 references. Use outside libdtrace-ctf itself is explicitly for access to CTF
331 files directly: types returned from the library will always appear to be
332 CTF_V2.
333
334 v1: (transparently upgraded to v2 at open time: may be compiled out of the
335 library)
336 ------------------------
337 ctt_info: | kind | isroot | vlen |
338 ------------------------
339 15 11 10 9 0
340
341 v2:
342 ------------------------
343 ctt_info: | kind | isroot | vlen |
344 ------------------------
345 31 26 25 24 0
346
347 CTF_V1 and V2 _INFO_VLEN have the same interface:
348
349 kind = CTF_*_INFO_KIND(c.ctt_info); <-- CTF_K_* value (see below)
350 vlen = CTF_*_INFO_VLEN(fp, c.ctt_info); <-- length of variable data list
351
352 stid = CTF_NAME_STID(c.ctt_name); <-- string table id number (0 or 1)
353 offset = CTF_NAME_OFFSET(c.ctt_name); <-- string table byte offset
354
355 c.ctt_info = CTF_TYPE_INFO(kind, vlen);
356 c.ctt_name = CTF_TYPE_NAME(stid, offset); */
357
358# define CTF_V1_INFO_KIND(info) (((info) & 0xf800) >> 11)
359# define CTF_V1_INFO_ISROOT(info) (((info) & 0x0400) >> 10)
360# define CTF_V1_INFO_VLEN(info) (((info) & CTF_MAX_VLEN_V1))
361
362#define CTF_V2_INFO_KIND(info) (((info) & 0xfc000000) >> 26)
363#define CTF_V2_INFO_ISROOT(info) (((info) & 0x2000000) >> 25)
364#define CTF_V2_INFO_VLEN(info) (((info) & CTF_MAX_VLEN))
365
366#define CTF_NAME_STID(name) ((name) >> 31)
367#define CTF_NAME_OFFSET(name) ((name) & CTF_MAX_NAME)
d851ecd3 368#define CTF_SET_STID(name, stid) ((name) | (stid) << 31)
fceac76e
NA
369
370/* V2 only. */
371#define CTF_TYPE_INFO(kind, isroot, vlen) \
372 (((kind) << 26) | (((isroot) ? 1 : 0) << 25) | ((vlen) & CTF_MAX_VLEN))
373
374#define CTF_TYPE_NAME(stid, offset) \
375 (((stid) << 31) | ((offset) & CTF_MAX_NAME))
376
377/* The next set of macros are for public consumption only. Not used internally,
378 since the relevant type boundary is dependent upon the version of the file at
379 *opening* time, not the version after transparent upgrade. Use
380 ctf_type_isparent() / ctf_type_ischild() for that. */
381
382#define CTF_V2_TYPE_ISPARENT(fp, id) ((id) <= CTF_MAX_PTYPE)
383#define CTF_V2_TYPE_ISCHILD(fp, id) ((id) > CTF_MAX_PTYPE)
384#define CTF_V2_TYPE_TO_INDEX(id) ((id) & CTF_MAX_PTYPE)
385#define CTF_V2_INDEX_TO_TYPE(id, child) ((child) ? ((id) | (CTF_MAX_PTYPE+1)) : (id))
386
387# define CTF_V1_TYPE_ISPARENT(fp, id) ((id) <= CTF_MAX_PTYPE_V1)
388# define CTF_V1_TYPE_ISCHILD(fp, id) ((id) > CTF_MAX_PTYPE_V1)
389# define CTF_V1_TYPE_TO_INDEX(id) ((id) & CTF_MAX_PTYPE_V1)
390# define CTF_V1_INDEX_TO_TYPE(id, child) ((child) ? ((id) | (CTF_MAX_PTYPE_V1+1)) : (id))
391
392/* Valid for both V1 and V2. */
393#define CTF_TYPE_LSIZE(cttp) \
394 (((uint64_t)(cttp)->ctt_lsizehi) << 32 | (cttp)->ctt_lsizelo)
395#define CTF_SIZE_TO_LSIZE_HI(size) ((uint32_t)((uint64_t)(size) >> 32))
396#define CTF_SIZE_TO_LSIZE_LO(size) ((uint32_t)(size))
397
398#define CTF_STRTAB_0 0 /* String table id 0 (in-CTF). */
399#define CTF_STRTAB_1 1 /* String table id 1 (ELF strtab). */
400
401/* Values for CTF_TYPE_KIND(). If the kind has an associated data list,
402 CTF_INFO_VLEN() will extract the number of elements in the list, and
403 the type of each element is shown in the comments below. */
404
405#define CTF_K_UNKNOWN 0 /* Unknown type (used for padding). */
406#define CTF_K_INTEGER 1 /* Variant data is CTF_INT_DATA (see below). */
407#define CTF_K_FLOAT 2 /* Variant data is CTF_FP_DATA (see below). */
408#define CTF_K_POINTER 3 /* ctt_type is referenced type. */
409#define CTF_K_ARRAY 4 /* Variant data is single ctf_array_t. */
410#define CTF_K_FUNCTION 5 /* ctt_type is return type, variant data is
411 list of argument types (unsigned short's for v1,
412 uint32_t's for v2). */
413#define CTF_K_STRUCT 6 /* Variant data is list of ctf_member_t's. */
414#define CTF_K_UNION 7 /* Variant data is list of ctf_member_t's. */
415#define CTF_K_ENUM 8 /* Variant data is list of ctf_enum_t's. */
416#define CTF_K_FORWARD 9 /* No additional data; ctt_name is tag. */
417#define CTF_K_TYPEDEF 10 /* ctt_type is referenced type. */
418#define CTF_K_VOLATILE 11 /* ctt_type is base type. */
419#define CTF_K_CONST 12 /* ctt_type is base type. */
420#define CTF_K_RESTRICT 13 /* ctt_type is base type. */
421#define CTF_K_SLICE 14 /* Variant data is a ctf_slice_t. */
422
423#define CTF_K_MAX 63 /* Maximum possible (V2) CTF_K_* value. */
424
425/* Values for ctt_type when kind is CTF_K_INTEGER. The flags, offset in bits,
426 and size in bits are encoded as a single word using the following macros.
427 (However, you can also encode the offset and bitness in a slice.) */
428
429#define CTF_INT_ENCODING(data) (((data) & 0xff000000) >> 24)
430#define CTF_INT_OFFSET(data) (((data) & 0x00ff0000) >> 16)
431#define CTF_INT_BITS(data) (((data) & 0x0000ffff))
432
433#define CTF_INT_DATA(encoding, offset, bits) \
434 (((encoding) << 24) | ((offset) << 16) | (bits))
435
436#define CTF_INT_SIGNED 0x01 /* Integer is signed (otherwise unsigned). */
437#define CTF_INT_CHAR 0x02 /* Character display format. */
438#define CTF_INT_BOOL 0x04 /* Boolean display format. */
439#define CTF_INT_VARARGS 0x08 /* Varargs display format. */
440
441/* Use CTF_CHAR to produce a char that agrees with the system's native
442 char signedness. */
443#if CHAR_MIN == 0
444# define CTF_CHAR (CTF_INT_CHAR)
445#else
446# define CTF_CHAR (CTF_INT_CHAR | CTF_INT_SIGNED)
447#endif
448
449/* Values for ctt_type when kind is CTF_K_FLOAT. The encoding, offset in bits,
450 and size in bits are encoded as a single word using the following macros.
451 (However, you can also encode the offset and bitness in a slice.) */
452
453#define CTF_FP_ENCODING(data) (((data) & 0xff000000) >> 24)
454#define CTF_FP_OFFSET(data) (((data) & 0x00ff0000) >> 16)
455#define CTF_FP_BITS(data) (((data) & 0x0000ffff))
456
457#define CTF_FP_DATA(encoding, offset, bits) \
458 (((encoding) << 24) | ((offset) << 16) | (bits))
459
460/* Variant data when kind is CTF_K_FLOAT is an encoding in the top eight bits. */
461#define CTF_FP_ENCODING(data) (((data) & 0xff000000) >> 24)
462
463#define CTF_FP_SINGLE 1 /* IEEE 32-bit float encoding. */
464#define CTF_FP_DOUBLE 2 /* IEEE 64-bit float encoding. */
465#define CTF_FP_CPLX 3 /* Complex encoding. */
466#define CTF_FP_DCPLX 4 /* Double complex encoding. */
467#define CTF_FP_LDCPLX 5 /* Long double complex encoding. */
468#define CTF_FP_LDOUBLE 6 /* Long double encoding. */
469#define CTF_FP_INTRVL 7 /* Interval (2x32-bit) encoding. */
470#define CTF_FP_DINTRVL 8 /* Double interval (2x64-bit) encoding. */
471#define CTF_FP_LDINTRVL 9 /* Long double interval (2x128-bit) encoding. */
472#define CTF_FP_IMAGRY 10 /* Imaginary (32-bit) encoding. */
473#define CTF_FP_DIMAGRY 11 /* Long imaginary (64-bit) encoding. */
474#define CTF_FP_LDIMAGRY 12 /* Long double imaginary (128-bit) encoding. */
475
476#define CTF_FP_MAX 12 /* Maximum possible CTF_FP_* value */
477
478/* A slice increases the offset and reduces the bitness of the referenced
479 ctt_type, which must be a type which has an encoding (fp, int, or enum). We
480 also store the referenced type in here, because it is easier to keep the
481 ctt_size correct for the slice than to shuffle the size into here and keep
7cee1826
NA
482 the ctt_type where it is for other types.
483
484 In a future version, where we loosen requirements on alignment in the CTF
485 file, the cts_offset and cts_bits will be chars: but for now they must be
486 shorts or everything after a slice will become unaligned. */
fceac76e
NA
487
488typedef struct ctf_slice
489{
490 uint32_t cts_type;
7cee1826
NA
491 unsigned short cts_offset;
492 unsigned short cts_bits;
fceac76e
NA
493} ctf_slice_t;
494
495typedef struct ctf_array_v1
496{
497 unsigned short cta_contents; /* Reference to type of array contents. */
498 unsigned short cta_index; /* Reference to type of array index. */
499 uint32_t cta_nelems; /* Number of elements. */
500} ctf_array_v1_t;
501
502typedef struct ctf_array
503{
504 uint32_t cta_contents; /* Reference to type of array contents. */
505 uint32_t cta_index; /* Reference to type of array index. */
506 uint32_t cta_nelems; /* Number of elements. */
507} ctf_array_t;
508
509/* Most structure members have bit offsets that can be expressed using a short.
510 Some don't. ctf_member_t is used for structs which cannot contain any of
511 these large offsets, whereas ctf_lmember_t is used in the latter case. If
512 any member of a given struct has an offset that cannot be expressed using a
513 uint32_t, all members will be stored as type ctf_lmember_t. This is expected
514 to be very rare (but nonetheless possible). */
515
516#define CTF_LSTRUCT_THRESH 536870912
517
518/* In v1, the same is true, except that lmembers are used for structs >= 8192
519 bytes in size. (The ordering of members in the ctf_member_* structures is
520 different to improve padding.) */
521
522#define CTF_LSTRUCT_THRESH_V1 8192
523
524typedef struct ctf_member_v1
525{
526 uint32_t ctm_name; /* Reference to name in string table. */
527 unsigned short ctm_type; /* Reference to type of member. */
528 unsigned short ctm_offset; /* Offset of this member in bits. */
529} ctf_member_v1_t;
530
531typedef struct ctf_lmember_v1
532{
533 uint32_t ctlm_name; /* Reference to name in string table. */
534 unsigned short ctlm_type; /* Reference to type of member. */
535 unsigned short ctlm_pad; /* Padding. */
536 uint32_t ctlm_offsethi; /* High 32 bits of member offset in bits. */
537 uint32_t ctlm_offsetlo; /* Low 32 bits of member offset in bits. */
538} ctf_lmember_v1_t;
539
540typedef struct ctf_member_v2
541{
542 uint32_t ctm_name; /* Reference to name in string table. */
543 uint32_t ctm_offset; /* Offset of this member in bits. */
544 uint32_t ctm_type; /* Reference to type of member. */
545} ctf_member_t;
546
547typedef struct ctf_lmember_v2
548{
549 uint32_t ctlm_name; /* Reference to name in string table. */
550 uint32_t ctlm_offsethi; /* High 32 bits of member offset in bits. */
551 uint32_t ctlm_type; /* Reference to type of member. */
552 uint32_t ctlm_offsetlo; /* Low 32 bits of member offset in bits. */
553} ctf_lmember_t;
554
555#define CTF_LMEM_OFFSET(ctlmp) \
556 (((uint64_t)(ctlmp)->ctlm_offsethi) << 32 | (ctlmp)->ctlm_offsetlo)
557#define CTF_OFFSET_TO_LMEMHI(offset) ((uint32_t)((uint64_t)(offset) >> 32))
558#define CTF_OFFSET_TO_LMEMLO(offset) ((uint32_t)(offset))
559
560typedef struct ctf_enum
561{
562 uint32_t cte_name; /* Reference to name in string table. */
a610aa4f 563 int32_t cte_value; /* Value associated with this name. */
fceac76e
NA
564} ctf_enum_t;
565
139633c3 566/* The ctf_archive is a collection of ctf_dict_t's stored together. The format
9402cc59
NA
567 is suitable for mmap()ing: this control structure merely describes the
568 mmap()ed archive (and overlaps the first few bytes of it), hence the
569 greater care taken with integral types. All CTF files in an archive
570 must have the same data model. (This is not validated.)
571
572 All integers in this structure are stored in little-endian byte order.
573
574 The code relies on the fact that everything in this header is a uint64_t
575 and thus the header needs no padding (in particular, that no padding is
576 needed between ctfa_ctfs and the unnamed ctfa_archive_modent array
577 that follows it).
578
579 This is *not* the same as the data structure returned by the ctf_arc_*()
580 functions: this is the low-level on-disk representation. */
581
582#define CTFA_MAGIC 0x8b47f2a4d7623eeb /* Random. */
583struct ctf_archive
584{
585 /* Magic number. (In loaded files, overwritten with the file size
586 so ctf_arc_close() knows how much to munmap()). */
587 uint64_t ctfa_magic;
588
589 /* CTF data model. */
590 uint64_t ctfa_model;
591
139633c3
NA
592 /* Number of CTF dicts in the archive. */
593 uint64_t ctfa_ndicts;
9402cc59
NA
594
595 /* Offset of the name table. */
596 uint64_t ctfa_names;
597
598 /* Offset of the CTF table. Each element starts with a size (a uint64_t
139633c3 599 in network byte order) then a ctf_dict_t of that size. */
9402cc59
NA
600 uint64_t ctfa_ctfs;
601};
602
603/* An array of ctfa_nnamed of this structure lies at
604 ctf_archive[ctf_archive->ctfa_modents] and gives the ctfa_ctfs or
139633c3 605 ctfa_names-relative offsets of each name or ctf_dict_t. */
9402cc59
NA
606
607typedef struct ctf_archive_modent
608{
609 uint64_t name_offset;
610 uint64_t ctf_offset;
611} ctf_archive_modent_t;
612
fceac76e
NA
613#ifdef __cplusplus
614}
615#endif
616
617#endif /* _CTF_H */