/*
Copyright (C) 2000, 2004 Silicon Graphics, Inc. All Rights Reserved.
Portions Copyright (C) 2015-2015 David Anderson. All Rights Reserved.
This program is free software; you can redistribute it and/or modify it
under the terms of version 2.1 of the GNU Lesser General Public License
as published by the Free Software Foundation.
This program is distributed in the hope that it would be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Further, this software is distributed without any warranty that it is
free of the rightful claim of any third person regarding infringement
or the like. Any license provided herein, whether implied or
otherwise, applies only to this software file. Patent licenses, if
any, provided herein do not apply to combinations of this program with
other software, or any other product whatsoever.
You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write the Free Software
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston MA 02110-1301,
USA.
*/
typedef
struct
Dwarf_Loc_Chain_s *Dwarf_Loc_Chain;
struct
Dwarf_Loc_Chain_s {
Dwarf_Small lc_atom;
Dwarf_Unsigned lc_number;
Dwarf_Unsigned lc_number2;
Dwarf_Unsigned lc_number3;
Dwarf_Unsigned lc_offset;
Dwarf_Unsigned lc_opnumber;
Dwarf_Loc_Chain lc_next;
};
/* Contains info on an uninterpreted block of data
Used with certain frame information functions.
*/
typedef
struct
{
Dwarf_Unsigned bl_len;
/* length of block bl_data points at */
Dwarf_Ptr bl_data;
/* uninterpreted data */
/* 0 if location description,
1 if .debug_info loclist,
2 if .debug_info.dwo split dwarf loclist. */
Dwarf_Small bl_from_loclist;
/* Section (not CU) offset which 'data' comes from. */
Dwarf_Unsigned bl_section_offset;
/* Section offset where the location description itself starts.
So a few bytes lower than bl_section_offset */
Dwarf_Unsigned bl_locdesc_offset;
} Dwarf_Block_c;
/* Location record. Records up to 3 operand values.
For DWARF5 ops with a 1 byte size and then a block
of data of that size we the size in an operand
and follow that with the next operand as a
pointer to the block. The pointer is inserted
via cast, so an ugly hack.
This struct is opaque. Not visible to callers.
*/
struct
Dwarf_Loc_c_s {
Dwarf_Small lr_atom;
/* Location operation */
Dwarf_Unsigned lr_number;
/* First operand */
/* Second operand.
For OP_bregx, OP_bit_piece, OP_[GNU_]const_type,
OP_[GNU_]deref_type, OP_[GNU_]entry_value, OP_implicit_value,
OP_[GNU_]implicit_pointer, OP_[GNU_]regval_type,
OP_xderef_type, */
Dwarf_Unsigned lr_number2;
/* Third Operand.
For OP_[GNU_]const type, pointer to
block of length 'lr_number2' */
Dwarf_Unsigned lr_number3;
/* The number assigned. 0 to the number-of-ops - 1 in
the expression we are expanding. */
Dwarf_Unsigned lr_opnumber;
Dwarf_Unsigned lr_offset;
/* offset in locexpr for OP_BRA etc */
Dwarf_Loc_c lr_next;
/* When a list is useful. */
};
/* Location description DWARF 2,3,4,5
Adds the DW_LLE value (new in DWARF5).
This struct is opaque. Not visible to callers. */
struct
Dwarf_Locdesc_c_s {
/* The DW_LLE value of the entry. Synthesized
by libdwarf in a non-split-dwarf loclist,
recorded in a split dwarf loclist. */
Dwarf_Small ld_lle_value;
/* Beginning of active range. This is actually an offset
of an applicable base address, not a pc value. */
Dwarf_Addr ld_lopc;
/* End of active range. This is actually an offset
of an applicable base address, or a length, never a pc value. */
Dwarf_Addr ld_hipc;
/* end of active range */
/* count of struct Dwarf_Loc_c_s in array. */
Dwarf_Half ld_cents;
/* pointer to array of struct Dwarf_Loc_c_s*/
Dwarf_Loc_c ld_s;
Dwarf_Small ld_from_loclist;
/* Section (not CU) offset where loc-expr begins*/
Dwarf_Unsigned ld_section_offset;
/* Section (not CU) offset where location descr begins*/
Dwarf_Unsigned ld_locdesc_offset;
/* Pointer to our header (in which we are located). */
Dwarf_Loc_Head_c ld_loclist_head;
};
/* A 'header' to the loclist and the
location description(s) attached to an attribute.
This struct is opaque. Not visible to callers. */
struct
Dwarf_Loc_Head_c_s {
/* The array (1 or more entries) of
struct Loc_Desc_c_s
If 1 it may really be a locexpr */
Dwarf_Locdesc_c ll_locdesc;
/* Entry count of the ll_locdesc array. */
Dwarf_Unsigned ll_locdesc_count;
/* 0 if locexpr (in which case ll_locdesc_count is 1),
1 if non-split (dwarf 2,3,4) .debug_loc,
2 if split-dwarf .debug_loc.dwo */
Dwarf_Small ll_from_loclist;
/* The CU Context of this loclist or locexpr. */
Dwarf_CU_Context ll_context;
Dwarf_Debug ll_dbg;
};
int
_dwarf_loc_block_sanity_check(Dwarf_Debug dbg,
Dwarf_Block_c *loc_block,Dwarf_Error*error);