* dwarf2read.c (struct dwarf2_per_objfile) <n_type_comp_units,
type_comp_units>: New fields. (dw2_get_cu): New function. (create_cus_from_index): Remove unused argument. (create_signatured_type_hash_from_index): New function. (create_addrmap_from_index): Update. (dwarf2_read_index): Handle version 2. (dw2_find_last_source_symtab, dw2_forget_cached_source_info) (dw2_lookup_symtab, dw2_do_expand_symtabs_matching) (dw2_print_stats, dw2_expand_all_symtabs) (dw2_expand_symtabs_with_filename, dw2_find_symbol_file) (dw2_expand_symtabs_matching, dw2_map_symbol_filenames): Update. (dwarf2_initialize_objfile): Call create_debug_types_hash_table. (allocate_signatured_type_hash_table): New function. (add_signatured_type_cu_to_list): Likewise. (create_debug_types_hash_table): Use them. Set type_comp_units. (read_signatured_type): Ensure section data is available. (add_address_entry): Don't record empty ranges. (struct signatured_type_index_data): New. (write_one_signatured_type): New function. (write_psymtabs_to_index): Write type CUs. (save_gdb_index_command): Update comment. (process_type_comp_unit): Move inititalization of from_debug_types... (create_debug_types_hash_table): ... here.
This commit is contained in:
parent
3a674486ec
commit
1fd400ffc4
|
@ -1,3 +1,31 @@
|
|||
2010-07-23 Tom Tromey <tromey@redhat.com>
|
||||
|
||||
* dwarf2read.c (struct dwarf2_per_objfile) <n_type_comp_units,
|
||||
type_comp_units>: New fields.
|
||||
(dw2_get_cu): New function.
|
||||
(create_cus_from_index): Remove unused argument.
|
||||
(create_signatured_type_hash_from_index): New function.
|
||||
(create_addrmap_from_index): Update.
|
||||
(dwarf2_read_index): Handle version 2.
|
||||
(dw2_find_last_source_symtab, dw2_forget_cached_source_info)
|
||||
(dw2_lookup_symtab, dw2_do_expand_symtabs_matching)
|
||||
(dw2_print_stats, dw2_expand_all_symtabs)
|
||||
(dw2_expand_symtabs_with_filename, dw2_find_symbol_file)
|
||||
(dw2_expand_symtabs_matching, dw2_map_symbol_filenames): Update.
|
||||
(dwarf2_initialize_objfile): Call create_debug_types_hash_table.
|
||||
(allocate_signatured_type_hash_table): New function.
|
||||
(add_signatured_type_cu_to_list): Likewise.
|
||||
(create_debug_types_hash_table): Use them. Set type_comp_units.
|
||||
(read_signatured_type): Ensure section data is available.
|
||||
(add_address_entry): Don't record empty ranges.
|
||||
(struct signatured_type_index_data): New.
|
||||
(write_one_signatured_type): New function.
|
||||
(write_psymtabs_to_index): Write type CUs.
|
||||
(save_gdb_index_command): Update comment.
|
||||
(process_type_comp_unit): Move inititalization of
|
||||
from_debug_types...
|
||||
(create_debug_types_hash_table): ... here.
|
||||
|
||||
2010-07-23 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb_gcore.sh (tmpfile): Remove the variable, its initialization,
|
||||
|
|
356
gdb/dwarf2read.c
356
gdb/dwarf2read.c
|
@ -180,6 +180,12 @@ struct dwarf2_per_objfile
|
|||
/* The number of compilation units in ALL_COMP_UNITS. */
|
||||
int n_comp_units;
|
||||
|
||||
/* The number of .debug_types-related CUs. */
|
||||
int n_type_comp_units;
|
||||
|
||||
/* The .debug_types-related CUs. */
|
||||
struct dwarf2_per_cu_data **type_comp_units;
|
||||
|
||||
/* A chain of compilation units that are currently read in, so that
|
||||
they can be freed later. */
|
||||
struct dwarf2_per_cu_data *read_in_chain;
|
||||
|
@ -1190,6 +1196,8 @@ static struct type *set_die_type (struct die_info *, struct type *,
|
|||
|
||||
static void create_all_comp_units (struct objfile *);
|
||||
|
||||
static int create_debug_types_hash_table (struct objfile *objfile);
|
||||
|
||||
static void load_full_comp_unit (struct dwarf2_per_cu_data *,
|
||||
struct objfile *);
|
||||
|
||||
|
@ -1227,6 +1235,8 @@ static gdb_byte *partial_read_comp_unit_head (struct comp_unit_head *header,
|
|||
static void init_cu_die_reader (struct die_reader_specs *reader,
|
||||
struct dwarf2_cu *cu);
|
||||
|
||||
static htab_t allocate_signatured_type_hash_table (struct objfile *objfile);
|
||||
|
||||
#if WORDS_BIGENDIAN
|
||||
|
||||
/* Convert VALUE between big- and little-endian. */
|
||||
|
@ -1603,6 +1613,18 @@ dw2_instantiate_symtab (struct objfile *objfile,
|
|||
return per_cu->v.quick->symtab;
|
||||
}
|
||||
|
||||
/* Return the CU given its index. */
|
||||
static struct dwarf2_per_cu_data *
|
||||
dw2_get_cu (int index)
|
||||
{
|
||||
if (index >= dwarf2_per_objfile->n_comp_units)
|
||||
{
|
||||
index -= dwarf2_per_objfile->n_comp_units;
|
||||
return dwarf2_per_objfile->type_comp_units[index];
|
||||
}
|
||||
return dwarf2_per_objfile->all_comp_units[index];
|
||||
}
|
||||
|
||||
/* A helper function that knows how to read a 64-bit value in a way
|
||||
that doesn't make gdb die. Returns 1 if the conversion went ok, 0
|
||||
otherwise. */
|
||||
|
@ -1629,11 +1651,10 @@ extract_cu_value (const char *bytes, ULONGEST *result)
|
|||
the CU objects for this objfile. Return 0 if something went wrong,
|
||||
1 if everything went ok. */
|
||||
static int
|
||||
create_cus_from_index (struct objfile *objfile, struct mapped_index *index,
|
||||
const gdb_byte *cu_list, offset_type cu_list_elements)
|
||||
create_cus_from_index (struct objfile *objfile, const gdb_byte *cu_list,
|
||||
offset_type cu_list_elements)
|
||||
{
|
||||
offset_type i;
|
||||
const char *entry;
|
||||
|
||||
dwarf2_per_objfile->n_comp_units = cu_list_elements / 2;
|
||||
dwarf2_per_objfile->all_comp_units
|
||||
|
@ -1664,6 +1685,58 @@ create_cus_from_index (struct objfile *objfile, struct mapped_index *index,
|
|||
return 1;
|
||||
}
|
||||
|
||||
/* Create the signatured type hash table from the index. */
|
||||
static int
|
||||
create_signatured_type_hash_from_index (struct objfile *objfile,
|
||||
const gdb_byte *bytes,
|
||||
offset_type elements)
|
||||
{
|
||||
offset_type i;
|
||||
htab_t type_hash;
|
||||
|
||||
dwarf2_per_objfile->n_type_comp_units = elements / 3;
|
||||
dwarf2_per_objfile->type_comp_units
|
||||
= obstack_alloc (&objfile->objfile_obstack,
|
||||
dwarf2_per_objfile->n_type_comp_units
|
||||
* sizeof (struct dwarf2_per_cu_data *));
|
||||
|
||||
type_hash = allocate_signatured_type_hash_table (objfile);
|
||||
|
||||
for (i = 0; i < elements; i += 3)
|
||||
{
|
||||
struct signatured_type *type_sig;
|
||||
ULONGEST offset, type_offset, signature;
|
||||
void **slot;
|
||||
|
||||
if (!extract_cu_value (bytes, &offset)
|
||||
|| !extract_cu_value (bytes + 8, &type_offset))
|
||||
return 0;
|
||||
signature = extract_unsigned_integer (bytes + 16, 8, BFD_ENDIAN_LITTLE);
|
||||
bytes += 3 * 8;
|
||||
|
||||
type_sig = OBSTACK_ZALLOC (&objfile->objfile_obstack,
|
||||
struct signatured_type);
|
||||
type_sig->signature = signature;
|
||||
type_sig->offset = offset;
|
||||
type_sig->type_offset = type_offset;
|
||||
type_sig->per_cu.from_debug_types = 1;
|
||||
type_sig->per_cu.offset = offset;
|
||||
type_sig->per_cu.objfile = objfile;
|
||||
type_sig->per_cu.v.quick
|
||||
= OBSTACK_ZALLOC (&objfile->objfile_obstack,
|
||||
struct dwarf2_per_cu_quick_data);
|
||||
|
||||
slot = htab_find_slot (type_hash, type_sig, INSERT);
|
||||
*slot = type_sig;
|
||||
|
||||
dwarf2_per_objfile->type_comp_units[i / 3] = &type_sig->per_cu;
|
||||
}
|
||||
|
||||
dwarf2_per_objfile->signatured_types = type_hash;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Read the address map data from the mapped index, and use it to
|
||||
populate the objfile's psymtabs_addrmap. */
|
||||
static void
|
||||
|
@ -1695,7 +1768,7 @@ create_addrmap_from_index (struct objfile *objfile, struct mapped_index *index)
|
|||
iter += 4;
|
||||
|
||||
addrmap_set_empty (mutable_map, lo + baseaddr, hi + baseaddr - 1,
|
||||
dwarf2_per_objfile->all_comp_units[cu_index]);
|
||||
dw2_get_cu (cu_index));
|
||||
}
|
||||
|
||||
objfile->psymtabs_addrmap = addrmap_create_fixed (mutable_map,
|
||||
|
@ -1762,8 +1835,9 @@ dwarf2_read_index (struct objfile *objfile)
|
|||
char *addr;
|
||||
struct mapped_index *map;
|
||||
offset_type *metadata;
|
||||
const gdb_byte *cu_list;
|
||||
offset_type cu_list_elements;
|
||||
const gdb_byte *cu_list, *types_list;
|
||||
offset_type version, cu_list_elements, types_list_elements;
|
||||
int i;
|
||||
|
||||
if (dwarf2_per_objfile->gdb_index.asection == NULL
|
||||
|| dwarf2_per_objfile->gdb_index.size == 0)
|
||||
|
@ -1772,26 +1846,58 @@ dwarf2_read_index (struct objfile *objfile)
|
|||
|
||||
addr = dwarf2_per_objfile->gdb_index.buffer;
|
||||
/* Version check. */
|
||||
if (MAYBE_SWAP (*(offset_type *) addr) != 1)
|
||||
version = MAYBE_SWAP (*(offset_type *) addr);
|
||||
if (version == 1)
|
||||
{
|
||||
/* Index version 1 neglected to account for .debug_types. So,
|
||||
if we see .debug_types, we cannot use this index. */
|
||||
if (dwarf2_per_objfile->types.asection != NULL
|
||||
&& dwarf2_per_objfile->types.size != 0)
|
||||
return 0;
|
||||
}
|
||||
else if (version != 2)
|
||||
return 0;
|
||||
|
||||
map = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct mapped_index);
|
||||
map->total_size = dwarf2_per_objfile->gdb_index.size;
|
||||
|
||||
metadata = (offset_type *) (addr + sizeof (offset_type));
|
||||
cu_list = addr + MAYBE_SWAP (metadata[0]);
|
||||
cu_list_elements = ((MAYBE_SWAP (metadata[1]) - MAYBE_SWAP (metadata[0]))
|
||||
/ 8);
|
||||
map->address_table = addr + MAYBE_SWAP (metadata[1]);
|
||||
map->address_table_size = (MAYBE_SWAP (metadata[2])
|
||||
- MAYBE_SWAP (metadata[1]));
|
||||
map->index_table = (offset_type *) (addr + MAYBE_SWAP (metadata[2]));
|
||||
map->index_table_slots = ((MAYBE_SWAP (metadata[3])
|
||||
- MAYBE_SWAP (metadata[2]))
|
||||
/ (2 * sizeof (offset_type)));
|
||||
map->constant_pool = addr + MAYBE_SWAP (metadata[3]);
|
||||
|
||||
if (!create_cus_from_index (objfile, map, cu_list, cu_list_elements))
|
||||
i = 0;
|
||||
cu_list = addr + MAYBE_SWAP (metadata[i]);
|
||||
cu_list_elements = ((MAYBE_SWAP (metadata[i + 1]) - MAYBE_SWAP (metadata[i]))
|
||||
/ 8);
|
||||
++i;
|
||||
|
||||
if (version == 2)
|
||||
{
|
||||
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->index_table = (offset_type *) (addr + MAYBE_SWAP (metadata[i]));
|
||||
map->index_table_slots = ((MAYBE_SWAP (metadata[i + 1])
|
||||
- MAYBE_SWAP (metadata[i]))
|
||||
/ (2 * sizeof (offset_type)));
|
||||
++i;
|
||||
|
||||
map->constant_pool = addr + MAYBE_SWAP (metadata[i]);
|
||||
|
||||
if (!create_cus_from_index (objfile, cu_list, cu_list_elements))
|
||||
return 0;
|
||||
|
||||
if (version == 2
|
||||
&& types_list_elements
|
||||
&& !create_signatured_type_hash_from_index (objfile, types_list,
|
||||
types_list_elements))
|
||||
return 0;
|
||||
|
||||
create_addrmap_from_index (objfile, map);
|
||||
|
@ -1918,8 +2024,7 @@ dw2_find_last_source_symtab (struct objfile *objfile)
|
|||
int index;
|
||||
dw2_setup (objfile);
|
||||
index = dwarf2_per_objfile->n_comp_units - 1;
|
||||
return dw2_instantiate_symtab (objfile,
|
||||
dwarf2_per_objfile->all_comp_units[index]);
|
||||
return dw2_instantiate_symtab (objfile, dw2_get_cu (index));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1928,9 +2033,10 @@ dw2_forget_cached_source_info (struct objfile *objfile)
|
|||
int i;
|
||||
|
||||
dw2_setup (objfile);
|
||||
for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
|
||||
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
|
||||
+ dwarf2_per_objfile->n_type_comp_units); ++i)
|
||||
{
|
||||
struct dwarf2_per_cu_data *cu = dwarf2_per_objfile->all_comp_units[i];
|
||||
struct dwarf2_per_cu_data *cu = dw2_get_cu (i);
|
||||
|
||||
if (cu->v.quick->full_names)
|
||||
{
|
||||
|
@ -1952,10 +2058,11 @@ dw2_lookup_symtab (struct objfile *objfile, const char *name,
|
|||
struct dwarf2_per_cu_data *base_cu = NULL;
|
||||
|
||||
dw2_setup (objfile);
|
||||
for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
|
||||
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
|
||||
+ dwarf2_per_objfile->n_type_comp_units); ++i)
|
||||
{
|
||||
int j;
|
||||
struct dwarf2_per_cu_data *cu = dwarf2_per_objfile->all_comp_units[i];
|
||||
struct dwarf2_per_cu_data *cu = dw2_get_cu (i);
|
||||
|
||||
if (cu->v.quick->symtab)
|
||||
continue;
|
||||
|
@ -2047,8 +2154,8 @@ dw2_do_expand_symtabs_matching (struct objfile *objfile, const char *name)
|
|||
for (i = 0; i < len; ++i)
|
||||
{
|
||||
offset_type cu_index = MAYBE_SWAP (vec[i + 1]);
|
||||
struct dwarf2_per_cu_data *cu;
|
||||
cu = dwarf2_per_objfile->all_comp_units[cu_index];
|
||||
struct dwarf2_per_cu_data *cu = dw2_get_cu (cu_index);
|
||||
|
||||
dw2_instantiate_symtab (objfile, cu);
|
||||
}
|
||||
}
|
||||
|
@ -2070,9 +2177,10 @@ dw2_print_stats (struct objfile *objfile)
|
|||
|
||||
dw2_setup (objfile);
|
||||
count = 0;
|
||||
for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
|
||||
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
|
||||
+ dwarf2_per_objfile->n_type_comp_units); ++i)
|
||||
{
|
||||
struct dwarf2_per_cu_data *cu = dwarf2_per_objfile->all_comp_units[i];
|
||||
struct dwarf2_per_cu_data *cu = dw2_get_cu (i);
|
||||
|
||||
if (!cu->v.quick->symtab)
|
||||
++count;
|
||||
|
@ -2106,9 +2214,11 @@ dw2_expand_all_symtabs (struct objfile *objfile)
|
|||
int i;
|
||||
|
||||
dw2_setup (objfile);
|
||||
for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
|
||||
|
||||
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
|
||||
+ dwarf2_per_objfile->n_type_comp_units); ++i)
|
||||
{
|
||||
struct dwarf2_per_cu_data *cu = dwarf2_per_objfile->all_comp_units[i];
|
||||
struct dwarf2_per_cu_data *cu = dw2_get_cu (i);
|
||||
|
||||
dw2_instantiate_symtab (objfile, cu);
|
||||
}
|
||||
|
@ -2121,10 +2231,11 @@ dw2_expand_symtabs_with_filename (struct objfile *objfile,
|
|||
int i;
|
||||
|
||||
dw2_setup (objfile);
|
||||
for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
|
||||
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
|
||||
+ dwarf2_per_objfile->n_type_comp_units); ++i)
|
||||
{
|
||||
int j;
|
||||
struct dwarf2_per_cu_data *cu = dwarf2_per_objfile->all_comp_units[i];
|
||||
struct dwarf2_per_cu_data *cu = dw2_get_cu (i);
|
||||
|
||||
if (cu->v.quick->symtab)
|
||||
continue;
|
||||
|
@ -2165,7 +2276,7 @@ dw2_find_symbol_file (struct objfile *objfile, const char *name)
|
|||
should be rewritten so that it doesn't require a custom hook. It
|
||||
could just use the ordinary symbol tables. */
|
||||
/* vec[0] is the length, which must always be >0. */
|
||||
cu = dwarf2_per_objfile->all_comp_units[MAYBE_SWAP (vec[1])];
|
||||
cu = dw2_get_cu (MAYBE_SWAP (vec[1]));
|
||||
|
||||
dw2_require_line_header (objfile, cu);
|
||||
if (!cu->v.quick->lines)
|
||||
|
@ -2204,10 +2315,11 @@ dw2_expand_symtabs_matching (struct objfile *objfile,
|
|||
if (!dwarf2_per_objfile->index_table)
|
||||
return;
|
||||
|
||||
for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
|
||||
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
|
||||
+ dwarf2_per_objfile->n_type_comp_units); ++i)
|
||||
{
|
||||
int j;
|
||||
struct dwarf2_per_cu_data *cu = dwarf2_per_objfile->all_comp_units[i];
|
||||
struct dwarf2_per_cu_data *cu = dw2_get_cu (i);
|
||||
|
||||
cu->v.quick->mark = 0;
|
||||
if (cu->v.quick->symtab)
|
||||
|
@ -2252,8 +2364,9 @@ dw2_expand_symtabs_matching (struct objfile *objfile,
|
|||
vec_len = MAYBE_SWAP (vec[0]);
|
||||
for (vec_idx = 0; vec_idx < vec_len; ++vec_idx)
|
||||
{
|
||||
struct dwarf2_per_cu_data *cu
|
||||
= dwarf2_per_objfile->all_comp_units[MAYBE_SWAP (vec[vec_idx + 1])];
|
||||
struct dwarf2_per_cu_data *cu;
|
||||
|
||||
cu = dw2_get_cu (MAYBE_SWAP (vec[vec_idx + 1]));
|
||||
if (cu->v.quick->mark)
|
||||
dw2_instantiate_symtab (objfile, cu);
|
||||
}
|
||||
|
@ -2323,10 +2436,11 @@ dw2_map_symbol_filenames (struct objfile *objfile,
|
|||
int i;
|
||||
|
||||
dw2_setup (objfile);
|
||||
for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
|
||||
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
|
||||
+ dwarf2_per_objfile->n_type_comp_units); ++i)
|
||||
{
|
||||
int j;
|
||||
struct dwarf2_per_cu_data *cu = dwarf2_per_objfile->all_comp_units[i];
|
||||
struct dwarf2_per_cu_data *cu = dw2_get_cu (i);
|
||||
|
||||
if (cu->v.quick->symtab)
|
||||
continue;
|
||||
|
@ -2387,10 +2501,12 @@ dwarf2_initialize_objfile (struct objfile *objfile)
|
|||
|
||||
dwarf2_per_objfile->using_index = 1;
|
||||
create_all_comp_units (objfile);
|
||||
create_debug_types_hash_table (objfile);
|
||||
|
||||
for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
|
||||
for (i = 0; i < (dwarf2_per_objfile->n_comp_units
|
||||
+ dwarf2_per_objfile->n_type_comp_units); ++i)
|
||||
{
|
||||
struct dwarf2_per_cu_data *cu = dwarf2_per_objfile->all_comp_units[i];
|
||||
struct dwarf2_per_cu_data *cu = dw2_get_cu (i);
|
||||
|
||||
cu->v.quick = OBSTACK_ZALLOC (&objfile->objfile_obstack,
|
||||
struct dwarf2_per_cu_quick_data);
|
||||
|
@ -2604,6 +2720,34 @@ eq_type_signature (const void *item_lhs, const void *item_rhs)
|
|||
return lhs->signature == rhs->signature;
|
||||
}
|
||||
|
||||
/* Allocate a hash table for signatured types. */
|
||||
|
||||
static htab_t
|
||||
allocate_signatured_type_hash_table (struct objfile *objfile)
|
||||
{
|
||||
return htab_create_alloc_ex (41,
|
||||
hash_type_signature,
|
||||
eq_type_signature,
|
||||
NULL,
|
||||
&objfile->objfile_obstack,
|
||||
hashtab_obstack_allocate,
|
||||
dummy_obstack_deallocate);
|
||||
}
|
||||
|
||||
/* A helper function to add a signatured type CU to a list. */
|
||||
|
||||
static int
|
||||
add_signatured_type_cu_to_list (void **slot, void *datum)
|
||||
{
|
||||
struct signatured_type *sigt = *slot;
|
||||
struct dwarf2_per_cu_data ***datap = datum;
|
||||
|
||||
**datap = &sigt->per_cu;
|
||||
++*datap;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Create the hash table of all entries in the .debug_types section.
|
||||
The result is zero if there is an error (e.g. missing .debug_types section),
|
||||
otherwise non-zero. */
|
||||
|
@ -2613,6 +2757,7 @@ create_debug_types_hash_table (struct objfile *objfile)
|
|||
{
|
||||
gdb_byte *info_ptr;
|
||||
htab_t types_htab;
|
||||
struct dwarf2_per_cu_data **iter;
|
||||
|
||||
dwarf2_read_section (objfile, &dwarf2_per_objfile->types);
|
||||
info_ptr = dwarf2_per_objfile->types.buffer;
|
||||
|
@ -2623,13 +2768,7 @@ create_debug_types_hash_table (struct objfile *objfile)
|
|||
return 0;
|
||||
}
|
||||
|
||||
types_htab = htab_create_alloc_ex (41,
|
||||
hash_type_signature,
|
||||
eq_type_signature,
|
||||
NULL,
|
||||
&objfile->objfile_obstack,
|
||||
hashtab_obstack_allocate,
|
||||
dummy_obstack_deallocate);
|
||||
types_htab = allocate_signatured_type_hash_table (objfile);
|
||||
|
||||
if (dwarf2_die_debug)
|
||||
fprintf_unfiltered (gdb_stdlog, "Signatured types:\n");
|
||||
|
@ -2677,6 +2816,7 @@ create_debug_types_hash_table (struct objfile *objfile)
|
|||
type_sig->offset = offset;
|
||||
type_sig->type_offset = type_offset;
|
||||
type_sig->per_cu.objfile = objfile;
|
||||
type_sig->per_cu.from_debug_types = 1;
|
||||
|
||||
slot = htab_find_slot (types_htab, type_sig, INSERT);
|
||||
gdb_assert (slot != NULL);
|
||||
|
@ -2691,6 +2831,16 @@ create_debug_types_hash_table (struct objfile *objfile)
|
|||
|
||||
dwarf2_per_objfile->signatured_types = types_htab;
|
||||
|
||||
dwarf2_per_objfile->n_type_comp_units = htab_elements (types_htab);
|
||||
dwarf2_per_objfile->type_comp_units
|
||||
= obstack_alloc (&objfile->objfile_obstack,
|
||||
dwarf2_per_objfile->n_type_comp_units
|
||||
* sizeof (struct dwarf2_per_cu_data *));
|
||||
iter = &dwarf2_per_objfile->type_comp_units[0];
|
||||
htab_traverse_noresize (types_htab, add_signatured_type_cu_to_list, &iter);
|
||||
gdb_assert (iter - &dwarf2_per_objfile->type_comp_units[0]
|
||||
== dwarf2_per_objfile->n_type_comp_units);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -2959,7 +3109,6 @@ process_type_comp_unit (void **slot, void *info)
|
|||
struct dwarf2_per_cu_data *this_cu;
|
||||
|
||||
this_cu = &entry->per_cu;
|
||||
this_cu->from_debug_types = 1;
|
||||
|
||||
gdb_assert (dwarf2_per_objfile->types.readin);
|
||||
process_psymtab_comp_unit (objfile, this_cu,
|
||||
|
@ -12067,13 +12216,16 @@ static void
|
|||
read_signatured_type (struct objfile *objfile,
|
||||
struct signatured_type *type_sig)
|
||||
{
|
||||
gdb_byte *types_ptr = dwarf2_per_objfile->types.buffer + type_sig->offset;
|
||||
gdb_byte *types_ptr;
|
||||
struct die_reader_specs reader_specs;
|
||||
struct dwarf2_cu *cu;
|
||||
ULONGEST signature;
|
||||
struct cleanup *back_to, *free_cu_cleanup;
|
||||
struct attribute *attr;
|
||||
|
||||
dwarf2_read_section (objfile, &dwarf2_per_objfile->types);
|
||||
types_ptr = dwarf2_per_objfile->types.buffer + type_sig->offset;
|
||||
|
||||
gdb_assert (type_sig->per_cu.cu == NULL);
|
||||
|
||||
cu = xmalloc (sizeof (struct dwarf2_cu));
|
||||
|
@ -13912,6 +14064,10 @@ add_address_entry (struct objfile *objfile,
|
|||
char addr[8];
|
||||
CORE_ADDR baseaddr;
|
||||
|
||||
/* Don't bother recording empty ranges. */
|
||||
if (pst->textlow == pst->texthigh)
|
||||
return;
|
||||
|
||||
baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
|
||||
|
||||
store_unsigned_integer (addr, 8, BFD_ENDIAN_LITTLE, pst->textlow - baseaddr);
|
||||
|
@ -13957,13 +14113,53 @@ unlink_if_set (void *p)
|
|||
unlink (*filename);
|
||||
}
|
||||
|
||||
/* A helper struct used when iterating over debug_types. */
|
||||
struct signatured_type_index_data
|
||||
{
|
||||
struct objfile *objfile;
|
||||
struct mapped_symtab *symtab;
|
||||
struct obstack *types_list;
|
||||
int cu_index;
|
||||
};
|
||||
|
||||
/* A helper function that writes a single signatured_type to an
|
||||
obstack. */
|
||||
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 dwarf2_per_cu_data *cu = &entry->per_cu;
|
||||
struct partial_symtab *psymtab = cu->v.psymtab;
|
||||
gdb_byte val[8];
|
||||
|
||||
write_psymbols (info->symtab,
|
||||
info->objfile->global_psymbols.list + psymtab->globals_offset,
|
||||
psymtab->n_global_syms, info->cu_index);
|
||||
write_psymbols (info->symtab,
|
||||
info->objfile->static_psymbols.list + psymtab->statics_offset,
|
||||
psymtab->n_static_syms, info->cu_index);
|
||||
|
||||
store_unsigned_integer (val, 8, BFD_ENDIAN_LITTLE, entry->offset);
|
||||
obstack_grow (info->types_list, val, 8);
|
||||
store_unsigned_integer (val, 8, BFD_ENDIAN_LITTLE, entry->type_offset);
|
||||
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;
|
||||
}
|
||||
|
||||
/* Create an index file for OBJFILE in the directory DIR. */
|
||||
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, cu_list;
|
||||
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;
|
||||
|
@ -13999,6 +14195,12 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir)
|
|||
obstack_init (&cu_list);
|
||||
make_cleanup_obstack_free (&cu_list);
|
||||
|
||||
obstack_init (&types_cu_list);
|
||||
make_cleanup_obstack_free (&types_cu_list);
|
||||
|
||||
/* The list is already sorted, so we don't need to do additional
|
||||
work here. Also, the debug_types entries do not appear in
|
||||
all_comp_units, but only in their own hash table. */
|
||||
for (i = 0; i < dwarf2_per_objfile->n_comp_units; ++i)
|
||||
{
|
||||
struct dwarf2_per_cu_data *cu = dwarf2_per_objfile->all_comp_units[i];
|
||||
|
@ -14020,6 +14222,19 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir)
|
|||
obstack_grow (&cu_list, val, 8);
|
||||
}
|
||||
|
||||
/* Write out the .debug_type entries, if any. */
|
||||
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.cu_index = dwarf2_per_objfile->n_comp_units;
|
||||
htab_traverse_noresize (dwarf2_per_objfile->signatured_types,
|
||||
write_one_signatured_type, &sig_data);
|
||||
}
|
||||
|
||||
obstack_init (&constant_pool);
|
||||
make_cleanup_obstack_free (&constant_pool);
|
||||
obstack_init (&symtab_obstack);
|
||||
|
@ -14028,11 +14243,11 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir)
|
|||
|
||||
obstack_init (&contents);
|
||||
make_cleanup_obstack_free (&contents);
|
||||
size_of_contents = 5 * sizeof (offset_type);
|
||||
size_of_contents = 6 * sizeof (offset_type);
|
||||
total_len = size_of_contents;
|
||||
|
||||
/* The version number. */
|
||||
val = MAYBE_SWAP (1);
|
||||
val = MAYBE_SWAP (2);
|
||||
obstack_grow (&contents, &val, sizeof (val));
|
||||
|
||||
/* The offset of the CU list from the start of the file. */
|
||||
|
@ -14040,6 +14255,11 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir)
|
|||
obstack_grow (&contents, &val, sizeof (val));
|
||||
total_len += obstack_object_size (&cu_list);
|
||||
|
||||
/* The offset of the types CU list from the start of the file. */
|
||||
val = MAYBE_SWAP (total_len);
|
||||
obstack_grow (&contents, &val, sizeof (val));
|
||||
total_len += obstack_object_size (&types_cu_list);
|
||||
|
||||
/* The offset of the address table from the start of the file. */
|
||||
val = MAYBE_SWAP (total_len);
|
||||
obstack_grow (&contents, &val, sizeof (val));
|
||||
|
@ -14059,6 +14279,7 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir)
|
|||
|
||||
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);
|
||||
|
@ -14083,18 +14304,33 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir)
|
|||
|
||||
1. The file header. This is a sequence of values, of offset_type
|
||||
unless otherwise noted:
|
||||
[0] The version number. Currently 1.
|
||||
[0] The version number. Currently 1 or 2. The differences are
|
||||
noted below. Version 1 did not account for .debug_types sections;
|
||||
the presence of a .debug_types section invalidates any version 1
|
||||
index that may exist.
|
||||
[1] The offset, from the start of the file, of the CU list.
|
||||
[1.5] In version 2, the offset, from the start of the file, of the
|
||||
types CU list. This offset does not appear in version 1. Note
|
||||
that this can be empty, in which case this offset will be equal to
|
||||
the next offset.
|
||||
[2] The offset, from the start of the file, of the address section.
|
||||
[3] The offset, from the start of the file, of the symbol table.
|
||||
[4] The offset, from the start of the file, of the constant pool.
|
||||
|
||||
2. The CU list. This is a sequence of pairs of 64-bit
|
||||
little-endian values. The first element in each pair is the offset
|
||||
of a CU in the .debug_info section. The second element in each
|
||||
pair is the length of that CU. References to a CU elsewhere in the
|
||||
map are done using a CU index, which is just the 0-based index into
|
||||
this table.
|
||||
little-endian values, sorted by the CU offset. The first element
|
||||
in each pair is the offset of a CU in the .debug_info section. The
|
||||
second element in each pair is the length of that CU. References
|
||||
to a CU elsewhere in the map are done using a CU index, which is
|
||||
just the 0-based index into this table. Note that if there are
|
||||
type CUs, then conceptually CUs and type CUs form a single list for
|
||||
the purposes of CU indices.
|
||||
|
||||
2.5 The types CU list. This does not appear in a version 1 index.
|
||||
This is a sequence of triplets of 64-bit little-endian values. In
|
||||
a triplet, the first value is the CU offset, the second value is
|
||||
the type offset in the CU, and the third value is the type
|
||||
signature. The types CU list is not sorted.
|
||||
|
||||
3. The address section. The address section consists of a sequence
|
||||
of address entries. Each address entry has three elements.
|
||||
|
|
Loading…
Reference in New Issue