/* Implementation header.
   Copyright (C) 2019-2025 Free Software Foundation, Inc.

   This file is part of libctf.

   libctf is free software; you can redistribute it and/or modify it under
   the terms of the GNU General Public License as published by the Free
   Software Foundation; either version 3, or (at your option) any later
   version.

   This program is distributed in the hope that it will be useful, but
   WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
   See the GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; see the file COPYING.  If not see
   <http://www.gnu.org/licenses/>.  */

#ifndef	_CTF_IMPL_H
#define	_CTF_IMPL_H

#include "config.h"
#include <errno.h>
#include "ctf-decls.h"
#include <ctf-api.h>
#include "ctf-sha1.h"
#include <sys/types.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <limits.h>
#include <ctype.h>
#include <elf.h>
#include <bfd.h>
#include "hashtab.h"
#include "ctf-intl.h"

#ifdef	__cplusplus
extern "C"
{
#endif

/* Tuning.  */

/* The proportion of symtypetab entries which must be pads before we consider it
   worthwhile to emit a symtypetab section as an index.  Indexes cost time to
   look up, but save space all told.  Do not set to 1, since this will cause
   indexes to be eschewed completely, even in child dicts, at considerable space
   cost.  */
#define CTF_INDEX_PAD_THRESHOLD .75

/* Compiler attributes.  */

#if defined (__GNUC__)

/* GCC.  We assume that all compilers claiming to be GCC support sufficiently
   many GCC attributes that the code below works.  If some non-GCC compilers
   masquerading as GCC in fact do not implement these attributes, version checks
   may be required.  */

/* We use the _libctf_*_ pattern to avoid clashes with any future attribute
   macros glibc may introduce, which have names of the pattern
   __attribute_blah__.  */

#define _libctf_printflike_(string_index,first_to_check) \
    __attribute__ ((__format__ (__printf__, (string_index), (first_to_check))))
#define _libctf_unlikely_(x) __builtin_expect ((x), 0)
#define _libctf_unused_ __attribute__ ((__unused__))
#define _libctf_malloc_ __attribute__((__malloc__))
#define _libctf_nonnull_(params) __attribute__((__nonnull__ params))

#else

#define _libctf_printflike_(string_index,first_to_check)
#define _libctf_unlikely_(x) (x)
#define _libctf_unused_
#define _libctf_malloc_
#define _libctf_nonnull_(params)
#define __extension__

#endif

#if defined (ENABLE_LIBCTF_HASH_DEBUGGING) && !defined (NDEBUG)
#include <assert.h>
#define ctf_assert(fp, expr) (assert (expr), 1)
#else
#define ctf_assert(fp, expr)						\
  _libctf_unlikely_ (ctf_assert_internal (fp, __FILE__, __LINE__,	\
					  #expr, !!(expr)))
#endif

/* libctf in-memory state.  */

typedef struct ctf_fixed_hash ctf_hash_t; /* Private to ctf-hash.c.  */
typedef struct ctf_dynhash ctf_dynhash_t; /* Private to ctf-hash.c.  */
typedef struct ctf_dynset ctf_dynset_t;   /* Private to ctf-hash.c.  */

typedef struct ctf_strs
{
  const char *cts_strs;		/* Base address of string table.  */
  size_t cts_len;		/* Size of string table in bytes.  */
} ctf_strs_t;

typedef struct ctf_strs_writable
{
  char *cts_strs;		/* Base address of string table.  */
  size_t cts_len;		/* Size of string table in bytes.  */
} ctf_strs_writable_t;

typedef struct ctf_dmodel
{
  const char *ctd_name;		/* Data model name.  */
  int ctd_code;			/* Data model code.  */
  size_t ctd_pointer;		/* Size of void * in bytes.  */
  size_t ctd_char;		/* Size of char in bytes.  */
  size_t ctd_short;		/* Size of short in bytes.  */
  size_t ctd_int;		/* Size of int in bytes.  */
  size_t ctd_long;		/* Size of long in bytes.  */
} ctf_dmodel_t;

typedef struct ctf_lookup
{
  const char *ctl_prefix;	/* String prefix for this lookup.  */
  size_t ctl_len;		/* Length of prefix string in bytes.  */
  ctf_dynhash_t *ctl_hash;	/* Pointer to hash table for lookup.  */
} ctf_lookup_t;

typedef struct ctf_dictops
{
  uint32_t (*ctfo_get_kind) (uint32_t);
  uint32_t (*ctfo_get_root) (uint32_t);
  uint32_t (*ctfo_get_vlen) (uint32_t);
  ssize_t (*ctfo_get_ctt_size) (const ctf_dict_t *, const ctf_type_t *,
				ssize_t *, ssize_t *);
  ssize_t (*ctfo_get_vbytes) (ctf_dict_t *, unsigned short, ssize_t, size_t);
} ctf_dictops_t;

typedef struct ctf_list
{
  struct ctf_list *l_prev;	/* Previous pointer or tail pointer.  */
  struct ctf_list *l_next;	/* Next pointer or head pointer.  */
} ctf_list_t;

typedef enum
  {
   CTF_PREC_BASE,
   CTF_PREC_POINTER,
   CTF_PREC_ARRAY,
   CTF_PREC_FUNCTION,
   CTF_PREC_MAX
  } ctf_decl_prec_t;

typedef struct ctf_decl_node
{
  ctf_list_t cd_list;		/* Linked list pointers.  */
  ctf_id_t cd_type;		/* Type identifier.  */
  uint32_t cd_kind;		/* Type kind.  */
  uint32_t cd_n;		/* Type dimension if array.  */
} ctf_decl_node_t;

typedef struct ctf_decl
{
  ctf_list_t cd_nodes[CTF_PREC_MAX]; /* Declaration node stacks.  */
  int cd_order[CTF_PREC_MAX];	     /* Storage order of decls.  */
  ctf_decl_prec_t cd_qualp;	     /* Qualifier precision.  */
  ctf_decl_prec_t cd_ordp;	     /* Ordered precision.  */
  char *cd_buf;			     /* Buffer for output.  */
  int cd_err;			     /* Saved error value.  */
  int cd_enomem;		     /* Nonzero if OOM during printing.  */
} ctf_decl_t;

typedef struct ctf_dtdef
{
  ctf_list_t dtd_list;		/* List forward/back pointers.  */
  ctf_id_t dtd_type;		/* Type identifier for this definition.  */
  ctf_type_t dtd_data;		/* Type node, including name.  */
  size_t dtd_vlen_alloc;	/* Total vlen space allocated.  */
  unsigned char *dtd_vlen;	/* Variable-length data for this type.  */
} ctf_dtdef_t;

typedef struct ctf_dvdef
{
  ctf_list_t dvd_list;		/* List forward/back pointers.  */
  char *dvd_name;		/* Name associated with variable.  */
  ctf_id_t dvd_type;		/* Type of variable.  */
  unsigned long dvd_snapshots;	/* Snapshot count when inserted.  */
} ctf_dvdef_t;

typedef struct ctf_err_warning
{
  ctf_list_t cew_list;		/* List forward/back pointers.  */
  int cew_is_warning;		/* 1 if warning, 0 if error.  */
  char *cew_text;		/* Error/warning text.  */
} ctf_err_warning_t;

/* Atoms associate strings with a list of the CTF items that reference that
   string, so that ctf_serialize() can instantiate all the strings using the
   ctf_str_atoms and then reassociate them with the real string later.

   Strings can be interned into ctf_str_atom without having refs associated
   with them, for values that are returned to callers, etc.  Items are only
   removed from this table on ctf_close(), but on every ctf_serialize(), all
   the csa_refs in all entries are purged.  */

#define CTF_STR_ATOM_FREEABLE	0x1

typedef struct ctf_str_atom
{
  char *csa_str;		/* Pointer to string (also used as hash key).  */
  ctf_list_t csa_refs;		/* This string's refs.  */
  ctf_list_t csa_movable_refs;	/* This string's movable refs.  */
  uint32_t csa_offset;		/* Offset in this strtab, if any.  */
  uint32_t csa_external_offset;	/* External strtab offset, if any.  */
  unsigned long csa_snapshot_id; /* Snapshot ID at time of creation.  */
  int csa_flags;		 /* CTF_STR_ATOM_* flags. */
} ctf_str_atom_t;

/* The refs of a single string in the atoms table.  */

typedef struct ctf_str_atom_ref
{
  ctf_list_t caf_list;		/* List forward/back pointers.  */
  uint32_t *caf_ref;		/* A single ref to this string.  */
} ctf_str_atom_ref_t;

  /* Like a ctf_str_atom_ref_t, but specific to movable refs.  */

typedef struct ctf_str_atom_ref_movable
{
  ctf_list_t caf_list;		/* List forward/back pointers.  */
  uint32_t *caf_ref;		/* A single ref to this string.  */
  ctf_dynhash_t *caf_movable_refs; /* Backpointer to ctf_str_movable_refs for this dict. */  
} ctf_str_atom_ref_movable_t;

/* A single linker-provided symbol, during symbol addition, possibly before we
   have been given external strtab refs.  */
typedef struct ctf_in_flight_dynsym
{
  ctf_list_t cid_list;		/* List forward/back pointers.  */
  ctf_link_sym_t cid_sym;	/* The linker-known symbol.  */
} ctf_in_flight_dynsym_t;

/* The structure used as the key in a ctf_link_type_mapping.  The value is a
   type index, not a type ID.  */

typedef struct ctf_link_type_key
{
  ctf_dict_t *cltk_fp;
  ctf_id_t cltk_idx;
} ctf_link_type_key_t;

/* The structure used as the key in a cd_id_to_dict_t on 32-bit platforms.  */
typedef struct ctf_type_id_key
{
  int ctii_input_num;
  ctf_id_t ctii_type;
} ctf_type_id_key_t;

/* Deduplicator state.

   The dedup state below uses three terms consistently. A "hash" is a
   ctf_dynhash_t; a "hash value" is the hash value of a type as returned by
   ctf_dedup_hash_type; a "global type ID" or "global ID" is a packed-together
   reference to a single ctf_dict_t (by array index in an array of inputs) and
   ctf_id_t, i.e. a single instance of some hash value in some input.

   The deduplication algorithm takes a bunch of inputs and yields a single
   shared "output" and possibly many outputs corresponding to individual inputs
   that still contain types after sharing of unconflicted types.  Almost all
   deduplicator state is stored in the struct ctf_dedup in the output, though a
   (very) few things are stored in inputs for simplicity's sake, usually if they
   are linking together things within the scope of a single TU.

   Flushed at the end of every ctf_dedup run.  */

typedef struct ctf_dedup
{
  /* The CTF linker flags in force for this dedup run.  */
  int cd_link_flags;

  /* On 32-bit platforms only, a hash of global type IDs, in the form of
     a ctf_link_type_id_key_t.  */
  ctf_dynhash_t *cd_id_to_dict_t;

  /* Atoms tables of decorated names: maps undecorated name to decorated name.
     (The actual allocations are in the CTF dict for the former and the real
     atoms table for the latter).  Uses the same namespaces as ctf_lookups,
     below, but has no need for null-termination.  */
  ctf_dynhash_t *cd_decorated_names[4];

  /* Map type names to a hash from type hash value -> number of times each value
     has appeared.  Enumeration constants are tracked via the enum they appear
     in.  */
  ctf_dynhash_t *cd_name_counts;

  /* Map global type IDs to type hash values.  Used to determine if types are
     already hashed without having to recompute their hash values again, and to
     link types together at later stages.  Forwards that are peeked through to
     structs and unions are not represented in here, so lookups that might be
     such a type (in practice, all lookups) must go via cd_replaced_types first
     to take this into account.  Discarded before each rehashing.  */
  ctf_dynhash_t *cd_type_hashes;

  /* Maps from the names of structs/unions/enums to a a single GID which is the
     only appearance of that type in any input: if it appears in more than one
     input, a value which is a GID with an input_num of -1 appears.  Used in
     share-duplicated link mode link modes to determine whether structs/unions
     can be cited from multiple TUs.  Only populated in that link mode.  */
  ctf_dynhash_t *cd_struct_origin;

  /* Maps type hash values to a set of hash values of the types that cite them:
     i.e., pointing backwards up the type graph.  Used for recursive conflict
     marking.  Citations from tagged structures, unions, and forwards do not
     appear in this graph.  */
  ctf_dynhash_t *cd_citers;

  /* Maps type hash values to input global type IDs.  The value is a set (a
     hash) of global type IDs.  Discarded before each rehashing.  The result of
     the ctf_dedup function.  */
  ctf_dynhash_t *cd_output_mapping;

  /* A map giving the GID of the first appearance of each type for each type
     hash value.  */
  ctf_dynhash_t *cd_output_first_gid;

  /* Used to ensure that we never try to map a single type ID to more than one
     hash.  */
  ctf_dynhash_t *cd_output_mapping_guard;

  /* Maps the global type IDs of structures in input TUs whose members still
     need emission to the global type ID of the already-emitted target type
     (which has no members yet) in the appropriate target.  Uniquely, the latter
     ID represents a *target* ID (i.e. the cd_output_mapping of some specified
     input): we encode the shared (parent) dict with an ID of -1.  */
  ctf_dynhash_t *cd_emission_struct_members;

  /* A set (a hash) of hash values of conflicting types.  */
  ctf_dynset_t *cd_conflicting_types;

  /* A hash mapping fp *'s of inputs to their input_nums.  Used only by
     functions outside the core ctf_dedup / ctf_dedup_emit machinery which do
     not take an inputs array.  */
  ctf_dynhash_t *cd_input_nums;

  /* Maps type hashes to ctf_id_t's in this dictionary.  Populated only at
     emission time, in the dictionary where emission is taking place.  */
  ctf_dynhash_t *cd_output_emission_hashes;

  /* Maps the decorated names of conflicted cross-TU forwards that were forcibly
     emitted in this TU to their emitted ctf_id_ts.  Populated only at emission
     time, in the dictionary where emission is taking place. */
  ctf_dynhash_t *cd_output_emission_conflicted_forwards;

  /* Points to the output counterpart of this input dictionary, at emission
     time.  */
  ctf_dict_t *cd_output;
} ctf_dedup_t;

/* The ctf_dict is the structure used to represent a CTF dictionary to library
   clients, who see it only as an opaque pointer.  Modifications can therefore
   be made freely to this structure without regard to client versioning.  The
   ctf_dict_t typedef appears in <ctf-api.h> and declares a forward tag.
   (A ctf_file_t typedef also appears there, for historical reasons.)  */

struct ctf_dict
{
  const ctf_dictops_t *ctf_dictops; /* Version-specific dict operations.  */
  struct ctf_header *ctf_header;    /* The header from this CTF dict.  */
  unsigned char ctf_openflags;	    /* Flags the dict had when opened.  */
  ctf_sect_t ctf_data;		    /* CTF data from object file.  */
  ctf_sect_t ctf_ext_symtab;	    /* Symbol table from object file.  */
  ctf_sect_t ctf_ext_strtab;	    /* String table from object file.  */
  int ctf_symsect_little_endian;    /* Endianness of the ctf_ext_symtab.  */
  ctf_dynhash_t *ctf_symhash_func;  /* (partial) hash, symsect name -> idx. */
  ctf_dynhash_t *ctf_symhash_objt;  /* ditto, for object symbols.  */
  size_t ctf_symhash_latest;	    /* Amount of symsect scanned so far.  */
  ctf_dynhash_t *ctf_prov_strtab;   /* Maps provisional-strtab offsets
				       to names.  */
  ctf_dynhash_t *ctf_syn_ext_strtab; /* Maps ext-strtab offsets to names.  */
  void *ctf_data_mmapped;	    /* CTF data we mmapped, to free later.  */
  size_t ctf_data_mmapped_len;	    /* Length of CTF data we mmapped.  */
  ctf_dynhash_t *ctf_structs;	    /* Hash table of struct types.  */
  ctf_dynhash_t *ctf_unions;	    /* Hash table of union types.  */
  ctf_dynhash_t *ctf_enums;	    /* Hash table of enum types.  */
  ctf_dynhash_t *ctf_names;	    /* Hash table of remaining types, plus
				       enumeration constants.  */
  ctf_lookup_t ctf_lookups[5];	    /* Pointers to nametabs for name lookup.  */
  ctf_strs_t ctf_str[2];	    /* Array of string table base and bounds.  */
  ctf_strs_writable_t *ctf_dynstrtab; /* Dynamically allocated string table, if any. */
  ctf_dynhash_t *ctf_str_atoms;	  /* Hash table of ctf_str_atoms_t.  */
  ctf_dynhash_t *ctf_str_movable_refs; /* Hash table of void * -> ctf_str_atom_ref_movable_t.  */
  uint32_t ctf_str_prov_offset;	  /* Latest provisional offset assigned so far.  */
  unsigned char *ctf_base;	  /* CTF file pointer.  */
  unsigned char *ctf_dynbase;	  /* Freeable CTF file pointer. */
  unsigned char *ctf_buf;	  /* Uncompressed CTF data buffer.  */
  size_t ctf_size;		  /* Size of CTF header + uncompressed data.  */
  uint32_t *ctf_sxlate;		  /* Translation table for unindexed symtypetab
				     entries.  */
  unsigned long ctf_nsyms;	  /* Number of entries in symtab xlate table.  */
  uint32_t *ctf_txlate;		  /* Translation table for type IDs.  */
  uint32_t *ctf_ptrtab;		  /* Translation table for pointer-to lookups.  */
  size_t ctf_ptrtab_len;	  /* Num types storable in ptrtab currently.  */
  uint32_t *ctf_pptrtab;	  /* Parent types pointed to by child dicts.  */
  size_t ctf_pptrtab_len;	  /* Num types storable in pptrtab currently.  */
  uint32_t ctf_pptrtab_typemax;	  /* Max child type when pptrtab last updated.  */
  ctf_dynset_t *ctf_conflicting_enums;	/* Tracks enum constants that conflict.  */
  uint32_t *ctf_funcidx_names;	  /* Name of each function symbol in symtypetab
				     (if indexed).  */
  uint32_t *ctf_objtidx_names;	  /* Likewise, for object symbols.  */
  size_t ctf_nfuncidx;		  /* Number of funcidx entries.  */
  uint32_t *ctf_funcidx_sxlate;	  /* Offsets into funcinfo for a given funcidx.  */
  uint32_t *ctf_objtidx_sxlate;	  /* Likewise, for ctf_objtidx.  */
  size_t ctf_nobjtidx;		  /* Number of objtidx entries.  */
  ctf_dynhash_t *ctf_objthash;	  /* Dynamic: name -> type ID.  */
  ctf_dynhash_t *ctf_funchash;	  /* Dynamic: name -> CTF_K_FUNCTION type ID.  */

  /* The next three are linker-derived state found in ctf_link targets only.  */

  ctf_dynhash_t *ctf_dynsyms;	  /* Symbol info from ctf_link_shuffle_syms.  */
  ctf_link_sym_t **ctf_dynsymidx;  /* Indexes ctf_dynsyms by symidx.  */
  uint32_t ctf_dynsymmax;	  /* Maximum ctf_dynsym index.  */
  ctf_list_t ctf_in_flight_dynsyms; /* Dynsyms during accumulation.  */
  struct ctf_varent *ctf_vars;	  /* Sorted variable->type mapping.  */
  unsigned long ctf_nvars;	  /* Number of variables in ctf_vars.  */
  unsigned long ctf_typemax;	  /* Maximum valid type ID number.  */
  unsigned long ctf_stypes;	  /* Number of static (non-dynamic) types.  */
  const ctf_dmodel_t *ctf_dmodel; /* Data model pointer (see above).  */
  const char *ctf_cuname;	  /* Compilation unit name (if any).  */
  char *ctf_dyncuname;		  /* Dynamically allocated name of CU.  */
  struct ctf_dict *ctf_parent;	  /* Parent CTF dict (if any).  */
  int ctf_parent_unreffed;	  /* Parent set by ctf_import_unref?  */
  const char *ctf_parlabel;	  /* Label in parent dict (if any).  */
  const char *ctf_parname;	  /* Basename of parent (if any).  */
  char *ctf_dynparname;		  /* Dynamically allocated name of parent.  */
  uint32_t ctf_parmax;		  /* Highest type ID of a parent type.  */
  uint32_t ctf_refcnt;		  /* Reference count (for parent links).  */
  uint32_t ctf_flags;		  /* Libctf flags (see below).  */
  int ctf_errno;		  /* Error code for most recent error.  */
  int ctf_version;		  /* CTF data version.  */
  ctf_dynhash_t *ctf_dthash;	  /* Hash of dynamic type definitions.  */
  ctf_list_t ctf_dtdefs;	  /* List of dynamic type definitions.  */
  ctf_dynhash_t *ctf_dvhash;	  /* Hash of dynamic variable mappings.  */
  ctf_list_t ctf_dvdefs;	  /* List of dynamic variable definitions.  */
  unsigned long ctf_dtoldid;	  /* Oldest id that has been committed.  */
  unsigned long ctf_snapshots;	  /* ctf_snapshot() plus ctf_update() count.  */
  unsigned long ctf_snapshot_lu;  /* ctf_snapshot() call count at last update.  */
  ctf_archive_t *ctf_archive;	  /* Archive this ctf_dict_t came from.  */
  ctf_list_t ctf_errs_warnings;	  /* CTF errors and warnings.  */
  ctf_dynhash_t *ctf_link_inputs; /* Inputs to this link.  */
  ctf_dynhash_t *ctf_link_outputs; /* Additional outputs from this link.  */

  /* If a link input CU, points at the corresponding per-CU output (if any);
     if an output, points at the input (if any).  */
  ctf_dict_t *ctf_link_in_out;

  /* Map input types to output types for ctf_add_type.  Key is a
     ctf_link_type_key_t: value is a type ID.  */
  ctf_dynhash_t *ctf_link_type_mapping;

  /* Map input CU names to output CTF dict names: populated in the top-level
     output dict.

     Key and value are dynamically-allocated strings.  */
  ctf_dynhash_t *ctf_link_in_cu_mapping;

  /* Map output CTF dict names to input CU names: populated in the top-level
     output dict.  A hash of string to hash (set) of strings.  Key and
     individual value members are shared with ctf_link_in_cu_mapping.  */
  ctf_dynhash_t *ctf_link_out_cu_mapping;

  /* CTF linker flags.  Set on the parent output dict (the one passed to
     ctf_link).  Only respected when LCTF_LINKING set in ctf_flags.  */
  int ctf_link_flags;

  /* Allow the caller to change the name of link archive members.  */
  ctf_link_memb_name_changer_f *ctf_link_memb_name_changer;
  void *ctf_link_memb_name_changer_arg;         /* Argument for it.  */

  /* Allow the caller to filter out variables they don't care about.  */
  ctf_link_variable_filter_f *ctf_link_variable_filter;
  void *ctf_link_variable_filter_arg;           /* Argument for it. */

  ctf_dynhash_t *ctf_add_processing; /* Types ctf_add_type is working on now.  */

  /* Atoms table for dedup string storage.  All strings in the ctf_dedup_t are
     stored here.  Only the _alloc copy is allocated or freed: the
     ctf_dedup_atoms may be pointed to some other CTF dict, to share its atoms.
     We keep the atoms table outside the ctf_dedup so that atoms can be
     preserved across multiple similar links, such as when doing cu-mapped
     links.  */
  ctf_dynset_t *ctf_dedup_atoms;
  ctf_dynset_t *ctf_dedup_atoms_alloc;

  ctf_dedup_t ctf_dedup;	  /* Deduplicator state.  */

  char *ctf_tmp_typeslice;	  /* Storage for slicing up type names.  */
  size_t ctf_tmp_typeslicelen;	  /* Size of the typeslice.  */
  void *ctf_specific;		  /* Data for ctf_get/setspecific().  */
};

/* An abstraction over both a ctf_dict_t and a ctf_archive_t.  */

struct ctf_archive_internal
{
  int ctfi_is_archive;
  int ctfi_unmap_on_close;
  ctf_dict_t *ctfi_dict;
  struct ctf_archive *ctfi_archive;
  ctf_dynhash_t *ctfi_dicts;	  /* Dicts we have opened and cached.  */
  ctf_dict_t *ctfi_crossdict_cache; /* Cross-dict caching.  */
  ctf_dict_t **ctfi_symdicts;	  /* Array of index -> ctf_dict_t *.  */
  ctf_dynhash_t *ctfi_symnamedicts; /* Hash of name -> ctf_dict_t *.  */
  ctf_sect_t ctfi_symsect;
  int ctfi_symsect_little_endian; /* -1 for unknown / do not set.  */
  ctf_sect_t ctfi_strsect;
  int ctfi_free_symsect;
  int ctfi_free_strsect;
  void *ctfi_data;
  bfd *ctfi_abfd;		  /* Optional source of section data.  */
  void (*ctfi_bfd_close) (struct ctf_archive_internal *);
};

/* Iterator state for the *_next() functions.  */

/* A single hash key/value pair.  */
typedef struct ctf_next_hkv
{
  void *hkv_key;
  void *hkv_value;
} ctf_next_hkv_t;

struct ctf_next
{
  void (*ctn_iter_fun) (void);
  ctf_id_t ctn_type;
  ssize_t ctn_size;
  ssize_t ctn_increment;
  const ctf_type_t *ctn_tp;
  uint32_t ctn_n;

  /* Some iterators contain other iterators, in addition to their other
     state.  We allow for inner and outer iterators, for two-layer nested loops
     like those found in ctf_arc_lookup_enumerator_next.  */
  ctf_next_t *ctn_next;
  ctf_next_t *ctn_next_inner;

  /* We can save space on this side of things by noting that a type is either
     dynamic or not, as a whole, and a given iterator can only iterate over one
     kind of thing at once: so we can overlap the DTD and non-DTD members, and
     the structure, variable and enum members, etc.  */
  union
  {
    unsigned char *ctn_vlen;
    const ctf_enum_t *ctn_en;
    const ctf_dvdef_t *ctn_dvd;
    ctf_next_hkv_t *ctn_sorted_hkv;
    void **ctn_hash_slot;
  } u;

  /* This union is of various sorts of dict we can iterate over: currently
     archives, dictionaries, dynhashes, and dynsets.  ctn_fp is non-const
     because we need to set errors on it.  */

  union
  {
    ctf_dict_t *ctn_fp;
    const ctf_archive_t *ctn_arc;
    const ctf_dynhash_t *ctn_h;
    const ctf_dynset_t *ctn_s;
  } cu;
};

/* Return x rounded up to an alignment boundary.
   eg, P2ROUNDUP(0x1234, 0x100) == 0x1300 (0x13*align)
   eg, P2ROUNDUP(0x5600, 0x100) == 0x5600 (0x56*align)  */
#define P2ROUNDUP(x, align)		(-(-(x) & -(align)))

/* * If an offs is not aligned already then round it up and align it. */
#define LCTF_ALIGN_OFFS(offs, align) ((offs + (align - 1)) & ~(align - 1))

#define LCTF_TYPE_ISPARENT(fp, id) ((id) <= fp->ctf_parmax)
#define LCTF_TYPE_ISCHILD(fp, id) ((id) > fp->ctf_parmax)
#define LCTF_TYPE_TO_INDEX(fp, id) ((id) & (fp->ctf_parmax))
#define LCTF_INDEX_TO_TYPE(fp, id, child) (child ? ((id) | (fp->ctf_parmax+1)) : \
					   (id))

#define LCTF_INDEX_TO_TYPEPTR(fp, i) \
  ((i > fp->ctf_stypes) ?							\
     &(ctf_dtd_lookup (fp, LCTF_INDEX_TO_TYPE				\
		       (fp, i, fp->ctf_flags & LCTF_CHILD))->dtd_data) : \
     (ctf_type_t *)((uintptr_t)(fp)->ctf_buf + (fp)->ctf_txlate[(i)]))

#define LCTF_INFO_KIND(fp, info)	((fp)->ctf_dictops->ctfo_get_kind(info))
#define LCTF_INFO_ISROOT(fp, info)	((fp)->ctf_dictops->ctfo_get_root(info))
#define LCTF_INFO_VLEN(fp, info)	((fp)->ctf_dictops->ctfo_get_vlen(info))
#define LCTF_VBYTES(fp, kind, size, vlen) \
  ((fp)->ctf_dictops->ctfo_get_vbytes(fp, kind, size, vlen))

#define LCTF_CHILD	0x0001	/* CTF dict is a child.  */
#define LCTF_LINKING	0x0002	/* CTF link is underway: respect ctf_link_flags.  */
#define LCTF_STRICT_NO_DUP_ENUMERATORS 0x0004 /* Duplicate enums prohibited.  */

extern ctf_dynhash_t *ctf_name_table (ctf_dict_t *, int);
extern const ctf_type_t *ctf_lookup_by_id (ctf_dict_t **, ctf_id_t);
extern ctf_id_t ctf_lookup_variable_here (ctf_dict_t *fp, const char *name);
extern ctf_id_t ctf_lookup_by_sym_or_name (ctf_dict_t *, unsigned long symidx,
					   const char *symname, int try_parent,
					   int is_function);
extern ctf_id_t ctf_lookup_by_rawname (ctf_dict_t *, int, const char *);
extern void ctf_set_ctl_hashes (ctf_dict_t *);
extern ctf_id_t ctf_symbol_next_static (ctf_dict_t *, ctf_next_t **,
					const char **, int);

extern int ctf_symtab_skippable (ctf_link_sym_t *sym);
extern int ctf_add_funcobjt_sym (ctf_dict_t *, int is_function,
				 const char *, ctf_id_t);

extern ctf_dict_t *ctf_get_dict (ctf_dict_t *fp, ctf_id_t type);

typedef unsigned int (*ctf_hash_fun) (const void *ptr);
extern unsigned int ctf_hash_integer (const void *ptr);
extern unsigned int ctf_hash_string (const void *ptr);
extern unsigned int ctf_hash_type_key (const void *ptr);
extern unsigned int ctf_hash_type_id_key (const void *ptr);

typedef int (*ctf_hash_eq_fun) (const void *, const void *);
extern int ctf_hash_eq_integer (const void *, const void *);
extern int ctf_hash_eq_string (const void *, const void *);
extern int ctf_hash_eq_type_key (const void *, const void *);
extern int ctf_hash_eq_type_id_key (const void *, const void *);

typedef void (*ctf_hash_free_fun) (void *);

typedef void (*ctf_hash_iter_f) (void *key, void *value, void *arg);
typedef int (*ctf_hash_iter_remove_f) (void *key, void *value, void *arg);
typedef int (*ctf_hash_iter_find_f) (void *key, void *value, void *arg);
typedef int (*ctf_hash_sort_f) (const ctf_next_hkv_t *, const ctf_next_hkv_t *,
				void *arg);

extern ctf_dynhash_t *ctf_dynhash_create (ctf_hash_fun, ctf_hash_eq_fun,
					  ctf_hash_free_fun, ctf_hash_free_fun);
extern ctf_dynhash_t *ctf_dynhash_create_sized (unsigned long, ctf_hash_fun,
						ctf_hash_eq_fun,
						ctf_hash_free_fun,
						ctf_hash_free_fun);

extern int ctf_dynhash_insert (ctf_dynhash_t *, void *, void *);
extern void ctf_dynhash_remove (ctf_dynhash_t *, const void *);
extern size_t ctf_dynhash_elements (ctf_dynhash_t *);
extern void ctf_dynhash_empty (ctf_dynhash_t *);
extern int ctf_dynhash_insert_type (ctf_dict_t *, ctf_dynhash_t *, uint32_t, uint32_t);
extern ctf_id_t ctf_dynhash_lookup_type (ctf_dynhash_t *, const char *);
extern void *ctf_dynhash_lookup (ctf_dynhash_t *, const void *);
extern int ctf_dynhash_lookup_kv (ctf_dynhash_t *, const void *key,
				  const void **orig_key, void **value);
extern void ctf_dynhash_destroy (ctf_dynhash_t *);
extern void ctf_dynhash_iter (ctf_dynhash_t *, ctf_hash_iter_f, void *);
extern void ctf_dynhash_iter_remove (ctf_dynhash_t *, ctf_hash_iter_remove_f,
				     void *);
extern void *ctf_dynhash_iter_find (ctf_dynhash_t *, ctf_hash_iter_find_f,
				    void *);
extern int ctf_dynhash_sort_by_name (const ctf_next_hkv_t *,
				     const ctf_next_hkv_t *,
				     void * _libctf_unused_);
extern int ctf_dynhash_next (ctf_dynhash_t *, ctf_next_t **,
			     void **key, void **value);
extern int ctf_dynhash_next_sorted (ctf_dynhash_t *, ctf_next_t **,
				    void **key, void **value, ctf_hash_sort_f,
				    void *);

extern ctf_dynset_t *ctf_dynset_create (htab_hash, htab_eq, ctf_hash_free_fun);
extern int ctf_dynset_insert (ctf_dynset_t *, void *);
extern void ctf_dynset_remove (ctf_dynset_t *, const void *);
extern size_t ctf_dynset_elements (ctf_dynset_t *);
extern void ctf_dynset_destroy (ctf_dynset_t *);
extern void *ctf_dynset_lookup (ctf_dynset_t *, const void *);
extern int ctf_dynset_exists (ctf_dynset_t *, const void *key,
			      const void **orig_key);
extern int ctf_dynset_next (ctf_dynset_t *, ctf_next_t **, void **key);
extern void *ctf_dynset_lookup_any (ctf_dynset_t *);

extern void ctf_sha1_init (ctf_sha1_t *);
extern void ctf_sha1_add (ctf_sha1_t *, const void *, size_t);
extern char *ctf_sha1_fini (ctf_sha1_t *, char *);

#define	ctf_list_prev(elem)	((void *)(((ctf_list_t *)(elem))->l_prev))
#define	ctf_list_next(elem)	((void *)(((ctf_list_t *)(elem))->l_next))

extern void ctf_list_append (ctf_list_t *, void *);
extern void ctf_list_prepend (ctf_list_t *, void *);
extern void ctf_list_delete (ctf_list_t *, void *);
extern void ctf_list_splice (ctf_list_t *, ctf_list_t *);
extern int ctf_list_empty_p (ctf_list_t *lp);

extern int ctf_dtd_insert (ctf_dict_t *, ctf_dtdef_t *, int flag, int kind);
extern void ctf_dtd_delete (ctf_dict_t *, ctf_dtdef_t *);
extern ctf_dtdef_t *ctf_dtd_lookup (const ctf_dict_t *, ctf_id_t);
extern ctf_dtdef_t *ctf_dynamic_type (const ctf_dict_t *, ctf_id_t);

extern int ctf_dvd_insert (ctf_dict_t *, ctf_dvdef_t *);
extern void ctf_dvd_delete (ctf_dict_t *, ctf_dvdef_t *);
extern ctf_dvdef_t *ctf_dvd_lookup (const ctf_dict_t *, const char *);

extern ctf_id_t ctf_add_encoded (ctf_dict_t *, uint32_t, const char *,
				 const ctf_encoding_t *, uint32_t kind);
extern ctf_id_t ctf_add_reftype (ctf_dict_t *, uint32_t, ctf_id_t,
				 uint32_t kind);
extern int ctf_add_variable_forced (ctf_dict_t *, const char *, ctf_id_t);
extern int ctf_add_funcobjt_sym_forced (ctf_dict_t *, int is_function,
					const char *, ctf_id_t);

extern int ctf_track_enumerator (ctf_dict_t *, ctf_id_t, const char *);

extern int ctf_dedup_atoms_init (ctf_dict_t *);
extern int ctf_dedup (ctf_dict_t *, ctf_dict_t **, uint32_t ninputs,
		      int cu_mapped);
extern ctf_dict_t **ctf_dedup_emit (ctf_dict_t *, ctf_dict_t **,
				    uint32_t ninputs, uint32_t *parents,
				    uint32_t *noutputs, int cu_mapped);
extern void ctf_dedup_fini (ctf_dict_t *, ctf_dict_t **, uint32_t);
extern ctf_id_t ctf_dedup_type_mapping (ctf_dict_t *fp, ctf_dict_t *src_fp,
					ctf_id_t src_type);

extern void ctf_decl_init (ctf_decl_t *);
extern void ctf_decl_fini (ctf_decl_t *);
extern void ctf_decl_push (ctf_decl_t *, ctf_dict_t *, ctf_id_t);

_libctf_printflike_ (2, 3)
extern void ctf_decl_sprintf (ctf_decl_t *, const char *, ...);
extern char *ctf_decl_buf (ctf_decl_t *cd);

extern const char *ctf_strptr (ctf_dict_t *, uint32_t);
extern const char *ctf_strraw (ctf_dict_t *, uint32_t);
extern const char *ctf_strraw_explicit (ctf_dict_t *, uint32_t,
					ctf_strs_t *);
extern const char *ctf_strptr_validate (ctf_dict_t *, uint32_t);
extern int ctf_str_create_atoms (ctf_dict_t *);
extern void ctf_str_free_atoms (ctf_dict_t *);
extern uint32_t ctf_str_add (ctf_dict_t *, const char *);
extern uint32_t ctf_str_add_ref (ctf_dict_t *, const char *, uint32_t *ref);
extern uint32_t ctf_str_add_movable_ref (ctf_dict_t *, const char *,
					 uint32_t *ref);
extern int ctf_str_move_refs (ctf_dict_t *fp, void *src, size_t len, void *dest);
extern int ctf_str_add_external (ctf_dict_t *, const char *, uint32_t offset);
extern void ctf_str_remove_ref (ctf_dict_t *, const char *, uint32_t *ref);
extern void ctf_str_rollback (ctf_dict_t *, ctf_snapshot_id_t);
extern const ctf_strs_writable_t *ctf_str_write_strtab (ctf_dict_t *);

extern struct ctf_archive_internal *
ctf_new_archive_internal (int is_archive, int unmap_on_close,
			  struct ctf_archive *, ctf_dict_t *,
			  const ctf_sect_t *symsect,
			  const ctf_sect_t *strsect, int *errp);
extern struct ctf_archive *ctf_arc_open_internal (const char *, int *);
extern void ctf_arc_close_internal (struct ctf_archive *);
extern const ctf_preamble_t *ctf_arc_bufpreamble (const ctf_sect_t *);
extern void *ctf_set_open_errno (int *, int);
extern void ctf_flip_header (ctf_header_t *);
extern int ctf_flip (ctf_dict_t *, ctf_header_t *, unsigned char *, int);

extern int ctf_import_unref (ctf_dict_t *fp, ctf_dict_t *pfp);

extern int ctf_write_thresholded (ctf_dict_t *fp, int fd, size_t threshold);

_libctf_malloc_
extern void *ctf_mmap (size_t length, size_t offset, int fd);
extern void ctf_munmap (void *, size_t);
extern ssize_t ctf_pread (int fd, void *buf, ssize_t count, off_t offset);

extern char *ctf_str_append (char *, const char *);
extern char *ctf_str_append_noerr (char *, const char *);

extern ctf_id_t ctf_type_resolve_unsliced (ctf_dict_t *, ctf_id_t);
extern int ctf_type_kind_unsliced (ctf_dict_t *, ctf_id_t);

_libctf_printflike_ (1, 2)
extern void ctf_dprintf (const char *, ...);
extern void libctf_init_debug (void);

_libctf_printflike_ (4, 5)
extern void ctf_err_warn (ctf_dict_t *, int is_warning, int err,
			  const char *, ...);
extern void ctf_err_warn_to_open (ctf_dict_t *);
extern void ctf_assert_fail_internal (ctf_dict_t *, const char *,
				      size_t, const char *);
extern const char *ctf_link_input_name (ctf_dict_t *);

extern ctf_link_sym_t *ctf_elf32_to_link_sym (ctf_dict_t *fp, ctf_link_sym_t *dst,
					      const Elf32_Sym *src, uint32_t symidx);
extern ctf_link_sym_t *ctf_elf64_to_link_sym (ctf_dict_t *fp, ctf_link_sym_t *dst,
					      const Elf64_Sym *src, uint32_t symidx);

/* Variables, all underscore-prepended. */

extern const char _CTF_SECTION[];	/* name of CTF ELF section */
extern const char _CTF_NULLSTR[];	/* empty string */

extern int _libctf_version;	/* library client version */
extern int _libctf_debug;	/* debugging messages enabled */

#include "ctf-inlines.h"

#ifdef	__cplusplus
}
#endif

#endif /* _CTF_IMPL_H */
