mirror of
https://github.com/davea42/libdwarf-code.git
synced 2025-10-23 01:37:53 +08:00

* print_abbrevs.c(dwarf_get_array_info): Initialize local variable. * print_die.c(get_location_list): Initialize local variable.: * dwarf_loc.h: Add declaration of _dwarf_loc_block_sanity_check(). * dwarf_loc.c: Call new function _dwarf_loc_block_sanity_check * dwarf_loc2.c: Implement and call new function _dwarf_loc_block_sanity_check to avoid duplicating code. libdwarf * dwarf_opaque.h: Delete two useless blank lines.
150 lines
5.2 KiB
C
150 lines
5.2 KiB
C
/*
|
|
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);
|
|
|