]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - include/ctf-api.h
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / include / ctf-api.h
CommitLineData
2e94b056 1/* Public API to libctf.
250d07de 2 Copyright (C) 2019-2021 Free Software Foundation, Inc.
2e94b056
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/* This header file defines the interfaces available from the CTF debugger
21 library, libctf. This API can be used by a debugger to operate on data in
22 the Compact ANSI-C Type Format (CTF). */
23
24#ifndef _CTF_API_H
25#define _CTF_API_H
26
2e94b056
NA
27#include <sys/types.h>
28#include <ctf.h>
47d546f4 29#include <zlib.h>
2e94b056
NA
30
31#ifdef __cplusplus
32extern "C"
b64751cf 33{
2e94b056
NA
34#endif
35
36/* Clients can open one or more CTF containers and obtain a pointer to an
139633c3 37 opaque ctf_dict_t. Types are identified by an opaque ctf_id_t token.
2e94b056
NA
38 They can also open or create read-only archives of CTF containers in a
39 ctf_archive_t.
40
41 These opaque definitions allow libctf to evolve without breaking clients. */
42
139633c3 43typedef struct ctf_dict ctf_dict_t;
2e94b056 44typedef struct ctf_archive_internal ctf_archive_t;
a0486bac 45typedef unsigned long ctf_id_t;
2e94b056 46
143dce84
NA
47/* This opaque definition allows libctf to accept BFD data structures without
48 importing all the BFD noise into users' namespaces. */
49
50struct bfd;
51
47d546f4
NA
52/* If the debugger needs to provide the CTF library with a set of raw buffers
53 for use as the CTF data, symbol table, and string table, it can do so by
53651de8 54 filling in ctf_sect_t structures and passing them to ctf_bufopen.
47d546f4 55
53651de8
NA
56 The contents of this structure must always be in native endianness. At read
57 time, the symbol table endianness is derived from the BFD target (if BFD is
58 in use): if a BFD target is not in use, please call ctf_symsect_endianness or
59 ctf_arc_symsect_endianness. */
47d546f4
NA
60
61typedef struct ctf_sect
62{
63 const char *cts_name; /* Section name (if any). */
47d546f4
NA
64 const void *cts_data; /* Pointer to section data. */
65 size_t cts_size; /* Size of data in bytes. */
66 size_t cts_entsize; /* Size of each section entry (symtab only). */
47d546f4
NA
67} ctf_sect_t;
68
72c83edd 69/* A minimal symbol extracted from a linker's internal symbol table
3d16b64e
NA
70 representation. The symbol name can be given either via st_name or via a
71 strtab offset in st_nameidx, which corresponds to one of the string offsets
53651de8 72 communicated via the ctf_link_add_strtab callback. */
72c83edd
NA
73
74typedef struct ctf_link_sym
75{
3d16b64e 76 /* The st_name and st_nameidx will not be accessed outside the call to
53651de8 77 ctf_link_shuffle_syms. If you set st_nameidx to offset zero, make sure
3d16b64e 78 to set st_nameidx_set as well. */
72c83edd
NA
79
80 const char *st_name;
3d16b64e
NA
81 size_t st_nameidx;
82 int st_nameidx_set;
83 uint32_t st_symidx;
72c83edd
NA
84 uint32_t st_shndx;
85 uint32_t st_type;
86 uint32_t st_value;
87} ctf_link_sym_t;
88
5f54462c 89/* Flags applying to this specific link. */
72c83edd 90
b64751cf 91/* Share all types that are not in conflict. The default. */
72c83edd
NA
92#define CTF_LINK_SHARE_UNCONFLICTED 0x0
93
0f0c11f7 94/* Share only types that are used by multiple inputs. */
72c83edd
NA
95#define CTF_LINK_SHARE_DUPLICATED 0x1
96
662df3c3
NA
97/* Do a nondeduplicating link. */
98#define CTF_LINK_NONDEDUP 0x2
99
5f54462c
NA
100/* Create empty outputs for all registered CU mappings even if no types are
101 emitted into them. */
102#define CTF_LINK_EMPTY_CU_MAPPINGS 0x4
103
e3e8411b
NA
104/* Omit the content of the variables section. */
105#define CTF_LINK_OMIT_VARIABLES_SECTION 0x8
106
47d546f4
NA
107/* Symbolic names for CTF sections. */
108
109typedef enum ctf_sect_names
110 {
111 CTF_SECT_HEADER,
112 CTF_SECT_LABEL,
113 CTF_SECT_OBJT,
2c78e925 114 CTF_SECT_OBJTIDX = CTF_SECT_OBJT,
47d546f4 115 CTF_SECT_FUNC,
2c78e925 116 CTF_SECT_FUNCIDX = CTF_SECT_FUNC,
47d546f4
NA
117 CTF_SECT_VAR,
118 CTF_SECT_TYPE,
119 CTF_SECT_STR
120 } ctf_sect_names_t;
121
122/* Encoding information for integers, floating-point values, and certain other
53651de8 123 intrinsics can be obtained by calling ctf_type_encoding, below. The flags
47d546f4
NA
124 field will contain values appropriate for the type defined in <ctf.h>. */
125
126typedef struct ctf_encoding
127{
128 uint32_t cte_format; /* Data format (CTF_INT_* or CTF_FP_* flags). */
129 uint32_t cte_offset; /* Offset of value in bits. */
130 uint32_t cte_bits; /* Size of storage in bits. */
131} ctf_encoding_t;
132
133typedef struct ctf_membinfo
134{
135 ctf_id_t ctm_type; /* Type of struct or union member. */
136 unsigned long ctm_offset; /* Offset of member in bits. */
137} ctf_membinfo_t;
138
139typedef struct ctf_arinfo
140{
141 ctf_id_t ctr_contents; /* Type of array contents. */
142 ctf_id_t ctr_index; /* Type of array index. */
143 uint32_t ctr_nelems; /* Number of elements. */
144} ctf_arinfo_t;
145
146typedef struct ctf_funcinfo
147{
148 ctf_id_t ctc_return; /* Function return type. */
149 uint32_t ctc_argc; /* Number of typed arguments to function. */
150 uint32_t ctc_flags; /* Function attributes (see below). */
151} ctf_funcinfo_t;
152
153typedef struct ctf_lblinfo
154{
155 ctf_id_t ctb_type; /* Last type associated with the label. */
156} ctf_lblinfo_t;
157
158typedef struct ctf_snapshot_id
159{
160 unsigned long dtd_id; /* Highest DTD ID at time of snapshot. */
161 unsigned long snapshot_id; /* Snapshot id at time of snapshot. */
162} ctf_snapshot_id_t;
163
164#define CTF_FUNC_VARARG 0x1 /* Function arguments end with varargs. */
165
a0486bac 166/* Functions that return a ctf_id_t use the following value to indicate failure.
53651de8
NA
167 ctf_errno can be used to obtain an error code. Functions that return
168 a straight integral -1 also use ctf_errno. */
a0486bac 169#define CTF_ERR ((ctf_id_t) -1L)
2e94b056 170
0d01fbe6
TT
171/* This macro holds information about all the available ctf errors.
172 It is used to form both an enum holding all the error constants,
173 and also the error strings themselves. To use, define _CTF_FIRST
174 and _CTF_ITEM to expand as you like, then mention the macro name.
175 See the enum after this for an example. */
176#define _CTF_ERRORS \
177 _CTF_FIRST (ECTF_FMT, "File is not in CTF or ELF format.") \
178 _CTF_ITEM (ECTF_BFDERR, "BFD error.") \
179 _CTF_ITEM (ECTF_CTFVERS, "CTF dict version is too new for libctf.") \
180 _CTF_ITEM (ECTF_BFD_AMBIGUOUS, "Ambiguous BFD target.") \
181 _CTF_ITEM (ECTF_SYMTAB, "Symbol table uses invalid entry size.") \
182 _CTF_ITEM (ECTF_SYMBAD, "Symbol table data buffer is not valid.") \
183 _CTF_ITEM (ECTF_STRBAD, "String table data buffer is not valid.") \
184 _CTF_ITEM (ECTF_CORRUPT, "File data structure corruption detected.") \
185 _CTF_ITEM (ECTF_NOCTFDATA, "File does not contain CTF data.") \
186 _CTF_ITEM (ECTF_NOCTFBUF, "Buffer does not contain CTF data.") \
187 _CTF_ITEM (ECTF_NOSYMTAB, "Symbol table information is not available.") \
188 _CTF_ITEM (ECTF_NOPARENT, "The parent CTF dictionary is unavailable.") \
189 _CTF_ITEM (ECTF_DMODEL, "Data model mismatch.") \
190 _CTF_ITEM (ECTF_LINKADDEDLATE, "File added to link too late.") \
191 _CTF_ITEM (ECTF_ZALLOC, "Failed to allocate (de)compression buffer.") \
192 _CTF_ITEM (ECTF_DECOMPRESS, "Failed to decompress CTF data.") \
193 _CTF_ITEM (ECTF_STRTAB, "External string table is not available.") \
194 _CTF_ITEM (ECTF_BADNAME, "String name offset is corrupt.") \
195 _CTF_ITEM (ECTF_BADID, "Invalid type identifier.") \
196 _CTF_ITEM (ECTF_NOTSOU, "Type is not a struct or union.") \
197 _CTF_ITEM (ECTF_NOTENUM, "Type is not an enum.") \
198 _CTF_ITEM (ECTF_NOTSUE, "Type is not a struct, union, or enum.") \
199 _CTF_ITEM (ECTF_NOTINTFP, "Type is not an integer, float, or enum.") \
200 _CTF_ITEM (ECTF_NOTARRAY, "Type is not an array.") \
201 _CTF_ITEM (ECTF_NOTREF, "Type does not reference another type.") \
202 _CTF_ITEM (ECTF_NAMELEN, "Buffer is too small to hold type name.") \
203 _CTF_ITEM (ECTF_NOTYPE, "No type found corresponding to name.") \
204 _CTF_ITEM (ECTF_SYNTAX, "Syntax error in type name.") \
205 _CTF_ITEM (ECTF_NOTFUNC, "Symbol table entry or type is not a function.") \
206 _CTF_ITEM (ECTF_NOFUNCDAT, "No function information available for function.") \
207 _CTF_ITEM (ECTF_NOTDATA, "Symbol table entry does not refer to a data object.") \
208 _CTF_ITEM (ECTF_NOTYPEDAT, "No type information available for symbol.") \
209 _CTF_ITEM (ECTF_NOLABEL, "No label found corresponding to name.") \
210 _CTF_ITEM (ECTF_NOLABELDATA, "File does not contain any labels.") \
211 _CTF_ITEM (ECTF_NOTSUP, "Feature not supported.") \
212 _CTF_ITEM (ECTF_NOENUMNAM, "Enum element name not found.") \
213 _CTF_ITEM (ECTF_NOMEMBNAM, "Member name not found.") \
214 _CTF_ITEM (ECTF_RDONLY, "CTF container is read-only.") \
215 _CTF_ITEM (ECTF_DTFULL, "CTF type is full (no more members allowed).") \
216 _CTF_ITEM (ECTF_FULL, "CTF container is full.") \
217 _CTF_ITEM (ECTF_DUPLICATE, "Duplicate member or variable name.") \
218 _CTF_ITEM (ECTF_CONFLICT, "Conflicting type is already defined.") \
219 _CTF_ITEM (ECTF_OVERROLLBACK, "Attempt to roll back past a ctf_update.") \
220 _CTF_ITEM (ECTF_COMPRESS, "Failed to compress CTF data.") \
221 _CTF_ITEM (ECTF_ARCREATE, "Error creating CTF archive.") \
222 _CTF_ITEM (ECTF_ARNNAME, "Name not found in CTF archive.") \
223 _CTF_ITEM (ECTF_SLICEOVERFLOW, "Overflow of type bitness or offset in slice.") \
224 _CTF_ITEM (ECTF_DUMPSECTUNKNOWN, "Unknown section number in dump.") \
225 _CTF_ITEM (ECTF_DUMPSECTCHANGED, "Section changed in middle of dump.") \
226 _CTF_ITEM (ECTF_NOTYET, "Feature not yet implemented.") \
227 _CTF_ITEM (ECTF_INTERNAL, "Internal error: assertion failure.") \
228 _CTF_ITEM (ECTF_NONREPRESENTABLE, "Type not representable in CTF.") \
229 _CTF_ITEM (ECTF_NEXT_END, "End of iteration.") \
230 _CTF_ITEM (ECTF_NEXT_WRONGFUN, "Wrong iteration function called.") \
231 _CTF_ITEM (ECTF_NEXT_WRONGFP, "Iteration entity changed in mid-iterate.") \
232 _CTF_ITEM (ECTF_FLAGS, "CTF header contains flags unknown to libctf.") \
233 _CTF_ITEM (ECTF_NEEDSBFD, "This feature needs a libctf with BFD support.")
2e94b056 234
0d01fbe6 235#define ECTF_BASE 1000 /* Base value for libctf errnos. */
2e94b056
NA
236
237enum
238 {
0d01fbe6
TT
239#define _CTF_FIRST(NAME, STR) NAME = ECTF_BASE
240#define _CTF_ITEM(NAME, STR) , NAME
241_CTF_ERRORS
242#undef _CTF_ITEM
243#undef _CTF_FIRST
2e94b056
NA
244 };
245
8d2229ad 246#define ECTF_NERR (ECTF_NEEDSBFD - ECTF_BASE + 1) /* Count of CTF errors. */
7eea9d3b 247
2e94b056 248/* The CTF data model is inferred to be the caller's data model or the data
53651de8 249 model of the given object, unless ctf_setmodel is explicitly called. */
2e94b056
NA
250#define CTF_MODEL_ILP32 1 /* Object data model is ILP32. */
251#define CTF_MODEL_LP64 2 /* Object data model is LP64. */
252#ifdef _LP64
253# define CTF_MODEL_NATIVE CTF_MODEL_LP64
254#else
255# define CTF_MODEL_NATIVE CTF_MODEL_ILP32
256#endif
257
53651de8 258/* Dynamic CTF containers can be created using ctf_create. The ctf_add_*
2e94b056
NA
259 routines can be used to add new definitions to the dynamic container.
260 New types are labeled as root or non-root to determine whether they are
261 visible at the top-level program scope when subsequently doing a lookup. */
262
263#define CTF_ADD_NONROOT 0 /* Type only visible in nested scope. */
264#define CTF_ADD_ROOT 1 /* Type visible at top-level scope. */
265
688d28f6
NA
266/* These typedefs are used to define the signature for callback functions that
267 can be used with the iteration and visit functions below. There is also a
268 family of iteration functions that do not require callbacks. */
9402cc59 269
316afdb1
NA
270typedef int ctf_visit_f (const char *name, ctf_id_t type, unsigned long offset,
271 int depth, void *arg);
272typedef int ctf_member_f (const char *name, ctf_id_t membtype,
273 unsigned long offset, void *arg);
274typedef int ctf_enum_f (const char *name, int val, void *arg);
275typedef int ctf_variable_f (const char *name, ctf_id_t type, void *arg);
276typedef int ctf_type_f (ctf_id_t type, void *arg);
0ac62312 277typedef int ctf_type_all_f (ctf_id_t type, int flag, void *arg);
6dbf2b73
NA
278typedef int ctf_label_f (const char *name, const ctf_lblinfo_t *info,
279 void *arg);
139633c3 280typedef int ctf_archive_member_f (ctf_dict_t *fp, const char *name, void *arg);
9402cc59
NA
281typedef int ctf_archive_raw_member_f (const char *name, const void *content,
282 size_t len, void *arg);
a30b3e18
NA
283typedef char *ctf_dump_decorate_f (ctf_sect_names_t sect,
284 char *line, void *arg);
285
286typedef struct ctf_dump_state ctf_dump_state_t;
9402cc59 287
53651de8 288/* Iteration state for the _next functions, and allocators/copiers/freers for
688d28f6 289 it. (None of these are needed for the simple case of iterating to the end:
53651de8 290 the _next function allocate and free the iterators for you.) */
688d28f6
NA
291
292typedef struct ctf_next ctf_next_t;
293extern ctf_next_t *ctf_next_create (void);
294extern void ctf_next_destroy (ctf_next_t *);
295extern ctf_next_t *ctf_next_copy (ctf_next_t *);
296
143dce84
NA
297/* Opening. These mostly return an abstraction over both CTF files and CTF
298 archives: so they can be used to open both. CTF files will appear to be an
299 archive with one member named '.ctf'. The low-level functions
53651de8 300 ctf_simple_open and ctf_bufopen return ctf_dict_t's directly, and cannot
143dce84
NA
301 be used on CTF archives. */
302
303extern ctf_archive_t *ctf_bfdopen (struct bfd *, int *);
304extern ctf_archive_t *ctf_bfdopen_ctfsect (struct bfd *, const ctf_sect_t *,
305 int *);
306extern ctf_archive_t *ctf_fdopen (int fd, const char *filename,
307 const char *target, int *errp);
308extern ctf_archive_t *ctf_open (const char *filename,
309 const char *target, int *errp);
310extern void ctf_close (ctf_archive_t *);
139633c3 311extern ctf_sect_t ctf_getdatasect (const ctf_dict_t *);
97a2a623
NA
312extern ctf_sect_t ctf_getsymsect (const ctf_dict_t *);
313extern ctf_sect_t ctf_getstrsect (const ctf_dict_t *);
53651de8 314extern void ctf_symsect_endianness (ctf_dict_t *, int little_endian);
139633c3 315extern ctf_archive_t *ctf_get_arc (const ctf_dict_t *);
143dce84 316extern ctf_archive_t *ctf_arc_open (const char *, int *);
2f6ecaed
NA
317extern ctf_archive_t *ctf_arc_bufopen (const ctf_sect_t *,
318 const ctf_sect_t *,
319 const ctf_sect_t *,
320 int *);
53651de8 321extern void ctf_arc_symsect_endianness (ctf_archive_t *, int little_endian);
9402cc59 322extern void ctf_arc_close (ctf_archive_t *);
2c78e925
NA
323extern ctf_dict_t *ctf_arc_lookup_symbol (ctf_archive_t *,
324 unsigned long symidx,
325 ctf_id_t *, int *errp);
326extern void ctf_arc_flush_caches (ctf_archive_t *);
ae41200b
NA
327extern ctf_dict_t *ctf_dict_open (const ctf_archive_t *,
328 const char *, int *);
329extern ctf_dict_t *ctf_dict_open_sections (const ctf_archive_t *,
330 const ctf_sect_t *,
331 const ctf_sect_t *,
332 const char *, int *);
9c23dfa5 333extern size_t ctf_archive_count (const ctf_archive_t *);
9402cc59
NA
334
335/* The next functions return or close real CTF files, or write out CTF archives,
336 not opaque containers around either. */
337
139633c3 338extern ctf_dict_t *ctf_simple_open (const char *, size_t, const char *, size_t,
47d546f4 339 size_t, const char *, size_t, int *);
139633c3 340extern ctf_dict_t *ctf_bufopen (const ctf_sect_t *, const ctf_sect_t *,
47d546f4 341 const ctf_sect_t *, int *);
139633c3
NA
342extern void ctf_ref (ctf_dict_t *);
343extern void ctf_dict_close (ctf_dict_t *);
72f33921 344
139633c3 345extern int ctf_arc_write (const char *, ctf_dict_t **, size_t,
9402cc59 346 const char **, size_t);
139633c3 347extern int ctf_arc_write_fd (int, ctf_dict_t **, size_t, const char **,
5537f9b9 348 size_t);
9402cc59 349
139633c3
NA
350extern const char *ctf_cuname (ctf_dict_t *);
351extern int ctf_cuname_set (ctf_dict_t *, const char *);
352extern ctf_dict_t *ctf_parent_dict (ctf_dict_t *);
353extern const char *ctf_parent_name (ctf_dict_t *);
354extern int ctf_parent_name_set (ctf_dict_t *, const char *);
355extern int ctf_type_isparent (ctf_dict_t *, ctf_id_t);
356extern int ctf_type_ischild (ctf_dict_t *, ctf_id_t);
72f33921 357
139633c3
NA
358extern int ctf_import (ctf_dict_t *, ctf_dict_t *);
359extern int ctf_setmodel (ctf_dict_t *, int);
360extern int ctf_getmodel (ctf_dict_t *);
72f33921 361
139633c3
NA
362extern void ctf_setspecific (ctf_dict_t *, void *);
363extern void *ctf_getspecific (ctf_dict_t *);
47d546f4 364
139633c3 365extern int ctf_errno (ctf_dict_t *);
479604f4 366extern const char *ctf_errmsg (int);
6c33b742 367extern int ctf_version (int);
316afdb1 368
139633c3
NA
369extern int ctf_func_info (ctf_dict_t *, unsigned long, ctf_funcinfo_t *);
370extern int ctf_func_args (ctf_dict_t *, unsigned long, uint32_t, ctf_id_t *);
371extern int ctf_func_type_info (ctf_dict_t *, ctf_id_t, ctf_funcinfo_t *);
372extern int ctf_func_type_args (ctf_dict_t *, ctf_id_t, uint32_t, ctf_id_t *);
373
374extern ctf_id_t ctf_lookup_by_name (ctf_dict_t *, const char *);
375extern ctf_id_t ctf_lookup_by_symbol (ctf_dict_t *, unsigned long);
1136c379
NA
376extern ctf_id_t ctf_symbol_next (ctf_dict_t *, ctf_next_t **,
377 const char **name, int functions);
139633c3
NA
378extern ctf_id_t ctf_lookup_variable (ctf_dict_t *, const char *);
379
380extern ctf_id_t ctf_type_resolve (ctf_dict_t *, ctf_id_t);
381extern char *ctf_type_aname (ctf_dict_t *, ctf_id_t);
382extern char *ctf_type_aname_raw (ctf_dict_t *, ctf_id_t);
383extern ssize_t ctf_type_lname (ctf_dict_t *, ctf_id_t, char *, size_t);
384extern char *ctf_type_name (ctf_dict_t *, ctf_id_t, char *, size_t);
385extern const char *ctf_type_name_raw (ctf_dict_t *, ctf_id_t);
386extern ssize_t ctf_type_size (ctf_dict_t *, ctf_id_t);
387extern ssize_t ctf_type_align (ctf_dict_t *, ctf_id_t);
388extern int ctf_type_kind (ctf_dict_t *, ctf_id_t);
389extern int ctf_type_kind_forwarded (ctf_dict_t *, ctf_id_t);
390extern ctf_id_t ctf_type_reference (ctf_dict_t *, ctf_id_t);
391extern ctf_id_t ctf_type_pointer (ctf_dict_t *, ctf_id_t);
392extern int ctf_type_encoding (ctf_dict_t *, ctf_id_t, ctf_encoding_t *);
393extern int ctf_type_visit (ctf_dict_t *, ctf_id_t, ctf_visit_f *, void *);
394extern int ctf_type_cmp (ctf_dict_t *, ctf_id_t, ctf_dict_t *, ctf_id_t);
395extern int ctf_type_compat (ctf_dict_t *, ctf_id_t, ctf_dict_t *, ctf_id_t);
396
397extern int ctf_member_info (ctf_dict_t *, ctf_id_t, const char *,
316afdb1 398 ctf_membinfo_t *);
139633c3 399extern int ctf_array_info (ctf_dict_t *, ctf_id_t, ctf_arinfo_t *);
316afdb1 400
139633c3
NA
401extern const char *ctf_enum_name (ctf_dict_t *, ctf_id_t, int);
402extern int ctf_enum_value (ctf_dict_t *, ctf_id_t, const char *, int *);
316afdb1 403
139633c3
NA
404extern void ctf_label_set (ctf_dict_t *, const char *);
405extern const char *ctf_label_get (ctf_dict_t *);
6dbf2b73 406
139633c3
NA
407extern const char *ctf_label_topmost (ctf_dict_t *);
408extern int ctf_label_info (ctf_dict_t *, const char *, ctf_lblinfo_t *);
6dbf2b73 409
139633c3
NA
410extern int ctf_member_count (ctf_dict_t *, ctf_id_t);
411extern int ctf_member_iter (ctf_dict_t *, ctf_id_t, ctf_member_f *, void *);
412extern ssize_t ctf_member_next (ctf_dict_t *, ctf_id_t, ctf_next_t **,
688d28f6 413 const char **name, ctf_id_t *membtype);
139633c3
NA
414extern int ctf_enum_iter (ctf_dict_t *, ctf_id_t, ctf_enum_f *, void *);
415extern const char *ctf_enum_next (ctf_dict_t *, ctf_id_t, ctf_next_t **,
688d28f6 416 int *);
139633c3
NA
417extern int ctf_type_iter (ctf_dict_t *, ctf_type_f *, void *);
418extern int ctf_type_iter_all (ctf_dict_t *, ctf_type_all_f *, void *);
419extern ctf_id_t ctf_type_next (ctf_dict_t *, ctf_next_t **,
688d28f6 420 int *flag, int want_hidden);
139633c3
NA
421extern int ctf_label_iter (ctf_dict_t *, ctf_label_f *, void *);
422extern int ctf_label_next (ctf_dict_t *, ctf_next_t **, const char **); /* TBD */
423extern int ctf_variable_iter (ctf_dict_t *, ctf_variable_f *, void *);
424extern ctf_id_t ctf_variable_next (ctf_dict_t *, ctf_next_t **,
688d28f6 425 const char **);
9402cc59
NA
426extern int ctf_archive_iter (const ctf_archive_t *, ctf_archive_member_f *,
427 void *);
139633c3 428extern ctf_dict_t *ctf_archive_next (const ctf_archive_t *, ctf_next_t **,
688d28f6
NA
429 const char **, int skip_parent, int *errp);
430
9402cc59
NA
431/* This function alone does not currently operate on CTF files masquerading
432 as archives, and returns -EINVAL: the raw data is no longer available. It is
433 expected to be used only by archiving tools, in any case, which have no need
434 to deal with non-archives at all. */
435extern int ctf_archive_raw_iter (const ctf_archive_t *,
436 ctf_archive_raw_member_f *, void *);
139633c3 437extern char *ctf_dump (ctf_dict_t *, ctf_dump_state_t **state,
a30b3e18
NA
438 ctf_sect_names_t sect, ctf_dump_decorate_f *,
439 void *arg);
316afdb1 440
8b37e7b6
NA
441/* Error-warning reporting: an 'iterator' that returns errors and warnings from
442 the error/warning list, in order of emission. Errors and warnings are popped
443 after return: the caller must free the returned error-text pointer. */
139633c3 444extern char *ctf_errwarning_next (ctf_dict_t *, ctf_next_t **,
926c9e76 445 int *is_warning, int *errp);
8b37e7b6 446
139633c3 447extern ctf_id_t ctf_add_array (ctf_dict_t *, uint32_t,
47d546f4 448 const ctf_arinfo_t *);
139633c3
NA
449extern ctf_id_t ctf_add_const (ctf_dict_t *, uint32_t, ctf_id_t);
450extern ctf_id_t ctf_add_enum_encoded (ctf_dict_t *, uint32_t, const char *,
47d546f4 451 const ctf_encoding_t *);
139633c3
NA
452extern ctf_id_t ctf_add_enum (ctf_dict_t *, uint32_t, const char *);
453extern ctf_id_t ctf_add_float (ctf_dict_t *, uint32_t,
47d546f4 454 const char *, const ctf_encoding_t *);
139633c3 455extern ctf_id_t ctf_add_forward (ctf_dict_t *, uint32_t, const char *,
47d546f4 456 uint32_t);
139633c3 457extern ctf_id_t ctf_add_function (ctf_dict_t *, uint32_t,
47d546f4 458 const ctf_funcinfo_t *, const ctf_id_t *);
139633c3 459extern ctf_id_t ctf_add_integer (ctf_dict_t *, uint32_t, const char *,
47d546f4 460 const ctf_encoding_t *);
139633c3
NA
461extern ctf_id_t ctf_add_slice (ctf_dict_t *, uint32_t, ctf_id_t, const ctf_encoding_t *);
462extern ctf_id_t ctf_add_pointer (ctf_dict_t *, uint32_t, ctf_id_t);
463extern ctf_id_t ctf_add_type (ctf_dict_t *, ctf_dict_t *, ctf_id_t);
464extern ctf_id_t ctf_add_typedef (ctf_dict_t *, uint32_t, const char *,
47d546f4 465 ctf_id_t);
139633c3
NA
466extern ctf_id_t ctf_add_restrict (ctf_dict_t *, uint32_t, ctf_id_t);
467extern ctf_id_t ctf_add_struct (ctf_dict_t *, uint32_t, const char *);
468extern ctf_id_t ctf_add_union (ctf_dict_t *, uint32_t, const char *);
469extern ctf_id_t ctf_add_struct_sized (ctf_dict_t *, uint32_t, const char *,
47d546f4 470 size_t);
139633c3 471extern ctf_id_t ctf_add_union_sized (ctf_dict_t *, uint32_t, const char *,
47d546f4 472 size_t);
139633c3 473extern ctf_id_t ctf_add_volatile (ctf_dict_t *, uint32_t, ctf_id_t);
47d546f4 474
139633c3
NA
475extern int ctf_add_enumerator (ctf_dict_t *, ctf_id_t, const char *, int);
476extern int ctf_add_member (ctf_dict_t *, ctf_id_t, const char *, ctf_id_t);
477extern int ctf_add_member_offset (ctf_dict_t *, ctf_id_t, const char *,
47d546f4 478 ctf_id_t, unsigned long);
139633c3 479extern int ctf_add_member_encoded (ctf_dict_t *, ctf_id_t, const char *,
47d546f4
NA
480 ctf_id_t, unsigned long,
481 const ctf_encoding_t);
482
139633c3 483extern int ctf_add_variable (ctf_dict_t *, const char *, ctf_id_t);
47d546f4 484
1136c379
NA
485extern int ctf_add_objt_sym (ctf_dict_t *, const char *, ctf_id_t);
486extern int ctf_add_func_sym (ctf_dict_t *, const char *, ctf_id_t);
487
139633c3 488extern int ctf_set_array (ctf_dict_t *, ctf_id_t, const ctf_arinfo_t *);
47d546f4 489
139633c3
NA
490extern ctf_dict_t *ctf_create (int *);
491extern int ctf_update (ctf_dict_t *);
492extern ctf_snapshot_id_t ctf_snapshot (ctf_dict_t *);
493extern int ctf_rollback (ctf_dict_t *, ctf_snapshot_id_t);
494extern int ctf_discard (ctf_dict_t *);
495extern int ctf_write (ctf_dict_t *, int);
496extern int ctf_gzwrite (ctf_dict_t *fp, gzFile fd);
497extern int ctf_compress_write (ctf_dict_t * fp, int fd);
498extern unsigned char *ctf_write_mem (ctf_dict_t *, size_t *, size_t threshold);
2e94b056 499
139633c3 500extern int ctf_link_add_ctf (ctf_dict_t *, ctf_archive_t *, const char *);
6dd2819f
NA
501/* The variable filter should return nonzero if a variable should not
502 appear in the output. */
139633c3 503typedef int ctf_link_variable_filter_f (ctf_dict_t *, const char *, ctf_id_t,
6dd2819f 504 void *);
139633c3 505extern int ctf_link_set_variable_filter (ctf_dict_t *,
6dd2819f 506 ctf_link_variable_filter_f *, void *);
139633c3 507extern int ctf_link (ctf_dict_t *, int flags);
72c83edd 508typedef const char *ctf_link_strtab_string_f (uint32_t *offset, void *arg);
139633c3 509extern int ctf_link_add_strtab (ctf_dict_t *, ctf_link_strtab_string_f *,
72c83edd 510 void *);
3d16b64e
NA
511extern int ctf_link_add_linker_symbol (ctf_dict_t *, ctf_link_sym_t *);
512extern int ctf_link_shuffle_syms (ctf_dict_t *);
139633c3 513extern unsigned char *ctf_link_write (ctf_dict_t *, size_t *size,
72c83edd
NA
514 size_t threshold);
515
49ea9b45 516/* Specialist linker functions. These functions are not used by ld, but can be
b64751cf 517 used by other programs making use of the linker machinery for other purposes
49ea9b45 518 to customize its output. */
139633c3 519extern int ctf_link_add_cu_mapping (ctf_dict_t *, const char *from,
49ea9b45 520 const char *to);
139633c3 521typedef char *ctf_link_memb_name_changer_f (ctf_dict_t *,
49ea9b45
NA
522 const char *, void *);
523extern void ctf_link_set_memb_name_changer
139633c3 524 (ctf_dict_t *, ctf_link_memb_name_changer_f *, void *);
49ea9b45 525
60da9d95
NA
526extern void ctf_setdebug (int debug);
527extern int ctf_getdebug (void);
528
139633c3
NA
529/* Deprecated aliases for existing functions and types. */
530
531struct ctf_file;
532typedef struct ctf_dict ctf_file_t;
533extern void ctf_file_close (ctf_file_t *);
534extern ctf_dict_t *ctf_parent_file (ctf_dict_t *);
ae41200b
NA
535extern ctf_dict_t *ctf_arc_open_by_name (const ctf_archive_t *,
536 const char *, int *);
537extern ctf_dict_t *ctf_arc_open_by_name_sections (const ctf_archive_t *,
538 const ctf_sect_t *,
539 const ctf_sect_t *,
540 const char *, int *);
139633c3 541
2e94b056
NA
542#ifdef __cplusplus
543}
544#endif
545
546#endif /* _CTF_API_H */