| /* Internal definitions for libdwarf. |
| Copyright (C) 2000, 2001, 2002 Red Hat, Inc. |
| This file is part of Red Hat elfutils. |
| Written by Ulrich Drepper <drepper@redhat.com>, 2000. |
| |
| Red Hat elfutils 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; version 2 of the License. |
| |
| Red Hat elfutils 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 Red Hat elfutils; if not, write to the Free Software Foundation, |
| Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA. |
| |
| Red Hat elfutils is an included package of the Open Invention Network. |
| An included package of the Open Invention Network is a package for which |
| Open Invention Network licensees cross-license their patents. No patent |
| license is granted, either expressly or impliedly, by designation as an |
| included package. Should you wish to participate in the Open Invention |
| Network licensing program, please visit www.openinventionnetwork.com |
| <http://www.openinventionnetwork.com>. */ |
| |
| #ifndef _LIBDWARFP_H |
| #define _LIBDWARFP_H 1 |
| |
| #include <libdwarf.h> |
| #include <libintl.h> |
| #include <limits.h> |
| |
| #include <dwarf_abbrev_hash.h> |
| |
| |
| /* Version of the DWARF specification we support. */ |
| #define DWARF_VERSION 2 |
| |
| /* Version of the CIE format. */ |
| #define CIE_VERSION 1 |
| |
| /* Some additional basic types. */ |
| typedef unsigned int Dwarf_Word; |
| |
| |
| /* Valid indeces for the section data. */ |
| enum |
| { |
| IDX_debug_info = 0, |
| IDX_debug_abbrev, |
| IDX_debug_aranges, |
| IDX_debug_line, |
| IDX_debug_frame, |
| IDX_eh_frame, |
| IDX_debug_loc, |
| IDX_debug_pubnames, |
| IDX_debug_str, |
| IDX_debug_funcnames, |
| IDX_debug_typenames, |
| IDX_debug_varnames, |
| IDX_debug_weaknames, |
| IDX_debug_macinfo, |
| IDX_last |
| }; |
| |
| |
| /* This is the structure representing the debugging state. */ |
| struct Dwarf_Debug_s |
| { |
| #ifdef DWARF_DEBUG |
| int memtag; |
| #endif |
| |
| Dwarf_Handler dbg_errhand; |
| Dwarf_Ptr dbg_errarg; |
| |
| Elf *elf; |
| int other_byte_order; |
| |
| Dwarf_Unsigned access; |
| |
| /* The section data. */ |
| struct |
| { |
| Dwarf_Small *addr; |
| Dwarf_Unsigned size; |
| } sections[IDX_last]; |
| |
| /* Compilation unit handling. To enable efficient searching we |
| keep track of the unit we already found. */ |
| struct Dwarf_CU_Info_s |
| { |
| /* This is the information the 'dwarf_next_cu_header' function |
| is supposed to return. */ |
| Dwarf_Unsigned header_length; |
| Dwarf_Unsigned length; |
| Dwarf_Unsigned abbrev_offset; |
| Dwarf_Half version_stamp; |
| Dwarf_Half address_size; |
| |
| Dwarf_Unsigned offset; /* In .debug_info section. */ |
| |
| /* Used to distinguish between 32-bit and 64-bit DWARF. */ |
| Dwarf_Half offset_size; |
| |
| /* Hash table for the abbreviations. */ |
| Dwarf_Abbrev_Hash abbrev_hash; |
| Dwarf_Unsigned last_abbrev_offset; |
| |
| Dwarf_Debug dbg; |
| |
| struct Dwarf_CU_Info_s *next; |
| } *cu_list; |
| struct Dwarf_CU_Info_s *cu_list_current; |
| struct Dwarf_CU_Info_s *cu_list_tail; |
| |
| Dwarf_Unsigned cie_cnt; |
| Dwarf_Unsigned fde_cnt; |
| }; |
| typedef struct Dwarf_CU_Info_s *Dwarf_CU_Info; |
| |
| |
| /* Memory access macros. We have to define it here since code in the |
| header needs to know the structure of Dwarf_Debug. */ |
| #include "memory-access.h" |
| |
| |
| /* DWARF die representation. */ |
| struct Dwarf_Die_s |
| { |
| #ifdef DWARF_DEBUG |
| int memtag; |
| #endif |
| |
| Dwarf_Small *addr; |
| Dwarf_Abbrev abbrev; |
| Dwarf_CU_Info cu; |
| }; |
| |
| |
| /* Abbreviation list. */ |
| struct Dwarf_Abbrev_s |
| { |
| Dwarf_Unsigned code; /* The code. */ |
| Dwarf_Half tag; /* The tag. */ |
| Dwarf_Small *attrp; /* Pointer to beginning of attributes. */ |
| Dwarf_Unsigned attrcnt; /* Number of attributes. */ |
| int has_children; /* Nonzero of abbreviation has children. */ |
| Dwarf_Unsigned offset; /* Offset in the .debug_abbrev section. */ |
| }; |
| |
| |
| /* Attribute list. */ |
| struct Dwarf_Attribute_s |
| { |
| Dwarf_Half code; /* DWARF attribute code. */ |
| Dwarf_Half form; /* DWARF form. */ |
| Dwarf_Small *valp; |
| Dwarf_CU_Info cu; |
| }; |
| |
| |
| /* Structure for error values. */ |
| struct Dwarf_Error_s |
| { |
| unsigned int de_error; |
| }; |
| |
| |
| /* Files in line information records. */ |
| typedef struct Dwarf_File_s |
| { |
| Dwarf_Debug dbg; |
| unsigned int nfiles; |
| struct Dwarf_Fileinfo_s |
| { |
| char *name; |
| Dwarf_Unsigned mtime; |
| Dwarf_Unsigned length; |
| } info[0]; |
| } *Dwarf_File; |
| typedef struct Dwarf_Fileinfo_s Dwarf_Fileinfo; |
| |
| |
| /* Representation of a row in the line table. */ |
| struct Dwarf_Line_s |
| { |
| Dwarf_Addr addr; |
| unsigned int file; |
| int line; |
| unsigned short int column; |
| unsigned int is_stmt:1; |
| unsigned int basic_block:1; |
| unsigned int end_sequence:1; |
| unsigned int prologue_end:1; |
| unsigned int epilogue_begin:1; |
| |
| Dwarf_File files; |
| }; |
| |
| |
| /* Additional, shared information required for Dwarf_Global handling. */ |
| typedef struct Dwarf_Global_Info_s |
| { |
| Dwarf_Debug dbg; |
| Dwarf_Unsigned offset; |
| } *Dwarf_Global_Info; |
| |
| /* Representation of a global name entry. */ |
| struct Dwarf_Global_s |
| { |
| Dwarf_Unsigned offset; |
| char *name; |
| Dwarf_Global_Info info; |
| }; |
| |
| |
| /* Additional, shared information required for Dwarf_Arange handling. */ |
| typedef struct Dwarf_Arange_Info_s |
| { |
| Dwarf_Debug dbg; |
| Dwarf_Unsigned offset; |
| } *Dwarf_Arange_Info; |
| |
| /* Representation of an address range entry. */ |
| struct Dwarf_Arange_s |
| { |
| Dwarf_Addr address; |
| Dwarf_Unsigned length; |
| Dwarf_Arange_Info info; |
| }; |
| |
| |
| /* Representation of a common information entry. */ |
| struct Dwarf_Cie_s |
| { |
| Dwarf_Debug dbg; |
| Dwarf_Unsigned length; |
| char *augmentation; |
| Dwarf_Unsigned code_alignment_factor; |
| Dwarf_Signed data_alignment_factor; |
| Dwarf_Small *initial_instructions; |
| Dwarf_Unsigned initial_instructions_length; |
| Dwarf_Small return_address_register; |
| Dwarf_Unsigned offset; |
| Dwarf_Signed index; |
| }; |
| |
| |
| /* Representation of a frame descriptor entry. */ |
| struct Dwarf_Fde_s |
| { |
| Dwarf_Cie cie; |
| Dwarf_Addr initial_location; |
| Dwarf_Unsigned address_range; |
| Dwarf_Small *instructions; |
| Dwarf_Unsigned instructions_length; |
| Dwarf_Unsigned offset; |
| Dwarf_Small *fde_bytes; |
| Dwarf_Unsigned fde_byte_length; |
| }; |
| |
| |
| /* Internal error values. */ |
| enum |
| { |
| DW_E_NOERROR = 0, |
| DW_E_INVALID_ACCESS, |
| DW_E_NO_REGFILE, |
| DW_E_IO_ERROR, |
| DW_E_NOMEM, |
| DW_E_NOELF, |
| DW_E_GETEHDR_ERROR, |
| DW_E_INVALID_ELF, |
| DW_E_INVALID_DWARF, |
| DW_E_NO_DWARF, |
| DW_E_NO_CU, |
| DW_E_1ST_NO_CU, |
| DW_E_INVALID_OFFSET, |
| DW_E_INVALID_REFERENCE, |
| DW_E_NO_REFERENCE, |
| DW_E_NO_ADDR, |
| DW_E_NO_FLAG, |
| DW_E_NO_CONSTANT, |
| DW_E_NO_BLOCK, |
| DW_E_NO_STRING, |
| DW_E_WRONG_ATTR, |
| DW_E_NO_DATA, |
| DW_E_NO_DEBUG_LINE, |
| DW_E_VERSION_ERROR, |
| DW_E_INVALID_DIR_IDX, |
| DW_E_INVALID_ADDR, |
| DW_E_NO_ABBR, |
| }; |
| |
| |
| /* Handle error according to user's wishes. */ |
| extern void __libdwarf_error (Dwarf_Debug dbg, Dwarf_Error *err, int errval) |
| internal_function; |
| |
| |
| /* Find CU at given offset. */ |
| extern int __libdwarf_get_cu_at_offset (Dwarf_Debug dbg, Dwarf_Unsigned offset, |
| Dwarf_CU_Info *result_cu, |
| Dwarf_Error *err) internal_function; |
| |
| /* Find abbreviation. */ |
| extern Dwarf_Abbrev __libdwarf_get_abbrev (Dwarf_Debug dbg, |
| Dwarf_CU_Info cu, |
| Dwarf_Word code, |
| Dwarf_Error *err) |
| internal_function; |
| |
| /* Get constant type attribute value. */ |
| extern int __libdwarf_getconstant (Dwarf_Die die, Dwarf_Half name, |
| Dwarf_Unsigned *return_size, |
| Dwarf_Error *err) internal_function; |
| |
| /* Determine length of form parameters. */ |
| extern int __libdwarf_form_val_len (Dwarf_Debug dbg, Dwarf_CU_Info cu, |
| Dwarf_Word form, Dwarf_Small *valp, |
| size_t *len, Dwarf_Error *err) |
| internal_function; |
| |
| |
| /* gettext helper macros. */ |
| #define _(Str) dgettext ("libdwarf", Str) |
| #define N_(Str) Str |
| |
| #endif /* libdwarfP.h */ |