/* Internal definitions for libdwarf.
   Copyright (C) 2000, 2001, 2002 Red Hat, Inc.
   Written by Ulrich Drepper <drepper@redhat.com>, 2000.

   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 _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 */
