/* Interfaces for libdw. Copyright (C) 2002, 2004 Red Hat, Inc. Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. 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 _LIBDW_H #define _LIBDW_H 1 #include <gelf.h> #include <stdbool.h> #include <stddef.h> #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3) # define __nonnull_attribute__(...) __attribute__ ((__nonnull__ (__VA_ARGS__))) #else # define __nonnull_attribute__(args...) #endif /* Mode for the session. */ typedef enum { DWARF_C_READ, /* Read .. */ DWARF_C_RDWR, /* Read and write .. */ DWARF_C_WRITE, /* Write .. */ } Dwarf_Cmd; /* Callback results. */ enum { DWARF_CB_OK = 0, DWARF_CB_ABORT }; /* Error values. */ enum { DW_TAG_invalid = 0 #define DW_TAG_invalid DW_TAG_invalid }; /* Type for offset in DWARF file. */ typedef GElf_Off Dwarf_Off; /* Type for address in DWARF file. */ typedef GElf_Addr Dwarf_Addr; /* Integer types. Big enough to hold any numeric value. */ typedef GElf_Xword Dwarf_Word; typedef GElf_Sxword Dwarf_Sword; /* For the times we know we do not need that much. */ typedef GElf_Half Dwarf_Half; /* DWARF abbreviation record. */ typedef struct Dwarf_Abbrev Dwarf_Abbrev; /* Source code line information for CU. */ typedef struct Dwarf_Lines_s Dwarf_Lines; /* One source code line information. */ typedef struct Dwarf_Line_s Dwarf_Line; /* Source file information. */ typedef struct Dwarf_Files_s Dwarf_Files; /* One address range record. */ typedef struct Dwarf_Arange_s Dwarf_Arange; /* Address ranges of a file. */ typedef struct Dwarf_Aranges_s Dwarf_Aranges; /* CU representation. */ struct Dwarf_CU; /* Attribute representation. */ typedef struct { unsigned int code; unsigned int form; unsigned char *valp; struct Dwarf_CU *cu; } Dwarf_Attribute; /* Data block representation. */ typedef struct { Dwarf_Word length; unsigned char *data; } Dwarf_Block; /* Macro information. */ typedef struct { unsigned int opcode; Dwarf_Word param1; union { Dwarf_Word u; const char *s; } param2; } Dwarf_Macro; /* DIE information. */ typedef struct { /* The offset can be computed from the address. */ void *addr; struct Dwarf_CU *cu; Dwarf_Abbrev *abbrev; // XXX We'll see what other information will be needed. } Dwarf_Die; /* Returned to show the last DIE has be returned. */ #define DWARF_END_DIE ((Dwarf_Die *) -1l) /* Global symbol information. */ typedef struct { Dwarf_Off cu_offset; Dwarf_Off die_offset; const char *name; } Dwarf_Global; // XXX It remains to be seen whether the next two need to be exported. /* Location record. */ typedef struct { uint8_t atom; /* Operation */ Dwarf_Word number; /* Operand */ Dwarf_Word number2; /* Possible second operand */ Dwarf_Word offset; /* Offset in location expression */ } Dwarf_Loc; /* Handle for debug sessions. */ typedef struct Dwarf Dwarf; /* Out-Of-Memory handler. */ typedef void (*__attribute__ ((noreturn)) Dwarf_OOM) (void); /* Create a handle for a new debug session. */ extern Dwarf *dwarf_begin (int fildes, Dwarf_Cmd cmd); /* Create a handle for a new debug session for an ELF file. */ extern Dwarf *dwarf_begin_elf (Elf *elf, Dwarf_Cmd cmd, Elf_Scn *scngrp); /* Retrieve ELF descriptor used for DWARF access. */ extern Elf *dwarf_getelf (Dwarf *dwarf); /* Release debugging handling context. */ extern int dwarf_end (Dwarf *dwarf); /* Get the data block for the .debug_info section. */ extern Elf_Data *dwarf_getscn_info (Dwarf *dwarf); /* Read the header for the DWARF CU header. */ extern int dwarf_nextcu (Dwarf *dwarf, Dwarf_Off off, Dwarf_Off *next_off, size_t *header_sizep, Dwarf_Off *abbrev_offsetp, uint8_t *address_sizep, uint8_t *offset_sizep) __nonnull_attribute__ (3); /* Return DIE at given offset. */ extern Dwarf_Die *dwarf_offdie (Dwarf *dbg, Dwarf_Off offset, Dwarf_Die *result) __nonnull_attribute__ (3); /* Return offset of DIE. */ extern Dwarf_Off dwarf_dieoffset (Dwarf_Die *die); /* Return offset of DIE in CU. */ extern Dwarf_Off dwarf_cuoffset (Dwarf_Die *die); /* Return vhild of current DIE. */ extern int dwarf_child (Dwarf_Die *die, Dwarf_Die *result) __nonnull_attribute__ (2); /* Return sibling of given DIE. */ extern int dwarf_siblingof (Dwarf_Die *die, Dwarf_Die *result) __nonnull_attribute__ (2); /* Check whether the DIE has children. */ extern int dwarf_haschildren (Dwarf_Die *die); /* Get attributes of the DIE. */ extern ptrdiff_t dwarf_getattrs (Dwarf_Die *die, int (*callback) (Dwarf_Attribute *, void *), void *arg, ptrdiff_t offset); /* Return tag of given DIE. */ extern int dwarf_tag (Dwarf_Die *die); /* Return specific attribute of DIE. */ extern Dwarf_Attribute *dwarf_attr (Dwarf_Die *die, unsigned int search_name, Dwarf_Attribute *result) __nonnull_attribute__ (3); /* Check whether given DIE has specific attribute. */ extern int dwarf_hasattr (Dwarf_Die *die, unsigned int search_name); /* Check whether given attribute has specific form. */ extern int dwarf_hasform (Dwarf_Attribute *attr, unsigned int search_form); /* Return attribute code of given attribute. */ extern unsigned int dwarf_whatattr (Dwarf_Attribute *attr); /* Return form code of given attribute. */ extern unsigned int dwarf_whatform (Dwarf_Attribute *attr); /* Return string associated with given attribute. */ extern const char *dwarf_formstring (Dwarf_Attribute *attrp); /* Return unsigned constant represented by attribute. */ extern int dwarf_formudata (Dwarf_Attribute *attr, Dwarf_Word *return_uval) __nonnull_attribute__ (2); /* Return signed constant represented by attribute. */ extern int dwarf_formsdata (Dwarf_Attribute *attr, Dwarf_Sword *return_uval) __nonnull_attribute__ (2); /* Return address represented by attribute. */ extern int dwarf_formaddr (Dwarf_Attribute *attr, Dwarf_Addr *return_addr) __nonnull_attribute__ (2); /* Return reference offset represented by attribute. */ extern int dwarf_formref (Dwarf_Attribute *attr, Dwarf_Off *return_offset) __nonnull_attribute__ (2); /* Return block represented by attribute. */ extern int dwarf_formblock (Dwarf_Attribute *attr, Dwarf_Block *return_block) __nonnull_attribute__ (2); /* Return flag represented by attribute. */ extern int dwarf_formflag (Dwarf_Attribute *attr, bool *return_bool) __nonnull_attribute__ (2); /* Simplified attribute value access functions. */ /* Return string in name attribute of DIE. */ extern const char *dwarf_diename (Dwarf_Die *die); /* Return high PC attribute of DIE. */ extern int dwarf_highpc (Dwarf_Die *die, Dwarf_Addr *return_addr) __nonnull_attribute__ (2); /* Return low PC attribute of DIE. */ extern int dwarf_lowpc (Dwarf_Die *die, Dwarf_Addr *return_addr) __nonnull_attribute__ (2); /* Return byte size attribute of DIE. */ extern int dwarf_bytesize (Dwarf_Die *die); /* Return bit size attribute of DIE. */ extern int dwarf_bitsize (Dwarf_Die *die); /* Return bit offset attribute of DIE. */ extern int dwarf_bitoffset (Dwarf_Die *die); /* Return array order attribute of DIE. */ extern int dwarf_arrayorder (Dwarf_Die *die); /* Return source language attribute of DIE. */ extern int dwarf_srclang (Dwarf_Die *die); /* Get abbreviation at given offset for given DIE. */ extern Dwarf_Abbrev *dwarf_getabbrev (Dwarf_Die *die, Dwarf_Off offset, size_t *lengthp); /* Get abbreviation at given offset in .debug_abbrev section. */ extern int dwarf_offabbrev (Dwarf *dbg, Dwarf_Off offset, size_t *lengthp, Dwarf_Abbrev *abbrevp) __nonnull_attribute__ (4); /* Get abbreviation code. */ extern unsigned int dwarf_getabbrevcode (Dwarf_Abbrev *abbrev); /* Get abbreviation tag. */ extern unsigned int dwarf_getabbrevtag (Dwarf_Abbrev *abbrev); /* Return true if abbreviation is children flag set. */ extern int dwarf_abbrevhaschildren (Dwarf_Abbrev *abbrev); /* Get number of attributes of abbreviation. */ extern int dwarf_getattrcnt (Dwarf_Abbrev *abbrev, size_t *attrcntp) __nonnull_attribute__ (2); /* Get specific attribute of abbreviation. */ extern int dwarf_getabbrevattr (Dwarf_Abbrev *abbrev, size_t idx, unsigned int *namep, unsigned int *formp, Dwarf_Off *offset); /* Get string from-debug_str section. */ extern const char *dwarf_getstring (Dwarf *dbg, Dwarf_Off offset, size_t *lenp); /* Get public symbol information. */ extern ptrdiff_t dwarf_getpubnames (Dwarf *dbg, int (*callback) (Dwarf *, Dwarf_Global *, void *), void *arg, ptrdiff_t offset) __nonnull_attribute__ (2); /* Get source file information for CU. */ extern int dwarf_getsrclines (Dwarf_Die *cudie, Dwarf_Lines **lines, size_t *nlines) __nonnull_attribute__ (2, 3); /* Return one of the source lines of the CU. */ extern Dwarf_Line *dwarf_onesrcline (Dwarf_Lines *lines, size_t idx); /* Get the file source files used in the CU. */ extern int dwarf_getsrcfiles (Dwarf_Die *cudie, Dwarf_Files **files, size_t *nfiles) __nonnull_attribute__ (2); /* Get source for address in CU. */ extern Dwarf_Line *dwarf_getsrc_die (Dwarf_Die *cudie, Dwarf_Addr addr); /* Return line address. */ extern int dwarf_lineaddr (Dwarf_Line *line, Dwarf_Addr *addrp); /* Return line number. */ extern int dwarf_lineno (Dwarf_Line *line, int *linep) __nonnull_attribute__ (2); /* Return column in line. */ extern int dwarf_linecol (Dwarf_Line *line, int *colp) __nonnull_attribute__ (2); /* Return true if record is for beginning of a statement. */ extern int dwarf_linebeginstatement (Dwarf_Line *line, bool *flagp) __nonnull_attribute__ (2); /* Return true if record is for end of sequence. */ extern int dwarf_lineendsequence (Dwarf_Line *line, bool *flagp) __nonnull_attribute__ (2); /* Return true if record is for beginning of a basic block. */ extern int dwarf_lineblock (Dwarf_Line *line, bool *flagp) __nonnull_attribute__ (2); /* Return true if record is for end of prologue. */ extern int dwarf_lineprologueend (Dwarf_Line *line, bool *flagp) __nonnull_attribute__ (2); /* Return true if record is for beginning of epilogue. */ extern int dwarf_lineepiloguebegin (Dwarf_Line *line, bool *flagp) __nonnull_attribute__ (2); /* Find line information for address. */ extern const char *dwarf_linesrc (Dwarf_Line *line, Dwarf_Word *mtime, Dwarf_Word *length); /* Return file information. */ extern const char *dwarf_filesrc (Dwarf_Files *file, size_t idx, Dwarf_Word *mtime, Dwarf_Word *length); /* Return location expression list. */ extern int dwarf_getloclist (Dwarf_Attribute *attr, Dwarf_Loc **llbuf, size_t *listlen) __nonnull_attribute__ (2, 3); /* Return list address ranges. */ extern int dwarf_getaranges (Dwarf *dbg, Dwarf_Aranges **aranges, size_t *naranges) __nonnull_attribute__ (2); /* Return one of the address range entries. */ extern Dwarf_Arange *dwarf_onearange (Dwarf_Aranges *aranges, size_t idx); /* Return information in address range record. */ extern int dwarf_getarangeinfo (Dwarf_Arange *arange, Dwarf_Addr *addrp, Dwarf_Word *lengthp, Dwarf_Off *offsetp); /* Get address range which includes given address. */ extern Dwarf_Arange *dwarf_getarange_addr (Dwarf_Aranges *aranges, Dwarf_Addr addr); /* Call callback function for each of the macro information entry for the CU. */ extern ptrdiff_t dwarf_getmacros (Dwarf_Die *cudie, int (*callback) (Dwarf_Macro *, void *), void *arg, ptrdiff_t offset) __nonnull_attribute__ (2); /* Return error code of last failing function call. This value is kept separately for each thread. */ extern int dwarf_errno (void); /* Return error string for ERROR. If ERROR is zero, return error string for most recent error or NULL is none occurred. If ERROR is -1 the behaviour is similar to the last case except that not NULL but a legal string is returned. */ extern const char *dwarf_errmsg (int err); /* Register new Out-Of-Memory handler. The old handler is returned. */ extern Dwarf_OOM dwarf_new_oom_handler (Dwarf *dbg, Dwarf_OOM handler); /* Inline optimizations. */ #ifdef __OPTIMIZE__ /* Return attribute code of given attribute. */ extern inline unsigned int dwarf_whatattr (Dwarf_Attribute *attr) { return attr == NULL ? 0 : attr->code; } /* Return attribute code of given attribute. */ extern inline unsigned int dwarf_whatform (Dwarf_Attribute *attr) { return attr == NULL ? 0 : attr->form; } #endif /* Optimize. */ #endif /* libdw.h */