diff options
author | Tom Tromey <tom@tromey.com> | 2020-02-08 13:40:54 -0700 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2020-02-08 13:40:56 -0700 |
commit | 162dce5526debd7fbc3a4516c37ee6178bab6e5b (patch) | |
tree | d9b3a39c5458a76bf70f193b4dcc2338c24ca887 /gdb/dwarf2/attribute.h | |
parent | 3054dd54700066c423fe73731ab46ea2a9c3f541 (diff) | |
download | gdb-162dce5526debd7fbc3a4516c37ee6178bab6e5b.zip gdb-162dce5526debd7fbc3a4516c37ee6178bab6e5b.tar.gz gdb-162dce5526debd7fbc3a4516c37ee6178bab6e5b.tar.bz2 |
Create dwarf2/attribute.[ch]
This moves the attribute-related code out of dwarf2read.c and into the
new files dwarf2/attribute.[ch].
gdb/ChangeLog
2020-02-08 Tom Tromey <tom@tromey.com>
* dwarf2read.c (struct attribute, DW_STRING)
(DW_STRING_IS_CANONICAL, DW_UNSND, DW_BLOCK, DW_SND, DW_ADDR)
(DW_SIGNATURE, struct dwarf_block, attr_value_as_address)
(attr_form_is_block, attr_form_is_section_offset)
(attr_form_is_constant, attr_form_is_ref): Move.
* dwarf2/attribute.h: New file.
* dwarf2/attribute.c: New file, from dwarf2read.c.
* Makefile.in (COMMON_SFILES): Add dwarf2/attribute.c.
Change-Id: I1ea4c146256a1b9e38b66f1c605d782a14eeded7
Diffstat (limited to 'gdb/dwarf2/attribute.h')
-rw-r--r-- | gdb/dwarf2/attribute.h | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/gdb/dwarf2/attribute.h b/gdb/dwarf2/attribute.h new file mode 100644 index 0000000..11c6cb9 --- /dev/null +++ b/gdb/dwarf2/attribute.h @@ -0,0 +1,118 @@ +/* DWARF attributes + + Copyright (C) 1994-2020 Free Software Foundation, Inc. + + Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology, + Inc. with support from Florida State University (under contract + with the Ada Joint Program Office), and Silicon Graphics, Inc. + Initial contribution by Brent Benson, Harris Computer Systems, Inc., + based on Fred Fish's (Cygnus Support) implementation of DWARF 1 + support. + + This file is part of GDB. + + This program 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; either version 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef GDB_DWARF2_ATTRIBUTE_H +#define GDB_DWARF2_ATTRIBUTE_H + +#include "dwarf2.h" + +/* Blocks are a bunch of untyped bytes. */ +struct dwarf_block +{ + size_t size; + + /* Valid only if SIZE is not zero. */ + const gdb_byte *data; +}; + +/* Attributes have a name and a value. */ +struct attribute +{ + ENUM_BITFIELD(dwarf_attribute) name : 16; + ENUM_BITFIELD(dwarf_form) form : 15; + + /* Has DW_STRING already been updated by dwarf2_canonicalize_name? This + field should be in u.str (existing only for DW_STRING) but it is kept + here for better struct attribute alignment. */ + unsigned int string_is_canonical : 1; + + union + { + const char *str; + struct dwarf_block *blk; + ULONGEST unsnd; + LONGEST snd; + CORE_ADDR addr; + ULONGEST signature; + } + u; +}; + +/* Get at parts of an attribute structure. */ + +#define DW_STRING(attr) ((attr)->u.str) +#define DW_STRING_IS_CANONICAL(attr) ((attr)->string_is_canonical) +#define DW_UNSND(attr) ((attr)->u.unsnd) +#define DW_BLOCK(attr) ((attr)->u.blk) +#define DW_SND(attr) ((attr)->u.snd) +#define DW_ADDR(attr) ((attr)->u.addr) +#define DW_SIGNATURE(attr) ((attr)->u.signature) + +/* Read the given attribute value as an address, taking the attribute's + form into account. */ + +extern CORE_ADDR attr_value_as_address (struct attribute *attr); + +/* Check if the attribute's form is a DW_FORM_block* + if so return true else false. */ + +extern int attr_form_is_block (const struct attribute *attr); + +/* Return non-zero if ATTR's value is a section offset --- classes + lineptr, loclistptr, macptr or rangelistptr --- or zero, otherwise. + You may use DW_UNSND (attr) to retrieve such offsets. + + Section 7.5.4, "Attribute Encodings", explains that no attribute + may have a value that belongs to more than one of these classes; it + would be ambiguous if we did, because we use the same forms for all + of them. */ + +extern int attr_form_is_section_offset (const struct attribute *attr); + +/* Return non-zero if ATTR's value falls in the 'constant' class, or + zero otherwise. When this function returns true, you can apply + dwarf2_get_attr_constant_value to it. + + However, note that for some attributes you must check + attr_form_is_section_offset before using this test. DW_FORM_data4 + and DW_FORM_data8 are members of both the constant class, and of + the classes that contain offsets into other debug sections + (lineptr, loclistptr, macptr or rangelistptr). The DWARF spec says + that, if an attribute's can be either a constant or one of the + section offset classes, DW_FORM_data4 and DW_FORM_data8 should be + taken as section offsets, not constants. + + DW_FORM_data16 is not considered as dwarf2_get_attr_constant_value + cannot handle that. */ + +extern int attr_form_is_constant (const struct attribute *attr); + +/* DW_ADDR is always stored already as sect_offset; despite for the forms + besides DW_FORM_ref_addr it is stored as cu_offset in the DWARF file. */ + +extern int attr_form_is_ref (const struct attribute *attr); + +#endif /* GDB_DWARF2_ATTRIBUTE_H */ |