#ifndef _LIBCTF_H
#define _LIBCTF_H
#include <sys/ctf_api.h>
#include <libelf.h>
#ifdef __cplusplus
extern "C" {
#endif
extern int _libctf_debug;
typedef enum ctf_diff_flag {
CTF_DIFF_F_IGNORE_INTNAMES = 0x01
} ctf_diff_flag_t;
typedef struct ctf_diff ctf_diff_t;
typedef void (*ctf_diff_type_f)(ctf_file_t *, ctf_id_t, boolean_t, ctf_file_t *,
ctf_id_t, void *);
typedef void (*ctf_diff_func_f)(ctf_file_t *, ulong_t, boolean_t, ctf_file_t *,
ulong_t, void *);
typedef void (*ctf_diff_obj_f)(ctf_file_t *, ulong_t, ctf_id_t, boolean_t,
ctf_file_t *, ulong_t, ctf_id_t, void *);
extern int ctf_diff_init(ctf_file_t *, ctf_file_t *, ctf_diff_t **);
extern uint_t ctf_diff_getflags(ctf_diff_t *);
extern int ctf_diff_setflags(ctf_diff_t *, uint_t);
extern int ctf_diff_types(ctf_diff_t *, ctf_diff_type_f, void *);
extern int ctf_diff_functions(ctf_diff_t *, ctf_diff_func_f, void *);
extern int ctf_diff_objects(ctf_diff_t *, ctf_diff_obj_f, void *);
extern void ctf_diff_fini(ctf_diff_t *);
#define CTF_CONVERT_DEFAULT_BATCHSIZE 256
#define CTF_CONVERT_DEFAULT_NTHREADS 4
typedef enum ctf_convert_flag {
CTF_ALLOW_MISSING_DEBUG = 0x01,
CTF_ALLOW_TRUNCATION = 0x02,
CTF_FORCE_CONVERSION = 0x04
} ctf_convert_flag_t;
#define CTF_CONVERT_ALL_FLAGS (CTF_ALLOW_MISSING_DEBUG | \
CTF_ALLOW_TRUNCATION | \
CTF_FORCE_CONVERSION)
struct ctf_convert_handle;
typedef struct ctf_convert_handle ctf_convert_t;
extern ctf_convert_t *ctf_convert_init(int *);
extern void ctf_convert_fini(ctf_convert_t *);
typedef void (*ctf_convert_warn_f)(void *, const char *, ...);
extern int ctf_convert_set_warncb(ctf_convert_t *, ctf_convert_warn_f, void *);
extern int ctf_convert_set_batchsize(ctf_convert_t *, uint_t);
extern int ctf_convert_set_flags(ctf_convert_t *, ctf_convert_flag_t);
extern int ctf_convert_set_label(ctf_convert_t *, const char *);
extern int ctf_convert_set_nthreads(ctf_convert_t *, uint_t);
extern int ctf_convert_add_ignore(ctf_convert_t *, const char *);
extern ctf_file_t *ctf_fdconvert(ctf_convert_t *, int, int *, char *, size_t);
typedef enum ctf_hsc_ret {
CHR_ERROR = -1,
CHR_NO_C_SOURCE = 0,
CHR_HAS_C_SOURCE = 1
} ctf_hsc_ret_t;
extern ctf_hsc_ret_t ctf_has_c_source(Elf *, char *, size_t);
typedef struct ctf_merge_handle ctf_merge_t;
extern ctf_merge_t *ctf_merge_init(int, int *);
extern int ctf_merge_add(ctf_merge_t *, ctf_file_t *);
extern int ctf_merge_set_nthreads(ctf_merge_t *, const uint_t);
extern int ctf_merge_label(ctf_merge_t *, const char *);
extern int ctf_merge_uniquify(ctf_merge_t *, ctf_file_t *, const char *);
extern int ctf_merge_merge(ctf_merge_t *, ctf_file_t **);
extern int ctf_merge_dedup(ctf_merge_t *, ctf_file_t **);
extern void ctf_merge_fini(ctf_merge_t *);
#define CTF_ELFWRITE_F_COMPRESS 0x1
extern int ctf_elffdwrite(ctf_file_t *, int, int, int);
extern int ctf_elfwrite(ctf_file_t *, const char *, const char *, int);
#ifdef __cplusplus
}
#endif
#endif