summaryrefslogtreecommitdiffstats
path: root/libdwarf/libdwarf.h
diff options
context:
space:
mode:
Diffstat (limited to 'libdwarf/libdwarf.h')
-rw-r--r--libdwarf/libdwarf.h514
1 files changed, 514 insertions, 0 deletions
diff --git a/libdwarf/libdwarf.h b/libdwarf/libdwarf.h
new file mode 100644
index 00000000..37c958ca
--- /dev/null
+++ b/libdwarf/libdwarf.h
@@ -0,0 +1,514 @@
+/* Interface for libdwarf.
+ Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
+
+ This program is Open Source software; you can redistribute it and/or
+ modify it under the terms of the Open Software License version 1.0 as
+ published by the Open Source Initiative.
+
+ You should have received a copy of the Open Software License along
+ with this program; if not, you may obtain a copy of the Open Software
+ License version 1.0 from http://www.opensource.org/licenses/osl.php or
+ by writing the Open Source Initiative c/o Lawrence Rosen, Esq.,
+ 3001 King Ranch Road, Ukiah, CA 95482. */
+
+#ifndef _LIBDWARF_H
+#define _LIBDWARF_H 1
+
+#include <libelf.h>
+#include <stdint.h>
+
+/* Basic data types. */
+
+/* Used for boolean values. */
+typedef int Dwarf_Bool;
+
+/* Numeric values of different sizes. */
+typedef uint8_t Dwarf_Small;
+typedef uint16_t Dwarf_Half;
+typedef uint64_t Dwarf_Unsigned;
+typedef int64_t Dwarf_Signed;
+
+/* Offsets in the debugging sections. */
+typedef uint64_t Dwarf_Off;
+
+/* Program counter value in the target object file. */
+typedef uint64_t Dwarf_Addr;
+
+/* Address in the host process. */
+typedef void *Dwarf_Ptr;
+
+
+/* Location record. */
+typedef struct
+ {
+ Dwarf_Small lr_atom; /* Operation */
+ Dwarf_Unsigned lr_number; /* Operand */
+ Dwarf_Unsigned lr_number2; /* Possible second operand */
+ Dwarf_Unsigned lr_offset; /* Offset in location expression */
+ } Dwarf_Loc;
+
+
+/* Location description. */
+typedef struct
+ {
+ Dwarf_Addr ld_lopc; /* Beginning of range */
+ Dwarf_Addr ld_hipc; /* End of range */
+ Dwarf_Half ld_cents; /* Number of location records */
+ Dwarf_Loc *ld_s; /* Array of location records */
+ } Dwarf_Locdesc;
+
+
+/* Error handler function. */
+typedef struct Dwarf_Error_s *Dwarf_Error; /* Forward declaration. */
+typedef void (*Dwarf_Handler) (Dwarf_Error *, Dwarf_Ptr);
+
+/* Descriptor for block of uninterpreted data. */
+typedef struct
+ {
+ Dwarf_Unsigned bl_len;
+ Dwarf_Ptr bl_data;
+ } Dwarf_Block;
+
+
+/* Descriptor for libdwarf session. */
+typedef struct Dwarf_Debug_s *Dwarf_Debug;
+
+/* Descriptor for DWARF DIE. */
+typedef struct Dwarf_Die_s *Dwarf_Die;
+
+/* Descriptor for DWARF attribute list. */
+typedef struct Dwarf_Attribute_s *Dwarf_Attribute;
+
+/* Descriptor for source lines. */
+typedef struct Dwarf_Line_s *Dwarf_Line;
+
+/* Descriptor for global name. */
+typedef struct Dwarf_Global_s *Dwarf_Global;
+
+/* Descriptor for address range. */
+typedef struct Dwarf_Arange_s *Dwarf_Arange;
+
+/* Descriptor for common information entry. */
+typedef struct Dwarf_Cie_s *Dwarf_Cie;
+
+/* Descriptor for frame descriptor entry. */
+typedef struct Dwarf_Fde_s *Dwarf_Fde;
+
+/* Descriptor for abbreviations. */
+typedef struct Dwarf_Abbrev_s *Dwarf_Abbrev;
+
+
+/* Return values. */
+enum
+ {
+ DW_DLV_NO_ENTRY = -1, /* No error, but no entry. */
+ DW_DLV_OK = 0, /* Success. */
+ DW_DLV_ERROR = 1, /* Failure. */
+ };
+
+
+/* Values for ACCESS parameter of 'dwarf_init' and 'dwarf_elf_init'. */
+enum
+ {
+ DW_DLC_READ = 0, /* Read-only access. */
+ DW_DLC_WRITE = 1, /* Write-only access. */
+ DW_DLC_RDWR = 2 /* Read-write access. */
+ };
+
+
+/* Open file associates with FD for use with the other functions of
+ this library. Set the error handler and the parameter passed. */
+extern int dwarf_init (int fd, Dwarf_Unsigned access,
+ Dwarf_Handler errhand, Dwarf_Ptr errarg,
+ Dwarf_Debug *dbg, Dwarf_Error *errdesc);
+
+/* Similar to `dwarf_init' but instead of a file descriptor of ELF
+ descriptor is passed. */
+extern int dwarf_elf_init (Elf *elf, Dwarf_Unsigned access,
+ Dwarf_Handler errhand, Dwarf_Ptr errarg,
+ Dwarf_Debug *dbg, Dwarf_Error *errdesc);
+
+/* Return ELF handle. */
+extern int dwarf_get_elf_init (Dwarf_Debug dbg, Elf **elf,
+ Dwarf_Error *errdesc);
+
+/* Free resources allocated for debug handle. */
+extern int dwarf_finish (Dwarf_Debug dbg, Dwarf_Error *errdesc);
+
+
+/* Return information about current and find new compile unit header. */
+extern int dwarf_next_cu_header (Dwarf_Debug dbg,
+ Dwarf_Unsigned *cu_header_length,
+ Dwarf_Half *version_stamp,
+ Dwarf_Unsigned *abbrev_offset,
+ Dwarf_Half *address_size,
+ Dwarf_Unsigned *next_cu_header,
+ Dwarf_Error *errdesc);
+
+/* Return sibling of given DIE. */
+extern int dwarf_siblingof (Dwarf_Debug dbg, Dwarf_Die die,
+ Dwarf_Die *return_sub, Dwarf_Error *errdesc);
+
+/* Return child of DIE. */
+extern int dwarf_child (Dwarf_Die die, Dwarf_Die *return_kid,
+ Dwarf_Error *errdesc);
+
+/* Return DIE at given offset. */
+extern int dwarf_offdie (Dwarf_Debug dbg, Dwarf_Off offset,
+ Dwarf_Die *return_die, Dwarf_Error *errdesc);
+
+
+/* Return tag of DIE. */
+extern int dwarf_tag (Dwarf_Die die, Dwarf_Half *tagval, Dwarf_Error *errdesc);
+
+/* Return offset of DIE in .debug_info section. */
+extern int dwarf_dieoffset (Dwarf_Die die, Dwarf_Off *return_offset,
+ Dwarf_Error *errdesc);
+
+/* Return offset of DIE in compile unit data. */
+extern int dwarf_die_CU_offset (Dwarf_Die die, Dwarf_Off *return_offset,
+ Dwarf_Error *errdesc);
+
+/* Return name attribute of DIE. */
+extern int dwarf_diename (Dwarf_Die die, char **return_name,
+ Dwarf_Error *errdesc);
+
+/* Return list of attributes for DIE. */
+extern int dwarf_attrlist (Dwarf_Die die, Dwarf_Attribute **attrbuf,
+ Dwarf_Signed *attrcount, Dwarf_Error *errdesc);
+
+/* Determine whether DIE has attribute specified of given type. */
+extern int dwarf_hasattr (Dwarf_Die die, Dwarf_Half attr,
+ Dwarf_Bool *return_bool, Dwarf_Error *errdesc);
+
+/* Return DIE attribute with specified of given type. */
+extern int dwarf_attr (Dwarf_Die die, Dwarf_Half attr,
+ Dwarf_Attribute *return_attr, Dwarf_Error *errdesc);
+
+/* Return low program counter value associated with die. */
+extern int dwarf_lowpc (Dwarf_Die die, Dwarf_Addr *return_lowpc,
+ Dwarf_Error *errdesc);
+
+/* Return high program counter value associated with die. */
+extern int dwarf_highpc (Dwarf_Die die, Dwarf_Addr *return_lowpc,
+ Dwarf_Error *errdesc);
+
+/* Return byte size value associated with die. */
+extern int dwarf_bytesize (Dwarf_Die die, Dwarf_Unsigned *return_size,
+ Dwarf_Error *errdesc);
+
+/* Return bit size value associated with die. */
+extern int dwarf_bitsize (Dwarf_Die die, Dwarf_Unsigned *return_size,
+ Dwarf_Error *errdesc);
+
+/* Return bit offset value associated with die. */
+extern int dwarf_bitoffset (Dwarf_Die die, Dwarf_Unsigned *return_size,
+ Dwarf_Error *errdesc);
+
+/* Return source language associated with die. */
+extern int dwarf_srclang (Dwarf_Die die, Dwarf_Unsigned *return_lang,
+ Dwarf_Error *errdesc);
+
+/* Return source language associated with die. */
+extern int dwarf_arrayorder (Dwarf_Die die, Dwarf_Unsigned *return_order,
+ Dwarf_Error *errdesc);
+
+
+/* Determine whether attribute has given form. */
+extern int dwarf_hasform (Dwarf_Attribute attr, Dwarf_Half form,
+ Dwarf_Bool *return_hasform, Dwarf_Error *errdesc);
+
+/* Return form of attribute. */
+extern int dwarf_whatform (Dwarf_Attribute attr, Dwarf_Half *return_form,
+ Dwarf_Error *errdesc);
+
+/* Return code of attribute. */
+extern int dwarf_whatattr (Dwarf_Attribute attr, Dwarf_Half *return_attr,
+ Dwarf_Error *errdesc);
+
+/* Return compile-unit relative offset of reference associated with form. */
+extern int dwarf_formref (Dwarf_Attribute attr, Dwarf_Off *return_offset,
+ Dwarf_Error *errdesc);
+
+/* Return .debug_info section global offset of reference associated
+ with form. */
+extern int dwarf_global_formref (Dwarf_Attribute attr,
+ Dwarf_Off *return_offset,
+ Dwarf_Error *errdesc);
+
+/* Return address represented by attribute. */
+extern int dwarf_formaddr (Dwarf_Attribute attr, Dwarf_Addr *return_addr,
+ Dwarf_Error *errdesc);
+
+/* Return flag represented by attribute. */
+extern int dwarf_formflag (Dwarf_Attribute attr, Dwarf_Bool *return_bool,
+ Dwarf_Error *errdesc);
+
+/* Return unsigned constant represented by attribute. */
+extern int dwarf_formudata (Dwarf_Attribute attr, Dwarf_Unsigned *return_uval,
+ Dwarf_Error *errdesc);
+
+/* Return signed constant represented by attribute. */
+extern int dwarf_formsdata (Dwarf_Attribute attr, Dwarf_Signed *return_uval,
+ Dwarf_Error *errdesc);
+
+/* Return block of uninterpreted data represented by attribute. */
+extern int dwarf_formblock (Dwarf_Attribute attr, Dwarf_Block **return_block,
+ Dwarf_Error *errdesc);
+
+/* Return string represented by attribute. */
+extern int dwarf_formstring (Dwarf_Attribute attr, char **return_string,
+ Dwarf_Error *errdesc);
+
+/* Return location expression list. */
+extern int dwarf_loclist (Dwarf_Attribute attr, Dwarf_Locdesc **llbuf,
+ Dwarf_Signed *listlen, Dwarf_Error *errdesc);
+
+
+/* Return source lines of compilation unit. */
+extern int dwarf_srclines (Dwarf_Die die, Dwarf_Line **linebuf,
+ Dwarf_Signed *linecount, Dwarf_Error *errdesc);
+
+/* Return files used in compilation unit. */
+extern int dwarf_srcfiles (Dwarf_Die die, char ***srcfiles,
+ Dwarf_Signed *srcfilecount, Dwarf_Error *errdesc);
+
+/* Determine whether line is the beginning of a statement. */
+extern int dwarf_linebeginstatement (Dwarf_Line line, Dwarf_Bool *return_bool,
+ Dwarf_Error *errdesc);
+
+/* Determine whether line is marked as ending a text sequence. */
+extern int dwarf_lineendsequence (Dwarf_Line line, Dwarf_Bool *return_bool,
+ Dwarf_Error *errdesc);
+
+/* Return source statement line number. */
+extern int dwarf_lineno (Dwarf_Line line, Dwarf_Unsigned *return_lineno,
+ Dwarf_Error *errdesc);
+
+/* Return address associate with line. */
+extern int dwarf_lineaddr (Dwarf_Line line, Dwarf_Addr *return_lineaddr,
+ Dwarf_Error *errdesc);
+
+/* Return column at which the statement begins. */
+extern int dwarf_lineoff (Dwarf_Line line, Dwarf_Signed *return_lineoff,
+ Dwarf_Error *errdesc);
+
+/* Return source file for line. */
+extern int dwarf_linesrc (Dwarf_Line line, char **return_linesrc,
+ Dwarf_Error *errdesc);
+
+/* Determine whether line is marked as beginning a basic block. */
+extern int dwarf_lineblock (Dwarf_Line line, Dwarf_Bool *return_bool,
+ Dwarf_Error *errdesc);
+
+/* Determine whether line is marked as ending the prologue. */
+extern int dwarf_lineprologueend (Dwarf_Line line, Dwarf_Bool *return_bool,
+ Dwarf_Error *errdesc);
+
+/* Determine whether line is marked as beginning the epilogue. */
+extern int dwarf_lineepiloguebegin (Dwarf_Line line, Dwarf_Bool *return_bool,
+ Dwarf_Error *errdesc);
+
+
+/* Return list of global definitions. */
+extern int dwarf_get_globals (Dwarf_Debug dbg, Dwarf_Global **globals,
+ Dwarf_Signed *return_count,
+ Dwarf_Error *errdesc);
+
+/* Return name for global definition. */
+extern int dwarf_globname (Dwarf_Global global, char **return_name,
+ Dwarf_Error *errdesc);
+
+/* Return DIE offset for global definition. */
+extern int dwarf_global_die_offset (Dwarf_Global global,
+ Dwarf_Off *return_offset,
+ Dwarf_Error *errdesc);
+
+/* Return offset of header of compile unit containing the global definition. */
+extern int dwarf_global_cu_offset (Dwarf_Global global,
+ Dwarf_Off *return_offset,
+ Dwarf_Error *errdesc);
+
+/* Return name, DIE offset, and offset of the compile unit DIE for the
+ global definition. */
+extern int dwarf_global_name_offsets (Dwarf_Global global, char **return_name,
+ Dwarf_Off *die_offset,
+ Dwarf_Off *cu_offset,
+ Dwarf_Error *errdesc);
+
+
+/* Find start of macro value. */
+extern char *dwarf_find_macro_value_start (char *macro_string);
+
+
+/* Return string from debug string section. */
+extern int dwarf_get_str (Dwarf_Debug dbg, Dwarf_Off offset, char **string,
+ Dwarf_Signed *returned_str_len,
+ Dwarf_Error *errdesc);
+
+
+/* Return list address ranges. */
+extern int dwarf_get_aranges (Dwarf_Debug dbg, Dwarf_Arange **aranges,
+ Dwarf_Signed *return_count,
+ Dwarf_Error *errdesc);
+
+/* Find matching range for address. */
+extern int dwarf_get_arange (Dwarf_Arange *aranges,
+ Dwarf_Unsigned arange_count, Dwarf_Addr address,
+ Dwarf_Arange *return_arange,
+ Dwarf_Error *errdesc);
+
+/* Return offset of compile unit DIE containing the range. */
+extern int dwarf_get_cu_die_offset (Dwarf_Arange arange,
+ Dwarf_Off *return_offset,
+ Dwarf_Error *errdesc);
+
+/* Return start, length, and CU DIE offset of range. */
+extern int dwarf_get_arange_info (Dwarf_Arange arange, Dwarf_Addr *start,
+ Dwarf_Unsigned *length,
+ Dwarf_Off *cu_die_offset,
+ Dwarf_Error *errdesc);
+
+
+/* Frame descriptor handling. */
+
+/* Get frame descriptions. GCC version using .eh_frame. */
+extern int dwarf_get_fde_list_eh (Dwarf_Debug dbg, Dwarf_Cie **cie_data,
+ Dwarf_Signed *cie_element_count,
+ Dwarf_Fde **fde_data,
+ Dwarf_Signed *fde_element_count,
+ Dwarf_Error *errdesc);
+
+/* Get CIE of FDE. */
+extern int dwarf_get_cie_of_fde (Dwarf_Fde fde, Dwarf_Cie *return_cie,
+ Dwarf_Error *errdesc);
+
+/* Get information about the function range. */
+extern int dwarf_get_fde_range (Dwarf_Fde fde, Dwarf_Addr *low_pc,
+ Dwarf_Unsigned *func_length,
+ Dwarf_Ptr *fde_bytes,
+ Dwarf_Unsigned *fde_byte_length,
+ Dwarf_Off *cie_offset, Dwarf_Signed *cie_index,
+ Dwarf_Off *fde_offset, Dwarf_Error *errdesc);
+
+/* Get information about CIE. */
+extern int dwarf_get_cie_info (Dwarf_Cie cie, Dwarf_Unsigned *bytes_in_cie,
+ Dwarf_Small *version, char **augmenter,
+ Dwarf_Unsigned *code_alignment_factor,
+ Dwarf_Signed *data_alignment_factor,
+ Dwarf_Half *return_address_register,
+ Dwarf_Ptr *initial_instructions,
+ Dwarf_Unsigned *initial_instructions_length,
+ Dwarf_Error *errdesc);
+
+/* Get frame construction instructions of FDE. */
+extern int dwarf_get_fde_instr_bytes (Dwarf_Fde fde, Dwarf_Ptr *outinstrs,
+ Dwarf_Unsigned *outlen,
+ Dwarf_Error *errdesc);
+
+/* Get nth frame descriptions. */
+extern int dwarf_get_fde_n (Dwarf_Fde *fde_data, Dwarf_Unsigned fde_index,
+ Dwarf_Fde *returned_fde, Dwarf_Error *errdesc);
+
+/* Find FDE for given address. */
+extern int dwarf_get_fde_at_pc (Dwarf_Fde *fde_data, Dwarf_Addr pc_of_interest,
+ Dwarf_Fde *returned_fde, Dwarf_Addr *lopc,
+ Dwarf_Addr *hipc, Dwarf_Error *errdesc);
+
+
+/* Return location list entry. */
+extern int dwarf_get_loclist_entry (Dwarf_Debug dbg, Dwarf_Unsigned offset,
+ Dwarf_Addr *hipc_offset,
+ Dwarf_Addr *lopc_offset, Dwarf_Ptr *data,
+ Dwarf_Unsigned *entry_len,
+ Dwarf_Unsigned *next_entry,
+ Dwarf_Error *errdesc);
+
+
+/* Get abbreviation record. */
+extern int dwarf_get_abbrev (Dwarf_Debug dbg,
+ Dwarf_Unsigned offset,
+ Dwarf_Abbrev *returned_abbrev,
+ Dwarf_Unsigned *length,
+ Dwarf_Unsigned *attr_count, Dwarf_Error *errdesc);
+
+/* Get tag of abbreviation record. */
+extern int dwarf_get_abbrev_tag (Dwarf_Abbrev abbrev, Dwarf_Half *return_tag,
+ Dwarf_Error *errdesc);
+
+/* Get code of abbreviation record. */
+extern int dwarf_get_abbrev_code (Dwarf_Abbrev abbrev,
+ Dwarf_Unsigned *return_code,
+ Dwarf_Error *errdesc);
+
+/* Get children flag of abbreviation record. */
+extern int dwarf_get_abbrev_children_flag (Dwarf_Abbrev abbrev,
+ Dwarf_Signed *return_flag,
+ Dwarf_Error *errdesc);
+
+/* Get attribute from abbreviation record. */
+extern int dwarf_get_abbrev_entry (Dwarf_Abbrev abbrev, Dwarf_Signed idx,
+ Dwarf_Half *attr_num, Dwarf_Signed *form,
+ Dwarf_Off *offset, Dwarf_Error *errdesc);
+
+
+/* Memory handling. */
+
+/* Values for ALLOC_TYPE parameter of 'dwarf_dealloc'. */
+enum
+ {
+ DW_DLA_NONE = 0,
+ DW_DLA_STRING, /* char* */
+ DW_DLA_LOC, /* Dwarf_Loc */
+ DW_DLA_LOCDESC, /* Dwarf_Locdesc */
+ DW_DLA_ELLIST, /* Dwarf_Ellist */
+ DW_DLA_BOUNDS, /* Dwarf_Bounds */
+ DW_DLA_BLOCK, /* Dwarf_Block */
+ DW_DLA_DEBUG, /* Dwarf_Debug */
+ DW_DLA_DIE, /* Dwarf_Die */
+ DW_DLA_LINE, /* Dwarf_Line */
+ DW_DLA_ATTR, /* Dwarf_Attribute */
+ DW_DLA_TYPE, /* Dwarf_Type */
+ DW_DLA_SUBSCR, /* Dwarf_Subscr */
+ DW_DLA_GLOBAL, /* Dwarf_Global */
+ DW_DLA_ERROR, /* Dwarf_Error */
+ DW_DLA_LIST, /* a list */
+ DW_DLA_LINEBUF, /* Dwarf_Line* */
+ DW_DLA_ARANGE, /* Dwarf_Arange */
+ DW_DLA_ABBREV, /* Dwarf_Abbrev */
+ DW_DLA_FRAME_OP, /* Dwarf_Frame_Op */
+ DW_DLA_CIE, /* Dwarf_Cie */
+ DW_DLA_FDE, /* Dwarf_Fde */
+ DW_DLA_LOC_BLOCK, /* Dwarf_Loc Block */
+ DW_DLA_FRAME_BLOCK, /* Dwarf_Frame Block */
+ DW_DLA_FUNC, /* Dwarf_Func */
+ DW_DLA_TYPENAME, /* Dwarf_Type */
+ DW_DLA_VAR, /* Dwarf_Var */
+ DW_DLA_WEAK, /* Dwarf_Weak */
+ DW_DLA_ADDR, /* Dwarf_Addr sized entries */
+ };
+
+/* Deallocate memory. */
+extern void dwarf_dealloc (Dwarf_Debug dbg, Dwarf_Ptr space,
+ Dwarf_Unsigned alloc_type);
+
+
+/* Determine size of address of the binary. */
+extern int dwarf_get_address_size (Dwarf_Debug dbg, Dwarf_Half *addr_size,
+ Dwarf_Error *errdesc);
+
+
+/* Return error number. */
+extern Dwarf_Unsigned dwarf_errno (Dwarf_Error errdesc);
+
+/* Return string corresponding to error. */
+extern const char *dwarf_errmsg (Dwarf_Error errdesc);
+
+
+/* Set new error handler. */
+extern Dwarf_Handler dwarf_seterrhand (Dwarf_Debug dbg, Dwarf_Handler errhand);
+
+/* Set new error handler argument. */
+extern Dwarf_Ptr dwarf_seterrarg (Dwarf_Debug dbg, Dwarf_Ptr errarg);
+
+#endif /* libdwarf.h */