123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- /* DWARF CU data structure
- Copyright (C) 2021-2022 Free Software Foundation, Inc.
- 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_CU_H
- #define GDB_DWARF2_CU_H
- #include "buildsym.h"
- #include "dwarf2/comp-unit-head.h"
- #include "gdbsupport/gdb_optional.h"
- /* Type used for delaying computation of method physnames.
- See comments for compute_delayed_physnames. */
- struct delayed_method_info
- {
- /* The type to which the method is attached, i.e., its parent class. */
- struct type *type;
- /* The index of the method in the type's function fieldlists. */
- int fnfield_index;
- /* The index of the method in the fieldlist. */
- int index;
- /* The name of the DIE. */
- const char *name;
- /* The DIE associated with this method. */
- struct die_info *die;
- };
- /* Internal state when decoding a particular compilation unit. */
- struct dwarf2_cu
- {
- explicit dwarf2_cu (dwarf2_per_cu_data *per_cu,
- dwarf2_per_objfile *per_objfile);
- DISABLE_COPY_AND_ASSIGN (dwarf2_cu);
- /* TU version of handle_DW_AT_stmt_list for read_type_unit_scope.
- Create the set of symtabs used by this TU, or if this TU is sharing
- symtabs with another TU and the symtabs have already been created
- then restore those symtabs in the line header.
- We don't need the pc/line-number mapping for type units. */
- void setup_type_unit_groups (struct die_info *die);
- /* Start a compunit_symtab for DWARF. NAME, COMP_DIR, LOW_PC are passed to
- the buildsym_compunit constructor. */
- struct compunit_symtab *start_compunit_symtab (const char *name,
- const char *comp_dir,
- CORE_ADDR low_pc);
- /* Reset the builder. */
- void reset_builder () { m_builder.reset (); }
- /* Return a type that is a generic pointer type, the size of which
- matches the address size given in the compilation unit header for
- this CU. */
- struct type *addr_type () const;
- /* Find an integer type the same size as the address size given in
- the compilation unit header for this CU. UNSIGNED_P controls if
- the integer is unsigned or not. */
- struct type *addr_sized_int_type (bool unsigned_p) const;
- /* Mark this CU as used. */
- void mark ();
- /* Clear the mark on this CU. */
- void clear_mark ()
- {
- m_mark = false;
- }
- /* True if this CU has been marked. */
- bool is_marked () const
- {
- return m_mark;
- }
- /* Add a dependence relationship from this cu to REF_PER_CU. */
- void add_dependence (struct dwarf2_per_cu_data *ref_per_cu);
- /* The header of the compilation unit. */
- struct comp_unit_head header {};
- /* Base address of this compilation unit. */
- gdb::optional<CORE_ADDR> base_address;
- /* The language we are debugging. */
- const struct language_defn *language_defn = nullptr;
- const char *producer = nullptr;
- private:
- /* The symtab builder for this CU. This is only non-NULL when full
- symbols are being read. */
- std::unique_ptr<buildsym_compunit> m_builder;
- /* A set of pointers to dwarf2_per_cu_data objects for compilation
- units referenced by this one. Only set during full symbol processing;
- partial symbol tables do not have dependencies. */
- htab_t m_dependencies = nullptr;
- public:
- /* The generic symbol table building routines have separate lists for
- file scope symbols and all all other scopes (local scopes). So
- we need to select the right one to pass to add_symbol_to_list().
- We do it by keeping a pointer to the correct list in list_in_scope.
- FIXME: The original dwarf code just treated the file scope as the
- first local scope, and all other local scopes as nested local
- scopes, and worked fine. Check to see if we really need to
- distinguish these in buildsym.c. */
- struct pending **list_in_scope = nullptr;
- /* Hash table holding all the loaded partial DIEs
- with partial_die->offset.SECT_OFF as hash. */
- htab_t partial_dies = nullptr;
- /* Storage for things with the same lifetime as this read-in compilation
- unit, including partial DIEs. */
- auto_obstack comp_unit_obstack;
- /* Backlink to our per_cu entry. */
- struct dwarf2_per_cu_data *per_cu;
- /* The dwarf2_per_objfile that owns this. */
- dwarf2_per_objfile *per_objfile;
- /* How many compilation units ago was this CU last referenced? */
- int last_used = 0;
- /* A hash table of DIE cu_offset for following references with
- die_info->offset.sect_off as hash. */
- htab_t die_hash = nullptr;
- /* Full DIEs if read in. */
- struct die_info *dies = nullptr;
- /* Header data from the line table, during full symbol processing. */
- struct line_header *line_header = nullptr;
- /* Non-NULL if LINE_HEADER is owned by this DWARF_CU. Otherwise,
- it's owned by dwarf2_per_bfd::line_header_hash. If non-NULL,
- this is the DW_TAG_compile_unit die for this CU. We'll hold on
- to the line header as long as this DIE is being processed. See
- process_die_scope. */
- die_info *line_header_die_owner = nullptr;
- /* A list of methods which need to have physnames computed
- after all type information has been read. */
- std::vector<delayed_method_info> method_list;
- /* To be copied to symtab->call_site_htab. */
- htab_t call_site_htab = nullptr;
- /* Non-NULL if this CU came from a DWO file.
- There is an invariant here that is important to remember:
- Except for attributes copied from the top level DIE in the "main"
- (or "stub") file in preparation for reading the DWO file
- (e.g., DW_AT_addr_base), we KISS: there is only *one* CU.
- Either there isn't a DWO file (in which case this is NULL and the point
- is moot), or there is and either we're not going to read it (in which
- case this is NULL) or there is and we are reading it (in which case this
- is non-NULL). */
- struct dwo_unit *dwo_unit = nullptr;
- /* The DW_AT_addr_base (DW_AT_GNU_addr_base) attribute if present.
- Note this value comes from the Fission stub CU/TU's DIE. */
- gdb::optional<ULONGEST> addr_base;
- /* The DW_AT_GNU_ranges_base attribute, if present.
- This is only relevant in the context of pre-DWARF 5 split units. In this
- context, there is a .debug_ranges section in the linked executable,
- containing all the ranges data for all the compilation units. Each
- skeleton/stub unit has (if needed) a DW_AT_GNU_ranges_base attribute that
- indicates the base of its contribution to that section. The DW_AT_ranges
- attributes in the split-unit are of the form DW_FORM_sec_offset and point
- into the .debug_ranges section of the linked file. However, they are not
- "true" DW_FORM_sec_offset, because they are relative to the base of their
- compilation unit's contribution, rather than relative to the beginning of
- the section. The DW_AT_GNU_ranges_base value must be added to it to make
- it relative to the beginning of the section.
- Note that the value is zero when we are not in a pre-DWARF 5 split-unit
- case, so this value can be added without needing to know whether we are in
- this case or not.
- N.B. If a DW_AT_ranges attribute is found on the DW_TAG_compile_unit in the
- skeleton/stub, it must not have the base added, as it already points to the
- right place. And since the DW_TAG_compile_unit DIE in the split-unit can't
- have a DW_AT_ranges attribute, we can use the
- die->tag != DW_AT_compile_unit
- to determine whether the base should be added or not. */
- ULONGEST gnu_ranges_base = 0;
- /* The DW_AT_rnglists_base attribute, if present.
- This is used when processing attributes of form DW_FORM_rnglistx in
- non-split units. Attributes of this form found in a split unit don't
- use it, as split-unit files have their own non-shared .debug_rnglists.dwo
- section. */
- ULONGEST rnglists_base = 0;
- /* The DW_AT_loclists_base attribute if present. */
- ULONGEST loclist_base = 0;
- /* When reading debug info generated by older versions of rustc, we
- have to rewrite some union types to be struct types with a
- variant part. This rewriting must be done after the CU is fully
- read in, because otherwise at the point of rewriting some struct
- type might not have been fully processed. So, we keep a list of
- all such types here and process them after expansion. */
- std::vector<struct type *> rust_unions;
- /* The DW_AT_str_offsets_base attribute if present. For DWARF 4 version DWO
- files, the value is implicitly zero. For DWARF 5 version DWO files, the
- value is often implicit and is the size of the header of
- .debug_str_offsets section (8 or 4, depending on the address size). */
- gdb::optional<ULONGEST> str_offsets_base;
- /* Mark used when releasing cached dies. */
- bool m_mark : 1;
- /* This CU references .debug_loc. See the symtab->locations_valid field.
- This test is imperfect as there may exist optimized debug code not using
- any location list and still facing inlining issues if handled as
- unoptimized code. For a future better test see GCC PR other/32998. */
- bool has_loclist : 1;
- /* These cache the results for producer_is_* fields. CHECKED_PRODUCER is true
- if all the producer_is_* fields are valid. This information is cached
- because profiling CU expansion showed excessive time spent in
- producer_is_gxx_lt_4_6. */
- bool checked_producer : 1;
- bool producer_is_gxx_lt_4_6 : 1;
- bool producer_is_gcc_lt_4_3 : 1;
- bool producer_is_gcc_11 : 1;
- bool producer_is_icc : 1;
- bool producer_is_icc_lt_14 : 1;
- bool producer_is_codewarrior : 1;
- /* When true, the file that we're processing is known to have
- debugging info for C++ namespaces. GCC 3.3.x did not produce
- this information, but later versions do. */
- bool processing_has_namespace_info : 1;
- /* This flag will be set when reading partial DIEs if we need to load
- absolutely all DIEs for this compilation unit, instead of just the ones
- we think are interesting. It gets set if we look for a DIE in the
- hash table and don't find it. */
- bool load_all_dies : 1;
- struct partial_die_info *find_partial_die (sect_offset sect_off);
- /* Get the buildsym_compunit for this CU. */
- buildsym_compunit *get_builder ();
- };
- #endif /* GDB_DWARF2_CU_H */
|