1/* DWARF abbrev table
2
3   Copyright (C) 1994-2020 Free Software Foundation, Inc.
4
5   Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology,
6   Inc.  with support from Florida State University (under contract
7   with the Ada Joint Program Office), and Silicon Graphics, Inc.
8   Initial contribution by Brent Benson, Harris Computer Systems, Inc.,
9   based on Fred Fish's (Cygnus Support) implementation of DWARF 1
10   support.
11
12   This file is part of GDB.
13
14   This program is free software; you can redistribute it and/or modify
15   it under the terms of the GNU General Public License as published by
16   the Free Software Foundation; either version 3 of the License, or
17   (at your option) any later version.
18
19   This program is distributed in the hope that it will be useful,
20   but WITHOUT ANY WARRANTY; without even the implied warranty of
21   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22   GNU General Public License for more details.
23
24   You should have received a copy of the GNU General Public License
25   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
26
27#ifndef GDB_DWARF2_ABBREV_H
28#define GDB_DWARF2_ABBREV_H
29
30#include "hashtab.h"
31
32/* This data structure holds the information of an abbrev.  */
33struct abbrev_info
34  {
35    unsigned int number;	/* number identifying abbrev */
36    enum dwarf_tag tag;		/* dwarf tag */
37    unsigned short has_children;		/* boolean */
38    unsigned short num_attrs;	/* number of attributes */
39    struct attr_abbrev *attrs;	/* an array of attribute descriptions */
40  };
41
42struct attr_abbrev
43  {
44    ENUM_BITFIELD(dwarf_attribute) name : 16;
45    ENUM_BITFIELD(dwarf_form) form : 16;
46
47    /* It is valid only if FORM is DW_FORM_implicit_const.  */
48    LONGEST implicit_const;
49  };
50
51struct abbrev_table;
52typedef std::unique_ptr<struct abbrev_table> abbrev_table_up;
53
54/* Top level data structure to contain an abbreviation table.  */
55
56struct abbrev_table
57{
58  static abbrev_table_up read (struct objfile *objfile,
59			       struct dwarf2_section_info *section,
60			       sect_offset sect_off);
61
62  /* Look up an abbrev in the table.
63     Returns NULL if the abbrev is not found.  */
64
65  struct abbrev_info *lookup_abbrev (unsigned int abbrev_number)
66  {
67    struct abbrev_info search;
68    search.number = abbrev_number;
69
70    return (struct abbrev_info *) htab_find_with_hash (m_abbrevs.get (),
71						       &search,
72						       abbrev_number);
73  }
74
75  /* Where the abbrev table came from.
76     This is used as a sanity check when the table is used.  */
77  const sect_offset sect_off;
78
79private:
80
81  explicit abbrev_table (sect_offset off);
82
83  DISABLE_COPY_AND_ASSIGN (abbrev_table);
84
85  /* Allocate space for a struct abbrev_info object in
86     ABBREV_TABLE.  */
87  struct abbrev_info *alloc_abbrev ();
88
89  /* Add an abbreviation to the table.  */
90  void add_abbrev (struct abbrev_info *abbrev);
91
92  /* Hash table of abbrevs.  */
93  htab_up m_abbrevs;
94
95  /* Storage for the abbrev table.  */
96  auto_obstack m_abbrev_obstack;
97};
98
99#endif /* GDB_DWARF2_ABBREV_H */
100