Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2024-05-18 08:29:41

0001 /* Public API to libctf.
0002    Copyright (C) 2019-2022 Free Software Foundation, Inc.
0003 
0004    This file is part of libctf.
0005 
0006    libctf is free software; you can redistribute it and/or modify it under
0007    the terms of the GNU General Public License as published by the Free
0008    Software Foundation; either version 3, or (at your option) any later
0009    version.
0010 
0011    This program is distributed in the hope that it will be useful, but
0012    WITHOUT ANY WARRANTY; without even the implied warranty of
0013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
0014    See the GNU General Public License for more details.
0015 
0016    You should have received a copy of the GNU General Public License
0017    along with this program; see the file COPYING.  If not see
0018    <http://www.gnu.org/licenses/>.  */
0019 
0020 /* This header file defines the interfaces available from the CTF debugger
0021    library, libctf.  This API can be used by a debugger to operate on data in
0022    the Compact ANSI-C Type Format (CTF).  */
0023 
0024 #ifndef _CTF_API_H
0025 #define _CTF_API_H
0026 
0027 #include <sys/types.h>
0028 #include <ctf.h>
0029 #include <zlib.h>
0030 
0031 #ifdef  __cplusplus
0032 extern "C"
0033 {
0034 #endif
0035 
0036 /* Clients can open one or more CTF containers and obtain a pointer to an
0037    opaque ctf_dict_t.  Types are identified by an opaque ctf_id_t token.
0038    They can also open or create read-only archives of CTF containers in a
0039    ctf_archive_t.
0040 
0041    These opaque definitions allow libctf to evolve without breaking clients.  */
0042 
0043 typedef struct ctf_dict ctf_dict_t;
0044 typedef struct ctf_archive_internal ctf_archive_t;
0045 typedef unsigned long ctf_id_t;
0046 
0047 /* This opaque definition allows libctf to accept BFD data structures without
0048    importing all the BFD noise into users' namespaces.  */
0049 
0050 struct bfd;
0051 
0052 /* If the debugger needs to provide the CTF library with a set of raw buffers
0053    for use as the CTF data, symbol table, and string table, it can do so by
0054    filling in ctf_sect_t structures and passing them to ctf_bufopen.
0055 
0056    The contents of this structure must always be in native endianness.  At read
0057    time, the symbol table endianness is derived from the BFD target (if BFD is
0058    in use): if a BFD target is not in use, please call ctf_symsect_endianness or
0059    ctf_arc_symsect_endianness.  */
0060 
0061 typedef struct ctf_sect
0062 {
0063   const char *cts_name;       /* Section name (if any).  */
0064   const void *cts_data;       /* Pointer to section data.  */
0065   size_t cts_size;        /* Size of data in bytes.  */
0066   size_t cts_entsize;         /* Size of each section entry (symtab only).  */
0067 } ctf_sect_t;
0068 
0069 /* A minimal symbol extracted from a linker's internal symbol table
0070    representation.  The symbol name can be given either via st_name or via a
0071    strtab offset in st_nameidx, which corresponds to one of the string offsets
0072    communicated via the ctf_link_add_strtab callback.   */
0073 
0074 typedef struct ctf_link_sym
0075 {
0076   /* The st_name and st_nameidx will not be accessed outside the call to
0077      ctf_link_shuffle_syms.  If you set st_nameidx to offset zero, make sure
0078      to set st_nameidx_set as well.  */
0079 
0080   const char *st_name;
0081   size_t st_nameidx;
0082   int st_nameidx_set;
0083   uint32_t st_symidx;
0084   uint32_t st_shndx;
0085   uint32_t st_type;
0086   uint32_t st_value;
0087 } ctf_link_sym_t;
0088 
0089 /* Flags applying to this specific link.  */
0090 
0091 /* Share all types that are not in conflict.  The default.  */
0092 #define CTF_LINK_SHARE_UNCONFLICTED 0x0
0093 
0094 /* Share only types that are used by multiple inputs.  */
0095 #define CTF_LINK_SHARE_DUPLICATED 0x1
0096 
0097 /* Do a nondeduplicating link, or otherwise deduplicate "less hard", trading off
0098    CTF output size for link time.  */
0099 #define CTF_LINK_NONDEDUP 0x2
0100 
0101 /* Create empty outputs for all registered CU mappings even if no types are
0102    emitted into them.  */
0103 #define CTF_LINK_EMPTY_CU_MAPPINGS 0x4
0104 
0105 /* Omit the content of the variables section.  */
0106 #define CTF_LINK_OMIT_VARIABLES_SECTION 0x8
0107 
0108 /* If *unset*, filter out entries corresponding to linker-reported symbols
0109    from the variable section, and filter out all entries with no linker-reported
0110    symbols from the data object and function info sections: if set, do no
0111    filtering and leave all entries in place.  (This is a negative-sense flag
0112    because it is rare to want symbols the linker has not reported as present to
0113    stick around in the symtypetab sections nonetheless: relocatable links are
0114    the only likely case.)  */
0115 #define CTF_LINK_NO_FILTER_REPORTED_SYMS 0x10
0116 
0117 /* Symbolic names for CTF sections.  */
0118 
0119 typedef enum ctf_sect_names
0120   {
0121    CTF_SECT_HEADER,
0122    CTF_SECT_LABEL,
0123    CTF_SECT_OBJT,
0124    CTF_SECT_OBJTIDX = CTF_SECT_OBJT,
0125    CTF_SECT_FUNC,
0126    CTF_SECT_FUNCIDX = CTF_SECT_FUNC,
0127    CTF_SECT_VAR,
0128    CTF_SECT_TYPE,
0129    CTF_SECT_STR
0130   } ctf_sect_names_t;
0131 
0132 /* Encoding information for integers, floating-point values, and certain other
0133    intrinsics can be obtained by calling ctf_type_encoding, below.  The flags
0134    field will contain values appropriate for the type defined in <ctf.h>.  */
0135 
0136 typedef struct ctf_encoding
0137 {
0138   uint32_t cte_format;       /* Data format (CTF_INT_* or CTF_FP_* flags).  */
0139   uint32_t cte_offset;       /* Offset of value in bits.  */
0140   uint32_t cte_bits;         /* Size of storage in bits.  */
0141 } ctf_encoding_t;
0142 
0143 typedef struct ctf_membinfo
0144 {
0145   ctf_id_t ctm_type;        /* Type of struct or union member.  */
0146   unsigned long ctm_offset; /* Offset of member in bits.  */
0147 } ctf_membinfo_t;
0148 
0149 typedef struct ctf_arinfo
0150 {
0151   ctf_id_t ctr_contents;    /* Type of array contents.  */
0152   ctf_id_t ctr_index;       /* Type of array index.  */
0153   uint32_t ctr_nelems;      /* Number of elements.  */
0154 } ctf_arinfo_t;
0155 
0156 typedef struct ctf_funcinfo
0157 {
0158   ctf_id_t ctc_return;      /* Function return type.  */
0159   uint32_t ctc_argc;        /* Number of typed arguments to function.  */
0160   uint32_t ctc_flags;       /* Function attributes (see below).  */
0161 } ctf_funcinfo_t;
0162 
0163 typedef struct ctf_lblinfo
0164 {
0165   ctf_id_t ctb_type;        /* Last type associated with the label.  */
0166 } ctf_lblinfo_t;
0167 
0168 typedef struct ctf_snapshot_id
0169 {
0170   unsigned long dtd_id;     /* Highest DTD ID at time of snapshot.  */
0171   unsigned long snapshot_id;    /* Snapshot id at time of snapshot.  */
0172 } ctf_snapshot_id_t;
0173 
0174 #define CTF_FUNC_VARARG 0x1 /* Function arguments end with varargs.  */
0175 
0176 /* Functions that return a ctf_id_t use the following value to indicate failure.
0177    ctf_errno can be used to obtain an error code.  Functions that return
0178    a straight integral -1 also use ctf_errno.  */
0179 #define CTF_ERR ((ctf_id_t) -1L)
0180 
0181 /* This macro holds information about all the available ctf errors.
0182    It is used to form both an enum holding all the error constants,
0183    and also the error strings themselves.  To use, define _CTF_FIRST
0184    and _CTF_ITEM to expand as you like, then mention the macro name.
0185    See the enum after this for an example.  */
0186 #define _CTF_ERRORS \
0187   _CTF_FIRST (ECTF_FMT, "File is not in CTF or ELF format.")    \
0188   _CTF_ITEM (ECTF_BFDERR, "BFD error.")             \
0189   _CTF_ITEM (ECTF_CTFVERS, "CTF dict version is too new for libctf.") \
0190   _CTF_ITEM (ECTF_BFD_AMBIGUOUS, "Ambiguous BFD target.")   \
0191   _CTF_ITEM (ECTF_SYMTAB, "Symbol table uses invalid entry size.") \
0192   _CTF_ITEM (ECTF_SYMBAD, "Symbol table data buffer is not valid.") \
0193   _CTF_ITEM (ECTF_STRBAD, "String table data buffer is not valid.") \
0194   _CTF_ITEM (ECTF_CORRUPT, "File data structure corruption detected.") \
0195   _CTF_ITEM (ECTF_NOCTFDATA, "File does not contain CTF data.") \
0196   _CTF_ITEM (ECTF_NOCTFBUF, "Buffer does not contain CTF data.") \
0197   _CTF_ITEM (ECTF_NOSYMTAB, "Symbol table information is not available.") \
0198   _CTF_ITEM (ECTF_NOPARENT, "The parent CTF dictionary is unavailable.") \
0199   _CTF_ITEM (ECTF_DMODEL, "Data model mismatch.") \
0200   _CTF_ITEM (ECTF_LINKADDEDLATE, "File added to link too late.") \
0201   _CTF_ITEM (ECTF_ZALLOC, "Failed to allocate (de)compression buffer.") \
0202   _CTF_ITEM (ECTF_DECOMPRESS, "Failed to decompress CTF data.") \
0203   _CTF_ITEM (ECTF_STRTAB, "External string table is not available.") \
0204   _CTF_ITEM (ECTF_BADNAME, "String name offset is corrupt.") \
0205   _CTF_ITEM (ECTF_BADID, "Invalid type identifier.") \
0206   _CTF_ITEM (ECTF_NOTSOU, "Type is not a struct or union.") \
0207   _CTF_ITEM (ECTF_NOTENUM, "Type is not an enum.") \
0208   _CTF_ITEM (ECTF_NOTSUE, "Type is not a struct, union, or enum.") \
0209   _CTF_ITEM (ECTF_NOTINTFP, "Type is not an integer, float, or enum.") \
0210   _CTF_ITEM (ECTF_NOTARRAY, "Type is not an array.") \
0211   _CTF_ITEM (ECTF_NOTREF, "Type does not reference another type.") \
0212   _CTF_ITEM (ECTF_NAMELEN, "Buffer is too small to hold type name.") \
0213   _CTF_ITEM (ECTF_NOTYPE, "No type found corresponding to name.") \
0214   _CTF_ITEM (ECTF_SYNTAX, "Syntax error in type name.") \
0215   _CTF_ITEM (ECTF_NOTFUNC, "Symbol table entry or type is not a function.") \
0216   _CTF_ITEM (ECTF_NOFUNCDAT, "No function information available for function.") \
0217   _CTF_ITEM (ECTF_NOTDATA, "Symbol table entry does not refer to a data object.") \
0218   _CTF_ITEM (ECTF_NOTYPEDAT, "No type information available for symbol.") \
0219   _CTF_ITEM (ECTF_NOLABEL, "No label found corresponding to name.") \
0220   _CTF_ITEM (ECTF_NOLABELDATA, "File does not contain any labels.") \
0221   _CTF_ITEM (ECTF_NOTSUP, "Feature not supported.") \
0222   _CTF_ITEM (ECTF_NOENUMNAM, "Enum element name not found.") \
0223   _CTF_ITEM (ECTF_NOMEMBNAM, "Member name not found.") \
0224   _CTF_ITEM (ECTF_RDONLY, "CTF container is read-only.") \
0225   _CTF_ITEM (ECTF_DTFULL, "CTF type is full (no more members allowed).") \
0226   _CTF_ITEM (ECTF_FULL, "CTF container is full.") \
0227   _CTF_ITEM (ECTF_DUPLICATE, "Duplicate member or variable name.") \
0228   _CTF_ITEM (ECTF_CONFLICT, "Conflicting type is already defined.") \
0229   _CTF_ITEM (ECTF_OVERROLLBACK, "Attempt to roll back past a ctf_update.") \
0230   _CTF_ITEM (ECTF_COMPRESS, "Failed to compress CTF data.") \
0231   _CTF_ITEM (ECTF_ARCREATE, "Error creating CTF archive.") \
0232   _CTF_ITEM (ECTF_ARNNAME, "Name not found in CTF archive.") \
0233   _CTF_ITEM (ECTF_SLICEOVERFLOW, "Overflow of type bitness or offset in slice.") \
0234   _CTF_ITEM (ECTF_DUMPSECTUNKNOWN, "Unknown section number in dump.") \
0235   _CTF_ITEM (ECTF_DUMPSECTCHANGED, "Section changed in middle of dump.") \
0236   _CTF_ITEM (ECTF_NOTYET, "Feature not yet implemented.") \
0237   _CTF_ITEM (ECTF_INTERNAL, "Internal error: assertion failure.") \
0238   _CTF_ITEM (ECTF_NONREPRESENTABLE, "Type not representable in CTF.") \
0239   _CTF_ITEM (ECTF_NEXT_END, "End of iteration.") \
0240   _CTF_ITEM (ECTF_NEXT_WRONGFUN, "Wrong iteration function called.") \
0241   _CTF_ITEM (ECTF_NEXT_WRONGFP, "Iteration entity changed in mid-iterate.") \
0242   _CTF_ITEM (ECTF_FLAGS, "CTF header contains flags unknown to libctf.") \
0243   _CTF_ITEM (ECTF_NEEDSBFD, "This feature needs a libctf with BFD support.") \
0244   _CTF_ITEM (ECTF_INCOMPLETE, "Type is not a complete type.") \
0245   _CTF_ITEM (ECTF_NONAME, "Type name must not be empty.")
0246 
0247 #define ECTF_BASE   1000    /* Base value for libctf errnos.  */
0248 
0249 enum
0250   {
0251 #define _CTF_FIRST(NAME, STR) NAME = ECTF_BASE
0252 #define _CTF_ITEM(NAME, STR) , NAME
0253 _CTF_ERRORS
0254 #undef _CTF_ITEM
0255 #undef _CTF_FIRST
0256   };
0257 
0258 #define ECTF_NERR (ECTF_NONAME - ECTF_BASE + 1) /* Count of CTF errors.  */
0259 
0260 /* The CTF data model is inferred to be the caller's data model or the data
0261    model of the given object, unless ctf_setmodel is explicitly called.  */
0262 #define CTF_MODEL_ILP32 1   /* Object data model is ILP32.  */
0263 #define CTF_MODEL_LP64  2   /* Object data model is LP64.  */
0264 #ifdef _LP64
0265 # define CTF_MODEL_NATIVE CTF_MODEL_LP64
0266 #else
0267 # define CTF_MODEL_NATIVE CTF_MODEL_ILP32
0268 #endif
0269 
0270 /* Dynamic CTF containers can be created using ctf_create.  The ctf_add_*
0271    routines can be used to add new definitions to the dynamic container.
0272    New types are labeled as root or non-root to determine whether they are
0273    visible at the top-level program scope when subsequently doing a lookup.  */
0274 
0275 #define CTF_ADD_NONROOT 0   /* Type only visible in nested scope.  */
0276 #define CTF_ADD_ROOT    1   /* Type visible at top-level scope.  */
0277 
0278 /* Flags for ctf_member_next.  */
0279 
0280 #define CTF_MN_RECURSE 0x1  /* Recurse into unnamed members.  */
0281 
0282 /* These typedefs are used to define the signature for callback functions that
0283    can be used with the iteration and visit functions below.  There is also a
0284    family of iteration functions that do not require callbacks.  */
0285 
0286 typedef int ctf_visit_f (const char *name, ctf_id_t type, unsigned long offset,
0287              int depth, void *arg);
0288 typedef int ctf_member_f (const char *name, ctf_id_t membtype,
0289               unsigned long offset, void *arg);
0290 typedef int ctf_enum_f (const char *name, int val, void *arg);
0291 typedef int ctf_variable_f (const char *name, ctf_id_t type, void *arg);
0292 typedef int ctf_type_f (ctf_id_t type, void *arg);
0293 typedef int ctf_type_all_f (ctf_id_t type, int flag, void *arg);
0294 typedef int ctf_label_f (const char *name, const ctf_lblinfo_t *info,
0295              void *arg);
0296 typedef int ctf_archive_member_f (ctf_dict_t *fp, const char *name, void *arg);
0297 typedef int ctf_archive_raw_member_f (const char *name, const void *content,
0298                       size_t len, void *arg);
0299 typedef char *ctf_dump_decorate_f (ctf_sect_names_t sect,
0300                    char *line, void *arg);
0301 
0302 typedef struct ctf_dump_state ctf_dump_state_t;
0303 
0304 /* Iteration state for the _next functions, and allocators/copiers/freers for
0305    it.  (None of these are needed for the simple case of iterating to the end:
0306    the _next function allocate and free the iterators for you.)  */
0307 
0308 typedef struct ctf_next ctf_next_t;
0309 extern ctf_next_t *ctf_next_create (void);
0310 extern void ctf_next_destroy (ctf_next_t *);
0311 extern ctf_next_t *ctf_next_copy (ctf_next_t *);
0312 
0313 /* Opening.  These mostly return an abstraction over both CTF files and CTF
0314    archives: so they can be used to open both.  CTF files will appear to be an
0315    archive with one member named '.ctf'.  The low-level functions
0316    ctf_simple_open and ctf_bufopen return ctf_dict_t's directly, and cannot
0317    be used on CTF archives.  */
0318 
0319 extern ctf_archive_t *ctf_bfdopen (struct bfd *, int *);
0320 extern ctf_archive_t *ctf_bfdopen_ctfsect (struct bfd *, const ctf_sect_t *,
0321                        int *);
0322 extern ctf_archive_t *ctf_fdopen (int fd, const char *filename,
0323                   const char *target, int *errp);
0324 extern ctf_archive_t *ctf_open (const char *filename,
0325                 const char *target, int *errp);
0326 extern void ctf_close (ctf_archive_t *);
0327 extern ctf_sect_t ctf_getdatasect (const ctf_dict_t *);
0328 extern ctf_sect_t ctf_getsymsect (const ctf_dict_t *);
0329 extern ctf_sect_t ctf_getstrsect (const ctf_dict_t *);
0330 extern void ctf_symsect_endianness (ctf_dict_t *, int little_endian);
0331 extern ctf_archive_t *ctf_get_arc (const ctf_dict_t *);
0332 extern ctf_archive_t *ctf_arc_open (const char *, int *);
0333 extern ctf_archive_t *ctf_arc_bufopen (const ctf_sect_t *,
0334                        const ctf_sect_t *,
0335                        const ctf_sect_t *,
0336                        int *);
0337 extern void ctf_arc_symsect_endianness (ctf_archive_t *, int little_endian);
0338 extern void ctf_arc_close (ctf_archive_t *);
0339 extern ctf_dict_t *ctf_arc_lookup_symbol (ctf_archive_t *,
0340                       unsigned long symidx,
0341                       ctf_id_t *, int *errp);
0342 extern ctf_dict_t *ctf_arc_lookup_symbol_name (ctf_archive_t *,
0343                            const char *name,
0344                            ctf_id_t *, int *errp);
0345 extern void ctf_arc_flush_caches (ctf_archive_t *);
0346 extern ctf_dict_t *ctf_dict_open (const ctf_archive_t *,
0347                   const char *, int *);
0348 extern ctf_dict_t *ctf_dict_open_sections (const ctf_archive_t *,
0349                        const ctf_sect_t *,
0350                        const ctf_sect_t *,
0351                        const char *, int *);
0352 extern size_t ctf_archive_count (const ctf_archive_t *);
0353 
0354 /* The next functions return or close real CTF files, or write out CTF archives,
0355    not opaque containers around either.  */
0356 
0357 extern ctf_dict_t *ctf_simple_open (const char *, size_t, const char *, size_t,
0358                    size_t, const char *, size_t, int *);
0359 extern ctf_dict_t *ctf_bufopen (const ctf_sect_t *, const ctf_sect_t *,
0360                 const ctf_sect_t *, int *);
0361 extern void ctf_ref (ctf_dict_t *);
0362 extern void ctf_dict_close (ctf_dict_t *);
0363 
0364 extern int ctf_arc_write (const char *, ctf_dict_t **, size_t,
0365               const char **, size_t);
0366 extern int ctf_arc_write_fd (int, ctf_dict_t **, size_t, const char **,
0367                  size_t);
0368 
0369 extern const char *ctf_cuname (ctf_dict_t *);
0370 extern int ctf_cuname_set (ctf_dict_t *, const char *);
0371 extern ctf_dict_t *ctf_parent_dict (ctf_dict_t *);
0372 extern const char *ctf_parent_name (ctf_dict_t *);
0373 extern int ctf_parent_name_set (ctf_dict_t *, const char *);
0374 extern int ctf_type_isparent (ctf_dict_t *, ctf_id_t);
0375 extern int ctf_type_ischild (ctf_dict_t *, ctf_id_t);
0376 
0377 extern int ctf_import (ctf_dict_t *, ctf_dict_t *);
0378 extern int ctf_setmodel (ctf_dict_t *, int);
0379 extern int ctf_getmodel (ctf_dict_t *);
0380 
0381 extern void ctf_setspecific (ctf_dict_t *, void *);
0382 extern void *ctf_getspecific (ctf_dict_t *);
0383 
0384 extern int ctf_errno (ctf_dict_t *);
0385 extern const char *ctf_errmsg (int);
0386 extern int ctf_version (int);
0387 
0388 extern int ctf_func_info (ctf_dict_t *, unsigned long, ctf_funcinfo_t *);
0389 extern int ctf_func_args (ctf_dict_t *, unsigned long, uint32_t, ctf_id_t *);
0390 extern int ctf_func_type_info (ctf_dict_t *, ctf_id_t, ctf_funcinfo_t *);
0391 extern int ctf_func_type_args (ctf_dict_t *, ctf_id_t, uint32_t, ctf_id_t *);
0392 
0393 extern ctf_id_t ctf_lookup_by_name (ctf_dict_t *, const char *);
0394 extern ctf_id_t ctf_lookup_by_symbol (ctf_dict_t *, unsigned long);
0395 extern ctf_id_t ctf_lookup_by_symbol_name (ctf_dict_t *, const char *);
0396 extern ctf_id_t ctf_symbol_next (ctf_dict_t *, ctf_next_t **,
0397                  const char **name, int functions);
0398 extern ctf_id_t ctf_lookup_variable (ctf_dict_t *, const char *);
0399 
0400 extern ctf_id_t ctf_type_resolve (ctf_dict_t *, ctf_id_t);
0401 extern char *ctf_type_aname (ctf_dict_t *, ctf_id_t);
0402 extern char *ctf_type_aname_raw (ctf_dict_t *, ctf_id_t);
0403 extern ssize_t ctf_type_lname (ctf_dict_t *, ctf_id_t, char *, size_t);
0404 extern char *ctf_type_name (ctf_dict_t *, ctf_id_t, char *, size_t);
0405 extern const char *ctf_type_name_raw (ctf_dict_t *, ctf_id_t);
0406 extern ssize_t ctf_type_size (ctf_dict_t *, ctf_id_t);
0407 extern ssize_t ctf_type_align (ctf_dict_t *, ctf_id_t);
0408 extern int ctf_type_kind (ctf_dict_t *, ctf_id_t);
0409 extern int ctf_type_kind_forwarded (ctf_dict_t *, ctf_id_t);
0410 extern ctf_id_t ctf_type_reference (ctf_dict_t *, ctf_id_t);
0411 extern ctf_id_t ctf_type_pointer (ctf_dict_t *, ctf_id_t);
0412 extern int ctf_type_encoding (ctf_dict_t *, ctf_id_t, ctf_encoding_t *);
0413 extern int ctf_type_visit (ctf_dict_t *, ctf_id_t, ctf_visit_f *, void *);
0414 extern int ctf_type_cmp (ctf_dict_t *, ctf_id_t, ctf_dict_t *, ctf_id_t);
0415 extern int ctf_type_compat (ctf_dict_t *, ctf_id_t, ctf_dict_t *, ctf_id_t);
0416 
0417 extern int ctf_member_info (ctf_dict_t *, ctf_id_t, const char *,
0418                 ctf_membinfo_t *);
0419 extern int ctf_array_info (ctf_dict_t *, ctf_id_t, ctf_arinfo_t *);
0420 
0421 extern const char *ctf_enum_name (ctf_dict_t *, ctf_id_t, int);
0422 extern int ctf_enum_value (ctf_dict_t *, ctf_id_t, const char *, int *);
0423 
0424 extern void ctf_label_set (ctf_dict_t *, const char *);
0425 extern const char *ctf_label_get (ctf_dict_t *);
0426 
0427 extern const char *ctf_label_topmost (ctf_dict_t *);
0428 extern int ctf_label_info (ctf_dict_t *, const char *, ctf_lblinfo_t *);
0429 
0430 extern int ctf_member_count (ctf_dict_t *, ctf_id_t);
0431 extern int ctf_member_iter (ctf_dict_t *, ctf_id_t, ctf_member_f *, void *);
0432 extern ssize_t ctf_member_next (ctf_dict_t *, ctf_id_t, ctf_next_t **,
0433                 const char **name, ctf_id_t *membtype,
0434                 int flags);
0435 extern int ctf_enum_iter (ctf_dict_t *, ctf_id_t, ctf_enum_f *, void *);
0436 extern const char *ctf_enum_next (ctf_dict_t *, ctf_id_t, ctf_next_t **,
0437                   int *);
0438 extern int ctf_type_iter (ctf_dict_t *, ctf_type_f *, void *);
0439 extern int ctf_type_iter_all (ctf_dict_t *, ctf_type_all_f *, void *);
0440 extern ctf_id_t ctf_type_next (ctf_dict_t *, ctf_next_t **,
0441                    int *flag, int want_hidden);
0442 extern int ctf_label_iter (ctf_dict_t *, ctf_label_f *, void *);
0443 extern int ctf_label_next (ctf_dict_t *, ctf_next_t **, const char **); /* TBD */
0444 extern int ctf_variable_iter (ctf_dict_t *, ctf_variable_f *, void *);
0445 extern ctf_id_t ctf_variable_next (ctf_dict_t *, ctf_next_t **,
0446                    const char **);
0447 extern int ctf_archive_iter (const ctf_archive_t *, ctf_archive_member_f *,
0448                  void *);
0449 extern ctf_dict_t *ctf_archive_next (const ctf_archive_t *, ctf_next_t **,
0450                      const char **, int skip_parent, int *errp);
0451 
0452 /* This function alone does not currently operate on CTF files masquerading
0453    as archives, and returns -EINVAL: the raw data is no longer available.  It is
0454    expected to be used only by archiving tools, in any case, which have no need
0455    to deal with non-archives at all.  */
0456 extern int ctf_archive_raw_iter (const ctf_archive_t *,
0457                  ctf_archive_raw_member_f *, void *);
0458 extern char *ctf_dump (ctf_dict_t *, ctf_dump_state_t **state,
0459                ctf_sect_names_t sect, ctf_dump_decorate_f *,
0460                void *arg);
0461 
0462 /* Error-warning reporting: an 'iterator' that returns errors and warnings from
0463    the error/warning list, in order of emission.  Errors and warnings are popped
0464    after return: the caller must free the returned error-text pointer.  */
0465 extern char *ctf_errwarning_next (ctf_dict_t *, ctf_next_t **,
0466                   int *is_warning, int *errp);
0467 
0468 extern ctf_id_t ctf_add_array (ctf_dict_t *, uint32_t,
0469                    const ctf_arinfo_t *);
0470 extern ctf_id_t ctf_add_const (ctf_dict_t *, uint32_t, ctf_id_t);
0471 extern ctf_id_t ctf_add_enum_encoded (ctf_dict_t *, uint32_t, const char *,
0472                       const ctf_encoding_t *);
0473 extern ctf_id_t ctf_add_enum (ctf_dict_t *, uint32_t, const char *);
0474 extern ctf_id_t ctf_add_float (ctf_dict_t *, uint32_t,
0475                    const char *, const ctf_encoding_t *);
0476 extern ctf_id_t ctf_add_forward (ctf_dict_t *, uint32_t, const char *,
0477                  uint32_t);
0478 extern ctf_id_t ctf_add_function (ctf_dict_t *, uint32_t,
0479                   const ctf_funcinfo_t *, const ctf_id_t *);
0480 extern ctf_id_t ctf_add_integer (ctf_dict_t *, uint32_t, const char *,
0481                  const ctf_encoding_t *);
0482 extern ctf_id_t ctf_add_slice (ctf_dict_t *, uint32_t, ctf_id_t, const ctf_encoding_t *);
0483 extern ctf_id_t ctf_add_pointer (ctf_dict_t *, uint32_t, ctf_id_t);
0484 extern ctf_id_t ctf_add_type (ctf_dict_t *, ctf_dict_t *, ctf_id_t);
0485 extern ctf_id_t ctf_add_typedef (ctf_dict_t *, uint32_t, const char *,
0486                  ctf_id_t);
0487 extern ctf_id_t ctf_add_restrict (ctf_dict_t *, uint32_t, ctf_id_t);
0488 extern ctf_id_t ctf_add_struct (ctf_dict_t *, uint32_t, const char *);
0489 extern ctf_id_t ctf_add_union (ctf_dict_t *, uint32_t, const char *);
0490 extern ctf_id_t ctf_add_struct_sized (ctf_dict_t *, uint32_t, const char *,
0491                       size_t);
0492 extern ctf_id_t ctf_add_union_sized (ctf_dict_t *, uint32_t, const char *,
0493                      size_t);
0494 extern ctf_id_t ctf_add_unknown (ctf_dict_t *, uint32_t, const char *);
0495 extern ctf_id_t ctf_add_volatile (ctf_dict_t *, uint32_t, ctf_id_t);
0496 
0497 extern int ctf_add_enumerator (ctf_dict_t *, ctf_id_t, const char *, int);
0498 extern int ctf_add_member (ctf_dict_t *, ctf_id_t, const char *, ctf_id_t);
0499 extern int ctf_add_member_offset (ctf_dict_t *, ctf_id_t, const char *,
0500                   ctf_id_t, unsigned long);
0501 extern int ctf_add_member_encoded (ctf_dict_t *, ctf_id_t, const char *,
0502                    ctf_id_t, unsigned long,
0503                    const ctf_encoding_t);
0504 
0505 extern int ctf_add_variable (ctf_dict_t *, const char *, ctf_id_t);
0506 
0507 extern int ctf_add_objt_sym (ctf_dict_t *, const char *, ctf_id_t);
0508 extern int ctf_add_func_sym (ctf_dict_t *, const char *, ctf_id_t);
0509 
0510 extern int ctf_set_array (ctf_dict_t *, ctf_id_t, const ctf_arinfo_t *);
0511 
0512 extern ctf_dict_t *ctf_create (int *);
0513 extern int ctf_update (ctf_dict_t *);
0514 extern ctf_snapshot_id_t ctf_snapshot (ctf_dict_t *);
0515 extern int ctf_rollback (ctf_dict_t *, ctf_snapshot_id_t);
0516 extern int ctf_discard (ctf_dict_t *);
0517 extern int ctf_write (ctf_dict_t *, int);
0518 extern int ctf_gzwrite (ctf_dict_t *fp, gzFile fd);
0519 extern int ctf_compress_write (ctf_dict_t * fp, int fd);
0520 extern unsigned char *ctf_write_mem (ctf_dict_t *, size_t *, size_t threshold);
0521 
0522 extern int ctf_link_add_ctf (ctf_dict_t *, ctf_archive_t *, const char *);
0523 /* The variable filter should return nonzero if a variable should not
0524    appear in the output.  */
0525 typedef int ctf_link_variable_filter_f (ctf_dict_t *, const char *, ctf_id_t,
0526                     void *);
0527 extern int ctf_link_set_variable_filter (ctf_dict_t *,
0528                      ctf_link_variable_filter_f *, void *);
0529 extern int ctf_link (ctf_dict_t *, int flags);
0530 typedef const char *ctf_link_strtab_string_f (uint32_t *offset, void *arg);
0531 extern int ctf_link_add_strtab (ctf_dict_t *, ctf_link_strtab_string_f *,
0532                 void *);
0533 extern int ctf_link_add_linker_symbol (ctf_dict_t *, ctf_link_sym_t *);
0534 extern int ctf_link_shuffle_syms (ctf_dict_t *);
0535 extern unsigned char *ctf_link_write (ctf_dict_t *, size_t *size,
0536                       size_t threshold);
0537 
0538 /* Specialist linker functions.  These functions are not used by ld, but can be
0539    used by other programs making use of the linker machinery for other purposes
0540    to customize its output.  */
0541 extern int ctf_link_add_cu_mapping (ctf_dict_t *, const char *from,
0542                     const char *to);
0543 typedef char *ctf_link_memb_name_changer_f (ctf_dict_t *,
0544                         const char *, void *);
0545 extern void ctf_link_set_memb_name_changer
0546   (ctf_dict_t *, ctf_link_memb_name_changer_f *, void *);
0547 
0548 extern void ctf_setdebug (int debug);
0549 extern int ctf_getdebug (void);
0550 
0551 /* Deprecated aliases for existing functions and types.  */
0552 
0553 struct ctf_file;
0554 typedef struct ctf_dict ctf_file_t;
0555 extern void ctf_file_close (ctf_file_t *);
0556 extern ctf_dict_t *ctf_parent_file (ctf_dict_t *);
0557 extern ctf_dict_t *ctf_arc_open_by_name (const ctf_archive_t *,
0558                      const char *, int *);
0559 extern ctf_dict_t *ctf_arc_open_by_name_sections (const ctf_archive_t *,
0560                           const ctf_sect_t *,
0561                           const ctf_sect_t *,
0562                           const char *, int *);
0563 
0564 #ifdef  __cplusplus
0565 }
0566 #endif
0567 
0568 #endif              /* _CTF_API_H */