gdb/dwarf2read.c - gdb
Global variables defined
Data types defined
Functions defined
Macros defined
Source code
- FIXME
- #include "defs.h"
- #include "bfd.h"
- #include "elf-bfd.h"
- #include "symtab.h"
- #include "gdbtypes.h"
- #include "objfiles.h"
- #include "dwarf2.h"
- #include "buildsym.h"
- #include "demangle.h"
- #include "gdb-demangle.h"
- #include "expression.h"
- #include "filenames.h"
- #include "macrotab.h"
- #include "language.h"
- #include "complaints.h"
- #include "bcache.h"
- #include "dwarf2expr.h"
- #include "dwarf2loc.h"
- #include "cp-support.h"
- #include "hashtab.h"
- #include "command.h"
- #include "gdbcmd.h"
- #include "block.h"
- #include "addrmap.h"
- #include "typeprint.h"
- #include "jv-lang.h"
- #include "psympriv.h"
- #include <sys/stat.h>
- #include "completer.h"
- #include "vec.h"
- #include "c-lang.h"
- #include "go-lang.h"
- #include "valprint.h"
- #include "gdbcore.h"
- #include "gdb/gdb-index.h"
- #include <ctype.h>
- #include "gdb_bfd.h"
- #include "f-lang.h"
- #include "source.h"
- #include "filestuff.h"
- #include "build-id.h"
- #include <fcntl.h>
- #include <sys/types.h>
- typedef struct symbol *symbolp;
- DEF_VEC_P (symbolp);
- static unsigned int dwarf2_read_debug = 0;
- static unsigned int dwarf2_die_debug = 0;
- static int check_physname = 0;
- static int use_deprecated_index_sections = 0;
- static const struct objfile_data *dwarf2_objfile_data_key;
- static int dwarf2_locexpr_index;
- static int dwarf2_loclist_index;
- static int dwarf2_locexpr_block_index;
- static int dwarf2_loclist_block_index;
- struct dwarf2_section_info
- {
- union
- {
-
- asection *asection;
-
- struct dwarf2_section_info *containing_section;
- } s;
-
- const gdb_byte *buffer;
-
- bfd_size_type size;
-
- bfd_size_type virtual_offset;
-
- char readin;
-
- char is_virtual;
- };
- typedef struct dwarf2_section_info dwarf2_section_info_def;
- DEF_VEC_O (dwarf2_section_info_def);
- typedef uint32_t offset_type;
- DEF_VEC_I (offset_type);
- #define DW2_GDB_INDEX_SYMBOL_STATIC_SET_VALUE(cu_index, value) \
- do { \
- gdb_assert ((unsigned int) (value) <= 1); \
- GDB_INDEX_SYMBOL_STATIC_SET_VALUE((cu_index), (value)); \
- } while (0)
- #define DW2_GDB_INDEX_SYMBOL_KIND_SET_VALUE(cu_index, value) \
- do { \
- gdb_assert ((value) >= GDB_INDEX_SYMBOL_KIND_TYPE \
- && (value) <= GDB_INDEX_SYMBOL_KIND_OTHER); \
- GDB_INDEX_SYMBOL_KIND_SET_VALUE((cu_index), (value)); \
- } while (0)
- #define DW2_GDB_INDEX_CU_SET_VALUE(cu_index, value) \
- do { \
- gdb_assert (((value) & ~GDB_INDEX_CU_MASK) == 0); \
- GDB_INDEX_CU_SET_VALUE((cu_index), (value)); \
- } while (0)
- struct mapped_index
- {
-
- int version;
-
- off_t total_size;
-
- const gdb_byte *address_table;
-
- offset_type address_table_size;
-
- const offset_type *symbol_table;
-
- offset_type symbol_table_slots;
-
- const char *constant_pool;
- };
- typedef struct dwarf2_per_cu_data *dwarf2_per_cu_ptr;
- DEF_VEC_P (dwarf2_per_cu_ptr);
- struct dwarf2_per_objfile
- {
- struct dwarf2_section_info info;
- struct dwarf2_section_info abbrev;
- struct dwarf2_section_info line;
- struct dwarf2_section_info loc;
- struct dwarf2_section_info macinfo;
- struct dwarf2_section_info macro;
- struct dwarf2_section_info str;
- struct dwarf2_section_info ranges;
- struct dwarf2_section_info addr;
- struct dwarf2_section_info frame;
- struct dwarf2_section_info eh_frame;
- struct dwarf2_section_info gdb_index;
- VEC (dwarf2_section_info_def) *types;
-
- struct objfile *objfile;
-
- struct dwarf2_per_cu_data **all_comp_units;
-
- int n_comp_units;
-
- int n_type_units;
-
- int n_allocated_type_units;
-
- struct signatured_type **all_type_units;
-
- htab_t type_unit_groups;
-
- htab_t signatured_types;
-
- struct tu_stats
- {
- int nr_uniq_abbrev_tables;
- int nr_symtabs;
- int nr_symtab_sharers;
- int nr_stmt_less_type_units;
- int nr_all_type_units_reallocs;
- } tu_stats;
-
- struct dwarf2_per_cu_data *read_in_chain;
-
- htab_t dwo_files;
-
- int dwp_checked;
-
- struct dwp_file *dwp_file;
-
- struct dwz_file *dwz_file;
-
- int has_section_at_zero;
-
- unsigned char using_index;
-
- struct mapped_index *index_table;
-
- htab_t quick_file_names_table;
-
- int reading_partial_symbols;
-
- htab_t die_type_hash;
-
- VEC (dwarf2_per_cu_ptr) *just_read_cus;
- };
- static struct dwarf2_per_objfile *dwarf2_per_objfile;
- static const struct dwarf2_debug_sections dwarf2_elf_names =
- {
- { ".debug_info", ".zdebug_info" },
- { ".debug_abbrev", ".zdebug_abbrev" },
- { ".debug_line", ".zdebug_line" },
- { ".debug_loc", ".zdebug_loc" },
- { ".debug_macinfo", ".zdebug_macinfo" },
- { ".debug_macro", ".zdebug_macro" },
- { ".debug_str", ".zdebug_str" },
- { ".debug_ranges", ".zdebug_ranges" },
- { ".debug_types", ".zdebug_types" },
- { ".debug_addr", ".zdebug_addr" },
- { ".debug_frame", ".zdebug_frame" },
- { ".eh_frame", NULL },
- { ".gdb_index", ".zgdb_index" },
- 23
- };
- static const struct dwop_section_names
- {
- struct dwarf2_section_names abbrev_dwo;
- struct dwarf2_section_names info_dwo;
- struct dwarf2_section_names line_dwo;
- struct dwarf2_section_names loc_dwo;
- struct dwarf2_section_names macinfo_dwo;
- struct dwarf2_section_names macro_dwo;
- struct dwarf2_section_names str_dwo;
- struct dwarf2_section_names str_offsets_dwo;
- struct dwarf2_section_names types_dwo;
- struct dwarf2_section_names cu_index;
- struct dwarf2_section_names tu_index;
- }
- dwop_section_names =
- {
- { ".debug_abbrev.dwo", ".zdebug_abbrev.dwo" },
- { ".debug_info.dwo", ".zdebug_info.dwo" },
- { ".debug_line.dwo", ".zdebug_line.dwo" },
- { ".debug_loc.dwo", ".zdebug_loc.dwo" },
- { ".debug_macinfo.dwo", ".zdebug_macinfo.dwo" },
- { ".debug_macro.dwo", ".zdebug_macro.dwo" },
- { ".debug_str.dwo", ".zdebug_str.dwo" },
- { ".debug_str_offsets.dwo", ".zdebug_str_offsets.dwo" },
- { ".debug_types.dwo", ".zdebug_types.dwo" },
- { ".debug_cu_index", ".zdebug_cu_index" },
- { ".debug_tu_index", ".zdebug_tu_index" },
- };
- struct comp_unit_head
- {
- unsigned int length;
- short version;
- unsigned char addr_size;
- unsigned char signed_addr_p;
- sect_offset abbrev_offset;
-
- unsigned int offset_size;
-
- unsigned int initial_length_size;
-
- sect_offset offset;
-
- cu_offset first_die_offset;
- };
- struct delayed_method_info
- {
-
- struct type *type;
-
- int fnfield_index;
-
- int index;
-
- const char *name;
-
- struct die_info *die;
- };
- typedef struct delayed_method_info delayed_method_info;
- DEF_VEC_O (delayed_method_info);
- struct dwarf2_cu
- {
-
- struct objfile *objfile;
-
- struct comp_unit_head header;
-
- CORE_ADDR base_address;
-
- int base_known;
-
- enum language language;
- const struct language_defn *language_defn;
- const char *producer;
-
- FIXME
- struct pending **list_in_scope;
-
- struct abbrev_table *abbrev_table;
-
- htab_t partial_dies;
-
- struct obstack comp_unit_obstack;
-
- struct dwarf2_per_cu_data *read_in_chain;
-
- struct dwarf2_per_cu_data *per_cu;
-
- int last_used;
-
- htab_t die_hash;
-
- struct die_info *dies;
-
- htab_t dependencies;
-
- struct line_header *line_header;
-
- VEC (delayed_method_info) *method_list;
-
- htab_t call_site_htab;
-
- struct dwo_unit *dwo_unit;
-
- ULONGEST addr_base;
-
- ULONGEST ranges_base;
-
- unsigned int mark : 1;
-
- unsigned int has_loclist : 1;
-
- unsigned int checked_producer : 1;
- unsigned int producer_is_gxx_lt_4_6 : 1;
- unsigned int producer_is_gcc_lt_4_3 : 1;
- unsigned int producer_is_icc : 1;
-
- unsigned int processing_has_namespace_info : 1;
- };
- struct dwarf2_per_cu_data
- {
-
- sect_offset offset;
- unsigned int length;
-
- unsigned int queued : 1;
-
- unsigned int load_all_dies : 1;
-
- unsigned int is_debug_types : 1;
-
- unsigned int is_dwz : 1;
-
- unsigned int reading_dwo_directly : 1;
-
- unsigned int tu_read : 1;
-
- struct dwarf2_section_info *section;
-
- struct dwarf2_cu *cu;
-
- struct objfile *objfile;
-
- union
- {
-
- struct partial_symtab *psymtab;
-
- struct dwarf2_per_cu_quick_data *quick;
- } v;
-
- VEC (dwarf2_per_cu_ptr) *imported_symtabs;
- };
- struct signatured_type
- {
-
- struct dwarf2_per_cu_data per_cu;
-
- ULONGEST signature;
-
- cu_offset type_offset_in_tu;
-
- sect_offset type_offset_in_section;
-
- struct type_unit_group *type_unit_group;
-
- struct type *type;
-
- struct dwo_unit *dwo_unit;
- };
- typedef struct signatured_type *sig_type_ptr;
- DEF_VEC_P (sig_type_ptr);
- struct stmt_list_hash
- {
-
- struct dwo_unit *dwo_unit;
-
- sect_offset line_offset;
- };
- struct type_unit_group
- {
-
- #define IS_TYPE_UNIT_GROUP(per_cu) ((per_cu)->section == NULL)
- struct dwarf2_per_cu_data per_cu;
-
- VEC (sig_type_ptr) *tus;
-
- struct compunit_symtab *compunit_symtab;
-
- struct stmt_list_hash hash;
-
- unsigned int num_symtabs;
-
- struct symtab **symtabs;
- };
- struct dwo_sections
- {
- struct dwarf2_section_info abbrev;
- struct dwarf2_section_info line;
- struct dwarf2_section_info loc;
- struct dwarf2_section_info macinfo;
- struct dwarf2_section_info macro;
- struct dwarf2_section_info str;
- struct dwarf2_section_info str_offsets;
-
- struct dwarf2_section_info info;
- VEC (dwarf2_section_info_def) *types;
- };
- struct dwo_unit
- {
-
- struct dwo_file *dwo_file;
-
- ULONGEST signature;
-
- struct dwarf2_section_info *section;
-
- sect_offset offset;
- unsigned int length;
-
- cu_offset type_offset_in_tu;
- };
- enum dwp_v2_section_ids
- {
- DW_SECT_MIN = 1
- };
- struct dwo_file
- {
-
- const char *dwo_name;
-
- const char *comp_dir;
-
- bfd *dbfd;
-
- struct dwo_sections sections;
-
- struct dwo_unit *cu;
-
- htab_t tus;
- };
- struct dwp_sections
- {
-
- struct dwarf2_section_info str;
- struct dwarf2_section_info cu_index;
- struct dwarf2_section_info tu_index;
-
- struct dwarf2_section_info abbrev;
- struct dwarf2_section_info info;
- struct dwarf2_section_info line;
- struct dwarf2_section_info loc;
- struct dwarf2_section_info macinfo;
- struct dwarf2_section_info macro;
- struct dwarf2_section_info str_offsets;
- struct dwarf2_section_info types;
- };
- struct virtual_v1_dwo_sections
- {
- struct dwarf2_section_info abbrev;
- struct dwarf2_section_info line;
- struct dwarf2_section_info loc;
- struct dwarf2_section_info macinfo;
- struct dwarf2_section_info macro;
- struct dwarf2_section_info str_offsets;
-
- struct dwarf2_section_info info_or_types;
- };
- struct virtual_v2_dwo_sections
- {
- bfd_size_type abbrev_offset;
- bfd_size_type abbrev_size;
- bfd_size_type line_offset;
- bfd_size_type line_size;
- bfd_size_type loc_offset;
- bfd_size_type loc_size;
- bfd_size_type macinfo_offset;
- bfd_size_type macinfo_size;
- bfd_size_type macro_offset;
- bfd_size_type macro_size;
- bfd_size_type str_offsets_offset;
- bfd_size_type str_offsets_size;
-
- bfd_size_type info_or_types_offset;
- bfd_size_type info_or_types_size;
- };
- struct dwp_hash_table
- {
- uint32_t version, nr_columns;
- uint32_t nr_units, nr_slots;
- const gdb_byte *hash_table, *unit_table;
- union
- {
- struct
- {
- const gdb_byte *indices;
- } v1;
- struct
- {
-
- #define MAX_NR_V2_DWO_SECTIONS \
- (1 \
- + 1 \
- + 1 \
- + 1 \
- + 1 \
- + 1 )
- int section_ids[MAX_NR_V2_DWO_SECTIONS];
- const gdb_byte *offsets;
- const gdb_byte *sizes;
- } v2;
- } section_pool;
- };
- struct dwp_file
- {
-
- const char *name;
-
- int version;
-
- bfd *dbfd;
-
- struct dwp_sections sections;
-
- const struct dwp_hash_table *cus;
-
- const struct dwp_hash_table *tus;
-
- htab_t loaded_cus;
- htab_t loaded_tus;
-
- unsigned int num_sections;
- asection **elf_sections;
- };
- struct dwz_file
- {
-
- struct dwarf2_section_info abbrev;
- struct dwarf2_section_info info;
- struct dwarf2_section_info str;
- struct dwarf2_section_info line;
- struct dwarf2_section_info macro;
- struct dwarf2_section_info gdb_index;
-
- bfd *dwz_bfd;
- };
- struct die_reader_specs
- {
-
- bfd* abfd;
-
- struct dwarf2_cu *cu;
-
- struct dwo_file *dwo_file;
-
- struct dwarf2_section_info *die_section;
-
- const gdb_byte *buffer;
-
- const gdb_byte *buffer_end;
-
- const char *comp_dir;
- };
- typedef void (die_reader_func_ftype) (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr,
- struct die_info *comp_unit_die,
- int has_children,
- void *data);
- struct line_header
- {
- unsigned int total_length;
- unsigned short version;
- unsigned int header_length;
- unsigned char minimum_instruction_length;
- unsigned char maximum_ops_per_instruction;
- unsigned char default_is_stmt;
- int line_base;
- unsigned char line_range;
- unsigned char opcode_base;
-
- unsigned char *standard_opcode_lengths;
-
- unsigned int num_include_dirs, include_dirs_size;
- const char **include_dirs;
-
- unsigned int num_file_names, file_names_size;
- struct file_entry
- {
- const char *name;
- unsigned int dir_index;
- unsigned int mod_time;
- unsigned int length;
- int included_p;
- struct symtab *symtab;
- } *file_names;
-
- const gdb_byte *statement_program_start, *statement_program_end;
- };
- struct partial_die_info
- {
-
- sect_offset offset;
-
- ENUM_BITFIELD(dwarf_tag) tag : 16;
-
- unsigned int has_children : 1;
- unsigned int is_external : 1;
- unsigned int is_declaration : 1;
- unsigned int has_type : 1;
- unsigned int has_specification : 1;
- unsigned int has_pc_info : 1;
- unsigned int may_be_inlined : 1;
-
- unsigned int scope_set : 1;
-
- unsigned int has_byte_size : 1;
-
- unsigned int has_template_arguments : 1;
-
- unsigned int fixup_called : 1;
-
- unsigned int is_dwz : 1;
-
- unsigned int spec_is_dwz : 1;
-
- const char *name;
-
- const char *linkage_name;
-
- const char *scope;
-
- union
- {
-
- struct dwarf_block *locdesc;
-
- sect_offset offset;
- } d;
-
- CORE_ADDR lowpc;
- CORE_ADDR highpc;
-
-
- const gdb_byte *sibling;
-
- sect_offset spec_offset;
-
- struct partial_die_info *die_parent, *die_child, *die_sibling;
- };
- struct abbrev_info
- {
- unsigned int number;
- enum dwarf_tag tag;
- unsigned short has_children;
- unsigned short num_attrs;
- struct attr_abbrev *attrs;
- struct abbrev_info *next;
- };
- struct attr_abbrev
- {
- ENUM_BITFIELD(dwarf_attribute) name : 16;
- ENUM_BITFIELD(dwarf_form) form : 16;
- };
- #define ABBREV_HASH_SIZE 121
- struct abbrev_table
- {
-
- sect_offset offset;
-
- struct obstack abbrev_obstack;
-
- struct abbrev_info **abbrevs;
- };
- struct attribute
- {
- ENUM_BITFIELD(dwarf_attribute) name : 16;
- ENUM_BITFIELD(dwarf_form) form : 15;
-
- unsigned int string_is_canonical : 1;
- union
- {
- const char *str;
- struct dwarf_block *blk;
- ULONGEST unsnd;
- LONGEST snd;
- CORE_ADDR addr;
- ULONGEST signature;
- }
- u;
- };
- struct die_info
- {
-
- ENUM_BITFIELD(dwarf_tag) tag : 16;
-
- unsigned char num_attrs;
-
- unsigned char building_fullname : 1;
-
- unsigned char in_process : 1;
-
- unsigned int abbrev;
-
- sect_offset offset;
-
- struct die_info *child;
- struct die_info *sibling;
- struct die_info *parent;
-
- struct attribute attrs[1];
- };
- #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)
- struct dwarf_block
- {
- size_t size;
-
- const gdb_byte *data;
- };
- #ifndef ATTR_ALLOC_CHUNK
- #define ATTR_ALLOC_CHUNK 4
- #endif
- #ifndef DW_FIELD_ALLOC_CHUNK
- #define DW_FIELD_ALLOC_CHUNK 4
- #endif
- FIXME
- static int bits_per_byte = 8;
- struct field_info
- {
-
- struct nextfield
- {
- struct nextfield *next;
- int accessibility;
- int virtuality;
- struct field field;
- }
- *fields, *baseclasses;
-
- int nfields;
-
- int nbaseclasses;
-
- int non_public_fields;
-
- struct nextfnfield
- {
- struct nextfnfield *next;
- struct fn_field fnfield;
- }
- *fnfields;
-
- struct fnfieldlist
- {
- const char *name;
- int length;
- struct nextfnfield *head;
- }
- *fnfieldlists;
-
- int nfnfields;
-
- struct typedef_field_list
- {
- struct typedef_field field;
- struct typedef_field_list *next;
- }
- *typedef_field_list;
- unsigned typedef_field_list_count;
- };
- struct dwarf2_queue_item
- {
- struct dwarf2_per_cu_data *per_cu;
- enum language pretend_language;
- struct dwarf2_queue_item *next;
- };
- static struct dwarf2_queue_item *dwarf2_queue, *dwarf2_queue_tail;
- static int dwarf2_max_cache_age = 5;
- static void
- show_dwarf2_max_cache_age (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- fprintf_filtered (file, _("The upper bound on the age of cached "
- "dwarf2 compilation units is %s.\n"),
- value);
- }
- static const char *get_section_name (const struct dwarf2_section_info *);
- static const char *get_section_file_name (const struct dwarf2_section_info *);
- static void dwarf2_locate_sections (bfd *, asection *, void *);
- static void dwarf2_find_base_address (struct die_info *die,
- struct dwarf2_cu *cu);
- static struct partial_symtab *create_partial_symtab
- (struct dwarf2_per_cu_data *per_cu, const char *name);
- static void dwarf2_build_psymtabs_hard (struct objfile *);
- static void scan_partial_symbols (struct partial_die_info *,
- CORE_ADDR *, CORE_ADDR *,
- int, struct dwarf2_cu *);
- static void add_partial_symbol (struct partial_die_info *,
- struct dwarf2_cu *);
- static void add_partial_namespace (struct partial_die_info *pdi,
- CORE_ADDR *lowpc, CORE_ADDR *highpc,
- int set_addrmap, struct dwarf2_cu *cu);
- static void add_partial_module (struct partial_die_info *pdi, CORE_ADDR *lowpc,
- CORE_ADDR *highpc, int set_addrmap,
- struct dwarf2_cu *cu);
- static void add_partial_enumeration (struct partial_die_info *enum_pdi,
- struct dwarf2_cu *cu);
- static void add_partial_subprogram (struct partial_die_info *pdi,
- CORE_ADDR *lowpc, CORE_ADDR *highpc,
- int need_pc, struct dwarf2_cu *cu);
- static void dwarf2_read_symtab (struct partial_symtab *,
- struct objfile *);
- static void psymtab_to_symtab_1 (struct partial_symtab *);
- static struct abbrev_info *abbrev_table_lookup_abbrev
- (const struct abbrev_table *, unsigned int);
- static struct abbrev_table *abbrev_table_read_table
- (struct dwarf2_section_info *, sect_offset);
- static void abbrev_table_free (struct abbrev_table *);
- static void abbrev_table_free_cleanup (void *);
- static void dwarf2_read_abbrevs (struct dwarf2_cu *,
- struct dwarf2_section_info *);
- static void dwarf2_free_abbrev_table (void *);
- static unsigned int peek_abbrev_code (bfd *, const gdb_byte *);
- static struct partial_die_info *load_partial_dies
- (const struct die_reader_specs *, const gdb_byte *, int);
- static const gdb_byte *read_partial_die (const struct die_reader_specs *,
- struct partial_die_info *,
- struct abbrev_info *,
- unsigned int,
- const gdb_byte *);
- static struct partial_die_info *find_partial_die (sect_offset, int,
- struct dwarf2_cu *);
- static void fixup_partial_die (struct partial_die_info *,
- struct dwarf2_cu *);
- static const gdb_byte *read_attribute (const struct die_reader_specs *,
- struct attribute *, struct attr_abbrev *,
- const gdb_byte *);
- static unsigned int read_1_byte (bfd *, const gdb_byte *);
- static int read_1_signed_byte (bfd *, const gdb_byte *);
- static unsigned int read_2_bytes (bfd *, const gdb_byte *);
- static unsigned int read_4_bytes (bfd *, const gdb_byte *);
- static ULONGEST read_8_bytes (bfd *, const gdb_byte *);
- static CORE_ADDR read_address (bfd *, const gdb_byte *ptr, struct dwarf2_cu *,
- unsigned int *);
- static LONGEST read_initial_length (bfd *, const gdb_byte *, unsigned int *);
- static LONGEST read_checked_initial_length_and_offset
- (bfd *, const gdb_byte *, const struct comp_unit_head *,
- unsigned int *, unsigned int *);
- static LONGEST read_offset (bfd *, const gdb_byte *,
- const struct comp_unit_head *,
- unsigned int *);
- static LONGEST read_offset_1 (bfd *, const gdb_byte *, unsigned int);
- static sect_offset read_abbrev_offset (struct dwarf2_section_info *,
- sect_offset);
- static const gdb_byte *read_n_bytes (bfd *, const gdb_byte *, unsigned int);
- static const char *read_direct_string (bfd *, const gdb_byte *, unsigned int *);
- static const char *read_indirect_string (bfd *, const gdb_byte *,
- const struct comp_unit_head *,
- unsigned int *);
- static const char *read_indirect_string_from_dwz (struct dwz_file *, LONGEST);
- static ULONGEST read_unsigned_leb128 (bfd *, const gdb_byte *, unsigned int *);
- static LONGEST read_signed_leb128 (bfd *, const gdb_byte *, unsigned int *);
- static CORE_ADDR read_addr_index_from_leb128 (struct dwarf2_cu *,
- const gdb_byte *,
- unsigned int *);
- static const char *read_str_index (const struct die_reader_specs *reader,
- ULONGEST str_index);
- static void set_cu_language (unsigned int, struct dwarf2_cu *);
- static struct attribute *dwarf2_attr (struct die_info *, unsigned int,
- struct dwarf2_cu *);
- static struct attribute *dwarf2_attr_no_follow (struct die_info *,
- unsigned int);
- static int dwarf2_flag_true_p (struct die_info *die, unsigned name,
- struct dwarf2_cu *cu);
- static int die_is_declaration (struct die_info *, struct dwarf2_cu *cu);
- static struct die_info *die_specification (struct die_info *die,
- struct dwarf2_cu **);
- static void free_line_header (struct line_header *lh);
- static struct line_header *dwarf_decode_line_header (unsigned int offset,
- struct dwarf2_cu *cu);
- static void dwarf_decode_lines (struct line_header *, const char *,
- struct dwarf2_cu *, struct partial_symtab *,
- CORE_ADDR);
- static void dwarf2_start_subfile (const char *, const char *);
- static struct compunit_symtab *dwarf2_start_symtab (struct dwarf2_cu *,
- const char *, const char *,
- CORE_ADDR);
- static struct symbol *new_symbol (struct die_info *, struct type *,
- struct dwarf2_cu *);
- static struct symbol *new_symbol_full (struct die_info *, struct type *,
- struct dwarf2_cu *, struct symbol *);
- static void dwarf2_const_value (const struct attribute *, struct symbol *,
- struct dwarf2_cu *);
- static void dwarf2_const_value_attr (const struct attribute *attr,
- struct type *type,
- const char *name,
- struct obstack *obstack,
- struct dwarf2_cu *cu, LONGEST *value,
- const gdb_byte **bytes,
- struct dwarf2_locexpr_baton **baton);
- static struct type *die_type (struct die_info *, struct dwarf2_cu *);
- static int need_gnat_info (struct dwarf2_cu *);
- static struct type *die_descriptive_type (struct die_info *,
- struct dwarf2_cu *);
- static void set_descriptive_type (struct type *, struct die_info *,
- struct dwarf2_cu *);
- static struct type *die_containing_type (struct die_info *,
- struct dwarf2_cu *);
- static struct type *lookup_die_type (struct die_info *, const struct attribute *,
- struct dwarf2_cu *);
- static struct type *read_type_die (struct die_info *, struct dwarf2_cu *);
- static struct type *read_type_die_1 (struct die_info *, struct dwarf2_cu *);
- static const char *determine_prefix (struct die_info *die, struct dwarf2_cu *);
- static char *typename_concat (struct obstack *obs, const char *prefix,
- const char *suffix, int physname,
- struct dwarf2_cu *cu);
- static void read_file_scope (struct die_info *, struct dwarf2_cu *);
- static void read_type_unit_scope (struct die_info *, struct dwarf2_cu *);
- static void read_func_scope (struct die_info *, struct dwarf2_cu *);
- static void read_lexical_block_scope (struct die_info *, struct dwarf2_cu *);
- static void read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu);
- static int dwarf2_ranges_read (unsigned, CORE_ADDR *, CORE_ADDR *,
- struct dwarf2_cu *, struct partial_symtab *);
- static int dwarf2_get_pc_bounds (struct die_info *,
- CORE_ADDR *, CORE_ADDR *, struct dwarf2_cu *,
- struct partial_symtab *);
- static void get_scope_pc_bounds (struct die_info *,
- CORE_ADDR *, CORE_ADDR *,
- struct dwarf2_cu *);
- static void dwarf2_record_block_ranges (struct die_info *, struct block *,
- CORE_ADDR, struct dwarf2_cu *);
- static void dwarf2_add_field (struct field_info *, struct die_info *,
- struct dwarf2_cu *);
- static void dwarf2_attach_fields_to_type (struct field_info *,
- struct type *, struct dwarf2_cu *);
- static void dwarf2_add_member_fn (struct field_info *,
- struct die_info *, struct type *,
- struct dwarf2_cu *);
- static void dwarf2_attach_fn_fields_to_type (struct field_info *,
- struct type *,
- struct dwarf2_cu *);
- static void process_structure_scope (struct die_info *, struct dwarf2_cu *);
- static void read_common_block (struct die_info *, struct dwarf2_cu *);
- static void read_namespace (struct die_info *die, struct dwarf2_cu *);
- static void read_module (struct die_info *die, struct dwarf2_cu *cu);
- static void read_import_statement (struct die_info *die, struct dwarf2_cu *);
- static int read_namespace_alias (struct die_info *die, struct dwarf2_cu *cu);
- static struct type *read_module_type (struct die_info *die,
- struct dwarf2_cu *cu);
- static const char *namespace_name (struct die_info *die,
- int *is_anonymous, struct dwarf2_cu *);
- static void process_enumeration_scope (struct die_info *, struct dwarf2_cu *);
- static CORE_ADDR decode_locdesc (struct dwarf_block *, struct dwarf2_cu *);
- static enum dwarf_array_dim_ordering read_array_order (struct die_info *,
- struct dwarf2_cu *);
- static struct die_info *read_die_and_siblings_1
- (const struct die_reader_specs *, const gdb_byte *, const gdb_byte **,
- struct die_info *);
- static struct die_info *read_die_and_siblings (const struct die_reader_specs *,
- const gdb_byte *info_ptr,
- const gdb_byte **new_info_ptr,
- struct die_info *parent);
- static const gdb_byte *read_full_die_1 (const struct die_reader_specs *,
- struct die_info **, const gdb_byte *,
- int *, int);
- static const gdb_byte *read_full_die (const struct die_reader_specs *,
- struct die_info **, const gdb_byte *,
- int *);
- static void process_die (struct die_info *, struct dwarf2_cu *);
- static const char *dwarf2_canonicalize_name (const char *, struct dwarf2_cu *,
- struct obstack *);
- static const char *dwarf2_name (struct die_info *die, struct dwarf2_cu *);
- static const char *dwarf2_full_name (const char *name,
- struct die_info *die,
- struct dwarf2_cu *cu);
- static const char *dwarf2_physname (const char *name, struct die_info *die,
- struct dwarf2_cu *cu);
- static struct die_info *dwarf2_extension (struct die_info *die,
- struct dwarf2_cu **);
- static const char *dwarf_tag_name (unsigned int);
- static const char *dwarf_attr_name (unsigned int);
- static const char *dwarf_form_name (unsigned int);
- static char *dwarf_bool_name (unsigned int);
- static const char *dwarf_type_encoding_name (unsigned int);
- static struct die_info *sibling_die (struct die_info *);
- static void dump_die_shallow (struct ui_file *, int indent, struct die_info *);
- static void dump_die_for_error (struct die_info *);
- static void dump_die_1 (struct ui_file *, int level, int max_level,
- struct die_info *);
- void dump_die (struct die_info *, int max_level);
- static void store_in_ref_table (struct die_info *,
- struct dwarf2_cu *);
- static sect_offset dwarf2_get_ref_die_offset (const struct attribute *);
- static LONGEST dwarf2_get_attr_constant_value (const struct attribute *, int);
- static struct die_info *follow_die_ref_or_sig (struct die_info *,
- const struct attribute *,
- struct dwarf2_cu **);
- static struct die_info *follow_die_ref (struct die_info *,
- const struct attribute *,
- struct dwarf2_cu **);
- static struct die_info *follow_die_sig (struct die_info *,
- const struct attribute *,
- struct dwarf2_cu **);
- static struct type *get_signatured_type (struct die_info *, ULONGEST,
- struct dwarf2_cu *);
- static struct type *get_DW_AT_signature_type (struct die_info *,
- const struct attribute *,
- struct dwarf2_cu *);
- static void load_full_type_unit (struct dwarf2_per_cu_data *per_cu);
- static void read_signatured_type (struct signatured_type *);
- static struct dwarf_block *dwarf_alloc_block (struct dwarf2_cu *);
- static struct die_info *dwarf_alloc_die (struct dwarf2_cu *, int);
- static void dwarf_decode_macros (struct dwarf2_cu *, unsigned int, int);
- static int attr_form_is_block (const struct attribute *);
- static int attr_form_is_section_offset (const struct attribute *);
- static int attr_form_is_constant (const struct attribute *);
- static int attr_form_is_ref (const struct attribute *);
- static void fill_in_loclist_baton (struct dwarf2_cu *cu,
- struct dwarf2_loclist_baton *baton,
- const struct attribute *attr);
- static void dwarf2_symbol_mark_computed (const struct attribute *attr,
- struct symbol *sym,
- struct dwarf2_cu *cu,
- int is_block);
- static const gdb_byte *skip_one_die (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr,
- struct abbrev_info *abbrev);
- static void free_stack_comp_unit (void *);
- static hashval_t partial_die_hash (const void *item);
- static int partial_die_eq (const void *item_lhs, const void *item_rhs);
- static struct dwarf2_per_cu_data *dwarf2_find_containing_comp_unit
- (sect_offset offset, unsigned int offset_in_dwz, struct objfile *objfile);
- static void init_one_comp_unit (struct dwarf2_cu *cu,
- struct dwarf2_per_cu_data *per_cu);
- static void prepare_one_comp_unit (struct dwarf2_cu *cu,
- struct die_info *comp_unit_die,
- enum language pretend_language);
- static void free_heap_comp_unit (void *);
- static void free_cached_comp_units (void *);
- static void age_cached_comp_units (void);
- static void free_one_cached_comp_unit (struct dwarf2_per_cu_data *);
- static struct type *set_die_type (struct die_info *, struct type *,
- struct dwarf2_cu *);
- static void create_all_comp_units (struct objfile *);
- static int create_all_type_units (struct objfile *);
- static void load_full_comp_unit (struct dwarf2_per_cu_data *,
- enum language);
- static void process_full_comp_unit (struct dwarf2_per_cu_data *,
- enum language);
- static void process_full_type_unit (struct dwarf2_per_cu_data *,
- enum language);
- static void dwarf2_add_dependence (struct dwarf2_cu *,
- struct dwarf2_per_cu_data *);
- static void dwarf2_mark (struct dwarf2_cu *);
- static void dwarf2_clear_marks (struct dwarf2_per_cu_data *);
- static struct type *get_die_type_at_offset (sect_offset,
- struct dwarf2_per_cu_data *);
- static struct type *get_die_type (struct die_info *die, struct dwarf2_cu *cu);
- static void dwarf2_release_queue (void *dummy);
- static void queue_comp_unit (struct dwarf2_per_cu_data *per_cu,
- enum language pretend_language);
- static void process_queue (void);
- static void find_file_and_directory (struct die_info *die,
- struct dwarf2_cu *cu,
- const char **name, const char **comp_dir);
- static char *file_full_name (int file, struct line_header *lh,
- const char *comp_dir);
- static const gdb_byte *read_and_check_comp_unit_head
- (struct comp_unit_head *header,
- struct dwarf2_section_info *section,
- struct dwarf2_section_info *abbrev_section, const gdb_byte *info_ptr,
- int is_debug_types_section);
- static void init_cutu_and_read_dies
- (struct dwarf2_per_cu_data *this_cu, struct abbrev_table *abbrev_table,
- int use_existing_cu, int keep,
- die_reader_func_ftype *die_reader_func, void *data);
- static void init_cutu_and_read_dies_simple
- (struct dwarf2_per_cu_data *this_cu,
- die_reader_func_ftype *die_reader_func, void *data);
- static htab_t allocate_signatured_type_table (struct objfile *objfile);
- static htab_t allocate_dwo_unit_table (struct objfile *objfile);
- static struct dwo_unit *lookup_dwo_unit_in_dwp
- (struct dwp_file *dwp_file, const char *comp_dir,
- ULONGEST signature, int is_debug_types);
- static struct dwp_file *get_dwp_file (void);
- static struct dwo_unit *lookup_dwo_comp_unit
- (struct dwarf2_per_cu_data *, const char *, const char *, ULONGEST);
- static struct dwo_unit *lookup_dwo_type_unit
- (struct signatured_type *, const char *, const char *);
- static void queue_and_load_all_dwo_tus (struct dwarf2_per_cu_data *);
- static void free_dwo_file_cleanup (void *);
- static void process_cu_includes (void);
- static void check_producer (struct dwarf2_cu *cu);
- static void
- dwarf2_statement_list_fits_in_line_number_section_complaint (void)
- {
- complaint (&symfile_complaints,
- _("statement list doesn't fit in .debug_line section"));
- }
- static void
- dwarf2_debug_line_missing_file_complaint (void)
- {
- complaint (&symfile_complaints,
- _(".debug_line section has line data without a file"));
- }
- static void
- dwarf2_debug_line_missing_end_sequence_complaint (void)
- {
- complaint (&symfile_complaints,
- _(".debug_line section has line "
- "program sequence without an end"));
- }
- static void
- dwarf2_complex_location_expr_complaint (void)
- {
- complaint (&symfile_complaints, _("location expression too complex"));
- }
- static void
- dwarf2_const_value_length_mismatch_complaint (const char *arg1, int arg2,
- int arg3)
- {
- complaint (&symfile_complaints,
- _("const value length mismatch for '%s', got %d, expected %d"),
- arg1, arg2, arg3);
- }
- static void
- dwarf2_section_buffer_overflow_complaint (struct dwarf2_section_info *section)
- {
- complaint (&symfile_complaints,
- _("debug info runs off end of %s section"
- " [in module %s]"),
- get_section_name (section),
- get_section_file_name (section));
- }
- static void
- dwarf2_macro_malformed_definition_complaint (const char *arg1)
- {
- complaint (&symfile_complaints,
- _("macro debug info contains a "
- "malformed macro definition:\n`%s'"),
- arg1);
- }
- static void
- dwarf2_invalid_attrib_class_complaint (const char *arg1, const char *arg2)
- {
- complaint (&symfile_complaints,
- _("invalid attribute class or form for '%s' in '%s'"),
- arg1, arg2);
- }
- #if WORDS_BIGENDIAN
- static offset_type
- byte_swap (offset_type value)
- {
- offset_type result;
- result = (value & 0xff) << 24;
- result |= (value & 0xff00) << 8;
- result |= (value & 0xff0000) >> 8;
- result |= (value & 0xff000000) >> 24;
- return result;
- }
- #define MAYBE_SWAP(V) byte_swap (V)
- #else
- #define MAYBE_SWAP(V) (V)
- #endif
- static CORE_ADDR
- attr_value_as_address (struct attribute *attr)
- {
- CORE_ADDR addr;
- if (attr->form != DW_FORM_addr && attr->form != DW_FORM_GNU_addr_index)
- {
-
- addr = DW_UNSND (attr);
- }
- else
- addr = DW_ADDR (attr);
- return addr;
- }
- #define INDEX_SUFFIX ".gdb-index"
- int
- dwarf2_has_info (struct objfile *objfile,
- const struct dwarf2_debug_sections *names)
- {
- dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key);
- if (!dwarf2_per_objfile)
- {
-
- struct dwarf2_per_objfile *data
- = obstack_alloc (&objfile->objfile_obstack, sizeof (*data));
- memset (data, 0, sizeof (*data));
- set_objfile_data (objfile, dwarf2_objfile_data_key, data);
- dwarf2_per_objfile = data;
- bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections,
- (void *) names);
- dwarf2_per_objfile->objfile = objfile;
- }
- return (!dwarf2_per_objfile->info.is_virtual
- && dwarf2_per_objfile->info.s.asection != NULL
- && !dwarf2_per_objfile->abbrev.is_virtual
- && dwarf2_per_objfile->abbrev.s.asection != NULL);
- }
- static struct dwarf2_section_info *
- get_containing_section (const struct dwarf2_section_info *section)
- {
- gdb_assert (section->is_virtual);
- return section->s.containing_section;
- }
- static struct bfd *
- get_section_bfd_owner (const struct dwarf2_section_info *section)
- {
- if (section->is_virtual)
- {
- section = get_containing_section (section);
- gdb_assert (!section->is_virtual);
- }
- return section->s.asection->owner;
- }
- static asection *
- get_section_bfd_section (const struct dwarf2_section_info *section)
- {
- if (section->is_virtual)
- {
- section = get_containing_section (section);
- gdb_assert (!section->is_virtual);
- }
- return section->s.asection;
- }
- static const char *
- get_section_name (const struct dwarf2_section_info *section)
- {
- asection *sectp = get_section_bfd_section (section);
- gdb_assert (sectp != NULL);
- return bfd_section_name (get_section_bfd_owner (section), sectp);
- }
- static const char *
- get_section_file_name (const struct dwarf2_section_info *section)
- {
- bfd *abfd = get_section_bfd_owner (section);
- return bfd_get_filename (abfd);
- }
- static int
- get_section_id (const struct dwarf2_section_info *section)
- {
- asection *sectp = get_section_bfd_section (section);
- if (sectp == NULL)
- return 0;
- return sectp->id;
- }
- static int
- get_section_flags (const struct dwarf2_section_info *section)
- {
- asection *sectp = get_section_bfd_section (section);
- gdb_assert (sectp != NULL);
- return bfd_get_section_flags (sectp->owner, sectp);
- }
- static int
- section_is_p (const char *section_name,
- const struct dwarf2_section_names *names)
- {
- if (names->normal != NULL
- && strcmp (section_name, names->normal) == 0)
- return 1;
- if (names->compressed != NULL
- && strcmp (section_name, names->compressed) == 0)
- return 1;
- return 0;
- }
- static void
- dwarf2_locate_sections (bfd *abfd, asection *sectp, void *vnames)
- {
- const struct dwarf2_debug_sections *names;
- flagword aflag = bfd_get_section_flags (abfd, sectp);
- if (vnames == NULL)
- names = &dwarf2_elf_names;
- else
- names = (const struct dwarf2_debug_sections *) vnames;
- if ((aflag & SEC_HAS_CONTENTS) == 0)
- {
- }
- else if (section_is_p (sectp->name, &names->info))
- {
- dwarf2_per_objfile->info.s.asection = sectp;
- dwarf2_per_objfile->info.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->abbrev))
- {
- dwarf2_per_objfile->abbrev.s.asection = sectp;
- dwarf2_per_objfile->abbrev.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->line))
- {
- dwarf2_per_objfile->line.s.asection = sectp;
- dwarf2_per_objfile->line.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->loc))
- {
- dwarf2_per_objfile->loc.s.asection = sectp;
- dwarf2_per_objfile->loc.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->macinfo))
- {
- dwarf2_per_objfile->macinfo.s.asection = sectp;
- dwarf2_per_objfile->macinfo.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->macro))
- {
- dwarf2_per_objfile->macro.s.asection = sectp;
- dwarf2_per_objfile->macro.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->str))
- {
- dwarf2_per_objfile->str.s.asection = sectp;
- dwarf2_per_objfile->str.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->addr))
- {
- dwarf2_per_objfile->addr.s.asection = sectp;
- dwarf2_per_objfile->addr.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->frame))
- {
- dwarf2_per_objfile->frame.s.asection = sectp;
- dwarf2_per_objfile->frame.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->eh_frame))
- {
- dwarf2_per_objfile->eh_frame.s.asection = sectp;
- dwarf2_per_objfile->eh_frame.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->ranges))
- {
- dwarf2_per_objfile->ranges.s.asection = sectp;
- dwarf2_per_objfile->ranges.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->types))
- {
- struct dwarf2_section_info type_section;
- memset (&type_section, 0, sizeof (type_section));
- type_section.s.asection = sectp;
- type_section.size = bfd_get_section_size (sectp);
- VEC_safe_push (dwarf2_section_info_def, dwarf2_per_objfile->types,
- &type_section);
- }
- else if (section_is_p (sectp->name, &names->gdb_index))
- {
- dwarf2_per_objfile->gdb_index.s.asection = sectp;
- dwarf2_per_objfile->gdb_index.size = bfd_get_section_size (sectp);
- }
- if ((bfd_get_section_flags (abfd, sectp) & SEC_LOAD)
- && bfd_section_vma (abfd, sectp) == 0)
- dwarf2_per_objfile->has_section_at_zero = 1;
- }
- static int
- dwarf2_section_empty_p (const struct dwarf2_section_info *section)
- {
- if (section->is_virtual)
- return section->size == 0;
- return section->s.asection == NULL || section->size == 0;
- }
- static void
- dwarf2_read_section (struct objfile *objfile, struct dwarf2_section_info *info)
- {
- asection *sectp;
- bfd *abfd;
- gdb_byte *buf, *retbuf;
- if (info->readin)
- return;
- info->buffer = NULL;
- info->readin = 1;
- if (dwarf2_section_empty_p (info))
- return;
- sectp = get_section_bfd_section (info);
-
- if (info->is_virtual)
- {
- struct dwarf2_section_info *containing_section =
- get_containing_section (info);
- gdb_assert (sectp != NULL);
- if ((sectp->flags & SEC_RELOC) != 0)
- {
- error (_("Dwarf Error: DWP format V2 with relocations is not"
- " supported in section %s [in module %s]"),
- get_section_name (info), get_section_file_name (info));
- }
- dwarf2_read_section (objfile, containing_section);
-
- gdb_assert (info->virtual_offset + info->size
- <= containing_section->size);
-
- gdb_assert (containing_section->buffer != NULL);
- info->buffer = containing_section->buffer + info->virtual_offset;
- return;
- }
-
- if ((sectp->flags & SEC_RELOC) == 0)
- {
- info->buffer = gdb_bfd_map_section (sectp, &info->size);
- return;
- }
- buf = obstack_alloc (&objfile->objfile_obstack, info->size);
- info->buffer = buf;
-
- retbuf = symfile_relocate_debug_section (objfile, sectp, buf);
- if (retbuf != NULL)
- {
- info->buffer = retbuf;
- return;
- }
- abfd = get_section_bfd_owner (info);
- gdb_assert (abfd != NULL);
- if (bfd_seek (abfd, sectp->filepos, SEEK_SET) != 0
- || bfd_bread (buf, info->size, abfd) != info->size)
- {
- error (_("Dwarf Error: Can't read DWARF data"
- " in section %s [in module %s]"),
- bfd_section_name (abfd, sectp), bfd_get_filename (abfd));
- }
- }
- static bfd_size_type
- dwarf2_section_size (struct objfile *objfile,
- struct dwarf2_section_info *info)
- {
- if (!info->readin)
- dwarf2_read_section (objfile, info);
- return info->size;
- }
- void
- dwarf2_get_section_info (struct objfile *objfile,
- enum dwarf2_section_enum sect,
- asection **sectp, const gdb_byte **bufp,
- bfd_size_type *sizep)
- {
- struct dwarf2_per_objfile *data
- = objfile_data (objfile, dwarf2_objfile_data_key);
- struct dwarf2_section_info *info;
-
- if (data == NULL)
- {
- *sectp = NULL;
- *bufp = NULL;
- *sizep = 0;
- return;
- }
- switch (sect)
- {
- case DWARF2_DEBUG_FRAME:
- info = &data->frame;
- break;
- case DWARF2_EH_FRAME:
- info = &data->eh_frame;
- break;
- default:
- gdb_assert_not_reached ("unexpected section");
- }
- dwarf2_read_section (objfile, info);
- *sectp = get_section_bfd_section (info);
- *bufp = info->buffer;
- *sizep = info->size;
- }
- static void
- locate_dwz_sections (bfd *abfd, asection *sectp, void *arg)
- {
- struct dwz_file *dwz_file = arg;
-
- if (section_is_p (sectp->name, &dwarf2_elf_names.abbrev))
- {
- dwz_file->abbrev.s.asection = sectp;
- dwz_file->abbrev.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &dwarf2_elf_names.info))
- {
- dwz_file->info.s.asection = sectp;
- dwz_file->info.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &dwarf2_elf_names.str))
- {
- dwz_file->str.s.asection = sectp;
- dwz_file->str.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &dwarf2_elf_names.line))
- {
- dwz_file->line.s.asection = sectp;
- dwz_file->line.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &dwarf2_elf_names.macro))
- {
- dwz_file->macro.s.asection = sectp;
- dwz_file->macro.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &dwarf2_elf_names.gdb_index))
- {
- dwz_file->gdb_index.s.asection = sectp;
- dwz_file->gdb_index.size = bfd_get_section_size (sectp);
- }
- }
- static struct dwz_file *
- dwarf2_get_dwz_file (void)
- {
- bfd *dwz_bfd;
- char *data;
- struct cleanup *cleanup;
- const char *filename;
- struct dwz_file *result;
- bfd_size_type buildid_len_arg;
- size_t buildid_len;
- bfd_byte *buildid;
- if (dwarf2_per_objfile->dwz_file != NULL)
- return dwarf2_per_objfile->dwz_file;
- bfd_set_error (bfd_error_no_error);
- data = bfd_get_alt_debug_link_info (dwarf2_per_objfile->objfile->obfd,
- &buildid_len_arg, &buildid);
- if (data == NULL)
- {
- if (bfd_get_error () == bfd_error_no_error)
- return NULL;
- error (_("could not read '.gnu_debugaltlink' section: %s"),
- bfd_errmsg (bfd_get_error ()));
- }
- cleanup = make_cleanup (xfree, data);
- make_cleanup (xfree, buildid);
- buildid_len = (size_t) buildid_len_arg;
- filename = (const char *) data;
- if (!IS_ABSOLUTE_PATH (filename))
- {
- char *abs = gdb_realpath (objfile_name (dwarf2_per_objfile->objfile));
- char *rel;
- make_cleanup (xfree, abs);
- abs = ldirname (abs);
- make_cleanup (xfree, abs);
- rel = concat (abs, SLASH_STRING, filename, (char *) NULL);
- make_cleanup (xfree, rel);
- filename = rel;
- }
-
- dwz_bfd = gdb_bfd_open (filename, gnutarget, -1);
- if (dwz_bfd != NULL)
- {
- if (!build_id_verify (dwz_bfd, buildid_len, buildid))
- {
- gdb_bfd_unref (dwz_bfd);
- dwz_bfd = NULL;
- }
- }
- if (dwz_bfd == NULL)
- dwz_bfd = build_id_to_debug_bfd (buildid_len, buildid);
- if (dwz_bfd == NULL)
- error (_("could not find '.gnu_debugaltlink' file for %s"),
- objfile_name (dwarf2_per_objfile->objfile));
- result = OBSTACK_ZALLOC (&dwarf2_per_objfile->objfile->objfile_obstack,
- struct dwz_file);
- result->dwz_bfd = dwz_bfd;
- bfd_map_over_sections (dwz_bfd, locate_dwz_sections, result);
- do_cleanups (cleanup);
- gdb_bfd_record_inclusion (dwarf2_per_objfile->objfile->obfd, dwz_bfd);
- dwarf2_per_objfile->dwz_file = result;
- return result;
- }
- struct quick_file_names
- {
-
- struct stmt_list_hash hash;
-
- unsigned int num_file_names;
-
- const char **file_names;
-
- const char **real_names;
- };
- struct dwarf2_per_cu_quick_data
- {
-
- struct quick_file_names *file_names;
-
- struct compunit_symtab *compunit_symtab;
-
- unsigned int mark : 1;
-
- unsigned int no_file_data : 1;
- };
- static hashval_t
- hash_stmt_list_entry (const struct stmt_list_hash *stmt_list_hash)
- {
- hashval_t v = 0;
- if (stmt_list_hash->dwo_unit != NULL)
- v += (uintptr_t) stmt_list_hash->dwo_unit->dwo_file;
- v += stmt_list_hash->line_offset.sect_off;
- return v;
- }
- static int
- eq_stmt_list_entry (const struct stmt_list_hash *lhs,
- const struct stmt_list_hash *rhs)
- {
- if ((lhs->dwo_unit != NULL) != (rhs->dwo_unit != NULL))
- return 0;
- if (lhs->dwo_unit != NULL
- && lhs->dwo_unit->dwo_file != rhs->dwo_unit->dwo_file)
- return 0;
- return lhs->line_offset.sect_off == rhs->line_offset.sect_off;
- }
- static hashval_t
- hash_file_name_entry (const void *e)
- {
- const struct quick_file_names *file_data = e;
- return hash_stmt_list_entry (&file_data->hash);
- }
- static int
- eq_file_name_entry (const void *a, const void *b)
- {
- const struct quick_file_names *ea = a;
- const struct quick_file_names *eb = b;
- return eq_stmt_list_entry (&ea->hash, &eb->hash);
- }
- static void
- delete_file_name_entry (void *e)
- {
- struct quick_file_names *file_data = e;
- int i;
- for (i = 0; i < file_data->num_file_names; ++i)
- {
- xfree ((void*) file_data->file_names[i]);
- if (file_data->real_names)
- xfree ((void*) file_data->real_names[i]);
- }
-
- }
- static htab_t
- create_quick_file_names_table (unsigned int nr_initial_entries)
- {
- return htab_create_alloc (nr_initial_entries,
- hash_file_name_entry, eq_file_name_entry,
- delete_file_name_entry, xcalloc, xfree);
- }
- static void
- load_cu (struct dwarf2_per_cu_data *per_cu)
- {
- if (per_cu->is_debug_types)
- load_full_type_unit (per_cu);
- else
- load_full_comp_unit (per_cu, language_minimal);
- gdb_assert (per_cu->cu != NULL);
- dwarf2_find_base_address (per_cu->cu->dies, per_cu->cu);
- }
- static void
- dw2_do_instantiate_symtab (struct dwarf2_per_cu_data *per_cu)
- {
- struct cleanup *back_to;
-
- if (IS_TYPE_UNIT_GROUP (per_cu))
- return;
- back_to = make_cleanup (dwarf2_release_queue, NULL);
- if (dwarf2_per_objfile->using_index
- ? per_cu->v.quick->compunit_symtab == NULL
- : (per_cu->v.psymtab == NULL || !per_cu->v.psymtab->readin))
- {
- queue_comp_unit (per_cu, language_minimal);
- load_cu (per_cu);
-
- if (!per_cu->is_debug_types
- && per_cu->cu->dwo_unit != NULL
- && dwarf2_per_objfile->index_table != NULL
- && dwarf2_per_objfile->index_table->version <= 7
-
- && get_dwp_file () == NULL)
- queue_and_load_all_dwo_tus (per_cu);
- }
- process_queue ();
-
- age_cached_comp_units ();
- do_cleanups (back_to);
- }
- static struct compunit_symtab *
- dw2_instantiate_symtab (struct dwarf2_per_cu_data *per_cu)
- {
- gdb_assert (dwarf2_per_objfile->using_index);
- if (!per_cu->v.quick->compunit_symtab)
- {
- struct cleanup *back_to = make_cleanup (free_cached_comp_units, NULL);
- increment_reading_symtab ();
- dw2_do_instantiate_symtab (per_cu);
- process_cu_includes ();
- do_cleanups (back_to);
- }
- return per_cu->v.quick->compunit_symtab;
- }
- static struct dwarf2_per_cu_data *
- dw2_get_cutu (int index)
- {
- if (index >= dwarf2_per_objfile->n_comp_units)
- {
- index -= dwarf2_per_objfile->n_comp_units;
- gdb_assert (index < dwarf2_per_objfile->n_type_units);
- return &dwarf2_per_objfile->all_type_units[index]->per_cu;
- }
- return dwarf2_per_objfile->all_comp_units[index];
- }
- static struct dwarf2_per_cu_data *
- dw2_get_cu (int index)
- {
- gdb_assert (index >= 0 && index < dwarf2_per_objfile->n_comp_units);
- return dwarf2_per_objfile->all_comp_units[index];
- }
- static void
- create_cus_from_index_list (struct objfile *objfile,
- const gdb_byte *cu_list, offset_type n_elements,
- struct dwarf2_section_info *section,
- int is_dwz,
- int base_offset)
- {
- offset_type i;
- for (i = 0; i < n_elements; i += 2)
- {
- struct dwarf2_per_cu_data *the_cu;
- ULONGEST offset, length;
- gdb_static_assert (sizeof (ULONGEST) >= 8);
- offset = extract_unsigned_integer (cu_list, 8, BFD_ENDIAN_LITTLE);
- length = extract_unsigned_integer (cu_list + 8, 8, BFD_ENDIAN_LITTLE);
- cu_list += 2 * 8;
- the_cu = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct dwarf2_per_cu_data);
- the_cu->offset.sect_off = offset;
- the_cu->length = length;
- the_cu->objfile = objfile;
- the_cu->section = section;
- the_cu->v.quick = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct dwarf2_per_cu_quick_data);
- the_cu->is_dwz = is_dwz;
- dwarf2_per_objfile->all_comp_units[base_offset + i / 2] = the_cu;
- }
- }
- static void
- create_cus_from_index (struct objfile *objfile,
- const gdb_byte *cu_list, offset_type cu_list_elements,
- const gdb_byte *dwz_list, offset_type dwz_elements)
- {
- struct dwz_file *dwz;
- dwarf2_per_objfile->n_comp_units = (cu_list_elements + dwz_elements) / 2;
- dwarf2_per_objfile->all_comp_units
- = obstack_alloc (&objfile->objfile_obstack,
- dwarf2_per_objfile->n_comp_units
- * sizeof (struct dwarf2_per_cu_data *));
- create_cus_from_index_list (objfile, cu_list, cu_list_elements,
- &dwarf2_per_objfile->info, 0, 0);
- if (dwz_elements == 0)
- return;
- dwz = dwarf2_get_dwz_file ();
- create_cus_from_index_list (objfile, dwz_list, dwz_elements, &dwz->info, 1,
- cu_list_elements / 2);
- }
- static void
- create_signatured_type_table_from_index (struct objfile *objfile,
- struct dwarf2_section_info *section,
- const gdb_byte *bytes,
- offset_type elements)
- {
- offset_type i;
- htab_t sig_types_hash;
- dwarf2_per_objfile->n_type_units
- = dwarf2_per_objfile->n_allocated_type_units
- = elements / 3;
- dwarf2_per_objfile->all_type_units
- = xmalloc (dwarf2_per_objfile->n_type_units
- * sizeof (struct signatured_type *));
- sig_types_hash = allocate_signatured_type_table (objfile);
- for (i = 0; i < elements; i += 3)
- {
- struct signatured_type *sig_type;
- ULONGEST offset, type_offset_in_tu, signature;
- void **slot;
- gdb_static_assert (sizeof (ULONGEST) >= 8);
- offset = extract_unsigned_integer (bytes, 8, BFD_ENDIAN_LITTLE);
- type_offset_in_tu = extract_unsigned_integer (bytes + 8, 8,
- BFD_ENDIAN_LITTLE);
- signature = extract_unsigned_integer (bytes + 16, 8, BFD_ENDIAN_LITTLE);
- bytes += 3 * 8;
- sig_type = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct signatured_type);
- sig_type->signature = signature;
- sig_type->type_offset_in_tu.cu_off = type_offset_in_tu;
- sig_type->per_cu.is_debug_types = 1;
- sig_type->per_cu.section = section;
- sig_type->per_cu.offset.sect_off = offset;
- sig_type->per_cu.objfile = objfile;
- sig_type->per_cu.v.quick
- = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct dwarf2_per_cu_quick_data);
- slot = htab_find_slot (sig_types_hash, sig_type, INSERT);
- *slot = sig_type;
- dwarf2_per_objfile->all_type_units[i / 3] = sig_type;
- }
- dwarf2_per_objfile->signatured_types = sig_types_hash;
- }
- static void
- create_addrmap_from_index (struct objfile *objfile, struct mapped_index *index)
- {
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- const gdb_byte *iter, *end;
- struct obstack temp_obstack;
- struct addrmap *mutable_map;
- struct cleanup *cleanup;
- CORE_ADDR baseaddr;
- obstack_init (&temp_obstack);
- cleanup = make_cleanup_obstack_free (&temp_obstack);
- mutable_map = addrmap_create_mutable (&temp_obstack);
- iter = index->address_table;
- end = iter + index->address_table_size;
- baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
- while (iter < end)
- {
- ULONGEST hi, lo, cu_index;
- lo = extract_unsigned_integer (iter, 8, BFD_ENDIAN_LITTLE);
- iter += 8;
- hi = extract_unsigned_integer (iter, 8, BFD_ENDIAN_LITTLE);
- iter += 8;
- cu_index = extract_unsigned_integer (iter, 4, BFD_ENDIAN_LITTLE);
- iter += 4;
- if (lo > hi)
- {
- complaint (&symfile_complaints,
- _(".gdb_index address table has invalid range (%s - %s)"),
- hex_string (lo), hex_string (hi));
- continue;
- }
- if (cu_index >= dwarf2_per_objfile->n_comp_units)
- {
- complaint (&symfile_complaints,
- _(".gdb_index address table has invalid CU number %u"),
- (unsigned) cu_index);
- continue;
- }
- lo = gdbarch_adjust_dwarf2_addr (gdbarch, lo + baseaddr);
- hi = gdbarch_adjust_dwarf2_addr (gdbarch, hi + baseaddr);
- addrmap_set_empty (mutable_map, lo, hi - 1, dw2_get_cutu (cu_index));
- }
- objfile->psymtabs_addrmap = addrmap_create_fixed (mutable_map,
- &objfile->objfile_obstack);
- do_cleanups (cleanup);
- }
- static hashval_t
- mapped_index_string_hash (int index_version, const void *p)
- {
- const unsigned char *str = (const unsigned char *) p;
- hashval_t r = 0;
- unsigned char c;
- while ((c = *str++) != 0)
- {
- if (index_version >= 5)
- c = tolower (c);
- r = r * 67 + c - 113;
- }
- return r;
- }
- static int
- find_slot_in_mapped_hash (struct mapped_index *index, const char *name,
- offset_type **vec_out)
- {
- struct cleanup *back_to = make_cleanup (null_cleanup, 0);
- offset_type hash;
- offset_type slot, step;
- int (*cmp) (const char *, const char *);
- if (current_language->la_language == language_cplus
- || current_language->la_language == language_java
- || current_language->la_language == language_fortran)
- {
-
- if (strchr (name, '(') != NULL)
- {
- char *without_params = cp_remove_params (name);
- if (without_params != NULL)
- {
- make_cleanup (xfree, without_params);
- name = without_params;
- }
- }
- }
-
- hash = mapped_index_string_hash ((index->version == 4
- && case_sensitivity == case_sensitive_off
- ? 5 : index->version),
- name);
- slot = hash & (index->symbol_table_slots - 1);
- step = ((hash * 17) & (index->symbol_table_slots - 1)) | 1;
- cmp = (case_sensitivity == case_sensitive_on ? strcmp : strcasecmp);
- for (;;)
- {
-
- offset_type i = 2 * slot;
- const char *str;
- if (index->symbol_table[i] == 0 && index->symbol_table[i + 1] == 0)
- {
- do_cleanups (back_to);
- return 0;
- }
- str = index->constant_pool + MAYBE_SWAP (index->symbol_table[i]);
- if (!cmp (name, str))
- {
- *vec_out = (offset_type *) (index->constant_pool
- + MAYBE_SWAP (index->symbol_table[i + 1]));
- do_cleanups (back_to);
- return 1;
- }
- slot = (slot + step) & (index->symbol_table_slots - 1);
- }
- }
- static int
- read_index_from_section (struct objfile *objfile,
- const char *filename,
- int deprecated_ok,
- struct dwarf2_section_info *section,
- struct mapped_index *map,
- const gdb_byte **cu_list,
- offset_type *cu_list_elements,
- const gdb_byte **types_list,
- offset_type *types_list_elements)
- {
- const gdb_byte *addr;
- offset_type version;
- offset_type *metadata;
- int i;
- if (dwarf2_section_empty_p (section))
- return 0;
-
- if ((get_section_flags (section) & SEC_HAS_CONTENTS) == 0)
- return 0;
- dwarf2_read_section (objfile, section);
- addr = section->buffer;
-
- version = MAYBE_SWAP (*(offset_type *) addr);
-
- if (version < 4)
- {
- static int warning_printed = 0;
- if (!warning_printed)
- {
- warning (_("Skipping obsolete .gdb_index section in %s."),
- filename);
- warning_printed = 1;
- }
- return 0;
- }
-
- if (version < 6 && !deprecated_ok)
- {
- static int warning_printed = 0;
- if (!warning_printed)
- {
- warning (_("\
- Skipping deprecated .gdb_index section in %s.\n\
- Do \"set use-deprecated-index-sections on\" before the file is read\n\
- to use the section anyway."),
- filename);
- warning_printed = 1;
- }
- return 0;
- }
-
-
- if (version > 8)
- return 0;
- map->version = version;
- map->total_size = section->size;
- metadata = (offset_type *) (addr + sizeof (offset_type));
- i = 0;
- *cu_list = addr + MAYBE_SWAP (metadata[i]);
- *cu_list_elements = ((MAYBE_SWAP (metadata[i + 1]) - MAYBE_SWAP (metadata[i]))
- / 8);
- ++i;
- *types_list = addr + MAYBE_SWAP (metadata[i]);
- *types_list_elements = ((MAYBE_SWAP (metadata[i + 1])
- - MAYBE_SWAP (metadata[i]))
- / 8);
- ++i;
- map->address_table = addr + MAYBE_SWAP (metadata[i]);
- map->address_table_size = (MAYBE_SWAP (metadata[i + 1])
- - MAYBE_SWAP (metadata[i]));
- ++i;
- map->symbol_table = (offset_type *) (addr + MAYBE_SWAP (metadata[i]));
- map->symbol_table_slots = ((MAYBE_SWAP (metadata[i + 1])
- - MAYBE_SWAP (metadata[i]))
- / (2 * sizeof (offset_type)));
- ++i;
- map->constant_pool = (char *) (addr + MAYBE_SWAP (metadata[i]));
- return 1;
- }
- static int
- dwarf2_read_index (struct objfile *objfile)
- {
- struct mapped_index local_map, *map;
- const gdb_byte *cu_list, *types_list, *dwz_list = NULL;
- offset_type cu_list_elements, types_list_elements, dwz_list_elements = 0;
- struct dwz_file *dwz;
- if (!read_index_from_section (objfile, objfile_name (objfile),
- use_deprecated_index_sections,
- &dwarf2_per_objfile->gdb_index, &local_map,
- &cu_list, &cu_list_elements,
- &types_list, &types_list_elements))
- return 0;
-
- if (local_map.symbol_table_slots == 0)
- return 0;
-
- dwz = dwarf2_get_dwz_file ();
- if (dwz != NULL)
- {
- struct mapped_index dwz_map;
- const gdb_byte *dwz_types_ignore;
- offset_type dwz_types_elements_ignore;
- if (!read_index_from_section (objfile, bfd_get_filename (dwz->dwz_bfd),
- 1,
- &dwz->gdb_index, &dwz_map,
- &dwz_list, &dwz_list_elements,
- &dwz_types_ignore,
- &dwz_types_elements_ignore))
- {
- warning (_("could not read '.gdb_index' section from %s; skipping"),
- bfd_get_filename (dwz->dwz_bfd));
- return 0;
- }
- }
- create_cus_from_index (objfile, cu_list, cu_list_elements, dwz_list,
- dwz_list_elements);
- if (types_list_elements)
- {
- struct dwarf2_section_info *section;
-
- if (VEC_length (dwarf2_section_info_def, dwarf2_per_objfile->types) != 1)
- return 0;
- section = VEC_index (dwarf2_section_info_def,
- dwarf2_per_objfile->types, 0);
- create_signatured_type_table_from_index (objfile, section, types_list,
- types_list_elements);
- }
- create_addrmap_from_index (objfile, &local_map);
- map = obstack_alloc (&objfile->objfile_obstack, sizeof (struct mapped_index));
- *map = local_map;
- dwarf2_per_objfile->index_table = map;
- dwarf2_per_objfile->using_index = 1;
- dwarf2_per_objfile->quick_file_names_table =
- create_quick_file_names_table (dwarf2_per_objfile->n_comp_units);
- return 1;
- }
- static void
- dw2_setup (struct objfile *objfile)
- {
- dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key);
- gdb_assert (dwarf2_per_objfile);
- }
- static void
- dw2_get_file_names_reader (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr,
- struct die_info *comp_unit_die,
- int has_children,
- void *data)
- {
- struct dwarf2_cu *cu = reader->cu;
- struct dwarf2_per_cu_data *this_cu = cu->per_cu;
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwarf2_per_cu_data *lh_cu;
- struct line_header *lh;
- struct attribute *attr;
- int i;
- const char *name, *comp_dir;
- void **slot;
- struct quick_file_names *qfn;
- unsigned int line_offset;
- gdb_assert (! this_cu->is_debug_types);
-
- if (comp_unit_die->tag == DW_TAG_partial_unit)
- {
- this_cu->v.quick->no_file_data = 1;
- return;
- }
- lh_cu = this_cu;
- lh = NULL;
- slot = NULL;
- line_offset = 0;
- attr = dwarf2_attr (comp_unit_die, DW_AT_stmt_list, cu);
- if (attr)
- {
- struct quick_file_names find_entry;
- line_offset = DW_UNSND (attr);
-
- find_entry.hash.dwo_unit = cu->dwo_unit;
- find_entry.hash.line_offset.sect_off = line_offset;
- slot = htab_find_slot (dwarf2_per_objfile->quick_file_names_table,
- &find_entry, INSERT);
- if (*slot != NULL)
- {
- lh_cu->v.quick->file_names = *slot;
- return;
- }
- lh = dwarf_decode_line_header (line_offset, cu);
- }
- if (lh == NULL)
- {
- lh_cu->v.quick->no_file_data = 1;
- return;
- }
- qfn = obstack_alloc (&objfile->objfile_obstack, sizeof (*qfn));
- qfn->hash.dwo_unit = cu->dwo_unit;
- qfn->hash.line_offset.sect_off = line_offset;
- gdb_assert (slot != NULL);
- *slot = qfn;
- find_file_and_directory (comp_unit_die, cu, &name, &comp_dir);
- qfn->num_file_names = lh->num_file_names;
- qfn->file_names = obstack_alloc (&objfile->objfile_obstack,
- lh->num_file_names * sizeof (char *));
- for (i = 0; i < lh->num_file_names; ++i)
- qfn->file_names[i] = file_full_name (i + 1, lh, comp_dir);
- qfn->real_names = NULL;
- free_line_header (lh);
- lh_cu->v.quick->file_names = qfn;
- }
- static struct quick_file_names *
- dw2_get_file_names (struct dwarf2_per_cu_data *this_cu)
- {
-
- gdb_assert (! this_cu->is_debug_types);
-
- gdb_assert (! IS_TYPE_UNIT_GROUP (this_cu));
- if (this_cu->v.quick->file_names != NULL)
- return this_cu->v.quick->file_names;
-
- if (this_cu->v.quick->no_file_data)
- return NULL;
- init_cutu_and_read_dies_simple (this_cu, dw2_get_file_names_reader, NULL);
- if (this_cu->v.quick->no_file_data)
- return NULL;
- return this_cu->v.quick->file_names;
- }
- static const char *
- dw2_get_real_path (struct objfile *objfile,
- struct quick_file_names *qfn, int index)
- {
- if (qfn->real_names == NULL)
- qfn->real_names = OBSTACK_CALLOC (&objfile->objfile_obstack,
- qfn->num_file_names, const char *);
- if (qfn->real_names[index] == NULL)
- qfn->real_names[index] = gdb_realpath (qfn->file_names[index]);
- return qfn->real_names[index];
- }
- static struct symtab *
- dw2_find_last_source_symtab (struct objfile *objfile)
- {
- struct compunit_symtab *cust;
- int index;
- dw2_setup (objfile);
- index = dwarf2_per_objfile->n_comp_units - 1;
- cust = dw2_instantiate_symtab (dw2_get_cutu (index));
- if (cust == NULL)
- return NULL;
- return compunit_primary_filetab (cust);
- }
- static int
- dw2_free_cached_file_names (void **slot, void *info)
- {
- struct quick_file_names *file_data = (struct quick_file_names *) *slot;
- if (file_data->real_names)
- {
- int i;
- for (i = 0; i < file_data->num_file_names; ++i)
- {
- xfree ((void*) file_data->real_names[i]);
- file_data->real_names[i] = NULL;
- }
- }
- return 1;
- }
- static void
- dw2_forget_cached_source_info (struct objfile *objfile)
- {
- dw2_setup (objfile);
- htab_traverse_noresize (dwarf2_per_objfile->quick_file_names_table,
- dw2_free_cached_file_names, NULL);
- }
- static int
- dw2_map_expand_apply (struct objfile *objfile,
- struct dwarf2_per_cu_data *per_cu,
- const char *name, const char *real_path,
- int (*callback) (struct symtab *, void *),
- void *data)
- {
- struct compunit_symtab *last_made = objfile->compunit_symtabs;
-
- if (per_cu->v.quick->compunit_symtab)
- return 0;
-
- dw2_instantiate_symtab (per_cu);
- return iterate_over_some_symtabs (name, real_path, callback, data,
- objfile->compunit_symtabs, last_made);
- }
- static int
- dw2_map_symtabs_matching_filename (struct objfile *objfile, const char *name,
- const char *real_path,
- int (*callback) (struct symtab *, void *),
- void *data)
- {
- int i;
- const char *name_basename = lbasename (name);
- dw2_setup (objfile);
-
- for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
- {
- int j;
- struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);
- struct quick_file_names *file_data;
-
- if (per_cu->v.quick->compunit_symtab)
- continue;
- file_data = dw2_get_file_names (per_cu);
- if (file_data == NULL)
- continue;
- for (j = 0; j < file_data->num_file_names; ++j)
- {
- const char *this_name = file_data->file_names[j];
- const char *this_real_name;
- if (compare_filenames_for_search (this_name, name))
- {
- if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
- callback, data))
- return 1;
- continue;
- }
-
- if (! basenames_may_differ
- && FILENAME_CMP (lbasename (this_name), name_basename) != 0)
- continue;
- this_real_name = dw2_get_real_path (objfile, file_data, j);
- if (compare_filenames_for_search (this_real_name, name))
- {
- if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
- callback, data))
- return 1;
- continue;
- }
- if (real_path != NULL)
- {
- gdb_assert (IS_ABSOLUTE_PATH (real_path));
- gdb_assert (IS_ABSOLUTE_PATH (name));
- if (this_real_name != NULL
- && FILENAME_CMP (real_path, this_real_name) == 0)
- {
- if (dw2_map_expand_apply (objfile, per_cu, name, real_path,
- callback, data))
- return 1;
- continue;
- }
- }
- }
- }
- return 0;
- }
- struct dw2_symtab_iterator
- {
-
- struct mapped_index *index;
-
- int want_specific_block;
-
- int block_index;
-
- domain_enum domain;
-
- offset_type *vec;
-
- int next;
-
- int length;
-
- int global_seen;
- };
- static void
- dw2_symtab_iter_init (struct dw2_symtab_iterator *iter,
- struct mapped_index *index,
- int want_specific_block,
- int block_index,
- domain_enum domain,
- const char *name)
- {
- iter->index = index;
- iter->want_specific_block = want_specific_block;
- iter->block_index = block_index;
- iter->domain = domain;
- iter->next = 0;
- iter->global_seen = 0;
- if (find_slot_in_mapped_hash (index, name, &iter->vec))
- iter->length = MAYBE_SWAP (*iter->vec);
- else
- {
- iter->vec = NULL;
- iter->length = 0;
- }
- }
- static struct dwarf2_per_cu_data *
- dw2_symtab_iter_next (struct dw2_symtab_iterator *iter)
- {
- for ( ; iter->next < iter->length; ++iter->next)
- {
- offset_type cu_index_and_attrs =
- MAYBE_SWAP (iter->vec[iter->next + 1]);
- offset_type cu_index = GDB_INDEX_CU_VALUE (cu_index_and_attrs);
- struct dwarf2_per_cu_data *per_cu;
- int want_static = iter->block_index != GLOBAL_BLOCK;
-
- int is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu_index_and_attrs);
- gdb_index_symbol_kind symbol_kind =
- GDB_INDEX_SYMBOL_KIND_VALUE (cu_index_and_attrs);
-
- int attrs_valid =
- (iter->index->version >= 7
- && symbol_kind != GDB_INDEX_SYMBOL_KIND_NONE);
-
- if (cu_index >= (dwarf2_per_objfile->n_comp_units
- + dwarf2_per_objfile->n_type_units))
- {
- complaint (&symfile_complaints,
- _(".gdb_index entry has bad CU index"
- " [in module %s]"),
- objfile_name (dwarf2_per_objfile->objfile));
- continue;
- }
- per_cu = dw2_get_cutu (cu_index);
-
- if (per_cu->v.quick->compunit_symtab)
- continue;
-
- if (attrs_valid)
- {
- if (iter->want_specific_block
- && want_static != is_static)
- continue;
-
- if (!is_static && iter->global_seen)
- continue;
- if (!is_static)
- iter->global_seen = 1;
- }
-
- if (attrs_valid)
- {
- switch (iter->domain)
- {
- case VAR_DOMAIN:
- if (symbol_kind != GDB_INDEX_SYMBOL_KIND_VARIABLE
- && symbol_kind != GDB_INDEX_SYMBOL_KIND_FUNCTION
-
- && symbol_kind != GDB_INDEX_SYMBOL_KIND_TYPE)
- continue;
- break;
- case STRUCT_DOMAIN:
- if (symbol_kind != GDB_INDEX_SYMBOL_KIND_TYPE)
- continue;
- break;
- case LABEL_DOMAIN:
- if (symbol_kind != GDB_INDEX_SYMBOL_KIND_OTHER)
- continue;
- break;
- default:
- break;
- }
- }
- ++iter->next;
- return per_cu;
- }
- return NULL;
- }
- static struct compunit_symtab *
- dw2_lookup_symbol (struct objfile *objfile, int block_index,
- const char *name, domain_enum domain)
- {
- struct compunit_symtab *stab_best = NULL;
- struct mapped_index *index;
- dw2_setup (objfile);
- index = dwarf2_per_objfile->index_table;
-
- if (index)
- {
- struct dw2_symtab_iterator iter;
- struct dwarf2_per_cu_data *per_cu;
- dw2_symtab_iter_init (&iter, index, 1, block_index, domain, name);
- while ((per_cu = dw2_symtab_iter_next (&iter)) != NULL)
- {
- struct symbol *sym = NULL;
- struct compunit_symtab *stab = dw2_instantiate_symtab (per_cu);
- const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (stab);
- struct block *block = BLOCKVECTOR_BLOCK (bv, block_index);
-
- sym = block_lookup_symbol (block, name, domain);
- if (sym && strcmp_iw (SYMBOL_SEARCH_NAME (sym), name) == 0)
- {
- if (!TYPE_IS_OPAQUE (SYMBOL_TYPE (sym)))
- return stab;
- stab_best = stab;
- }
-
- }
- }
- return stab_best;
- }
- static void
- dw2_print_stats (struct objfile *objfile)
- {
- int i, total, count;
- dw2_setup (objfile);
- total = dwarf2_per_objfile->n_comp_units + dwarf2_per_objfile->n_type_units;
- count = 0;
- for (i = 0; i < total; ++i)
- {
- struct dwarf2_per_cu_data *per_cu = dw2_get_cutu (i);
- if (!per_cu->v.quick->compunit_symtab)
- ++count;
- }
- printf_filtered (_(" Number of read CUs: %d\n"), total - count);
- printf_filtered (_(" Number of unread CUs: %d\n"), count);
- }
- static void
- dw2_dump (struct objfile *objfile)
- {
- dw2_setup (objfile);
- gdb_assert (dwarf2_per_objfile->using_index);
- printf_filtered (".gdb_index:");
- if (dwarf2_per_objfile->index_table != NULL)
- {
- printf_filtered (" version %d\n",
- dwarf2_per_objfile->index_table->version);
- }
- else
- printf_filtered (" faked for \"readnow\"\n");
- printf_filtered ("\n");
- }
- static void
- dw2_relocate (struct objfile *objfile,
- const struct section_offsets *new_offsets,
- const struct section_offsets *delta)
- {
-
- }
- static void
- dw2_expand_symtabs_for_function (struct objfile *objfile,
- const char *func_name)
- {
- struct mapped_index *index;
- dw2_setup (objfile);
- index = dwarf2_per_objfile->index_table;
-
- if (index)
- {
- struct dw2_symtab_iterator iter;
- struct dwarf2_per_cu_data *per_cu;
-
- dw2_symtab_iter_init (&iter, index, 0, GLOBAL_BLOCK, VAR_DOMAIN,
- func_name);
- while ((per_cu = dw2_symtab_iter_next (&iter)) != NULL)
- dw2_instantiate_symtab (per_cu);
- }
- }
- static void
- dw2_expand_all_symtabs (struct objfile *objfile)
- {
- int i;
- dw2_setup (objfile);
- for (i = 0; i < (dwarf2_per_objfile->n_comp_units
- + dwarf2_per_objfile->n_type_units); ++i)
- {
- struct dwarf2_per_cu_data *per_cu = dw2_get_cutu (i);
- dw2_instantiate_symtab (per_cu);
- }
- }
- static void
- dw2_expand_symtabs_with_fullname (struct objfile *objfile,
- const char *fullname)
- {
- int i;
- dw2_setup (objfile);
-
- for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
- {
- int j;
- struct dwarf2_per_cu_data *per_cu = dw2_get_cutu (i);
- struct quick_file_names *file_data;
-
- if (per_cu->v.quick->compunit_symtab)
- continue;
- file_data = dw2_get_file_names (per_cu);
- if (file_data == NULL)
- continue;
- for (j = 0; j < file_data->num_file_names; ++j)
- {
- const char *this_fullname = file_data->file_names[j];
- if (filename_cmp (this_fullname, fullname) == 0)
- {
- dw2_instantiate_symtab (per_cu);
- break;
- }
- }
- }
- }
- static void
- dw2_map_matching_symbols (struct objfile *objfile,
- const char * name, domain_enum namespace,
- int global,
- int (*callback) (struct block *,
- struct symbol *, void *),
- void *data, symbol_compare_ftype *match,
- symbol_compare_ftype *ordered_compare)
- {
-
- }
- static void
- dw2_expand_symtabs_matching
- (struct objfile *objfile,
- expand_symtabs_file_matcher_ftype *file_matcher,
- expand_symtabs_symbol_matcher_ftype *symbol_matcher,
- enum search_domain kind,
- void *data)
- {
- int i;
- offset_type iter;
- struct mapped_index *index;
- dw2_setup (objfile);
-
- if (!dwarf2_per_objfile->index_table)
- return;
- index = dwarf2_per_objfile->index_table;
- if (file_matcher != NULL)
- {
- struct cleanup *cleanup;
- htab_t visited_found, visited_not_found;
- visited_found = htab_create_alloc (10,
- htab_hash_pointer, htab_eq_pointer,
- NULL, xcalloc, xfree);
- cleanup = make_cleanup_htab_delete (visited_found);
- visited_not_found = htab_create_alloc (10,
- htab_hash_pointer, htab_eq_pointer,
- NULL, xcalloc, xfree);
- make_cleanup_htab_delete (visited_not_found);
-
- for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
- {
- int j;
- struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);
- struct quick_file_names *file_data;
- void **slot;
- per_cu->v.quick->mark = 0;
-
- if (per_cu->v.quick->compunit_symtab)
- continue;
- file_data = dw2_get_file_names (per_cu);
- if (file_data == NULL)
- continue;
- if (htab_find (visited_not_found, file_data) != NULL)
- continue;
- else if (htab_find (visited_found, file_data) != NULL)
- {
- per_cu->v.quick->mark = 1;
- continue;
- }
- for (j = 0; j < file_data->num_file_names; ++j)
- {
- const char *this_real_name;
- if (file_matcher (file_data->file_names[j], data, 0))
- {
- per_cu->v.quick->mark = 1;
- break;
- }
-
- if (!basenames_may_differ
- && !file_matcher (lbasename (file_data->file_names[j]),
- data, 1))
- continue;
- this_real_name = dw2_get_real_path (objfile, file_data, j);
- if (file_matcher (this_real_name, data, 0))
- {
- per_cu->v.quick->mark = 1;
- break;
- }
- }
- slot = htab_find_slot (per_cu->v.quick->mark
- ? visited_found
- : visited_not_found,
- file_data, INSERT);
- *slot = file_data;
- }
- do_cleanups (cleanup);
- }
- for (iter = 0; iter < index->symbol_table_slots; ++iter)
- {
- offset_type idx = 2 * iter;
- const char *name;
- offset_type *vec, vec_len, vec_idx;
- int global_seen = 0;
- if (index->symbol_table[idx] == 0 && index->symbol_table[idx + 1] == 0)
- continue;
- name = index->constant_pool + MAYBE_SWAP (index->symbol_table[idx]);
- if (! (*symbol_matcher) (name, data))
- continue;
-
- vec = (offset_type *) (index->constant_pool
- + MAYBE_SWAP (index->symbol_table[idx + 1]));
- vec_len = MAYBE_SWAP (vec[0]);
- for (vec_idx = 0; vec_idx < vec_len; ++vec_idx)
- {
- struct dwarf2_per_cu_data *per_cu;
- offset_type cu_index_and_attrs = MAYBE_SWAP (vec[vec_idx + 1]);
-
- int is_static = GDB_INDEX_SYMBOL_STATIC_VALUE (cu_index_and_attrs);
- gdb_index_symbol_kind symbol_kind =
- GDB_INDEX_SYMBOL_KIND_VALUE (cu_index_and_attrs);
- int cu_index = GDB_INDEX_CU_VALUE (cu_index_and_attrs);
-
- int attrs_valid =
- (index->version >= 7
- && symbol_kind != GDB_INDEX_SYMBOL_KIND_NONE);
-
- if (attrs_valid)
- {
- if (!is_static && global_seen)
- continue;
- if (!is_static)
- global_seen = 1;
- }
-
- if (attrs_valid)
- {
- switch (kind)
- {
- case VARIABLES_DOMAIN:
- if (symbol_kind != GDB_INDEX_SYMBOL_KIND_VARIABLE)
- continue;
- break;
- case FUNCTIONS_DOMAIN:
- if (symbol_kind != GDB_INDEX_SYMBOL_KIND_FUNCTION)
- continue;
- break;
- case TYPES_DOMAIN:
- if (symbol_kind != GDB_INDEX_SYMBOL_KIND_TYPE)
- continue;
- break;
- default:
- break;
- }
- }
-
- if (cu_index >= (dwarf2_per_objfile->n_comp_units
- + dwarf2_per_objfile->n_type_units))
- {
- complaint (&symfile_complaints,
- _(".gdb_index entry has bad CU index"
- " [in module %s]"), objfile_name (objfile));
- continue;
- }
- per_cu = dw2_get_cutu (cu_index);
- if (file_matcher == NULL || per_cu->v.quick->mark)
- dw2_instantiate_symtab (per_cu);
- }
- }
- }
- static struct compunit_symtab *
- recursively_find_pc_sect_compunit_symtab (struct compunit_symtab *cust,
- CORE_ADDR pc)
- {
- int i;
- if (COMPUNIT_BLOCKVECTOR (cust) != NULL
- && blockvector_contains_pc (COMPUNIT_BLOCKVECTOR (cust), pc))
- return cust;
- if (cust->includes == NULL)
- return NULL;
- for (i = 0; cust->includes[i]; ++i)
- {
- struct compunit_symtab *s = cust->includes[i];
- s = recursively_find_pc_sect_compunit_symtab (s, pc);
- if (s != NULL)
- return s;
- }
- return NULL;
- }
- static struct compunit_symtab *
- dw2_find_pc_sect_compunit_symtab (struct objfile *objfile,
- struct bound_minimal_symbol msymbol,
- CORE_ADDR pc,
- struct obj_section *section,
- int warn_if_readin)
- {
- struct dwarf2_per_cu_data *data;
- struct compunit_symtab *result;
- dw2_setup (objfile);
- if (!objfile->psymtabs_addrmap)
- return NULL;
- data = addrmap_find (objfile->psymtabs_addrmap, pc);
- if (!data)
- return NULL;
- if (warn_if_readin && data->v.quick->compunit_symtab)
- warning (_("(Internal error: pc %s in read in CU, but not in symtab.)"),
- paddress (get_objfile_arch (objfile), pc));
- result
- = recursively_find_pc_sect_compunit_symtab (dw2_instantiate_symtab (data),
- pc);
- gdb_assert (result != NULL);
- return result;
- }
- static void
- dw2_map_symbol_filenames (struct objfile *objfile, symbol_filename_ftype *fun,
- void *data, int need_fullname)
- {
- int i;
- struct cleanup *cleanup;
- htab_t visited = htab_create_alloc (10, htab_hash_pointer, htab_eq_pointer,
- NULL, xcalloc, xfree);
- cleanup = make_cleanup_htab_delete (visited);
- dw2_setup (objfile);
-
- for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
- {
- struct dwarf2_per_cu_data *per_cu = dw2_get_cutu (i);
- if (per_cu->v.quick->compunit_symtab)
- {
- void **slot = htab_find_slot (visited, per_cu->v.quick->file_names,
- INSERT);
- *slot = per_cu->v.quick->file_names;
- }
- }
- for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
- {
- int j;
- struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i);
- struct quick_file_names *file_data;
- void **slot;
-
- if (per_cu->v.quick->compunit_symtab)
- continue;
- file_data = dw2_get_file_names (per_cu);
- if (file_data == NULL)
- continue;
- slot = htab_find_slot (visited, file_data, INSERT);
- if (*slot)
- {
-
- continue;
- }
- *slot = file_data;
- for (j = 0; j < file_data->num_file_names; ++j)
- {
- const char *this_real_name;
- if (need_fullname)
- this_real_name = dw2_get_real_path (objfile, file_data, j);
- else
- this_real_name = NULL;
- (*fun) (file_data->file_names[j], this_real_name, data);
- }
- }
- do_cleanups (cleanup);
- }
- static int
- dw2_has_symbols (struct objfile *objfile)
- {
- return 1;
- }
- const struct quick_symbol_functions dwarf2_gdb_index_functions =
- {
- dw2_has_symbols,
- dw2_find_last_source_symtab,
- dw2_forget_cached_source_info,
- dw2_map_symtabs_matching_filename,
- dw2_lookup_symbol,
- dw2_print_stats,
- dw2_dump,
- dw2_relocate,
- dw2_expand_symtabs_for_function,
- dw2_expand_all_symtabs,
- dw2_expand_symtabs_with_fullname,
- dw2_map_matching_symbols,
- dw2_expand_symtabs_matching,
- dw2_find_pc_sect_compunit_symtab,
- dw2_map_symbol_filenames
- };
- int
- dwarf2_initialize_objfile (struct objfile *objfile)
- {
-
- if ((objfile->flags & OBJF_READNOW))
- {
- int i;
- dwarf2_per_objfile->using_index = 1;
- create_all_comp_units (objfile);
- create_all_type_units (objfile);
- dwarf2_per_objfile->quick_file_names_table =
- create_quick_file_names_table (dwarf2_per_objfile->n_comp_units);
- for (i = 0; i < (dwarf2_per_objfile->n_comp_units
- + dwarf2_per_objfile->n_type_units); ++i)
- {
- struct dwarf2_per_cu_data *per_cu = dw2_get_cutu (i);
- per_cu->v.quick = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct dwarf2_per_cu_quick_data);
- }
-
- return 1;
- }
- if (dwarf2_read_index (objfile))
- return 1;
- return 0;
- }
- void
- dwarf2_build_psymtabs (struct objfile *objfile)
- {
- volatile struct gdb_exception except;
- if (objfile->global_psymbols.size == 0 && objfile->static_psymbols.size == 0)
- {
- init_psymbol_list (objfile, 1024);
- }
- TRY_CATCH (except, RETURN_MASK_ERROR)
- {
-
- struct cleanup *cleanups = make_cleanup_discard_psymtabs (objfile);
- dwarf2_build_psymtabs_hard (objfile);
- discard_cleanups (cleanups);
- }
- if (except.reason < 0)
- exception_print (gdb_stderr, except);
- }
- static unsigned int
- get_cu_length (const struct comp_unit_head *header)
- {
- return header->initial_length_size + header->length;
- }
- static inline int
- offset_in_cu_p (const struct comp_unit_head *cu_header, sect_offset offset)
- {
- sect_offset bottom = { cu_header->offset.sect_off };
- sect_offset top = { cu_header->offset.sect_off + get_cu_length (cu_header) };
- return (offset.sect_off >= bottom.sect_off && offset.sect_off < top.sect_off);
- }
- static void
- dwarf2_find_base_address (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct attribute *attr;
- cu->base_known = 0;
- cu->base_address = 0;
- attr = dwarf2_attr (die, DW_AT_entry_pc, cu);
- if (attr)
- {
- cu->base_address = attr_value_as_address (attr);
- cu->base_known = 1;
- }
- else
- {
- attr = dwarf2_attr (die, DW_AT_low_pc, cu);
- if (attr)
- {
- cu->base_address = attr_value_as_address (attr);
- cu->base_known = 1;
- }
- }
- }
- static const gdb_byte *
- read_comp_unit_head (struct comp_unit_head *cu_header,
- const gdb_byte *info_ptr, bfd *abfd)
- {
- int signed_addr;
- unsigned int bytes_read;
- cu_header->length = read_initial_length (abfd, info_ptr, &bytes_read);
- cu_header->initial_length_size = bytes_read;
- cu_header->offset_size = (bytes_read == 4) ? 4 : 8;
- info_ptr += bytes_read;
- cu_header->version = read_2_bytes (abfd, info_ptr);
- info_ptr += 2;
- cu_header->abbrev_offset.sect_off = read_offset (abfd, info_ptr, cu_header,
- &bytes_read);
- info_ptr += bytes_read;
- cu_header->addr_size = read_1_byte (abfd, info_ptr);
- info_ptr += 1;
- signed_addr = bfd_get_sign_extend_vma (abfd);
- if (signed_addr < 0)
- internal_error (__FILE__, __LINE__,
- _("read_comp_unit_head: dwarf from non elf file"));
- cu_header->signed_addr_p = signed_addr;
- return info_ptr;
- }
- static struct dwarf2_section_info *
- get_abbrev_section_for_cu (struct dwarf2_per_cu_data *this_cu)
- {
- struct dwarf2_section_info *abbrev;
- if (this_cu->is_dwz)
- abbrev = &dwarf2_get_dwz_file ()->abbrev;
- else
- abbrev = &dwarf2_per_objfile->abbrev;
- return abbrev;
- }
- static void
- error_check_comp_unit_head (struct comp_unit_head *header,
- struct dwarf2_section_info *section,
- struct dwarf2_section_info *abbrev_section)
- {
- bfd *abfd = get_section_bfd_owner (section);
- const char *filename = get_section_file_name (section);
- if (header->version != 2 && header->version != 3 && header->version != 4)
- error (_("Dwarf Error: wrong version in compilation unit header "
- "(is %d, should be 2, 3, or 4) [in module %s]"), header->version,
- filename);
- if (header->abbrev_offset.sect_off
- >= dwarf2_section_size (dwarf2_per_objfile->objfile, abbrev_section))
- error (_("Dwarf Error: bad offset (0x%lx) in compilation unit header "
- "(offset 0x%lx + 6) [in module %s]"),
- (long) header->abbrev_offset.sect_off, (long) header->offset.sect_off,
- filename);
-
- if (((unsigned long) header->offset.sect_off + get_cu_length (header))
- > section->size)
- error (_("Dwarf Error: bad length (0x%lx) in compilation unit header "
- "(offset 0x%lx + 0) [in module %s]"),
- (long) header->length, (long) header->offset.sect_off,
- filename);
- }
- static const gdb_byte *
- read_and_check_comp_unit_head (struct comp_unit_head *header,
- struct dwarf2_section_info *section,
- struct dwarf2_section_info *abbrev_section,
- const gdb_byte *info_ptr,
- int is_debug_types_section)
- {
- const gdb_byte *beg_of_comp_unit = info_ptr;
- bfd *abfd = get_section_bfd_owner (section);
- header->offset.sect_off = beg_of_comp_unit - section->buffer;
- info_ptr = read_comp_unit_head (header, info_ptr, abfd);
-
- if (is_debug_types_section)
- info_ptr += 8 + header->offset_size;
- header->first_die_offset.cu_off = info_ptr - beg_of_comp_unit;
- error_check_comp_unit_head (header, section, abbrev_section);
- return info_ptr;
- }
- static const gdb_byte *
- read_and_check_type_unit_head (struct comp_unit_head *header,
- struct dwarf2_section_info *section,
- struct dwarf2_section_info *abbrev_section,
- const gdb_byte *info_ptr,
- ULONGEST *signature,
- cu_offset *type_offset_in_tu)
- {
- const gdb_byte *beg_of_comp_unit = info_ptr;
- bfd *abfd = get_section_bfd_owner (section);
- header->offset.sect_off = beg_of_comp_unit - section->buffer;
- info_ptr = read_comp_unit_head (header, info_ptr, abfd);
-
- if (signature != NULL)
- *signature = read_8_bytes (abfd, info_ptr);
- info_ptr += 8;
- if (type_offset_in_tu != NULL)
- type_offset_in_tu->cu_off = read_offset_1 (abfd, info_ptr,
- header->offset_size);
- info_ptr += header->offset_size;
- header->first_die_offset.cu_off = info_ptr - beg_of_comp_unit;
- error_check_comp_unit_head (header, section, abbrev_section);
- return info_ptr;
- }
- static sect_offset
- read_abbrev_offset (struct dwarf2_section_info *section,
- sect_offset offset)
- {
- bfd *abfd = get_section_bfd_owner (section);
- const gdb_byte *info_ptr;
- unsigned int length, initial_length_size, offset_size;
- sect_offset abbrev_offset;
- dwarf2_read_section (dwarf2_per_objfile->objfile, section);
- info_ptr = section->buffer + offset.sect_off;
- length = read_initial_length (abfd, info_ptr, &initial_length_size);
- offset_size = initial_length_size == 4 ? 4 : 8;
- info_ptr += initial_length_size + 2 ;
- abbrev_offset.sect_off = read_offset_1 (abfd, info_ptr, offset_size);
- return abbrev_offset;
- }
- static void
- dwarf2_create_include_psymtab (const char *name, struct partial_symtab *pst,
- struct objfile *objfile)
- {
- struct partial_symtab *subpst = allocate_psymtab (name, objfile);
- if (!IS_ABSOLUTE_PATH (subpst->filename))
- {
-
- subpst->dirname = pst->dirname;
- }
- subpst->section_offsets = pst->section_offsets;
- subpst->textlow = 0;
- subpst->texthigh = 0;
- subpst->dependencies = (struct partial_symtab **)
- obstack_alloc (&objfile->objfile_obstack,
- sizeof (struct partial_symtab *));
- subpst->dependencies[0] = pst;
- subpst->number_of_dependencies = 1;
- subpst->globals_offset = 0;
- subpst->n_global_syms = 0;
- subpst->statics_offset = 0;
- subpst->n_static_syms = 0;
- subpst->compunit_symtab = NULL;
- subpst->read_symtab = pst->read_symtab;
- subpst->readin = 0;
-
- subpst->read_symtab_private = NULL;
- }
- static void
- dwarf2_build_include_psymtabs (struct dwarf2_cu *cu,
- struct die_info *die,
- struct partial_symtab *pst)
- {
- struct line_header *lh = NULL;
- struct attribute *attr;
- attr = dwarf2_attr (die, DW_AT_stmt_list, cu);
- if (attr)
- lh = dwarf_decode_line_header (DW_UNSND (attr), cu);
- if (lh == NULL)
- return;
-
- dwarf_decode_lines (lh, pst->dirname, cu, pst, pst->textlow);
- free_line_header (lh);
- }
- static hashval_t
- hash_signatured_type (const void *item)
- {
- const struct signatured_type *sig_type = item;
-
- return sig_type->signature;
- }
- static int
- eq_signatured_type (const void *item_lhs, const void *item_rhs)
- {
- const struct signatured_type *lhs = item_lhs;
- const struct signatured_type *rhs = item_rhs;
- return lhs->signature == rhs->signature;
- }
- static htab_t
- allocate_signatured_type_table (struct objfile *objfile)
- {
- return htab_create_alloc_ex (41,
- hash_signatured_type,
- eq_signatured_type,
- NULL,
- &objfile->objfile_obstack,
- hashtab_obstack_allocate,
- dummy_obstack_deallocate);
- }
- static int
- add_signatured_type_cu_to_table (void **slot, void *datum)
- {
- struct signatured_type *sigt = *slot;
- struct signatured_type ***datap = datum;
- **datap = sigt;
- ++*datap;
- return 1;
- }
- static htab_t
- create_debug_types_hash_table (struct dwo_file *dwo_file,
- VEC (dwarf2_section_info_def) *types)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- htab_t types_htab = NULL;
- int ix;
- struct dwarf2_section_info *section;
- struct dwarf2_section_info *abbrev_section;
- if (VEC_empty (dwarf2_section_info_def, types))
- return NULL;
- abbrev_section = (dwo_file != NULL
- ? &dwo_file->sections.abbrev
- : &dwarf2_per_objfile->abbrev);
- if (dwarf2_read_debug)
- fprintf_unfiltered (gdb_stdlog, "Reading .debug_types%s for %s:\n",
- dwo_file ? ".dwo" : "",
- get_section_file_name (abbrev_section));
- for (ix = 0;
- VEC_iterate (dwarf2_section_info_def, types, ix, section);
- ++ix)
- {
- bfd *abfd;
- const gdb_byte *info_ptr, *end_ptr;
- dwarf2_read_section (objfile, section);
- info_ptr = section->buffer;
- if (info_ptr == NULL)
- continue;
-
- abfd = get_section_bfd_owner (section);
-
- end_ptr = info_ptr + section->size;
- while (info_ptr < end_ptr)
- {
- sect_offset offset;
- cu_offset type_offset_in_tu;
- ULONGEST signature;
- struct signatured_type *sig_type;
- struct dwo_unit *dwo_tu;
- void **slot;
- const gdb_byte *ptr = info_ptr;
- struct comp_unit_head header;
- unsigned int length;
- offset.sect_off = ptr - section->buffer;
-
- ptr = read_and_check_type_unit_head (&header, section,
- abbrev_section, ptr,
- &signature, &type_offset_in_tu);
- length = get_cu_length (&header);
-
- if (ptr >= info_ptr + length
- || peek_abbrev_code (abfd, ptr) == 0)
- {
- info_ptr += length;
- continue;
- }
- if (types_htab == NULL)
- {
- if (dwo_file)
- types_htab = allocate_dwo_unit_table (objfile);
- else
- types_htab = allocate_signatured_type_table (objfile);
- }
- if (dwo_file)
- {
- sig_type = NULL;
- dwo_tu = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct dwo_unit);
- dwo_tu->dwo_file = dwo_file;
- dwo_tu->signature = signature;
- dwo_tu->type_offset_in_tu = type_offset_in_tu;
- dwo_tu->section = section;
- dwo_tu->offset = offset;
- dwo_tu->length = length;
- }
- else
- {
-
- dwo_tu = NULL;
- sig_type = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct signatured_type);
- sig_type->signature = signature;
- sig_type->type_offset_in_tu = type_offset_in_tu;
- sig_type->per_cu.objfile = objfile;
- sig_type->per_cu.is_debug_types = 1;
- sig_type->per_cu.section = section;
- sig_type->per_cu.offset = offset;
- sig_type->per_cu.length = length;
- }
- slot = htab_find_slot (types_htab,
- dwo_file ? (void*) dwo_tu : (void *) sig_type,
- INSERT);
- gdb_assert (slot != NULL);
- if (*slot != NULL)
- {
- sect_offset dup_offset;
- if (dwo_file)
- {
- const struct dwo_unit *dup_tu = *slot;
- dup_offset = dup_tu->offset;
- }
- else
- {
- const struct signatured_type *dup_tu = *slot;
- dup_offset = dup_tu->per_cu.offset;
- }
- complaint (&symfile_complaints,
- _("debug type entry at offset 0x%x is duplicate to"
- " the entry at offset 0x%x, signature %s"),
- offset.sect_off, dup_offset.sect_off,
- hex_string (signature));
- }
- *slot = dwo_file ? (void *) dwo_tu : (void *) sig_type;
- if (dwarf2_read_debug > 1)
- fprintf_unfiltered (gdb_stdlog, " offset 0x%x, signature %s\n",
- offset.sect_off,
- hex_string (signature));
- info_ptr += length;
- }
- }
- return types_htab;
- }
- static int
- create_all_type_units (struct objfile *objfile)
- {
- htab_t types_htab;
- struct signatured_type **iter;
- types_htab = create_debug_types_hash_table (NULL, dwarf2_per_objfile->types);
- if (types_htab == NULL)
- {
- dwarf2_per_objfile->signatured_types = NULL;
- return 0;
- }
- dwarf2_per_objfile->signatured_types = types_htab;
- dwarf2_per_objfile->n_type_units
- = dwarf2_per_objfile->n_allocated_type_units
- = htab_elements (types_htab);
- dwarf2_per_objfile->all_type_units
- = xmalloc (dwarf2_per_objfile->n_type_units
- * sizeof (struct signatured_type *));
- iter = &dwarf2_per_objfile->all_type_units[0];
- htab_traverse_noresize (types_htab, add_signatured_type_cu_to_table, &iter);
- gdb_assert (iter - &dwarf2_per_objfile->all_type_units[0]
- == dwarf2_per_objfile->n_type_units);
- return 1;
- }
- static struct signatured_type *
- add_type_unit (ULONGEST sig, void **slot)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- int n_type_units = dwarf2_per_objfile->n_type_units;
- struct signatured_type *sig_type;
- gdb_assert (n_type_units <= dwarf2_per_objfile->n_allocated_type_units);
- ++n_type_units;
- if (n_type_units > dwarf2_per_objfile->n_allocated_type_units)
- {
- if (dwarf2_per_objfile->n_allocated_type_units == 0)
- dwarf2_per_objfile->n_allocated_type_units = 1;
- dwarf2_per_objfile->n_allocated_type_units *= 2;
- dwarf2_per_objfile->all_type_units
- = xrealloc (dwarf2_per_objfile->all_type_units,
- dwarf2_per_objfile->n_allocated_type_units
- * sizeof (struct signatured_type *));
- ++dwarf2_per_objfile->tu_stats.nr_all_type_units_reallocs;
- }
- dwarf2_per_objfile->n_type_units = n_type_units;
- sig_type = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct signatured_type);
- dwarf2_per_objfile->all_type_units[n_type_units - 1] = sig_type;
- sig_type->signature = sig;
- sig_type->per_cu.is_debug_types = 1;
- if (dwarf2_per_objfile->using_index)
- {
- sig_type->per_cu.v.quick =
- OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct dwarf2_per_cu_quick_data);
- }
- if (slot == NULL)
- {
- slot = htab_find_slot (dwarf2_per_objfile->signatured_types,
- sig_type, INSERT);
- }
- gdb_assert (*slot == NULL);
- *slot = sig_type;
-
- return sig_type;
- }
- static void
- fill_in_sig_entry_from_dwo_entry (struct objfile *objfile,
- struct signatured_type *sig_entry,
- struct dwo_unit *dwo_entry)
- {
-
- gdb_assert (! sig_entry->per_cu.queued);
- gdb_assert (sig_entry->per_cu.cu == NULL);
- if (dwarf2_per_objfile->using_index)
- {
- gdb_assert (sig_entry->per_cu.v.quick != NULL);
- gdb_assert (sig_entry->per_cu.v.quick->compunit_symtab == NULL);
- }
- else
- gdb_assert (sig_entry->per_cu.v.psymtab == NULL);
- gdb_assert (sig_entry->signature == dwo_entry->signature);
- gdb_assert (sig_entry->type_offset_in_section.sect_off == 0);
- gdb_assert (sig_entry->type_unit_group == NULL);
- gdb_assert (sig_entry->dwo_unit == NULL);
- sig_entry->per_cu.section = dwo_entry->section;
- sig_entry->per_cu.offset = dwo_entry->offset;
- sig_entry->per_cu.length = dwo_entry->length;
- sig_entry->per_cu.reading_dwo_directly = 1;
- sig_entry->per_cu.objfile = objfile;
- sig_entry->type_offset_in_tu = dwo_entry->type_offset_in_tu;
- sig_entry->dwo_unit = dwo_entry;
- }
- static struct signatured_type *
- lookup_dwo_signatured_type (struct dwarf2_cu *cu, ULONGEST sig)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwo_file *dwo_file;
- struct dwo_unit find_dwo_entry, *dwo_entry;
- struct signatured_type find_sig_entry, *sig_entry;
- void **slot;
- gdb_assert (cu->dwo_unit && dwarf2_per_objfile->using_index);
-
- if (dwarf2_per_objfile->signatured_types == NULL)
- {
- dwarf2_per_objfile->signatured_types
- = allocate_signatured_type_table (objfile);
- }
-
- find_sig_entry.signature = sig;
- slot = htab_find_slot (dwarf2_per_objfile->signatured_types,
- &find_sig_entry, INSERT);
- sig_entry = *slot;
-
-
- if (sig_entry != NULL && sig_entry->per_cu.tu_read)
- return sig_entry;
-
- dwo_file = cu->dwo_unit->dwo_file;
-
- if (dwo_file->tus == NULL)
- return NULL;
- find_dwo_entry.signature = sig;
- dwo_entry = htab_find (dwo_file->tus, &find_dwo_entry);
- if (dwo_entry == NULL)
- return NULL;
-
- if (sig_entry == NULL)
- sig_entry = add_type_unit (sig, slot);
- fill_in_sig_entry_from_dwo_entry (objfile, sig_entry, dwo_entry);
- sig_entry->per_cu.tu_read = 1;
- return sig_entry;
- }
- static struct signatured_type *
- lookup_dwp_signatured_type (struct dwarf2_cu *cu, ULONGEST sig)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwp_file *dwp_file = get_dwp_file ();
- struct dwo_unit *dwo_entry;
- struct signatured_type find_sig_entry, *sig_entry;
- void **slot;
- gdb_assert (cu->dwo_unit && dwarf2_per_objfile->using_index);
- gdb_assert (dwp_file != NULL);
-
- if (dwarf2_per_objfile->signatured_types == NULL)
- {
- dwarf2_per_objfile->signatured_types
- = allocate_signatured_type_table (objfile);
- }
- find_sig_entry.signature = sig;
- slot = htab_find_slot (dwarf2_per_objfile->signatured_types,
- &find_sig_entry, INSERT);
- sig_entry = *slot;
-
- if (sig_entry != NULL)
- return sig_entry;
- if (dwp_file->tus == NULL)
- return NULL;
- dwo_entry = lookup_dwo_unit_in_dwp (dwp_file, NULL,
- sig, 1 );
- if (dwo_entry == NULL)
- return NULL;
- sig_entry = add_type_unit (sig, slot);
- fill_in_sig_entry_from_dwo_entry (objfile, sig_entry, dwo_entry);
- return sig_entry;
- }
- static struct signatured_type *
- lookup_signatured_type (struct dwarf2_cu *cu, ULONGEST sig)
- {
- if (cu->dwo_unit
- && dwarf2_per_objfile->using_index)
- {
-
- if (get_dwp_file () == NULL)
- return lookup_dwo_signatured_type (cu, sig);
- else
- return lookup_dwp_signatured_type (cu, sig);
- }
- else
- {
- struct signatured_type find_entry, *entry;
- if (dwarf2_per_objfile->signatured_types == NULL)
- return NULL;
- find_entry.signature = sig;
- entry = htab_find (dwarf2_per_objfile->signatured_types, &find_entry);
- return entry;
- }
- }
- static void
- init_cu_die_reader (struct die_reader_specs *reader,
- struct dwarf2_cu *cu,
- struct dwarf2_section_info *section,
- struct dwo_file *dwo_file)
- {
- gdb_assert (section->readin && section->buffer != NULL);
- reader->abfd = get_section_bfd_owner (section);
- reader->cu = cu;
- reader->dwo_file = dwo_file;
- reader->die_section = section;
- reader->buffer = section->buffer;
- reader->buffer_end = section->buffer + section->size;
- reader->comp_dir = NULL;
- }
- static int
- read_cutu_die_from_dwo (struct dwarf2_per_cu_data *this_cu,
- struct dwo_unit *dwo_unit,
- int abbrev_table_provided,
- struct die_info *stub_comp_unit_die,
- const char *stub_comp_dir,
- struct die_reader_specs *result_reader,
- const gdb_byte **result_info_ptr,
- struct die_info **result_comp_unit_die,
- int *result_has_children)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwarf2_cu *cu = this_cu->cu;
- struct dwarf2_section_info *section;
- bfd *abfd;
- const gdb_byte *begin_info_ptr, *info_ptr;
- ULONGEST signature;
- struct attribute *comp_dir, *stmt_list, *low_pc, *high_pc, *ranges;
- int i,num_extra_attrs;
- struct dwarf2_section_info *dwo_abbrev_section;
- struct attribute *attr;
- struct die_info *comp_unit_die;
-
- gdb_assert ((stub_comp_unit_die != NULL) + (stub_comp_dir != NULL) <= 1);
-
- stmt_list = NULL;
- low_pc = NULL;
- high_pc = NULL;
- ranges = NULL;
- comp_dir = NULL;
- if (stub_comp_unit_die != NULL)
- {
-
- if (! this_cu->is_debug_types)
- stmt_list = dwarf2_attr (stub_comp_unit_die, DW_AT_stmt_list, cu);
- low_pc = dwarf2_attr (stub_comp_unit_die, DW_AT_low_pc, cu);
- high_pc = dwarf2_attr (stub_comp_unit_die, DW_AT_high_pc, cu);
- ranges = dwarf2_attr (stub_comp_unit_die, DW_AT_ranges, cu);
- comp_dir = dwarf2_attr (stub_comp_unit_die, DW_AT_comp_dir, cu);
-
- cu->addr_base = 0;
- attr = dwarf2_attr (stub_comp_unit_die, DW_AT_GNU_addr_base, cu);
- if (attr)
- cu->addr_base = DW_UNSND (attr);
-
- cu->ranges_base = 0;
- attr = dwarf2_attr (stub_comp_unit_die, DW_AT_GNU_ranges_base, cu);
- if (attr)
- cu->ranges_base = DW_UNSND (attr);
- }
- else if (stub_comp_dir != NULL)
- {
-
- comp_dir = (struct attribute *)
- obstack_alloc (&cu->comp_unit_obstack, sizeof (*comp_dir));
- comp_dir->name = DW_AT_comp_dir;
- comp_dir->form = DW_FORM_string;
- DW_STRING_IS_CANONICAL (comp_dir) = 0;
- DW_STRING (comp_dir) = stub_comp_dir;
- }
-
- cu->dwo_unit = dwo_unit;
- section = dwo_unit->section;
- dwarf2_read_section (objfile, section);
- abfd = get_section_bfd_owner (section);
- begin_info_ptr = info_ptr = section->buffer + dwo_unit->offset.sect_off;
- dwo_abbrev_section = &dwo_unit->dwo_file->sections.abbrev;
- init_cu_die_reader (result_reader, cu, section, dwo_unit->dwo_file);
- if (this_cu->is_debug_types)
- {
- ULONGEST header_signature;
- cu_offset type_offset_in_tu;
- struct signatured_type *sig_type = (struct signatured_type *) this_cu;
- info_ptr = read_and_check_type_unit_head (&cu->header, section,
- dwo_abbrev_section,
- info_ptr,
- &header_signature,
- &type_offset_in_tu);
-
- if (sig_type->signature != header_signature)
- {
- error (_("Dwarf Error: signature mismatch %s vs %s while reading"
- " TU at offset 0x%x [in module %s]"),
- hex_string (sig_type->signature),
- hex_string (header_signature),
- dwo_unit->offset.sect_off,
- bfd_get_filename (abfd));
- }
- gdb_assert (dwo_unit->offset.sect_off == cu->header.offset.sect_off);
-
- dwo_unit->length = get_cu_length (&cu->header);
- dwo_unit->type_offset_in_tu = type_offset_in_tu;
-
- sig_type->type_offset_in_section.sect_off =
- dwo_unit->offset.sect_off + dwo_unit->type_offset_in_tu.cu_off;
- }
- else
- {
- info_ptr = read_and_check_comp_unit_head (&cu->header, section,
- dwo_abbrev_section,
- info_ptr, 0);
- gdb_assert (dwo_unit->offset.sect_off == cu->header.offset.sect_off);
-
- dwo_unit->length = get_cu_length (&cu->header);
- }
-
- if (abbrev_table_provided)
- {
-
- dwarf2_read_abbrevs (cu, dwo_abbrev_section);
-
- make_cleanup (dwarf2_free_abbrev_table, cu);
- }
- else
- {
- dwarf2_free_abbrev_table (cu);
- dwarf2_read_abbrevs (cu, dwo_abbrev_section);
-
- }
-
- num_extra_attrs = ((stmt_list != NULL)
- + (low_pc != NULL)
- + (high_pc != NULL)
- + (ranges != NULL)
- + (comp_dir != NULL));
- info_ptr = read_full_die_1 (result_reader, result_comp_unit_die, info_ptr,
- result_has_children, num_extra_attrs);
-
- comp_unit_die = *result_comp_unit_die;
- i = comp_unit_die->num_attrs;
- if (stmt_list != NULL)
- comp_unit_die->attrs[i++] = *stmt_list;
- if (low_pc != NULL)
- comp_unit_die->attrs[i++] = *low_pc;
- if (high_pc != NULL)
- comp_unit_die->attrs[i++] = *high_pc;
- if (ranges != NULL)
- comp_unit_die->attrs[i++] = *ranges;
- if (comp_dir != NULL)
- comp_unit_die->attrs[i++] = *comp_dir;
- comp_unit_die->num_attrs += num_extra_attrs;
- if (dwarf2_die_debug)
- {
- fprintf_unfiltered (gdb_stdlog,
- "Read die from %s@0x%x of %s:\n",
- get_section_name (section),
- (unsigned) (begin_info_ptr - section->buffer),
- bfd_get_filename (abfd));
- dump_die (comp_unit_die, dwarf2_die_debug);
- }
-
- if (comp_dir != NULL)
- result_reader->comp_dir = DW_STRING (comp_dir);
-
- if (info_ptr >= begin_info_ptr + dwo_unit->length
- || peek_abbrev_code (abfd, info_ptr) == 0)
- return 0;
- *result_info_ptr = info_ptr;
- return 1;
- }
- static struct dwo_unit *
- lookup_dwo_unit (struct dwarf2_per_cu_data *this_cu,
- struct die_info *comp_unit_die)
- {
- struct dwarf2_cu *cu = this_cu->cu;
- struct attribute *attr;
- ULONGEST signature;
- struct dwo_unit *dwo_unit;
- const char *comp_dir, *dwo_name;
- gdb_assert (cu != NULL);
-
- attr = dwarf2_attr (comp_unit_die, DW_AT_GNU_dwo_name, cu);
- gdb_assert (attr != NULL);
- dwo_name = DW_STRING (attr);
- comp_dir = NULL;
- attr = dwarf2_attr (comp_unit_die, DW_AT_comp_dir, cu);
- if (attr)
- comp_dir = DW_STRING (attr);
- if (this_cu->is_debug_types)
- {
- struct signatured_type *sig_type;
-
- sig_type = (struct signatured_type *) this_cu;
- signature = sig_type->signature;
- dwo_unit = lookup_dwo_type_unit (sig_type, dwo_name, comp_dir);
- }
- else
- {
- struct attribute *attr;
- attr = dwarf2_attr (comp_unit_die, DW_AT_GNU_dwo_id, cu);
- if (! attr)
- error (_("Dwarf Error: missing dwo_id for dwo_name %s"
- " [in module %s]"),
- dwo_name, objfile_name (this_cu->objfile));
- signature = DW_UNSND (attr);
- dwo_unit = lookup_dwo_comp_unit (this_cu, dwo_name, comp_dir,
- signature);
- }
- return dwo_unit;
- }
- static void
- init_tu_and_read_dwo_dies (struct dwarf2_per_cu_data *this_cu,
- int use_existing_cu, int keep,
- die_reader_func_ftype *die_reader_func,
- void *data)
- {
- struct dwarf2_cu *cu;
- struct signatured_type *sig_type;
- struct cleanup *cleanups, *free_cu_cleanup = NULL;
- struct die_reader_specs reader;
- const gdb_byte *info_ptr;
- struct die_info *comp_unit_die;
- int has_children;
-
- gdb_assert (this_cu->is_debug_types && this_cu->reading_dwo_directly);
- sig_type = (struct signatured_type *) this_cu;
- gdb_assert (sig_type->dwo_unit != NULL);
- cleanups = make_cleanup (null_cleanup, NULL);
- if (use_existing_cu && this_cu->cu != NULL)
- {
- gdb_assert (this_cu->cu->dwo_unit == sig_type->dwo_unit);
- cu = this_cu->cu;
-
- }
- else
- {
-
- gdb_assert (this_cu->cu == NULL);
- cu = xmalloc (sizeof (*cu));
- init_one_comp_unit (cu, this_cu);
-
- free_cu_cleanup = make_cleanup (free_heap_comp_unit, cu);
- }
-
- if (read_cutu_die_from_dwo (this_cu, sig_type->dwo_unit,
- 0 ,
- NULL ,
- sig_type->dwo_unit->dwo_file->comp_dir,
- &reader, &info_ptr,
- &comp_unit_die, &has_children) == 0)
- {
-
- do_cleanups (cleanups);
- return;
- }
-
- die_reader_func (&reader, info_ptr, comp_unit_die, has_children, data);
-
- if (free_cu_cleanup != NULL)
- {
- if (keep)
- {
-
- discard_cleanups (free_cu_cleanup);
-
- dwarf2_free_abbrev_table (cu);
-
- this_cu->cu->read_in_chain = dwarf2_per_objfile->read_in_chain;
- dwarf2_per_objfile->read_in_chain = this_cu;
- }
- else
- do_cleanups (free_cu_cleanup);
- }
- do_cleanups (cleanups);
- }
- static void
- init_cutu_and_read_dies (struct dwarf2_per_cu_data *this_cu,
- struct abbrev_table *abbrev_table,
- int use_existing_cu, int keep,
- die_reader_func_ftype *die_reader_func,
- void *data)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwarf2_section_info *section = this_cu->section;
- bfd *abfd = get_section_bfd_owner (section);
- struct dwarf2_cu *cu;
- const gdb_byte *begin_info_ptr, *info_ptr;
- struct die_reader_specs reader;
- struct die_info *comp_unit_die;
- int has_children;
- struct attribute *attr;
- struct cleanup *cleanups, *free_cu_cleanup = NULL;
- struct signatured_type *sig_type = NULL;
- struct dwarf2_section_info *abbrev_section;
-
- int rereading_dwo_cu = 0;
- if (dwarf2_die_debug)
- fprintf_unfiltered (gdb_stdlog, "Reading %s unit at offset 0x%x\n",
- this_cu->is_debug_types ? "type" : "comp",
- this_cu->offset.sect_off);
- if (use_existing_cu)
- gdb_assert (keep);
-
- if (this_cu->reading_dwo_directly)
- {
-
- gdb_assert (this_cu->is_debug_types);
- gdb_assert (abbrev_table == NULL);
- init_tu_and_read_dwo_dies (this_cu, use_existing_cu, keep,
- die_reader_func, data);
- return;
- }
- cleanups = make_cleanup (null_cleanup, NULL);
-
- dwarf2_read_section (objfile, section);
- begin_info_ptr = info_ptr = section->buffer + this_cu->offset.sect_off;
- abbrev_section = get_abbrev_section_for_cu (this_cu);
- if (use_existing_cu && this_cu->cu != NULL)
- {
- cu = this_cu->cu;
-
- if (cu->dwo_unit != NULL)
- rereading_dwo_cu = 1;
- }
- else
- {
-
- gdb_assert (this_cu->cu == NULL);
- cu = xmalloc (sizeof (*cu));
- init_one_comp_unit (cu, this_cu);
-
- free_cu_cleanup = make_cleanup (free_heap_comp_unit, cu);
- }
-
- if (cu->header.first_die_offset.cu_off != 0 && ! rereading_dwo_cu)
- {
-
- info_ptr += cu->header.first_die_offset.cu_off;
- }
- else
- {
- if (this_cu->is_debug_types)
- {
- ULONGEST signature;
- cu_offset type_offset_in_tu;
- info_ptr = read_and_check_type_unit_head (&cu->header, section,
- abbrev_section, info_ptr,
- &signature,
- &type_offset_in_tu);
-
- sig_type = (struct signatured_type *) this_cu;
- gdb_assert (sig_type->signature == signature);
- gdb_assert (sig_type->type_offset_in_tu.cu_off
- == type_offset_in_tu.cu_off);
- gdb_assert (this_cu->offset.sect_off == cu->header.offset.sect_off);
-
- this_cu->length = get_cu_length (&cu->header);
-
- sig_type->type_offset_in_section.sect_off =
- this_cu->offset.sect_off + sig_type->type_offset_in_tu.cu_off;
- }
- else
- {
- info_ptr = read_and_check_comp_unit_head (&cu->header, section,
- abbrev_section,
- info_ptr, 0);
- gdb_assert (this_cu->offset.sect_off == cu->header.offset.sect_off);
- gdb_assert (this_cu->length == get_cu_length (&cu->header));
- }
- }
-
- if (info_ptr >= begin_info_ptr + this_cu->length
- || peek_abbrev_code (abfd, info_ptr) == 0)
- {
- do_cleanups (cleanups);
- return;
- }
-
- if (abbrev_table != NULL)
- {
- gdb_assert (cu->abbrev_table == NULL);
- gdb_assert (cu->header.abbrev_offset.sect_off
- == abbrev_table->offset.sect_off);
- cu->abbrev_table = abbrev_table;
- }
- else if (cu->abbrev_table == NULL)
- {
- dwarf2_read_abbrevs (cu, abbrev_section);
- make_cleanup (dwarf2_free_abbrev_table, cu);
- }
- else if (rereading_dwo_cu)
- {
- dwarf2_free_abbrev_table (cu);
- dwarf2_read_abbrevs (cu, abbrev_section);
- }
-
- init_cu_die_reader (&reader, cu, section, NULL);
- info_ptr = read_full_die (&reader, &comp_unit_die, info_ptr, &has_children);
-
- attr = dwarf2_attr (comp_unit_die, DW_AT_GNU_dwo_name, cu);
- if (attr)
- {
- struct dwo_unit *dwo_unit;
- struct die_info *dwo_comp_unit_die;
- if (has_children)
- {
- complaint (&symfile_complaints,
- _("compilation unit with DW_AT_GNU_dwo_name"
- " has children (offset 0x%x) [in module %s]"),
- this_cu->offset.sect_off, bfd_get_filename (abfd));
- }
- dwo_unit = lookup_dwo_unit (this_cu, comp_unit_die);
- if (dwo_unit != NULL)
- {
- if (read_cutu_die_from_dwo (this_cu, dwo_unit,
- abbrev_table != NULL,
- comp_unit_die, NULL,
- &reader, &info_ptr,
- &dwo_comp_unit_die, &has_children) == 0)
- {
-
- do_cleanups (cleanups);
- return;
- }
- comp_unit_die = dwo_comp_unit_die;
- }
- else
- {
-
- }
- }
-
- die_reader_func (&reader, info_ptr, comp_unit_die, has_children, data);
-
- if (free_cu_cleanup != NULL)
- {
- if (keep)
- {
-
- discard_cleanups (free_cu_cleanup);
-
- dwarf2_free_abbrev_table (cu);
-
- this_cu->cu->read_in_chain = dwarf2_per_objfile->read_in_chain;
- dwarf2_per_objfile->read_in_chain = this_cu;
- }
- else
- do_cleanups (free_cu_cleanup);
- }
- do_cleanups (cleanups);
- }
- static void
- init_cutu_and_read_dies_no_follow (struct dwarf2_per_cu_data *this_cu,
- struct dwo_file *dwo_file,
- die_reader_func_ftype *die_reader_func,
- void *data)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwarf2_section_info *section = this_cu->section;
- bfd *abfd = get_section_bfd_owner (section);
- struct dwarf2_section_info *abbrev_section;
- struct dwarf2_cu cu;
- const gdb_byte *begin_info_ptr, *info_ptr;
- struct die_reader_specs reader;
- struct cleanup *cleanups;
- struct die_info *comp_unit_die;
- int has_children;
- if (dwarf2_die_debug)
- fprintf_unfiltered (gdb_stdlog, "Reading %s unit at offset 0x%x\n",
- this_cu->is_debug_types ? "type" : "comp",
- this_cu->offset.sect_off);
- gdb_assert (this_cu->cu == NULL);
- abbrev_section = (dwo_file != NULL
- ? &dwo_file->sections.abbrev
- : get_abbrev_section_for_cu (this_cu));
-
- dwarf2_read_section (objfile, section);
- init_one_comp_unit (&cu, this_cu);
- cleanups = make_cleanup (free_stack_comp_unit, &cu);
- begin_info_ptr = info_ptr = section->buffer + this_cu->offset.sect_off;
- info_ptr = read_and_check_comp_unit_head (&cu.header, section,
- abbrev_section, info_ptr,
- this_cu->is_debug_types);
- this_cu->length = get_cu_length (&cu.header);
-
- if (info_ptr >= begin_info_ptr + this_cu->length
- || peek_abbrev_code (abfd, info_ptr) == 0)
- {
- do_cleanups (cleanups);
- return;
- }
- dwarf2_read_abbrevs (&cu, abbrev_section);
- make_cleanup (dwarf2_free_abbrev_table, &cu);
- init_cu_die_reader (&reader, &cu, section, dwo_file);
- info_ptr = read_full_die (&reader, &comp_unit_die, info_ptr, &has_children);
- die_reader_func (&reader, info_ptr, comp_unit_die, has_children, data);
- do_cleanups (cleanups);
- }
- static void
- init_cutu_and_read_dies_simple (struct dwarf2_per_cu_data *this_cu,
- die_reader_func_ftype *die_reader_func,
- void *data)
- {
- init_cutu_and_read_dies_no_follow (this_cu, NULL, die_reader_func, data);
- }
- static hashval_t
- hash_type_unit_group (const void *item)
- {
- const struct type_unit_group *tu_group = item;
- return hash_stmt_list_entry (&tu_group->hash);
- }
- static int
- eq_type_unit_group (const void *item_lhs, const void *item_rhs)
- {
- const struct type_unit_group *lhs = item_lhs;
- const struct type_unit_group *rhs = item_rhs;
- return eq_stmt_list_entry (&lhs->hash, &rhs->hash);
- }
- static htab_t
- allocate_type_unit_groups_table (void)
- {
- return htab_create_alloc_ex (3,
- hash_type_unit_group,
- eq_type_unit_group,
- NULL,
- &dwarf2_per_objfile->objfile->objfile_obstack,
- hashtab_obstack_allocate,
- dummy_obstack_deallocate);
- }
- #define NO_STMT_LIST_TYPE_UNIT_PSYMTAB (1 << 31)
- #define NO_STMT_LIST_TYPE_UNIT_PSYMTAB_SIZE 10
- static struct type_unit_group *
- create_type_unit_group (struct dwarf2_cu *cu, sect_offset line_offset_struct)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwarf2_per_cu_data *per_cu;
- struct type_unit_group *tu_group;
- tu_group = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct type_unit_group);
- per_cu = &tu_group->per_cu;
- per_cu->objfile = objfile;
- if (dwarf2_per_objfile->using_index)
- {
- per_cu->v.quick = OBSTACK_ZALLOC (&objfile->objfile_obstack,
- struct dwarf2_per_cu_quick_data);
- }
- else
- {
- unsigned int line_offset = line_offset_struct.sect_off;
- struct partial_symtab *pst;
- char *name;
-
- if ((line_offset & NO_STMT_LIST_TYPE_UNIT_PSYMTAB) != 0)
- name = xstrprintf ("<type_units_%d>",
- (line_offset & ~NO_STMT_LIST_TYPE_UNIT_PSYMTAB));
- else
- name = xstrprintf ("<type_units_at_0x%x>", line_offset);
- pst = create_partial_symtab (per_cu, name);
- pst->anonymous = 1;
- xfree (name);
- }
- tu_group->hash.dwo_unit = cu->dwo_unit;
- tu_group->hash.line_offset = line_offset_struct;
- return tu_group;
- }
- static struct type_unit_group *
- get_type_unit_group (struct dwarf2_cu *cu, const struct attribute *stmt_list)
- {
- struct tu_stats *tu_stats = &dwarf2_per_objfile->tu_stats;
- struct type_unit_group *tu_group;
- void **slot;
- unsigned int line_offset;
- struct type_unit_group type_unit_group_for_lookup;
- if (dwarf2_per_objfile->type_unit_groups == NULL)
- {
- dwarf2_per_objfile->type_unit_groups =
- allocate_type_unit_groups_table ();
- }
-
- if (stmt_list)
- {
- line_offset = DW_UNSND (stmt_list);
- ++tu_stats->nr_symtab_sharers;
- }
- else
- {
-
- line_offset = (NO_STMT_LIST_TYPE_UNIT_PSYMTAB
- | (tu_stats->nr_stmt_less_type_units
- / NO_STMT_LIST_TYPE_UNIT_PSYMTAB_SIZE));
- ++tu_stats->nr_stmt_less_type_units;
- }
- type_unit_group_for_lookup.hash.dwo_unit = cu->dwo_unit;
- type_unit_group_for_lookup.hash.line_offset.sect_off = line_offset;
- slot = htab_find_slot (dwarf2_per_objfile->type_unit_groups,
- &type_unit_group_for_lookup, INSERT);
- if (*slot != NULL)
- {
- tu_group = *slot;
- gdb_assert (tu_group != NULL);
- }
- else
- {
- sect_offset line_offset_struct;
- line_offset_struct.sect_off = line_offset;
- tu_group = create_type_unit_group (cu, line_offset_struct);
- *slot = tu_group;
- ++tu_stats->nr_symtabs;
- }
- return tu_group;
- }
- static struct partial_symtab *
- create_partial_symtab (struct dwarf2_per_cu_data *per_cu, const char *name)
- {
- struct objfile *objfile = per_cu->objfile;
- struct partial_symtab *pst;
- pst = start_psymtab_common (objfile, objfile->section_offsets,
- name, 0,
- objfile->global_psymbols.next,
- objfile->static_psymbols.next);
- pst->psymtabs_addrmap_supported = 1;
-
- pst->read_symtab_private = per_cu;
- pst->read_symtab = dwarf2_read_symtab;
- per_cu->v.psymtab = pst;
- return pst;
- }
- struct process_psymtab_comp_unit_data
- {
-
- int want_partial_unit;
-
- enum language pretend_language;
- };
- static void
- process_psymtab_comp_unit_reader (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr,
- struct die_info *comp_unit_die,
- int has_children,
- void *data)
- {
- struct dwarf2_cu *cu = reader->cu;
- struct objfile *objfile = cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- struct dwarf2_per_cu_data *per_cu = cu->per_cu;
- struct attribute *attr;
- CORE_ADDR baseaddr;
- CORE_ADDR best_lowpc = 0, best_highpc = 0;
- struct partial_symtab *pst;
- int has_pc_info;
- const char *filename;
- struct process_psymtab_comp_unit_data *info = data;
- if (comp_unit_die->tag == DW_TAG_partial_unit && !info->want_partial_unit)
- return;
- gdb_assert (! per_cu->is_debug_types);
- prepare_one_comp_unit (cu, comp_unit_die, info->pretend_language);
- cu->list_in_scope = &file_symbols;
-
- attr = dwarf2_attr (comp_unit_die, DW_AT_name, cu);
- if (attr == NULL || !DW_STRING (attr))
- filename = "";
- else
- filename = DW_STRING (attr);
- pst = create_partial_symtab (per_cu, filename);
-
- attr = dwarf2_attr (comp_unit_die, DW_AT_comp_dir, cu);
- if (attr != NULL)
- pst->dirname = DW_STRING (attr);
- baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
- dwarf2_find_base_address (comp_unit_die, cu);
-
- has_pc_info = dwarf2_get_pc_bounds (comp_unit_die, &best_lowpc,
- &best_highpc, cu, pst);
- if (has_pc_info == 1 && best_lowpc < best_highpc)
-
- addrmap_set_empty (objfile->psymtabs_addrmap,
- gdbarch_adjust_dwarf2_addr (gdbarch,
- best_lowpc + baseaddr),
- gdbarch_adjust_dwarf2_addr (gdbarch,
- best_highpc + baseaddr) - 1,
- pst);
-
- if (has_children)
- {
- struct partial_die_info *first_die;
- CORE_ADDR lowpc, highpc;
- lowpc = ((CORE_ADDR) -1);
- highpc = ((CORE_ADDR) 0);
- first_die = load_partial_dies (reader, info_ptr, 1);
- scan_partial_symbols (first_die, &lowpc, &highpc,
- ! has_pc_info, cu);
-
- if (lowpc == ((CORE_ADDR) -1))
- lowpc = highpc;
-
- if (! has_pc_info)
- {
- best_lowpc = lowpc;
- best_highpc = highpc;
- }
- }
- pst->textlow = gdbarch_adjust_dwarf2_addr (gdbarch, best_lowpc + baseaddr);
- pst->texthigh = gdbarch_adjust_dwarf2_addr (gdbarch, best_highpc + baseaddr);
- pst->n_global_syms = objfile->global_psymbols.next -
- (objfile->global_psymbols.list + pst->globals_offset);
- pst->n_static_syms = objfile->static_psymbols.next -
- (objfile->static_psymbols.list + pst->statics_offset);
- sort_pst_symbols (objfile, pst);
- if (!VEC_empty (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs))
- {
- int i;
- int len = VEC_length (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs);
- struct dwarf2_per_cu_data *iter;
-
- pst->number_of_dependencies = len;
- pst->dependencies = obstack_alloc (&objfile->objfile_obstack,
- len * sizeof (struct symtab *));
- for (i = 0;
- VEC_iterate (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs,
- i, iter);
- ++i)
- pst->dependencies[i] = iter->v.psymtab;
- VEC_free (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs);
- }
-
- dwarf2_build_include_psymtabs (cu, comp_unit_die, pst);
- if (dwarf2_read_debug)
- {
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- fprintf_unfiltered (gdb_stdlog,
- "Psymtab for %s unit @0x%x: %s - %s"
- ", %d global, %d static syms\n",
- per_cu->is_debug_types ? "type" : "comp",
- per_cu->offset.sect_off,
- paddress (gdbarch, pst->textlow),
- paddress (gdbarch, pst->texthigh),
- pst->n_global_syms, pst->n_static_syms);
- }
- }
- static void
- process_psymtab_comp_unit (struct dwarf2_per_cu_data *this_cu,
- int want_partial_unit,
- enum language pretend_language)
- {
- struct process_psymtab_comp_unit_data info;
-
- if (this_cu->cu != NULL)
- free_one_cached_comp_unit (this_cu);
- gdb_assert (! this_cu->is_debug_types);
- info.want_partial_unit = want_partial_unit;
- info.pretend_language = pretend_language;
- init_cutu_and_read_dies (this_cu, NULL, 0, 0,
- process_psymtab_comp_unit_reader,
- &info);
-
- age_cached_comp_units ();
- }
- static void
- build_type_psymtabs_reader (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr,
- struct die_info *type_unit_die,
- int has_children,
- void *data)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwarf2_cu *cu = reader->cu;
- struct dwarf2_per_cu_data *per_cu = cu->per_cu;
- struct signatured_type *sig_type;
- struct type_unit_group *tu_group;
- struct attribute *attr;
- struct partial_die_info *first_die;
- CORE_ADDR lowpc, highpc;
- struct partial_symtab *pst;
- gdb_assert (data == NULL);
- gdb_assert (per_cu->is_debug_types);
- sig_type = (struct signatured_type *) per_cu;
- if (! has_children)
- return;
- attr = dwarf2_attr_no_follow (type_unit_die, DW_AT_stmt_list);
- tu_group = get_type_unit_group (cu, attr);
- VEC_safe_push (sig_type_ptr, tu_group->tus, sig_type);
- prepare_one_comp_unit (cu, type_unit_die, language_minimal);
- cu->list_in_scope = &file_symbols;
- pst = create_partial_symtab (per_cu, "");
- pst->anonymous = 1;
- first_die = load_partial_dies (reader, info_ptr, 1);
- lowpc = (CORE_ADDR) -1;
- highpc = (CORE_ADDR) 0;
- scan_partial_symbols (first_die, &lowpc, &highpc, 0, cu);
- pst->n_global_syms = objfile->global_psymbols.next -
- (objfile->global_psymbols.list + pst->globals_offset);
- pst->n_static_syms = objfile->static_psymbols.next -
- (objfile->static_psymbols.list + pst->statics_offset);
- sort_pst_symbols (objfile, pst);
- }
- struct tu_abbrev_offset
- {
- struct signatured_type *sig_type;
- sect_offset abbrev_offset;
- };
- static int
- sort_tu_by_abbrev_offset (const void *ap, const void *bp)
- {
- const struct tu_abbrev_offset * const *a = ap;
- const struct tu_abbrev_offset * const *b = bp;
- unsigned int aoff = (*a)->abbrev_offset.sect_off;
- unsigned int boff = (*b)->abbrev_offset.sect_off;
- return (aoff > boff) - (aoff < boff);
- }
- static void
- build_type_psymtabs_1 (void)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct tu_stats *tu_stats = &dwarf2_per_objfile->tu_stats;
- struct cleanup *cleanups;
- struct abbrev_table *abbrev_table;
- sect_offset abbrev_offset;
- struct tu_abbrev_offset *sorted_by_abbrev;
- struct type_unit_group **iter;
- int i;
-
- gdb_assert (dwarf2_per_objfile->type_unit_groups == NULL);
- if (dwarf2_per_objfile->n_type_units == 0)
- return;
-
- if (dwarf2_read_debug)
- fprintf_unfiltered (gdb_stdlog, "Building type unit groups ...\n");
-
- sorted_by_abbrev = XNEWVEC (struct tu_abbrev_offset,
- dwarf2_per_objfile->n_type_units);
- for (i = 0; i < dwarf2_per_objfile->n_type_units; ++i)
- {
- struct signatured_type *sig_type = dwarf2_per_objfile->all_type_units[i];
- sorted_by_abbrev[i].sig_type = sig_type;
- sorted_by_abbrev[i].abbrev_offset =
- read_abbrev_offset (sig_type->per_cu.section,
- sig_type->per_cu.offset);
- }
- cleanups = make_cleanup (xfree, sorted_by_abbrev);
- qsort (sorted_by_abbrev, dwarf2_per_objfile->n_type_units,
- sizeof (struct tu_abbrev_offset), sort_tu_by_abbrev_offset);
- abbrev_offset.sect_off = ~(unsigned) 0;
- abbrev_table = NULL;
- make_cleanup (abbrev_table_free_cleanup, &abbrev_table);
- for (i = 0; i < dwarf2_per_objfile->n_type_units; ++i)
- {
- const struct tu_abbrev_offset *tu = &sorted_by_abbrev[i];
-
- if (abbrev_table == NULL
- || tu->abbrev_offset.sect_off != abbrev_offset.sect_off)
- {
- if (abbrev_table != NULL)
- {
- abbrev_table_free (abbrev_table);
-
- abbrev_table = NULL;
- }
- abbrev_offset = tu->abbrev_offset;
- abbrev_table =
- abbrev_table_read_table (&dwarf2_per_objfile->abbrev,
- abbrev_offset);
- ++tu_stats->nr_uniq_abbrev_tables;
- }
- init_cutu_and_read_dies (&tu->sig_type->per_cu, abbrev_table, 0, 0,
- build_type_psymtabs_reader, NULL);
- }
- do_cleanups (cleanups);
- }
- static void
- print_tu_stats (void)
- {
- struct tu_stats *tu_stats = &dwarf2_per_objfile->tu_stats;
- fprintf_unfiltered (gdb_stdlog, "Type unit statistics:\n");
- fprintf_unfiltered (gdb_stdlog, " %d TUs\n",
- dwarf2_per_objfile->n_type_units);
- fprintf_unfiltered (gdb_stdlog, " %d uniq abbrev tables\n",
- tu_stats->nr_uniq_abbrev_tables);
- fprintf_unfiltered (gdb_stdlog, " %d symtabs from stmt_list entries\n",
- tu_stats->nr_symtabs);
- fprintf_unfiltered (gdb_stdlog, " %d symtab sharers\n",
- tu_stats->nr_symtab_sharers);
- fprintf_unfiltered (gdb_stdlog, " %d type units without a stmt_list\n",
- tu_stats->nr_stmt_less_type_units);
- fprintf_unfiltered (gdb_stdlog, " %d all_type_units reallocs\n",
- tu_stats->nr_all_type_units_reallocs);
- }
- static int
- build_type_psymtab_dependencies (void **slot, void *info)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct type_unit_group *tu_group = (struct type_unit_group *) *slot;
- struct dwarf2_per_cu_data *per_cu = &tu_group->per_cu;
- struct partial_symtab *pst = per_cu->v.psymtab;
- int len = VEC_length (sig_type_ptr, tu_group->tus);
- struct signatured_type *iter;
- int i;
- gdb_assert (len > 0);
- gdb_assert (IS_TYPE_UNIT_GROUP (per_cu));
- pst->number_of_dependencies = len;
- pst->dependencies = obstack_alloc (&objfile->objfile_obstack,
- len * sizeof (struct psymtab *));
- for (i = 0;
- VEC_iterate (sig_type_ptr, tu_group->tus, i, iter);
- ++i)
- {
- gdb_assert (iter->per_cu.is_debug_types);
- pst->dependencies[i] = iter->per_cu.v.psymtab;
- iter->type_unit_group = tu_group;
- }
- VEC_free (sig_type_ptr, tu_group->tus);
- return 1;
- }
- static void
- build_type_psymtabs (struct objfile *objfile)
- {
- if (! create_all_type_units (objfile))
- return;
- build_type_psymtabs_1 ();
- }
- static int
- process_skeletonless_type_unit (void **slot, void *info)
- {
- struct dwo_unit *dwo_unit = (struct dwo_unit *) *slot;
- struct objfile *objfile = info;
- struct signatured_type find_entry, *entry;
-
- if (dwarf2_per_objfile->signatured_types == NULL)
- {
- dwarf2_per_objfile->signatured_types
- = allocate_signatured_type_table (objfile);
- }
- find_entry.signature = dwo_unit->signature;
- slot = htab_find_slot (dwarf2_per_objfile->signatured_types, &find_entry,
- INSERT);
-
- if (*slot != NULL)
- return 1;
-
- entry = add_type_unit (dwo_unit->signature, slot);
- fill_in_sig_entry_from_dwo_entry (objfile, entry, dwo_unit);
- *slot = entry;
-
- init_cutu_and_read_dies (&entry->per_cu, NULL, 0, 0,
- build_type_psymtabs_reader, NULL);
- return 1;
- }
- static int
- process_dwo_file_for_skeletonless_type_units (void **slot, void *info)
- {
- struct dwo_file *dwo_file = (struct dwo_file *) *slot;
- if (dwo_file->tus != NULL)
- {
- htab_traverse_noresize (dwo_file->tus,
- process_skeletonless_type_unit, info);
- }
- return 1;
- }
- static void
- process_skeletonless_type_units (struct objfile *objfile)
- {
-
- if (get_dwp_file () == NULL
- && dwarf2_per_objfile->dwo_files != NULL)
- {
- htab_traverse_noresize (dwarf2_per_objfile->dwo_files,
- process_dwo_file_for_skeletonless_type_units,
- objfile);
- }
- }
- static void
- psymtabs_addrmap_cleanup (void *o)
- {
- struct objfile *objfile = o;
- objfile->psymtabs_addrmap = NULL;
- }
- static void
- set_partial_user (struct objfile *objfile)
- {
- int i;
- for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
- {
- struct dwarf2_per_cu_data *per_cu = dw2_get_cutu (i);
- struct partial_symtab *pst = per_cu->v.psymtab;
- int j;
- if (pst == NULL)
- continue;
- for (j = 0; j < pst->number_of_dependencies; ++j)
- {
-
- if (pst->dependencies[j]->user == NULL)
- pst->dependencies[j]->user = pst;
- }
- }
- }
- static void
- dwarf2_build_psymtabs_hard (struct objfile *objfile)
- {
- struct cleanup *back_to, *addrmap_cleanup;
- struct obstack temp_obstack;
- int i;
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog, "Building psymtabs of objfile %s ...\n",
- objfile_name (objfile));
- }
- dwarf2_per_objfile->reading_partial_symbols = 1;
- dwarf2_read_section (objfile, &dwarf2_per_objfile->info);
-
- back_to = make_cleanup (free_cached_comp_units, NULL);
- build_type_psymtabs (objfile);
- create_all_comp_units (objfile);
-
- obstack_init (&temp_obstack);
- make_cleanup_obstack_free (&temp_obstack);
- objfile->psymtabs_addrmap = addrmap_create_mutable (&temp_obstack);
- addrmap_cleanup = make_cleanup (psymtabs_addrmap_cleanup, objfile);
- for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
- {
- struct dwarf2_per_cu_data *per_cu = dw2_get_cutu (i);
- process_psymtab_comp_unit (per_cu, 0, language_minimal);
- }
-
- process_skeletonless_type_units (objfile);
-
- if (dwarf2_per_objfile->type_unit_groups != NULL)
- {
- htab_traverse_noresize (dwarf2_per_objfile->type_unit_groups,
- build_type_psymtab_dependencies, NULL);
- }
- if (dwarf2_read_debug)
- print_tu_stats ();
- set_partial_user (objfile);
- objfile->psymtabs_addrmap = addrmap_create_fixed (objfile->psymtabs_addrmap,
- &objfile->objfile_obstack);
- discard_cleanups (addrmap_cleanup);
- do_cleanups (back_to);
- if (dwarf2_read_debug)
- fprintf_unfiltered (gdb_stdlog, "Done building psymtabs of %s\n",
- objfile_name (objfile));
- }
- static void
- load_partial_comp_unit_reader (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr,
- struct die_info *comp_unit_die,
- int has_children,
- void *data)
- {
- struct dwarf2_cu *cu = reader->cu;
- prepare_one_comp_unit (cu, comp_unit_die, language_minimal);
-
- if (has_children)
- load_partial_dies (reader, info_ptr, 0);
- }
- static void
- load_partial_comp_unit (struct dwarf2_per_cu_data *this_cu)
- {
- init_cutu_and_read_dies (this_cu, NULL, 1, 1,
- load_partial_comp_unit_reader, NULL);
- }
- static void
- read_comp_units_from_section (struct objfile *objfile,
- struct dwarf2_section_info *section,
- unsigned int is_dwz,
- int *n_allocated,
- int *n_comp_units,
- struct dwarf2_per_cu_data ***all_comp_units)
- {
- const gdb_byte *info_ptr;
- bfd *abfd = get_section_bfd_owner (section);
- if (dwarf2_read_debug)
- fprintf_unfiltered (gdb_stdlog, "Reading %s for %s\n",
- get_section_name (section),
- get_section_file_name (section));
- dwarf2_read_section (objfile, section);
- info_ptr = section->buffer;
- while (info_ptr < section->buffer + section->size)
- {
- unsigned int length, initial_length_size;
- struct dwarf2_per_cu_data *this_cu;
- sect_offset offset;
- offset.sect_off = info_ptr - section->buffer;
-
- length = read_initial_length (abfd, info_ptr, &initial_length_size);
-
- this_cu = obstack_alloc (&objfile->objfile_obstack,
- sizeof (struct dwarf2_per_cu_data));
- memset (this_cu, 0, sizeof (*this_cu));
- this_cu->offset = offset;
- this_cu->length = length + initial_length_size;
- this_cu->is_dwz = is_dwz;
- this_cu->objfile = objfile;
- this_cu->section = section;
- if (*n_comp_units == *n_allocated)
- {
- *n_allocated *= 2;
- *all_comp_units = xrealloc (*all_comp_units,
- *n_allocated
- * sizeof (struct dwarf2_per_cu_data *));
- }
- (*all_comp_units)[*n_comp_units] = this_cu;
- ++*n_comp_units;
- info_ptr = info_ptr + this_cu->length;
- }
- }
- static void
- create_all_comp_units (struct objfile *objfile)
- {
- int n_allocated;
- int n_comp_units;
- struct dwarf2_per_cu_data **all_comp_units;
- struct dwz_file *dwz;
- n_comp_units = 0;
- n_allocated = 10;
- all_comp_units = xmalloc (n_allocated
- * sizeof (struct dwarf2_per_cu_data *));
- read_comp_units_from_section (objfile, &dwarf2_per_objfile->info, 0,
- &n_allocated, &n_comp_units, &all_comp_units);
- dwz = dwarf2_get_dwz_file ();
- if (dwz != NULL)
- read_comp_units_from_section (objfile, &dwz->info, 1,
- &n_allocated, &n_comp_units,
- &all_comp_units);
- dwarf2_per_objfile->all_comp_units
- = obstack_alloc (&objfile->objfile_obstack,
- n_comp_units * sizeof (struct dwarf2_per_cu_data *));
- memcpy (dwarf2_per_objfile->all_comp_units, all_comp_units,
- n_comp_units * sizeof (struct dwarf2_per_cu_data *));
- xfree (all_comp_units);
- dwarf2_per_objfile->n_comp_units = n_comp_units;
- }
- static void
- scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc,
- CORE_ADDR *highpc, int set_addrmap,
- struct dwarf2_cu *cu)
- {
- struct partial_die_info *pdi;
-
- pdi = first_die;
- while (pdi != NULL)
- {
- fixup_partial_die (pdi, cu);
-
- if (pdi->name != NULL || pdi->tag == DW_TAG_namespace
- || pdi->tag == DW_TAG_module || pdi->tag == DW_TAG_enumeration_type
- || pdi->tag == DW_TAG_imported_unit)
- {
- switch (pdi->tag)
- {
- case DW_TAG_subprogram:
- add_partial_subprogram (pdi, lowpc, highpc, set_addrmap, cu);
- break;
- case DW_TAG_constant:
- case DW_TAG_variable:
- case DW_TAG_typedef:
- case DW_TAG_union_type:
- if (!pdi->is_declaration)
- {
- add_partial_symbol (pdi, cu);
- }
- break;
- case DW_TAG_class_type:
- case DW_TAG_interface_type:
- case DW_TAG_structure_type:
- if (!pdi->is_declaration)
- {
- add_partial_symbol (pdi, cu);
- }
- break;
- case DW_TAG_enumeration_type:
- if (!pdi->is_declaration)
- add_partial_enumeration (pdi, cu);
- break;
- case DW_TAG_base_type:
- case DW_TAG_subrange_type:
-
- add_partial_symbol (pdi, cu);
- break;
- case DW_TAG_namespace:
- add_partial_namespace (pdi, lowpc, highpc, set_addrmap, cu);
- break;
- case DW_TAG_module:
- add_partial_module (pdi, lowpc, highpc, set_addrmap, cu);
- break;
- case DW_TAG_imported_unit:
- {
- struct dwarf2_per_cu_data *per_cu;
-
- if (cu->per_cu->is_debug_types)
- {
- error (_("Dwarf Error: DW_TAG_imported_unit is not"
- " supported in type units [in module %s]"),
- objfile_name (cu->objfile));
- }
- per_cu = dwarf2_find_containing_comp_unit (pdi->d.offset,
- pdi->is_dwz,
- cu->objfile);
-
- if (per_cu->v.psymtab == NULL)
- process_psymtab_comp_unit (per_cu, 1, cu->language);
- VEC_safe_push (dwarf2_per_cu_ptr,
- cu->per_cu->imported_symtabs, per_cu);
- }
- break;
- case DW_TAG_imported_declaration:
- add_partial_symbol (pdi, cu);
- break;
- default:
- break;
- }
- }
-
- pdi = pdi->die_sibling;
- }
- }
- static const char *
- partial_die_parent_scope (struct partial_die_info *pdi,
- struct dwarf2_cu *cu)
- {
- const char *grandparent_scope;
- struct partial_die_info *parent, *real_pdi;
-
- real_pdi = pdi;
- while (real_pdi->has_specification)
- real_pdi = find_partial_die (real_pdi->spec_offset,
- real_pdi->spec_is_dwz, cu);
- parent = real_pdi->die_parent;
- if (parent == NULL)
- return NULL;
- if (parent->scope_set)
- return parent->scope;
- fixup_partial_die (parent, cu);
- grandparent_scope = partial_die_parent_scope (parent, cu);
-
- if (cu->language == language_cplus
- && parent->tag == DW_TAG_namespace
- && strcmp (parent->name, "::") == 0
- && grandparent_scope == NULL)
- {
- parent->scope = NULL;
- parent->scope_set = 1;
- return NULL;
- }
- if (pdi->tag == DW_TAG_enumerator)
-
- parent->scope = grandparent_scope;
- else if (parent->tag == DW_TAG_namespace
- || parent->tag == DW_TAG_module
- || parent->tag == DW_TAG_structure_type
- || parent->tag == DW_TAG_class_type
- || parent->tag == DW_TAG_interface_type
- || parent->tag == DW_TAG_union_type
- || parent->tag == DW_TAG_enumeration_type)
- {
- if (grandparent_scope == NULL)
- parent->scope = parent->name;
- else
- parent->scope = typename_concat (&cu->comp_unit_obstack,
- grandparent_scope,
- parent->name, 0, cu);
- }
- else
- {
- FIXME
- complaint (&symfile_complaints,
- _("unhandled containing DIE tag %d for DIE at %d"),
- parent->tag, pdi->offset.sect_off);
- parent->scope = grandparent_scope;
- }
- parent->scope_set = 1;
- return parent->scope;
- }
- static char *
- partial_die_full_name (struct partial_die_info *pdi,
- struct dwarf2_cu *cu)
- {
- const char *parent_scope;
-
- if (pdi->has_template_arguments)
- {
- fixup_partial_die (pdi, cu);
- if (pdi->name != NULL && strchr (pdi->name, '<') == NULL)
- {
- struct die_info *die;
- struct attribute attr;
- struct dwarf2_cu *ref_cu = cu;
-
- attr.name = 0;
- attr.form = DW_FORM_ref_addr;
- attr.u.unsnd = pdi->offset.sect_off;
- die = follow_die_ref (NULL, &attr, &ref_cu);
- return xstrdup (dwarf2_full_name (NULL, die, ref_cu));
- }
- }
- parent_scope = partial_die_parent_scope (pdi, cu);
- if (parent_scope == NULL)
- return NULL;
- else
- return typename_concat (NULL, parent_scope, pdi->name, 0, cu);
- }
- static void
- add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- CORE_ADDR addr = 0;
- const char *actual_name = NULL;
- CORE_ADDR baseaddr;
- char *built_actual_name;
- baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
- built_actual_name = partial_die_full_name (pdi, cu);
- if (built_actual_name != NULL)
- actual_name = built_actual_name;
- if (actual_name == NULL)
- actual_name = pdi->name;
- switch (pdi->tag)
- {
- case DW_TAG_subprogram:
- addr = gdbarch_adjust_dwarf2_addr (gdbarch, pdi->lowpc + baseaddr);
- if (pdi->is_external || cu->language == language_ada)
- {
-
-
- add_psymbol_to_list (actual_name, strlen (actual_name),
- built_actual_name != NULL,
- VAR_DOMAIN, LOC_BLOCK,
- &objfile->global_psymbols,
- 0, addr, cu->language, objfile);
- }
- else
- {
-
- add_psymbol_to_list (actual_name, strlen (actual_name),
- built_actual_name != NULL,
- VAR_DOMAIN, LOC_BLOCK,
- &objfile->static_psymbols,
- 0, addr, cu->language, objfile);
- }
- break;
- case DW_TAG_constant:
- {
- struct psymbol_allocation_list *list;
- if (pdi->is_external)
- list = &objfile->global_psymbols;
- else
- list = &objfile->static_psymbols;
- add_psymbol_to_list (actual_name, strlen (actual_name),
- built_actual_name != NULL, VAR_DOMAIN, LOC_STATIC,
- list, 0, 0, cu->language, objfile);
- }
- break;
- case DW_TAG_variable:
- if (pdi->d.locdesc)
- addr = decode_locdesc (pdi->d.locdesc, cu);
- if (pdi->d.locdesc
- && addr == 0
- && !dwarf2_per_objfile->has_section_at_zero)
- {
-
- }
- else if (pdi->is_external)
- {
-
- if (pdi->d.locdesc || pdi->has_type)
- add_psymbol_to_list (actual_name, strlen (actual_name),
- built_actual_name != NULL,
- VAR_DOMAIN, LOC_STATIC,
- &objfile->global_psymbols,
- 0, addr + baseaddr,
- cu->language, objfile);
- }
- else
- {
-
- if (pdi->d.locdesc == NULL)
- {
- xfree (built_actual_name);
- return;
- }
-
- add_psymbol_to_list (actual_name, strlen (actual_name),
- built_actual_name != NULL,
- VAR_DOMAIN, LOC_STATIC,
- &objfile->static_psymbols,
- 0, addr + baseaddr,
- cu->language, objfile);
- }
- break;
- case DW_TAG_typedef:
- case DW_TAG_base_type:
- case DW_TAG_subrange_type:
- add_psymbol_to_list (actual_name, strlen (actual_name),
- built_actual_name != NULL,
- VAR_DOMAIN, LOC_TYPEDEF,
- &objfile->static_psymbols,
- 0, (CORE_ADDR) 0, cu->language, objfile);
- break;
- case DW_TAG_imported_declaration:
- case DW_TAG_namespace:
- add_psymbol_to_list (actual_name, strlen (actual_name),
- built_actual_name != NULL,
- VAR_DOMAIN, LOC_TYPEDEF,
- &objfile->global_psymbols,
- 0, (CORE_ADDR) 0, cu->language, objfile);
- break;
- case DW_TAG_module:
- add_psymbol_to_list (actual_name, strlen (actual_name),
- built_actual_name != NULL,
- MODULE_DOMAIN, LOC_TYPEDEF,
- &objfile->global_psymbols,
- 0, (CORE_ADDR) 0, cu->language, objfile);
- break;
- case DW_TAG_class_type:
- case DW_TAG_interface_type:
- case DW_TAG_structure_type:
- case DW_TAG_union_type:
- case DW_TAG_enumeration_type:
-
- if (!pdi->has_byte_size && pdi->is_declaration)
- {
- xfree (built_actual_name);
- return;
- }
-
- add_psymbol_to_list (actual_name, strlen (actual_name),
- built_actual_name != NULL,
- STRUCT_DOMAIN, LOC_TYPEDEF,
- (cu->language == language_cplus
- || cu->language == language_java)
- ? &objfile->global_psymbols
- : &objfile->static_psymbols,
- 0, (CORE_ADDR) 0, cu->language, objfile);
- break;
- case DW_TAG_enumerator:
- add_psymbol_to_list (actual_name, strlen (actual_name),
- built_actual_name != NULL,
- VAR_DOMAIN, LOC_CONST,
- (cu->language == language_cplus
- || cu->language == language_java)
- ? &objfile->global_psymbols
- : &objfile->static_psymbols,
- 0, (CORE_ADDR) 0, cu->language, objfile);
- break;
- default:
- break;
- }
- xfree (built_actual_name);
- }
- static void
- add_partial_namespace (struct partial_die_info *pdi,
- CORE_ADDR *lowpc, CORE_ADDR *highpc,
- int set_addrmap, struct dwarf2_cu *cu)
- {
-
- add_partial_symbol (pdi, cu);
-
- if (pdi->has_children)
- scan_partial_symbols (pdi->die_child, lowpc, highpc, set_addrmap, cu);
- }
- static void
- add_partial_module (struct partial_die_info *pdi, CORE_ADDR *lowpc,
- CORE_ADDR *highpc, int set_addrmap, struct dwarf2_cu *cu)
- {
-
- add_partial_symbol (pdi, cu);
-
- if (pdi->has_children)
- scan_partial_symbols (pdi->die_child, lowpc, highpc, set_addrmap, cu);
- }
- static void
- add_partial_subprogram (struct partial_die_info *pdi,
- CORE_ADDR *lowpc, CORE_ADDR *highpc,
- int set_addrmap, struct dwarf2_cu *cu)
- {
- if (pdi->tag == DW_TAG_subprogram)
- {
- if (pdi->has_pc_info)
- {
- if (pdi->lowpc < *lowpc)
- *lowpc = pdi->lowpc;
- if (pdi->highpc > *highpc)
- *highpc = pdi->highpc;
- if (set_addrmap)
- {
- struct objfile *objfile = cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- CORE_ADDR baseaddr;
- CORE_ADDR highpc;
- CORE_ADDR lowpc;
- baseaddr = ANOFFSET (objfile->section_offsets,
- SECT_OFF_TEXT (objfile));
- lowpc = gdbarch_adjust_dwarf2_addr (gdbarch,
- pdi->lowpc + baseaddr);
- highpc = gdbarch_adjust_dwarf2_addr (gdbarch,
- pdi->highpc + baseaddr);
- addrmap_set_empty (objfile->psymtabs_addrmap, lowpc, highpc - 1,
- cu->per_cu->v.psymtab);
- }
- }
- if (pdi->has_pc_info || (!pdi->is_external && pdi->may_be_inlined))
- {
- if (!pdi->is_declaration)
-
- if (pdi->name)
- add_partial_symbol (pdi, cu);
- }
- }
- if (! pdi->has_children)
- return;
- if (cu->language == language_ada)
- {
- pdi = pdi->die_child;
- while (pdi != NULL)
- {
- fixup_partial_die (pdi, cu);
- if (pdi->tag == DW_TAG_subprogram
- || pdi->tag == DW_TAG_lexical_block)
- add_partial_subprogram (pdi, lowpc, highpc, set_addrmap, cu);
- pdi = pdi->die_sibling;
- }
- }
- }
- static void
- add_partial_enumeration (struct partial_die_info *enum_pdi,
- struct dwarf2_cu *cu)
- {
- struct partial_die_info *pdi;
- if (enum_pdi->name != NULL)
- add_partial_symbol (enum_pdi, cu);
- pdi = enum_pdi->die_child;
- while (pdi)
- {
- if (pdi->tag != DW_TAG_enumerator || pdi->name == NULL)
- complaint (&symfile_complaints, _("malformed enumerator DIE ignored"));
- else
- add_partial_symbol (pdi, cu);
- pdi = pdi->die_sibling;
- }
- }
- static unsigned int
- peek_abbrev_code (bfd *abfd, const gdb_byte *info_ptr)
- {
- unsigned int bytes_read;
- return read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
- }
- static struct abbrev_info *
- peek_die_abbrev (const gdb_byte *info_ptr, unsigned int *bytes_read,
- struct dwarf2_cu *cu)
- {
- bfd *abfd = cu->objfile->obfd;
- unsigned int abbrev_number;
- struct abbrev_info *abbrev;
- abbrev_number = read_unsigned_leb128 (abfd, info_ptr, bytes_read);
- if (abbrev_number == 0)
- return NULL;
- abbrev = abbrev_table_lookup_abbrev (cu->abbrev_table, abbrev_number);
- if (!abbrev)
- {
- error (_("Dwarf Error: Could not find abbrev number %d in %s"
- " at offset 0x%x [in module %s]"),
- abbrev_number, cu->per_cu->is_debug_types ? "TU" : "CU",
- cu->header.offset.sect_off, bfd_get_filename (abfd));
- }
- return abbrev;
- }
- static const gdb_byte *
- skip_children (const struct die_reader_specs *reader, const gdb_byte *info_ptr)
- {
- struct dwarf2_cu *cu = reader->cu;
- struct abbrev_info *abbrev;
- unsigned int bytes_read;
- while (1)
- {
- abbrev = peek_die_abbrev (info_ptr, &bytes_read, cu);
- if (abbrev == NULL)
- return info_ptr + bytes_read;
- else
- info_ptr = skip_one_die (reader, info_ptr + bytes_read, abbrev);
- }
- }
- static const gdb_byte *
- skip_one_die (const struct die_reader_specs *reader, const gdb_byte *info_ptr,
- struct abbrev_info *abbrev)
- {
- unsigned int bytes_read;
- struct attribute attr;
- bfd *abfd = reader->abfd;
- struct dwarf2_cu *cu = reader->cu;
- const gdb_byte *buffer = reader->buffer;
- const gdb_byte *buffer_end = reader->buffer_end;
- const gdb_byte *start_info_ptr = info_ptr;
- unsigned int form, i;
- for (i = 0; i < abbrev->num_attrs; i++)
- {
-
- if (abbrev->attrs[i].name == DW_AT_sibling)
- {
- read_attribute (reader, &attr, &abbrev->attrs[i], info_ptr);
- if (attr.form == DW_FORM_ref_addr)
- complaint (&symfile_complaints,
- _("ignoring absolute DW_AT_sibling"));
- else
- {
- unsigned int off = dwarf2_get_ref_die_offset (&attr).sect_off;
- const gdb_byte *sibling_ptr = buffer + off;
- if (sibling_ptr < info_ptr)
- complaint (&symfile_complaints,
- _("DW_AT_sibling points backwards"));
- else if (sibling_ptr > reader->buffer_end)
- dwarf2_section_buffer_overflow_complaint (reader->die_section);
- else
- return sibling_ptr;
- }
- }
-
- form = abbrev->attrs[i].form;
- skip_attribute:
- switch (form)
- {
- case DW_FORM_ref_addr:
-
- if (cu->header.version == 2)
- info_ptr += cu->header.addr_size;
- else
- info_ptr += cu->header.offset_size;
- break;
- case DW_FORM_GNU_ref_alt:
- info_ptr += cu->header.offset_size;
- break;
- case DW_FORM_addr:
- info_ptr += cu->header.addr_size;
- break;
- case DW_FORM_data1:
- case DW_FORM_ref1:
- case DW_FORM_flag:
- info_ptr += 1;
- break;
- case DW_FORM_flag_present:
- break;
- case DW_FORM_data2:
- case DW_FORM_ref2:
- info_ptr += 2;
- break;
- case DW_FORM_data4:
- case DW_FORM_ref4:
- info_ptr += 4;
- break;
- case DW_FORM_data8:
- case DW_FORM_ref8:
- case DW_FORM_ref_sig8:
- info_ptr += 8;
- break;
- case DW_FORM_string:
- read_direct_string (abfd, info_ptr, &bytes_read);
- info_ptr += bytes_read;
- break;
- case DW_FORM_sec_offset:
- case DW_FORM_strp:
- case DW_FORM_GNU_strp_alt:
- info_ptr += cu->header.offset_size;
- break;
- case DW_FORM_exprloc:
- case DW_FORM_block:
- info_ptr += read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
- info_ptr += bytes_read;
- break;
- case DW_FORM_block1:
- info_ptr += 1 + read_1_byte (abfd, info_ptr);
- break;
- case DW_FORM_block2:
- info_ptr += 2 + read_2_bytes (abfd, info_ptr);
- break;
- case DW_FORM_block4:
- info_ptr += 4 + read_4_bytes (abfd, info_ptr);
- break;
- case DW_FORM_sdata:
- case DW_FORM_udata:
- case DW_FORM_ref_udata:
- case DW_FORM_GNU_addr_index:
- case DW_FORM_GNU_str_index:
- info_ptr = safe_skip_leb128 (info_ptr, buffer_end);
- break;
- case DW_FORM_indirect:
- form = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
- info_ptr += bytes_read;
-
- goto skip_attribute;
- default:
- error (_("Dwarf Error: Cannot handle %s "
- "in DWARF reader [in module %s]"),
- dwarf_form_name (form),
- bfd_get_filename (abfd));
- }
- }
- if (abbrev->has_children)
- return skip_children (reader, info_ptr);
- else
- return info_ptr;
- }
- static const gdb_byte *
- locate_pdi_sibling (const struct die_reader_specs *reader,
- struct partial_die_info *orig_pdi,
- const gdb_byte *info_ptr)
- {
-
- if (orig_pdi->sibling)
- return orig_pdi->sibling;
-
- if (!orig_pdi->has_children)
- return info_ptr;
-
- return skip_children (reader, info_ptr);
- }
- static void
- dwarf2_read_symtab (struct partial_symtab *self,
- struct objfile *objfile)
- {
- if (self->readin)
- {
- warning (_("bug: psymtab for %s is already read in."),
- self->filename);
- }
- else
- {
- if (info_verbose)
- {
- printf_filtered (_("Reading in symbols for %s..."),
- self->filename);
- gdb_flush (gdb_stdout);
- }
-
- dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key);
-
- if (objfile->separate_debug_objfile_backlink)
- {
- struct dwarf2_per_objfile *dpo_backlink
- = objfile_data (objfile->separate_debug_objfile_backlink,
- dwarf2_objfile_data_key);
- dwarf2_per_objfile->has_section_at_zero
- = dpo_backlink->has_section_at_zero;
- }
- dwarf2_per_objfile->reading_partial_symbols = 0;
- psymtab_to_symtab_1 (self);
-
- if (info_verbose)
- printf_filtered (_("done.\n"));
- }
- process_cu_includes ();
- }
- static void
- queue_comp_unit (struct dwarf2_per_cu_data *per_cu,
- enum language pretend_language)
- {
- struct dwarf2_queue_item *item;
- per_cu->queued = 1;
- item = xmalloc (sizeof (*item));
- item->per_cu = per_cu;
- item->pretend_language = pretend_language;
- item->next = NULL;
- if (dwarf2_queue == NULL)
- dwarf2_queue = item;
- else
- dwarf2_queue_tail->next = item;
- dwarf2_queue_tail = item;
- }
- static int
- maybe_queue_comp_unit (struct dwarf2_cu *dependent_cu,
- struct dwarf2_per_cu_data *per_cu,
- enum language pretend_language)
- {
-
- if (dwarf2_per_objfile->reading_partial_symbols)
- {
- if (per_cu->cu == NULL || per_cu->cu->dies == NULL)
- return 1;
- return 0;
- }
-
- if (dependent_cu != NULL)
- dwarf2_add_dependence (dependent_cu, per_cu);
-
- if (per_cu->queued)
- return 0;
-
- if (per_cu->cu != NULL)
- {
- per_cu->cu->last_used = 0;
- return 0;
- }
-
- queue_comp_unit (per_cu, pretend_language);
- return 1;
- }
- static void
- process_queue (void)
- {
- struct dwarf2_queue_item *item, *next_item;
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog,
- "Expanding one or more symtabs of objfile %s ...\n",
- objfile_name (dwarf2_per_objfile->objfile));
- }
-
- for (item = dwarf2_queue; item != NULL; dwarf2_queue = item = next_item)
- {
- if (dwarf2_per_objfile->using_index
- ? !item->per_cu->v.quick->compunit_symtab
- : (item->per_cu->v.psymtab && !item->per_cu->v.psymtab->readin))
- {
- struct dwarf2_per_cu_data *per_cu = item->per_cu;
- unsigned int debug_print_threshold;
- char buf[100];
- if (per_cu->is_debug_types)
- {
- struct signatured_type *sig_type =
- (struct signatured_type *) per_cu;
- sprintf (buf, "TU %s at offset 0x%x",
- hex_string (sig_type->signature),
- per_cu->offset.sect_off);
-
- debug_print_threshold = 2;
- }
- else
- {
- sprintf (buf, "CU at offset 0x%x", per_cu->offset.sect_off);
- debug_print_threshold = 1;
- }
- if (dwarf2_read_debug >= debug_print_threshold)
- fprintf_unfiltered (gdb_stdlog, "Expanding symtab of %s\n", buf);
- if (per_cu->is_debug_types)
- process_full_type_unit (per_cu, item->pretend_language);
- else
- process_full_comp_unit (per_cu, item->pretend_language);
- if (dwarf2_read_debug >= debug_print_threshold)
- fprintf_unfiltered (gdb_stdlog, "Done expanding %s\n", buf);
- }
- item->per_cu->queued = 0;
- next_item = item->next;
- xfree (item);
- }
- dwarf2_queue_tail = NULL;
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog, "Done expanding symtabs of %s.\n",
- objfile_name (dwarf2_per_objfile->objfile));
- }
- }
- static void
- dwarf2_release_queue (void *dummy)
- {
- struct dwarf2_queue_item *item, *last;
- item = dwarf2_queue;
- while (item)
- {
-
- if (item->per_cu->queued)
- {
- if (item->per_cu->cu != NULL)
- free_one_cached_comp_unit (item->per_cu);
- item->per_cu->queued = 0;
- }
- last = item;
- item = item->next;
- xfree (last);
- }
- dwarf2_queue = dwarf2_queue_tail = NULL;
- }
- static void
- psymtab_to_symtab_1 (struct partial_symtab *pst)
- {
- struct dwarf2_per_cu_data *per_cu;
- int i;
- if (pst->readin)
- return;
- for (i = 0; i < pst->number_of_dependencies; i++)
- if (!pst->dependencies[i]->readin
- && pst->dependencies[i]->user == NULL)
- {
-
- if (info_verbose)
- {
- FIXME
- fputs_filtered (" ", gdb_stdout);
- wrap_here ("");
- fputs_filtered ("and ", gdb_stdout);
- wrap_here ("");
- printf_filtered ("%s...", pst->dependencies[i]->filename);
- wrap_here ("");
- gdb_flush (gdb_stdout);
- }
- psymtab_to_symtab_1 (pst->dependencies[i]);
- }
- per_cu = pst->read_symtab_private;
- if (per_cu == NULL)
- {
-
- pst->readin = 1;
- return;
- }
- dw2_do_instantiate_symtab (per_cu);
- }
- static hashval_t
- die_hash (const void *item)
- {
- const struct die_info *die = item;
- return die->offset.sect_off;
- }
- static int
- die_eq (const void *item_lhs, const void *item_rhs)
- {
- const struct die_info *die_lhs = item_lhs;
- const struct die_info *die_rhs = item_rhs;
- return die_lhs->offset.sect_off == die_rhs->offset.sect_off;
- }
- static void
- load_full_comp_unit_reader (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr,
- struct die_info *comp_unit_die,
- int has_children,
- void *data)
- {
- struct dwarf2_cu *cu = reader->cu;
- enum language *language_ptr = data;
- gdb_assert (cu->die_hash == NULL);
- cu->die_hash =
- htab_create_alloc_ex (cu->header.length / 12,
- die_hash,
- die_eq,
- NULL,
- &cu->comp_unit_obstack,
- hashtab_obstack_allocate,
- dummy_obstack_deallocate);
- if (has_children)
- comp_unit_die->child = read_die_and_siblings (reader, info_ptr,
- &info_ptr, comp_unit_die);
- cu->dies = comp_unit_die;
-
-
- prepare_one_comp_unit (cu, cu->dies, *language_ptr);
- }
- static void
- load_full_comp_unit (struct dwarf2_per_cu_data *this_cu,
- enum language pretend_language)
- {
- gdb_assert (! this_cu->is_debug_types);
- init_cutu_and_read_dies (this_cu, NULL, 1, 1,
- load_full_comp_unit_reader, &pretend_language);
- }
- static void
- add_to_method_list (struct type *type, int fnfield_index, int index,
- const char *name, struct die_info *die,
- struct dwarf2_cu *cu)
- {
- struct delayed_method_info mi;
- mi.type = type;
- mi.fnfield_index = fnfield_index;
- mi.index = index;
- mi.name = name;
- mi.die = die;
- VEC_safe_push (delayed_method_info, cu->method_list, &mi);
- }
- static void
- free_delayed_list (void *ptr)
- {
- struct dwarf2_cu *cu = (struct dwarf2_cu *) ptr;
- if (cu->method_list != NULL)
- {
- VEC_free (delayed_method_info, cu->method_list);
- cu->method_list = NULL;
- }
- }
- static void
- compute_delayed_physnames (struct dwarf2_cu *cu)
- {
- int i;
- struct delayed_method_info *mi;
- for (i = 0; VEC_iterate (delayed_method_info, cu->method_list, i, mi) ; ++i)
- {
- const char *physname;
- struct fn_fieldlist *fn_flp
- = &TYPE_FN_FIELDLIST (mi->type, mi->fnfield_index);
- physname = dwarf2_physname (mi->name, mi->die, cu);
- fn_flp->fn_fields[mi->index].physname = physname ? physname : "";
- }
- }
- static void
- fixup_go_packaging (struct dwarf2_cu *cu)
- {
- char *package_name = NULL;
- struct pending *list;
- int i;
- for (list = global_symbols; list != NULL; list = list->next)
- {
- for (i = 0; i < list->nsyms; ++i)
- {
- struct symbol *sym = list->symbol[i];
- if (SYMBOL_LANGUAGE (sym) == language_go
- && SYMBOL_CLASS (sym) == LOC_BLOCK)
- {
- char *this_package_name = go_symbol_package_name (sym);
- if (this_package_name == NULL)
- continue;
- if (package_name == NULL)
- package_name = this_package_name;
- else
- {
- if (strcmp (package_name, this_package_name) != 0)
- complaint (&symfile_complaints,
- _("Symtab %s has objects from two different Go packages: %s and %s"),
- (symbol_symtab (sym) != NULL
- ? symtab_to_filename_for_display
- (symbol_symtab (sym))
- : objfile_name (cu->objfile)),
- this_package_name, package_name);
- xfree (this_package_name);
- }
- }
- }
- }
- if (package_name != NULL)
- {
- struct objfile *objfile = cu->objfile;
- const char *saved_package_name
- = obstack_copy0 (&objfile->per_bfd->storage_obstack,
- package_name,
- strlen (package_name));
- struct type *type = init_type (TYPE_CODE_MODULE, 0, 0,
- saved_package_name, objfile);
- struct symbol *sym;
- TYPE_TAG_NAME (type) = TYPE_NAME (type);
- sym = allocate_symbol (objfile);
- SYMBOL_SET_LANGUAGE (sym, language_go, &objfile->objfile_obstack);
- SYMBOL_SET_NAMES (sym, saved_package_name,
- strlen (saved_package_name), 0, objfile);
-
- SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
- SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
- SYMBOL_TYPE (sym) = type;
- add_symbol_to_list (sym, &global_symbols);
- xfree (package_name);
- }
- }
- static struct compunit_symtab *
- get_compunit_symtab (struct dwarf2_per_cu_data *per_cu)
- {
- return (dwarf2_per_objfile->using_index
- ? per_cu->v.quick->compunit_symtab
- : per_cu->v.psymtab->compunit_symtab);
- }
- static void
- recursively_compute_inclusions (VEC (compunit_symtab_ptr) **result,
- htab_t all_children, htab_t all_type_symtabs,
- struct dwarf2_per_cu_data *per_cu,
- struct compunit_symtab *immediate_parent)
- {
- void **slot;
- int ix;
- struct compunit_symtab *cust;
- struct dwarf2_per_cu_data *iter;
- slot = htab_find_slot (all_children, per_cu, INSERT);
- if (*slot != NULL)
- {
-
- return;
- }
- *slot = per_cu;
-
- cust = get_compunit_symtab (per_cu);
- if (cust != NULL)
- {
-
- if (per_cu->is_debug_types)
- {
- slot = htab_find_slot (all_type_symtabs, cust, INSERT);
- if (*slot == NULL)
- {
- *slot = cust;
- VEC_safe_push (compunit_symtab_ptr, *result, cust);
- if (cust->user == NULL)
- cust->user = immediate_parent;
- }
- }
- else
- {
- VEC_safe_push (compunit_symtab_ptr, *result, cust);
- if (cust->user == NULL)
- cust->user = immediate_parent;
- }
- }
- for (ix = 0;
- VEC_iterate (dwarf2_per_cu_ptr, per_cu->imported_symtabs, ix, iter);
- ++ix)
- {
- recursively_compute_inclusions (result, all_children,
- all_type_symtabs, iter, cust);
- }
- }
- static void
- compute_compunit_symtab_includes (struct dwarf2_per_cu_data *per_cu)
- {
- gdb_assert (! per_cu->is_debug_types);
- if (!VEC_empty (dwarf2_per_cu_ptr, per_cu->imported_symtabs))
- {
- int ix, len;
- struct dwarf2_per_cu_data *per_cu_iter;
- struct compunit_symtab *compunit_symtab_iter;
- VEC (compunit_symtab_ptr) *result_symtabs = NULL;
- htab_t all_children, all_type_symtabs;
- struct compunit_symtab *cust = get_compunit_symtab (per_cu);
-
- if (cust == NULL)
- return;
- all_children = htab_create_alloc (1, htab_hash_pointer, htab_eq_pointer,
- NULL, xcalloc, xfree);
- all_type_symtabs = htab_create_alloc (1, htab_hash_pointer, htab_eq_pointer,
- NULL, xcalloc, xfree);
- for (ix = 0;
- VEC_iterate (dwarf2_per_cu_ptr, per_cu->imported_symtabs,
- ix, per_cu_iter);
- ++ix)
- {
- recursively_compute_inclusions (&result_symtabs, all_children,
- all_type_symtabs, per_cu_iter,
- cust);
- }
-
- len = VEC_length (compunit_symtab_ptr, result_symtabs);
- cust->includes
- = obstack_alloc (&dwarf2_per_objfile->objfile->objfile_obstack,
- (len + 1) * sizeof (struct symtab *));
- for (ix = 0;
- VEC_iterate (compunit_symtab_ptr, result_symtabs, ix,
- compunit_symtab_iter);
- ++ix)
- cust->includes[ix] = compunit_symtab_iter;
- cust->includes[len] = NULL;
- VEC_free (compunit_symtab_ptr, result_symtabs);
- htab_delete (all_children);
- htab_delete (all_type_symtabs);
- }
- }
- static void
- process_cu_includes (void)
- {
- int ix;
- struct dwarf2_per_cu_data *iter;
- for (ix = 0;
- VEC_iterate (dwarf2_per_cu_ptr, dwarf2_per_objfile->just_read_cus,
- ix, iter);
- ++ix)
- {
- if (! iter->is_debug_types)
- compute_compunit_symtab_includes (iter);
- }
- VEC_free (dwarf2_per_cu_ptr, dwarf2_per_objfile->just_read_cus);
- }
- static void
- process_full_comp_unit (struct dwarf2_per_cu_data *per_cu,
- enum language pretend_language)
- {
- struct dwarf2_cu *cu = per_cu->cu;
- struct objfile *objfile = per_cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- CORE_ADDR lowpc, highpc;
- struct compunit_symtab *cust;
- struct cleanup *back_to, *delayed_list_cleanup;
- CORE_ADDR baseaddr;
- struct block *static_block;
- CORE_ADDR addr;
- baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
- buildsym_init ();
- back_to = make_cleanup (really_free_pendings, NULL);
- delayed_list_cleanup = make_cleanup (free_delayed_list, cu);
- cu->list_in_scope = &file_symbols;
- cu->language = pretend_language;
- cu->language_defn = language_def (cu->language);
-
- process_die (cu->dies, cu);
-
- if (cu->language == language_go)
- fixup_go_packaging (cu);
-
- compute_delayed_physnames (cu);
- do_cleanups (delayed_list_cleanup);
-
- get_scope_pc_bounds (cu->dies, &lowpc, &highpc, cu);
- addr = gdbarch_adjust_dwarf2_addr (gdbarch, highpc + baseaddr);
- static_block = end_symtab_get_static_block (addr, 0, 1);
-
- dwarf2_record_block_ranges (cu->dies, static_block, baseaddr, cu);
- cust = end_symtab_from_static_block (static_block,
- SECT_OFF_TEXT (objfile), 0);
- if (cust != NULL)
- {
- int gcc_4_minor = producer_is_gcc_ge_4 (cu->producer);
-
- if (!(cu->language == language_c
- && COMPUNIT_FILETABS (cust)->language != language_c))
- COMPUNIT_FILETABS (cust)->language = cu->language;
-
- if (cu->has_loclist && gcc_4_minor >= 5)
- cust->locations_valid = 1;
- if (gcc_4_minor >= 5)
- cust->epilogue_unwind_valid = 1;
- cust->call_site_htab = cu->call_site_htab;
- }
- if (dwarf2_per_objfile->using_index)
- per_cu->v.quick->compunit_symtab = cust;
- else
- {
- struct partial_symtab *pst = per_cu->v.psymtab;
- pst->compunit_symtab = cust;
- pst->readin = 1;
- }
-
- VEC_safe_push (dwarf2_per_cu_ptr, dwarf2_per_objfile->just_read_cus, per_cu);
- do_cleanups (back_to);
- }
- static void
- process_full_type_unit (struct dwarf2_per_cu_data *per_cu,
- enum language pretend_language)
- {
- struct dwarf2_cu *cu = per_cu->cu;
- struct objfile *objfile = per_cu->objfile;
- struct compunit_symtab *cust;
- struct cleanup *back_to, *delayed_list_cleanup;
- struct signatured_type *sig_type;
- gdb_assert (per_cu->is_debug_types);
- sig_type = (struct signatured_type *) per_cu;
- buildsym_init ();
- back_to = make_cleanup (really_free_pendings, NULL);
- delayed_list_cleanup = make_cleanup (free_delayed_list, cu);
- cu->list_in_scope = &file_symbols;
- cu->language = pretend_language;
- cu->language_defn = language_def (cu->language);
-
- process_die (cu->dies, cu);
-
- if (cu->language == language_go)
- fixup_go_packaging (cu);
-
- compute_delayed_physnames (cu);
- do_cleanups (delayed_list_cleanup);
-
- if (sig_type->type_unit_group->compunit_symtab == NULL)
- {
- cust = end_expandable_symtab (0, SECT_OFF_TEXT (objfile));
- sig_type->type_unit_group->compunit_symtab = cust;
- if (cust != NULL)
- {
-
- if (!(cu->language == language_c
- && COMPUNIT_FILETABS (cust)->language != language_c))
- COMPUNIT_FILETABS (cust)->language = cu->language;
- }
- }
- else
- {
- augment_type_symtab ();
- cust = sig_type->type_unit_group->compunit_symtab;
- }
- if (dwarf2_per_objfile->using_index)
- per_cu->v.quick->compunit_symtab = cust;
- else
- {
- struct partial_symtab *pst = per_cu->v.psymtab;
- pst->compunit_symtab = cust;
- pst->readin = 1;
- }
- do_cleanups (back_to);
- }
- static void
- process_imported_unit_die (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct attribute *attr;
-
- if (cu->per_cu->is_debug_types)
- {
- error (_("Dwarf Error: DW_TAG_imported_unit is not"
- " supported in type units [in module %s]"),
- objfile_name (cu->objfile));
- }
- attr = dwarf2_attr (die, DW_AT_import, cu);
- if (attr != NULL)
- {
- struct dwarf2_per_cu_data *per_cu;
- struct symtab *imported_symtab;
- sect_offset offset;
- int is_dwz;
- offset = dwarf2_get_ref_die_offset (attr);
- is_dwz = (attr->form == DW_FORM_GNU_ref_alt || cu->per_cu->is_dwz);
- per_cu = dwarf2_find_containing_comp_unit (offset, is_dwz, cu->objfile);
-
- if (maybe_queue_comp_unit (cu, per_cu, cu->language))
- load_full_comp_unit (per_cu, cu->language);
- VEC_safe_push (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs,
- per_cu);
- }
- }
- static void
- reset_die_in_process (void *arg)
- {
- struct die_info *die = arg;
- die->in_process = 0;
- }
- static void
- process_die (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct cleanup *in_process;
-
- gdb_assert (!die->in_process);
- die->in_process = 1;
- in_process = make_cleanup (reset_die_in_process,die);
- switch (die->tag)
- {
- case DW_TAG_padding:
- break;
- case DW_TAG_compile_unit:
- case DW_TAG_partial_unit:
- read_file_scope (die, cu);
- break;
- case DW_TAG_type_unit:
- read_type_unit_scope (die, cu);
- break;
- case DW_TAG_subprogram:
- case DW_TAG_inlined_subroutine:
- read_func_scope (die, cu);
- break;
- case DW_TAG_lexical_block:
- case DW_TAG_try_block:
- case DW_TAG_catch_block:
- read_lexical_block_scope (die, cu);
- break;
- case DW_TAG_GNU_call_site:
- read_call_site_scope (die, cu);
- break;
- case DW_TAG_class_type:
- case DW_TAG_interface_type:
- case DW_TAG_structure_type:
- case DW_TAG_union_type:
- process_structure_scope (die, cu);
- break;
- case DW_TAG_enumeration_type:
- process_enumeration_scope (die, cu);
- break;
-
- case DW_TAG_subroutine_type:
- case DW_TAG_set_type:
- case DW_TAG_array_type:
- case DW_TAG_pointer_type:
- case DW_TAG_ptr_to_member_type:
- case DW_TAG_reference_type:
- case DW_TAG_string_type:
- break;
- case DW_TAG_base_type:
- case DW_TAG_subrange_type:
- case DW_TAG_typedef:
-
- new_symbol (die, read_type_die (die, cu), cu);
- break;
- case DW_TAG_common_block:
- read_common_block (die, cu);
- break;
- case DW_TAG_common_inclusion:
- break;
- case DW_TAG_namespace:
- cu->processing_has_namespace_info = 1;
- read_namespace (die, cu);
- break;
- case DW_TAG_module:
- cu->processing_has_namespace_info = 1;
- read_module (die, cu);
- break;
- case DW_TAG_imported_declaration:
- cu->processing_has_namespace_info = 1;
- if (read_namespace_alias (die, cu))
- break;
-
- case DW_TAG_imported_module:
- cu->processing_has_namespace_info = 1;
- if (die->child != NULL && (die->tag == DW_TAG_imported_declaration
- || cu->language != language_fortran))
- complaint (&symfile_complaints, _("Tag '%s' has unexpected children"),
- dwarf_tag_name (die->tag));
- read_import_statement (die, cu);
- break;
- case DW_TAG_imported_unit:
- process_imported_unit_die (die, cu);
- break;
- default:
- new_symbol (die, NULL, cu);
- break;
- }
- do_cleanups (in_process);
- }
- static int
- die_needs_namespace (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct attribute *attr;
- switch (die->tag)
- {
- case DW_TAG_namespace:
- case DW_TAG_typedef:
- case DW_TAG_class_type:
- case DW_TAG_interface_type:
- case DW_TAG_structure_type:
- case DW_TAG_union_type:
- case DW_TAG_enumeration_type:
- case DW_TAG_enumerator:
- case DW_TAG_subprogram:
- case DW_TAG_member:
- case DW_TAG_imported_declaration:
- return 1;
- case DW_TAG_variable:
- case DW_TAG_constant:
-
- if (dwarf2_attr (die, DW_AT_specification, cu))
- {
- struct dwarf2_cu *spec_cu = cu;
- return die_needs_namespace (die_specification (die, &spec_cu),
- spec_cu);
- }
- attr = dwarf2_attr (die, DW_AT_external, cu);
- if (attr == NULL && die->parent->tag != DW_TAG_namespace
- && die->parent->tag != DW_TAG_module)
- return 0;
-
- if (die->parent->tag == DW_TAG_lexical_block
- || die->parent->tag == DW_TAG_try_block
- || die->parent->tag == DW_TAG_catch_block
- || die->parent->tag == DW_TAG_subprogram)
- return 0;
- return 1;
- default:
- return 0;
- }
- }
- static void
- do_ui_file_peek_last (void *object, const char *buffer, long length)
- {
- char *last_char_p = (char *) object;
- if (length > 0)
- *last_char_p = buffer[length - 1];
- }
- static const char *
- dwarf2_compute_name (const char *name,
- struct die_info *die, struct dwarf2_cu *cu,
- int physname)
- {
- struct objfile *objfile = cu->objfile;
- if (name == NULL)
- name = dwarf2_name (die, cu);
-
- if (cu->language == language_ada
- || (cu->language == language_fortran && physname))
- {
-
- struct attribute *attr;
- attr = dwarf2_attr (die, DW_AT_linkage_name, cu);
- if (attr == NULL)
- attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu);
- if (attr && DW_STRING (attr))
- return DW_STRING (attr);
- }
-
- if (name != NULL
- && (cu->language == language_cplus || cu->language == language_java
- || cu->language == language_fortran))
- {
- if (die_needs_namespace (die, cu))
- {
- long length;
- const char *prefix;
- struct ui_file *buf;
- char *intermediate_name;
- const char *canonical_name = NULL;
- prefix = determine_prefix (die, cu);
- buf = mem_fileopen ();
- if (*prefix != '\0')
- {
- char *prefixed_name = typename_concat (NULL, prefix, name,
- physname, cu);
- fputs_unfiltered (prefixed_name, buf);
- xfree (prefixed_name);
- }
- else
- fputs_unfiltered (name, buf);
-
- if (cu->language == language_cplus && strchr (name, '<') == NULL)
- {
- struct attribute *attr;
- struct die_info *child;
- int first = 1;
- die->building_fullname = 1;
- for (child = die->child; child != NULL; child = child->sibling)
- {
- struct type *type;
- LONGEST value;
- const gdb_byte *bytes;
- struct dwarf2_locexpr_baton *baton;
- struct value *v;
- if (child->tag != DW_TAG_template_type_param
- && child->tag != DW_TAG_template_value_param)
- continue;
- if (first)
- {
- fputs_unfiltered ("<", buf);
- first = 0;
- }
- else
- fputs_unfiltered (", ", buf);
- attr = dwarf2_attr (child, DW_AT_type, cu);
- if (attr == NULL)
- {
- complaint (&symfile_complaints,
- _("template parameter missing DW_AT_type"));
- fputs_unfiltered ("UNKNOWN_TYPE", buf);
- continue;
- }
- type = die_type (child, cu);
- if (child->tag == DW_TAG_template_type_param)
- {
- c_print_type (type, "", buf, -1, 0, &type_print_raw_options);
- continue;
- }
- attr = dwarf2_attr (child, DW_AT_const_value, cu);
- if (attr == NULL)
- {
- complaint (&symfile_complaints,
- _("template parameter missing "
- "DW_AT_const_value"));
- fputs_unfiltered ("UNKNOWN_VALUE", buf);
- continue;
- }
- dwarf2_const_value_attr (attr, type, name,
- &cu->comp_unit_obstack, cu,
- &value, &bytes, &baton);
- if (TYPE_NOSIGN (type))
-
- c_printchar (value, type, buf);
- else
- {
- struct value_print_options opts;
- if (baton != NULL)
- v = dwarf2_evaluate_loc_desc (type, NULL,
- baton->data,
- baton->size,
- baton->per_cu);
- else if (bytes != NULL)
- {
- v = allocate_value (type);
- memcpy (value_contents_writeable (v), bytes,
- TYPE_LENGTH (type));
- }
- else
- v = value_from_longest (type, value);
-
- get_formatted_print_options (&opts, 'd');
- opts.raw = 1;
- value_print (v, buf, &opts);
- release_value (v);
- value_free (v);
- }
- }
- die->building_fullname = 0;
- if (!first)
- {
-
- char last_char = '\0';
- ui_file_put (buf, do_ui_file_peek_last, &last_char);
- if (last_char == '>')
- fputs_unfiltered (" >", buf);
- else
- fputs_unfiltered (">", buf);
- }
- }
-
- if (physname && die->tag == DW_TAG_subprogram
- && (cu->language == language_cplus
- || cu->language == language_java))
- {
- struct type *type = read_type_die (die, cu);
- c_type_print_args (type, buf, 1, cu->language,
- &type_print_raw_options);
- if (cu->language == language_java)
- {
-
- if (die->tag == DW_TAG_subprogram)
- java_print_type (TYPE_TARGET_TYPE (type), "", buf,
- 0, 0, &type_print_raw_options);
- }
- else if (cu->language == language_cplus)
- {
-
- if (TYPE_NFIELDS (type) > 0
- && TYPE_FIELD_ARTIFICIAL (type, 0)
- && TYPE_CODE (TYPE_FIELD_TYPE (type, 0)) == TYPE_CODE_PTR
- && TYPE_CONST (TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (type,
- 0))))
- fputs_unfiltered (" const", buf);
- }
- }
- intermediate_name = ui_file_xstrdup (buf, &length);
- ui_file_delete (buf);
- if (cu->language == language_cplus)
- canonical_name
- = dwarf2_canonicalize_name (intermediate_name, cu,
- &objfile->per_bfd->storage_obstack);
-
- if (canonical_name == NULL || canonical_name == intermediate_name)
- name = obstack_copy0 (&objfile->per_bfd->storage_obstack,
- intermediate_name,
- strlen (intermediate_name));
- else
- name = canonical_name;
- xfree (intermediate_name);
- }
- }
- return name;
- }
- static const char *
- dwarf2_full_name (const char *name, struct die_info *die, struct dwarf2_cu *cu)
- {
- return dwarf2_compute_name (name, die, cu, 0);
- }
- static const char *
- dwarf2_physname (const char *name, struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct attribute *attr;
- const char *retval, *mangled = NULL, *canon = NULL;
- struct cleanup *back_to;
- int need_copy = 1;
-
- if (!die_needs_namespace (die, cu))
- return dwarf2_compute_name (name, die, cu, 1);
- back_to = make_cleanup (null_cleanup, NULL);
- attr = dwarf2_attr (die, DW_AT_linkage_name, cu);
- if (!attr)
- attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu);
-
- if (attr && DW_STRING (attr))
- {
- char *demangled;
- mangled = DW_STRING (attr);
-
- if (cu->language == language_go)
- {
-
- demangled = NULL;
- }
- else
- {
- demangled = gdb_demangle (mangled,
- (DMGL_PARAMS | DMGL_ANSI
- | (cu->language == language_java
- ? DMGL_JAVA | DMGL_RET_POSTFIX
- : DMGL_RET_DROP)));
- }
- if (demangled)
- {
- make_cleanup (xfree, demangled);
- canon = demangled;
- }
- else
- {
- canon = mangled;
- need_copy = 0;
- }
- }
- if (canon == NULL || check_physname)
- {
- const char *physname = dwarf2_compute_name (name, die, cu, 1);
- if (canon != NULL && strcmp (physname, canon) != 0)
- {
-
- complaint (&symfile_complaints,
- _("Computed physname <%s> does not match demangled <%s> "
- "(from linkage <%s>) - DIE at 0x%x [in module %s]"),
- physname, canon, mangled, die->offset.sect_off,
- objfile_name (objfile));
-
- retval = canon;
- }
- else
- {
- retval = physname;
- need_copy = 0;
- }
- }
- else
- retval = canon;
- if (need_copy)
- retval = obstack_copy0 (&objfile->per_bfd->storage_obstack,
- retval, strlen (retval));
- do_cleanups (back_to);
- return retval;
- }
- static int
- read_namespace_alias (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct attribute *attr;
-
- attr = dwarf2_attr (die, DW_AT_name, cu);
- if (attr != NULL)
- {
- int num;
- struct die_info *d = die;
- struct dwarf2_cu *imported_cu = cu;
-
- #define MAX_NESTED_IMPORTED_DECLARATIONS 100
- for (num = 0; num < MAX_NESTED_IMPORTED_DECLARATIONS; ++num)
- {
- attr = dwarf2_attr (d, DW_AT_import, cu);
- if (attr == NULL)
- break;
- d = follow_die_ref (d, attr, &imported_cu);
- if (d->tag != DW_TAG_imported_declaration)
- break;
- }
- if (num == MAX_NESTED_IMPORTED_DECLARATIONS)
- {
- complaint (&symfile_complaints,
- _("DIE at 0x%x has too many recursively imported "
- "declarations"), d->offset.sect_off);
- return 0;
- }
- if (attr != NULL)
- {
- struct type *type;
- sect_offset offset = dwarf2_get_ref_die_offset (attr);
- type = get_die_type_at_offset (offset, cu->per_cu);
- if (type != NULL && TYPE_CODE (type) == TYPE_CODE_NAMESPACE)
- {
-
- new_symbol (die, type, cu);
- return 1;
- }
- }
- }
- return 0;
- }
- static void
- read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct attribute *import_attr;
- struct die_info *imported_die, *child_die;
- struct dwarf2_cu *imported_cu;
- const char *imported_name;
- const char *imported_name_prefix;
- const char *canonical_name;
- const char *import_alias;
- const char *imported_declaration = NULL;
- const char *import_prefix;
- VEC (const_char_ptr) *excludes = NULL;
- struct cleanup *cleanups;
- import_attr = dwarf2_attr (die, DW_AT_import, cu);
- if (import_attr == NULL)
- {
- complaint (&symfile_complaints, _("Tag '%s' has no DW_AT_import"),
- dwarf_tag_name (die->tag));
- return;
- }
- imported_cu = cu;
- imported_die = follow_die_ref_or_sig (die, import_attr, &imported_cu);
- imported_name = dwarf2_name (imported_die, imported_cu);
- if (imported_name == NULL)
- {
-
- return;
- }
-
- import_alias = dwarf2_name (die, cu);
-
- import_prefix = determine_prefix (die, cu);
-
- imported_name_prefix = determine_prefix (imported_die, imported_cu);
- if (imported_die->tag != DW_TAG_namespace
- && imported_die->tag != DW_TAG_module)
- {
- imported_declaration = imported_name;
- canonical_name = imported_name_prefix;
- }
- else if (strlen (imported_name_prefix) > 0)
- canonical_name = obconcat (&objfile->objfile_obstack,
- imported_name_prefix, "::", imported_name,
- (char *) NULL);
- else
- canonical_name = imported_name;
- cleanups = make_cleanup (VEC_cleanup (const_char_ptr), &excludes);
- if (die->tag == DW_TAG_imported_module && cu->language == language_fortran)
- for (child_die = die->child; child_die && child_die->tag;
- child_die = sibling_die (child_die))
- {
-
- if (child_die->tag != DW_TAG_imported_declaration)
- {
- complaint (&symfile_complaints,
- _("child DW_TAG_imported_declaration expected "
- "- DIE at 0x%x [in module %s]"),
- child_die->offset.sect_off, objfile_name (objfile));
- continue;
- }
- import_attr = dwarf2_attr (child_die, DW_AT_import, cu);
- if (import_attr == NULL)
- {
- complaint (&symfile_complaints, _("Tag '%s' has no DW_AT_import"),
- dwarf_tag_name (child_die->tag));
- continue;
- }
- imported_cu = cu;
- imported_die = follow_die_ref_or_sig (child_die, import_attr,
- &imported_cu);
- imported_name = dwarf2_name (imported_die, imported_cu);
- if (imported_name == NULL)
- {
- complaint (&symfile_complaints,
- _("child DW_TAG_imported_declaration has unknown "
- "imported name - DIE at 0x%x [in module %s]"),
- child_die->offset.sect_off, objfile_name (objfile));
- continue;
- }
- VEC_safe_push (const_char_ptr, excludes, imported_name);
- process_die (child_die, cu);
- }
- cp_add_using_directive (import_prefix,
- canonical_name,
- import_alias,
- imported_declaration,
- excludes,
- 0,
- &objfile->objfile_obstack);
- do_cleanups (cleanups);
- }
- static void
- free_cu_line_header (void *arg)
- {
- struct dwarf2_cu *cu = arg;
- free_line_header (cu->line_header);
- cu->line_header = NULL;
- }
- static int
- producer_is_gcc_lt_4_3 (struct dwarf2_cu *cu)
- {
- if (!cu->checked_producer)
- check_producer (cu);
- return cu->producer_is_gcc_lt_4_3;
- }
- static void
- find_file_and_directory (struct die_info *die, struct dwarf2_cu *cu,
- const char **name, const char **comp_dir)
- {
- struct attribute *attr;
- *name = NULL;
- *comp_dir = NULL;
-
- attr = dwarf2_attr (die, DW_AT_name, cu);
- if (attr)
- {
- *name = DW_STRING (attr);
- }
- attr = dwarf2_attr (die, DW_AT_comp_dir, cu);
- if (attr)
- *comp_dir = DW_STRING (attr);
- else if (producer_is_gcc_lt_4_3 (cu) && *name != NULL
- && IS_ABSOLUTE_PATH (*name))
- {
- char *d = ldirname (*name);
- *comp_dir = d;
- if (d != NULL)
- make_cleanup (xfree, d);
- }
- if (*comp_dir != NULL)
- {
-
- char *cp = strchr (*comp_dir, ':');
- if (cp && cp != *comp_dir && cp[-1] == '.' && cp[1] == '/')
- *comp_dir = cp + 1;
- }
- if (*name == NULL)
- *name = "<unknown>";
- }
- static void
- handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu,
- const char *comp_dir, CORE_ADDR lowpc)
- {
- struct attribute *attr;
- gdb_assert (! cu->per_cu->is_debug_types);
- attr = dwarf2_attr (die, DW_AT_stmt_list, cu);
- if (attr)
- {
- unsigned int line_offset = DW_UNSND (attr);
- struct line_header *line_header
- = dwarf_decode_line_header (line_offset, cu);
- if (line_header)
- {
- cu->line_header = line_header;
- make_cleanup (free_cu_line_header, cu);
- dwarf_decode_lines (line_header, comp_dir, cu, NULL, lowpc);
- }
- }
- }
- static void
- read_file_scope (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- struct cleanup *back_to = make_cleanup (null_cleanup, 0);
- CORE_ADDR lowpc = ((CORE_ADDR) -1);
- CORE_ADDR highpc = ((CORE_ADDR) 0);
- struct attribute *attr;
- const char *name = NULL;
- const char *comp_dir = NULL;
- struct die_info *child_die;
- bfd *abfd = objfile->obfd;
- CORE_ADDR baseaddr;
- baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
- get_scope_pc_bounds (die, &lowpc, &highpc, cu);
-
- if (lowpc == ((CORE_ADDR) -1))
- lowpc = highpc;
- lowpc = gdbarch_adjust_dwarf2_addr (gdbarch, lowpc + baseaddr);
- find_file_and_directory (die, cu, &name, &comp_dir);
- prepare_one_comp_unit (cu, die, cu->language);
-
- if (cu->producer && strstr (cu->producer, "IBM XL C for OpenCL") != NULL)
- cu->language = language_opencl;
-
- if (cu->producer && strstr (cu->producer, "GNU Go ") != NULL)
- set_cu_language (DW_LANG_Go, cu);
- dwarf2_start_symtab (cu, name, comp_dir, lowpc);
-
- handle_DW_AT_stmt_list (die, cu, comp_dir, lowpc);
-
- if (die->child != NULL)
- {
- child_die = die->child;
- while (child_die && child_die->tag)
- {
- process_die (child_die, cu);
- child_die = sibling_die (child_die);
- }
- }
-
- attr = dwarf2_attr (die, DW_AT_GNU_macros, cu);
- if (attr && cu->line_header)
- {
- if (dwarf2_attr (die, DW_AT_macro_info, cu))
- complaint (&symfile_complaints,
- _("CU refers to both DW_AT_GNU_macros and DW_AT_macro_info"));
- dwarf_decode_macros (cu, DW_UNSND (attr), 1);
- }
- else
- {
- attr = dwarf2_attr (die, DW_AT_macro_info, cu);
- if (attr && cu->line_header)
- {
- unsigned int macro_offset = DW_UNSND (attr);
- dwarf_decode_macros (cu, macro_offset, 0);
- }
- }
- do_cleanups (back_to);
- }
- static void
- setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwarf2_per_cu_data *per_cu = cu->per_cu;
- struct type_unit_group *tu_group;
- int first_time;
- struct line_header *lh;
- struct attribute *attr;
- unsigned int i, line_offset;
- struct signatured_type *sig_type;
- gdb_assert (per_cu->is_debug_types);
- sig_type = (struct signatured_type *) per_cu;
- attr = dwarf2_attr (die, DW_AT_stmt_list, cu);
-
- if (sig_type->type_unit_group == NULL)
- sig_type->type_unit_group = get_type_unit_group (cu, attr);
- tu_group = sig_type->type_unit_group;
-
- first_time = tu_group->compunit_symtab == NULL;
-
- lh = NULL;
- if (attr != NULL)
- {
- line_offset = DW_UNSND (attr);
- lh = dwarf_decode_line_header (line_offset, cu);
- }
- if (lh == NULL)
- {
- if (first_time)
- dwarf2_start_symtab (cu, "", NULL, 0);
- else
- {
- gdb_assert (tu_group->symtabs == NULL);
- restart_symtab (tu_group->compunit_symtab, "", 0);
- }
- return;
- }
- cu->line_header = lh;
- make_cleanup (free_cu_line_header, cu);
- if (first_time)
- {
- struct compunit_symtab *cust = dwarf2_start_symtab (cu, "", NULL, 0);
- tu_group->num_symtabs = lh->num_file_names;
- tu_group->symtabs = XNEWVEC (struct symtab *, lh->num_file_names);
- for (i = 0; i < lh->num_file_names; ++i)
- {
- const char *dir = NULL;
- struct file_entry *fe = &lh->file_names[i];
- if (fe->dir_index)
- dir = lh->include_dirs[fe->dir_index - 1];
- dwarf2_start_subfile (fe->name, dir);
- if (current_subfile->symtab == NULL)
- {
-
- current_subfile->symtab
- = allocate_symtab (cust, current_subfile->name);
- }
- fe->symtab = current_subfile->symtab;
- tu_group->symtabs[i] = fe->symtab;
- }
- }
- else
- {
- restart_symtab (tu_group->compunit_symtab, "", 0);
- for (i = 0; i < lh->num_file_names; ++i)
- {
- struct file_entry *fe = &lh->file_names[i];
- fe->symtab = tu_group->symtabs[i];
- }
- }
-
- }
- static void
- read_type_unit_scope (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct die_info *child_die;
- prepare_one_comp_unit (cu, die, language_minimal);
-
- setup_type_unit_groups (die, cu);
- if (die->child != NULL)
- {
- child_die = die->child;
- while (child_die && child_die->tag)
- {
- process_die (child_die, cu);
- child_die = sibling_die (child_die);
- }
- }
- }
- static hashval_t
- hash_dwo_file (const void *item)
- {
- const struct dwo_file *dwo_file = item;
- hashval_t hash;
- hash = htab_hash_string (dwo_file->dwo_name);
- if (dwo_file->comp_dir != NULL)
- hash += htab_hash_string (dwo_file->comp_dir);
- return hash;
- }
- static int
- eq_dwo_file (const void *item_lhs, const void *item_rhs)
- {
- const struct dwo_file *lhs = item_lhs;
- const struct dwo_file *rhs = item_rhs;
- if (strcmp (lhs->dwo_name, rhs->dwo_name) != 0)
- return 0;
- if (lhs->comp_dir == NULL || rhs->comp_dir == NULL)
- return lhs->comp_dir == rhs->comp_dir;
- return strcmp (lhs->comp_dir, rhs->comp_dir) == 0;
- }
- static htab_t
- allocate_dwo_file_hash_table (void)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- return htab_create_alloc_ex (41,
- hash_dwo_file,
- eq_dwo_file,
- NULL,
- &objfile->objfile_obstack,
- hashtab_obstack_allocate,
- dummy_obstack_deallocate);
- }
- static void **
- lookup_dwo_file_slot (const char *dwo_name, const char *comp_dir)
- {
- struct dwo_file find_entry;
- void **slot;
- if (dwarf2_per_objfile->dwo_files == NULL)
- dwarf2_per_objfile->dwo_files = allocate_dwo_file_hash_table ();
- memset (&find_entry, 0, sizeof (find_entry));
- find_entry.dwo_name = dwo_name;
- find_entry.comp_dir = comp_dir;
- slot = htab_find_slot (dwarf2_per_objfile->dwo_files, &find_entry, INSERT);
- return slot;
- }
- static hashval_t
- hash_dwo_unit (const void *item)
- {
- const struct dwo_unit *dwo_unit = item;
-
- return dwo_unit->signature;
- }
- static int
- eq_dwo_unit (const void *item_lhs, const void *item_rhs)
- {
- const struct dwo_unit *lhs = item_lhs;
- const struct dwo_unit *rhs = item_rhs;
-
- return lhs->signature == rhs->signature;
- }
- static htab_t
- allocate_dwo_unit_table (struct objfile *objfile)
- {
-
- return htab_create_alloc_ex (3,
- hash_dwo_unit,
- eq_dwo_unit,
- NULL,
- &objfile->objfile_obstack,
- hashtab_obstack_allocate,
- dummy_obstack_deallocate);
- }
- struct create_dwo_cu_data
- {
- struct dwo_file *dwo_file;
- struct dwo_unit dwo_unit;
- };
- static void
- create_dwo_cu_reader (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr,
- struct die_info *comp_unit_die,
- int has_children,
- void *datap)
- {
- struct dwarf2_cu *cu = reader->cu;
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- sect_offset offset = cu->per_cu->offset;
- struct dwarf2_section_info *section = cu->per_cu->section;
- struct create_dwo_cu_data *data = datap;
- struct dwo_file *dwo_file = data->dwo_file;
- struct dwo_unit *dwo_unit = &data->dwo_unit;
- struct attribute *attr;
- attr = dwarf2_attr (comp_unit_die, DW_AT_GNU_dwo_id, cu);
- if (attr == NULL)
- {
- complaint (&symfile_complaints,
- _("Dwarf Error: debug entry at offset 0x%x is missing"
- " its dwo_id [in module %s]"),
- offset.sect_off, dwo_file->dwo_name);
- return;
- }
- dwo_unit->dwo_file = dwo_file;
- dwo_unit->signature = DW_UNSND (attr);
- dwo_unit->section = section;
- dwo_unit->offset = offset;
- dwo_unit->length = cu->per_cu->length;
- if (dwarf2_read_debug)
- fprintf_unfiltered (gdb_stdlog, " offset 0x%x, dwo_id %s\n",
- offset.sect_off, hex_string (dwo_unit->signature));
- }
- static struct dwo_unit *
- create_dwo_cu (struct dwo_file *dwo_file)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwarf2_section_info *section = &dwo_file->sections.info;
- bfd *abfd;
- htab_t cu_htab;
- const gdb_byte *info_ptr, *end_ptr;
- struct create_dwo_cu_data create_dwo_cu_data;
- struct dwo_unit *dwo_unit;
- dwarf2_read_section (objfile, section);
- info_ptr = section->buffer;
- if (info_ptr == NULL)
- return NULL;
-
- abfd = get_section_bfd_owner (section);
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog, "Reading %s for %s:\n",
- get_section_name (section),
- get_section_file_name (section));
- }
- create_dwo_cu_data.dwo_file = dwo_file;
- dwo_unit = NULL;
- end_ptr = info_ptr + section->size;
- while (info_ptr < end_ptr)
- {
- struct dwarf2_per_cu_data per_cu;
- memset (&create_dwo_cu_data.dwo_unit, 0,
- sizeof (create_dwo_cu_data.dwo_unit));
- memset (&per_cu, 0, sizeof (per_cu));
- per_cu.objfile = objfile;
- per_cu.is_debug_types = 0;
- per_cu.offset.sect_off = info_ptr - section->buffer;
- per_cu.section = section;
- init_cutu_and_read_dies_no_follow (&per_cu, dwo_file,
- create_dwo_cu_reader,
- &create_dwo_cu_data);
- if (create_dwo_cu_data.dwo_unit.dwo_file != NULL)
- {
-
- if (dwo_unit != NULL)
- {
- complaint (&symfile_complaints,
- _("Multiple CUs in DWO file %s [in module %s]"),
- dwo_file->dwo_name, objfile_name (objfile));
- break;
- }
- dwo_unit = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_unit);
- *dwo_unit = create_dwo_cu_data.dwo_unit;
- }
- info_ptr += per_cu.length;
- }
- return dwo_unit;
- }
- static struct dwp_hash_table *
- create_dwp_hash_table (struct dwp_file *dwp_file, int is_debug_types)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- bfd *dbfd = dwp_file->dbfd;
- const gdb_byte *index_ptr, *index_end;
- struct dwarf2_section_info *index;
- uint32_t version, nr_columns, nr_units, nr_slots;
- struct dwp_hash_table *htab;
- if (is_debug_types)
- index = &dwp_file->sections.tu_index;
- else
- index = &dwp_file->sections.cu_index;
- if (dwarf2_section_empty_p (index))
- return NULL;
- dwarf2_read_section (objfile, index);
- index_ptr = index->buffer;
- index_end = index_ptr + index->size;
- version = read_4_bytes (dbfd, index_ptr);
- index_ptr += 4;
- if (version == 2)
- nr_columns = read_4_bytes (dbfd, index_ptr);
- else
- nr_columns = 0;
- index_ptr += 4;
- nr_units = read_4_bytes (dbfd, index_ptr);
- index_ptr += 4;
- nr_slots = read_4_bytes (dbfd, index_ptr);
- index_ptr += 4;
- if (version != 1 && version != 2)
- {
- error (_("Dwarf Error: unsupported DWP file version (%s)"
- " [in module %s]"),
- pulongest (version), dwp_file->name);
- }
- if (nr_slots != (nr_slots & -nr_slots))
- {
- error (_("Dwarf Error: number of slots in DWP hash table (%s)"
- " is not power of 2 [in module %s]"),
- pulongest (nr_slots), dwp_file->name);
- }
- htab = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwp_hash_table);
- htab->version = version;
- htab->nr_columns = nr_columns;
- htab->nr_units = nr_units;
- htab->nr_slots = nr_slots;
- htab->hash_table = index_ptr;
- htab->unit_table = htab->hash_table + sizeof (uint64_t) * nr_slots;
-
- if (nr_slots == 0 || nr_units == 0
- || (version == 2 && nr_columns == 0))
- {
-
- if (nr_slots != 0 || nr_units != 0
- || (version == 2 && nr_columns != 0))
- {
- complaint (&symfile_complaints,
- _("Empty DWP but nr_slots,nr_units,nr_columns not"
- " all zero [in modules %s]"),
- dwp_file->name);
- }
- return htab;
- }
- if (version == 1)
- {
- htab->section_pool.v1.indices =
- htab->unit_table + sizeof (uint32_t) * nr_slots;
-
- }
- else
- {
- const gdb_byte *ids_ptr = htab->unit_table + sizeof (uint32_t) * nr_slots;
- int *ids = htab->section_pool.v2.section_ids;
-
- int ids_seen[DW_SECT_MAX + 1];
- int i;
- if (nr_columns < 2)
- {
- error (_("Dwarf Error: bad DWP hash table, too few columns"
- " in section table [in module %s]"),
- dwp_file->name);
- }
- if (nr_columns > MAX_NR_V2_DWO_SECTIONS)
- {
- error (_("Dwarf Error: bad DWP hash table, too many columns"
- " in section table [in module %s]"),
- dwp_file->name);
- }
- memset (ids, 255, (DW_SECT_MAX + 1) * sizeof (int32_t));
- memset (ids_seen, 255, (DW_SECT_MAX + 1) * sizeof (int32_t));
- for (i = 0; i < nr_columns; ++i)
- {
- int id = read_4_bytes (dbfd, ids_ptr + i * sizeof (uint32_t));
- if (id < DW_SECT_MIN || id > DW_SECT_MAX)
- {
- error (_("Dwarf Error: bad DWP hash table, bad section id %d"
- " in section table [in module %s]"),
- id, dwp_file->name);
- }
- if (ids_seen[id] != -1)
- {
- error (_("Dwarf Error: bad DWP hash table, duplicate section"
- " id %d in section table [in module %s]"),
- id, dwp_file->name);
- }
- ids_seen[id] = i;
- ids[i] = id;
- }
-
- if (((ids_seen[DW_SECT_INFO] != -1)
- + (ids_seen[DW_SECT_TYPES] != -1))
- != 1)
- {
- error (_("Dwarf Error: bad DWP hash table, missing/duplicate"
- " DWO info/types section [in module %s]"),
- dwp_file->name);
- }
-
- if (ids_seen[DW_SECT_ABBREV] == -1)
- {
- error (_("Dwarf Error: bad DWP hash table, missing DWO abbrev"
- " section [in module %s]"),
- dwp_file->name);
- }
- htab->section_pool.v2.offsets = ids_ptr + sizeof (uint32_t) * nr_columns;
- htab->section_pool.v2.sizes =
- htab->section_pool.v2.offsets + (sizeof (uint32_t)
- * nr_units * nr_columns);
- if ((htab->section_pool.v2.sizes + (sizeof (uint32_t)
- * nr_units * nr_columns))
- > index_end)
- {
- error (_("Dwarf Error: DWP index section is corrupt (too small)"
- " [in module %s]"),
- dwp_file->name);
- }
- }
- return htab;
- }
- static int
- locate_v1_virtual_dwo_sections (asection *sectp,
- struct virtual_v1_dwo_sections *sections)
- {
- const struct dwop_section_names *names = &dwop_section_names;
- if (section_is_p (sectp->name, &names->abbrev_dwo))
- {
-
- if (sections->abbrev.s.asection != NULL)
- return 0;
- sections->abbrev.s.asection = sectp;
- sections->abbrev.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->info_dwo)
- || section_is_p (sectp->name, &names->types_dwo))
- {
-
- if (sections->info_or_types.s.asection != NULL)
- return 0;
- sections->info_or_types.s.asection = sectp;
- sections->info_or_types.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->line_dwo))
- {
-
- if (sections->line.s.asection != NULL)
- return 0;
- sections->line.s.asection = sectp;
- sections->line.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->loc_dwo))
- {
-
- if (sections->loc.s.asection != NULL)
- return 0;
- sections->loc.s.asection = sectp;
- sections->loc.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->macinfo_dwo))
- {
-
- if (sections->macinfo.s.asection != NULL)
- return 0;
- sections->macinfo.s.asection = sectp;
- sections->macinfo.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->macro_dwo))
- {
-
- if (sections->macro.s.asection != NULL)
- return 0;
- sections->macro.s.asection = sectp;
- sections->macro.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->str_offsets_dwo))
- {
-
- if (sections->str_offsets.s.asection != NULL)
- return 0;
- sections->str_offsets.s.asection = sectp;
- sections->str_offsets.size = bfd_get_section_size (sectp);
- }
- else
- {
-
- return 0;
- }
- return 1;
- }
- static struct dwo_unit *
- create_dwo_unit_in_dwp_v1 (struct dwp_file *dwp_file,
- uint32_t unit_index,
- const char *comp_dir,
- ULONGEST signature, int is_debug_types)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- const struct dwp_hash_table *dwp_htab =
- is_debug_types ? dwp_file->tus : dwp_file->cus;
- bfd *dbfd = dwp_file->dbfd;
- const char *kind = is_debug_types ? "TU" : "CU";
- struct dwo_file *dwo_file;
- struct dwo_unit *dwo_unit;
- struct virtual_v1_dwo_sections sections;
- void **dwo_file_slot;
- char *virtual_dwo_name;
- struct dwarf2_section_info *cutu;
- struct cleanup *cleanups;
- int i;
- gdb_assert (dwp_file->version == 1);
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog, "Reading %s %s/%s in DWP V1 file: %s\n",
- kind,
- pulongest (unit_index), hex_string (signature),
- dwp_file->name);
- }
-
- #define MAX_NR_V1_DWO_SECTIONS \
- (1 \
- + 1 \
- + 1 \
- + 1 \
- + 1 \
- + 1 \
- + 1 )
- memset (§ions, 0, sizeof (sections));
- cleanups = make_cleanup (null_cleanup, 0);
- for (i = 0; i < MAX_NR_V1_DWO_SECTIONS; ++i)
- {
- asection *sectp;
- uint32_t section_nr =
- read_4_bytes (dbfd,
- dwp_htab->section_pool.v1.indices
- + (unit_index + i) * sizeof (uint32_t));
- if (section_nr == 0)
- break;
- if (section_nr >= dwp_file->num_sections)
- {
- error (_("Dwarf Error: bad DWP hash table, section number too large"
- " [in module %s]"),
- dwp_file->name);
- }
- sectp = dwp_file->elf_sections[section_nr];
- if (! locate_v1_virtual_dwo_sections (sectp, §ions))
- {
- error (_("Dwarf Error: bad DWP hash table, invalid section found"
- " [in module %s]"),
- dwp_file->name);
- }
- }
- if (i < 2
- || dwarf2_section_empty_p (§ions.info_or_types)
- || dwarf2_section_empty_p (§ions.abbrev))
- {
- error (_("Dwarf Error: bad DWP hash table, missing DWO sections"
- " [in module %s]"),
- dwp_file->name);
- }
- if (i == MAX_NR_V1_DWO_SECTIONS)
- {
- error (_("Dwarf Error: bad DWP hash table, too many DWO sections"
- " [in module %s]"),
- dwp_file->name);
- }
-
- virtual_dwo_name =
- xstrprintf ("virtual-dwo/%d-%d-%d-%d",
- get_section_id (§ions.abbrev),
- get_section_id (§ions.line),
- get_section_id (§ions.loc),
- get_section_id (§ions.str_offsets));
- make_cleanup (xfree, virtual_dwo_name);
-
- dwo_file_slot = lookup_dwo_file_slot (virtual_dwo_name, comp_dir);
-
- if (*dwo_file_slot == NULL)
- {
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog, "Creating virtual DWO: %s\n",
- virtual_dwo_name);
- }
- dwo_file = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_file);
- dwo_file->dwo_name = obstack_copy0 (&objfile->objfile_obstack,
- virtual_dwo_name,
- strlen (virtual_dwo_name));
- dwo_file->comp_dir = comp_dir;
- dwo_file->sections.abbrev = sections.abbrev;
- dwo_file->sections.line = sections.line;
- dwo_file->sections.loc = sections.loc;
- dwo_file->sections.macinfo = sections.macinfo;
- dwo_file->sections.macro = sections.macro;
- dwo_file->sections.str_offsets = sections.str_offsets;
-
- dwo_file->sections.str = dwp_file->sections.str;
-
- *dwo_file_slot = dwo_file;
- }
- else
- {
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog, "Using existing virtual DWO: %s\n",
- virtual_dwo_name);
- }
- dwo_file = *dwo_file_slot;
- }
- do_cleanups (cleanups);
- dwo_unit = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_unit);
- dwo_unit->dwo_file = dwo_file;
- dwo_unit->signature = signature;
- dwo_unit->section = obstack_alloc (&objfile->objfile_obstack,
- sizeof (struct dwarf2_section_info));
- *dwo_unit->section = sections.info_or_types;
-
- return dwo_unit;
- }
- static struct dwarf2_section_info
- create_dwp_v2_section (struct dwarf2_section_info *section,
- bfd_size_type offset, bfd_size_type size)
- {
- struct dwarf2_section_info result;
- asection *sectp;
- gdb_assert (section != NULL);
- gdb_assert (!section->is_virtual);
- memset (&result, 0, sizeof (result));
- result.s.containing_section = section;
- result.is_virtual = 1;
- if (size == 0)
- return result;
- sectp = get_section_bfd_section (section);
-
- if (sectp == NULL
- || offset + size > bfd_get_section_size (sectp))
- {
- bfd *abfd = sectp->owner;
- error (_("Dwarf Error: Bad DWP V2 section info, doesn't fit"
- " in section %s [in module %s]"),
- sectp ? bfd_section_name (abfd, sectp) : "<unknown>",
- objfile_name (dwarf2_per_objfile->objfile));
- }
- result.virtual_offset = offset;
- result.size = size;
- return result;
- }
- static struct dwo_unit *
- create_dwo_unit_in_dwp_v2 (struct dwp_file *dwp_file,
- uint32_t unit_index,
- const char *comp_dir,
- ULONGEST signature, int is_debug_types)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- const struct dwp_hash_table *dwp_htab =
- is_debug_types ? dwp_file->tus : dwp_file->cus;
- bfd *dbfd = dwp_file->dbfd;
- const char *kind = is_debug_types ? "TU" : "CU";
- struct dwo_file *dwo_file;
- struct dwo_unit *dwo_unit;
- struct virtual_v2_dwo_sections sections;
- void **dwo_file_slot;
- char *virtual_dwo_name;
- struct dwarf2_section_info *cutu;
- struct cleanup *cleanups;
- int i;
- gdb_assert (dwp_file->version == 2);
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog, "Reading %s %s/%s in DWP V2 file: %s\n",
- kind,
- pulongest (unit_index), hex_string (signature),
- dwp_file->name);
- }
-
- memset (§ions, 0, sizeof (sections));
- cleanups = make_cleanup (null_cleanup, 0);
- for (i = 0; i < dwp_htab->nr_columns; ++i)
- {
- uint32_t offset = read_4_bytes (dbfd,
- dwp_htab->section_pool.v2.offsets
- + (((unit_index - 1) * dwp_htab->nr_columns
- + i)
- * sizeof (uint32_t)));
- uint32_t size = read_4_bytes (dbfd,
- dwp_htab->section_pool.v2.sizes
- + (((unit_index - 1) * dwp_htab->nr_columns
- + i)
- * sizeof (uint32_t)));
- switch (dwp_htab->section_pool.v2.section_ids[i])
- {
- case DW_SECT_INFO:
- case DW_SECT_TYPES:
- sections.info_or_types_offset = offset;
- sections.info_or_types_size = size;
- break;
- case DW_SECT_ABBREV:
- sections.abbrev_offset = offset;
- sections.abbrev_size = size;
- break;
- case DW_SECT_LINE:
- sections.line_offset = offset;
- sections.line_size = size;
- break;
- case DW_SECT_LOC:
- sections.loc_offset = offset;
- sections.loc_size = size;
- break;
- case DW_SECT_STR_OFFSETS:
- sections.str_offsets_offset = offset;
- sections.str_offsets_size = size;
- break;
- case DW_SECT_MACINFO:
- sections.macinfo_offset = offset;
- sections.macinfo_size = size;
- break;
- case DW_SECT_MACRO:
- sections.macro_offset = offset;
- sections.macro_size = size;
- break;
- }
- }
-
- virtual_dwo_name =
- xstrprintf ("virtual-dwo/%ld-%ld-%ld-%ld",
- (long) (sections.abbrev_size ? sections.abbrev_offset : 0),
- (long) (sections.line_size ? sections.line_offset : 0),
- (long) (sections.loc_size ? sections.loc_offset : 0),
- (long) (sections.str_offsets_size
- ? sections.str_offsets_offset : 0));
- make_cleanup (xfree, virtual_dwo_name);
-
- dwo_file_slot = lookup_dwo_file_slot (virtual_dwo_name, comp_dir);
-
- if (*dwo_file_slot == NULL)
- {
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog, "Creating virtual DWO: %s\n",
- virtual_dwo_name);
- }
- dwo_file = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_file);
- dwo_file->dwo_name = obstack_copy0 (&objfile->objfile_obstack,
- virtual_dwo_name,
- strlen (virtual_dwo_name));
- dwo_file->comp_dir = comp_dir;
- dwo_file->sections.abbrev =
- create_dwp_v2_section (&dwp_file->sections.abbrev,
- sections.abbrev_offset, sections.abbrev_size);
- dwo_file->sections.line =
- create_dwp_v2_section (&dwp_file->sections.line,
- sections.line_offset, sections.line_size);
- dwo_file->sections.loc =
- create_dwp_v2_section (&dwp_file->sections.loc,
- sections.loc_offset, sections.loc_size);
- dwo_file->sections.macinfo =
- create_dwp_v2_section (&dwp_file->sections.macinfo,
- sections.macinfo_offset, sections.macinfo_size);
- dwo_file->sections.macro =
- create_dwp_v2_section (&dwp_file->sections.macro,
- sections.macro_offset, sections.macro_size);
- dwo_file->sections.str_offsets =
- create_dwp_v2_section (&dwp_file->sections.str_offsets,
- sections.str_offsets_offset,
- sections.str_offsets_size);
-
- dwo_file->sections.str = dwp_file->sections.str;
-
- *dwo_file_slot = dwo_file;
- }
- else
- {
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog, "Using existing virtual DWO: %s\n",
- virtual_dwo_name);
- }
- dwo_file = *dwo_file_slot;
- }
- do_cleanups (cleanups);
- dwo_unit = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_unit);
- dwo_unit->dwo_file = dwo_file;
- dwo_unit->signature = signature;
- dwo_unit->section = obstack_alloc (&objfile->objfile_obstack,
- sizeof (struct dwarf2_section_info));
- *dwo_unit->section = create_dwp_v2_section (is_debug_types
- ? &dwp_file->sections.types
- : &dwp_file->sections.info,
- sections.info_or_types_offset,
- sections.info_or_types_size);
-
- return dwo_unit;
- }
- static struct dwo_unit *
- lookup_dwo_unit_in_dwp (struct dwp_file *dwp_file, const char *comp_dir,
- ULONGEST signature, int is_debug_types)
- {
- const struct dwp_hash_table *dwp_htab =
- is_debug_types ? dwp_file->tus : dwp_file->cus;
- bfd *dbfd = dwp_file->dbfd;
- uint32_t mask = dwp_htab->nr_slots - 1;
- uint32_t hash = signature & mask;
- uint32_t hash2 = ((signature >> 32) & mask) | 1;
- unsigned int i;
- void **slot;
- struct dwo_unit find_dwo_cu, *dwo_cu;
- memset (&find_dwo_cu, 0, sizeof (find_dwo_cu));
- find_dwo_cu.signature = signature;
- slot = htab_find_slot (is_debug_types
- ? dwp_file->loaded_tus
- : dwp_file->loaded_cus,
- &find_dwo_cu, INSERT);
- if (*slot != NULL)
- return *slot;
-
- for (i = 0; i < dwp_htab->nr_slots; ++i)
- {
- ULONGEST signature_in_table;
- signature_in_table =
- read_8_bytes (dbfd, dwp_htab->hash_table + hash * sizeof (uint64_t));
- if (signature_in_table == signature)
- {
- uint32_t unit_index =
- read_4_bytes (dbfd,
- dwp_htab->unit_table + hash * sizeof (uint32_t));
- if (dwp_file->version == 1)
- {
- *slot = create_dwo_unit_in_dwp_v1 (dwp_file, unit_index,
- comp_dir, signature,
- is_debug_types);
- }
- else
- {
- *slot = create_dwo_unit_in_dwp_v2 (dwp_file, unit_index,
- comp_dir, signature,
- is_debug_types);
- }
- return *slot;
- }
- if (signature_in_table == 0)
- return NULL;
- hash = (hash + hash2) & mask;
- }
- error (_("Dwarf Error: bad DWP hash table, lookup didn't terminate"
- " [in module %s]"),
- dwp_file->name);
- }
- static bfd *
- try_open_dwop_file (const char *file_name, int is_dwp, int search_cwd)
- {
- bfd *sym_bfd;
- int desc, flags;
- char *absolute_name;
-
- char *search_path;
- static const char dirname_separator_string[] = { DIRNAME_SEPARATOR, '\0' };
- if (search_cwd)
- {
- if (*debug_file_directory != '\0')
- search_path = concat (".", dirname_separator_string,
- debug_file_directory, NULL);
- else
- search_path = xstrdup (".");
- }
- else
- search_path = xstrdup (debug_file_directory);
- flags = OPF_RETURN_REALPATH;
- if (is_dwp)
- flags |= OPF_SEARCH_IN_PATH;
- desc = openp (search_path, flags, file_name,
- O_RDONLY | O_BINARY, &absolute_name);
- xfree (search_path);
- if (desc < 0)
- return NULL;
- sym_bfd = gdb_bfd_open (absolute_name, gnutarget, desc);
- xfree (absolute_name);
- if (sym_bfd == NULL)
- return NULL;
- bfd_set_cacheable (sym_bfd, 1);
- if (!bfd_check_format (sym_bfd, bfd_object))
- {
- gdb_bfd_unref (sym_bfd);
- return NULL;
- }
-
- gdb_bfd_record_inclusion (dwarf2_per_objfile->objfile->obfd, sym_bfd);
- return sym_bfd;
- }
- static bfd *
- open_dwo_file (const char *file_name, const char *comp_dir)
- {
- bfd *abfd;
- if (IS_ABSOLUTE_PATH (file_name))
- return try_open_dwop_file (file_name, 0 , 0 );
-
- if (comp_dir != NULL)
- {
- char *path_to_try = concat (comp_dir, SLASH_STRING, file_name, NULL);
-
- abfd = try_open_dwop_file (path_to_try, 0 , 1 );
- xfree (path_to_try);
- if (abfd != NULL)
- return abfd;
- }
-
- if (*debug_file_directory == '\0')
- return NULL;
- return try_open_dwop_file (file_name, 0 , 1 );
- }
- static void
- dwarf2_locate_dwo_sections (bfd *abfd, asection *sectp, void *dwo_sections_ptr)
- {
- struct dwo_sections *dwo_sections = dwo_sections_ptr;
- const struct dwop_section_names *names = &dwop_section_names;
- if (section_is_p (sectp->name, &names->abbrev_dwo))
- {
- dwo_sections->abbrev.s.asection = sectp;
- dwo_sections->abbrev.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->info_dwo))
- {
- dwo_sections->info.s.asection = sectp;
- dwo_sections->info.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->line_dwo))
- {
- dwo_sections->line.s.asection = sectp;
- dwo_sections->line.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->loc_dwo))
- {
- dwo_sections->loc.s.asection = sectp;
- dwo_sections->loc.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->macinfo_dwo))
- {
- dwo_sections->macinfo.s.asection = sectp;
- dwo_sections->macinfo.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->macro_dwo))
- {
- dwo_sections->macro.s.asection = sectp;
- dwo_sections->macro.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->str_dwo))
- {
- dwo_sections->str.s.asection = sectp;
- dwo_sections->str.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->str_offsets_dwo))
- {
- dwo_sections->str_offsets.s.asection = sectp;
- dwo_sections->str_offsets.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->types_dwo))
- {
- struct dwarf2_section_info type_section;
- memset (&type_section, 0, sizeof (type_section));
- type_section.s.asection = sectp;
- type_section.size = bfd_get_section_size (sectp);
- VEC_safe_push (dwarf2_section_info_def, dwo_sections->types,
- &type_section);
- }
- }
- static struct dwo_file *
- open_and_init_dwo_file (struct dwarf2_per_cu_data *per_cu,
- const char *dwo_name, const char *comp_dir)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwo_file *dwo_file;
- bfd *dbfd;
- struct cleanup *cleanups;
- dbfd = open_dwo_file (dwo_name, comp_dir);
- if (dbfd == NULL)
- {
- if (dwarf2_read_debug)
- fprintf_unfiltered (gdb_stdlog, "DWO file not found: %s\n", dwo_name);
- return NULL;
- }
- dwo_file = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwo_file);
- dwo_file->dwo_name = dwo_name;
- dwo_file->comp_dir = comp_dir;
- dwo_file->dbfd = dbfd;
- cleanups = make_cleanup (free_dwo_file_cleanup, dwo_file);
- bfd_map_over_sections (dbfd, dwarf2_locate_dwo_sections, &dwo_file->sections);
- dwo_file->cu = create_dwo_cu (dwo_file);
- dwo_file->tus = create_debug_types_hash_table (dwo_file,
- dwo_file->sections.types);
- discard_cleanups (cleanups);
- if (dwarf2_read_debug)
- fprintf_unfiltered (gdb_stdlog, "DWO file found: %s\n", dwo_name);
- return dwo_file;
- }
- static void
- dwarf2_locate_common_dwp_sections (bfd *abfd, asection *sectp,
- void *dwp_file_ptr)
- {
- struct dwp_file *dwp_file = dwp_file_ptr;
- const struct dwop_section_names *names = &dwop_section_names;
- unsigned int elf_section_nr = elf_section_data (sectp)->this_idx;
-
- gdb_assert (elf_section_nr < dwp_file->num_sections);
- dwp_file->elf_sections[elf_section_nr] = sectp;
-
- if (section_is_p (sectp->name, &names->str_dwo))
- {
- dwp_file->sections.str.s.asection = sectp;
- dwp_file->sections.str.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->cu_index))
- {
- dwp_file->sections.cu_index.s.asection = sectp;
- dwp_file->sections.cu_index.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->tu_index))
- {
- dwp_file->sections.tu_index.s.asection = sectp;
- dwp_file->sections.tu_index.size = bfd_get_section_size (sectp);
- }
- }
- static void
- dwarf2_locate_v2_dwp_sections (bfd *abfd, asection *sectp, void *dwp_file_ptr)
- {
- struct dwp_file *dwp_file = dwp_file_ptr;
- const struct dwop_section_names *names = &dwop_section_names;
- unsigned int elf_section_nr = elf_section_data (sectp)->this_idx;
-
- gdb_assert (elf_section_nr < dwp_file->num_sections);
- dwp_file->elf_sections[elf_section_nr] = sectp;
-
- if (section_is_p (sectp->name, &names->abbrev_dwo))
- {
- dwp_file->sections.abbrev.s.asection = sectp;
- dwp_file->sections.abbrev.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->info_dwo))
- {
- dwp_file->sections.info.s.asection = sectp;
- dwp_file->sections.info.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->line_dwo))
- {
- dwp_file->sections.line.s.asection = sectp;
- dwp_file->sections.line.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->loc_dwo))
- {
- dwp_file->sections.loc.s.asection = sectp;
- dwp_file->sections.loc.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->macinfo_dwo))
- {
- dwp_file->sections.macinfo.s.asection = sectp;
- dwp_file->sections.macinfo.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->macro_dwo))
- {
- dwp_file->sections.macro.s.asection = sectp;
- dwp_file->sections.macro.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->str_offsets_dwo))
- {
- dwp_file->sections.str_offsets.s.asection = sectp;
- dwp_file->sections.str_offsets.size = bfd_get_section_size (sectp);
- }
- else if (section_is_p (sectp->name, &names->types_dwo))
- {
- dwp_file->sections.types.s.asection = sectp;
- dwp_file->sections.types.size = bfd_get_section_size (sectp);
- }
- }
- static hashval_t
- hash_dwp_loaded_cutus (const void *item)
- {
- const struct dwo_unit *dwo_unit = item;
-
- return dwo_unit->signature;
- }
- static int
- eq_dwp_loaded_cutus (const void *a, const void *b)
- {
- const struct dwo_unit *dua = a;
- const struct dwo_unit *dub = b;
- return dua->signature == dub->signature;
- }
- static htab_t
- allocate_dwp_loaded_cutus_table (struct objfile *objfile)
- {
- return htab_create_alloc_ex (3,
- hash_dwp_loaded_cutus,
- eq_dwp_loaded_cutus,
- NULL,
- &objfile->objfile_obstack,
- hashtab_obstack_allocate,
- dummy_obstack_deallocate);
- }
- static bfd *
- open_dwp_file (const char *file_name)
- {
- bfd *abfd;
- abfd = try_open_dwop_file (file_name, 1 , 1 );
- if (abfd != NULL)
- return abfd;
-
- if (*debug_file_directory != '\0')
- {
-
- return try_open_dwop_file (lbasename (file_name), 1 ,
- 0 );
- }
- return NULL;
- }
- static struct dwp_file *
- open_and_init_dwp_file (void)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwp_file *dwp_file;
- char *dwp_name;
- bfd *dbfd;
- struct cleanup *cleanups;
-
- dwp_name = xstrprintf ("%s.dwp", objfile->original_name);
- cleanups = make_cleanup (xfree, dwp_name);
- dbfd = open_dwp_file (dwp_name);
- if (dbfd == NULL
- && strcmp (objfile->original_name, objfile_name (objfile)) != 0)
- {
-
- dwp_name = xstrprintf ("%s.dwp", objfile_name (objfile));
- make_cleanup (xfree, dwp_name);
- dbfd = open_dwp_file (dwp_name);
- }
- if (dbfd == NULL)
- {
- if (dwarf2_read_debug)
- fprintf_unfiltered (gdb_stdlog, "DWP file not found: %s\n", dwp_name);
- do_cleanups (cleanups);
- return NULL;
- }
- dwp_file = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwp_file);
- dwp_file->name = bfd_get_filename (dbfd);
- dwp_file->dbfd = dbfd;
- do_cleanups (cleanups);
-
- dwp_file->num_sections = bfd_count_sections (dbfd) + 1;
- dwp_file->elf_sections =
- OBSTACK_CALLOC (&objfile->objfile_obstack,
- dwp_file->num_sections, asection *);
- bfd_map_over_sections (dbfd, dwarf2_locate_common_dwp_sections, dwp_file);
- dwp_file->cus = create_dwp_hash_table (dwp_file, 0);
- dwp_file->tus = create_dwp_hash_table (dwp_file, 1);
-
- if (dwp_file->cus->version != dwp_file->tus->version)
- {
-
- error (_("Dwarf Error: DWP file CU version %s doesn't match"
- " TU version %s [in DWP file %s]"),
- pulongest (dwp_file->cus->version),
- pulongest (dwp_file->tus->version), dwp_name);
- }
- dwp_file->version = dwp_file->cus->version;
- if (dwp_file->version == 2)
- bfd_map_over_sections (dbfd, dwarf2_locate_v2_dwp_sections, dwp_file);
- dwp_file->loaded_cus = allocate_dwp_loaded_cutus_table (objfile);
- dwp_file->loaded_tus = allocate_dwp_loaded_cutus_table (objfile);
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog, "DWP file found: %s\n", dwp_file->name);
- fprintf_unfiltered (gdb_stdlog,
- " %s CUs, %s TUs\n",
- pulongest (dwp_file->cus ? dwp_file->cus->nr_units : 0),
- pulongest (dwp_file->tus ? dwp_file->tus->nr_units : 0));
- }
- return dwp_file;
- }
- static struct dwp_file *
- get_dwp_file (void)
- {
- if (! dwarf2_per_objfile->dwp_checked)
- {
- dwarf2_per_objfile->dwp_file = open_and_init_dwp_file ();
- dwarf2_per_objfile->dwp_checked = 1;
- }
- return dwarf2_per_objfile->dwp_file;
- }
- static struct dwo_unit *
- lookup_dwo_cutu (struct dwarf2_per_cu_data *this_unit,
- const char *dwo_name, const char *comp_dir,
- ULONGEST signature, int is_debug_types)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- const char *kind = is_debug_types ? "TU" : "CU";
- void **dwo_file_slot;
- struct dwo_file *dwo_file;
- struct dwp_file *dwp_file;
-
- dwp_file = get_dwp_file ();
- if (dwp_file != NULL)
- {
- const struct dwp_hash_table *dwp_htab =
- is_debug_types ? dwp_file->tus : dwp_file->cus;
- if (dwp_htab != NULL)
- {
- struct dwo_unit *dwo_cutu =
- lookup_dwo_unit_in_dwp (dwp_file, comp_dir,
- signature, is_debug_types);
- if (dwo_cutu != NULL)
- {
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog,
- "Virtual DWO %s %s found: @%s\n",
- kind, hex_string (signature),
- host_address_to_string (dwo_cutu));
- }
- return dwo_cutu;
- }
- }
- }
- else
- {
-
- dwo_file_slot = lookup_dwo_file_slot (dwo_name, comp_dir);
- if (*dwo_file_slot == NULL)
- {
-
- *dwo_file_slot = open_and_init_dwo_file (this_unit, dwo_name, comp_dir);
- }
-
- dwo_file = *dwo_file_slot;
- if (dwo_file != NULL)
- {
- struct dwo_unit *dwo_cutu = NULL;
- if (is_debug_types && dwo_file->tus)
- {
- struct dwo_unit find_dwo_cutu;
- memset (&find_dwo_cutu, 0, sizeof (find_dwo_cutu));
- find_dwo_cutu.signature = signature;
- dwo_cutu = htab_find (dwo_file->tus, &find_dwo_cutu);
- }
- else if (!is_debug_types && dwo_file->cu)
- {
- if (signature == dwo_file->cu->signature)
- dwo_cutu = dwo_file->cu;
- }
- if (dwo_cutu != NULL)
- {
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog, "DWO %s %s(%s) found: @%s\n",
- kind, dwo_name, hex_string (signature),
- host_address_to_string (dwo_cutu));
- }
- return dwo_cutu;
- }
- }
- }
-
- if (dwarf2_read_debug)
- {
- fprintf_unfiltered (gdb_stdlog, "DWO %s %s(%s) not found\n",
- kind, dwo_name, hex_string (signature));
- }
-
- {
-
- char *dwp_text = NULL;
- struct cleanup *cleanups;
- if (dwp_file != NULL)
- dwp_text = xstrprintf (" [in DWP file %s]", lbasename (dwp_file->name));
- cleanups = make_cleanup (xfree, dwp_text);
- warning (_("Could not find DWO %s %s(%s)%s referenced by %s at offset 0x%x"
- " [in module %s]"),
- kind, dwo_name, hex_string (signature),
- dwp_text != NULL ? dwp_text : "",
- this_unit->is_debug_types ? "TU" : "CU",
- this_unit->offset.sect_off, objfile_name (objfile));
- do_cleanups (cleanups);
- }
- return NULL;
- }
- static struct dwo_unit *
- lookup_dwo_comp_unit (struct dwarf2_per_cu_data *this_cu,
- const char *dwo_name, const char *comp_dir,
- ULONGEST signature)
- {
- return lookup_dwo_cutu (this_cu, dwo_name, comp_dir, signature, 0);
- }
- static struct dwo_unit *
- lookup_dwo_type_unit (struct signatured_type *this_tu,
- const char *dwo_name, const char *comp_dir)
- {
- return lookup_dwo_cutu (&this_tu->per_cu, dwo_name, comp_dir, this_tu->signature, 1);
- }
- static int
- queue_and_load_dwo_tu (void **slot, void *info)
- {
- struct dwo_unit *dwo_unit = (struct dwo_unit *) *slot;
- struct dwarf2_per_cu_data *per_cu = (struct dwarf2_per_cu_data *) info;
- ULONGEST signature = dwo_unit->signature;
- struct signatured_type *sig_type =
- lookup_dwo_signatured_type (per_cu->cu, signature);
- if (sig_type != NULL)
- {
- struct dwarf2_per_cu_data *sig_cu = &sig_type->per_cu;
-
- if (maybe_queue_comp_unit (NULL, sig_cu, per_cu->cu->language))
- load_full_type_unit (sig_cu);
- VEC_safe_push (dwarf2_per_cu_ptr, per_cu->imported_symtabs, sig_cu);
- }
- return 1;
- }
- static void
- queue_and_load_all_dwo_tus (struct dwarf2_per_cu_data *per_cu)
- {
- struct dwo_unit *dwo_unit;
- struct dwo_file *dwo_file;
- gdb_assert (!per_cu->is_debug_types);
- gdb_assert (get_dwp_file () == NULL);
- gdb_assert (per_cu->cu != NULL);
- dwo_unit = per_cu->cu->dwo_unit;
- gdb_assert (dwo_unit != NULL);
- dwo_file = dwo_unit->dwo_file;
- if (dwo_file->tus != NULL)
- htab_traverse_noresize (dwo_file->tus, queue_and_load_dwo_tu, per_cu);
- }
- static void
- free_dwo_file (struct dwo_file *dwo_file, struct objfile *objfile)
- {
- int ix;
- struct dwarf2_section_info *section;
-
- gdb_bfd_unref (dwo_file->dbfd);
- VEC_free (dwarf2_section_info_def, dwo_file->sections.types);
- }
- static void
- free_dwo_file_cleanup (void *arg)
- {
- struct dwo_file *dwo_file = (struct dwo_file *) arg;
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- free_dwo_file (dwo_file, objfile);
- }
- static int
- free_dwo_file_from_slot (void **slot, void *info)
- {
- struct dwo_file *dwo_file = (struct dwo_file *) *slot;
- struct objfile *objfile = (struct objfile *) info;
- free_dwo_file (dwo_file, objfile);
- return 1;
- }
- static void
- free_dwo_files (htab_t dwo_files, struct objfile *objfile)
- {
- htab_traverse_noresize (dwo_files, free_dwo_file_from_slot, objfile);
- }
- static int
- unsigned_int_compar (const void *ap, const void *bp)
- {
- unsigned int a = *(unsigned int *) ap;
- unsigned int b = *(unsigned int *) bp;
- return (a > b) - (b > a);
- }
- static void
- inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct die_info *child_die;
- unsigned die_children_count;
-
- sect_offset *offsets;
- sect_offset *offsets_end, *offsetp;
-
- struct die_info *origin_die;
-
- struct die_info *origin_child_die;
- struct cleanup *cleanups;
- struct attribute *attr;
- struct dwarf2_cu *origin_cu;
- struct pending **origin_previous_list_in_scope;
- attr = dwarf2_attr (die, DW_AT_abstract_origin, cu);
- if (!attr)
- return;
-
- origin_cu = cu;
- origin_die = follow_die_ref (die, attr, &origin_cu);
-
- origin_previous_list_in_scope = origin_cu->list_in_scope;
- origin_cu->list_in_scope = cu->list_in_scope;
- if (die->tag != origin_die->tag
- && !(die->tag == DW_TAG_inlined_subroutine
- && origin_die->tag == DW_TAG_subprogram))
- complaint (&symfile_complaints,
- _("DIE 0x%x and its abstract origin 0x%x have different tags"),
- die->offset.sect_off, origin_die->offset.sect_off);
- child_die = die->child;
- die_children_count = 0;
- while (child_die && child_die->tag)
- {
- child_die = sibling_die (child_die);
- die_children_count++;
- }
- offsets = xmalloc (sizeof (*offsets) * die_children_count);
- cleanups = make_cleanup (xfree, offsets);
- offsets_end = offsets;
- child_die = die->child;
- while (child_die && child_die->tag)
- {
-
- struct die_info *child_origin_die = child_die;
- struct dwarf2_cu *child_origin_cu = cu;
- while (1)
- {
- attr = dwarf2_attr (child_origin_die, DW_AT_abstract_origin,
- child_origin_cu);
- if (attr == NULL)
- break;
- child_origin_die = follow_die_ref (child_origin_die, attr,
- &child_origin_cu);
- }
-
- if (child_origin_die != child_die)
- {
- if (child_die->tag != child_origin_die->tag
- && !(child_die->tag == DW_TAG_inlined_subroutine
- && child_origin_die->tag == DW_TAG_subprogram))
- complaint (&symfile_complaints,
- _("Child DIE 0x%x and its abstract origin 0x%x have "
- "different tags"), child_die->offset.sect_off,
- child_origin_die->offset.sect_off);
- if (child_origin_die->parent != origin_die)
- complaint (&symfile_complaints,
- _("Child DIE 0x%x and its abstract origin 0x%x have "
- "different parents"), child_die->offset.sect_off,
- child_origin_die->offset.sect_off);
- else
- *offsets_end++ = child_origin_die->offset;
- }
- child_die = sibling_die (child_die);
- }
- qsort (offsets, offsets_end - offsets, sizeof (*offsets),
- unsigned_int_compar);
- for (offsetp = offsets + 1; offsetp < offsets_end; offsetp++)
- if (offsetp[-1].sect_off == offsetp->sect_off)
- complaint (&symfile_complaints,
- _("Multiple children of DIE 0x%x refer "
- "to DIE 0x%x as their abstract origin"),
- die->offset.sect_off, offsetp->sect_off);
- offsetp = offsets;
- origin_child_die = origin_die->child;
- while (origin_child_die && origin_child_die->tag)
- {
-
- while (offsetp < offsets_end
- && offsetp->sect_off < origin_child_die->offset.sect_off)
- offsetp++;
- if (offsetp >= offsets_end
- || offsetp->sect_off > origin_child_die->offset.sect_off)
- {
-
- if (!origin_child_die->in_process)
- process_die (origin_child_die, origin_cu);
- }
- origin_child_die = sibling_die (origin_child_die);
- }
- origin_cu->list_in_scope = origin_previous_list_in_scope;
- do_cleanups (cleanups);
- }
- static void
- read_func_scope (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- struct context_stack *new;
- CORE_ADDR lowpc;
- CORE_ADDR highpc;
- struct die_info *child_die;
- struct attribute *attr, *call_line, *call_file;
- const char *name;
- CORE_ADDR baseaddr;
- struct block *block;
- int inlined_func = (die->tag == DW_TAG_inlined_subroutine);
- VEC (symbolp) *template_args = NULL;
- struct template_symbol *templ_func = NULL;
- if (inlined_func)
- {
-
- call_line = dwarf2_attr (die, DW_AT_call_line, cu);
- call_file = dwarf2_attr (die, DW_AT_call_file, cu);
- if (call_line == NULL || call_file == NULL)
- {
- read_lexical_block_scope (die, cu);
- return;
- }
- }
- baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
- name = dwarf2_name (die, cu);
-
- if (name == NULL)
- {
- complaint (&symfile_complaints,
- _("missing name for subprogram DIE at %d"),
- die->offset.sect_off);
- return;
- }
-
- if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL))
- {
- attr = dwarf2_attr (die, DW_AT_external, cu);
- if (!attr || !DW_UNSND (attr))
- complaint (&symfile_complaints,
- _("cannot get low and high bounds "
- "for subprogram DIE at %d"),
- die->offset.sect_off);
- return;
- }
- lowpc = gdbarch_adjust_dwarf2_addr (gdbarch, lowpc + baseaddr);
- highpc = gdbarch_adjust_dwarf2_addr (gdbarch, highpc + baseaddr);
-
- for (child_die = die->child; child_die; child_die = sibling_die (child_die))
- {
- if (child_die->tag == DW_TAG_template_type_param
- || child_die->tag == DW_TAG_template_value_param)
- {
- templ_func = allocate_template_symbol (objfile);
- templ_func->base.is_cplus_template_function = 1;
- break;
- }
- }
- new = push_context (0, lowpc);
- new->name = new_symbol_full (die, read_type_die (die, cu), cu,
- (struct symbol *) templ_func);
-
- attr = dwarf2_attr (die, DW_AT_frame_base, cu);
- if (attr)
- dwarf2_symbol_mark_computed (attr, new->name, cu, 1);
- cu->list_in_scope = &local_symbols;
- if (die->child != NULL)
- {
- child_die = die->child;
- while (child_die && child_die->tag)
- {
- if (child_die->tag == DW_TAG_template_type_param
- || child_die->tag == DW_TAG_template_value_param)
- {
- struct symbol *arg = new_symbol (child_die, NULL, cu);
- if (arg != NULL)
- VEC_safe_push (symbolp, template_args, arg);
- }
- else
- process_die (child_die, cu);
- child_die = sibling_die (child_die);
- }
- }
- inherit_abstract_dies (die, cu);
-
- if (cu->language == language_cplus
- && dwarf2_attr (die, DW_AT_specification, cu))
- {
- struct dwarf2_cu *spec_cu = cu;
- struct die_info *spec_die = die_specification (die, &spec_cu);
- while (spec_die)
- {
- child_die = spec_die->child;
- while (child_die && child_die->tag)
- {
- if (child_die->tag == DW_TAG_imported_module)
- process_die (child_die, spec_cu);
- child_die = sibling_die (child_die);
- }
-
- spec_die = die_specification (spec_die, &spec_cu);
- }
- }
- new = pop_context ();
-
- block = finish_block (new->name, &local_symbols, new->old_blocks,
- lowpc, highpc);
-
- if ((cu->language == language_cplus || cu->language == language_fortran)
- && cu->processing_has_namespace_info)
- block_set_scope (block, determine_prefix (die, cu),
- &objfile->objfile_obstack);
-
- dwarf2_record_block_ranges (die, block, baseaddr, cu);
- gdbarch_make_symbol_special (gdbarch, new->name, objfile);
-
- if (! VEC_empty (symbolp, template_args))
- {
- gdb_assert (templ_func != NULL);
- templ_func->n_template_arguments = VEC_length (symbolp, template_args);
- templ_func->template_arguments
- = obstack_alloc (&objfile->objfile_obstack,
- (templ_func->n_template_arguments
- * sizeof (struct symbol *)));
- memcpy (templ_func->template_arguments,
- VEC_address (symbolp, template_args),
- (templ_func->n_template_arguments * sizeof (struct symbol *)));
- VEC_free (symbolp, template_args);
- }
-
- local_symbols = new->locals;
- using_directives = new->using_directives;
-
- if (outermost_context_p ())
- cu->list_in_scope = &file_symbols;
- }
- static void
- read_lexical_block_scope (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- struct context_stack *new;
- CORE_ADDR lowpc, highpc;
- struct die_info *child_die;
- CORE_ADDR baseaddr;
- baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
-
-
- if (!dwarf2_get_pc_bounds (die, &lowpc, &highpc, cu, NULL))
- return;
- lowpc = gdbarch_adjust_dwarf2_addr (gdbarch, lowpc + baseaddr);
- highpc = gdbarch_adjust_dwarf2_addr (gdbarch, highpc + baseaddr);
- push_context (0, lowpc);
- if (die->child != NULL)
- {
- child_die = die->child;
- while (child_die && child_die->tag)
- {
- process_die (child_die, cu);
- child_die = sibling_die (child_die);
- }
- }
- new = pop_context ();
- if (local_symbols != NULL || using_directives != NULL)
- {
- struct block *block
- = finish_block (0, &local_symbols, new->old_blocks, new->start_addr,
- highpc);
-
- dwarf2_record_block_ranges (die, block, baseaddr, cu);
- }
- local_symbols = new->locals;
- using_directives = new->using_directives;
- }
- static void
- read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- CORE_ADDR pc, baseaddr;
- struct attribute *attr;
- struct call_site *call_site, call_site_local;
- void **slot;
- int nparams;
- struct die_info *child_die;
- baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
- attr = dwarf2_attr (die, DW_AT_low_pc, cu);
- if (!attr)
- {
- complaint (&symfile_complaints,
- _("missing DW_AT_low_pc for DW_TAG_GNU_call_site "
- "DIE 0x%x [in module %s]"),
- die->offset.sect_off, objfile_name (objfile));
- return;
- }
- pc = attr_value_as_address (attr) + baseaddr;
- pc = gdbarch_adjust_dwarf2_addr (gdbarch, pc);
- if (cu->call_site_htab == NULL)
- cu->call_site_htab = htab_create_alloc_ex (16, core_addr_hash, core_addr_eq,
- NULL, &objfile->objfile_obstack,
- hashtab_obstack_allocate, NULL);
- call_site_local.pc = pc;
- slot = htab_find_slot (cu->call_site_htab, &call_site_local, INSERT);
- if (*slot != NULL)
- {
- complaint (&symfile_complaints,
- _("Duplicate PC %s for DW_TAG_GNU_call_site "
- "DIE 0x%x [in module %s]"),
- paddress (gdbarch, pc), die->offset.sect_off,
- objfile_name (objfile));
- return;
- }
-
- nparams = 0;
- for (child_die = die->child; child_die && child_die->tag;
- child_die = sibling_die (child_die))
- {
- if (child_die->tag != DW_TAG_GNU_call_site_parameter)
- {
- complaint (&symfile_complaints,
- _("Tag %d is not DW_TAG_GNU_call_site_parameter in "
- "DW_TAG_GNU_call_site child DIE 0x%x [in module %s]"),
- child_die->tag, child_die->offset.sect_off,
- objfile_name (objfile));
- continue;
- }
- nparams++;
- }
- call_site = obstack_alloc (&objfile->objfile_obstack,
- (sizeof (*call_site)
- + (sizeof (*call_site->parameter)
- * (nparams - 1))));
- *slot = call_site;
- memset (call_site, 0, sizeof (*call_site) - sizeof (*call_site->parameter));
- call_site->pc = pc;
- if (dwarf2_flag_true_p (die, DW_AT_GNU_tail_call, cu))
- {
- struct die_info *func_die;
-
- for (func_die = die->parent;
- func_die && func_die->tag != DW_TAG_subprogram
- && func_die->tag != DW_TAG_subroutine_type;
- func_die = func_die->parent);
-
- if (func_die
- && !dwarf2_flag_true_p (func_die, DW_AT_GNU_all_call_sites, cu)
- && !dwarf2_flag_true_p (func_die, DW_AT_GNU_all_tail_call_sites, cu))
- {
-
- }
- else
- {
- struct type *func_type = NULL;
- if (func_die)
- func_type = get_die_type (func_die, cu);
- if (func_type != NULL)
- {
- gdb_assert (TYPE_CODE (func_type) == TYPE_CODE_FUNC);
-
- call_site->tail_call_next = TYPE_TAIL_CALL_LIST (func_type);
- TYPE_TAIL_CALL_LIST (func_type) = call_site;
- }
- else
- complaint (&symfile_complaints,
- _("Cannot find function owning DW_TAG_GNU_call_site "
- "DIE 0x%x [in module %s]"),
- die->offset.sect_off, objfile_name (objfile));
- }
- }
- attr = dwarf2_attr (die, DW_AT_GNU_call_site_target, cu);
- if (attr == NULL)
- attr = dwarf2_attr (die, DW_AT_abstract_origin, cu);
- SET_FIELD_DWARF_BLOCK (call_site->target, NULL);
- if (!attr || (attr_form_is_block (attr) && DW_BLOCK (attr)->size == 0))
- ;
- else if (attr_form_is_block (attr))
- {
- struct dwarf2_locexpr_baton *dlbaton;
- dlbaton = obstack_alloc (&objfile->objfile_obstack, sizeof (*dlbaton));
- dlbaton->data = DW_BLOCK (attr)->data;
- dlbaton->size = DW_BLOCK (attr)->size;
- dlbaton->per_cu = cu->per_cu;
- SET_FIELD_DWARF_BLOCK (call_site->target, dlbaton);
- }
- else if (attr_form_is_ref (attr))
- {
- struct dwarf2_cu *target_cu = cu;
- struct die_info *target_die;
- target_die = follow_die_ref (die, attr, &target_cu);
- gdb_assert (target_cu->objfile == objfile);
- if (die_is_declaration (target_die, target_cu))
- {
- const char *target_physname = NULL;
- struct attribute *target_attr;
-
- target_attr = dwarf2_attr (target_die, DW_AT_linkage_name, target_cu);
- if (target_attr == NULL)
- target_attr = dwarf2_attr (target_die, DW_AT_MIPS_linkage_name,
- target_cu);
- if (target_attr != NULL && DW_STRING (target_attr) != NULL)
- target_physname = DW_STRING (target_attr);
- else
- target_physname = dwarf2_physname (NULL, target_die, target_cu);
- if (target_physname == NULL)
- complaint (&symfile_complaints,
- _("DW_AT_GNU_call_site_target target DIE has invalid "
- "physname, for referencing DIE 0x%x [in module %s]"),
- die->offset.sect_off, objfile_name (objfile));
- else
- SET_FIELD_PHYSNAME (call_site->target, target_physname);
- }
- else
- {
- CORE_ADDR lowpc;
-
- if (!dwarf2_get_pc_bounds (target_die, &lowpc, NULL, target_cu, NULL))
- complaint (&symfile_complaints,
- _("DW_AT_GNU_call_site_target target DIE has invalid "
- "low pc, for referencing DIE 0x%x [in module %s]"),
- die->offset.sect_off, objfile_name (objfile));
- else
- {
- lowpc = gdbarch_adjust_dwarf2_addr (gdbarch, lowpc + baseaddr);
- SET_FIELD_PHYSADDR (call_site->target, lowpc);
- }
- }
- }
- else
- complaint (&symfile_complaints,
- _("DW_TAG_GNU_call_site DW_AT_GNU_call_site_target is neither "
- "block nor reference, for DIE 0x%x [in module %s]"),
- die->offset.sect_off, objfile_name (objfile));
- call_site->per_cu = cu->per_cu;
- for (child_die = die->child;
- child_die && child_die->tag;
- child_die = sibling_die (child_die))
- {
- struct call_site_parameter *parameter;
- struct attribute *loc, *origin;
- if (child_die->tag != DW_TAG_GNU_call_site_parameter)
- {
-
- continue;
- }
- gdb_assert (call_site->parameter_count < nparams);
- parameter = &call_site->parameter[call_site->parameter_count];
-
- loc = dwarf2_attr (child_die, DW_AT_location, cu);
- origin = dwarf2_attr (child_die, DW_AT_abstract_origin, cu);
- if (loc == NULL && origin != NULL && attr_form_is_ref (origin))
- {
- sect_offset offset;
- parameter->kind = CALL_SITE_PARAMETER_PARAM_OFFSET;
- offset = dwarf2_get_ref_die_offset (origin);
- if (!offset_in_cu_p (&cu->header, offset))
- {
-
- complaint (&symfile_complaints,
- _("DW_AT_abstract_origin offset is not in CU for "
- "DW_TAG_GNU_call_site child DIE 0x%x "
- "[in module %s]"),
- child_die->offset.sect_off, objfile_name (objfile));
- continue;
- }
- parameter->u.param_offset.cu_off = (offset.sect_off
- - cu->header.offset.sect_off);
- }
- else if (loc == NULL || origin != NULL || !attr_form_is_block (loc))
- {
- complaint (&symfile_complaints,
- _("No DW_FORM_block* DW_AT_location for "
- "DW_TAG_GNU_call_site child DIE 0x%x [in module %s]"),
- child_die->offset.sect_off, objfile_name (objfile));
- continue;
- }
- else
- {
- parameter->u.dwarf_reg = dwarf_block_to_dwarf_reg
- (DW_BLOCK (loc)->data, &DW_BLOCK (loc)->data[DW_BLOCK (loc)->size]);
- if (parameter->u.dwarf_reg != -1)
- parameter->kind = CALL_SITE_PARAMETER_DWARF_REG;
- else if (dwarf_block_to_sp_offset (gdbarch, DW_BLOCK (loc)->data,
- &DW_BLOCK (loc)->data[DW_BLOCK (loc)->size],
- ¶meter->u.fb_offset))
- parameter->kind = CALL_SITE_PARAMETER_FB_OFFSET;
- else
- {
- complaint (&symfile_complaints,
- _("Only single DW_OP_reg or DW_OP_fbreg is supported "
- "for DW_FORM_block* DW_AT_location is supported for "
- "DW_TAG_GNU_call_site child DIE 0x%x "
- "[in module %s]"),
- child_die->offset.sect_off, objfile_name (objfile));
- continue;
- }
- }
- attr = dwarf2_attr (child_die, DW_AT_GNU_call_site_value, cu);
- if (!attr_form_is_block (attr))
- {
- complaint (&symfile_complaints,
- _("No DW_FORM_block* DW_AT_GNU_call_site_value for "
- "DW_TAG_GNU_call_site child DIE 0x%x [in module %s]"),
- child_die->offset.sect_off, objfile_name (objfile));
- continue;
- }
- parameter->value = DW_BLOCK (attr)->data;
- parameter->value_size = DW_BLOCK (attr)->size;
-
- parameter->data_value = NULL;
- parameter->data_value_size = 0;
- call_site->parameter_count++;
- attr = dwarf2_attr (child_die, DW_AT_GNU_call_site_data_value, cu);
- if (attr)
- {
- if (!attr_form_is_block (attr))
- complaint (&symfile_complaints,
- _("No DW_FORM_block* DW_AT_GNU_call_site_data_value for "
- "DW_TAG_GNU_call_site child DIE 0x%x [in module %s]"),
- child_die->offset.sect_off, objfile_name (objfile));
- else
- {
- parameter->data_value = DW_BLOCK (attr)->data;
- parameter->data_value_size = DW_BLOCK (attr)->size;
- }
- }
- }
- }
- static int
- dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return,
- CORE_ADDR *high_return, struct dwarf2_cu *cu,
- struct partial_symtab *ranges_pst)
- {
- struct objfile *objfile = cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- struct comp_unit_head *cu_header = &cu->header;
- bfd *obfd = objfile->obfd;
- unsigned int addr_size = cu_header->addr_size;
- CORE_ADDR mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1));
-
- CORE_ADDR base;
- int found_base;
- unsigned int dummy;
- const gdb_byte *buffer;
- CORE_ADDR marker;
- int low_set;
- CORE_ADDR low = 0;
- CORE_ADDR high = 0;
- CORE_ADDR baseaddr;
- found_base = cu->base_known;
- base = cu->base_address;
- dwarf2_read_section (objfile, &dwarf2_per_objfile->ranges);
- if (offset >= dwarf2_per_objfile->ranges.size)
- {
- complaint (&symfile_complaints,
- _("Offset %d out of bounds for DW_AT_ranges attribute"),
- offset);
- return 0;
- }
- buffer = dwarf2_per_objfile->ranges.buffer + offset;
-
- marker = read_address (obfd, buffer, cu, &dummy);
- if ((marker & mask) == mask)
- {
-
- base = read_address (obfd, buffer + addr_size, cu, &dummy);
- buffer += 2 * addr_size;
- offset += 2 * addr_size;
- found_base = 1;
- }
- low_set = 0;
- baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
- while (1)
- {
- CORE_ADDR range_beginning, range_end;
- range_beginning = read_address (obfd, buffer, cu, &dummy);
- buffer += addr_size;
- range_end = read_address (obfd, buffer, cu, &dummy);
- buffer += addr_size;
- offset += 2 * addr_size;
-
- if (range_beginning == 0 && range_end == 0)
-
- break;
-
- if ((range_beginning & mask) == mask)
- {
-
- base = read_address (obfd, buffer + addr_size, cu, &dummy);
- found_base = 1;
- continue;
- }
- if (!found_base)
- {
-
- complaint (&symfile_complaints,
- _("Invalid .debug_ranges data (no base address)"));
- return 0;
- }
- if (range_beginning > range_end)
- {
-
- complaint (&symfile_complaints,
- _("Invalid .debug_ranges data (inverted range)"));
- return 0;
- }
-
- if (range_beginning == range_end)
- continue;
- range_beginning += base;
- range_end += base;
-
- if (range_beginning + baseaddr == 0
- && !dwarf2_per_objfile->has_section_at_zero)
- {
- complaint (&symfile_complaints,
- _(".debug_ranges entry has start address of zero"
- " [in module %s]"), objfile_name (objfile));
- continue;
- }
- if (ranges_pst != NULL)
- {
- CORE_ADDR lowpc;
- CORE_ADDR highpc;
- lowpc = gdbarch_adjust_dwarf2_addr (gdbarch,
- range_beginning + baseaddr);
- highpc = gdbarch_adjust_dwarf2_addr (gdbarch,
- range_end + baseaddr);
- addrmap_set_empty (objfile->psymtabs_addrmap, lowpc, highpc - 1,
- ranges_pst);
- }
- FIXME
- if (! low_set)
- {
- low = range_beginning;
- high = range_end;
- low_set = 1;
- }
- else
- {
- if (range_beginning < low)
- low = range_beginning;
- if (range_end > high)
- high = range_end;
- }
- }
- if (! low_set)
-
- return 0;
- if (low_return)
- *low_return = low;
- if (high_return)
- *high_return = high;
- return 1;
- }
- static int
- dwarf2_get_pc_bounds (struct die_info *die, CORE_ADDR *lowpc,
- CORE_ADDR *highpc, struct dwarf2_cu *cu,
- struct partial_symtab *pst)
- {
- struct attribute *attr;
- struct attribute *attr_high;
- CORE_ADDR low = 0;
- CORE_ADDR high = 0;
- int ret = 0;
- attr_high = dwarf2_attr (die, DW_AT_high_pc, cu);
- if (attr_high)
- {
- attr = dwarf2_attr (die, DW_AT_low_pc, cu);
- if (attr)
- {
- low = attr_value_as_address (attr);
- high = attr_value_as_address (attr_high);
- if (cu->header.version >= 4 && attr_form_is_constant (attr_high))
- high += low;
- }
- else
-
- return 0;
-
- ret = 1;
- }
- else
- {
- attr = dwarf2_attr (die, DW_AT_ranges, cu);
- if (attr != NULL)
- {
-
- int need_ranges_base = die->tag != DW_TAG_compile_unit;
- unsigned int ranges_offset = (DW_UNSND (attr)
- + (need_ranges_base
- ? cu->ranges_base
- : 0));
-
- if (!dwarf2_ranges_read (ranges_offset, &low, &high, cu, pst))
- return 0;
-
- ret = -1;
- }
- }
-
- if (high <= low)
- return 0;
-
- if (low == 0 && !dwarf2_per_objfile->has_section_at_zero)
- return 0;
- *lowpc = low;
- if (highpc)
- *highpc = high;
- return ret;
- }
- static void
- dwarf2_get_subprogram_pc_bounds (struct die_info *die,
- CORE_ADDR *lowpc, CORE_ADDR *highpc,
- struct dwarf2_cu *cu)
- {
- CORE_ADDR low, high;
- struct die_info *child = die->child;
- if (dwarf2_get_pc_bounds (die, &low, &high, cu, NULL))
- {
- *lowpc = min (*lowpc, low);
- *highpc = max (*highpc, high);
- }
-
- if (cu->language != language_ada)
- return;
-
- while (child && child->tag)
- {
- if (child->tag == DW_TAG_subprogram
- || child->tag == DW_TAG_lexical_block)
- dwarf2_get_subprogram_pc_bounds (child, lowpc, highpc, cu);
- child = sibling_die (child);
- }
- }
- static void
- get_scope_pc_bounds (struct die_info *die,
- CORE_ADDR *lowpc, CORE_ADDR *highpc,
- struct dwarf2_cu *cu)
- {
- CORE_ADDR best_low = (CORE_ADDR) -1;
- CORE_ADDR best_high = (CORE_ADDR) 0;
- CORE_ADDR current_low, current_high;
- if (dwarf2_get_pc_bounds (die, ¤t_low, ¤t_high, cu, NULL))
- {
- best_low = current_low;
- best_high = current_high;
- }
- else
- {
- struct die_info *child = die->child;
- while (child && child->tag)
- {
- switch (child->tag) {
- case DW_TAG_subprogram:
- dwarf2_get_subprogram_pc_bounds (child, &best_low, &best_high, cu);
- break;
- case DW_TAG_namespace:
- case DW_TAG_module:
- FIXME
- get_scope_pc_bounds (child, ¤t_low, ¤t_high, cu);
- if (current_low != ((CORE_ADDR) -1))
- {
- best_low = min (best_low, current_low);
- best_high = max (best_high, current_high);
- }
- break;
- default:
-
- break;
- }
- child = sibling_die (child);
- }
- }
- *lowpc = best_low;
- *highpc = best_high;
- }
- static void
- dwarf2_record_block_ranges (struct die_info *die, struct block *block,
- CORE_ADDR baseaddr, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- struct attribute *attr;
- struct attribute *attr_high;
- attr_high = dwarf2_attr (die, DW_AT_high_pc, cu);
- if (attr_high)
- {
- attr = dwarf2_attr (die, DW_AT_low_pc, cu);
- if (attr)
- {
- CORE_ADDR low = attr_value_as_address (attr);
- CORE_ADDR high = attr_value_as_address (attr_high);
- if (cu->header.version >= 4 && attr_form_is_constant (attr_high))
- high += low;
- low = gdbarch_adjust_dwarf2_addr (gdbarch, low + baseaddr);
- high = gdbarch_adjust_dwarf2_addr (gdbarch, high + baseaddr);
- record_block_range (block, low, high - 1);
- }
- }
- attr = dwarf2_attr (die, DW_AT_ranges, cu);
- if (attr)
- {
- bfd *obfd = objfile->obfd;
-
- int need_ranges_base = die->tag != DW_TAG_compile_unit;
-
- unsigned long offset = (DW_UNSND (attr)
- + (need_ranges_base ? cu->ranges_base : 0));
- const gdb_byte *buffer;
-
- unsigned int addr_size = cu->header.addr_size;
- CORE_ADDR base_select_mask = ~(~(CORE_ADDR)1 << (addr_size * 8 - 1));
-
- CORE_ADDR base = cu->base_address;
- int base_known = cu->base_known;
- dwarf2_read_section (objfile, &dwarf2_per_objfile->ranges);
- if (offset >= dwarf2_per_objfile->ranges.size)
- {
- complaint (&symfile_complaints,
- _("Offset %lu out of bounds for DW_AT_ranges attribute"),
- offset);
- return;
- }
- buffer = dwarf2_per_objfile->ranges.buffer + offset;
- for (;;)
- {
- unsigned int bytes_read;
- CORE_ADDR start, end;
- start = read_address (obfd, buffer, cu, &bytes_read);
- buffer += bytes_read;
- end = read_address (obfd, buffer, cu, &bytes_read);
- buffer += bytes_read;
-
- if (start == 0 && end == 0)
- break;
-
- else if ((start & base_select_mask) == base_select_mask)
- {
- base = end;
- base_known = 1;
- }
-
- else
- {
- if (!base_known)
- {
- complaint (&symfile_complaints,
- _("Invalid .debug_ranges data "
- "(no base address)"));
- return;
- }
- if (start > end)
- {
-
- complaint (&symfile_complaints,
- _("Invalid .debug_ranges data "
- "(inverted range)"));
- return;
- }
-
- if (start == end)
- continue;
- start += base + baseaddr;
- end += base + baseaddr;
-
- if (start == 0 && !dwarf2_per_objfile->has_section_at_zero)
- {
- complaint (&symfile_complaints,
- _(".debug_ranges entry has start address of zero"
- " [in module %s]"), objfile_name (objfile));
- continue;
- }
- start = gdbarch_adjust_dwarf2_addr (gdbarch, start);
- end = gdbarch_adjust_dwarf2_addr (gdbarch, end);
- record_block_range (block, start, end - 1);
- }
- }
- }
- }
- static void
- check_producer (struct dwarf2_cu *cu)
- {
- const char *cs;
- int major, minor, release;
- if (cu->producer == NULL)
- {
-
- }
- else if (strncmp (cu->producer, "GNU ", strlen ("GNU ")) == 0)
- {
-
- cs = &cu->producer[strlen ("GNU ")];
- while (*cs && !isdigit (*cs))
- cs++;
- if (sscanf (cs, "%d.%d.%d", &major, &minor, &release) != 3)
- {
-
- }
- else
- {
- cu->producer_is_gxx_lt_4_6 = major < 4 || (major == 4 && minor < 6);
- cu->producer_is_gcc_lt_4_3 = major < 4 || (major == 4 && minor < 3);
- }
- }
- else if (strncmp (cu->producer, "Intel(R) C", strlen ("Intel(R) C")) == 0)
- cu->producer_is_icc = 1;
- else
- {
-
- }
- cu->checked_producer = 1;
- }
- static int
- producer_is_gxx_lt_4_6 (struct dwarf2_cu *cu)
- {
- if (!cu->checked_producer)
- check_producer (cu);
- return cu->producer_is_gxx_lt_4_6;
- }
- static enum dwarf_access_attribute
- dwarf2_default_access_attribute (struct die_info *die, struct dwarf2_cu *cu)
- {
- if (cu->header.version < 3 || producer_is_gxx_lt_4_6 (cu))
- {
-
- if (die->tag != DW_TAG_inheritance)
- return DW_ACCESS_public;
- else
- return DW_ACCESS_private;
- }
- else
- {
-
- if (die->parent->tag == DW_TAG_class_type)
- return DW_ACCESS_private;
- else
- return DW_ACCESS_public;
- }
- }
- static int
- handle_data_member_location (struct die_info *die, struct dwarf2_cu *cu,
- LONGEST *offset)
- {
- struct attribute *attr;
- attr = dwarf2_attr (die, DW_AT_data_member_location, cu);
- if (attr != NULL)
- {
- *offset = 0;
-
- if (attr_form_is_constant (attr))
- *offset = dwarf2_get_attr_constant_value (attr, 0);
- else if (attr_form_is_section_offset (attr))
- dwarf2_complex_location_expr_complaint ();
- else if (attr_form_is_block (attr))
- *offset = decode_locdesc (DW_BLOCK (attr), cu);
- else
- dwarf2_complex_location_expr_complaint ();
- return 1;
- }
- return 0;
- }
- static void
- dwarf2_add_field (struct field_info *fip, struct die_info *die,
- struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- struct nextfield *new_field;
- struct attribute *attr;
- struct field *fp;
- const char *fieldname = "";
-
- new_field = (struct nextfield *) xmalloc (sizeof (struct nextfield));
- make_cleanup (xfree, new_field);
- memset (new_field, 0, sizeof (struct nextfield));
- if (die->tag == DW_TAG_inheritance)
- {
- new_field->next = fip->baseclasses;
- fip->baseclasses = new_field;
- }
- else
- {
- new_field->next = fip->fields;
- fip->fields = new_field;
- }
- fip->nfields++;
- attr = dwarf2_attr (die, DW_AT_accessibility, cu);
- if (attr)
- new_field->accessibility = DW_UNSND (attr);
- else
- new_field->accessibility = dwarf2_default_access_attribute (die, cu);
- if (new_field->accessibility != DW_ACCESS_public)
- fip->non_public_fields = 1;
- attr = dwarf2_attr (die, DW_AT_virtuality, cu);
- if (attr)
- new_field->virtuality = DW_UNSND (attr);
- else
- new_field->virtuality = DW_VIRTUALITY_none;
- fp = &new_field->field;
- if (die->tag == DW_TAG_member && ! die_is_declaration (die, cu))
- {
- LONGEST offset;
-
-
- fp->type = die_type (die, cu);
- SET_FIELD_BITPOS (*fp, 0);
-
- attr = dwarf2_attr (die, DW_AT_bit_size, cu);
- if (attr)
- {
- FIELD_BITSIZE (*fp) = DW_UNSND (attr);
- }
- else
- {
- FIELD_BITSIZE (*fp) = 0;
- }
-
- if (handle_data_member_location (die, cu, &offset))
- SET_FIELD_BITPOS (*fp, offset * bits_per_byte);
- attr = dwarf2_attr (die, DW_AT_bit_offset, cu);
- if (attr)
- {
- if (gdbarch_bits_big_endian (gdbarch))
- {
-
- SET_FIELD_BITPOS (*fp, FIELD_BITPOS (*fp) + DW_UNSND (attr));
- }
- else
- {
-
- int anonymous_size;
- int bit_offset = DW_UNSND (attr);
- attr = dwarf2_attr (die, DW_AT_byte_size, cu);
- if (attr)
- {
-
- anonymous_size = DW_UNSND (attr);
- }
- else
- {
-
- anonymous_size = TYPE_LENGTH (fp->type);
- }
- SET_FIELD_BITPOS (*fp,
- (FIELD_BITPOS (*fp)
- + anonymous_size * bits_per_byte
- - bit_offset - FIELD_BITSIZE (*fp)));
- }
- }
-
- fieldname = dwarf2_name (die, cu);
- if (fieldname == NULL)
- fieldname = "";
-
- fp->name = fieldname;
-
- if (dwarf2_attr (die, DW_AT_artificial, cu))
- {
- FIELD_ARTIFICIAL (*fp) = 1;
- new_field->accessibility = DW_ACCESS_private;
- fip->non_public_fields = 1;
- }
- }
- else if (die->tag == DW_TAG_member || die->tag == DW_TAG_variable)
- {
-
-
- const char *physname;
-
- fieldname = dwarf2_name (die, cu);
- if (fieldname == NULL)
- return;
- attr = dwarf2_attr (die, DW_AT_const_value, cu);
- if (attr
-
- && dwarf2_flag_true_p (die, DW_AT_external, cu))
- {
-
- new_symbol (die, NULL, cu);
- }
-
- physname = dwarf2_physname (fieldname, die, cu);
-
- SET_FIELD_PHYSNAME (*fp, physname ? physname : "");
- FIELD_TYPE (*fp) = die_type (die, cu);
- FIELD_NAME (*fp) = fieldname;
- }
- else if (die->tag == DW_TAG_inheritance)
- {
- LONGEST offset;
-
- if (handle_data_member_location (die, cu, &offset))
- SET_FIELD_BITPOS (*fp, offset * bits_per_byte);
- FIELD_BITSIZE (*fp) = 0;
- FIELD_TYPE (*fp) = die_type (die, cu);
- FIELD_NAME (*fp) = type_name_no_tag (fp->type);
- fip->nbaseclasses++;
- }
- }
- static void
- dwarf2_add_typedef (struct field_info *fip, struct die_info *die,
- struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct typedef_field_list *new_field;
- struct attribute *attr;
- struct typedef_field *fp;
- char *fieldname = "";
-
- new_field = xzalloc (sizeof (*new_field));
- make_cleanup (xfree, new_field);
- gdb_assert (die->tag == DW_TAG_typedef);
- fp = &new_field->field;
-
- fp->name = dwarf2_name (die, cu);
- if (fp->name == NULL)
- return;
- fp->type = read_type_die (die, cu);
- new_field->next = fip->typedef_field_list;
- fip->typedef_field_list = new_field;
- fip->typedef_field_list_count++;
- }
- static void
- dwarf2_attach_fields_to_type (struct field_info *fip, struct type *type,
- struct dwarf2_cu *cu)
- {
- int nfields = fip->nfields;
-
- TYPE_NFIELDS (type) = nfields;
- TYPE_FIELDS (type) = (struct field *)
- TYPE_ALLOC (type, sizeof (struct field) * nfields);
- memset (TYPE_FIELDS (type), 0, sizeof (struct field) * nfields);
- if (fip->non_public_fields && cu->language != language_ada)
- {
- ALLOCATE_CPLUS_STRUCT_TYPE (type);
- TYPE_FIELD_PRIVATE_BITS (type) =
- (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
- B_CLRALL (TYPE_FIELD_PRIVATE_BITS (type), nfields);
- TYPE_FIELD_PROTECTED_BITS (type) =
- (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
- B_CLRALL (TYPE_FIELD_PROTECTED_BITS (type), nfields);
- TYPE_FIELD_IGNORE_BITS (type) =
- (B_TYPE *) TYPE_ALLOC (type, B_BYTES (nfields));
- B_CLRALL (TYPE_FIELD_IGNORE_BITS (type), nfields);
- }
-
- if (fip->nbaseclasses && cu->language != language_ada)
- {
- int num_bytes = B_BYTES (fip->nbaseclasses);
- unsigned char *pointer;
- ALLOCATE_CPLUS_STRUCT_TYPE (type);
- pointer = TYPE_ALLOC (type, num_bytes);
- TYPE_FIELD_VIRTUAL_BITS (type) = pointer;
- B_CLRALL (TYPE_FIELD_VIRTUAL_BITS (type), fip->nbaseclasses);
- TYPE_N_BASECLASSES (type) = fip->nbaseclasses;
- }
-
- while (nfields-- > 0)
- {
- struct nextfield *fieldp;
- if (fip->fields)
- {
- fieldp = fip->fields;
- fip->fields = fieldp->next;
- }
- else
- {
- fieldp = fip->baseclasses;
- fip->baseclasses = fieldp->next;
- }
- TYPE_FIELD (type, nfields) = fieldp->field;
- switch (fieldp->accessibility)
- {
- case DW_ACCESS_private:
- if (cu->language != language_ada)
- SET_TYPE_FIELD_PRIVATE (type, nfields);
- break;
- case DW_ACCESS_protected:
- if (cu->language != language_ada)
- SET_TYPE_FIELD_PROTECTED (type, nfields);
- break;
- case DW_ACCESS_public:
- break;
- default:
-
- {
- complaint (&symfile_complaints, _("unsupported accessibility %d"),
- fieldp->accessibility);
- }
- break;
- }
- if (nfields < fip->nbaseclasses)
- {
- switch (fieldp->virtuality)
- {
- case DW_VIRTUALITY_virtual:
- case DW_VIRTUALITY_pure_virtual:
- if (cu->language == language_ada)
- error (_("unexpected virtuality in component of Ada type"));
- SET_TYPE_FIELD_VIRTUAL (type, nfields);
- break;
- }
- }
- }
- }
- static int
- dwarf2_is_constructor (struct die_info *die, struct dwarf2_cu *cu)
- {
- const char *fieldname;
- const char *typename;
- int len;
- if (die->parent == NULL)
- return 0;
- if (die->parent->tag != DW_TAG_structure_type
- && die->parent->tag != DW_TAG_union_type
- && die->parent->tag != DW_TAG_class_type)
- return 0;
- fieldname = dwarf2_name (die, cu);
- typename = dwarf2_name (die->parent, cu);
- if (fieldname == NULL || typename == NULL)
- return 0;
- len = strlen (fieldname);
- return (strncmp (fieldname, typename, len) == 0
- && (typename[len] == '\0' || typename[len] == '<'));
- }
- static void
- dwarf2_add_member_fn (struct field_info *fip, struct die_info *die,
- struct type *type, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct attribute *attr;
- struct fnfieldlist *flp;
- int i;
- struct fn_field *fnp;
- const char *fieldname;
- struct nextfnfield *new_fnfield;
- struct type *this_type;
- enum dwarf_access_attribute accessibility;
- if (cu->language == language_ada)
- error (_("unexpected member function in Ada type"));
-
- fieldname = dwarf2_name (die, cu);
- if (fieldname == NULL)
- return;
-
- for (i = 0; i < fip->nfnfields; i++)
- {
- if (strcmp (fip->fnfieldlists[i].name, fieldname) == 0)
- break;
- }
-
- if (i < fip->nfnfields)
- flp = &fip->fnfieldlists[i];
- else
- {
- if ((fip->nfnfields % DW_FIELD_ALLOC_CHUNK) == 0)
- {
- fip->fnfieldlists = (struct fnfieldlist *)
- xrealloc (fip->fnfieldlists,
- (fip->nfnfields + DW_FIELD_ALLOC_CHUNK)
- * sizeof (struct fnfieldlist));
- if (fip->nfnfields == 0)
- make_cleanup (free_current_contents, &fip->fnfieldlists);
- }
- flp = &fip->fnfieldlists[fip->nfnfields];
- flp->name = fieldname;
- flp->length = 0;
- flp->head = NULL;
- i = fip->nfnfields++;
- }
-
- new_fnfield = (struct nextfnfield *) xmalloc (sizeof (struct nextfnfield));
- make_cleanup (xfree, new_fnfield);
- memset (new_fnfield, 0, sizeof (struct nextfnfield));
- new_fnfield->next = flp->head;
- flp->head = new_fnfield;
- flp->length++;
-
- fnp = &new_fnfield->fnfield;
-
- if (cu->language == language_cplus || cu->language == language_java)
- {
- add_to_method_list (type, i, flp->length - 1, fieldname,
- die, cu);
- }
- else
- {
- const char *physname = dwarf2_physname (fieldname, die, cu);
- fnp->physname = physname ? physname : "";
- }
- fnp->type = alloc_type (objfile);
- this_type = read_type_die (die, cu);
- if (this_type && TYPE_CODE (this_type) == TYPE_CODE_FUNC)
- {
- int nparams = TYPE_NFIELDS (this_type);
-
- smash_to_method_type (fnp->type, type,
- TYPE_TARGET_TYPE (this_type),
- TYPE_FIELDS (this_type),
- TYPE_NFIELDS (this_type),
- TYPE_VARARGS (this_type));
-
- if (nparams == 0 || TYPE_FIELD_ARTIFICIAL (this_type, 0) == 0)
- fnp->voffset = VOFFSET_STATIC;
- }
- else
- complaint (&symfile_complaints, _("member function type missing for '%s'"),
- dwarf2_full_name (fieldname, die, cu));
-
- if (dwarf2_attr (die, DW_AT_containing_type, cu) != NULL)
- fnp->fcontext = die_containing_type (die, cu);
-
-
- attr = dwarf2_attr (die, DW_AT_accessibility, cu);
- if (attr)
- accessibility = DW_UNSND (attr);
- else
- accessibility = dwarf2_default_access_attribute (die, cu);
- switch (accessibility)
- {
- case DW_ACCESS_private:
- fnp->is_private = 1;
- break;
- case DW_ACCESS_protected:
- fnp->is_protected = 1;
- break;
- }
-
- attr = dwarf2_attr (die, DW_AT_artificial, cu);
- if (attr && DW_UNSND (attr) != 0)
- fnp->is_artificial = 1;
- fnp->is_constructor = dwarf2_is_constructor (die, cu);
-
- attr = dwarf2_attr (die, DW_AT_vtable_elem_location, cu);
- if (attr)
- {
- if (attr_form_is_block (attr) && DW_BLOCK (attr)->size > 0)
- {
- if (DW_BLOCK (attr)->data[0] == DW_OP_constu)
- {
-
- fnp->voffset = decode_locdesc (DW_BLOCK (attr), cu) + 2;
- }
- else if (DW_BLOCK (attr)->data[0] == DW_OP_deref
- || (DW_BLOCK (attr)->size > 1
- && DW_BLOCK (attr)->data[0] == DW_OP_deref_size
- && DW_BLOCK (attr)->data[1] == cu->header.addr_size))
- {
- struct dwarf_block blk;
- int offset;
- offset = (DW_BLOCK (attr)->data[0] == DW_OP_deref
- ? 1 : 2);
- blk.size = DW_BLOCK (attr)->size - offset;
- blk.data = DW_BLOCK (attr)->data + offset;
- fnp->voffset = decode_locdesc (DW_BLOCK (attr), cu);
- if ((fnp->voffset % cu->header.addr_size) != 0)
- dwarf2_complex_location_expr_complaint ();
- else
- fnp->voffset /= cu->header.addr_size;
- fnp->voffset += 2;
- }
- else
- dwarf2_complex_location_expr_complaint ();
- if (!fnp->fcontext)
- fnp->fcontext = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (this_type, 0));
- }
- else if (attr_form_is_section_offset (attr))
- {
- dwarf2_complex_location_expr_complaint ();
- }
- else
- {
- dwarf2_invalid_attrib_class_complaint ("DW_AT_vtable_elem_location",
- fieldname);
- }
- }
- else
- {
- attr = dwarf2_attr (die, DW_AT_virtuality, cu);
- if (attr && DW_UNSND (attr))
- {
-
- complaint (&symfile_complaints,
- _("Member function \"%s\" (offset %d) is virtual "
- "but the vtable offset is not specified"),
- fieldname, die->offset.sect_off);
- ALLOCATE_CPLUS_STRUCT_TYPE (type);
- TYPE_CPLUS_DYNAMIC (type) = 1;
- }
- }
- }
- static void
- dwarf2_attach_fn_fields_to_type (struct field_info *fip, struct type *type,
- struct dwarf2_cu *cu)
- {
- struct fnfieldlist *flp;
- int i;
- if (cu->language == language_ada)
- error (_("unexpected member functions in Ada type"));
- ALLOCATE_CPLUS_STRUCT_TYPE (type);
- TYPE_FN_FIELDLISTS (type) = (struct fn_fieldlist *)
- TYPE_ALLOC (type, sizeof (struct fn_fieldlist) * fip->nfnfields);
- for (i = 0, flp = fip->fnfieldlists; i < fip->nfnfields; i++, flp++)
- {
- struct nextfnfield *nfp = flp->head;
- struct fn_fieldlist *fn_flp = &TYPE_FN_FIELDLIST (type, i);
- int k;
- TYPE_FN_FIELDLIST_NAME (type, i) = flp->name;
- TYPE_FN_FIELDLIST_LENGTH (type, i) = flp->length;
- fn_flp->fn_fields = (struct fn_field *)
- TYPE_ALLOC (type, sizeof (struct fn_field) * flp->length);
- for (k = flp->length; (k--, nfp); nfp = nfp->next)
- fn_flp->fn_fields[k] = nfp->fnfield;
- }
- TYPE_NFN_FIELDS (type) = fip->nfnfields;
- }
- static int
- is_vtable_name (const char *name, struct dwarf2_cu *cu)
- {
- static const char vptr[] = "_vptr";
- static const char vtable[] = "vtable";
-
- if ((cu->language == language_java
- && strncmp (name, vtable, sizeof (vtable) - 1) == 0)
- || (strncmp (name, vptr, sizeof (vptr) - 1) == 0
- && is_cplus_marker (name[sizeof (vptr) - 1])))
- return 1;
- return 0;
- }
- static void
- quirk_gcc_member_function_pointer (struct type *type, struct objfile *objfile)
- {
- struct type *pfn_type, *domain_type, *new_type;
-
- if (TYPE_CODE (type) != TYPE_CODE_STRUCT || TYPE_NFIELDS (type) != 2)
- return;
-
- if (TYPE_FIELD_NAME (type, 0) == NULL
- || strcmp (TYPE_FIELD_NAME (type, 0), "__pfn") != 0
- || TYPE_FIELD_NAME (type, 1) == NULL
- || strcmp (TYPE_FIELD_NAME (type, 1), "__delta") != 0)
- return;
-
- pfn_type = TYPE_FIELD_TYPE (type, 0);
- if (pfn_type == NULL
- || TYPE_CODE (pfn_type) != TYPE_CODE_PTR
- || TYPE_CODE (TYPE_TARGET_TYPE (pfn_type)) != TYPE_CODE_FUNC)
- return;
-
- pfn_type = TYPE_TARGET_TYPE (pfn_type);
- if (TYPE_NFIELDS (pfn_type) == 0
-
- || TYPE_CODE (TYPE_FIELD_TYPE (pfn_type, 0)) != TYPE_CODE_PTR)
- return;
- domain_type = TYPE_TARGET_TYPE (TYPE_FIELD_TYPE (pfn_type, 0));
- new_type = alloc_type (objfile);
- smash_to_method_type (new_type, domain_type, TYPE_TARGET_TYPE (pfn_type),
- TYPE_FIELDS (pfn_type), TYPE_NFIELDS (pfn_type),
- TYPE_VARARGS (pfn_type));
- smash_to_methodptr_type (type, new_type);
- }
- static int
- producer_is_icc (struct dwarf2_cu *cu)
- {
- if (!cu->checked_producer)
- check_producer (cu);
- return cu->producer_is_icc;
- }
- static struct type *
- read_structure_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct type *type;
- struct attribute *attr;
- const char *name;
-
- attr = dwarf2_attr_no_follow (die, DW_AT_signature);
- if (attr)
- {
- type = get_DW_AT_signature_type (die, attr, cu);
-
- return set_die_type (die, type, cu);
- }
- type = alloc_type (objfile);
- INIT_CPLUS_SPECIFIC (type);
- name = dwarf2_name (die, cu);
- if (name != NULL)
- {
- if (cu->language == language_cplus
- || cu->language == language_java)
- {
- const char *full_name = dwarf2_full_name (name, die, cu);
-
- if (get_die_type (die, cu) != NULL)
- return get_die_type (die, cu);
- TYPE_TAG_NAME (type) = full_name;
- if (die->tag == DW_TAG_structure_type
- || die->tag == DW_TAG_class_type)
- TYPE_NAME (type) = TYPE_TAG_NAME (type);
- }
- else
- {
-
- TYPE_TAG_NAME (type) = name;
- if (die->tag == DW_TAG_class_type)
- TYPE_NAME (type) = TYPE_TAG_NAME (type);
- }
- }
- if (die->tag == DW_TAG_structure_type)
- {
- TYPE_CODE (type) = TYPE_CODE_STRUCT;
- }
- else if (die->tag == DW_TAG_union_type)
- {
- TYPE_CODE (type) = TYPE_CODE_UNION;
- }
- else
- {
- TYPE_CODE (type) = TYPE_CODE_STRUCT;
- }
- if (cu->language == language_cplus && die->tag == DW_TAG_class_type)
- TYPE_DECLARED_CLASS (type) = 1;
- attr = dwarf2_attr (die, DW_AT_byte_size, cu);
- if (attr)
- {
- TYPE_LENGTH (type) = DW_UNSND (attr);
- }
- else
- {
- TYPE_LENGTH (type) = 0;
- }
- if (producer_is_icc (cu) && (TYPE_LENGTH (type) == 0))
- {
-
- TYPE_STUB (type) = 1;
- }
- else
- TYPE_STUB_SUPPORTED (type) = 1;
- if (die_is_declaration (die, cu))
- TYPE_STUB (type) = 1;
- else if (attr == NULL && die->child == NULL
- && producer_is_realview (cu->producer))
-
- TYPE_STUB (type) = 1;
-
- set_die_type (die, type, cu);
-
- set_descriptive_type (type, die, cu);
- return type;
- }
- static void
- process_structure_scope (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct die_info *child_die;
- struct type *type;
- type = get_die_type (die, cu);
- if (type == NULL)
- type = read_structure_type (die, cu);
- if (die->child != NULL && ! die_is_declaration (die, cu))
- {
- struct field_info fi;
- VEC (symbolp) *template_args = NULL;
- struct cleanup *back_to = make_cleanup (null_cleanup, 0);
- memset (&fi, 0, sizeof (struct field_info));
- child_die = die->child;
- while (child_die && child_die->tag)
- {
- if (child_die->tag == DW_TAG_member
- || child_die->tag == DW_TAG_variable)
- {
-
- dwarf2_add_field (&fi, child_die, cu);
- }
- else if (child_die->tag == DW_TAG_subprogram)
- {
-
- dwarf2_add_member_fn (&fi, child_die, type, cu);
- }
- else if (child_die->tag == DW_TAG_inheritance)
- {
-
- dwarf2_add_field (&fi, child_die, cu);
- }
- else if (child_die->tag == DW_TAG_typedef)
- dwarf2_add_typedef (&fi, child_die, cu);
- else if (child_die->tag == DW_TAG_template_type_param
- || child_die->tag == DW_TAG_template_value_param)
- {
- struct symbol *arg = new_symbol (child_die, NULL, cu);
- if (arg != NULL)
- VEC_safe_push (symbolp, template_args, arg);
- }
- child_die = sibling_die (child_die);
- }
-
- if (! VEC_empty (symbolp, template_args))
- {
- ALLOCATE_CPLUS_STRUCT_TYPE (type);
- TYPE_N_TEMPLATE_ARGUMENTS (type)
- = VEC_length (symbolp, template_args);
- TYPE_TEMPLATE_ARGUMENTS (type)
- = obstack_alloc (&objfile->objfile_obstack,
- (TYPE_N_TEMPLATE_ARGUMENTS (type)
- * sizeof (struct symbol *)));
- memcpy (TYPE_TEMPLATE_ARGUMENTS (type),
- VEC_address (symbolp, template_args),
- (TYPE_N_TEMPLATE_ARGUMENTS (type)
- * sizeof (struct symbol *)));
- VEC_free (symbolp, template_args);
- }
-
- if (fi.nfields)
- dwarf2_attach_fields_to_type (&fi, type, cu);
- if (fi.nfnfields)
- {
- dwarf2_attach_fn_fields_to_type (&fi, type, cu);
-
- if (dwarf2_attr (die, DW_AT_containing_type, cu) != NULL)
- {
- struct type *t = die_containing_type (die, cu);
- TYPE_VPTR_BASETYPE (type) = t;
- if (type == t)
- {
- int i;
-
- for (i = TYPE_NFIELDS (t) - 1;
- i >= TYPE_N_BASECLASSES (t);
- --i)
- {
- const char *fieldname = TYPE_FIELD_NAME (t, i);
- if (is_vtable_name (fieldname, cu))
- {
- TYPE_VPTR_FIELDNO (type) = i;
- break;
- }
- }
-
- if (i < TYPE_N_BASECLASSES (t))
- complaint (&symfile_complaints,
- _("virtual function table pointer "
- "not found when defining class '%s'"),
- TYPE_TAG_NAME (type) ? TYPE_TAG_NAME (type) :
- "");
- }
- else
- {
- TYPE_VPTR_FIELDNO (type) = TYPE_VPTR_FIELDNO (t);
- }
- }
- else if (cu->producer
- && strncmp (cu->producer,
- "IBM(R) XL C/C++ Advanced Edition", 32) == 0)
- {
-
- int i;
- for (i = TYPE_NFIELDS (type) - 1;
- i >= TYPE_N_BASECLASSES (type);
- --i)
- {
- if (strcmp (TYPE_FIELD_NAME (type, i), "__vfp") == 0)
- {
- TYPE_VPTR_FIELDNO (type) = i;
- TYPE_VPTR_BASETYPE (type) = type;
- break;
- }
- }
- }
- }
-
- if (fi.typedef_field_list)
- {
- int i = fi.typedef_field_list_count;
- ALLOCATE_CPLUS_STRUCT_TYPE (type);
- TYPE_TYPEDEF_FIELD_ARRAY (type)
- = TYPE_ALLOC (type, sizeof (TYPE_TYPEDEF_FIELD (type, 0)) * i);
- TYPE_TYPEDEF_FIELD_COUNT (type) = i;
-
- while (--i >= 0)
- {
- struct typedef_field *dest, *src;
- dest = &TYPE_TYPEDEF_FIELD (type, i);
- src = &fi.typedef_field_list->field;
- fi.typedef_field_list = fi.typedef_field_list->next;
- *dest = *src;
- }
- }
- do_cleanups (back_to);
- if (HAVE_CPLUS_STRUCT (type))
- TYPE_CPLUS_REALLY_JAVA (type) = cu->language == language_java;
- }
- quirk_gcc_member_function_pointer (type, objfile);
-
- child_die = die->child;
- while (child_die != NULL && child_die->tag)
- {
- if (child_die->tag == DW_TAG_member
- || child_die->tag == DW_TAG_variable
- || child_die->tag == DW_TAG_inheritance
- || child_die->tag == DW_TAG_template_value_param
- || child_die->tag == DW_TAG_template_type_param)
- {
-
- }
- else
- process_die (child_die, cu);
- child_die = sibling_die (child_die);
- }
-
- if (dwarf2_attr (die, DW_AT_byte_size, cu) != NULL
- || !die_is_declaration (die, cu))
- new_symbol (die, type, cu);
- }
- static void
- update_enumeration_type_from_children (struct die_info *die,
- struct type *type,
- struct dwarf2_cu *cu)
- {
- struct obstack obstack;
- struct die_info *child_die;
- int unsigned_enum = 1;
- int flag_enum = 1;
- ULONGEST mask = 0;
- struct cleanup *old_chain;
- obstack_init (&obstack);
- old_chain = make_cleanup_obstack_free (&obstack);
- for (child_die = die->child;
- child_die != NULL && child_die->tag;
- child_die = sibling_die (child_die))
- {
- struct attribute *attr;
- LONGEST value;
- const gdb_byte *bytes;
- struct dwarf2_locexpr_baton *baton;
- const char *name;
- if (child_die->tag != DW_TAG_enumerator)
- continue;
- attr = dwarf2_attr (child_die, DW_AT_const_value, cu);
- if (attr == NULL)
- continue;
- name = dwarf2_name (child_die, cu);
- if (name == NULL)
- name = "<anonymous enumerator>";
- dwarf2_const_value_attr (attr, type, name, &obstack, cu,
- &value, &bytes, &baton);
- if (value < 0)
- {
- unsigned_enum = 0;
- flag_enum = 0;
- }
- else if ((mask & value) != 0)
- flag_enum = 0;
- else
- mask |= value;
-
- if (!unsigned_enum && !flag_enum)
- break;
- }
- if (unsigned_enum)
- TYPE_UNSIGNED (type) = 1;
- if (flag_enum)
- TYPE_FLAG_ENUM (type) = 1;
- do_cleanups (old_chain);
- }
- static struct type *
- read_enumeration_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct type *type;
- struct attribute *attr;
- const char *name;
-
- attr = dwarf2_attr_no_follow (die, DW_AT_signature);
- if (attr)
- {
- type = get_DW_AT_signature_type (die, attr, cu);
-
- return set_die_type (die, type, cu);
- }
- type = alloc_type (objfile);
- TYPE_CODE (type) = TYPE_CODE_ENUM;
- name = dwarf2_full_name (NULL, die, cu);
- if (name != NULL)
- TYPE_TAG_NAME (type) = name;
- attr = dwarf2_attr (die, DW_AT_type, cu);
- if (attr != NULL)
- {
- struct type *underlying_type = die_type (die, cu);
- TYPE_TARGET_TYPE (type) = underlying_type;
- }
- attr = dwarf2_attr (die, DW_AT_byte_size, cu);
- if (attr)
- {
- TYPE_LENGTH (type) = DW_UNSND (attr);
- }
- else
- {
- TYPE_LENGTH (type) = 0;
- }
-
- if (die_is_declaration (die, cu))
- TYPE_STUB (type) = 1;
-
- update_enumeration_type_from_children (die, type, cu);
-
- if (TYPE_TARGET_TYPE (type) != NULL && !TYPE_STUB (TYPE_TARGET_TYPE (type)))
- {
- TYPE_UNSIGNED (type) = TYPE_UNSIGNED (TYPE_TARGET_TYPE (type));
- if (TYPE_LENGTH (type) == 0)
- TYPE_LENGTH (type) = TYPE_LENGTH (TYPE_TARGET_TYPE (type));
- }
- TYPE_DECLARED_CLASS (type) = dwarf2_flag_true_p (die, DW_AT_enum_class, cu);
- return set_die_type (die, type, cu);
- }
- static void
- process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct type *this_type;
- this_type = get_die_type (die, cu);
- if (this_type == NULL)
- this_type = read_enumeration_type (die, cu);
- if (die->child != NULL)
- {
- struct die_info *child_die;
- struct symbol *sym;
- struct field *fields = NULL;
- int num_fields = 0;
- const char *name;
- child_die = die->child;
- while (child_die && child_die->tag)
- {
- if (child_die->tag != DW_TAG_enumerator)
- {
- process_die (child_die, cu);
- }
- else
- {
- name = dwarf2_name (child_die, cu);
- if (name)
- {
- sym = new_symbol (child_die, this_type, cu);
- if ((num_fields % DW_FIELD_ALLOC_CHUNK) == 0)
- {
- fields = (struct field *)
- xrealloc (fields,
- (num_fields + DW_FIELD_ALLOC_CHUNK)
- * sizeof (struct field));
- }
- FIELD_NAME (fields[num_fields]) = SYMBOL_LINKAGE_NAME (sym);
- FIELD_TYPE (fields[num_fields]) = NULL;
- SET_FIELD_ENUMVAL (fields[num_fields], SYMBOL_VALUE (sym));
- FIELD_BITSIZE (fields[num_fields]) = 0;
- num_fields++;
- }
- }
- child_die = sibling_die (child_die);
- }
- if (num_fields)
- {
- TYPE_NFIELDS (this_type) = num_fields;
- TYPE_FIELDS (this_type) = (struct field *)
- TYPE_ALLOC (this_type, sizeof (struct field) * num_fields);
- memcpy (TYPE_FIELDS (this_type), fields,
- sizeof (struct field) * num_fields);
- xfree (fields);
- }
- }
-
- if (cu->per_cu->is_debug_types
- && die_is_declaration (die, cu))
- {
- struct signatured_type *sig_type;
- sig_type = (struct signatured_type *) cu->per_cu;
- gdb_assert (sig_type->type_offset_in_section.sect_off != 0);
- if (sig_type->type_offset_in_section.sect_off != die->offset.sect_off)
- return;
- }
- new_symbol (die, this_type, cu);
- }
- static struct type *
- read_array_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct die_info *child_die;
- struct type *type;
- struct type *element_type, *range_type, *index_type;
- struct type **range_types = NULL;
- struct attribute *attr;
- int ndim = 0;
- struct cleanup *back_to;
- const char *name;
- unsigned int bit_stride = 0;
- element_type = die_type (die, cu);
-
- type = get_die_type (die, cu);
- if (type)
- return type;
- attr = dwarf2_attr (die, DW_AT_byte_stride, cu);
- if (attr != NULL)
- bit_stride = DW_UNSND (attr) * 8;
- attr = dwarf2_attr (die, DW_AT_bit_stride, cu);
- if (attr != NULL)
- bit_stride = DW_UNSND (attr);
-
- if (die->child == NULL)
- {
- index_type = objfile_type (objfile)->builtin_int;
- range_type = create_static_range_type (NULL, index_type, 0, -1);
- type = create_array_type_with_stride (NULL, element_type, range_type,
- bit_stride);
- return set_die_type (die, type, cu);
- }
- back_to = make_cleanup (null_cleanup, NULL);
- child_die = die->child;
- while (child_die && child_die->tag)
- {
- if (child_die->tag == DW_TAG_subrange_type)
- {
- struct type *child_type = read_type_die (child_die, cu);
- if (child_type != NULL)
- {
-
- if ((ndim % DW_FIELD_ALLOC_CHUNK) == 0)
- {
- range_types = (struct type **)
- xrealloc (range_types, (ndim + DW_FIELD_ALLOC_CHUNK)
- * sizeof (struct type *));
- if (ndim == 0)
- make_cleanup (free_current_contents, &range_types);
- }
- range_types[ndim++] = child_type;
- }
- }
- child_die = sibling_die (child_die);
- }
-
- type = element_type;
- if (read_array_order (die, cu) == DW_ORD_col_major)
- {
- int i = 0;
- while (i < ndim)
- type = create_array_type_with_stride (NULL, type, range_types[i++],
- bit_stride);
- }
- else
- {
- while (ndim-- > 0)
- type = create_array_type_with_stride (NULL, type, range_types[ndim],
- bit_stride);
- }
-
- attr = dwarf2_attr (die, DW_AT_GNU_vector, cu);
- if (attr)
- make_vector_type (type);
-
- attr = dwarf2_attr (die, DW_AT_byte_size, cu);
- if (attr)
- {
- if (DW_UNSND (attr) >= TYPE_LENGTH (type))
- TYPE_LENGTH (type) = DW_UNSND (attr);
- else
- complaint (&symfile_complaints,
- _("DW_AT_byte_size for array type smaller "
- "than the total size of elements"));
- }
- name = dwarf2_name (die, cu);
- if (name)
- TYPE_NAME (type) = name;
-
- set_die_type (die, type, cu);
-
- set_descriptive_type (type, die, cu);
- do_cleanups (back_to);
- return type;
- }
- static enum dwarf_array_dim_ordering
- read_array_order (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct attribute *attr;
- attr = dwarf2_attr (die, DW_AT_ordering, cu);
- if (attr) return DW_SND (attr);
-
- FIXME
- if (cu->language == language_fortran
- && cu->producer && strstr (cu->producer, "GNU F77"))
- {
- return DW_ORD_row_major;
- }
- switch (cu->language_defn->la_array_ordering)
- {
- case array_column_major:
- return DW_ORD_col_major;
- case array_row_major:
- default:
- return DW_ORD_row_major;
- };
- }
- static struct type *
- read_set_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct type *domain_type, *set_type;
- struct attribute *attr;
- domain_type = die_type (die, cu);
-
- set_type = get_die_type (die, cu);
- if (set_type)
- return set_type;
- set_type = create_set_type (NULL, domain_type);
- attr = dwarf2_attr (die, DW_AT_byte_size, cu);
- if (attr)
- TYPE_LENGTH (set_type) = DW_UNSND (attr);
- return set_die_type (die, set_type, cu);
- }
- static void
- mark_common_block_symbol_computed (struct symbol *sym,
- struct die_info *common_die,
- struct attribute *common_loc,
- struct attribute *member_loc,
- struct dwarf2_cu *cu)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwarf2_locexpr_baton *baton;
- gdb_byte *ptr;
- unsigned int cu_off;
- enum bfd_endian byte_order = gdbarch_byte_order (get_objfile_arch (objfile));
- LONGEST offset = 0;
- gdb_assert (common_loc && member_loc);
- gdb_assert (attr_form_is_block (common_loc));
- gdb_assert (attr_form_is_block (member_loc)
- || attr_form_is_constant (member_loc));
- baton = obstack_alloc (&objfile->objfile_obstack,
- sizeof (struct dwarf2_locexpr_baton));
- baton->per_cu = cu->per_cu;
- gdb_assert (baton->per_cu);
- baton->size = 5 + 1 ;
- if (attr_form_is_constant (member_loc))
- {
- offset = dwarf2_get_attr_constant_value (member_loc, 0);
- baton->size += 1 + cu->header.addr_size;
- }
- else
- baton->size += DW_BLOCK (member_loc)->size;
- ptr = obstack_alloc (&objfile->objfile_obstack, baton->size);
- baton->data = ptr;
- *ptr++ = DW_OP_call4;
- cu_off = common_die->offset.sect_off - cu->per_cu->offset.sect_off;
- store_unsigned_integer (ptr, 4, byte_order, cu_off);
- ptr += 4;
- if (attr_form_is_constant (member_loc))
- {
- *ptr++ = DW_OP_addr;
- store_unsigned_integer (ptr, cu->header.addr_size, byte_order, offset);
- ptr += cu->header.addr_size;
- }
- else
- {
-
- memcpy (ptr, DW_BLOCK (member_loc)->data, DW_BLOCK (member_loc)->size);
- ptr += DW_BLOCK (member_loc)->size;
- }
- *ptr++ = DW_OP_plus;
- gdb_assert (ptr - baton->data == baton->size);
- SYMBOL_LOCATION_BATON (sym) = baton;
- SYMBOL_ACLASS_INDEX (sym) = dwarf2_locexpr_index;
- }
- static void
- read_common_block (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct attribute *attr;
- attr = dwarf2_attr (die, DW_AT_location, cu);
- if (attr)
- {
-
- if (attr_form_is_block (attr))
- {
-
- }
- else if (attr_form_is_section_offset (attr))
- {
- dwarf2_complex_location_expr_complaint ();
- attr = NULL;
- }
- else
- {
- dwarf2_invalid_attrib_class_complaint ("DW_AT_location",
- "common block member");
- attr = NULL;
- }
- }
- if (die->child != NULL)
- {
- struct objfile *objfile = cu->objfile;
- struct die_info *child_die;
- size_t n_entries = 0, size;
- struct common_block *common_block;
- struct symbol *sym;
- for (child_die = die->child;
- child_die && child_die->tag;
- child_die = sibling_die (child_die))
- ++n_entries;
- size = (sizeof (struct common_block)
- + (n_entries - 1) * sizeof (struct symbol *));
- common_block = obstack_alloc (&objfile->objfile_obstack, size);
- memset (common_block->contents, 0, n_entries * sizeof (struct symbol *));
- common_block->n_entries = 0;
- for (child_die = die->child;
- child_die && child_die->tag;
- child_die = sibling_die (child_die))
- {
-
- sym = new_symbol (child_die, NULL, cu);
- if (sym != NULL)
- {
- struct attribute *member_loc;
- common_block->contents[common_block->n_entries++] = sym;
- member_loc = dwarf2_attr (child_die, DW_AT_data_member_location,
- cu);
- if (member_loc)
- {
-
- complaint (&symfile_complaints,
- _("Variable in common block has "
- "DW_AT_data_member_location "
- "- DIE at 0x%x [in module %s]"),
- child_die->offset.sect_off,
- objfile_name (cu->objfile));
- if (attr_form_is_section_offset (member_loc))
- dwarf2_complex_location_expr_complaint ();
- else if (attr_form_is_constant (member_loc)
- || attr_form_is_block (member_loc))
- {
- if (attr)
- mark_common_block_symbol_computed (sym, die, attr,
- member_loc, cu);
- }
- else
- dwarf2_complex_location_expr_complaint ();
- }
- }
- }
- sym = new_symbol (die, objfile_type (objfile)->builtin_void, cu);
- SYMBOL_VALUE_COMMON_BLOCK (sym) = common_block;
- }
- }
- static struct type *
- read_namespace_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- const char *previous_prefix, *name;
- int is_anonymous;
- struct type *type;
-
- if (dwarf2_attr (die, DW_AT_extension, cu) != NULL)
- {
- struct die_info *ext_die;
- struct dwarf2_cu *ext_cu = cu;
- ext_die = dwarf2_extension (die, &ext_cu);
- type = read_type_die (ext_die, ext_cu);
-
- return set_die_type (die, type, cu);
- }
- name = namespace_name (die, &is_anonymous, cu);
-
- previous_prefix = determine_prefix (die, cu);
- if (previous_prefix[0] != '\0')
- name = typename_concat (&objfile->objfile_obstack,
- previous_prefix, name, 0, cu);
-
- type = init_type (TYPE_CODE_NAMESPACE, 0, 0, NULL,
- objfile);
- TYPE_NAME (type) = name;
- TYPE_TAG_NAME (type) = TYPE_NAME (type);
- return set_die_type (die, type, cu);
- }
- static void
- read_namespace (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- int is_anonymous;
-
- if (dwarf2_attr (die, DW_AT_extension, cu) == NULL)
- {
- struct type *type;
- type = read_type_die (die, cu);
- new_symbol (die, type, cu);
- namespace_name (die, &is_anonymous, cu);
- if (is_anonymous)
- {
- const char *previous_prefix = determine_prefix (die, cu);
- cp_add_using_directive (previous_prefix, TYPE_NAME (type), NULL,
- NULL, NULL, 0, &objfile->objfile_obstack);
- }
- }
- if (die->child != NULL)
- {
- struct die_info *child_die = die->child;
- while (child_die && child_die->tag)
- {
- process_die (child_die, cu);
- child_die = sibling_die (child_die);
- }
- }
- }
- static struct type *
- read_module_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- const char *module_name;
- struct type *type;
- module_name = dwarf2_name (die, cu);
- if (!module_name)
- complaint (&symfile_complaints,
- _("DW_TAG_module has no name, offset 0x%x"),
- die->offset.sect_off);
- type = init_type (TYPE_CODE_MODULE, 0, 0, module_name, objfile);
-
- TYPE_TAG_NAME (type) = TYPE_NAME (type);
- return set_die_type (die, type, cu);
- }
- static void
- read_module (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct die_info *child_die = die->child;
- struct type *type;
- type = read_type_die (die, cu);
- new_symbol (die, type, cu);
- while (child_die && child_die->tag)
- {
- process_die (child_die, cu);
- child_die = sibling_die (child_die);
- }
- }
- static const char *
- namespace_name (struct die_info *die, int *is_anonymous, struct dwarf2_cu *cu)
- {
- struct die_info *current_die;
- const char *name = NULL;
-
- for (current_die = die;
- current_die != NULL;
- current_die = dwarf2_extension (die, &cu))
- {
- name = dwarf2_name (current_die, cu);
- if (name != NULL)
- break;
- }
-
- *is_anonymous = (name == NULL);
- if (*is_anonymous)
- name = CP_ANONYMOUS_NAMESPACE_STR;
- return name;
- }
- static struct type *
- read_tag_pointer_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct gdbarch *gdbarch = get_objfile_arch (cu->objfile);
- struct comp_unit_head *cu_header = &cu->header;
- struct type *type;
- struct attribute *attr_byte_size;
- struct attribute *attr_address_class;
- int byte_size, addr_class;
- struct type *target_type;
- target_type = die_type (die, cu);
-
- type = get_die_type (die, cu);
- if (type)
- return type;
- type = lookup_pointer_type (target_type);
- attr_byte_size = dwarf2_attr (die, DW_AT_byte_size, cu);
- if (attr_byte_size)
- byte_size = DW_UNSND (attr_byte_size);
- else
- byte_size = cu_header->addr_size;
- attr_address_class = dwarf2_attr (die, DW_AT_address_class, cu);
- if (attr_address_class)
- addr_class = DW_UNSND (attr_address_class);
- else
- addr_class = DW_ADDR_none;
-
- if (TYPE_LENGTH (type) != byte_size || addr_class != DW_ADDR_none)
- {
- if (gdbarch_address_class_type_flags_p (gdbarch))
- {
- int type_flags;
- type_flags = gdbarch_address_class_type_flags
- (gdbarch, byte_size, addr_class);
- gdb_assert ((type_flags & ~TYPE_INSTANCE_FLAG_ADDRESS_CLASS_ALL)
- == 0);
- type = make_type_with_address_space (type, type_flags);
- }
- else if (TYPE_LENGTH (type) != byte_size)
- {
- complaint (&symfile_complaints,
- _("invalid pointer size %d"), byte_size);
- }
- else
- {
-
- }
- }
- TYPE_LENGTH (type) = byte_size;
- return set_die_type (die, type, cu);
- }
- static struct type *
- read_tag_ptr_to_member_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct type *type;
- struct type *to_type;
- struct type *domain;
- to_type = die_type (die, cu);
- domain = die_containing_type (die, cu);
-
- type = get_die_type (die, cu);
- if (type)
- return type;
- if (TYPE_CODE (check_typedef (to_type)) == TYPE_CODE_METHOD)
- type = lookup_methodptr_type (to_type);
- else if (TYPE_CODE (check_typedef (to_type)) == TYPE_CODE_FUNC)
- {
- struct type *new_type = alloc_type (cu->objfile);
- smash_to_method_type (new_type, domain, TYPE_TARGET_TYPE (to_type),
- TYPE_FIELDS (to_type), TYPE_NFIELDS (to_type),
- TYPE_VARARGS (to_type));
- type = lookup_methodptr_type (new_type);
- }
- else
- type = lookup_memberptr_type (to_type, domain);
- return set_die_type (die, type, cu);
- }
- static struct type *
- read_tag_reference_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct comp_unit_head *cu_header = &cu->header;
- struct type *type, *target_type;
- struct attribute *attr;
- target_type = die_type (die, cu);
-
- type = get_die_type (die, cu);
- if (type)
- return type;
- type = lookup_reference_type (target_type);
- attr = dwarf2_attr (die, DW_AT_byte_size, cu);
- if (attr)
- {
- TYPE_LENGTH (type) = DW_UNSND (attr);
- }
- else
- {
- TYPE_LENGTH (type) = cu_header->addr_size;
- }
- return set_die_type (die, type, cu);
- }
- static struct type *
- add_array_cv_type (struct die_info *die, struct dwarf2_cu *cu,
- struct type *base_type, int cnst, int voltl)
- {
- struct type *el_type, *inner_array;
- base_type = copy_type (base_type);
- inner_array = base_type;
- while (TYPE_CODE (TYPE_TARGET_TYPE (inner_array)) == TYPE_CODE_ARRAY)
- {
- TYPE_TARGET_TYPE (inner_array) =
- copy_type (TYPE_TARGET_TYPE (inner_array));
- inner_array = TYPE_TARGET_TYPE (inner_array);
- }
- el_type = TYPE_TARGET_TYPE (inner_array);
- cnst |= TYPE_CONST (el_type);
- voltl |= TYPE_VOLATILE (el_type);
- TYPE_TARGET_TYPE (inner_array) = make_cv_type (cnst, voltl, el_type, NULL);
- return set_die_type (die, base_type, cu);
- }
- static struct type *
- read_tag_const_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct type *base_type, *cv_type;
- base_type = die_type (die, cu);
-
- cv_type = get_die_type (die, cu);
- if (cv_type)
- return cv_type;
-
- if (TYPE_CODE (base_type) == TYPE_CODE_ARRAY)
- return add_array_cv_type (die, cu, base_type, 1, 0);
- cv_type = make_cv_type (1, TYPE_VOLATILE (base_type), base_type, 0);
- return set_die_type (die, cv_type, cu);
- }
- static struct type *
- read_tag_volatile_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct type *base_type, *cv_type;
- base_type = die_type (die, cu);
-
- cv_type = get_die_type (die, cu);
- if (cv_type)
- return cv_type;
-
- if (TYPE_CODE (base_type) == TYPE_CODE_ARRAY)
- return add_array_cv_type (die, cu, base_type, 0, 1);
- cv_type = make_cv_type (TYPE_CONST (base_type), 1, base_type, 0);
- return set_die_type (die, cv_type, cu);
- }
- static struct type *
- read_tag_restrict_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct type *base_type, *cv_type;
- base_type = die_type (die, cu);
-
- cv_type = get_die_type (die, cu);
- if (cv_type)
- return cv_type;
- cv_type = make_restrict_type (base_type);
- return set_die_type (die, cv_type, cu);
- }
- static struct type *
- read_tag_string_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- struct type *type, *range_type, *index_type, *char_type;
- struct attribute *attr;
- unsigned int length;
- attr = dwarf2_attr (die, DW_AT_string_length, cu);
- if (attr)
- {
- length = DW_UNSND (attr);
- }
- else
- {
-
- attr = dwarf2_attr (die, DW_AT_byte_size, cu);
- if (attr)
- {
- length = DW_UNSND (attr);
- }
- else
- {
- length = 1;
- }
- }
- index_type = objfile_type (objfile)->builtin_int;
- range_type = create_static_range_type (NULL, index_type, 1, length);
- char_type = language_string_char_type (cu->language_defn, gdbarch);
- type = create_string_type (NULL, char_type, range_type);
- return set_die_type (die, type, cu);
- }
- static int
- prototyped_function_p (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct attribute *attr;
- attr = dwarf2_attr (die, DW_AT_prototyped, cu);
- if (attr && (DW_UNSND (attr) != 0))
- return 1;
-
- if (cu->language != language_c
- && cu->language != language_objc
- && cu->language != language_opencl)
- return 1;
-
- if (producer_is_realview (cu->producer))
- return 1;
- return 0;
- }
- static struct type *
- read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct type *type;
- struct type *ftype;
- struct attribute *attr;
- type = die_type (die, cu);
-
- ftype = get_die_type (die, cu);
- if (ftype)
- return ftype;
- ftype = lookup_function_type (type);
- if (prototyped_function_p (die, cu))
- TYPE_PROTOTYPED (ftype) = 1;
-
- attr = dwarf2_attr (die, DW_AT_calling_convention, cu);
- if (attr)
- TYPE_CALLING_CONVENTION (ftype) = DW_UNSND (attr);
- else if (cu->producer && strstr (cu->producer, "IBM XL C for OpenCL"))
- TYPE_CALLING_CONVENTION (ftype) = DW_CC_GDB_IBM_OpenCL;
- else
- TYPE_CALLING_CONVENTION (ftype) = DW_CC_normal;
-
- set_die_type (die, ftype, cu);
- if (die->child != NULL)
- {
- struct type *void_type = objfile_type (objfile)->builtin_void;
- struct die_info *child_die;
- int nparams, iparams;
-
- FIXME
- nparams = 0;
- child_die = die->child;
- while (child_die && child_die->tag)
- {
- if (child_die->tag == DW_TAG_formal_parameter)
- nparams++;
- else if (child_die->tag == DW_TAG_unspecified_parameters)
- TYPE_VARARGS (ftype) = 1;
- child_die = sibling_die (child_die);
- }
-
- TYPE_NFIELDS (ftype) = nparams;
- TYPE_FIELDS (ftype) = (struct field *)
- TYPE_ZALLOC (ftype, nparams * sizeof (struct field));
-
- for (iparams = 0; iparams < nparams; iparams++)
- TYPE_FIELD_TYPE (ftype, iparams) = void_type;
- iparams = 0;
- child_die = die->child;
- while (child_die && child_die->tag)
- {
- if (child_die->tag == DW_TAG_formal_parameter)
- {
- struct type *arg_type;
-
- attr = dwarf2_attr (child_die, DW_AT_artificial, cu);
- if (attr)
- TYPE_FIELD_ARTIFICIAL (ftype, iparams) = DW_UNSND (attr);
- else
- {
- TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 0;
-
- if (cu->language == language_java)
- {
- const char *name = dwarf2_name (child_die, cu);
- if (name && !strcmp (name, "this"))
- TYPE_FIELD_ARTIFICIAL (ftype, iparams) = 1;
- }
- }
- arg_type = die_type (child_die, cu);
-
- if (cu->language == language_cplus && !TYPE_CONST (arg_type)
- && TYPE_FIELD_ARTIFICIAL (ftype, iparams))
- {
- int is_this = 0;
- struct dwarf2_cu *arg_cu = cu;
- const char *name = dwarf2_name (child_die, cu);
- attr = dwarf2_attr (die, DW_AT_object_pointer, cu);
- if (attr)
- {
-
- if (follow_die_ref (die, attr, &arg_cu) == child_die)
- is_this = 1;
- }
- else if (name && strcmp (name, "this") == 0)
-
- is_this = 1;
- else if (name == NULL && iparams == 0)
-
- is_this = 1;
- if (is_this)
- arg_type = make_cv_type (1, TYPE_VOLATILE (arg_type),
- arg_type, 0);
- }
- TYPE_FIELD_TYPE (ftype, iparams) = arg_type;
- iparams++;
- }
- child_die = sibling_die (child_die);
- }
- }
- return ftype;
- }
- static struct type *
- read_typedef (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- const char *name = NULL;
- struct type *this_type, *target_type;
- name = dwarf2_full_name (NULL, die, cu);
- this_type = init_type (TYPE_CODE_TYPEDEF, 0,
- TYPE_FLAG_TARGET_STUB, NULL, objfile);
- TYPE_NAME (this_type) = name;
- set_die_type (die, this_type, cu);
- target_type = die_type (die, cu);
- if (target_type != this_type)
- TYPE_TARGET_TYPE (this_type) = target_type;
- else
- {
-
- complaint (&symfile_complaints,
- _("Self-referential DW_TAG_typedef "
- "- DIE at 0x%x [in module %s]"),
- die->offset.sect_off, objfile_name (objfile));
- TYPE_TARGET_TYPE (this_type) = NULL;
- }
- return this_type;
- }
- static struct type *
- read_base_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct type *type;
- struct attribute *attr;
- int encoding = 0, size = 0;
- const char *name;
- enum type_code code = TYPE_CODE_INT;
- int type_flags = 0;
- struct type *target_type = NULL;
- attr = dwarf2_attr (die, DW_AT_encoding, cu);
- if (attr)
- {
- encoding = DW_UNSND (attr);
- }
- attr = dwarf2_attr (die, DW_AT_byte_size, cu);
- if (attr)
- {
- size = DW_UNSND (attr);
- }
- name = dwarf2_name (die, cu);
- if (!name)
- {
- complaint (&symfile_complaints,
- _("DW_AT_name missing from DW_TAG_base_type"));
- }
- switch (encoding)
- {
- case DW_ATE_address:
-
- code = TYPE_CODE_PTR;
- type_flags |= TYPE_FLAG_UNSIGNED;
- target_type = init_type (TYPE_CODE_VOID, 1, 0, NULL, objfile);
- break;
- case DW_ATE_boolean:
- code = TYPE_CODE_BOOL;
- type_flags |= TYPE_FLAG_UNSIGNED;
- break;
- case DW_ATE_complex_float:
- code = TYPE_CODE_COMPLEX;
- target_type = init_type (TYPE_CODE_FLT, size / 2, 0, NULL, objfile);
- break;
- case DW_ATE_decimal_float:
- code = TYPE_CODE_DECFLOAT;
- break;
- case DW_ATE_float:
- code = TYPE_CODE_FLT;
- break;
- case DW_ATE_signed:
- break;
- case DW_ATE_unsigned:
- type_flags |= TYPE_FLAG_UNSIGNED;
- if (cu->language == language_fortran
- && name
- && strncmp (name, "character(", sizeof ("character(") - 1) == 0)
- code = TYPE_CODE_CHAR;
- break;
- case DW_ATE_signed_char:
- if (cu->language == language_ada || cu->language == language_m2
- || cu->language == language_pascal
- || cu->language == language_fortran)
- code = TYPE_CODE_CHAR;
- break;
- case DW_ATE_unsigned_char:
- if (cu->language == language_ada || cu->language == language_m2
- || cu->language == language_pascal
- || cu->language == language_fortran)
- code = TYPE_CODE_CHAR;
- type_flags |= TYPE_FLAG_UNSIGNED;
- break;
- case DW_ATE_UTF:
-
- break;
- default:
- complaint (&symfile_complaints, _("unsupported DW_AT_encoding: '%s'"),
- dwarf_type_encoding_name (encoding));
- break;
- }
- type = init_type (code, size, type_flags, NULL, objfile);
- TYPE_NAME (type) = name;
- TYPE_TARGET_TYPE (type) = target_type;
- if (name && strcmp (name, "char") == 0)
- TYPE_NOSIGN (type) = 1;
- return set_die_type (die, type, cu);
- }
- static int
- attr_to_dynamic_prop (const struct attribute *attr, struct die_info *die,
- struct dwarf2_cu *cu, struct dynamic_prop *prop)
- {
- struct dwarf2_property_baton *baton;
- struct obstack *obstack = &cu->objfile->objfile_obstack;
- if (attr == NULL || prop == NULL)
- return 0;
- if (attr_form_is_block (attr))
- {
- baton = obstack_alloc (obstack, sizeof (*baton));
- baton->referenced_type = NULL;
- baton->locexpr.per_cu = cu->per_cu;
- baton->locexpr.size = DW_BLOCK (attr)->size;
- baton->locexpr.data = DW_BLOCK (attr)->data;
- prop->data.baton = baton;
- prop->kind = PROP_LOCEXPR;
- gdb_assert (prop->data.baton != NULL);
- }
- else if (attr_form_is_ref (attr))
- {
- struct dwarf2_cu *target_cu = cu;
- struct die_info *target_die;
- struct attribute *target_attr;
- target_die = follow_die_ref (die, attr, &target_cu);
- target_attr = dwarf2_attr (target_die, DW_AT_location, target_cu);
- if (target_attr == NULL)
- return 0;
- if (attr_form_is_section_offset (target_attr))
- {
- baton = obstack_alloc (obstack, sizeof (*baton));
- baton->referenced_type = die_type (target_die, target_cu);
- fill_in_loclist_baton (cu, &baton->loclist, target_attr);
- prop->data.baton = baton;
- prop->kind = PROP_LOCLIST;
- gdb_assert (prop->data.baton != NULL);
- }
- else if (attr_form_is_block (target_attr))
- {
- baton = obstack_alloc (obstack, sizeof (*baton));
- baton->referenced_type = die_type (target_die, target_cu);
- baton->locexpr.per_cu = cu->per_cu;
- baton->locexpr.size = DW_BLOCK (target_attr)->size;
- baton->locexpr.data = DW_BLOCK (target_attr)->data;
- prop->data.baton = baton;
- prop->kind = PROP_LOCEXPR;
- gdb_assert (prop->data.baton != NULL);
- }
- else
- {
- dwarf2_invalid_attrib_class_complaint ("DW_AT_location",
- "dynamic property");
- return 0;
- }
- }
- else if (attr_form_is_constant (attr))
- {
- prop->data.const_val = dwarf2_get_attr_constant_value (attr, 0);
- prop->kind = PROP_CONST;
- }
- else
- {
- dwarf2_invalid_attrib_class_complaint (dwarf_form_name (attr->form),
- dwarf2_name (die, cu));
- return 0;
- }
- return 1;
- }
- static struct type *
- read_subrange_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct type *base_type, *orig_base_type;
- struct type *range_type;
- struct attribute *attr;
- struct dynamic_prop low, high;
- int low_default_is_valid;
- int high_bound_is_count = 0;
- const char *name;
- LONGEST negative_mask;
- orig_base_type = die_type (die, cu);
-
- base_type = check_typedef (orig_base_type);
-
- range_type = get_die_type (die, cu);
- if (range_type)
- return range_type;
- low.kind = PROP_CONST;
- high.kind = PROP_CONST;
- high.data.const_val = 0;
-
- switch (cu->language)
- {
- case language_c:
- case language_cplus:
- low.data.const_val = 0;
- low_default_is_valid = 1;
- break;
- case language_fortran:
- low.data.const_val = 1;
- low_default_is_valid = 1;
- break;
- case language_d:
- case language_java:
- case language_objc:
- low.data.const_val = 0;
- low_default_is_valid = (cu->header.version >= 4);
- break;
- case language_ada:
- case language_m2:
- case language_pascal:
- low.data.const_val = 1;
- low_default_is_valid = (cu->header.version >= 4);
- break;
- default:
- low.data.const_val = 0;
- low_default_is_valid = 0;
- break;
- }
- attr = dwarf2_attr (die, DW_AT_lower_bound, cu);
- if (attr)
- attr_to_dynamic_prop (attr, die, cu, &low);
- else if (!low_default_is_valid)
- complaint (&symfile_complaints, _("Missing DW_AT_lower_bound "
- "- DIE at 0x%x [in module %s]"),
- die->offset.sect_off, objfile_name (cu->objfile));
- attr = dwarf2_attr (die, DW_AT_upper_bound, cu);
- if (!attr_to_dynamic_prop (attr, die, cu, &high))
- {
- attr = dwarf2_attr (die, DW_AT_count, cu);
- if (attr_to_dynamic_prop (attr, die, cu, &high))
- {
-
- if (low.kind == PROP_CONST && high.kind == PROP_CONST)
- high.data.const_val = low.data.const_val + high.data.const_val - 1;
- else
- high_bound_is_count = 1;
- }
- }
-
- FIXME
- if (TYPE_CODE (base_type) == TYPE_CODE_VOID)
- {
- struct objfile *objfile = cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- int addr_size = gdbarch_addr_bit (gdbarch) /8;
- struct type *int_type = objfile_type (objfile)->builtin_int;
-
- if (int_type && TYPE_LENGTH (int_type) >= addr_size)
- base_type = int_type;
- else
- {
- int_type = objfile_type (objfile)->builtin_long;
- if (int_type && TYPE_LENGTH (int_type) >= addr_size)
- base_type = int_type;
- else
- {
- int_type = objfile_type (objfile)->builtin_long_long;
- if (int_type && TYPE_LENGTH (int_type) >= addr_size)
- base_type = int_type;
- }
- }
- }
-
- negative_mask =
- (LONGEST) -1 << (TYPE_LENGTH (base_type) * TARGET_CHAR_BIT - 1);
- if (low.kind == PROP_CONST
- && !TYPE_UNSIGNED (base_type) && (low.data.const_val & negative_mask))
- low.data.const_val |= negative_mask;
- if (high.kind == PROP_CONST
- && !TYPE_UNSIGNED (base_type) && (high.data.const_val & negative_mask))
- high.data.const_val |= negative_mask;
- range_type = create_range_type (NULL, orig_base_type, &low, &high);
- if (high_bound_is_count)
- TYPE_RANGE_DATA (range_type)->flag_upper_bound_is_count = 1;
-
- if (attr == NULL && cu->language != language_ada)
- TYPE_HIGH_BOUND_KIND (range_type) = PROP_UNDEFINED;
- name = dwarf2_name (die, cu);
- if (name)
- TYPE_NAME (range_type) = name;
- attr = dwarf2_attr (die, DW_AT_byte_size, cu);
- if (attr)
- TYPE_LENGTH (range_type) = DW_UNSND (attr);
- set_die_type (die, range_type, cu);
-
- set_descriptive_type (range_type, die, cu);
- return range_type;
- }
- static struct type *
- read_unspecified_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct type *type;
-
- type = init_type (TYPE_CODE_VOID, 0, 0, NULL, cu->objfile);
- TYPE_NAME (type) = dwarf2_name (die, cu);
- return set_die_type (die, type, cu);
- }
- static struct die_info *
- read_die_and_children (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr,
- const gdb_byte **new_info_ptr,
- struct die_info *parent)
- {
- struct die_info *die;
- const gdb_byte *cur_ptr;
- int has_children;
- cur_ptr = read_full_die_1 (reader, &die, info_ptr, &has_children, 0);
- if (die == NULL)
- {
- *new_info_ptr = cur_ptr;
- return NULL;
- }
- store_in_ref_table (die, reader->cu);
- if (has_children)
- die->child = read_die_and_siblings_1 (reader, cur_ptr, new_info_ptr, die);
- else
- {
- die->child = NULL;
- *new_info_ptr = cur_ptr;
- }
- die->sibling = NULL;
- die->parent = parent;
- return die;
- }
- static struct die_info *
- read_die_and_siblings_1 (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr,
- const gdb_byte **new_info_ptr,
- struct die_info *parent)
- {
- struct die_info *first_die, *last_sibling;
- const gdb_byte *cur_ptr;
- cur_ptr = info_ptr;
- first_die = last_sibling = NULL;
- while (1)
- {
- struct die_info *die
- = read_die_and_children (reader, cur_ptr, &cur_ptr, parent);
- if (die == NULL)
- {
- *new_info_ptr = cur_ptr;
- return first_die;
- }
- if (!first_die)
- first_die = die;
- else
- last_sibling->sibling = die;
- last_sibling = die;
- }
- }
- static struct die_info *
- read_die_and_siblings (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr,
- const gdb_byte **new_info_ptr,
- struct die_info *parent)
- {
- struct die_info *die = read_die_and_siblings_1 (reader, info_ptr,
- new_info_ptr, parent);
- if (dwarf2_die_debug)
- {
- fprintf_unfiltered (gdb_stdlog,
- "Read die from %s@0x%x of %s:\n",
- get_section_name (reader->die_section),
- (unsigned) (info_ptr - reader->die_section->buffer),
- bfd_get_filename (reader->abfd));
- dump_die (die, dwarf2_die_debug);
- }
- return die;
- }
- static const gdb_byte *
- read_full_die_1 (const struct die_reader_specs *reader,
- struct die_info **diep, const gdb_byte *info_ptr,
- int *has_children, int num_extra_attrs)
- {
- unsigned int abbrev_number, bytes_read, i;
- sect_offset offset;
- struct abbrev_info *abbrev;
- struct die_info *die;
- struct dwarf2_cu *cu = reader->cu;
- bfd *abfd = reader->abfd;
- offset.sect_off = info_ptr - reader->buffer;
- abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
- info_ptr += bytes_read;
- if (!abbrev_number)
- {
- *diep = NULL;
- *has_children = 0;
- return info_ptr;
- }
- abbrev = abbrev_table_lookup_abbrev (cu->abbrev_table, abbrev_number);
- if (!abbrev)
- error (_("Dwarf Error: could not find abbrev number %d [in module %s]"),
- abbrev_number,
- bfd_get_filename (abfd));
- die = dwarf_alloc_die (cu, abbrev->num_attrs + num_extra_attrs);
- die->offset = offset;
- die->tag = abbrev->tag;
- die->abbrev = abbrev_number;
-
- die->num_attrs = abbrev->num_attrs;
- for (i = 0; i < abbrev->num_attrs; ++i)
- info_ptr = read_attribute (reader, &die->attrs[i], &abbrev->attrs[i],
- info_ptr);
- *diep = die;
- *has_children = abbrev->has_children;
- return info_ptr;
- }
- static const gdb_byte *
- read_full_die (const struct die_reader_specs *reader,
- struct die_info **diep, const gdb_byte *info_ptr,
- int *has_children)
- {
- const gdb_byte *result;
- result = read_full_die_1 (reader, diep, info_ptr, has_children, 0);
- if (dwarf2_die_debug)
- {
- fprintf_unfiltered (gdb_stdlog,
- "Read die from %s@0x%x of %s:\n",
- get_section_name (reader->die_section),
- (unsigned) (info_ptr - reader->die_section->buffer),
- bfd_get_filename (reader->abfd));
- dump_die (*diep, dwarf2_die_debug);
- }
- return result;
- }
- static struct abbrev_info *
- abbrev_table_alloc_abbrev (struct abbrev_table *abbrev_table)
- {
- struct abbrev_info *abbrev;
- abbrev = (struct abbrev_info *)
- obstack_alloc (&abbrev_table->abbrev_obstack, sizeof (struct abbrev_info));
- memset (abbrev, 0, sizeof (struct abbrev_info));
- return abbrev;
- }
- static void
- abbrev_table_add_abbrev (struct abbrev_table *abbrev_table,
- unsigned int abbrev_number,
- struct abbrev_info *abbrev)
- {
- unsigned int hash_number;
- hash_number = abbrev_number % ABBREV_HASH_SIZE;
- abbrev->next = abbrev_table->abbrevs[hash_number];
- abbrev_table->abbrevs[hash_number] = abbrev;
- }
- static struct abbrev_info *
- abbrev_table_lookup_abbrev (const struct abbrev_table *abbrev_table,
- unsigned int abbrev_number)
- {
- unsigned int hash_number;
- struct abbrev_info *abbrev;
- hash_number = abbrev_number % ABBREV_HASH_SIZE;
- abbrev = abbrev_table->abbrevs[hash_number];
- while (abbrev)
- {
- if (abbrev->number == abbrev_number)
- return abbrev;
- abbrev = abbrev->next;
- }
- return NULL;
- }
- static struct abbrev_table *
- abbrev_table_read_table (struct dwarf2_section_info *section,
- sect_offset offset)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- bfd *abfd = get_section_bfd_owner (section);
- struct abbrev_table *abbrev_table;
- const gdb_byte *abbrev_ptr;
- struct abbrev_info *cur_abbrev;
- unsigned int abbrev_number, bytes_read, abbrev_name;
- unsigned int abbrev_form;
- struct attr_abbrev *cur_attrs;
- unsigned int allocated_attrs;
- abbrev_table = XNEW (struct abbrev_table);
- abbrev_table->offset = offset;
- obstack_init (&abbrev_table->abbrev_obstack);
- abbrev_table->abbrevs = obstack_alloc (&abbrev_table->abbrev_obstack,
- (ABBREV_HASH_SIZE
- * sizeof (struct abbrev_info *)));
- memset (abbrev_table->abbrevs, 0,
- ABBREV_HASH_SIZE * sizeof (struct abbrev_info *));
- dwarf2_read_section (objfile, section);
- abbrev_ptr = section->buffer + offset.sect_off;
- abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
- abbrev_ptr += bytes_read;
- allocated_attrs = ATTR_ALLOC_CHUNK;
- cur_attrs = xmalloc (allocated_attrs * sizeof (struct attr_abbrev));
-
- while (abbrev_number)
- {
- cur_abbrev = abbrev_table_alloc_abbrev (abbrev_table);
-
- cur_abbrev->number = abbrev_number;
- cur_abbrev->tag = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
- abbrev_ptr += bytes_read;
- cur_abbrev->has_children = read_1_byte (abfd, abbrev_ptr);
- abbrev_ptr += 1;
-
- abbrev_name = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
- abbrev_ptr += bytes_read;
- abbrev_form = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
- abbrev_ptr += bytes_read;
- while (abbrev_name)
- {
- if (cur_abbrev->num_attrs == allocated_attrs)
- {
- allocated_attrs += ATTR_ALLOC_CHUNK;
- cur_attrs
- = xrealloc (cur_attrs, (allocated_attrs
- * sizeof (struct attr_abbrev)));
- }
- cur_attrs[cur_abbrev->num_attrs].name = abbrev_name;
- cur_attrs[cur_abbrev->num_attrs++].form = abbrev_form;
- abbrev_name = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
- abbrev_ptr += bytes_read;
- abbrev_form = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
- abbrev_ptr += bytes_read;
- }
- cur_abbrev->attrs = obstack_alloc (&abbrev_table->abbrev_obstack,
- (cur_abbrev->num_attrs
- * sizeof (struct attr_abbrev)));
- memcpy (cur_abbrev->attrs, cur_attrs,
- cur_abbrev->num_attrs * sizeof (struct attr_abbrev));
- abbrev_table_add_abbrev (abbrev_table, abbrev_number, cur_abbrev);
-
- if ((unsigned int) (abbrev_ptr - section->buffer) >= section->size)
- break;
- abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read);
- abbrev_ptr += bytes_read;
- if (abbrev_table_lookup_abbrev (abbrev_table, abbrev_number) != NULL)
- break;
- }
- xfree (cur_attrs);
- return abbrev_table;
- }
- static void
- abbrev_table_free (struct abbrev_table *abbrev_table)
- {
- obstack_free (&abbrev_table->abbrev_obstack, NULL);
- xfree (abbrev_table);
- }
- static void
- abbrev_table_free_cleanup (void *table_ptr)
- {
- struct abbrev_table **abbrev_table_ptr = table_ptr;
- if (*abbrev_table_ptr != NULL)
- abbrev_table_free (*abbrev_table_ptr);
- *abbrev_table_ptr = NULL;
- }
- static void
- dwarf2_read_abbrevs (struct dwarf2_cu *cu,
- struct dwarf2_section_info *abbrev_section)
- {
- cu->abbrev_table =
- abbrev_table_read_table (abbrev_section, cu->header.abbrev_offset);
- }
- static void
- dwarf2_free_abbrev_table (void *ptr_to_cu)
- {
- struct dwarf2_cu *cu = ptr_to_cu;
- if (cu->abbrev_table != NULL)
- abbrev_table_free (cu->abbrev_table);
-
- cu->abbrev_table = NULL;
- }
- static int
- is_type_tag_for_partial (int tag)
- {
- switch (tag)
- {
- #if 0
- #endif
- case DW_TAG_base_type:
- case DW_TAG_class_type:
- case DW_TAG_interface_type:
- case DW_TAG_enumeration_type:
- case DW_TAG_structure_type:
- case DW_TAG_subrange_type:
- case DW_TAG_typedef:
- case DW_TAG_union_type:
- return 1;
- default:
- return 0;
- }
- }
- static struct partial_die_info *
- load_partial_dies (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr, int building_psymtab)
- {
- struct dwarf2_cu *cu = reader->cu;
- struct objfile *objfile = cu->objfile;
- struct partial_die_info *part_die;
- struct partial_die_info *parent_die, *last_die, *first_die = NULL;
- struct abbrev_info *abbrev;
- unsigned int bytes_read;
- unsigned int load_all = 0;
- int nesting_level = 1;
- parent_die = NULL;
- last_die = NULL;
- gdb_assert (cu->per_cu != NULL);
- if (cu->per_cu->load_all_dies)
- load_all = 1;
- cu->partial_dies
- = htab_create_alloc_ex (cu->header.length / 12,
- partial_die_hash,
- partial_die_eq,
- NULL,
- &cu->comp_unit_obstack,
- hashtab_obstack_allocate,
- dummy_obstack_deallocate);
- part_die = obstack_alloc (&cu->comp_unit_obstack,
- sizeof (struct partial_die_info));
- while (1)
- {
- abbrev = peek_die_abbrev (info_ptr, &bytes_read, cu);
-
- if (abbrev == NULL)
- {
- if (--nesting_level == 0)
- {
-
- return first_die;
- }
- info_ptr += bytes_read;
- last_die = parent_die;
- parent_die = parent_die->die_parent;
- continue;
- }
-
- if (parent_die != NULL
- && cu->language == language_cplus
- && (abbrev->tag == DW_TAG_template_type_param
- || abbrev->tag == DW_TAG_template_value_param))
- {
- parent_die->has_template_arguments = 1;
- if (!load_all)
- {
-
- info_ptr = skip_one_die (reader, info_ptr + bytes_read, abbrev);
- continue;
- }
- }
-
- if (!load_all
- && cu->language == language_cplus
- && parent_die != NULL
- && parent_die->tag == DW_TAG_subprogram)
- {
- info_ptr = skip_one_die (reader, info_ptr + bytes_read, abbrev);
- continue;
- }
-
- if (!load_all
- && !is_type_tag_for_partial (abbrev->tag)
- && abbrev->tag != DW_TAG_constant
- && abbrev->tag != DW_TAG_enumerator
- && abbrev->tag != DW_TAG_subprogram
- && abbrev->tag != DW_TAG_lexical_block
- && abbrev->tag != DW_TAG_variable
- && abbrev->tag != DW_TAG_namespace
- && abbrev->tag != DW_TAG_module
- && abbrev->tag != DW_TAG_member
- && abbrev->tag != DW_TAG_imported_unit
- && abbrev->tag != DW_TAG_imported_declaration)
- {
-
- info_ptr = skip_one_die (reader, info_ptr + bytes_read, abbrev);
- continue;
- }
- info_ptr = read_partial_die (reader, part_die, abbrev, bytes_read,
- info_ptr);
-
-
- if (parent_die == NULL
- && part_die->has_specification == 0
- && part_die->is_declaration == 0
- && ((part_die->tag == DW_TAG_typedef && !part_die->has_children)
- || part_die->tag == DW_TAG_base_type
- || part_die->tag == DW_TAG_subrange_type))
- {
- if (building_psymtab && part_die->name != NULL)
- add_psymbol_to_list (part_die->name, strlen (part_die->name), 0,
- VAR_DOMAIN, LOC_TYPEDEF,
- &objfile->static_psymbols,
- 0, (CORE_ADDR) 0, cu->language, objfile);
- info_ptr = locate_pdi_sibling (reader, part_die, info_ptr);
- continue;
- }
-
- if (part_die->tag == DW_TAG_typedef && part_die->has_children)
- complaint (&symfile_complaints,
- _("DW_TAG_typedef has childen - GCC PR debug/47510 bug "
- "- DIE at 0x%x [in module %s]"),
- part_die->offset.sect_off, objfile_name (objfile));
-
- if (part_die->tag == DW_TAG_enumerator
- && parent_die != NULL
- && parent_die->die_parent == NULL
- && parent_die->tag == DW_TAG_enumeration_type
- && parent_die->has_specification == 0)
- {
- if (part_die->name == NULL)
- complaint (&symfile_complaints,
- _("malformed enumerator DIE ignored"));
- else if (building_psymtab)
- add_psymbol_to_list (part_die->name, strlen (part_die->name), 0,
- VAR_DOMAIN, LOC_CONST,
- (cu->language == language_cplus
- || cu->language == language_java)
- ? &objfile->global_psymbols
- : &objfile->static_psymbols,
- 0, (CORE_ADDR) 0, cu->language, objfile);
- info_ptr = locate_pdi_sibling (reader, part_die, info_ptr);
- continue;
- }
-
- part_die->die_parent = parent_die;
- part_die->die_sibling = NULL;
- part_die->die_child = NULL;
- if (last_die && last_die == parent_die)
- last_die->die_child = part_die;
- else if (last_die)
- last_die->die_sibling = part_die;
- last_die = part_die;
- if (first_die == NULL)
- first_die = part_die;
-
- if (load_all
- || abbrev->tag == DW_TAG_constant
- || abbrev->tag == DW_TAG_subprogram
- || abbrev->tag == DW_TAG_variable
- || abbrev->tag == DW_TAG_namespace
- || part_die->is_declaration)
- {
- void **slot;
- slot = htab_find_slot_with_hash (cu->partial_dies, part_die,
- part_die->offset.sect_off, INSERT);
- *slot = part_die;
- }
- part_die = obstack_alloc (&cu->comp_unit_obstack,
- sizeof (struct partial_die_info));
-
- if (last_die->has_children
- && (load_all
- || last_die->tag == DW_TAG_namespace
- || last_die->tag == DW_TAG_module
- || last_die->tag == DW_TAG_enumeration_type
- || (cu->language == language_cplus
- && last_die->tag == DW_TAG_subprogram
- && (last_die->name == NULL
- || strchr (last_die->name, '<') == NULL))
- || (cu->language != language_c
- && (last_die->tag == DW_TAG_class_type
- || last_die->tag == DW_TAG_interface_type
- || last_die->tag == DW_TAG_structure_type
- || last_die->tag == DW_TAG_union_type))
- || (cu->language == language_ada
- && (last_die->tag == DW_TAG_subprogram
- || last_die->tag == DW_TAG_lexical_block))))
- {
- nesting_level++;
- parent_die = last_die;
- continue;
- }
-
- info_ptr = locate_pdi_sibling (reader, last_die, info_ptr);
-
- }
- }
- static const gdb_byte *
- read_partial_die (const struct die_reader_specs *reader,
- struct partial_die_info *part_die,
- struct abbrev_info *abbrev, unsigned int abbrev_len,
- const gdb_byte *info_ptr)
- {
- struct dwarf2_cu *cu = reader->cu;
- struct objfile *objfile = cu->objfile;
- const gdb_byte *buffer = reader->buffer;
- unsigned int i;
- struct attribute attr;
- int has_low_pc_attr = 0;
- int has_high_pc_attr = 0;
- int high_pc_relative = 0;
- memset (part_die, 0, sizeof (struct partial_die_info));
- part_die->offset.sect_off = info_ptr - buffer;
- info_ptr += abbrev_len;
- if (abbrev == NULL)
- return info_ptr;
- part_die->tag = abbrev->tag;
- part_die->has_children = abbrev->has_children;
- for (i = 0; i < abbrev->num_attrs; ++i)
- {
- info_ptr = read_attribute (reader, &attr, &abbrev->attrs[i], info_ptr);
-
- switch (attr.name)
- {
- case DW_AT_name:
- switch (part_die->tag)
- {
- case DW_TAG_compile_unit:
- case DW_TAG_partial_unit:
- case DW_TAG_type_unit:
-
- case DW_TAG_enumeration_type:
- case DW_TAG_enumerator:
-
- part_die->name = DW_STRING (&attr);
- break;
- default:
- part_die->name
- = dwarf2_canonicalize_name (DW_STRING (&attr), cu,
- &objfile->per_bfd->storage_obstack);
- break;
- }
- break;
- case DW_AT_linkage_name:
- case DW_AT_MIPS_linkage_name:
-
- if (cu->language == language_ada)
- part_die->name = DW_STRING (&attr);
- part_die->linkage_name = DW_STRING (&attr);
- break;
- case DW_AT_low_pc:
- has_low_pc_attr = 1;
- part_die->lowpc = attr_value_as_address (&attr);
- break;
- case DW_AT_high_pc:
- has_high_pc_attr = 1;
- part_die->highpc = attr_value_as_address (&attr);
- if (cu->header.version >= 4 && attr_form_is_constant (&attr))
- high_pc_relative = 1;
- break;
- case DW_AT_location:
-
- if (attr_form_is_block (&attr))
- {
- part_die->d.locdesc = DW_BLOCK (&attr);
- }
- else if (attr_form_is_section_offset (&attr))
- {
- dwarf2_complex_location_expr_complaint ();
- }
- else
- {
- dwarf2_invalid_attrib_class_complaint ("DW_AT_location",
- "partial symbol information");
- }
- break;
- case DW_AT_external:
- part_die->is_external = DW_UNSND (&attr);
- break;
- case DW_AT_declaration:
- part_die->is_declaration = DW_UNSND (&attr);
- break;
- case DW_AT_type:
- part_die->has_type = 1;
- break;
- case DW_AT_abstract_origin:
- case DW_AT_specification:
- case DW_AT_extension:
- part_die->has_specification = 1;
- part_die->spec_offset = dwarf2_get_ref_die_offset (&attr);
- part_die->spec_is_dwz = (attr.form == DW_FORM_GNU_ref_alt
- || cu->per_cu->is_dwz);
- break;
- case DW_AT_sibling:
-
- if (attr.form == DW_FORM_ref_addr)
- complaint (&symfile_complaints,
- _("ignoring absolute DW_AT_sibling"));
- else
- {
- unsigned int off = dwarf2_get_ref_die_offset (&attr).sect_off;
- const gdb_byte *sibling_ptr = buffer + off;
- if (sibling_ptr < info_ptr)
- complaint (&symfile_complaints,
- _("DW_AT_sibling points backwards"));
- else if (sibling_ptr > reader->buffer_end)
- dwarf2_section_buffer_overflow_complaint (reader->die_section);
- else
- part_die->sibling = sibling_ptr;
- }
- break;
- case DW_AT_byte_size:
- part_die->has_byte_size = 1;
- break;
- case DW_AT_calling_convention:
-
- if (DW_UNSND (&attr) == DW_CC_program
- && cu->language == language_fortran)
- set_objfile_main_name (objfile, part_die->name, language_fortran);
- break;
- case DW_AT_inline:
- if (DW_UNSND (&attr) == DW_INL_inlined
- || DW_UNSND (&attr) == DW_INL_declared_inlined)
- part_die->may_be_inlined = 1;
- break;
- case DW_AT_import:
- if (part_die->tag == DW_TAG_imported_unit)
- {
- part_die->d.offset = dwarf2_get_ref_die_offset (&attr);
- part_die->is_dwz = (attr.form == DW_FORM_GNU_ref_alt
- || cu->per_cu->is_dwz);
- }
- break;
- default:
- break;
- }
- }
- if (high_pc_relative)
- part_die->highpc += part_die->lowpc;
- if (has_low_pc_attr && has_high_pc_attr)
- {
-
- if (part_die->lowpc == 0 && !dwarf2_per_objfile->has_section_at_zero)
- {
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- complaint (&symfile_complaints,
- _("DW_AT_low_pc %s is zero "
- "for DIE at 0x%x [in module %s]"),
- paddress (gdbarch, part_die->lowpc),
- part_die->offset.sect_off, objfile_name (objfile));
- }
-
- else if (part_die->lowpc >= part_die->highpc)
- {
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- complaint (&symfile_complaints,
- _("DW_AT_low_pc %s is not < DW_AT_high_pc %s "
- "for DIE at 0x%x [in module %s]"),
- paddress (gdbarch, part_die->lowpc),
- paddress (gdbarch, part_die->highpc),
- part_die->offset.sect_off, objfile_name (objfile));
- }
- else
- part_die->has_pc_info = 1;
- }
- return info_ptr;
- }
- static struct partial_die_info *
- find_partial_die_in_comp_unit (sect_offset offset, struct dwarf2_cu *cu)
- {
- struct partial_die_info *lookup_die = NULL;
- struct partial_die_info part_die;
- part_die.offset = offset;
- lookup_die = htab_find_with_hash (cu->partial_dies, &part_die,
- offset.sect_off);
- return lookup_die;
- }
- static struct partial_die_info *
- find_partial_die (sect_offset offset, int offset_in_dwz, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct dwarf2_per_cu_data *per_cu = NULL;
- struct partial_die_info *pd = NULL;
- if (offset_in_dwz == cu->per_cu->is_dwz
- && offset_in_cu_p (&cu->header, offset))
- {
- pd = find_partial_die_in_comp_unit (offset, cu);
- if (pd != NULL)
- return pd;
-
- per_cu = cu->per_cu;
- }
- else
- {
-
- if (cu->per_cu->is_debug_types)
- {
- error (_("Dwarf Error: Type Unit at offset 0x%lx contains"
- " external reference to offset 0x%lx [in module %s].\n"),
- (long) cu->header.offset.sect_off, (long) offset.sect_off,
- bfd_get_filename (objfile->obfd));
- }
- per_cu = dwarf2_find_containing_comp_unit (offset, offset_in_dwz,
- objfile);
- if (per_cu->cu == NULL || per_cu->cu->partial_dies == NULL)
- load_partial_comp_unit (per_cu);
- per_cu->cu->last_used = 0;
- pd = find_partial_die_in_comp_unit (offset, per_cu->cu);
- }
-
- if (pd == NULL && per_cu->load_all_dies == 0)
- {
- per_cu->load_all_dies = 1;
-
- load_partial_comp_unit (per_cu);
- pd = find_partial_die_in_comp_unit (offset, per_cu->cu);
- }
- if (pd == NULL)
- internal_error (__FILE__, __LINE__,
- _("could not find partial DIE 0x%x "
- "in cache [from module %s]\n"),
- offset.sect_off, bfd_get_filename (objfile->obfd));
- return pd;
- }
- static void
- guess_partial_die_structure_name (struct partial_die_info *struct_pdi,
- struct dwarf2_cu *cu)
- {
-
- struct partial_die_info *real_pdi;
- struct partial_die_info *child_pdi;
-
- real_pdi = struct_pdi;
- while (real_pdi->has_specification)
- real_pdi = find_partial_die (real_pdi->spec_offset,
- real_pdi->spec_is_dwz, cu);
- if (real_pdi->die_parent != NULL)
- return;
- for (child_pdi = struct_pdi->die_child;
- child_pdi != NULL;
- child_pdi = child_pdi->die_sibling)
- {
- if (child_pdi->tag == DW_TAG_subprogram
- && child_pdi->linkage_name != NULL)
- {
- char *actual_class_name
- = language_class_name_from_physname (cu->language_defn,
- child_pdi->linkage_name);
- if (actual_class_name != NULL)
- {
- struct_pdi->name
- = obstack_copy0 (&cu->objfile->per_bfd->storage_obstack,
- actual_class_name,
- strlen (actual_class_name));
- xfree (actual_class_name);
- }
- break;
- }
- }
- }
- static void
- fixup_partial_die (struct partial_die_info *part_die,
- struct dwarf2_cu *cu)
- {
-
- if (part_die->fixup_called)
- return;
-
- if (part_die->name == NULL && part_die->has_specification)
- {
- struct partial_die_info *spec_die;
- spec_die = find_partial_die (part_die->spec_offset,
- part_die->spec_is_dwz, cu);
- fixup_partial_die (spec_die, cu);
- if (spec_die->name)
- {
- part_die->name = spec_die->name;
-
- if (spec_die->is_external)
- part_die->is_external = spec_die->is_external;
- }
- }
-
- if (part_die->name == NULL && part_die->tag == DW_TAG_namespace)
- part_die->name = CP_ANONYMOUS_NAMESPACE_STR;
-
- if (cu->language == language_cplus
- && !VEC_empty (dwarf2_section_info_def, dwarf2_per_objfile->types)
- && part_die->die_parent == NULL
- && part_die->has_children
- && (part_die->tag == DW_TAG_class_type
- || part_die->tag == DW_TAG_structure_type
- || part_die->tag == DW_TAG_union_type))
- guess_partial_die_structure_name (part_die, cu);
-
- if (part_die->name == NULL
- && (part_die->tag == DW_TAG_class_type
- || part_die->tag == DW_TAG_interface_type
- || part_die->tag == DW_TAG_structure_type
- || part_die->tag == DW_TAG_union_type)
- && part_die->linkage_name != NULL)
- {
- char *demangled;
- demangled = gdb_demangle (part_die->linkage_name, DMGL_TYPES);
- if (demangled)
- {
- const char *base;
-
- base = strrchr (demangled, ':');
- if (base && base > demangled && base[-1] == ':')
- base++;
- else
- base = demangled;
- part_die->name
- = obstack_copy0 (&cu->objfile->per_bfd->storage_obstack,
- base, strlen (base));
- xfree (demangled);
- }
- }
- part_die->fixup_called = 1;
- }
- static const gdb_byte *
- read_attribute_value (const struct die_reader_specs *reader,
- struct attribute *attr, unsigned form,
- const gdb_byte *info_ptr)
- {
- struct dwarf2_cu *cu = reader->cu;
- struct objfile *objfile = cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- bfd *abfd = reader->abfd;
- struct comp_unit_head *cu_header = &cu->header;
- unsigned int bytes_read;
- struct dwarf_block *blk;
- attr->form = form;
- switch (form)
- {
- case DW_FORM_ref_addr:
- if (cu->header.version == 2)
- DW_UNSND (attr) = read_address (abfd, info_ptr, cu, &bytes_read);
- else
- DW_UNSND (attr) = read_offset (abfd, info_ptr,
- &cu->header, &bytes_read);
- info_ptr += bytes_read;
- break;
- case DW_FORM_GNU_ref_alt:
- DW_UNSND (attr) = read_offset (abfd, info_ptr, &cu->header, &bytes_read);
- info_ptr += bytes_read;
- break;
- case DW_FORM_addr:
- DW_ADDR (attr) = read_address (abfd, info_ptr, cu, &bytes_read);
- DW_ADDR (attr) = gdbarch_adjust_dwarf2_addr (gdbarch, DW_ADDR (attr));
- info_ptr += bytes_read;
- break;
- case DW_FORM_block2:
- blk = dwarf_alloc_block (cu);
- blk->size = read_2_bytes (abfd, info_ptr);
- info_ptr += 2;
- blk->data = read_n_bytes (abfd, info_ptr, blk->size);
- info_ptr += blk->size;
- DW_BLOCK (attr) = blk;
- break;
- case DW_FORM_block4:
- blk = dwarf_alloc_block (cu);
- blk->size = read_4_bytes (abfd, info_ptr);
- info_ptr += 4;
- blk->data = read_n_bytes (abfd, info_ptr, blk->size);
- info_ptr += blk->size;
- DW_BLOCK (attr) = blk;
- break;
- case DW_FORM_data2:
- DW_UNSND (attr) = read_2_bytes (abfd, info_ptr);
- info_ptr += 2;
- break;
- case DW_FORM_data4:
- DW_UNSND (attr) = read_4_bytes (abfd, info_ptr);
- info_ptr += 4;
- break;
- case DW_FORM_data8:
- DW_UNSND (attr) = read_8_bytes (abfd, info_ptr);
- info_ptr += 8;
- break;
- case DW_FORM_sec_offset:
- DW_UNSND (attr) = read_offset (abfd, info_ptr, &cu->header, &bytes_read);
- info_ptr += bytes_read;
- break;
- case DW_FORM_string:
- DW_STRING (attr) = read_direct_string (abfd, info_ptr, &bytes_read);
- DW_STRING_IS_CANONICAL (attr) = 0;
- info_ptr += bytes_read;
- break;
- case DW_FORM_strp:
- if (!cu->per_cu->is_dwz)
- {
- DW_STRING (attr) = read_indirect_string (abfd, info_ptr, cu_header,
- &bytes_read);
- DW_STRING_IS_CANONICAL (attr) = 0;
- info_ptr += bytes_read;
- break;
- }
-
- case DW_FORM_GNU_strp_alt:
- {
- struct dwz_file *dwz = dwarf2_get_dwz_file ();
- LONGEST str_offset = read_offset (abfd, info_ptr, cu_header,
- &bytes_read);
- DW_STRING (attr) = read_indirect_string_from_dwz (dwz, str_offset);
- DW_STRING_IS_CANONICAL (attr) = 0;
- info_ptr += bytes_read;
- }
- break;
- case DW_FORM_exprloc:
- case DW_FORM_block:
- blk = dwarf_alloc_block (cu);
- blk->size = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
- info_ptr += bytes_read;
- blk->data = read_n_bytes (abfd, info_ptr, blk->size);
- info_ptr += blk->size;
- DW_BLOCK (attr) = blk;
- break;
- case DW_FORM_block1:
- blk = dwarf_alloc_block (cu);
- blk->size = read_1_byte (abfd, info_ptr);
- info_ptr += 1;
- blk->data = read_n_bytes (abfd, info_ptr, blk->size);
- info_ptr += blk->size;
- DW_BLOCK (attr) = blk;
- break;
- case DW_FORM_data1:
- DW_UNSND (attr) = read_1_byte (abfd, info_ptr);
- info_ptr += 1;
- break;
- case DW_FORM_flag:
- DW_UNSND (attr) = read_1_byte (abfd, info_ptr);
- info_ptr += 1;
- break;
- case DW_FORM_flag_present:
- DW_UNSND (attr) = 1;
- break;
- case DW_FORM_sdata:
- DW_SND (attr) = read_signed_leb128 (abfd, info_ptr, &bytes_read);
- info_ptr += bytes_read;
- break;
- case DW_FORM_udata:
- DW_UNSND (attr) = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
- info_ptr += bytes_read;
- break;
- case DW_FORM_ref1:
- DW_UNSND (attr) = (cu->header.offset.sect_off
- + read_1_byte (abfd, info_ptr));
- info_ptr += 1;
- break;
- case DW_FORM_ref2:
- DW_UNSND (attr) = (cu->header.offset.sect_off
- + read_2_bytes (abfd, info_ptr));
- info_ptr += 2;
- break;
- case DW_FORM_ref4:
- DW_UNSND (attr) = (cu->header.offset.sect_off
- + read_4_bytes (abfd, info_ptr));
- info_ptr += 4;
- break;
- case DW_FORM_ref8:
- DW_UNSND (attr) = (cu->header.offset.sect_off
- + read_8_bytes (abfd, info_ptr));
- info_ptr += 8;
- break;
- case DW_FORM_ref_sig8:
- DW_SIGNATURE (attr) = read_8_bytes (abfd, info_ptr);
- info_ptr += 8;
- break;
- case DW_FORM_ref_udata:
- DW_UNSND (attr) = (cu->header.offset.sect_off
- + read_unsigned_leb128 (abfd, info_ptr, &bytes_read));
- info_ptr += bytes_read;
- break;
- case DW_FORM_indirect:
- form = read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
- info_ptr += bytes_read;
- info_ptr = read_attribute_value (reader, attr, form, info_ptr);
- break;
- case DW_FORM_GNU_addr_index:
- if (reader->dwo_file == NULL)
- {
-
- error (_("Dwarf Error: %s found in non-DWO CU [in module %s]"),
- dwarf_form_name (form),
- bfd_get_filename (abfd));
- }
- DW_ADDR (attr) = read_addr_index_from_leb128 (cu, info_ptr, &bytes_read);
- info_ptr += bytes_read;
- break;
- case DW_FORM_GNU_str_index:
- if (reader->dwo_file == NULL)
- {
-
- error (_("Dwarf Error: %s found in non-DWO CU [in module %s]"),
- dwarf_form_name (form),
- bfd_get_filename (abfd));
- }
- {
- ULONGEST str_index =
- read_unsigned_leb128 (abfd, info_ptr, &bytes_read);
- DW_STRING (attr) = read_str_index (reader, str_index);
- DW_STRING_IS_CANONICAL (attr) = 0;
- info_ptr += bytes_read;
- }
- break;
- default:
- error (_("Dwarf Error: Cannot handle %s in DWARF reader [in module %s]"),
- dwarf_form_name (form),
- bfd_get_filename (abfd));
- }
-
- if (cu->per_cu->is_dwz && attr_form_is_ref (attr))
- attr->form = DW_FORM_GNU_ref_alt;
-
- if (attr->name == DW_AT_byte_size
- && form == DW_FORM_data4
- && DW_UNSND (attr) >= 0xffffffff)
- {
- complaint
- (&symfile_complaints,
- _("Suspicious DW_AT_byte_size value treated as zero instead of %s"),
- hex_string (DW_UNSND (attr)));
- DW_UNSND (attr) = 0;
- }
- return info_ptr;
- }
- static const gdb_byte *
- read_attribute (const struct die_reader_specs *reader,
- struct attribute *attr, struct attr_abbrev *abbrev,
- const gdb_byte *info_ptr)
- {
- attr->name = abbrev->name;
- return read_attribute_value (reader, attr, abbrev->form, info_ptr);
- }
- static unsigned int
- read_1_byte (bfd *abfd, const gdb_byte *buf)
- {
- return bfd_get_8 (abfd, buf);
- }
- static int
- read_1_signed_byte (bfd *abfd, const gdb_byte *buf)
- {
- return bfd_get_signed_8 (abfd, buf);
- }
- static unsigned int
- read_2_bytes (bfd *abfd, const gdb_byte *buf)
- {
- return bfd_get_16 (abfd, buf);
- }
- static int
- read_2_signed_bytes (bfd *abfd, const gdb_byte *buf)
- {
- return bfd_get_signed_16 (abfd, buf);
- }
- static unsigned int
- read_4_bytes (bfd *abfd, const gdb_byte *buf)
- {
- return bfd_get_32 (abfd, buf);
- }
- static int
- read_4_signed_bytes (bfd *abfd, const gdb_byte *buf)
- {
- return bfd_get_signed_32 (abfd, buf);
- }
- static ULONGEST
- read_8_bytes (bfd *abfd, const gdb_byte *buf)
- {
- return bfd_get_64 (abfd, buf);
- }
- static CORE_ADDR
- read_address (bfd *abfd, const gdb_byte *buf, struct dwarf2_cu *cu,
- unsigned int *bytes_read)
- {
- struct comp_unit_head *cu_header = &cu->header;
- CORE_ADDR retval = 0;
- if (cu_header->signed_addr_p)
- {
- switch (cu_header->addr_size)
- {
- case 2:
- retval = bfd_get_signed_16 (abfd, buf);
- break;
- case 4:
- retval = bfd_get_signed_32 (abfd, buf);
- break;
- case 8:
- retval = bfd_get_signed_64 (abfd, buf);
- break;
- default:
- internal_error (__FILE__, __LINE__,
- _("read_address: bad switch, signed [in module %s]"),
- bfd_get_filename (abfd));
- }
- }
- else
- {
- switch (cu_header->addr_size)
- {
- case 2:
- retval = bfd_get_16 (abfd, buf);
- break;
- case 4:
- retval = bfd_get_32 (abfd, buf);
- break;
- case 8:
- retval = bfd_get_64 (abfd, buf);
- break;
- default:
- internal_error (__FILE__, __LINE__,
- _("read_address: bad switch, "
- "unsigned [in module %s]"),
- bfd_get_filename (abfd));
- }
- }
- *bytes_read = cu_header->addr_size;
- return retval;
- }
- static LONGEST
- read_initial_length (bfd *abfd, const gdb_byte *buf, unsigned int *bytes_read)
- {
- LONGEST length = bfd_get_32 (abfd, buf);
- if (length == 0xffffffff)
- {
- length = bfd_get_64 (abfd, buf + 4);
- *bytes_read = 12;
- }
- else if (length == 0)
- {
-
- length = bfd_get_64 (abfd, buf);
- *bytes_read = 8;
- }
- else
- {
- *bytes_read = 4;
- }
- return length;
- }
- static LONGEST
- read_checked_initial_length_and_offset (bfd *abfd, const gdb_byte *buf,
- const struct comp_unit_head *cu_header,
- unsigned int *bytes_read,
- unsigned int *offset_size)
- {
- LONGEST length = read_initial_length (abfd, buf, bytes_read);
- gdb_assert (cu_header->initial_length_size == 4
- || cu_header->initial_length_size == 8
- || cu_header->initial_length_size == 12);
- if (cu_header->initial_length_size != *bytes_read)
- complaint (&symfile_complaints,
- _("intermixed 32-bit and 64-bit DWARF sections"));
- *offset_size = (*bytes_read == 4) ? 4 : 8;
- return length;
- }
- static LONGEST
- read_offset (bfd *abfd, const gdb_byte *buf,
- const struct comp_unit_head *cu_header,
- unsigned int *bytes_read)
- {
- LONGEST offset = read_offset_1 (abfd, buf, cu_header->offset_size);
- *bytes_read = cu_header->offset_size;
- return offset;
- }
- static LONGEST
- read_offset_1 (bfd *abfd, const gdb_byte *buf, unsigned int offset_size)
- {
- LONGEST retval = 0;
- switch (offset_size)
- {
- case 4:
- retval = bfd_get_32 (abfd, buf);
- break;
- case 8:
- retval = bfd_get_64 (abfd, buf);
- break;
- default:
- internal_error (__FILE__, __LINE__,
- _("read_offset_1: bad switch [in module %s]"),
- bfd_get_filename (abfd));
- }
- return retval;
- }
- static const gdb_byte *
- read_n_bytes (bfd *abfd, const gdb_byte *buf, unsigned int size)
- {
-
- gdb_assert (HOST_CHAR_BIT == 8);
- return buf;
- }
- static const char *
- read_direct_string (bfd *abfd, const gdb_byte *buf,
- unsigned int *bytes_read_ptr)
- {
-
- gdb_assert (HOST_CHAR_BIT == 8);
- if (*buf == '\0')
- {
- *bytes_read_ptr = 1;
- return NULL;
- }
- *bytes_read_ptr = strlen ((const char *) buf) + 1;
- return (const char *) buf;
- }
- static const char *
- read_indirect_string_at_offset (bfd *abfd, LONGEST str_offset)
- {
- dwarf2_read_section (dwarf2_per_objfile->objfile, &dwarf2_per_objfile->str);
- if (dwarf2_per_objfile->str.buffer == NULL)
- error (_("DW_FORM_strp used without .debug_str section [in module %s]"),
- bfd_get_filename (abfd));
- if (str_offset >= dwarf2_per_objfile->str.size)
- error (_("DW_FORM_strp pointing outside of "
- ".debug_str section [in module %s]"),
- bfd_get_filename (abfd));
- gdb_assert (HOST_CHAR_BIT == 8);
- if (dwarf2_per_objfile->str.buffer[str_offset] == '\0')
- return NULL;
- return (const char *) (dwarf2_per_objfile->str.buffer + str_offset);
- }
- static const char *
- read_indirect_string_from_dwz (struct dwz_file *dwz, LONGEST str_offset)
- {
- dwarf2_read_section (dwarf2_per_objfile->objfile, &dwz->str);
- if (dwz->str.buffer == NULL)
- error (_("DW_FORM_GNU_strp_alt used without .debug_str "
- "section [in module %s]"),
- bfd_get_filename (dwz->dwz_bfd));
- if (str_offset >= dwz->str.size)
- error (_("DW_FORM_GNU_strp_alt pointing outside of "
- ".debug_str section [in module %s]"),
- bfd_get_filename (dwz->dwz_bfd));
- gdb_assert (HOST_CHAR_BIT == 8);
- if (dwz->str.buffer[str_offset] == '\0')
- return NULL;
- return (const char *) (dwz->str.buffer + str_offset);
- }
- static const char *
- read_indirect_string (bfd *abfd, const gdb_byte *buf,
- const struct comp_unit_head *cu_header,
- unsigned int *bytes_read_ptr)
- {
- LONGEST str_offset = read_offset (abfd, buf, cu_header, bytes_read_ptr);
- return read_indirect_string_at_offset (abfd, str_offset);
- }
- static ULONGEST
- read_unsigned_leb128 (bfd *abfd, const gdb_byte *buf,
- unsigned int *bytes_read_ptr)
- {
- ULONGEST result;
- unsigned int num_read;
- int i, shift;
- unsigned char byte;
- result = 0;
- shift = 0;
- num_read = 0;
- i = 0;
- while (1)
- {
- byte = bfd_get_8 (abfd, buf);
- buf++;
- num_read++;
- result |= ((ULONGEST) (byte & 127) << shift);
- if ((byte & 128) == 0)
- {
- break;
- }
- shift += 7;
- }
- *bytes_read_ptr = num_read;
- return result;
- }
- static LONGEST
- read_signed_leb128 (bfd *abfd, const gdb_byte *buf,
- unsigned int *bytes_read_ptr)
- {
- LONGEST result;
- int i, shift, num_read;
- unsigned char byte;
- result = 0;
- shift = 0;
- num_read = 0;
- i = 0;
- while (1)
- {
- byte = bfd_get_8 (abfd, buf);
- buf++;
- num_read++;
- result |= ((LONGEST) (byte & 127) << shift);
- shift += 7;
- if ((byte & 128) == 0)
- {
- break;
- }
- }
- if ((shift < 8 * sizeof (result)) && (byte & 0x40))
- result |= -(((LONGEST) 1) << shift);
- *bytes_read_ptr = num_read;
- return result;
- }
- static CORE_ADDR
- read_addr_index_1 (unsigned int addr_index, ULONGEST addr_base, int addr_size)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- bfd *abfd = objfile->obfd;
- const gdb_byte *info_ptr;
- dwarf2_read_section (objfile, &dwarf2_per_objfile->addr);
- if (dwarf2_per_objfile->addr.buffer == NULL)
- error (_("DW_FORM_addr_index used without .debug_addr section [in module %s]"),
- objfile_name (objfile));
- if (addr_base + addr_index * addr_size >= dwarf2_per_objfile->addr.size)
- error (_("DW_FORM_addr_index pointing outside of "
- ".debug_addr section [in module %s]"),
- objfile_name (objfile));
- info_ptr = (dwarf2_per_objfile->addr.buffer
- + addr_base + addr_index * addr_size);
- if (addr_size == 4)
- return bfd_get_32 (abfd, info_ptr);
- else
- return bfd_get_64 (abfd, info_ptr);
- }
- static CORE_ADDR
- read_addr_index (struct dwarf2_cu *cu, unsigned int addr_index)
- {
- return read_addr_index_1 (addr_index, cu->addr_base, cu->header.addr_size);
- }
- static CORE_ADDR
- read_addr_index_from_leb128 (struct dwarf2_cu *cu, const gdb_byte *info_ptr,
- unsigned int *bytes_read)
- {
- bfd *abfd = cu->objfile->obfd;
- unsigned int addr_index = read_unsigned_leb128 (abfd, info_ptr, bytes_read);
- return read_addr_index (cu, addr_index);
- }
- struct dwarf2_read_addr_index_data
- {
- ULONGEST addr_base;
- int addr_size;
- };
- static void
- dwarf2_read_addr_index_reader (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr,
- struct die_info *comp_unit_die,
- int has_children,
- void *data)
- {
- struct dwarf2_cu *cu = reader->cu;
- struct dwarf2_read_addr_index_data *aidata =
- (struct dwarf2_read_addr_index_data *) data;
- aidata->addr_base = cu->addr_base;
- aidata->addr_size = cu->header.addr_size;
- }
- CORE_ADDR
- dwarf2_read_addr_index (struct dwarf2_per_cu_data *per_cu,
- unsigned int addr_index)
- {
- struct objfile *objfile = per_cu->objfile;
- struct dwarf2_cu *cu = per_cu->cu;
- ULONGEST addr_base;
- int addr_size;
-
- dw2_setup (objfile);
-
- if (cu != NULL)
- {
- addr_base = cu->addr_base;
- addr_size = cu->header.addr_size;
- }
- else
- {
- struct dwarf2_read_addr_index_data aidata;
-
- init_cutu_and_read_dies (per_cu, NULL, 0, 0,
- dwarf2_read_addr_index_reader, &aidata);
- addr_base = aidata.addr_base;
- addr_size = aidata.addr_size;
- }
- return read_addr_index_1 (addr_index, addr_base, addr_size);
- }
- static const char *
- read_str_index (const struct die_reader_specs *reader, ULONGEST str_index)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- const char *objf_name = objfile_name (objfile);
- bfd *abfd = objfile->obfd;
- struct dwarf2_cu *cu = reader->cu;
- struct dwarf2_section_info *str_section = &reader->dwo_file->sections.str;
- struct dwarf2_section_info *str_offsets_section =
- &reader->dwo_file->sections.str_offsets;
- const gdb_byte *info_ptr;
- ULONGEST str_offset;
- static const char form_name[] = "DW_FORM_GNU_str_index";
- dwarf2_read_section (objfile, str_section);
- dwarf2_read_section (objfile, str_offsets_section);
- if (str_section->buffer == NULL)
- error (_("%s used without .debug_str.dwo section"
- " in CU at offset 0x%lx [in module %s]"),
- form_name, (long) cu->header.offset.sect_off, objf_name);
- if (str_offsets_section->buffer == NULL)
- error (_("%s used without .debug_str_offsets.dwo section"
- " in CU at offset 0x%lx [in module %s]"),
- form_name, (long) cu->header.offset.sect_off, objf_name);
- if (str_index * cu->header.offset_size >= str_offsets_section->size)
- error (_("%s pointing outside of .debug_str_offsets.dwo"
- " section in CU at offset 0x%lx [in module %s]"),
- form_name, (long) cu->header.offset.sect_off, objf_name);
- info_ptr = (str_offsets_section->buffer
- + str_index * cu->header.offset_size);
- if (cu->header.offset_size == 4)
- str_offset = bfd_get_32 (abfd, info_ptr);
- else
- str_offset = bfd_get_64 (abfd, info_ptr);
- if (str_offset >= str_section->size)
- error (_("Offset from %s pointing outside of"
- " .debug_str.dwo section in CU at offset 0x%lx [in module %s]"),
- form_name, (long) cu->header.offset.sect_off, objf_name);
- return (const char *) (str_section->buffer + str_offset);
- }
- static int
- leb128_size (const gdb_byte *buf)
- {
- const gdb_byte *begin = buf;
- gdb_byte byte;
- while (1)
- {
- byte = *buf++;
- if ((byte & 128) == 0)
- return buf - begin;
- }
- }
- static void
- set_cu_language (unsigned int lang, struct dwarf2_cu *cu)
- {
- switch (lang)
- {
- case DW_LANG_C89:
- case DW_LANG_C99:
- case DW_LANG_C11:
- case DW_LANG_C:
- case DW_LANG_UPC:
- cu->language = language_c;
- break;
- case DW_LANG_C_plus_plus:
- case DW_LANG_C_plus_plus_11:
- case DW_LANG_C_plus_plus_14:
- cu->language = language_cplus;
- break;
- case DW_LANG_D:
- cu->language = language_d;
- break;
- case DW_LANG_Fortran77:
- case DW_LANG_Fortran90:
- case DW_LANG_Fortran95:
- cu->language = language_fortran;
- break;
- case DW_LANG_Go:
- cu->language = language_go;
- break;
- case DW_LANG_Mips_Assembler:
- cu->language = language_asm;
- break;
- case DW_LANG_Java:
- cu->language = language_java;
- break;
- case DW_LANG_Ada83:
- case DW_LANG_Ada95:
- cu->language = language_ada;
- break;
- case DW_LANG_Modula2:
- cu->language = language_m2;
- break;
- case DW_LANG_Pascal83:
- cu->language = language_pascal;
- break;
- case DW_LANG_ObjC:
- cu->language = language_objc;
- break;
- case DW_LANG_Cobol74:
- case DW_LANG_Cobol85:
- default:
- cu->language = language_minimal;
- break;
- }
- cu->language_defn = language_def (cu->language);
- }
- static struct attribute *
- dwarf2_attr (struct die_info *die, unsigned int name, struct dwarf2_cu *cu)
- {
- for (;;)
- {
- unsigned int i;
- struct attribute *spec = NULL;
- for (i = 0; i < die->num_attrs; ++i)
- {
- if (die->attrs[i].name == name)
- return &die->attrs[i];
- if (die->attrs[i].name == DW_AT_specification
- || die->attrs[i].name == DW_AT_abstract_origin)
- spec = &die->attrs[i];
- }
- if (!spec)
- break;
- die = follow_die_ref (die, spec, &cu);
- }
- return NULL;
- }
- static struct attribute *
- dwarf2_attr_no_follow (struct die_info *die, unsigned int name)
- {
- unsigned int i;
- for (i = 0; i < die->num_attrs; ++i)
- if (die->attrs[i].name == name)
- return &die->attrs[i];
- return NULL;
- }
- static int
- dwarf2_flag_true_p (struct die_info *die, unsigned name, struct dwarf2_cu *cu)
- {
- struct attribute *attr = dwarf2_attr (die, name, cu);
- return (attr && DW_UNSND (attr));
- }
- static int
- die_is_declaration (struct die_info *die, struct dwarf2_cu *cu)
- {
-
- return (dwarf2_flag_true_p (die, DW_AT_declaration, cu)
- && dwarf2_attr (die, DW_AT_specification, cu) == NULL);
- }
- static struct die_info *
- die_specification (struct die_info *die, struct dwarf2_cu **spec_cu)
- {
- struct attribute *spec_attr = dwarf2_attr (die, DW_AT_specification,
- *spec_cu);
- if (spec_attr == NULL)
- spec_attr = dwarf2_attr (die, DW_AT_abstract_origin, *spec_cu);
- if (spec_attr == NULL)
- return NULL;
- else
- return follow_die_ref (die, spec_attr, spec_cu);
- }
- static void
- free_line_header (struct line_header *lh)
- {
- if (lh->standard_opcode_lengths)
- xfree (lh->standard_opcode_lengths);
-
- if (lh->file_names)
- xfree (lh->file_names);
-
- if (lh->include_dirs)
- xfree (lh->include_dirs);
- xfree (lh);
- }
- static void
- add_include_dir (struct line_header *lh, const char *include_dir)
- {
-
- if (lh->include_dirs_size == 0)
- {
- lh->include_dirs_size = 1;
- lh->include_dirs = xmalloc (lh->include_dirs_size
- * sizeof (*lh->include_dirs));
- }
- else if (lh->num_include_dirs >= lh->include_dirs_size)
- {
- lh->include_dirs_size *= 2;
- lh->include_dirs = xrealloc (lh->include_dirs,
- (lh->include_dirs_size
- * sizeof (*lh->include_dirs)));
- }
- lh->include_dirs[lh->num_include_dirs++] = include_dir;
- }
- static void
- add_file_name (struct line_header *lh,
- const char *name,
- unsigned int dir_index,
- unsigned int mod_time,
- unsigned int length)
- {
- struct file_entry *fe;
-
- if (lh->file_names_size == 0)
- {
- lh->file_names_size = 1;
- lh->file_names = xmalloc (lh->file_names_size
- * sizeof (*lh->file_names));
- }
- else if (lh->num_file_names >= lh->file_names_size)
- {
- lh->file_names_size *= 2;
- lh->file_names = xrealloc (lh->file_names,
- (lh->file_names_size
- * sizeof (*lh->file_names)));
- }
- fe = &lh->file_names[lh->num_file_names++];
- fe->name = name;
- fe->dir_index = dir_index;
- fe->mod_time = mod_time;
- fe->length = length;
- fe->included_p = 0;
- fe->symtab = NULL;
- }
- static struct dwarf2_section_info *
- get_debug_line_section (struct dwarf2_cu *cu)
- {
- struct dwarf2_section_info *section;
-
- if (cu->dwo_unit && cu->per_cu->is_debug_types)
- section = &cu->dwo_unit->dwo_file->sections.line;
- else if (cu->per_cu->is_dwz)
- {
- struct dwz_file *dwz = dwarf2_get_dwz_file ();
- section = &dwz->line;
- }
- else
- section = &dwarf2_per_objfile->line;
- return section;
- }
- static struct line_header *
- dwarf_decode_line_header (unsigned int offset, struct dwarf2_cu *cu)
- {
- struct cleanup *back_to;
- struct line_header *lh;
- const gdb_byte *line_ptr;
- unsigned int bytes_read, offset_size;
- int i;
- const char *cur_dir, *cur_file;
- struct dwarf2_section_info *section;
- bfd *abfd;
- section = get_debug_line_section (cu);
- dwarf2_read_section (dwarf2_per_objfile->objfile, section);
- if (section->buffer == NULL)
- {
- if (cu->dwo_unit && cu->per_cu->is_debug_types)
- complaint (&symfile_complaints, _("missing .debug_line.dwo section"));
- else
- complaint (&symfile_complaints, _("missing .debug_line section"));
- return 0;
- }
-
- abfd = get_section_bfd_owner (section);
-
- if (offset + 4 >= section->size)
- {
- dwarf2_statement_list_fits_in_line_number_section_complaint ();
- return 0;
- }
- lh = xmalloc (sizeof (*lh));
- memset (lh, 0, sizeof (*lh));
- back_to = make_cleanup ((make_cleanup_ftype *) free_line_header,
- (void *) lh);
- line_ptr = section->buffer + offset;
-
- lh->total_length =
- read_checked_initial_length_and_offset (abfd, line_ptr, &cu->header,
- &bytes_read, &offset_size);
- line_ptr += bytes_read;
- if (line_ptr + lh->total_length > (section->buffer + section->size))
- {
- dwarf2_statement_list_fits_in_line_number_section_complaint ();
- do_cleanups (back_to);
- return 0;
- }
- lh->statement_program_end = line_ptr + lh->total_length;
- lh->version = read_2_bytes (abfd, line_ptr);
- line_ptr += 2;
- lh->header_length = read_offset_1 (abfd, line_ptr, offset_size);
- line_ptr += offset_size;
- lh->minimum_instruction_length = read_1_byte (abfd, line_ptr);
- line_ptr += 1;
- if (lh->version >= 4)
- {
- lh->maximum_ops_per_instruction = read_1_byte (abfd, line_ptr);
- line_ptr += 1;
- }
- else
- lh->maximum_ops_per_instruction = 1;
- if (lh->maximum_ops_per_instruction == 0)
- {
- lh->maximum_ops_per_instruction = 1;
- complaint (&symfile_complaints,
- _("invalid maximum_ops_per_instruction "
- "in `.debug_line' section"));
- }
- lh->default_is_stmt = read_1_byte (abfd, line_ptr);
- line_ptr += 1;
- lh->line_base = read_1_signed_byte (abfd, line_ptr);
- line_ptr += 1;
- lh->line_range = read_1_byte (abfd, line_ptr);
- line_ptr += 1;
- lh->opcode_base = read_1_byte (abfd, line_ptr);
- line_ptr += 1;
- lh->standard_opcode_lengths
- = xmalloc (lh->opcode_base * sizeof (lh->standard_opcode_lengths[0]));
- lh->standard_opcode_lengths[0] = 1;
- for (i = 1; i < lh->opcode_base; ++i)
- {
- lh->standard_opcode_lengths[i] = read_1_byte (abfd, line_ptr);
- line_ptr += 1;
- }
-
- while ((cur_dir = read_direct_string (abfd, line_ptr, &bytes_read)) != NULL)
- {
- line_ptr += bytes_read;
- add_include_dir (lh, cur_dir);
- }
- line_ptr += bytes_read;
-
- while ((cur_file = read_direct_string (abfd, line_ptr, &bytes_read)) != NULL)
- {
- unsigned int dir_index, mod_time, length;
- line_ptr += bytes_read;
- dir_index = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
- line_ptr += bytes_read;
- mod_time = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
- line_ptr += bytes_read;
- length = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
- line_ptr += bytes_read;
- add_file_name (lh, cur_file, dir_index, mod_time, length);
- }
- line_ptr += bytes_read;
- lh->statement_program_start = line_ptr;
- if (line_ptr > (section->buffer + section->size))
- complaint (&symfile_complaints,
- _("line number info header doesn't "
- "fit in `.debug_line' section"));
- discard_cleanups (back_to);
- return lh;
- }
- static const char *
- psymtab_include_file_name (const struct line_header *lh, int file_index,
- const struct partial_symtab *pst,
- const char *comp_dir)
- {
- const struct file_entry fe = lh->file_names [file_index];
- const char *include_name = fe.name;
- const char *include_name_to_compare = include_name;
- const char *dir_name = NULL;
- const char *pst_filename;
- char *copied_name = NULL;
- int file_is_pst;
- if (fe.dir_index)
- dir_name = lh->include_dirs[fe.dir_index - 1];
- if (!IS_ABSOLUTE_PATH (include_name)
- && (dir_name != NULL || comp_dir != NULL))
- {
-
- if (dir_name != NULL)
- {
- char *tem = concat (dir_name, SLASH_STRING,
- include_name, (char *)NULL);
- make_cleanup (xfree, tem);
- include_name = tem;
- include_name_to_compare = include_name;
- }
- if (!IS_ABSOLUTE_PATH (include_name) && comp_dir != NULL)
- {
- char *tem = concat (comp_dir, SLASH_STRING,
- include_name, (char *)NULL);
- make_cleanup (xfree, tem);
- include_name_to_compare = tem;
- }
- }
- pst_filename = pst->filename;
- if (!IS_ABSOLUTE_PATH (pst_filename) && pst->dirname != NULL)
- {
- copied_name = concat (pst->dirname, SLASH_STRING,
- pst_filename, (char *)NULL);
- pst_filename = copied_name;
- }
- file_is_pst = FILENAME_CMP (include_name_to_compare, pst_filename) == 0;
- if (copied_name != NULL)
- xfree (copied_name);
- if (file_is_pst)
- return NULL;
- return include_name;
- }
- static void
- noop_record_line (struct subfile *subfile, int line, CORE_ADDR pc)
- {
- return;
- }
- static int
- dwarf_record_line_p (unsigned int line, unsigned int last_line,
- int line_has_non_zero_discriminator,
- struct subfile *last_subfile)
- {
- if (current_subfile != last_subfile)
- return 1;
- if (line != last_line)
- return 1;
-
- if (!line_has_non_zero_discriminator)
- return 1;
- return 0;
- }
- static void
- dwarf_record_line (struct gdbarch *gdbarch, struct subfile *subfile,
- unsigned int line, CORE_ADDR address,
- record_line_ftype p_record_line)
- {
- CORE_ADDR addr = gdbarch_addr_bits_remove (gdbarch, address);
- (*p_record_line) (subfile, line, addr);
- }
- static void
- dwarf_finish_line (struct gdbarch *gdbarch, struct subfile *subfile,
- CORE_ADDR address, record_line_ftype p_record_line)
- {
- if (subfile != NULL)
- dwarf_record_line (gdbarch, subfile, 0, address, p_record_line);
- }
- static void
- dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu,
- const int decode_for_pst_p, CORE_ADDR lowpc)
- {
- const gdb_byte *line_ptr, *extended_end;
- const gdb_byte *line_end;
- unsigned int bytes_read, extended_len;
- unsigned char op_code, extended_op;
- CORE_ADDR baseaddr;
- struct objfile *objfile = cu->objfile;
- bfd *abfd = objfile->obfd;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- struct subfile *last_subfile = NULL;
- void (*p_record_line) (struct subfile *subfile, int line, CORE_ADDR pc)
- = record_line;
- baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
- line_ptr = lh->statement_program_start;
- line_end = lh->statement_program_end;
-
- while (line_ptr < line_end)
- {
-
- CORE_ADDR address = gdbarch_adjust_dwarf2_line (gdbarch, 0, 0);
- unsigned int file = 1;
- unsigned int line = 1;
- int is_stmt = lh->default_is_stmt;
- int end_sequence = 0;
- unsigned char op_index = 0;
- unsigned int discriminator = 0;
-
- unsigned int last_line = 0;
- int line_has_non_zero_discriminator = 0;
- if (!decode_for_pst_p && lh->num_file_names >= file)
- {
-
-
- struct file_entry *fe = &lh->file_names[file - 1];
- const char *dir = NULL;
- if (fe->dir_index)
- dir = lh->include_dirs[fe->dir_index - 1];
- dwarf2_start_subfile (fe->name, dir);
- }
-
- while (!end_sequence)
- {
- op_code = read_1_byte (abfd, line_ptr);
- line_ptr += 1;
- if (line_ptr > line_end)
- {
- dwarf2_debug_line_missing_end_sequence_complaint ();
- break;
- }
- if (op_code >= lh->opcode_base)
- {
-
- unsigned char adj_opcode;
- CORE_ADDR addr_adj;
- int line_delta;
- adj_opcode = op_code - lh->opcode_base;
- addr_adj = (((op_index + (adj_opcode / lh->line_range))
- / lh->maximum_ops_per_instruction)
- * lh->minimum_instruction_length);
- address += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1);
- op_index = ((op_index + (adj_opcode / lh->line_range))
- % lh->maximum_ops_per_instruction);
- line_delta = lh->line_base + (adj_opcode % lh->line_range);
- line += line_delta;
- if (line_delta != 0)
- line_has_non_zero_discriminator = discriminator != 0;
- if (lh->num_file_names < file || file == 0)
- dwarf2_debug_line_missing_file_complaint ();
-
- else if (op_index == 0)
- {
- lh->file_names[file - 1].included_p = 1;
- if (!decode_for_pst_p && is_stmt)
- {
- if (last_subfile != current_subfile)
- {
- dwarf_finish_line (gdbarch, last_subfile,
- address, p_record_line);
- }
- if (dwarf_record_line_p (line, last_line,
- line_has_non_zero_discriminator,
- last_subfile))
- {
- dwarf_record_line (gdbarch, current_subfile,
- line, address, p_record_line);
- }
- last_subfile = current_subfile;
- last_line = line;
- }
- }
- discriminator = 0;
- }
- else switch (op_code)
- {
- case DW_LNS_extended_op:
- extended_len = read_unsigned_leb128 (abfd, line_ptr,
- &bytes_read);
- line_ptr += bytes_read;
- extended_end = line_ptr + extended_len;
- extended_op = read_1_byte (abfd, line_ptr);
- line_ptr += 1;
- switch (extended_op)
- {
- case DW_LNE_end_sequence:
- p_record_line = record_line;
- end_sequence = 1;
- break;
- case DW_LNE_set_address:
- address = read_address (abfd, line_ptr, cu, &bytes_read);
-
- if (address == 0 && address < lowpc)
- {
-
- long line_offset
- = line_ptr - get_debug_line_section (cu)->buffer;
- complaint (&symfile_complaints,
- _(".debug_line address at offset 0x%lx is 0 "
- "[in module %s]"),
- line_offset, objfile_name (objfile));
- p_record_line = noop_record_line;
-
- }
- op_index = 0;
- line_ptr += bytes_read;
- address += baseaddr;
- address = gdbarch_adjust_dwarf2_line (gdbarch, address, 0);
- break;
- case DW_LNE_define_file:
- {
- const char *cur_file;
- unsigned int dir_index, mod_time, length;
- cur_file = read_direct_string (abfd, line_ptr,
- &bytes_read);
- line_ptr += bytes_read;
- dir_index =
- read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
- line_ptr += bytes_read;
- mod_time =
- read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
- line_ptr += bytes_read;
- length =
- read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
- line_ptr += bytes_read;
- add_file_name (lh, cur_file, dir_index, mod_time, length);
- }
- break;
- case DW_LNE_set_discriminator:
-
- discriminator = read_unsigned_leb128 (abfd, line_ptr,
- &bytes_read);
- line_has_non_zero_discriminator |= discriminator != 0;
- line_ptr += bytes_read;
- break;
- default:
- complaint (&symfile_complaints,
- _("mangled .debug_line section"));
- return;
- }
-
- if (line_ptr != extended_end)
- {
- complaint (&symfile_complaints,
- _("mangled .debug_line section"));
- return;
- }
- break;
- case DW_LNS_copy:
- if (lh->num_file_names < file || file == 0)
- dwarf2_debug_line_missing_file_complaint ();
- else
- {
- lh->file_names[file - 1].included_p = 1;
- if (!decode_for_pst_p && is_stmt)
- {
- if (last_subfile != current_subfile)
- {
- dwarf_finish_line (gdbarch, last_subfile,
- address, p_record_line);
- }
- if (dwarf_record_line_p (line, last_line,
- line_has_non_zero_discriminator,
- last_subfile))
- {
- dwarf_record_line (gdbarch, current_subfile,
- line, address, p_record_line);
- }
- last_subfile = current_subfile;
- last_line = line;
- }
- }
- discriminator = 0;
- break;
- case DW_LNS_advance_pc:
- {
- CORE_ADDR adjust
- = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
- CORE_ADDR addr_adj;
- addr_adj = (((op_index + adjust)
- / lh->maximum_ops_per_instruction)
- * lh->minimum_instruction_length);
- address += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1);
- op_index = ((op_index + adjust)
- % lh->maximum_ops_per_instruction);
- line_ptr += bytes_read;
- }
- break;
- case DW_LNS_advance_line:
- {
- int line_delta
- = read_signed_leb128 (abfd, line_ptr, &bytes_read);
- line += line_delta;
- if (line_delta != 0)
- line_has_non_zero_discriminator = discriminator != 0;
- line_ptr += bytes_read;
- }
- break;
- case DW_LNS_set_file:
- {
-
- struct file_entry *fe;
- const char *dir = NULL;
- file = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
- line_ptr += bytes_read;
- if (lh->num_file_names < file || file == 0)
- dwarf2_debug_line_missing_file_complaint ();
- else
- {
- fe = &lh->file_names[file - 1];
- if (fe->dir_index)
- dir = lh->include_dirs[fe->dir_index - 1];
- if (!decode_for_pst_p)
- {
- last_subfile = current_subfile;
- line_has_non_zero_discriminator = discriminator != 0;
- dwarf2_start_subfile (fe->name, dir);
- }
- }
- }
- break;
- case DW_LNS_set_column:
- (void) read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
- line_ptr += bytes_read;
- break;
- case DW_LNS_negate_stmt:
- is_stmt = (!is_stmt);
- break;
- case DW_LNS_set_basic_block:
- break;
-
- case DW_LNS_const_add_pc:
- {
- CORE_ADDR adjust = (255 - lh->opcode_base) / lh->line_range;
- CORE_ADDR addr_adj;
- addr_adj = (((op_index + adjust)
- / lh->maximum_ops_per_instruction)
- * lh->minimum_instruction_length);
- address += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1);
- op_index = ((op_index + adjust)
- % lh->maximum_ops_per_instruction);
- }
- break;
- case DW_LNS_fixed_advance_pc:
- {
- CORE_ADDR addr_adj;
- addr_adj = read_2_bytes (abfd, line_ptr);
- address += gdbarch_adjust_dwarf2_line (gdbarch, addr_adj, 1);
- op_index = 0;
- line_ptr += 2;
- }
- break;
- default:
- {
-
- int i;
- for (i = 0; i < lh->standard_opcode_lengths[op_code]; i++)
- {
- (void) read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
- line_ptr += bytes_read;
- }
- }
- }
- }
- if (lh->num_file_names < file || file == 0)
- dwarf2_debug_line_missing_file_complaint ();
- else
- {
- lh->file_names[file - 1].included_p = 1;
- if (!decode_for_pst_p)
- {
- dwarf_finish_line (gdbarch, current_subfile, address,
- p_record_line);
- }
- }
- }
- }
- static void
- dwarf_decode_lines (struct line_header *lh, const char *comp_dir,
- struct dwarf2_cu *cu, struct partial_symtab *pst,
- CORE_ADDR lowpc)
- {
- struct objfile *objfile = cu->objfile;
- const int decode_for_pst_p = (pst != NULL);
- dwarf_decode_lines_1 (lh, cu, decode_for_pst_p, lowpc);
- if (decode_for_pst_p)
- {
- int file_index;
-
- for (file_index = 0; file_index < lh->num_file_names; file_index++)
- if (lh->file_names[file_index].included_p == 1)
- {
- const char *include_name =
- psymtab_include_file_name (lh, file_index, pst, comp_dir);
- if (include_name != NULL)
- dwarf2_create_include_psymtab (include_name, pst, objfile);
- }
- }
- else
- {
-
- struct compunit_symtab *cust = buildsym_compunit_symtab ();
- int i;
- for (i = 0; i < lh->num_file_names; i++)
- {
- const char *dir = NULL;
- struct file_entry *fe;
- fe = &lh->file_names[i];
- if (fe->dir_index)
- dir = lh->include_dirs[fe->dir_index - 1];
- dwarf2_start_subfile (fe->name, dir);
- if (current_subfile->symtab == NULL)
- {
- current_subfile->symtab
- = allocate_symtab (cust, current_subfile->name);
- }
- fe->symtab = current_subfile->symtab;
- }
- }
- }
- static void
- dwarf2_start_subfile (const char *filename, const char *dirname)
- {
- char *copy = NULL;
-
- if (!IS_ABSOLUTE_PATH (filename) && dirname != NULL)
- {
- copy = concat (dirname, SLASH_STRING, filename, (char *)NULL);
- filename = copy;
- }
- start_subfile (filename);
- if (copy != NULL)
- xfree (copy);
- }
- static struct compunit_symtab *
- dwarf2_start_symtab (struct dwarf2_cu *cu,
- const char *name, const char *comp_dir, CORE_ADDR low_pc)
- {
- struct compunit_symtab *cust
- = start_symtab (cu->objfile, name, comp_dir, low_pc);
- record_debugformat ("DWARF 2");
- record_producer (cu->producer);
-
- processing_gcc_compilation = 2;
- cu->processing_has_namespace_info = 0;
- return cust;
- }
- static void
- var_decode_location (struct attribute *attr, struct symbol *sym,
- struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct comp_unit_head *cu_header = &cu->header;
-
-
- if (attr_form_is_block (attr) && DW_BLOCK (attr)->size == 0)
- {
- SYMBOL_ACLASS_INDEX (sym) = LOC_OPTIMIZED_OUT;
- return;
- }
-
- if (attr_form_is_block (attr)
- && ((DW_BLOCK (attr)->data[0] == DW_OP_addr
- && DW_BLOCK (attr)->size == 1 + cu_header->addr_size)
- || (DW_BLOCK (attr)->data[0] == DW_OP_GNU_addr_index
- && (DW_BLOCK (attr)->size
- == 1 + leb128_size (&DW_BLOCK (attr)->data[1])))))
- {
- unsigned int dummy;
- if (DW_BLOCK (attr)->data[0] == DW_OP_addr)
- SYMBOL_VALUE_ADDRESS (sym) =
- read_address (objfile->obfd, DW_BLOCK (attr)->data + 1, cu, &dummy);
- else
- SYMBOL_VALUE_ADDRESS (sym) =
- read_addr_index_from_leb128 (cu, DW_BLOCK (attr)->data + 1, &dummy);
- SYMBOL_ACLASS_INDEX (sym) = LOC_STATIC;
- fixup_symbol_section (sym, objfile);
- SYMBOL_VALUE_ADDRESS (sym) += ANOFFSET (objfile->section_offsets,
- SYMBOL_SECTION (sym));
- return;
- }
-
- dwarf2_symbol_mark_computed (attr, sym, cu, 0);
- if (SYMBOL_COMPUTED_OPS (sym)->location_has_loclist)
- cu->has_loclist = 1;
- }
- static struct symbol *
- new_symbol_full (struct die_info *die, struct type *type, struct dwarf2_cu *cu,
- struct symbol *space)
- {
- struct objfile *objfile = cu->objfile;
- struct gdbarch *gdbarch = get_objfile_arch (objfile);
- struct symbol *sym = NULL;
- const char *name;
- struct attribute *attr = NULL;
- struct attribute *attr2 = NULL;
- CORE_ADDR baseaddr;
- struct pending **list_to_add = NULL;
- int inlined_func = (die->tag == DW_TAG_inlined_subroutine);
- baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
- name = dwarf2_name (die, cu);
- if (name)
- {
- const char *linkagename;
- int suppress_add = 0;
- if (space)
- sym = space;
- else
- sym = allocate_symbol (objfile);
- OBJSTAT (objfile, n_syms++);
-
- SYMBOL_SET_LANGUAGE (sym, cu->language, &objfile->objfile_obstack);
- linkagename = dwarf2_physname (name, die, cu);
- SYMBOL_SET_NAMES (sym, linkagename, strlen (linkagename), 0, objfile);
-
- if (cu->language == language_fortran
- && symbol_get_demangled_name (&(sym->ginfo)) == NULL)
- symbol_set_demangled_name (&(sym->ginfo),
- dwarf2_full_name (name, die, cu),
- NULL);
-
- SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
- SYMBOL_ACLASS_INDEX (sym) = LOC_OPTIMIZED_OUT;
- if (type != NULL)
- SYMBOL_TYPE (sym) = type;
- else
- SYMBOL_TYPE (sym) = die_type (die, cu);
- attr = dwarf2_attr (die,
- inlined_func ? DW_AT_call_line : DW_AT_decl_line,
- cu);
- if (attr)
- {
- SYMBOL_LINE (sym) = DW_UNSND (attr);
- }
- attr = dwarf2_attr (die,
- inlined_func ? DW_AT_call_file : DW_AT_decl_file,
- cu);
- if (attr)
- {
- int file_index = DW_UNSND (attr);
- if (cu->line_header == NULL
- || file_index > cu->line_header->num_file_names)
- complaint (&symfile_complaints,
- _("file index out of range"));
- else if (file_index > 0)
- {
- struct file_entry *fe;
- fe = &cu->line_header->file_names[file_index - 1];
- symbol_set_symtab (sym, fe->symtab);
- }
- }
- switch (die->tag)
- {
- case DW_TAG_label:
- attr = dwarf2_attr (die, DW_AT_low_pc, cu);
- if (attr)
- {
- CORE_ADDR addr;
- addr = attr_value_as_address (attr);
- addr = gdbarch_adjust_dwarf2_addr (gdbarch, addr + baseaddr);
- SYMBOL_VALUE_ADDRESS (sym) = addr;
- }
- SYMBOL_TYPE (sym) = objfile_type (objfile)->builtin_core_addr;
- SYMBOL_DOMAIN (sym) = LABEL_DOMAIN;
- SYMBOL_ACLASS_INDEX (sym) = LOC_LABEL;
- add_symbol_to_list (sym, cu->list_in_scope);
- break;
- case DW_TAG_subprogram:
-
- SYMBOL_ACLASS_INDEX (sym) = LOC_BLOCK;
- attr2 = dwarf2_attr (die, DW_AT_external, cu);
- if ((attr2 && (DW_UNSND (attr2) != 0))
- || cu->language == language_ada)
- {
-
- list_to_add = &global_symbols;
- }
- else
- {
- list_to_add = cu->list_in_scope;
- }
- break;
- case DW_TAG_inlined_subroutine:
-
- SYMBOL_ACLASS_INDEX (sym) = LOC_BLOCK;
- SYMBOL_INLINED (sym) = 1;
- list_to_add = cu->list_in_scope;
- break;
- case DW_TAG_template_value_param:
- suppress_add = 1;
-
- case DW_TAG_constant:
- case DW_TAG_variable:
- case DW_TAG_member:
-
- if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_VOID)
- SYMBOL_TYPE (sym)
- = objfile_type (objfile)->nodebug_data_symbol;
- attr = dwarf2_attr (die, DW_AT_const_value, cu);
-
- if (die->tag == DW_TAG_member)
- {
-
- gdb_assert (die_is_declaration (die, cu));
- gdb_assert (attr);
- }
- if (attr)
- {
- dwarf2_const_value (attr, sym, cu);
- attr2 = dwarf2_attr (die, DW_AT_external, cu);
- if (!suppress_add)
- {
- if (attr2 && (DW_UNSND (attr2) != 0))
- list_to_add = &global_symbols;
- else
- list_to_add = cu->list_in_scope;
- }
- break;
- }
- attr = dwarf2_attr (die, DW_AT_location, cu);
- if (attr)
- {
- var_decode_location (attr, sym, cu);
- attr2 = dwarf2_attr (die, DW_AT_external, cu);
-
- if (cu->language == language_fortran && die->parent
- && die->parent->tag == DW_TAG_common_block)
- attr2 = NULL;
- if (SYMBOL_CLASS (sym) == LOC_STATIC
- && SYMBOL_VALUE_ADDRESS (sym) == 0
- && !dwarf2_per_objfile->has_section_at_zero)
- {
-
- }
- else if (attr2 && (DW_UNSND (attr2) != 0))
- {
-
- if (cu->language == language_fortran && die->parent
- && die->parent->tag == DW_TAG_module
- && cu->producer
- && strncmp (cu->producer, "GNU Fortran ", 12) == 0)
- SYMBOL_ACLASS_INDEX (sym) = LOC_UNRESOLVED;
-
- list_to_add = (cu->list_in_scope == &file_symbols
- ? &global_symbols : cu->list_in_scope);
- }
- else
- list_to_add = cu->list_in_scope;
- }
- else
- {
-
- attr2 = dwarf2_attr (die, DW_AT_external, cu);
-
- if (cu->language == language_fortran && die->parent
- && die->parent->tag == DW_TAG_common_block)
- {
-
- if (!suppress_add)
- list_to_add = cu->list_in_scope;
- }
- else if (attr2 && (DW_UNSND (attr2) != 0)
- && dwarf2_attr (die, DW_AT_type, cu) != NULL)
- {
-
- list_to_add = (cu->list_in_scope == &file_symbols
- ? &global_symbols : cu->list_in_scope);
- SYMBOL_ACLASS_INDEX (sym) = LOC_UNRESOLVED;
- }
- else if (!die_is_declaration (die, cu))
- {
-
- gdb_assert (SYMBOL_CLASS (sym) == LOC_OPTIMIZED_OUT);
- if (!suppress_add)
- list_to_add = cu->list_in_scope;
- }
- }
- break;
- case DW_TAG_formal_parameter:
-
- if (context_stack_depth > 0
- && context_stack[context_stack_depth - 1].name != NULL)
- SYMBOL_IS_ARGUMENT (sym) = 1;
- attr = dwarf2_attr (die, DW_AT_location, cu);
- if (attr)
- {
- var_decode_location (attr, sym, cu);
- }
- attr = dwarf2_attr (die, DW_AT_const_value, cu);
- if (attr)
- {
- dwarf2_const_value (attr, sym, cu);
- }
- list_to_add = cu->list_in_scope;
- break;
- case DW_TAG_unspecified_parameters:
-
- FIXME
- break;
- case DW_TAG_template_type_param:
- suppress_add = 1;
-
- case DW_TAG_class_type:
- case DW_TAG_interface_type:
- case DW_TAG_structure_type:
- case DW_TAG_union_type:
- case DW_TAG_set_type:
- case DW_TAG_enumeration_type:
- SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
- SYMBOL_DOMAIN (sym) = STRUCT_DOMAIN;
- {
-
- if (!suppress_add)
- {
- list_to_add = (cu->list_in_scope == &file_symbols
- && (cu->language == language_cplus
- || cu->language == language_java)
- ? &global_symbols : cu->list_in_scope);
-
- if (cu->language == language_cplus
- || cu->language == language_java
- || cu->language == language_ada)
- {
-
- if (TYPE_NAME (SYMBOL_TYPE (sym)) == 0)
- TYPE_NAME (SYMBOL_TYPE (sym)) = SYMBOL_SEARCH_NAME (sym);
- }
- }
- }
- break;
- case DW_TAG_typedef:
- SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
- SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
- list_to_add = cu->list_in_scope;
- break;
- case DW_TAG_base_type:
- case DW_TAG_subrange_type:
- SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
- SYMBOL_DOMAIN (sym) = VAR_DOMAIN;
- list_to_add = cu->list_in_scope;
- break;
- case DW_TAG_enumerator:
- attr = dwarf2_attr (die, DW_AT_const_value, cu);
- if (attr)
- {
- dwarf2_const_value (attr, sym, cu);
- }
- {
-
- list_to_add = (cu->list_in_scope == &file_symbols
- && (cu->language == language_cplus
- || cu->language == language_java)
- ? &global_symbols : cu->list_in_scope);
- }
- break;
- case DW_TAG_imported_declaration:
- case DW_TAG_namespace:
- SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
- list_to_add = &global_symbols;
- break;
- case DW_TAG_module:
- SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF;
- SYMBOL_DOMAIN (sym) = MODULE_DOMAIN;
- list_to_add = &global_symbols;
- break;
- case DW_TAG_common_block:
- SYMBOL_ACLASS_INDEX (sym) = LOC_COMMON_BLOCK;
- SYMBOL_DOMAIN (sym) = COMMON_BLOCK_DOMAIN;
- add_symbol_to_list (sym, cu->list_in_scope);
- break;
- default:
-
- complaint (&symfile_complaints, _("unsupported tag: '%s'"),
- dwarf_tag_name (die->tag));
- break;
- }
- if (suppress_add)
- {
- sym->hash_next = objfile->template_symbols;
- objfile->template_symbols = sym;
- list_to_add = NULL;
- }
- if (list_to_add != NULL)
- add_symbol_to_list (sym, list_to_add);
-
- if (!cu->processing_has_namespace_info
- && cu->language == language_cplus)
- cp_scan_for_anonymous_namespaces (sym, objfile);
- }
- return (sym);
- }
- static struct symbol *
- new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
- {
- return new_symbol_full (die, type, cu, NULL);
- }
- static gdb_byte *
- dwarf2_const_value_data (const struct attribute *attr, struct obstack *obstack,
- struct dwarf2_cu *cu, LONGEST *value, int bits)
- {
- struct objfile *objfile = cu->objfile;
- enum bfd_endian byte_order = bfd_big_endian (objfile->obfd) ?
- BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE;
- LONGEST l = DW_UNSND (attr);
- if (bits < sizeof (*value) * 8)
- {
- l &= ((LONGEST) 1 << bits) - 1;
- *value = l;
- }
- else if (bits == sizeof (*value) * 8)
- *value = l;
- else
- {
- gdb_byte *bytes = obstack_alloc (obstack, bits / 8);
- store_unsigned_integer (bytes, bits / 8, byte_order, l);
- return bytes;
- }
- return NULL;
- }
- static void
- dwarf2_const_value_attr (const struct attribute *attr, struct type *type,
- const char *name, struct obstack *obstack,
- struct dwarf2_cu *cu,
- LONGEST *value, const gdb_byte **bytes,
- struct dwarf2_locexpr_baton **baton)
- {
- struct objfile *objfile = cu->objfile;
- struct comp_unit_head *cu_header = &cu->header;
- struct dwarf_block *blk;
- enum bfd_endian byte_order = (bfd_big_endian (objfile->obfd) ?
- BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE);
- *value = 0;
- *bytes = NULL;
- *baton = NULL;
- switch (attr->form)
- {
- case DW_FORM_addr:
- case DW_FORM_GNU_addr_index:
- {
- gdb_byte *data;
- if (TYPE_LENGTH (type) != cu_header->addr_size)
- dwarf2_const_value_length_mismatch_complaint (name,
- cu_header->addr_size,
- TYPE_LENGTH (type));
-
- *baton = obstack_alloc (obstack, sizeof (struct dwarf2_locexpr_baton));
- (*baton)->per_cu = cu->per_cu;
- gdb_assert ((*baton)->per_cu);
- (*baton)->size = 2 + cu_header->addr_size;
- data = obstack_alloc (obstack, (*baton)->size);
- (*baton)->data = data;
- data[0] = DW_OP_addr;
- store_unsigned_integer (&data[1], cu_header->addr_size,
- byte_order, DW_ADDR (attr));
- data[cu_header->addr_size + 1] = DW_OP_stack_value;
- }
- break;
- case DW_FORM_string:
- case DW_FORM_strp:
- case DW_FORM_GNU_str_index:
- case DW_FORM_GNU_strp_alt:
-
- *bytes = (const gdb_byte *) DW_STRING (attr);
- break;
- case DW_FORM_block1:
- case DW_FORM_block2:
- case DW_FORM_block4:
- case DW_FORM_block:
- case DW_FORM_exprloc:
- blk = DW_BLOCK (attr);
- if (TYPE_LENGTH (type) != blk->size)
- dwarf2_const_value_length_mismatch_complaint (name, blk->size,
- TYPE_LENGTH (type));
- *bytes = blk->data;
- break;
-
- case DW_FORM_data1:
- *bytes = dwarf2_const_value_data (attr, obstack, cu, value, 8);
- break;
- case DW_FORM_data2:
- *bytes = dwarf2_const_value_data (attr, obstack, cu, value, 16);
- break;
- case DW_FORM_data4:
- *bytes = dwarf2_const_value_data (attr, obstack, cu, value, 32);
- break;
- case DW_FORM_data8:
- *bytes = dwarf2_const_value_data (attr, obstack, cu, value, 64);
- break;
- case DW_FORM_sdata:
- *value = DW_SND (attr);
- break;
- case DW_FORM_udata:
- *value = DW_UNSND (attr);
- break;
- default:
- complaint (&symfile_complaints,
- _("unsupported const value attribute form: '%s'"),
- dwarf_form_name (attr->form));
- *value = 0;
- break;
- }
- }
- static void
- dwarf2_const_value (const struct attribute *attr, struct symbol *sym,
- struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct comp_unit_head *cu_header = &cu->header;
- LONGEST value;
- const gdb_byte *bytes;
- struct dwarf2_locexpr_baton *baton;
- dwarf2_const_value_attr (attr, SYMBOL_TYPE (sym),
- SYMBOL_PRINT_NAME (sym),
- &objfile->objfile_obstack, cu,
- &value, &bytes, &baton);
- if (baton != NULL)
- {
- SYMBOL_LOCATION_BATON (sym) = baton;
- SYMBOL_ACLASS_INDEX (sym) = dwarf2_locexpr_index;
- }
- else if (bytes != NULL)
- {
- SYMBOL_VALUE_BYTES (sym) = bytes;
- SYMBOL_ACLASS_INDEX (sym) = LOC_CONST_BYTES;
- }
- else
- {
- SYMBOL_VALUE (sym) = value;
- SYMBOL_ACLASS_INDEX (sym) = LOC_CONST;
- }
- }
- static struct type *
- die_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct attribute *type_attr;
- type_attr = dwarf2_attr (die, DW_AT_type, cu);
- if (!type_attr)
- {
-
- return objfile_type (cu->objfile)->builtin_void;
- }
- return lookup_die_type (die, type_attr, cu);
- }
- static int
- need_gnat_info (struct dwarf2_cu *cu)
- {
- FIXME
- return 0;
- }
- static struct type *
- die_descriptive_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct attribute *type_attr;
- type_attr = dwarf2_attr (die, DW_AT_GNAT_descriptive_type, cu);
- if (!type_attr)
- return NULL;
- return lookup_die_type (die, type_attr, cu);
- }
- static void
- set_descriptive_type (struct type *type, struct die_info *die,
- struct dwarf2_cu *cu)
- {
- struct type *descriptive_type = die_descriptive_type (die, cu);
- if (descriptive_type)
- {
- ALLOCATE_GNAT_AUX_TYPE (type);
- TYPE_DESCRIPTIVE_TYPE (type) = descriptive_type;
- }
- }
- static struct type *
- die_containing_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct attribute *type_attr;
- type_attr = dwarf2_attr (die, DW_AT_containing_type, cu);
- if (!type_attr)
- error (_("Dwarf Error: Problem turning containing type into gdb type "
- "[in module %s]"), objfile_name (cu->objfile));
- return lookup_die_type (die, type_attr, cu);
- }
- static struct type *
- build_error_marker_type (struct dwarf2_cu *cu, struct die_info *die)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- char *message, *saved;
- message = xstrprintf (_("<unknown type in %s, CU 0x%x, DIE 0x%x>"),
- objfile_name (objfile),
- cu->header.offset.sect_off,
- die->offset.sect_off);
- saved = obstack_copy0 (&objfile->objfile_obstack,
- message, strlen (message));
- xfree (message);
- return init_type (TYPE_CODE_ERROR, 0, 0, saved, objfile);
- }
- static struct type *
- lookup_die_type (struct die_info *die, const struct attribute *attr,
- struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- struct type *this_type;
- gdb_assert (attr->name == DW_AT_type
- || attr->name == DW_AT_GNAT_descriptive_type
- || attr->name == DW_AT_containing_type);
-
- if (attr->form == DW_FORM_GNU_ref_alt)
- {
- struct dwarf2_per_cu_data *per_cu;
- sect_offset offset = dwarf2_get_ref_die_offset (attr);
- per_cu = dwarf2_find_containing_comp_unit (offset, 1, cu->objfile);
- this_type = get_die_type_at_offset (offset, per_cu);
- }
- else if (attr_form_is_ref (attr))
- {
- sect_offset offset = dwarf2_get_ref_die_offset (attr);
- this_type = get_die_type_at_offset (offset, cu->per_cu);
- }
- else if (attr->form == DW_FORM_ref_sig8)
- {
- ULONGEST signature = DW_SIGNATURE (attr);
- return get_signatured_type (die, signature, cu);
- }
- else
- {
- complaint (&symfile_complaints,
- _("Dwarf Error: Bad type attribute %s in DIE"
- " at 0x%x [in module %s]"),
- dwarf_attr_name (attr->name), die->offset.sect_off,
- objfile_name (objfile));
- return build_error_marker_type (cu, die);
- }
-
- if (this_type == NULL)
- {
- struct die_info *type_die = NULL;
- struct dwarf2_cu *type_cu = cu;
- if (attr_form_is_ref (attr))
- type_die = follow_die_ref (die, attr, &type_cu);
- if (type_die == NULL)
- return build_error_marker_type (cu, die);
-
- this_type = read_type_die (type_die, type_cu);
- }
-
- if (this_type == NULL)
- return build_error_marker_type (cu, die);
- return this_type;
- }
- static struct type *
- read_type_die (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct type *this_type;
- this_type = get_die_type (die, cu);
- if (this_type)
- return this_type;
- return read_type_die_1 (die, cu);
- }
- static struct type *
- read_type_die_1 (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct type *this_type = NULL;
- switch (die->tag)
- {
- case DW_TAG_class_type:
- case DW_TAG_interface_type:
- case DW_TAG_structure_type:
- case DW_TAG_union_type:
- this_type = read_structure_type (die, cu);
- break;
- case DW_TAG_enumeration_type:
- this_type = read_enumeration_type (die, cu);
- break;
- case DW_TAG_subprogram:
- case DW_TAG_subroutine_type:
- case DW_TAG_inlined_subroutine:
- this_type = read_subroutine_type (die, cu);
- break;
- case DW_TAG_array_type:
- this_type = read_array_type (die, cu);
- break;
- case DW_TAG_set_type:
- this_type = read_set_type (die, cu);
- break;
- case DW_TAG_pointer_type:
- this_type = read_tag_pointer_type (die, cu);
- break;
- case DW_TAG_ptr_to_member_type:
- this_type = read_tag_ptr_to_member_type (die, cu);
- break;
- case DW_TAG_reference_type:
- this_type = read_tag_reference_type (die, cu);
- break;
- case DW_TAG_const_type:
- this_type = read_tag_const_type (die, cu);
- break;
- case DW_TAG_volatile_type:
- this_type = read_tag_volatile_type (die, cu);
- break;
- case DW_TAG_restrict_type:
- this_type = read_tag_restrict_type (die, cu);
- break;
- case DW_TAG_string_type:
- this_type = read_tag_string_type (die, cu);
- break;
- case DW_TAG_typedef:
- this_type = read_typedef (die, cu);
- break;
- case DW_TAG_subrange_type:
- this_type = read_subrange_type (die, cu);
- break;
- case DW_TAG_base_type:
- this_type = read_base_type (die, cu);
- break;
- case DW_TAG_unspecified_type:
- this_type = read_unspecified_type (die, cu);
- break;
- case DW_TAG_namespace:
- this_type = read_namespace_type (die, cu);
- break;
- case DW_TAG_module:
- this_type = read_module_type (die, cu);
- break;
- default:
- complaint (&symfile_complaints,
- _("unexpected tag in read_type_die: '%s'"),
- dwarf_tag_name (die->tag));
- break;
- }
- return this_type;
- }
- static char *
- guess_full_die_structure_name (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct die_info *spec_die;
- struct dwarf2_cu *spec_cu;
- struct die_info *child;
- spec_cu = cu;
- spec_die = die_specification (die, &spec_cu);
- if (spec_die != NULL)
- {
- die = spec_die;
- cu = spec_cu;
- }
- for (child = die->child;
- child != NULL;
- child = child->sibling)
- {
- if (child->tag == DW_TAG_subprogram)
- {
- struct attribute *attr;
- attr = dwarf2_attr (child, DW_AT_linkage_name, cu);
- if (attr == NULL)
- attr = dwarf2_attr (child, DW_AT_MIPS_linkage_name, cu);
- if (attr != NULL)
- {
- char *actual_name
- = language_class_name_from_physname (cu->language_defn,
- DW_STRING (attr));
- char *name = NULL;
- if (actual_name != NULL)
- {
- const char *die_name = dwarf2_name (die, cu);
- if (die_name != NULL
- && strcmp (die_name, actual_name) != 0)
- {
-
- int die_name_len = strlen (die_name);
- int actual_name_len = strlen (actual_name);
-
- if (actual_name_len > die_name_len + 2
- && actual_name[actual_name_len
- - die_name_len - 1] == ':')
- name =
- obstack_copy0 (&cu->objfile->per_bfd->storage_obstack,
- actual_name,
- actual_name_len - die_name_len - 2);
- }
- }
- xfree (actual_name);
- return name;
- }
- }
- }
- return NULL;
- }
- static char *
- anonymous_struct_prefix (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct attribute *attr;
- char *base;
- if (die->tag != DW_TAG_class_type && die->tag != DW_TAG_interface_type
- && die->tag != DW_TAG_structure_type && die->tag != DW_TAG_union_type)
- return NULL;
- attr = dwarf2_attr (die, DW_AT_name, cu);
- if (attr != NULL && DW_STRING (attr) != NULL)
- return NULL;
- attr = dwarf2_attr (die, DW_AT_linkage_name, cu);
- if (attr == NULL)
- attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu);
- if (attr == NULL || DW_STRING (attr) == NULL)
- return NULL;
-
- gdb_assert (DW_STRING_IS_CANONICAL (attr));
-
- base = strrchr (DW_STRING (attr), ':');
- if (base == NULL || base == DW_STRING (attr) || base[-1] != ':')
- return "";
- return obstack_copy0 (&cu->objfile->per_bfd->storage_obstack,
- DW_STRING (attr), &base[-1] - DW_STRING (attr));
- }
- static const char *
- determine_prefix (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct die_info *parent, *spec_die;
- struct dwarf2_cu *spec_cu;
- struct type *parent_type;
- char *retval;
- if (cu->language != language_cplus && cu->language != language_java
- && cu->language != language_fortran)
- return "";
- retval = anonymous_struct_prefix (die, cu);
- if (retval)
- return retval;
-
- spec_cu = cu;
- spec_die = die_specification (die, &spec_cu);
- if (spec_die == NULL)
- parent = die->parent;
- else
- {
- parent = spec_die->parent;
- cu = spec_cu;
- }
- if (parent == NULL)
- return "";
- else if (parent->building_fullname)
- {
- const char *name;
- const char *parent_name;
-
- name = dwarf2_name (die, cu);
- parent_name = dwarf2_name (parent, cu);
- complaint (&symfile_complaints,
- _("template param type '%s' defined within parent '%s'"),
- name ? name : "<unknown>",
- parent_name ? parent_name : "<unknown>");
- return "";
- }
- else
- switch (parent->tag)
- {
- case DW_TAG_namespace:
- parent_type = read_type_die (parent, cu);
-
- if (cu->language == language_cplus
- && strcmp (TYPE_TAG_NAME (parent_type), "::") == 0)
- return "";
-
- return TYPE_TAG_NAME (parent_type);
- case DW_TAG_class_type:
- case DW_TAG_interface_type:
- case DW_TAG_structure_type:
- case DW_TAG_union_type:
- case DW_TAG_module:
- parent_type = read_type_die (parent, cu);
- if (TYPE_TAG_NAME (parent_type) != NULL)
- return TYPE_TAG_NAME (parent_type);
- else
-
- return "";
- case DW_TAG_compile_unit:
- case DW_TAG_partial_unit:
-
- if (cu->language == language_cplus
- && !VEC_empty (dwarf2_section_info_def, dwarf2_per_objfile->types)
- && die->child != NULL
- && (die->tag == DW_TAG_class_type
- || die->tag == DW_TAG_structure_type
- || die->tag == DW_TAG_union_type))
- {
- char *name = guess_full_die_structure_name (die, cu);
- if (name != NULL)
- return name;
- }
- return "";
- case DW_TAG_enumeration_type:
- parent_type = read_type_die (parent, cu);
- if (TYPE_DECLARED_CLASS (parent_type))
- {
- if (TYPE_TAG_NAME (parent_type) != NULL)
- return TYPE_TAG_NAME (parent_type);
- return "";
- }
-
- default:
- return determine_prefix (parent, cu);
- }
- }
- #define MAX_SEP_LEN 7
- static char *
- typename_concat (struct obstack *obs, const char *prefix, const char *suffix,
- int physname, struct dwarf2_cu *cu)
- {
- const char *lead = "";
- const char *sep;
- if (suffix == NULL || suffix[0] == '\0'
- || prefix == NULL || prefix[0] == '\0')
- sep = "";
- else if (cu->language == language_java)
- sep = ".";
- else if (cu->language == language_fortran && physname)
- {
-
- lead = "__";
- sep = "_MOD_";
- }
- else
- sep = "::";
- if (prefix == NULL)
- prefix = "";
- if (suffix == NULL)
- suffix = "";
- if (obs == NULL)
- {
- char *retval
- = xmalloc (strlen (prefix) + MAX_SEP_LEN + strlen (suffix) + 1);
- strcpy (retval, lead);
- strcat (retval, prefix);
- strcat (retval, sep);
- strcat (retval, suffix);
- return retval;
- }
- else
- {
-
- return obconcat (obs, lead, prefix, sep, suffix, (char *) NULL);
- }
- }
- static struct die_info *
- sibling_die (struct die_info *die)
- {
- return die->sibling;
- }
- static const char *
- dwarf2_canonicalize_name (const char *name, struct dwarf2_cu *cu,
- struct obstack *obstack)
- {
- if (name && cu->language == language_cplus)
- {
- char *canon_name = cp_canonicalize_string (name);
- if (canon_name != NULL)
- {
- if (strcmp (canon_name, name) != 0)
- name = obstack_copy0 (obstack, canon_name, strlen (canon_name));
- xfree (canon_name);
- }
- }
- return name;
- }
- static const char *
- dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
- {
- struct attribute *attr;
- attr = dwarf2_attr (die, DW_AT_name, cu);
- if ((!attr || !DW_STRING (attr))
- && die->tag != DW_TAG_class_type
- && die->tag != DW_TAG_interface_type
- && die->tag != DW_TAG_structure_type
- && die->tag != DW_TAG_union_type)
- return NULL;
- switch (die->tag)
- {
- case DW_TAG_compile_unit:
- case DW_TAG_partial_unit:
-
- case DW_TAG_enumeration_type:
- case DW_TAG_enumerator:
-
- return DW_STRING (attr);
- case DW_TAG_subprogram:
-
- if (cu->language == language_java
- && DW_STRING (attr) != NULL
- && strcmp (DW_STRING (attr), "<init>") == 0)
- {
- struct dwarf2_cu *spec_cu = cu;
- struct die_info *spec_die;
-
-
- spec_die = die_specification (die, &spec_cu);
- if (spec_die != NULL)
- return dwarf2_name (spec_die, spec_cu);
- do
- {
- die = die->parent;
- if (die->tag == DW_TAG_class_type)
- return dwarf2_name (die, cu);
- }
- while (die->tag != DW_TAG_compile_unit
- && die->tag != DW_TAG_partial_unit);
- }
- break;
- case DW_TAG_class_type:
- case DW_TAG_interface_type:
- case DW_TAG_structure_type:
- case DW_TAG_union_type:
-
- if (attr && DW_STRING (attr)
- && (strncmp (DW_STRING (attr), "._", 2) == 0
- || strncmp (DW_STRING (attr), "<anonymous", 10) == 0))
- return NULL;
-
- if (!attr || DW_STRING (attr) == NULL)
- {
- char *demangled = NULL;
- attr = dwarf2_attr (die, DW_AT_linkage_name, cu);
- if (attr == NULL)
- attr = dwarf2_attr (die, DW_AT_MIPS_linkage_name, cu);
- if (attr == NULL || DW_STRING (attr) == NULL)
- return NULL;
-
- if (!DW_STRING_IS_CANONICAL (attr))
- demangled = gdb_demangle (DW_STRING (attr), DMGL_TYPES);
- if (demangled)
- {
- char *base;
- FIXME
- DW_STRING (attr)
- = obstack_copy0 (&cu->objfile->per_bfd->storage_obstack,
- demangled, strlen (demangled));
- DW_STRING_IS_CANONICAL (attr) = 1;
- xfree (demangled);
-
- base = strrchr (DW_STRING (attr), ':');
- if (base && base > DW_STRING (attr) && base[-1] == ':')
- return &base[1];
- else
- return DW_STRING (attr);
- }
- }
- break;
- default:
- break;
- }
- if (!DW_STRING_IS_CANONICAL (attr))
- {
- DW_STRING (attr)
- = dwarf2_canonicalize_name (DW_STRING (attr), cu,
- &cu->objfile->per_bfd->storage_obstack);
- DW_STRING_IS_CANONICAL (attr) = 1;
- }
- return DW_STRING (attr);
- }
- static struct die_info *
- dwarf2_extension (struct die_info *die, struct dwarf2_cu **ext_cu)
- {
- struct attribute *attr;
- attr = dwarf2_attr (die, DW_AT_extension, *ext_cu);
- if (attr == NULL)
- return NULL;
- return follow_die_ref (die, attr, ext_cu);
- }
- static const char *
- dwarf_tag_name (unsigned tag)
- {
- const char *name = get_DW_TAG_name (tag);
- if (name == NULL)
- return "DW_TAG_<unknown>";
- return name;
- }
- static const char *
- dwarf_attr_name (unsigned attr)
- {
- const char *name;
- #ifdef MIPS
- if (attr == DW_AT_MIPS_fde)
- return "DW_AT_MIPS_fde";
- #else
- if (attr == DW_AT_HP_block_index)
- return "DW_AT_HP_block_index";
- #endif
- name = get_DW_AT_name (attr);
- if (name == NULL)
- return "DW_AT_<unknown>";
- return name;
- }
- static const char *
- dwarf_form_name (unsigned form)
- {
- const char *name = get_DW_FORM_name (form);
- if (name == NULL)
- return "DW_FORM_<unknown>";
- return name;
- }
- static char *
- dwarf_bool_name (unsigned mybool)
- {
- if (mybool)
- return "TRUE";
- else
- return "FALSE";
- }
- static const char *
- dwarf_type_encoding_name (unsigned enc)
- {
- const char *name = get_DW_ATE_name (enc);
- if (name == NULL)
- return "DW_ATE_<unknown>";
- return name;
- }
- static void
- dump_die_shallow (struct ui_file *f, int indent, struct die_info *die)
- {
- unsigned int i;
- print_spaces (indent, f);
- fprintf_unfiltered (f, "Die: %s (abbrev %d, offset 0x%x)\n",
- dwarf_tag_name (die->tag), die->abbrev, die->offset.sect_off);
- if (die->parent != NULL)
- {
- print_spaces (indent, f);
- fprintf_unfiltered (f, " parent at offset: 0x%x\n",
- die->parent->offset.sect_off);
- }
- print_spaces (indent, f);
- fprintf_unfiltered (f, " has children: %s\n",
- dwarf_bool_name (die->child != NULL));
- print_spaces (indent, f);
- fprintf_unfiltered (f, " attributes:\n");
- for (i = 0; i < die->num_attrs; ++i)
- {
- print_spaces (indent, f);
- fprintf_unfiltered (f, " %s (%s) ",
- dwarf_attr_name (die->attrs[i].name),
- dwarf_form_name (die->attrs[i].form));
- switch (die->attrs[i].form)
- {
- case DW_FORM_addr:
- case DW_FORM_GNU_addr_index:
- fprintf_unfiltered (f, "address: ");
- fputs_filtered (hex_string (DW_ADDR (&die->attrs[i])), f);
- break;
- case DW_FORM_block2:
- case DW_FORM_block4:
- case DW_FORM_block:
- case DW_FORM_block1:
- fprintf_unfiltered (f, "block: size %s",
- pulongest (DW_BLOCK (&die->attrs[i])->size));
- break;
- case DW_FORM_exprloc:
- fprintf_unfiltered (f, "expression: size %s",
- pulongest (DW_BLOCK (&die->attrs[i])->size));
- break;
- case DW_FORM_ref_addr:
- fprintf_unfiltered (f, "ref address: ");
- fputs_filtered (hex_string (DW_UNSND (&die->attrs[i])), f);
- break;
- case DW_FORM_GNU_ref_alt:
- fprintf_unfiltered (f, "alt ref address: ");
- fputs_filtered (hex_string (DW_UNSND (&die->attrs[i])), f);
- break;
- case DW_FORM_ref1:
- case DW_FORM_ref2:
- case DW_FORM_ref4:
- case DW_FORM_ref8:
- case DW_FORM_ref_udata:
- fprintf_unfiltered (f, "constant ref: 0x%lx (adjusted)",
- (long) (DW_UNSND (&die->attrs[i])));
- break;
- case DW_FORM_data1:
- case DW_FORM_data2:
- case DW_FORM_data4:
- case DW_FORM_data8:
- case DW_FORM_udata:
- case DW_FORM_sdata:
- fprintf_unfiltered (f, "constant: %s",
- pulongest (DW_UNSND (&die->attrs[i])));
- break;
- case DW_FORM_sec_offset:
- fprintf_unfiltered (f, "section offset: %s",
- pulongest (DW_UNSND (&die->attrs[i])));
- break;
- case DW_FORM_ref_sig8:
- fprintf_unfiltered (f, "signature: %s",
- hex_string (DW_SIGNATURE (&die->attrs[i])));
- break;
- case DW_FORM_string:
- case DW_FORM_strp:
- case DW_FORM_GNU_str_index:
- case DW_FORM_GNU_strp_alt:
- fprintf_unfiltered (f, "string: \"%s\" (%s canonicalized)",
- DW_STRING (&die->attrs[i])
- ? DW_STRING (&die->attrs[i]) : "",
- DW_STRING_IS_CANONICAL (&die->attrs[i]) ? "is" : "not");
- break;
- case DW_FORM_flag:
- if (DW_UNSND (&die->attrs[i]))
- fprintf_unfiltered (f, "flag: TRUE");
- else
- fprintf_unfiltered (f, "flag: FALSE");
- break;
- case DW_FORM_flag_present:
- fprintf_unfiltered (f, "flag: TRUE");
- break;
- case DW_FORM_indirect:
-
- fprintf_unfiltered (f,
- "unexpected attribute form: DW_FORM_indirect");
- break;
- default:
- fprintf_unfiltered (f, "unsupported attribute form: %d.",
- die->attrs[i].form);
- break;
- }
- fprintf_unfiltered (f, "\n");
- }
- }
- static void
- dump_die_for_error (struct die_info *die)
- {
- dump_die_shallow (gdb_stderr, 0, die);
- }
- static void
- dump_die_1 (struct ui_file *f, int level, int max_level, struct die_info *die)
- {
- int indent = level * 4;
- gdb_assert (die != NULL);
- if (level >= max_level)
- return;
- dump_die_shallow (f, indent, die);
- if (die->child != NULL)
- {
- print_spaces (indent, f);
- fprintf_unfiltered (f, " Children:");
- if (level + 1 < max_level)
- {
- fprintf_unfiltered (f, "\n");
- dump_die_1 (f, level + 1, max_level, die->child);
- }
- else
- {
- fprintf_unfiltered (f,
- " [not printed, max nesting level reached]\n");
- }
- }
- if (die->sibling != NULL && level > 0)
- {
- dump_die_1 (f, level, max_level, die->sibling);
- }
- }
- void
- dump_die (struct die_info *die, int max_level)
- {
- dump_die_1 (gdb_stdlog, 0, max_level, die);
- }
- static void
- store_in_ref_table (struct die_info *die, struct dwarf2_cu *cu)
- {
- void **slot;
- slot = htab_find_slot_with_hash (cu->die_hash, die, die->offset.sect_off,
- INSERT);
- *slot = die;
- }
- static sect_offset
- dwarf2_get_ref_die_offset (const struct attribute *attr)
- {
- sect_offset retval = { DW_UNSND (attr) };
- if (attr_form_is_ref (attr))
- return retval;
- retval.sect_off = 0;
- complaint (&symfile_complaints,
- _("unsupported die ref attribute form: '%s'"),
- dwarf_form_name (attr->form));
- return retval;
- }
- static LONGEST
- dwarf2_get_attr_constant_value (const struct attribute *attr, int default_value)
- {
- if (attr->form == DW_FORM_sdata)
- return DW_SND (attr);
- else if (attr->form == DW_FORM_udata
- || attr->form == DW_FORM_data1
- || attr->form == DW_FORM_data2
- || attr->form == DW_FORM_data4
- || attr->form == DW_FORM_data8)
- return DW_UNSND (attr);
- else
- {
- complaint (&symfile_complaints,
- _("Attribute value is not a constant (%s)"),
- dwarf_form_name (attr->form));
- return default_value;
- }
- }
- static struct die_info *
- follow_die_ref_or_sig (struct die_info *src_die, const struct attribute *attr,
- struct dwarf2_cu **ref_cu)
- {
- struct die_info *die;
- if (attr_form_is_ref (attr))
- die = follow_die_ref (src_die, attr, ref_cu);
- else if (attr->form == DW_FORM_ref_sig8)
- die = follow_die_sig (src_die, attr, ref_cu);
- else
- {
- dump_die_for_error (src_die);
- error (_("Dwarf Error: Expected reference attribute [in module %s]"),
- objfile_name ((*ref_cu)->objfile));
- }
- return die;
- }
- static struct die_info *
- follow_die_offset (sect_offset offset, int offset_in_dwz,
- struct dwarf2_cu **ref_cu)
- {
- struct die_info temp_die;
- struct dwarf2_cu *target_cu, *cu = *ref_cu;
- gdb_assert (cu->per_cu != NULL);
- target_cu = cu;
- if (cu->per_cu->is_debug_types)
- {
-
- if (! offset_in_cu_p (&cu->header, offset))
- return NULL;
- }
- else if (offset_in_dwz != cu->per_cu->is_dwz
- || ! offset_in_cu_p (&cu->header, offset))
- {
- struct dwarf2_per_cu_data *per_cu;
- per_cu = dwarf2_find_containing_comp_unit (offset, offset_in_dwz,
- cu->objfile);
-
- if (maybe_queue_comp_unit (cu, per_cu, cu->language))
- load_full_comp_unit (per_cu, cu->language);
- target_cu = per_cu->cu;
- }
- else if (cu->dies == NULL)
- {
-
- gdb_assert (dwarf2_per_objfile->reading_partial_symbols);
- load_full_comp_unit (cu->per_cu, language_minimal);
- }
- *ref_cu = target_cu;
- temp_die.offset = offset;
- return htab_find_with_hash (target_cu->die_hash, &temp_die, offset.sect_off);
- }
- static struct die_info *
- follow_die_ref (struct die_info *src_die, const struct attribute *attr,
- struct dwarf2_cu **ref_cu)
- {
- sect_offset offset = dwarf2_get_ref_die_offset (attr);
- struct dwarf2_cu *cu = *ref_cu;
- struct die_info *die;
- die = follow_die_offset (offset,
- (attr->form == DW_FORM_GNU_ref_alt
- || cu->per_cu->is_dwz),
- ref_cu);
- if (!die)
- error (_("Dwarf Error: Cannot find DIE at 0x%x referenced from DIE "
- "at 0x%x [in module %s]"),
- offset.sect_off, src_die->offset.sect_off,
- objfile_name (cu->objfile));
- return die;
- }
- struct dwarf2_locexpr_baton
- dwarf2_fetch_die_loc_sect_off (sect_offset offset,
- struct dwarf2_per_cu_data *per_cu,
- CORE_ADDR (*get_frame_pc) (void *baton),
- void *baton)
- {
- struct dwarf2_cu *cu;
- struct die_info *die;
- struct attribute *attr;
- struct dwarf2_locexpr_baton retval;
- dw2_setup (per_cu->objfile);
- if (per_cu->cu == NULL)
- load_cu (per_cu);
- cu = per_cu->cu;
- die = follow_die_offset (offset, per_cu->is_dwz, &cu);
- if (!die)
- error (_("Dwarf Error: Cannot find DIE at 0x%x referenced in module %s"),
- offset.sect_off, objfile_name (per_cu->objfile));
- attr = dwarf2_attr (die, DW_AT_location, cu);
- if (!attr)
- {
-
- retval.data = NULL;
- retval.size = 0;
- }
- else if (attr_form_is_section_offset (attr))
- {
- struct dwarf2_loclist_baton loclist_baton;
- CORE_ADDR pc = (*get_frame_pc) (baton);
- size_t size;
- fill_in_loclist_baton (cu, &loclist_baton, attr);
- retval.data = dwarf2_find_location_expression (&loclist_baton,
- &size, pc);
- retval.size = size;
- }
- else
- {
- if (!attr_form_is_block (attr))
- error (_("Dwarf Error: DIE at 0x%x referenced in module %s "
- "is neither DW_FORM_block* nor DW_FORM_exprloc"),
- offset.sect_off, objfile_name (per_cu->objfile));
- retval.data = DW_BLOCK (attr)->data;
- retval.size = DW_BLOCK (attr)->size;
- }
- retval.per_cu = cu->per_cu;
- age_cached_comp_units ();
- return retval;
- }
- struct dwarf2_locexpr_baton
- dwarf2_fetch_die_loc_cu_off (cu_offset offset_in_cu,
- struct dwarf2_per_cu_data *per_cu,
- CORE_ADDR (*get_frame_pc) (void *baton),
- void *baton)
- {
- sect_offset offset = { per_cu->offset.sect_off + offset_in_cu.cu_off };
- return dwarf2_fetch_die_loc_sect_off (offset, per_cu, get_frame_pc, baton);
- }
- static const gdb_byte *
- write_constant_as_bytes (struct obstack *obstack,
- enum bfd_endian byte_order,
- struct type *type,
- ULONGEST value,
- LONGEST *len)
- {
- gdb_byte *result;
- *len = TYPE_LENGTH (type);
- result = obstack_alloc (obstack, *len);
- store_unsigned_integer (result, *len, byte_order, value);
- return result;
- }
- const gdb_byte *
- dwarf2_fetch_constant_bytes (sect_offset offset,
- struct dwarf2_per_cu_data *per_cu,
- struct obstack *obstack,
- LONGEST *len)
- {
- struct dwarf2_cu *cu;
- struct die_info *die;
- struct attribute *attr;
- const gdb_byte *result = NULL;
- struct type *type;
- LONGEST value;
- enum bfd_endian byte_order;
- dw2_setup (per_cu->objfile);
- if (per_cu->cu == NULL)
- load_cu (per_cu);
- cu = per_cu->cu;
- die = follow_die_offset (offset, per_cu->is_dwz, &cu);
- if (!die)
- error (_("Dwarf Error: Cannot find DIE at 0x%x referenced in module %s"),
- offset.sect_off, objfile_name (per_cu->objfile));
- attr = dwarf2_attr (die, DW_AT_const_value, cu);
- if (attr == NULL)
- return NULL;
- byte_order = (bfd_big_endian (per_cu->objfile->obfd)
- ? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE);
- switch (attr->form)
- {
- case DW_FORM_addr:
- case DW_FORM_GNU_addr_index:
- {
- gdb_byte *tem;
- *len = cu->header.addr_size;
- tem = obstack_alloc (obstack, *len);
- store_unsigned_integer (tem, *len, byte_order, DW_ADDR (attr));
- result = tem;
- }
- break;
- case DW_FORM_string:
- case DW_FORM_strp:
- case DW_FORM_GNU_str_index:
- case DW_FORM_GNU_strp_alt:
-
- result = (const gdb_byte *) DW_STRING (attr);
- *len = strlen (DW_STRING (attr));
- break;
- case DW_FORM_block1:
- case DW_FORM_block2:
- case DW_FORM_block4:
- case DW_FORM_block:
- case DW_FORM_exprloc:
- result = DW_BLOCK (attr)->data;
- *len = DW_BLOCK (attr)->size;
- break;
-
- case DW_FORM_data1:
- type = die_type (die, cu);
- result = dwarf2_const_value_data (attr, obstack, cu, &value, 8);
- if (result == NULL)
- result = write_constant_as_bytes (obstack, byte_order,
- type, value, len);
- break;
- case DW_FORM_data2:
- type = die_type (die, cu);
- result = dwarf2_const_value_data (attr, obstack, cu, &value, 16);
- if (result == NULL)
- result = write_constant_as_bytes (obstack, byte_order,
- type, value, len);
- break;
- case DW_FORM_data4:
- type = die_type (die, cu);
- result = dwarf2_const_value_data (attr, obstack, cu, &value, 32);
- if (result == NULL)
- result = write_constant_as_bytes (obstack, byte_order,
- type, value, len);
- break;
- case DW_FORM_data8:
- type = die_type (die, cu);
- result = dwarf2_const_value_data (attr, obstack, cu, &value, 64);
- if (result == NULL)
- result = write_constant_as_bytes (obstack, byte_order,
- type, value, len);
- break;
- case DW_FORM_sdata:
- type = die_type (die, cu);
- result = write_constant_as_bytes (obstack, byte_order,
- type, DW_SND (attr), len);
- break;
- case DW_FORM_udata:
- type = die_type (die, cu);
- result = write_constant_as_bytes (obstack, byte_order,
- type, DW_UNSND (attr), len);
- break;
- default:
- complaint (&symfile_complaints,
- _("unsupported const value attribute form: '%s'"),
- dwarf_form_name (attr->form));
- break;
- }
- return result;
- }
- struct type *
- dwarf2_get_die_type (cu_offset die_offset,
- struct dwarf2_per_cu_data *per_cu)
- {
- sect_offset die_offset_sect;
- dw2_setup (per_cu->objfile);
- die_offset_sect.sect_off = per_cu->offset.sect_off + die_offset.cu_off;
- return get_die_type_at_offset (die_offset_sect, per_cu);
- }
- static struct die_info *
- follow_die_sig_1 (struct die_info *src_die, struct signatured_type *sig_type,
- struct dwarf2_cu **ref_cu)
- {
- struct objfile *objfile = (*ref_cu)->objfile;
- struct die_info temp_die;
- struct dwarf2_cu *sig_cu;
- struct die_info *die;
-
-
- if (maybe_queue_comp_unit (*ref_cu, &sig_type->per_cu, language_minimal))
- read_signatured_type (sig_type);
- sig_cu = sig_type->per_cu.cu;
- gdb_assert (sig_cu != NULL);
- gdb_assert (sig_type->type_offset_in_section.sect_off != 0);
- temp_die.offset = sig_type->type_offset_in_section;
- die = htab_find_with_hash (sig_cu->die_hash, &temp_die,
- temp_die.offset.sect_off);
- if (die)
- {
-
- if (dwarf2_per_objfile->index_table != NULL
- && dwarf2_per_objfile->index_table->version <= 7)
- {
- VEC_safe_push (dwarf2_per_cu_ptr,
- (*ref_cu)->per_cu->imported_symtabs,
- sig_cu->per_cu);
- }
- *ref_cu = sig_cu;
- return die;
- }
- return NULL;
- }
- static struct die_info *
- follow_die_sig (struct die_info *src_die, const struct attribute *attr,
- struct dwarf2_cu **ref_cu)
- {
- ULONGEST signature = DW_SIGNATURE (attr);
- struct signatured_type *sig_type;
- struct die_info *die;
- gdb_assert (attr->form == DW_FORM_ref_sig8);
- sig_type = lookup_signatured_type (*ref_cu, signature);
-
- if (sig_type == NULL)
- {
- error (_("Dwarf Error: Cannot find signatured DIE %s referenced"
- " from DIE at 0x%x [in module %s]"),
- hex_string (signature), src_die->offset.sect_off,
- objfile_name ((*ref_cu)->objfile));
- }
- die = follow_die_sig_1 (src_die, sig_type, ref_cu);
- if (die == NULL)
- {
- dump_die_for_error (src_die);
- error (_("Dwarf Error: Problem reading signatured DIE %s referenced"
- " from DIE at 0x%x [in module %s]"),
- hex_string (signature), src_die->offset.sect_off,
- objfile_name ((*ref_cu)->objfile));
- }
- return die;
- }
- static struct type *
- get_signatured_type (struct die_info *die, ULONGEST signature,
- struct dwarf2_cu *cu)
- {
- struct signatured_type *sig_type;
- struct dwarf2_cu *type_cu;
- struct die_info *type_die;
- struct type *type;
- sig_type = lookup_signatured_type (cu, signature);
-
- if (sig_type == NULL)
- {
- complaint (&symfile_complaints,
- _("Dwarf Error: Cannot find signatured DIE %s referenced"
- " from DIE at 0x%x [in module %s]"),
- hex_string (signature), die->offset.sect_off,
- objfile_name (dwarf2_per_objfile->objfile));
- return build_error_marker_type (cu, die);
- }
-
- if (sig_type->type != NULL)
- return sig_type->type;
- type_cu = cu;
- type_die = follow_die_sig_1 (die, sig_type, &type_cu);
- if (type_die != NULL)
- {
-
- type = read_type_die (type_die, type_cu);
- if (type == NULL)
- {
- complaint (&symfile_complaints,
- _("Dwarf Error: Cannot build signatured type %s"
- " referenced from DIE at 0x%x [in module %s]"),
- hex_string (signature), die->offset.sect_off,
- objfile_name (dwarf2_per_objfile->objfile));
- type = build_error_marker_type (cu, die);
- }
- }
- else
- {
- complaint (&symfile_complaints,
- _("Dwarf Error: Problem reading signatured DIE %s referenced"
- " from DIE at 0x%x [in module %s]"),
- hex_string (signature), die->offset.sect_off,
- objfile_name (dwarf2_per_objfile->objfile));
- type = build_error_marker_type (cu, die);
- }
- sig_type->type = type;
- return type;
- }
- static struct type *
- get_DW_AT_signature_type (struct die_info *die, const struct attribute *attr,
- struct dwarf2_cu *cu)
- {
-
- if (attr_form_is_ref (attr))
- {
- struct dwarf2_cu *type_cu = cu;
- struct die_info *type_die = follow_die_ref (die, attr, &type_cu);
- return read_type_die (type_die, type_cu);
- }
- else if (attr->form == DW_FORM_ref_sig8)
- {
- return get_signatured_type (die, DW_SIGNATURE (attr), cu);
- }
- else
- {
- complaint (&symfile_complaints,
- _("Dwarf Error: DW_AT_signature has bad form %s in DIE"
- " at 0x%x [in module %s]"),
- dwarf_form_name (attr->form), die->offset.sect_off,
- objfile_name (dwarf2_per_objfile->objfile));
- return build_error_marker_type (cu, die);
- }
- }
- static void
- load_full_type_unit (struct dwarf2_per_cu_data *per_cu)
- {
- struct signatured_type *sig_type;
-
- gdb_assert (! IS_TYPE_UNIT_GROUP (per_cu));
-
- gdb_assert (per_cu->is_debug_types);
- sig_type = (struct signatured_type *) per_cu;
- gdb_assert (per_cu->cu == NULL);
- read_signatured_type (sig_type);
- gdb_assert (per_cu->cu != NULL);
- }
- static void
- read_signatured_type_reader (const struct die_reader_specs *reader,
- const gdb_byte *info_ptr,
- struct die_info *comp_unit_die,
- int has_children,
- void *data)
- {
- struct dwarf2_cu *cu = reader->cu;
- gdb_assert (cu->die_hash == NULL);
- cu->die_hash =
- htab_create_alloc_ex (cu->header.length / 12,
- die_hash,
- die_eq,
- NULL,
- &cu->comp_unit_obstack,
- hashtab_obstack_allocate,
- dummy_obstack_deallocate);
- if (has_children)
- comp_unit_die->child = read_die_and_siblings (reader, info_ptr,
- &info_ptr, comp_unit_die);
- cu->dies = comp_unit_die;
-
-
- prepare_one_comp_unit (cu, cu->dies, language_minimal);
- }
- static void
- read_signatured_type (struct signatured_type *sig_type)
- {
- struct dwarf2_per_cu_data *per_cu = &sig_type->per_cu;
- gdb_assert (per_cu->is_debug_types);
- gdb_assert (per_cu->cu == NULL);
- init_cutu_and_read_dies (per_cu, NULL, 0, 1,
- read_signatured_type_reader, NULL);
- sig_type->per_cu.tu_read = 1;
- }
- FIXME
- static CORE_ADDR
- decode_locdesc (struct dwarf_block *blk, struct dwarf2_cu *cu)
- {
- struct objfile *objfile = cu->objfile;
- size_t i;
- size_t size = blk->size;
- const gdb_byte *data = blk->data;
- CORE_ADDR stack[64];
- int stacki;
- unsigned int bytes_read, unsnd;
- gdb_byte op;
- i = 0;
- stacki = 0;
- stack[stacki] = 0;
- stack[++stacki] = 0;
- while (i < size)
- {
- op = data[i++];
- switch (op)
- {
- case DW_OP_lit0:
- case DW_OP_lit1:
- case DW_OP_lit2:
- case DW_OP_lit3:
- case DW_OP_lit4:
- case DW_OP_lit5:
- case DW_OP_lit6:
- case DW_OP_lit7:
- case DW_OP_lit8:
- case DW_OP_lit9:
- case DW_OP_lit10:
- case DW_OP_lit11:
- case DW_OP_lit12:
- case DW_OP_lit13:
- case DW_OP_lit14:
- case DW_OP_lit15:
- case DW_OP_lit16:
- case DW_OP_lit17:
- case DW_OP_lit18:
- case DW_OP_lit19:
- case DW_OP_lit20:
- case DW_OP_lit21:
- case DW_OP_lit22:
- case DW_OP_lit23:
- case DW_OP_lit24:
- case DW_OP_lit25:
- case DW_OP_lit26:
- case DW_OP_lit27:
- case DW_OP_lit28:
- case DW_OP_lit29:
- case DW_OP_lit30:
- case DW_OP_lit31:
- stack[++stacki] = op - DW_OP_lit0;
- break;
- case DW_OP_reg0:
- case DW_OP_reg1:
- case DW_OP_reg2:
- case DW_OP_reg3:
- case DW_OP_reg4:
- case DW_OP_reg5:
- case DW_OP_reg6:
- case DW_OP_reg7:
- case DW_OP_reg8:
- case DW_OP_reg9:
- case DW_OP_reg10:
- case DW_OP_reg11:
- case DW_OP_reg12:
- case DW_OP_reg13:
- case DW_OP_reg14:
- case DW_OP_reg15:
- case DW_OP_reg16:
- case DW_OP_reg17:
- case DW_OP_reg18:
- case DW_OP_reg19:
- case DW_OP_reg20:
- case DW_OP_reg21:
- case DW_OP_reg22:
- case DW_OP_reg23:
- case DW_OP_reg24:
- case DW_OP_reg25:
- case DW_OP_reg26:
- case DW_OP_reg27:
- case DW_OP_reg28:
- case DW_OP_reg29:
- case DW_OP_reg30:
- case DW_OP_reg31:
- stack[++stacki] = op - DW_OP_reg0;
- if (i < size)
- dwarf2_complex_location_expr_complaint ();
- break;
- case DW_OP_regx:
- unsnd = read_unsigned_leb128 (NULL, (data + i), &bytes_read);
- i += bytes_read;
- stack[++stacki] = unsnd;
- if (i < size)
- dwarf2_complex_location_expr_complaint ();
- break;
- case DW_OP_addr:
- stack[++stacki] = read_address (objfile->obfd, &data[i],
- cu, &bytes_read);
- i += bytes_read;
- break;
- case DW_OP_const1u:
- stack[++stacki] = read_1_byte (objfile->obfd, &data[i]);
- i += 1;
- break;
- case DW_OP_const1s:
- stack[++stacki] = read_1_signed_byte (objfile->obfd, &data[i]);
- i += 1;
- break;
- case DW_OP_const2u:
- stack[++stacki] = read_2_bytes (objfile->obfd, &data[i]);
- i += 2;
- break;
- case DW_OP_const2s:
- stack[++stacki] = read_2_signed_bytes (objfile->obfd, &data[i]);
- i += 2;
- break;
- case DW_OP_const4u:
- stack[++stacki] = read_4_bytes (objfile->obfd, &data[i]);
- i += 4;
- break;
- case DW_OP_const4s:
- stack[++stacki] = read_4_signed_bytes (objfile->obfd, &data[i]);
- i += 4;
- break;
- case DW_OP_const8u:
- stack[++stacki] = read_8_bytes (objfile->obfd, &data[i]);
- i += 8;
- break;
- case DW_OP_constu:
- stack[++stacki] = read_unsigned_leb128 (NULL, (data + i),
- &bytes_read);
- i += bytes_read;
- break;
- case DW_OP_consts:
- stack[++stacki] = read_signed_leb128 (NULL, (data + i), &bytes_read);
- i += bytes_read;
- break;
- case DW_OP_dup:
- stack[stacki + 1] = stack[stacki];
- stacki++;
- break;
- case DW_OP_plus:
- stack[stacki - 1] += stack[stacki];
- stacki--;
- break;
- case DW_OP_plus_uconst:
- stack[stacki] += read_unsigned_leb128 (NULL, (data + i),
- &bytes_read);
- i += bytes_read;
- break;
- case DW_OP_minus:
- stack[stacki - 1] -= stack[stacki];
- stacki--;
- break;
- case DW_OP_deref:
-
- if (i < size)
- dwarf2_complex_location_expr_complaint ();
- break;
- case DW_OP_GNU_push_tls_address:
-
-
-
- if (i < size)
- dwarf2_complex_location_expr_complaint ();
- stack[stacki]++;
- break;
- case DW_OP_GNU_uninit:
- break;
- case DW_OP_GNU_addr_index:
- case DW_OP_GNU_const_index:
- stack[++stacki] = read_addr_index_from_leb128 (cu, &data[i],
- &bytes_read);
- i += bytes_read;
- break;
- default:
- {
- const char *name = get_DW_OP_name (op);
- if (name)
- complaint (&symfile_complaints, _("unsupported stack op: '%s'"),
- name);
- else
- complaint (&symfile_complaints, _("unsupported stack op: '%02x'"),
- op);
- }
- return (stack[stacki]);
- }
-
- if (stacki >= ARRAY_SIZE (stack) - 1)
- {
- complaint (&symfile_complaints,
- _("location description stack overflow"));
- return 0;
- }
- if (stacki <= 0)
- {
- complaint (&symfile_complaints,
- _("location description stack underflow"));
- return 0;
- }
- }
- return (stack[stacki]);
- }
- static struct dwarf_block *
- dwarf_alloc_block (struct dwarf2_cu *cu)
- {
- struct dwarf_block *blk;
- blk = (struct dwarf_block *)
- obstack_alloc (&cu->comp_unit_obstack, sizeof (struct dwarf_block));
- return (blk);
- }
- static struct die_info *
- dwarf_alloc_die (struct dwarf2_cu *cu, int num_attrs)
- {
- struct die_info *die;
- size_t size = sizeof (struct die_info);
- if (num_attrs > 1)
- size += (num_attrs - 1) * sizeof (struct attribute);
- die = (struct die_info *) obstack_alloc (&cu->comp_unit_obstack, size);
- memset (die, 0, sizeof (struct die_info));
- return (die);
- }
- static char *
- file_file_name (int file, struct line_header *lh)
- {
-
- if (1 <= file && file <= lh->num_file_names)
- {
- struct file_entry *fe = &lh->file_names[file - 1];
- if (IS_ABSOLUTE_PATH (fe->name) || fe->dir_index == 0)
- return xstrdup (fe->name);
- return concat (lh->include_dirs[fe->dir_index - 1], SLASH_STRING,
- fe->name, NULL);
- }
- else
- {
-
- char fake_name[80];
- xsnprintf (fake_name, sizeof (fake_name),
- "<bad macro file number %d>", file);
- complaint (&symfile_complaints,
- _("bad file number in macro information (%d)"),
- file);
- return xstrdup (fake_name);
- }
- }
- static char *
- file_full_name (int file, struct line_header *lh, const char *comp_dir)
- {
-
- if (1 <= file && file <= lh->num_file_names)
- {
- char *relative = file_file_name (file, lh);
- if (IS_ABSOLUTE_PATH (relative) || comp_dir == NULL)
- return relative;
- return reconcat (relative, comp_dir, SLASH_STRING, relative, NULL);
- }
- else
- return file_file_name (file, lh);
- }
- static struct macro_source_file *
- macro_start_file (int file, int line,
- struct macro_source_file *current_file,
- struct line_header *lh)
- {
-
- char *file_name = file_file_name (file, lh);
- if (! current_file)
- {
-
- struct macro_table *macro_table = get_macro_table ();
-
- current_file = macro_set_main (macro_table, file_name);
- macro_define_special (macro_table);
- }
- else
- current_file = macro_include (current_file, line, file_name);
- xfree (file_name);
- return current_file;
- }
- static char *
- copy_string (const char *buf, int len)
- {
- char *s = xmalloc (len + 1);
- memcpy (s, buf, len);
- s[len] = '\0';
- return s;
- }
- static const char *
- consume_improper_spaces (const char *p, const char *body)
- {
- if (*p == ' ')
- {
- complaint (&symfile_complaints,
- _("macro definition contains spaces "
- "in formal argument list:\n`%s'"),
- body);
- while (*p == ' ')
- p++;
- }
- return p;
- }
- static void
- parse_macro_definition (struct macro_source_file *file, int line,
- const char *body)
- {
- const char *p;
-
-
- for (p = body; *p; p++)
- if (*p == ' ' || *p == '(')
- break;
- if (*p == ' ' || *p == '\0')
- {
-
- int name_len = p - body;
- char *name = copy_string (body, name_len);
- const char *replacement;
- if (*p == ' ')
- replacement = body + name_len + 1;
- else
- {
- dwarf2_macro_malformed_definition_complaint (body);
- replacement = body + name_len;
- }
- macro_define_object (file, line, name, replacement);
- xfree (name);
- }
- else if (*p == '(')
- {
-
- char *name = copy_string (body, p - body);
- int argc = 0;
- int argv_size = 1;
- char **argv = xmalloc (argv_size * sizeof (*argv));
- p++;
- p = consume_improper_spaces (p, body);
-
- while (*p && *p != ')')
- {
-
- const char *arg_start = p;
- while (*p && *p != ',' && *p != ')' && *p != ' ')
- p++;
- if (! *p || p == arg_start)
- dwarf2_macro_malformed_definition_complaint (body);
- else
- {
-
- if (argc >= argv_size)
- {
- argv_size *= 2;
- argv = xrealloc (argv, argv_size * sizeof (*argv));
- }
- argv[argc++] = copy_string (arg_start, p - arg_start);
- }
- p = consume_improper_spaces (p, body);
-
- if (*p == ',')
- {
- p++;
- p = consume_improper_spaces (p, body);
- }
- }
- if (*p == ')')
- {
- p++;
- if (*p == ' ')
-
- macro_define_function (file, line, name,
- argc, (const char **) argv,
- p + 1);
- else if (*p == '\0')
- {
-
- dwarf2_macro_malformed_definition_complaint (body);
- macro_define_function (file, line, name,
- argc, (const char **) argv,
- p);
- }
- else
-
- dwarf2_macro_malformed_definition_complaint (body);
- }
- else
-
- dwarf2_macro_malformed_definition_complaint (body);
- xfree (name);
- {
- int i;
- for (i = 0; i < argc; i++)
- xfree (argv[i]);
- }
- xfree (argv);
- }
- else
- dwarf2_macro_malformed_definition_complaint (body);
- }
- static const gdb_byte *
- skip_form_bytes (bfd *abfd, const gdb_byte *bytes, const gdb_byte *buffer_end,
- enum dwarf_form form,
- unsigned int offset_size,
- struct dwarf2_section_info *section)
- {
- unsigned int bytes_read;
- switch (form)
- {
- case DW_FORM_data1:
- case DW_FORM_flag:
- ++bytes;
- break;
- case DW_FORM_data2:
- bytes += 2;
- break;
- case DW_FORM_data4:
- bytes += 4;
- break;
- case DW_FORM_data8:
- bytes += 8;
- break;
- case DW_FORM_string:
- read_direct_string (abfd, bytes, &bytes_read);
- bytes += bytes_read;
- break;
- case DW_FORM_sec_offset:
- case DW_FORM_strp:
- case DW_FORM_GNU_strp_alt:
- bytes += offset_size;
- break;
- case DW_FORM_block:
- bytes += read_unsigned_leb128 (abfd, bytes, &bytes_read);
- bytes += bytes_read;
- break;
- case DW_FORM_block1:
- bytes += 1 + read_1_byte (abfd, bytes);
- break;
- case DW_FORM_block2:
- bytes += 2 + read_2_bytes (abfd, bytes);
- break;
- case DW_FORM_block4:
- bytes += 4 + read_4_bytes (abfd, bytes);
- break;
- case DW_FORM_sdata:
- case DW_FORM_udata:
- case DW_FORM_GNU_addr_index:
- case DW_FORM_GNU_str_index:
- bytes = gdb_skip_leb128 (bytes, buffer_end);
- if (bytes == NULL)
- {
- dwarf2_section_buffer_overflow_complaint (section);
- return NULL;
- }
- break;
- default:
- {
- complain:
- complaint (&symfile_complaints,
- _("invalid form 0x%x in `%s'"),
- form, get_section_name (section));
- return NULL;
- }
- }
- return bytes;
- }
- static const gdb_byte *
- skip_unknown_opcode (unsigned int opcode,
- const gdb_byte **opcode_definitions,
- const gdb_byte *mac_ptr, const gdb_byte *mac_end,
- bfd *abfd,
- unsigned int offset_size,
- struct dwarf2_section_info *section)
- {
- unsigned int bytes_read, i;
- unsigned long arg;
- const gdb_byte *defn;
- if (opcode_definitions[opcode] == NULL)
- {
- complaint (&symfile_complaints,
- _("unrecognized DW_MACFINO opcode 0x%x"),
- opcode);
- return NULL;
- }
- defn = opcode_definitions[opcode];
- arg = read_unsigned_leb128 (abfd, defn, &bytes_read);
- defn += bytes_read;
- for (i = 0; i < arg; ++i)
- {
- mac_ptr = skip_form_bytes (abfd, mac_ptr, mac_end, defn[i], offset_size,
- section);
- if (mac_ptr == NULL)
- {
-
- return NULL;
- }
- }
- return mac_ptr;
- }
- static const gdb_byte *
- dwarf_parse_macro_header (const gdb_byte **opcode_definitions,
- bfd *abfd,
- const gdb_byte *mac_ptr,
- unsigned int *offset_size,
- int section_is_gnu)
- {
- memset (opcode_definitions, 0, 256 * sizeof (gdb_byte *));
- if (section_is_gnu)
- {
- unsigned int version, flags;
- version = read_2_bytes (abfd, mac_ptr);
- if (version != 4)
- {
- complaint (&symfile_complaints,
- _("unrecognized version `%d' in .debug_macro section"),
- version);
- return NULL;
- }
- mac_ptr += 2;
- flags = read_1_byte (abfd, mac_ptr);
- ++mac_ptr;
- *offset_size = (flags & 1) ? 8 : 4;
- if ((flags & 2) != 0)
-
- mac_ptr += *offset_size;
-
- if ((flags & 4) != 0)
- {
- unsigned int i, count;
- count = read_1_byte (abfd, mac_ptr);
- ++mac_ptr;
- for (i = 0; i < count; ++i)
- {
- unsigned int opcode, bytes_read;
- unsigned long arg;
- opcode = read_1_byte (abfd, mac_ptr);
- ++mac_ptr;
- opcode_definitions[opcode] = mac_ptr;
- arg = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
- mac_ptr += arg;
- }
- }
- }
- return mac_ptr;
- }
- static void
- dwarf_decode_macro_bytes (bfd *abfd,
- const gdb_byte *mac_ptr, const gdb_byte *mac_end,
- struct macro_source_file *current_file,
- struct line_header *lh,
- struct dwarf2_section_info *section,
- int section_is_gnu, int section_is_dwz,
- unsigned int offset_size,
- htab_t include_hash)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- enum dwarf_macro_record_type macinfo_type;
- int at_commandline;
- const gdb_byte *opcode_definitions[256];
- mac_ptr = dwarf_parse_macro_header (opcode_definitions, abfd, mac_ptr,
- &offset_size, section_is_gnu);
- if (mac_ptr == NULL)
- {
-
- return;
- }
-
- at_commandline = 1;
- do
- {
-
- if (mac_ptr >= mac_end)
- {
- dwarf2_section_buffer_overflow_complaint (section);
- break;
- }
- macinfo_type = read_1_byte (abfd, mac_ptr);
- mac_ptr++;
-
- switch (macinfo_type)
- {
-
- case 0:
- break;
- case DW_MACRO_GNU_define:
- case DW_MACRO_GNU_undef:
- case DW_MACRO_GNU_define_indirect:
- case DW_MACRO_GNU_undef_indirect:
- case DW_MACRO_GNU_define_indirect_alt:
- case DW_MACRO_GNU_undef_indirect_alt:
- {
- unsigned int bytes_read;
- int line;
- const char *body;
- int is_define;
- line = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
- if (macinfo_type == DW_MACRO_GNU_define
- || macinfo_type == DW_MACRO_GNU_undef)
- {
- body = read_direct_string (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
- }
- else
- {
- LONGEST str_offset;
- str_offset = read_offset_1 (abfd, mac_ptr, offset_size);
- mac_ptr += offset_size;
- if (macinfo_type == DW_MACRO_GNU_define_indirect_alt
- || macinfo_type == DW_MACRO_GNU_undef_indirect_alt
- || section_is_dwz)
- {
- struct dwz_file *dwz = dwarf2_get_dwz_file ();
- body = read_indirect_string_from_dwz (dwz, str_offset);
- }
- else
- body = read_indirect_string_at_offset (abfd, str_offset);
- }
- is_define = (macinfo_type == DW_MACRO_GNU_define
- || macinfo_type == DW_MACRO_GNU_define_indirect
- || macinfo_type == DW_MACRO_GNU_define_indirect_alt);
- if (! current_file)
- {
-
- complaint (&symfile_complaints,
- _("debug info with no main source gives macro %s "
- "on line %d: %s"),
- is_define ? _("definition") : _("undefinition"),
- line, body);
- break;
- }
- if ((line == 0 && !at_commandline)
- || (line != 0 && at_commandline))
- complaint (&symfile_complaints,
- _("debug info gives %s macro %s with %s line %d: %s"),
- at_commandline ? _("command-line") : _("in-file"),
- is_define ? _("definition") : _("undefinition"),
- line == 0 ? _("zero") : _("non-zero"), line, body);
- if (is_define)
- parse_macro_definition (current_file, line, body);
- else
- {
- gdb_assert (macinfo_type == DW_MACRO_GNU_undef
- || macinfo_type == DW_MACRO_GNU_undef_indirect
- || macinfo_type == DW_MACRO_GNU_undef_indirect_alt);
- macro_undef (current_file, line, body);
- }
- }
- break;
- case DW_MACRO_GNU_start_file:
- {
- unsigned int bytes_read;
- int line, file;
- line = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
- file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
- if ((line == 0 && !at_commandline)
- || (line != 0 && at_commandline))
- complaint (&symfile_complaints,
- _("debug info gives source %d included "
- "from %s at %s line %d"),
- file, at_commandline ? _("command-line") : _("file"),
- line == 0 ? _("zero") : _("non-zero"), line);
- if (at_commandline)
- {
-
- at_commandline = 0;
- }
- else
- current_file = macro_start_file (file, line, current_file, lh);
- }
- break;
- case DW_MACRO_GNU_end_file:
- if (! current_file)
- complaint (&symfile_complaints,
- _("macro debug info has an unmatched "
- "`close_file' directive"));
- else
- {
- current_file = current_file->included_by;
- if (! current_file)
- {
- enum dwarf_macro_record_type next_type;
-
-
- if (mac_ptr >= mac_end)
- {
- dwarf2_section_buffer_overflow_complaint (section);
- return;
- }
-
- next_type = read_1_byte (abfd, mac_ptr);
- if (next_type != 0)
- complaint (&symfile_complaints,
- _("no terminating 0-type entry for "
- "macros in `.debug_macinfo' section"));
- return;
- }
- }
- break;
- case DW_MACRO_GNU_transparent_include:
- case DW_MACRO_GNU_transparent_include_alt:
- {
- LONGEST offset;
- void **slot;
- bfd *include_bfd = abfd;
- struct dwarf2_section_info *include_section = section;
- struct dwarf2_section_info alt_section;
- const gdb_byte *include_mac_end = mac_end;
- int is_dwz = section_is_dwz;
- const gdb_byte *new_mac_ptr;
- offset = read_offset_1 (abfd, mac_ptr, offset_size);
- mac_ptr += offset_size;
- if (macinfo_type == DW_MACRO_GNU_transparent_include_alt)
- {
- struct dwz_file *dwz = dwarf2_get_dwz_file ();
- dwarf2_read_section (objfile, &dwz->macro);
- include_section = &dwz->macro;
- include_bfd = get_section_bfd_owner (include_section);
- include_mac_end = dwz->macro.buffer + dwz->macro.size;
- is_dwz = 1;
- }
- new_mac_ptr = include_section->buffer + offset;
- slot = htab_find_slot (include_hash, new_mac_ptr, INSERT);
- if (*slot != NULL)
- {
-
- complaint (&symfile_complaints,
- _("recursive DW_MACRO_GNU_transparent_include in "
- ".debug_macro section"));
- }
- else
- {
- *slot = (void *) new_mac_ptr;
- dwarf_decode_macro_bytes (include_bfd, new_mac_ptr,
- include_mac_end, current_file, lh,
- section, section_is_gnu, is_dwz,
- offset_size, include_hash);
- htab_remove_elt (include_hash, (void *) new_mac_ptr);
- }
- }
- break;
- case DW_MACINFO_vendor_ext:
- if (!section_is_gnu)
- {
- unsigned int bytes_read;
- int constant;
- constant = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
- read_direct_string (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
-
- break;
- }
-
- default:
- mac_ptr = skip_unknown_opcode (macinfo_type, opcode_definitions,
- mac_ptr, mac_end, abfd, offset_size,
- section);
- if (mac_ptr == NULL)
- return;
- break;
- }
- } while (macinfo_type != 0);
- }
- static void
- dwarf_decode_macros (struct dwarf2_cu *cu, unsigned int offset,
- int section_is_gnu)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct line_header *lh = cu->line_header;
- bfd *abfd;
- const gdb_byte *mac_ptr, *mac_end;
- struct macro_source_file *current_file = 0;
- enum dwarf_macro_record_type macinfo_type;
- unsigned int offset_size = cu->header.offset_size;
- const gdb_byte *opcode_definitions[256];
- struct cleanup *cleanup;
- htab_t include_hash;
- void **slot;
- struct dwarf2_section_info *section;
- const char *section_name;
- if (cu->dwo_unit != NULL)
- {
- if (section_is_gnu)
- {
- section = &cu->dwo_unit->dwo_file->sections.macro;
- section_name = ".debug_macro.dwo";
- }
- else
- {
- section = &cu->dwo_unit->dwo_file->sections.macinfo;
- section_name = ".debug_macinfo.dwo";
- }
- }
- else
- {
- if (section_is_gnu)
- {
- section = &dwarf2_per_objfile->macro;
- section_name = ".debug_macro";
- }
- else
- {
- section = &dwarf2_per_objfile->macinfo;
- section_name = ".debug_macinfo";
- }
- }
- dwarf2_read_section (objfile, section);
- if (section->buffer == NULL)
- {
- complaint (&symfile_complaints, _("missing %s section"), section_name);
- return;
- }
- abfd = get_section_bfd_owner (section);
-
- mac_ptr = section->buffer + offset;
- mac_end = section->buffer + section->size;
- mac_ptr = dwarf_parse_macro_header (opcode_definitions, abfd, mac_ptr,
- &offset_size, section_is_gnu);
- if (mac_ptr == NULL)
- {
-
- return;
- }
- do
- {
-
- if (mac_ptr >= mac_end)
- {
-
- break;
- }
- macinfo_type = read_1_byte (abfd, mac_ptr);
- mac_ptr++;
-
- switch (macinfo_type)
- {
-
- case 0:
- break;
- case DW_MACRO_GNU_define:
- case DW_MACRO_GNU_undef:
-
- {
- unsigned int bytes_read;
- read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
- read_direct_string (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
- }
- break;
- case DW_MACRO_GNU_start_file:
- {
- unsigned int bytes_read;
- int line, file;
- line = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
- file = read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
- current_file = macro_start_file (file, line, current_file, lh);
- }
- break;
- case DW_MACRO_GNU_end_file:
-
- break;
- case DW_MACRO_GNU_define_indirect:
- case DW_MACRO_GNU_undef_indirect:
- case DW_MACRO_GNU_define_indirect_alt:
- case DW_MACRO_GNU_undef_indirect_alt:
- {
- unsigned int bytes_read;
- read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
- mac_ptr += offset_size;
- }
- break;
- case DW_MACRO_GNU_transparent_include:
- case DW_MACRO_GNU_transparent_include_alt:
-
- mac_ptr += offset_size;
- break;
- case DW_MACINFO_vendor_ext:
-
- if (!section_is_gnu)
- {
- unsigned int bytes_read;
- read_unsigned_leb128 (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
- read_direct_string (abfd, mac_ptr, &bytes_read);
- mac_ptr += bytes_read;
- }
-
- default:
- mac_ptr = skip_unknown_opcode (macinfo_type, opcode_definitions,
- mac_ptr, mac_end, abfd, offset_size,
- section);
- if (mac_ptr == NULL)
- return;
- break;
- }
- } while (macinfo_type != 0 && current_file == NULL);
-
- include_hash = htab_create_alloc (1, htab_hash_pointer, htab_eq_pointer,
- NULL, xcalloc, xfree);
- cleanup = make_cleanup_htab_delete (include_hash);
- mac_ptr = section->buffer + offset;
- slot = htab_find_slot (include_hash, mac_ptr, INSERT);
- *slot = (void *) mac_ptr;
- dwarf_decode_macro_bytes (abfd, mac_ptr, mac_end,
- current_file, lh, section,
- section_is_gnu, 0, offset_size, include_hash);
- do_cleanups (cleanup);
- }
- static int
- attr_form_is_block (const struct attribute *attr)
- {
- return (attr == NULL ? 0 :
- attr->form == DW_FORM_block1
- || attr->form == DW_FORM_block2
- || attr->form == DW_FORM_block4
- || attr->form == DW_FORM_block
- || attr->form == DW_FORM_exprloc);
- }
- static int
- attr_form_is_section_offset (const struct attribute *attr)
- {
- return (attr->form == DW_FORM_data4
- || attr->form == DW_FORM_data8
- || attr->form == DW_FORM_sec_offset);
- }
- static int
- attr_form_is_constant (const struct attribute *attr)
- {
- switch (attr->form)
- {
- case DW_FORM_sdata:
- case DW_FORM_udata:
- case DW_FORM_data1:
- case DW_FORM_data2:
- case DW_FORM_data4:
- case DW_FORM_data8:
- return 1;
- default:
- return 0;
- }
- }
- static int
- attr_form_is_ref (const struct attribute *attr)
- {
- switch (attr->form)
- {
- case DW_FORM_ref_addr:
- case DW_FORM_ref1:
- case DW_FORM_ref2:
- case DW_FORM_ref4:
- case DW_FORM_ref8:
- case DW_FORM_ref_udata:
- case DW_FORM_GNU_ref_alt:
- return 1;
- default:
- return 0;
- }
- }
- static struct dwarf2_section_info *
- cu_debug_loc_section (struct dwarf2_cu *cu)
- {
- if (cu->dwo_unit)
- return &cu->dwo_unit->dwo_file->sections.loc;
- return &dwarf2_per_objfile->loc;
- }
- static void
- fill_in_loclist_baton (struct dwarf2_cu *cu,
- struct dwarf2_loclist_baton *baton,
- const struct attribute *attr)
- {
- struct dwarf2_section_info *section = cu_debug_loc_section (cu);
- dwarf2_read_section (dwarf2_per_objfile->objfile, section);
- baton->per_cu = cu->per_cu;
- gdb_assert (baton->per_cu);
-
- baton->size = section->size - DW_UNSND (attr);
- baton->data = section->buffer + DW_UNSND (attr);
- baton->base_address = cu->base_address;
- baton->from_dwo = cu->dwo_unit != NULL;
- }
- static void
- dwarf2_symbol_mark_computed (const struct attribute *attr, struct symbol *sym,
- struct dwarf2_cu *cu, int is_block)
- {
- struct objfile *objfile = dwarf2_per_objfile->objfile;
- struct dwarf2_section_info *section = cu_debug_loc_section (cu);
- if (attr_form_is_section_offset (attr)
-
- && DW_UNSND (attr) < dwarf2_section_size (objfile, section))
- {
- struct dwarf2_loclist_baton *baton;
- baton = obstack_alloc (&objfile->objfile_obstack,
- sizeof (struct dwarf2_loclist_baton));
- fill_in_loclist_baton (cu, baton, attr);
- if (cu->base_known == 0)
- complaint (&symfile_complaints,
- _("Location list used without "
- "specifying the CU base address."));
- SYMBOL_ACLASS_INDEX (sym) = (is_block
- ? dwarf2_loclist_block_index
- : dwarf2_loclist_index);
- SYMBOL_LOCATION_BATON (sym) = baton;
- }
- else
- {
- struct dwarf2_locexpr_baton *baton;
- baton = obstack_alloc (&objfile->objfile_obstack,
- sizeof (struct dwarf2_locexpr_baton));
- baton->per_cu = cu->per_cu;
- gdb_assert (baton->per_cu);
- if (attr_form_is_block (attr))
- {
-
- baton->size = DW_BLOCK (attr)->size;
- baton->data = DW_BLOCK (attr)->data;
- }
- else
- {
- dwarf2_invalid_attrib_class_complaint ("location description",
- SYMBOL_NATURAL_NAME (sym));
- baton->size = 0;
- }
- SYMBOL_ACLASS_INDEX (sym) = (is_block
- ? dwarf2_locexpr_block_index
- : dwarf2_locexpr_index);
- SYMBOL_LOCATION_BATON (sym) = baton;
- }
- }
- struct objfile *
- dwarf2_per_cu_objfile (struct dwarf2_per_cu_data *per_cu)
- {
- struct objfile *objfile = per_cu->objfile;
-
- if (objfile->separate_debug_objfile_backlink)
- objfile = objfile->separate_debug_objfile_backlink;
- return objfile;
- }
- static const struct comp_unit_head *
- per_cu_header_read_in (struct comp_unit_head *cu_headerp,
- struct dwarf2_per_cu_data *per_cu)
- {
- const gdb_byte *info_ptr;
- if (per_cu->cu)
- return &per_cu->cu->header;
- info_ptr = per_cu->section->buffer + per_cu->offset.sect_off;
- memset (cu_headerp, 0, sizeof (*cu_headerp));
- read_comp_unit_head (cu_headerp, info_ptr, per_cu->objfile->obfd);
- return cu_headerp;
- }
- int
- dwarf2_per_cu_addr_size (struct dwarf2_per_cu_data *per_cu)
- {
- struct comp_unit_head cu_header_local;
- const struct comp_unit_head *cu_headerp;
- cu_headerp = per_cu_header_read_in (&cu_header_local, per_cu);
- return cu_headerp->addr_size;
- }
- int
- dwarf2_per_cu_offset_size (struct dwarf2_per_cu_data *per_cu)
- {
- struct comp_unit_head cu_header_local;
- const struct comp_unit_head *cu_headerp;
- cu_headerp = per_cu_header_read_in (&cu_header_local, per_cu);
- return cu_headerp->offset_size;
- }
- int
- dwarf2_per_cu_ref_addr_size (struct dwarf2_per_cu_data *per_cu)
- {
- struct comp_unit_head cu_header_local;
- const struct comp_unit_head *cu_headerp;
- cu_headerp = per_cu_header_read_in (&cu_header_local, per_cu);
- if (cu_headerp->version == 2)
- return cu_headerp->addr_size;
- else
- return cu_headerp->offset_size;
- }
- CORE_ADDR
- dwarf2_per_cu_text_offset (struct dwarf2_per_cu_data *per_cu)
- {
- struct objfile *objfile = per_cu->objfile;
- return ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
- }
- static struct dwarf2_per_cu_data *
- dwarf2_find_containing_comp_unit (sect_offset offset,
- unsigned int offset_in_dwz,
- struct objfile *objfile)
- {
- struct dwarf2_per_cu_data *this_cu;
- int low, high;
- const sect_offset *cu_off;
- low = 0;
- high = dwarf2_per_objfile->n_comp_units - 1;
- while (high > low)
- {
- struct dwarf2_per_cu_data *mid_cu;
- int mid = low + (high - low) / 2;
- mid_cu = dwarf2_per_objfile->all_comp_units[mid];
- cu_off = &mid_cu->offset;
- if (mid_cu->is_dwz > offset_in_dwz
- || (mid_cu->is_dwz == offset_in_dwz
- && cu_off->sect_off >= offset.sect_off))
- high = mid;
- else
- low = mid + 1;
- }
- gdb_assert (low == high);
- this_cu = dwarf2_per_objfile->all_comp_units[low];
- cu_off = &this_cu->offset;
- if (this_cu->is_dwz != offset_in_dwz || cu_off->sect_off > offset.sect_off)
- {
- if (low == 0 || this_cu->is_dwz != offset_in_dwz)
- error (_("Dwarf Error: could not find partial DIE containing "
- "offset 0x%lx [in module %s]"),
- (long) offset.sect_off, bfd_get_filename (objfile->obfd));
- gdb_assert (dwarf2_per_objfile->all_comp_units[low-1]->offset.sect_off
- <= offset.sect_off);
- return dwarf2_per_objfile->all_comp_units[low-1];
- }
- else
- {
- this_cu = dwarf2_per_objfile->all_comp_units[low];
- if (low == dwarf2_per_objfile->n_comp_units - 1
- && offset.sect_off >= this_cu->offset.sect_off + this_cu->length)
- error (_("invalid dwarf2 offset %u"), offset.sect_off);
- gdb_assert (offset.sect_off < this_cu->offset.sect_off + this_cu->length);
- return this_cu;
- }
- }
- static void
- init_one_comp_unit (struct dwarf2_cu *cu, struct dwarf2_per_cu_data *per_cu)
- {
- memset (cu, 0, sizeof (*cu));
- per_cu->cu = cu;
- cu->per_cu = per_cu;
- cu->objfile = per_cu->objfile;
- obstack_init (&cu->comp_unit_obstack);
- }
- static void
- prepare_one_comp_unit (struct dwarf2_cu *cu, struct die_info *comp_unit_die,
- enum language pretend_language)
- {
- struct attribute *attr;
-
- attr = dwarf2_attr (comp_unit_die, DW_AT_language, cu);
- if (attr)
- set_cu_language (DW_UNSND (attr), cu);
- else
- {
- cu->language = pretend_language;
- cu->language_defn = language_def (cu->language);
- }
- attr = dwarf2_attr (comp_unit_die, DW_AT_producer, cu);
- if (attr)
- cu->producer = DW_STRING (attr);
- }
- static void
- free_heap_comp_unit (void *data)
- {
- struct dwarf2_cu *cu = data;
- gdb_assert (cu->per_cu != NULL);
- cu->per_cu->cu = NULL;
- cu->per_cu = NULL;
- obstack_free (&cu->comp_unit_obstack, NULL);
- xfree (cu);
- }
- static void
- free_stack_comp_unit (void *data)
- {
- struct dwarf2_cu *cu = data;
- gdb_assert (cu->per_cu != NULL);
- cu->per_cu->cu = NULL;
- cu->per_cu = NULL;
- obstack_free (&cu->comp_unit_obstack, NULL);
- cu->partial_dies = NULL;
- }
- static void
- free_cached_comp_units (void *data)
- {
- struct dwarf2_per_cu_data *per_cu, **last_chain;
- per_cu = dwarf2_per_objfile->read_in_chain;
- last_chain = &dwarf2_per_objfile->read_in_chain;
- while (per_cu != NULL)
- {
- struct dwarf2_per_cu_data *next_cu;
- next_cu = per_cu->cu->read_in_chain;
- free_heap_comp_unit (per_cu->cu);
- *last_chain = next_cu;
- per_cu = next_cu;
- }
- }
- static void
- age_cached_comp_units (void)
- {
- struct dwarf2_per_cu_data *per_cu, **last_chain;
- dwarf2_clear_marks (dwarf2_per_objfile->read_in_chain);
- per_cu = dwarf2_per_objfile->read_in_chain;
- while (per_cu != NULL)
- {
- per_cu->cu->last_used ++;
- if (per_cu->cu->last_used <= dwarf2_max_cache_age)
- dwarf2_mark (per_cu->cu);
- per_cu = per_cu->cu->read_in_chain;
- }
- per_cu = dwarf2_per_objfile->read_in_chain;
- last_chain = &dwarf2_per_objfile->read_in_chain;
- while (per_cu != NULL)
- {
- struct dwarf2_per_cu_data *next_cu;
- next_cu = per_cu->cu->read_in_chain;
- if (!per_cu->cu->mark)
- {
- free_heap_comp_unit (per_cu->cu);
- *last_chain = next_cu;
- }
- else
- last_chain = &per_cu->cu->read_in_chain;
- per_cu = next_cu;
- }
- }
- static void
- free_one_cached_comp_unit (struct dwarf2_per_cu_data *target_per_cu)
- {
- struct dwarf2_per_cu_data *per_cu, **last_chain;
- per_cu = dwarf2_per_objfile->read_in_chain;
- last_chain = &dwarf2_per_objfile->read_in_chain;
- while (per_cu != NULL)
- {
- struct dwarf2_per_cu_data *next_cu;
- next_cu = per_cu->cu->read_in_chain;
- if (per_cu == target_per_cu)
- {
- free_heap_comp_unit (per_cu->cu);
- per_cu->cu = NULL;
- *last_chain = next_cu;
- break;
- }
- else
- last_chain = &per_cu->cu->read_in_chain;
- per_cu = next_cu;
- }
- }
- void
- dwarf2_free_objfile (struct objfile *objfile)
- {
- dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key);
- if (dwarf2_per_objfile == NULL)
- return;
-
- free_cached_comp_units (NULL);
- if (dwarf2_per_objfile->quick_file_names_table)
- htab_delete (dwarf2_per_objfile->quick_file_names_table);
-
- }
- struct dwarf2_per_cu_offset_and_type
- {
- const struct dwarf2_per_cu_data *per_cu;
- sect_offset offset;
- struct type *type;
- };
- static hashval_t
- per_cu_offset_and_type_hash (const void *item)
- {
- const struct dwarf2_per_cu_offset_and_type *ofs = item;
- return (uintptr_t) ofs->per_cu + ofs->offset.sect_off;
- }
- static int
- per_cu_offset_and_type_eq (const void *item_lhs, const void *item_rhs)
- {
- const struct dwarf2_per_cu_offset_and_type *ofs_lhs = item_lhs;
- const struct dwarf2_per_cu_offset_and_type *ofs_rhs = item_rhs;
- return (ofs_lhs->per_cu == ofs_rhs->per_cu
- && ofs_lhs->offset.sect_off == ofs_rhs->offset.sect_off);
- }
- static struct type *
- set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu)
- {
- struct dwarf2_per_cu_offset_and_type **slot, ofs;
- struct objfile *objfile = cu->objfile;
- struct attribute *attr;
- struct dynamic_prop prop;
-
- if (need_gnat_info (cu)
- && TYPE_CODE (type) != TYPE_CODE_FUNC
- && TYPE_CODE (type) != TYPE_CODE_FLT
- && !HAVE_GNAT_AUX_INFO (type))
- INIT_GNAT_SPECIFIC (type);
-
- attr = dwarf2_attr (die, DW_AT_data_location, cu);
- if (attr_to_dynamic_prop (attr, die, cu, &prop))
- {
- TYPE_DATA_LOCATION (type)
- = obstack_alloc (&objfile->objfile_obstack, sizeof (prop));
- *TYPE_DATA_LOCATION (type) = prop;
- }
- if (dwarf2_per_objfile->die_type_hash == NULL)
- {
- dwarf2_per_objfile->die_type_hash =
- htab_create_alloc_ex (127,
- per_cu_offset_and_type_hash,
- per_cu_offset_and_type_eq,
- NULL,
- &objfile->objfile_obstack,
- hashtab_obstack_allocate,
- dummy_obstack_deallocate);
- }
- ofs.per_cu = cu->per_cu;
- ofs.offset = die->offset;
- ofs.type = type;
- slot = (struct dwarf2_per_cu_offset_and_type **)
- htab_find_slot (dwarf2_per_objfile->die_type_hash, &ofs, INSERT);
- if (*slot)
- complaint (&symfile_complaints,
- _("A problem internal to GDB: DIE 0x%x has type already set"),
- die->offset.sect_off);
- *slot = obstack_alloc (&objfile->objfile_obstack, sizeof (**slot));
- **slot = ofs;
- return type;
- }
- static struct type *
- get_die_type_at_offset (sect_offset offset,
- struct dwarf2_per_cu_data *per_cu)
- {
- struct dwarf2_per_cu_offset_and_type *slot, ofs;
- if (dwarf2_per_objfile->die_type_hash == NULL)
- return NULL;
- ofs.per_cu = per_cu;
- ofs.offset = offset;
- slot = htab_find (dwarf2_per_objfile->die_type_hash, &ofs);
- if (slot)
- return slot->type;
- else
- return NULL;
- }
- static struct type *
- get_die_type (struct die_info *die, struct dwarf2_cu *cu)
- {
- return get_die_type_at_offset (die->offset, cu->per_cu);
- }
- static void
- dwarf2_add_dependence (struct dwarf2_cu *cu,
- struct dwarf2_per_cu_data *ref_per_cu)
- {
- void **slot;
- if (cu->dependencies == NULL)
- cu->dependencies
- = htab_create_alloc_ex (5, htab_hash_pointer, htab_eq_pointer,
- NULL, &cu->comp_unit_obstack,
- hashtab_obstack_allocate,
- dummy_obstack_deallocate);
- slot = htab_find_slot (cu->dependencies, ref_per_cu, INSERT);
- if (*slot == NULL)
- *slot = ref_per_cu;
- }
- static int
- dwarf2_mark_helper (void **slot, void *data)
- {
- struct dwarf2_per_cu_data *per_cu;
- per_cu = (struct dwarf2_per_cu_data *) *slot;
-
- if (per_cu->cu == NULL)
- return 1;
- if (per_cu->cu->mark)
- return 1;
- per_cu->cu->mark = 1;
- if (per_cu->cu->dependencies != NULL)
- htab_traverse (per_cu->cu->dependencies, dwarf2_mark_helper, NULL);
- return 1;
- }
- static void
- dwarf2_mark (struct dwarf2_cu *cu)
- {
- if (cu->mark)
- return;
- cu->mark = 1;
- if (cu->dependencies != NULL)
- htab_traverse (cu->dependencies, dwarf2_mark_helper, NULL);
- }
- static void
- dwarf2_clear_marks (struct dwarf2_per_cu_data *per_cu)
- {
- while (per_cu)
- {
- per_cu->cu->mark = 0;
- per_cu = per_cu->cu->read_in_chain;
- }
- }
- static hashval_t
- partial_die_hash (const void *item)
- {
- const struct partial_die_info *part_die = item;
- return part_die->offset.sect_off;
- }
- static int
- partial_die_eq (const void *item_lhs, const void *item_rhs)
- {
- const struct partial_die_info *part_die_lhs = item_lhs;
- const struct partial_die_info *part_die_rhs = item_rhs;
- return part_die_lhs->offset.sect_off == part_die_rhs->offset.sect_off;
- }
- static struct cmd_list_element *set_dwarf2_cmdlist;
- static struct cmd_list_element *show_dwarf2_cmdlist;
- static void
- set_dwarf2_cmd (char *args, int from_tty)
- {
- help_list (set_dwarf2_cmdlist, "maintenance set dwarf2 ", all_commands,
- gdb_stdout);
- }
- static void
- show_dwarf2_cmd (char *args, int from_tty)
- {
- cmd_show_list (show_dwarf2_cmdlist, from_tty, "");
- }
- static void
- dwarf2_per_objfile_free (struct objfile *objfile, void *d)
- {
- struct dwarf2_per_objfile *data = d;
- int ix;
-
- dwarf2_per_objfile = NULL;
- for (ix = 0; ix < data->n_comp_units; ++ix)
- VEC_free (dwarf2_per_cu_ptr, data->all_comp_units[ix]->imported_symtabs);
- for (ix = 0; ix < data->n_type_units; ++ix)
- VEC_free (dwarf2_per_cu_ptr,
- data->all_type_units[ix]->per_cu.imported_symtabs);
- xfree (data->all_type_units);
- VEC_free (dwarf2_section_info_def, data->types);
- if (data->dwo_files)
- free_dwo_files (data->dwo_files, objfile);
- if (data->dwp_file)
- gdb_bfd_unref (data->dwp_file->dbfd);
- if (data->dwz_file && data->dwz_file->dwz_bfd)
- gdb_bfd_unref (data->dwz_file->dwz_bfd);
- }
- struct strtab_entry
- {
- offset_type offset;
- const char *str;
- };
- static hashval_t
- hash_strtab_entry (const void *e)
- {
- const struct strtab_entry *entry = e;
- return mapped_index_string_hash (INT_MAX, entry->str);
- }
- static int
- eq_strtab_entry (const void *a, const void *b)
- {
- const struct strtab_entry *ea = a;
- const struct strtab_entry *eb = b;
- return !strcmp (ea->str, eb->str);
- }
- static htab_t
- create_strtab (void)
- {
- return htab_create_alloc (100, hash_strtab_entry, eq_strtab_entry,
- xfree, xcalloc, xfree);
- }
- static offset_type
- add_string (htab_t table, struct obstack *cpool, const char *str)
- {
- void **slot;
- struct strtab_entry entry;
- struct strtab_entry *result;
- entry.str = str;
- slot = htab_find_slot (table, &entry, INSERT);
- if (*slot)
- result = *slot;
- else
- {
- result = XNEW (struct strtab_entry);
- result->offset = obstack_object_size (cpool);
- result->str = str;
- obstack_grow_str0 (cpool, str);
- *slot = result;
- }
- return result->offset;
- }
- struct symtab_index_entry
- {
-
- const char *name;
-
- offset_type index_offset;
-
- VEC (offset_type) *cu_indices;
- };
- struct mapped_symtab
- {
- offset_type n_elements;
- offset_type size;
- struct symtab_index_entry **data;
- };
- static hashval_t
- hash_symtab_entry (const void *e)
- {
- const struct symtab_index_entry *entry = e;
- return iterative_hash (VEC_address (offset_type, entry->cu_indices),
- sizeof (offset_type) * VEC_length (offset_type,
- entry->cu_indices),
- 0);
- }
- static int
- eq_symtab_entry (const void *a, const void *b)
- {
- const struct symtab_index_entry *ea = a;
- const struct symtab_index_entry *eb = b;
- int len = VEC_length (offset_type, ea->cu_indices);
- if (len != VEC_length (offset_type, eb->cu_indices))
- return 0;
- return !memcmp (VEC_address (offset_type, ea->cu_indices),
- VEC_address (offset_type, eb->cu_indices),
- sizeof (offset_type) * len);
- }
- static void
- delete_symtab_entry (void *p)
- {
- struct symtab_index_entry *entry = p;
- VEC_free (offset_type, entry->cu_indices);
- xfree (entry);
- }
- static htab_t
- create_symbol_hash_table (void)
- {
- return htab_create_alloc (100, hash_symtab_entry, eq_symtab_entry,
- delete_symtab_entry, xcalloc, xfree);
- }
- static struct mapped_symtab *
- create_mapped_symtab (void)
- {
- struct mapped_symtab *symtab = XNEW (struct mapped_symtab);
- symtab->n_elements = 0;
- symtab->size = 1024;
- symtab->data = XCNEWVEC (struct symtab_index_entry *, symtab->size);
- return symtab;
- }
- static void
- cleanup_mapped_symtab (void *p)
- {
- struct mapped_symtab *symtab = p;
-
- xfree (symtab->data);
- xfree (symtab);
- }
- static struct symtab_index_entry **
- find_slot (struct mapped_symtab *symtab, const char *name)
- {
- offset_type index, step, hash = mapped_index_string_hash (INT_MAX, name);
- index = hash & (symtab->size - 1);
- step = ((hash * 17) & (symtab->size - 1)) | 1;
- for (;;)
- {
- if (!symtab->data[index] || !strcmp (name, symtab->data[index]->name))
- return &symtab->data[index];
- index = (index + step) & (symtab->size - 1);
- }
- }
- static void
- hash_expand (struct mapped_symtab *symtab)
- {
- offset_type old_size = symtab->size;
- offset_type i;
- struct symtab_index_entry **old_entries = symtab->data;
- symtab->size *= 2;
- symtab->data = XCNEWVEC (struct symtab_index_entry *, symtab->size);
- for (i = 0; i < old_size; ++i)
- {
- if (old_entries[i])
- {
- struct symtab_index_entry **slot = find_slot (symtab,
- old_entries[i]->name);
- *slot = old_entries[i];
- }
- }
- xfree (old_entries);
- }
- static void
- add_index_entry (struct mapped_symtab *symtab, const char *name,
- int is_static, gdb_index_symbol_kind kind,
- offset_type cu_index)
- {
- struct symtab_index_entry **slot;
- offset_type cu_index_and_attrs;
- ++symtab->n_elements;
- if (4 * symtab->n_elements / 3 >= symtab->size)
- hash_expand (symtab);
- slot = find_slot (symtab, name);
- if (!*slot)
- {
- *slot = XNEW (struct symtab_index_entry);
- (*slot)->name = name;
-
- (*slot)->cu_indices = NULL;
- }
- cu_index_and_attrs = 0;
- DW2_GDB_INDEX_CU_SET_VALUE (cu_index_and_attrs, cu_index);
- DW2_GDB_INDEX_SYMBOL_STATIC_SET_VALUE (cu_index_and_attrs, is_static);
- DW2_GDB_INDEX_SYMBOL_KIND_SET_VALUE (cu_index_and_attrs, kind);
-
- VEC_safe_push (offset_type, (*slot)->cu_indices, cu_index_and_attrs);
- }
- static int
- offset_type_compare (const void *ap, const void *bp)
- {
- offset_type a = *(offset_type *) ap;
- offset_type b = *(offset_type *) bp;
- return (a > b) - (b > a);
- }
- static void
- uniquify_cu_indices (struct mapped_symtab *symtab)
- {
- int i;
- for (i = 0; i < symtab->size; ++i)
- {
- struct symtab_index_entry *entry = symtab->data[i];
- if (entry
- && entry->cu_indices != NULL)
- {
- unsigned int next_to_insert, next_to_check;
- offset_type last_value;
- qsort (VEC_address (offset_type, entry->cu_indices),
- VEC_length (offset_type, entry->cu_indices),
- sizeof (offset_type), offset_type_compare);
- last_value = VEC_index (offset_type, entry->cu_indices, 0);
- next_to_insert = 1;
- for (next_to_check = 1;
- next_to_check < VEC_length (offset_type, entry->cu_indices);
- ++next_to_check)
- {
- if (VEC_index (offset_type, entry->cu_indices, next_to_check)
- != last_value)
- {
- last_value = VEC_index (offset_type, entry->cu_indices,
- next_to_check);
- VEC_replace (offset_type, entry->cu_indices, next_to_insert,
- last_value);
- ++next_to_insert;
- }
- }
- VEC_truncate (offset_type, entry->cu_indices, next_to_insert);
- }
- }
- }
- static offset_type
- add_indices_to_cpool (htab_t symbol_hash_table, struct obstack *cpool,
- struct symtab_index_entry *entry)
- {
- void **slot;
- slot = htab_find_slot (symbol_hash_table, entry, INSERT);
- if (!*slot)
- {
- offset_type len = VEC_length (offset_type, entry->cu_indices);
- offset_type val = MAYBE_SWAP (len);
- offset_type iter;
- int i;
- *slot = entry;
- entry->index_offset = obstack_object_size (cpool);
- obstack_grow (cpool, &val, sizeof (val));
- for (i = 0;
- VEC_iterate (offset_type, entry->cu_indices, i, iter);
- ++i)
- {
- val = MAYBE_SWAP (iter);
- obstack_grow (cpool, &val, sizeof (val));
- }
- }
- else
- {
- struct symtab_index_entry *old_entry = *slot;
- entry->index_offset = old_entry->index_offset;
- entry = old_entry;
- }
- return entry->index_offset;
- }
- static void
- write_hash_table (struct mapped_symtab *symtab,
- struct obstack *output, struct obstack *cpool)
- {
- offset_type i;
- htab_t symbol_hash_table;
- htab_t str_table;
- symbol_hash_table = create_symbol_hash_table ();
- str_table = create_strtab ();
-
- for (i = 0; i < symtab->size; ++i)
- {
- if (symtab->data[i])
- add_indices_to_cpool (symbol_hash_table, cpool, symtab->data[i]);
- }
-
- for (i = 0; i < symtab->size; ++i)
- {
- offset_type str_off, vec_off;
- if (symtab->data[i])
- {
- str_off = add_string (str_table, cpool, symtab->data[i]->name);
- vec_off = symtab->data[i]->index_offset;
- }
- else
- {
-
- str_off = 0;
- vec_off = 0;
- }
- str_off = MAYBE_SWAP (str_off);
- vec_off = MAYBE_SWAP (vec_off);
- obstack_grow (output, &str_off, sizeof (str_off));
- obstack_grow (output, &vec_off, sizeof (vec_off));
- }
- htab_delete (str_table);
- htab_delete (symbol_hash_table);
- }
- struct psymtab_cu_index_map
- {
- struct partial_symtab *psymtab;
- unsigned int cu_index;
- };
- static hashval_t
- hash_psymtab_cu_index (const void *item)
- {
- const struct psymtab_cu_index_map *map = item;
- return htab_hash_pointer (map->psymtab);
- }
- static int
- eq_psymtab_cu_index (const void *item_lhs, const void *item_rhs)
- {
- const struct psymtab_cu_index_map *lhs = item_lhs;
- const struct psymtab_cu_index_map *rhs = item_rhs;
- return lhs->psymtab == rhs->psymtab;
- }
- struct addrmap_index_data
- {
- struct objfile *objfile;
- struct obstack *addr_obstack;
- htab_t cu_index_htab;
-
- int previous_valid;
-
- unsigned int previous_cu_index;
-
- CORE_ADDR previous_cu_start;
- };
- static void
- add_address_entry (struct objfile *objfile, struct obstack *obstack,
- CORE_ADDR start, CORE_ADDR end, unsigned int cu_index)
- {
- offset_type cu_index_to_write;
- gdb_byte addr[8];
- CORE_ADDR baseaddr;
- baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
- store_unsigned_integer (addr, 8, BFD_ENDIAN_LITTLE, start - baseaddr);
- obstack_grow (obstack, addr, 8);
- store_unsigned_integer (addr, 8, BFD_ENDIAN_LITTLE, end - baseaddr);
- obstack_grow (obstack, addr, 8);
- cu_index_to_write = MAYBE_SWAP (cu_index);
- obstack_grow (obstack, &cu_index_to_write, sizeof (offset_type));
- }
- static int
- add_address_entry_worker (void *datap, CORE_ADDR start_addr, void *obj)
- {
- struct addrmap_index_data *data = datap;
- struct partial_symtab *pst = obj;
- if (data->previous_valid)
- add_address_entry (data->objfile, data->addr_obstack,
- data->previous_cu_start, start_addr,
- data->previous_cu_index);
- data->previous_cu_start = start_addr;
- if (pst != NULL)
- {
- struct psymtab_cu_index_map find_map, *map;
- find_map.psymtab = pst;
- map = htab_find (data->cu_index_htab, &find_map);
- gdb_assert (map != NULL);
- data->previous_cu_index = map->cu_index;
- data->previous_valid = 1;
- }
- else
- data->previous_valid = 0;
- return 0;
- }
- static void
- write_address_map (struct objfile *objfile, struct obstack *obstack,
- htab_t cu_index_htab)
- {
- struct addrmap_index_data addrmap_index_data;
-
- addrmap_index_data.objfile = objfile;
- addrmap_index_data.addr_obstack = obstack;
- addrmap_index_data.cu_index_htab = cu_index_htab;
- addrmap_index_data.previous_valid = 0;
- addrmap_foreach (objfile->psymtabs_addrmap, add_address_entry_worker,
- &addrmap_index_data);
-
- if (addrmap_index_data.previous_valid)
- add_address_entry (objfile, obstack,
- addrmap_index_data.previous_cu_start, (CORE_ADDR) -1,
- addrmap_index_data.previous_cu_index);
- }
- static gdb_index_symbol_kind
- symbol_kind (struct partial_symbol *psym)
- {
- domain_enum domain = PSYMBOL_DOMAIN (psym);
- enum address_class aclass = PSYMBOL_CLASS (psym);
- switch (domain)
- {
- case VAR_DOMAIN:
- switch (aclass)
- {
- case LOC_BLOCK:
- return GDB_INDEX_SYMBOL_KIND_FUNCTION;
- case LOC_TYPEDEF:
- return GDB_INDEX_SYMBOL_KIND_TYPE;
- case LOC_COMPUTED:
- case LOC_CONST_BYTES:
- case LOC_OPTIMIZED_OUT:
- case LOC_STATIC:
- return GDB_INDEX_SYMBOL_KIND_VARIABLE;
- case LOC_CONST:
-
- return GDB_INDEX_SYMBOL_KIND_VARIABLE;
- default:
-
- return GDB_INDEX_SYMBOL_KIND_OTHER;
- }
- case STRUCT_DOMAIN:
- return GDB_INDEX_SYMBOL_KIND_TYPE;
- default:
- return GDB_INDEX_SYMBOL_KIND_OTHER;
- }
- }
- static void
- write_psymbols (struct mapped_symtab *symtab,
- htab_t psyms_seen,
- struct partial_symbol **psymp,
- int count,
- offset_type cu_index,
- int is_static)
- {
- for (; count-- > 0; ++psymp)
- {
- struct partial_symbol *psym = *psymp;
- void **slot;
- if (SYMBOL_LANGUAGE (psym) == language_ada)
- error (_("Ada is not currently supported by the index"));
-
- slot = htab_find_slot (psyms_seen, psym, INSERT);
- if (!*slot)
- {
- gdb_index_symbol_kind kind = symbol_kind (psym);
- *slot = psym;
- add_index_entry (symtab, SYMBOL_SEARCH_NAME (psym),
- is_static, kind, cu_index);
- }
- }
- }
- static void
- write_obstack (FILE *file, struct obstack *obstack)
- {
- if (fwrite (obstack_base (obstack), 1, obstack_object_size (obstack),
- file)
- != obstack_object_size (obstack))
- error (_("couldn't data write to file"));
- }
- static void
- unlink_if_set (void *p)
- {
- char **filename = p;
- if (*filename)
- unlink (*filename);
- }
- struct signatured_type_index_data
- {
- struct objfile *objfile;
- struct mapped_symtab *symtab;
- struct obstack *types_list;
- htab_t psyms_seen;
- int cu_index;
- };
- static int
- write_one_signatured_type (void **slot, void *d)
- {
- struct signatured_type_index_data *info = d;
- struct signatured_type *entry = (struct signatured_type *) *slot;
- struct partial_symtab *psymtab = entry->per_cu.v.psymtab;
- gdb_byte val[8];
- write_psymbols (info->symtab,
- info->psyms_seen,
- info->objfile->global_psymbols.list
- + psymtab->globals_offset,
- psymtab->n_global_syms, info->cu_index,
- 0);
- write_psymbols (info->symtab,
- info->psyms_seen,
- info->objfile->static_psymbols.list
- + psymtab->statics_offset,
- psymtab->n_static_syms, info->cu_index,
- 1);
- store_unsigned_integer (val, 8, BFD_ENDIAN_LITTLE,
- entry->per_cu.offset.sect_off);
- obstack_grow (info->types_list, val, 8);
- store_unsigned_integer (val, 8, BFD_ENDIAN_LITTLE,
- entry->type_offset_in_tu.cu_off);
- obstack_grow (info->types_list, val, 8);
- store_unsigned_integer (val, 8, BFD_ENDIAN_LITTLE, entry->signature);
- obstack_grow (info->types_list, val, 8);
- ++info->cu_index;
- return 1;
- }
- static void
- recursively_write_psymbols (struct objfile *objfile,
- struct partial_symtab *psymtab,
- struct mapped_symtab *symtab,
- htab_t psyms_seen,
- offset_type cu_index)
- {
- int i;
- for (i = 0; i < psymtab->number_of_dependencies; ++i)
- if (psymtab->dependencies[i]->user != NULL)
- recursively_write_psymbols (objfile, psymtab->dependencies[i],
- symtab, psyms_seen, cu_index);
- write_psymbols (symtab,
- psyms_seen,
- objfile->global_psymbols.list + psymtab->globals_offset,
- psymtab->n_global_syms, cu_index,
- 0);
- write_psymbols (symtab,
- psyms_seen,
- objfile->static_psymbols.list + psymtab->statics_offset,
- psymtab->n_static_syms, cu_index,
- 1);
- }
- static void
- write_psymtabs_to_index (struct objfile *objfile, const char *dir)
- {
- struct cleanup *cleanup;
- char *filename, *cleanup_filename;
- struct obstack contents, addr_obstack, constant_pool, symtab_obstack;
- struct obstack cu_list, types_cu_list;
- int i;
- FILE *out_file;
- struct mapped_symtab *symtab;
- offset_type val, size_of_contents, total_len;
- struct stat st;
- htab_t psyms_seen;
- htab_t cu_index_htab;
- struct psymtab_cu_index_map *psymtab_cu_index_map;
- if (dwarf2_per_objfile->using_index)
- error (_("Cannot use an index to create the index"));
- if (VEC_length (dwarf2_section_info_def, dwarf2_per_objfile->types) > 1)
- error (_("Cannot make an index when the file has multiple .debug_types sections"));
- if (!objfile->psymtabs || !objfile->psymtabs_addrmap)
- return;
- if (stat (objfile_name (objfile), &st) < 0)
- perror_with_name (objfile_name (objfile));
- filename = concat (dir, SLASH_STRING, lbasename (objfile_name (objfile)),
- INDEX_SUFFIX, (char *) NULL);
- cleanup = make_cleanup (xfree, filename);
- out_file = gdb_fopen_cloexec (filename, "wb");
- if (!out_file)
- error (_("Can't open `%s' for writing"), filename);
- cleanup_filename = filename;
- make_cleanup (unlink_if_set, &cleanup_filename);
- symtab = create_mapped_symtab ();
- make_cleanup (cleanup_mapped_symtab, symtab);
- obstack_init (&addr_obstack);
- make_cleanup_obstack_free (&addr_obstack);
- obstack_init (&cu_list);
- make_cleanup_obstack_free (&cu_list);
- obstack_init (&types_cu_list);
- make_cleanup_obstack_free (&types_cu_list);
- psyms_seen = htab_create_alloc (100, htab_hash_pointer, htab_eq_pointer,
- NULL, xcalloc, xfree);
- make_cleanup_htab_delete (psyms_seen);
-
- cu_index_htab = htab_create_alloc (100,
- hash_psymtab_cu_index,
- eq_psymtab_cu_index,
- NULL, xcalloc, xfree);
- make_cleanup_htab_delete (cu_index_htab);
- psymtab_cu_index_map = (struct psymtab_cu_index_map *)
- xmalloc (sizeof (struct psymtab_cu_index_map)
- * dwarf2_per_objfile->n_comp_units);
- make_cleanup (xfree, psymtab_cu_index_map);
-
- for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
- {
- struct dwarf2_per_cu_data *per_cu
- = dwarf2_per_objfile->all_comp_units[i];
- struct partial_symtab *psymtab = per_cu->v.psymtab;
- gdb_byte val[8];
- struct psymtab_cu_index_map *map;
- void **slot;
-
- if (psymtab == NULL)
- continue;
- if (psymtab->user == NULL)
- recursively_write_psymbols (objfile, psymtab, symtab, psyms_seen, i);
- map = &psymtab_cu_index_map[i];
- map->psymtab = psymtab;
- map->cu_index = i;
- slot = htab_find_slot (cu_index_htab, map, INSERT);
- gdb_assert (slot != NULL);
- gdb_assert (*slot == NULL);
- *slot = map;
- store_unsigned_integer (val, 8, BFD_ENDIAN_LITTLE,
- per_cu->offset.sect_off);
- obstack_grow (&cu_list, val, 8);
- store_unsigned_integer (val, 8, BFD_ENDIAN_LITTLE, per_cu->length);
- obstack_grow (&cu_list, val, 8);
- }
-
- write_address_map (objfile, &addr_obstack, cu_index_htab);
-
- if (dwarf2_per_objfile->signatured_types)
- {
- struct signatured_type_index_data sig_data;
- sig_data.objfile = objfile;
- sig_data.symtab = symtab;
- sig_data.types_list = &types_cu_list;
- sig_data.psyms_seen = psyms_seen;
- sig_data.cu_index = dwarf2_per_objfile->n_comp_units;
- htab_traverse_noresize (dwarf2_per_objfile->signatured_types,
- write_one_signatured_type, &sig_data);
- }
-
- uniquify_cu_indices (symtab);
- obstack_init (&constant_pool);
- make_cleanup_obstack_free (&constant_pool);
- obstack_init (&symtab_obstack);
- make_cleanup_obstack_free (&symtab_obstack);
- write_hash_table (symtab, &symtab_obstack, &constant_pool);
- obstack_init (&contents);
- make_cleanup_obstack_free (&contents);
- size_of_contents = 6 * sizeof (offset_type);
- total_len = size_of_contents;
-
- val = MAYBE_SWAP (8);
- obstack_grow (&contents, &val, sizeof (val));
-
- val = MAYBE_SWAP (total_len);
- obstack_grow (&contents, &val, sizeof (val));
- total_len += obstack_object_size (&cu_list);
-
- val = MAYBE_SWAP (total_len);
- obstack_grow (&contents, &val, sizeof (val));
- total_len += obstack_object_size (&types_cu_list);
-
- val = MAYBE_SWAP (total_len);
- obstack_grow (&contents, &val, sizeof (val));
- total_len += obstack_object_size (&addr_obstack);
-
- val = MAYBE_SWAP (total_len);
- obstack_grow (&contents, &val, sizeof (val));
- total_len += obstack_object_size (&symtab_obstack);
-
- val = MAYBE_SWAP (total_len);
- obstack_grow (&contents, &val, sizeof (val));
- total_len += obstack_object_size (&constant_pool);
- gdb_assert (obstack_object_size (&contents) == size_of_contents);
- write_obstack (out_file, &contents);
- write_obstack (out_file, &cu_list);
- write_obstack (out_file, &types_cu_list);
- write_obstack (out_file, &addr_obstack);
- write_obstack (out_file, &symtab_obstack);
- write_obstack (out_file, &constant_pool);
- fclose (out_file);
-
- cleanup_filename = NULL;
- do_cleanups (cleanup);
- }
- static void
- save_gdb_index_command (char *arg, int from_tty)
- {
- struct objfile *objfile;
- if (!arg || !*arg)
- error (_("usage: save gdb-index DIRECTORY"));
- ALL_OBJFILES (objfile)
- {
- struct stat st;
-
- if (stat (objfile_name (objfile), &st) < 0)
- continue;
- dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key);
- if (dwarf2_per_objfile)
- {
- volatile struct gdb_exception except;
- TRY_CATCH (except, RETURN_MASK_ERROR)
- {
- write_psymtabs_to_index (objfile, arg);
- }
- if (except.reason < 0)
- exception_fprintf (gdb_stderr, except,
- _("Error while writing index for `%s': "),
- objfile_name (objfile));
- }
- }
- }
- int dwarf2_always_disassemble;
- static void
- show_dwarf2_always_disassemble (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- fprintf_filtered (file,
- _("Whether to always disassemble "
- "DWARF expressions is %s.\n"),
- value);
- }
- static void
- show_check_physname (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- fprintf_filtered (file,
- _("Whether to check \"physname\" is %s.\n"),
- value);
- }
- void _initialize_dwarf2_read (void);
- void
- _initialize_dwarf2_read (void)
- {
- struct cmd_list_element *c;
- dwarf2_objfile_data_key
- = register_objfile_data_with_cleanup (NULL, dwarf2_per_objfile_free);
- add_prefix_cmd ("dwarf2", class_maintenance, set_dwarf2_cmd, _("\
- Set DWARF 2 specific variables.\n\
- Configure DWARF 2 variables such as the cache size"),
- &set_dwarf2_cmdlist, "maintenance set dwarf2 ",
- 0, &maintenance_set_cmdlist);
- add_prefix_cmd ("dwarf2", class_maintenance, show_dwarf2_cmd, _("\
- Show DWARF 2 specific variables\n\
- Show DWARF 2 variables such as the cache size"),
- &show_dwarf2_cmdlist, "maintenance show dwarf2 ",
- 0, &maintenance_show_cmdlist);
- add_setshow_zinteger_cmd ("max-cache-age", class_obscure,
- &dwarf2_max_cache_age, _("\
- Set the upper bound on the age of cached dwarf2 compilation units."), _("\
- Show the upper bound on the age of cached dwarf2 compilation units."), _("\
- A higher limit means that cached compilation units will be stored\n\
- in memory longer, and more total memory will be used. Zero disables\n\
- caching, which can slow down startup."),
- NULL,
- show_dwarf2_max_cache_age,
- &set_dwarf2_cmdlist,
- &show_dwarf2_cmdlist);
- add_setshow_boolean_cmd ("always-disassemble", class_obscure,
- &dwarf2_always_disassemble, _("\
- Set whether `info address' always disassembles DWARF expressions."), _("\
- Show whether `info address' always disassembles DWARF expressions."), _("\
- When enabled, DWARF expressions are always printed in an assembly-like\n\
- syntax. When disabled, expressions will be printed in a more\n\
- conversational style, when possible."),
- NULL,
- show_dwarf2_always_disassemble,
- &set_dwarf2_cmdlist,
- &show_dwarf2_cmdlist);
- add_setshow_zuinteger_cmd ("dwarf2-read", no_class, &dwarf2_read_debug, _("\
- Set debugging of the dwarf2 reader."), _("\
- Show debugging of the dwarf2 reader."), _("\
- When enabled (non-zero), debugging messages are printed during dwarf2\n\
- reading and symtab expansion. A value of 1 (one) provides basic\n\
- information. A value greater than 1 provides more verbose information."),
- NULL,
- NULL,
- &setdebuglist, &showdebuglist);
- add_setshow_zuinteger_cmd ("dwarf2-die", no_class, &dwarf2_die_debug, _("\
- Set debugging of the dwarf2 DIE reader."), _("\
- Show debugging of the dwarf2 DIE reader."), _("\
- When enabled (non-zero), DIEs are dumped after they are read in.\n\
- The value is the maximum depth to print."),
- NULL,
- NULL,
- &setdebuglist, &showdebuglist);
- add_setshow_boolean_cmd ("check-physname", no_class, &check_physname, _("\
- Set cross-checking of \"physname\" code against demangler."), _("\
- Show cross-checking of \"physname\" code against demangler."), _("\
- When enabled, GDB's internal \"physname\" code is checked against\n\
- the demangler."),
- NULL, show_check_physname,
- &setdebuglist, &showdebuglist);
- add_setshow_boolean_cmd ("use-deprecated-index-sections",
- no_class, &use_deprecated_index_sections, _("\
- Set whether to use deprecated gdb_index sections."), _("\
- Show whether to use deprecated gdb_index sections."), _("\
- When enabled, deprecated .gdb_index sections are used anyway.\n\
- Normally they are ignored either because of a missing feature or\n\
- performance issue.\n\
- Warning: This option must be enabled before gdb reads the file."),
- NULL,
- NULL,
- &setlist, &showlist);
- c = add_cmd ("gdb-index", class_files, save_gdb_index_command,
- _("\
- Save a gdb-index file.\n\
- Usage: save gdb-index DIRECTORY"),
- &save_cmdlist);
- set_cmd_completer (c, filename_completer);
- dwarf2_locexpr_index = register_symbol_computed_impl (LOC_COMPUTED,
- &dwarf2_locexpr_funcs);
- dwarf2_loclist_index = register_symbol_computed_impl (LOC_COMPUTED,
- &dwarf2_loclist_funcs);
- dwarf2_locexpr_block_index = register_symbol_block_impl (LOC_BLOCK,
- &dwarf2_block_frame_base_locexpr_funcs);
- dwarf2_loclist_block_index = register_symbol_block_impl (LOC_BLOCK,
- &dwarf2_block_frame_base_loclist_funcs);
- }