Initial support for Fission. http://gcc.gnu.org/wiki/DebugFission
* symfile.c (default_symfile_relocate): Use sectp->owner instead of objfile->obfd. * symfile.h (dwarf2_debug_sections): New member addr. * dwarf2expr.c (execute_stack_op): New case DW_OP_GNU_addr_index. (ctx_no_get_addr_index): New function. * dwarf2expr.h (dwarf_expr_context_funcs): New member get_addr_index. (ctx_no_get_addr_index): Declare. * dwarf2-frame.c (dwarf2_frame_ctx_funcs): Update. * dwarf2loc.c (dwarf_expr_get_addr_index): New function. (dwarf_expr_ctx_funcs): Update. (needs_get_addr_index): New function. (needs_frame_ctx_funcs): Update. * dwarf2loc.h (dwarf2_read_addr_index): Declare. * dwarf2read.c: #include "gdbcore.h". (dwarf2_per_objfile): New members addr, dwo_files. (dwarf2_elf_names): Add entry for addr. (struct dwo_section_names): New type. (dwo_section_names): New static global. (dwarf2_cu): New members dwo_unit, addr_base, have_addr_base. (dwarf2_per_cu_data): New member is_debug_types, all boolean uses of old debug_types_section member updated to use this. Rename member debug_types_section to info_or_types_section, all uses updated. (signatured_type): Rename member type_offset to type_offset_in_tu, all uses updated. New member type_offset_in_section. (struct dwo_sections): New type. (struct dwo_unit): New type. (struct dwo_file): New type. (die_reader_specs): New member dwo_file. (dwarf2_locate_sections): Watch for .debug_addr. (zlib_decompress_section): Use sectp->owner instead of objfile->obfd. (dwarf2_read_section): Get bfd of section from bfd's asection, instead of objfile. (create_cus_from_index): Initialize the_cu->info_or_types_section. (create_signatured_type_table_from_index): Initialize sig_type->info_or_types_section. (dw2_get_file_names): Statement lists for type units with DWO files live in the DWO file. (create_debug_types_hash_table): New function. (create_all_type_units): Rewrite. (init_cu_die_reader): New arg dwo_file, all callers updated. (init_and_read_dies_worker): Get section from this_cu->info_or_types_section. Set sig_type->type_offset_in_section. Watch for DW_AT_GNU_dwo_name and if present lookup the file and continue reading the CU/TU from there. (init_cutu_and_read_dies_no_follow): New arg dwo_file, all callers updated. Get section from this_cu->info_or_types_section. (create_all_comp_units): Initialize this_cu->info_or_types_section. (skip_one_die): New cases DW_FORM_GNU_addr_index, DW_FORM_GNU_str_index. (hash_dwo_file, eq_dwo_file): New functions. (allocate_dwo_file_hash_table): New function. (hash_dwo_unit, eq_dwo_unit): New functions. (allocate_dwo_unit_table): New function. (dwarf2_locate_dwo_sections): New function. (struct create_dwo_info_table_data): New type. (create_debug_info_hash_table_reader): New function. (create_debug_info_hash_table): New function. (try_open_dwo_file, open_dwo_file, init_dwo_file): New function. (lookup_dwo_file): New function. (lookup_dwo_comp_unit, lookup_dwo_type_unit): New functions. (free_dwo_file, free_dwo_file_cleanup): New functions. (free_dwo_file_from_slot, free_dwo_files): New functions. (dwarf2_get_pc_bounds): Handle DW_FORM_GNU_addr_index. (dwarf2_record_block_ranges): Ditto. (read_partial_die): Ditto. (process_enumeration_scope): Update to use type_offset_in_section. (read_full_die_1): New function. (read_full_die): Rewrite. (read_attribute_value): New cases DW_FORM_GNU_addr_index, DW_FORM_GNU_str_index. (read_addr_index_1, read_addr_index): New functions. (read_addr_index_from_leb128): New function. (struct dwarf2_read_addr_index_data): New type. (dwarf2_read_addr_index_reader): New function. (dwarf2_read_addr_index): New function. (read_str_index): New function. (leb128_size): New function. (dwarf_decode_line_header): Delete arg abfd, all callers updated. If processing a type unit from a DWO file, get the line section from the DWO file. (var_decode_location): Watch for DW_OP_GNU_addr_index. (dwarf2_const_value_attr): New cases DW_FORM_GNU_addr_index, DW_FORM_GNU_str_index. (lookup_die_type): Check whether section offset of type's die is known before looking it up. Remove assert. Condition can legimately happen for inter-cu type references. (dwarf_attr_name): Handle Fission attributes. (dwarf_form_name): Handle Fission forms. (dump_die_shallow): New cases DW_FORM_GNU_addr_index, DW_FORM_GNU_str_index. (follow_die_sig): Update to use type_offset_in_section. (decode_locdesc): New case DW_OP_GNU_addr_index. (skip_form_bytes): New cases DW_FORM_GNU_addr_index, DW_FORM_GNU_str_index. (cu_debug_loc_section): New function. (fill_in_loclist_baton, dwarf2_symbol_mark_computed): Call it. (dwarf2_per_objfile_free): Unmap .debug_addr section. Free DWO files if present. * xcoffread.c (dwarf2_xcoff_names): Add .debug_addr. testsuite/ * gdb.dwarf2/dw2-intercu.S (.Ltype_int2_in_cu2): Renamed from .Ltype_int_in_cu2. Use name "int2" instead of "int". All uses updated. * gdb.dwarf2/dw2-intercu.exp: Add "ptype int2" ahead of "ptype func_cu1" to expand cu2 before cu1.
This commit is contained in:
parent
dee91e82ae
commit
3019eac3a2
102
gdb/ChangeLog
102
gdb/ChangeLog
@ -1,5 +1,107 @@
|
||||
2012-04-28 Doug Evans <dje@google.com>
|
||||
|
||||
Initial support for Fission. http://gcc.gnu.org/wiki/DebugFission
|
||||
* symfile.c (default_symfile_relocate): Use sectp->owner instead of
|
||||
objfile->obfd.
|
||||
* symfile.h (dwarf2_debug_sections): New member addr.
|
||||
* dwarf2expr.c (execute_stack_op): New case DW_OP_GNU_addr_index.
|
||||
(ctx_no_get_addr_index): New function.
|
||||
* dwarf2expr.h (dwarf_expr_context_funcs): New member get_addr_index.
|
||||
(ctx_no_get_addr_index): Declare.
|
||||
* dwarf2-frame.c (dwarf2_frame_ctx_funcs): Update.
|
||||
* dwarf2loc.c (dwarf_expr_get_addr_index): New function.
|
||||
(dwarf_expr_ctx_funcs): Update.
|
||||
(needs_get_addr_index): New function.
|
||||
(needs_frame_ctx_funcs): Update.
|
||||
* dwarf2loc.h (dwarf2_read_addr_index): Declare.
|
||||
* dwarf2read.c: #include "gdbcore.h".
|
||||
(dwarf2_per_objfile): New members addr, dwo_files.
|
||||
(dwarf2_elf_names): Add entry for addr.
|
||||
(struct dwo_section_names): New type.
|
||||
(dwo_section_names): New static global.
|
||||
(dwarf2_cu): New members dwo_unit, addr_base, have_addr_base.
|
||||
(dwarf2_per_cu_data): New member is_debug_types, all boolean uses of
|
||||
old debug_types_section member updated to use this.
|
||||
Rename member debug_types_section to info_or_types_section,
|
||||
all uses updated.
|
||||
(signatured_type): Rename member type_offset to type_offset_in_tu,
|
||||
all uses updated. New member type_offset_in_section.
|
||||
(struct dwo_sections): New type.
|
||||
(struct dwo_unit): New type.
|
||||
(struct dwo_file): New type.
|
||||
(die_reader_specs): New member dwo_file.
|
||||
(dwarf2_locate_sections): Watch for .debug_addr.
|
||||
(zlib_decompress_section): Use sectp->owner instead of objfile->obfd.
|
||||
(dwarf2_read_section): Get bfd of section from bfd's asection,
|
||||
instead of objfile.
|
||||
(create_cus_from_index): Initialize the_cu->info_or_types_section.
|
||||
(create_signatured_type_table_from_index): Initialize
|
||||
sig_type->info_or_types_section.
|
||||
(dw2_get_file_names): Statement lists for type units with DWO files
|
||||
live in the DWO file.
|
||||
(create_debug_types_hash_table): New function.
|
||||
(create_all_type_units): Rewrite.
|
||||
(init_cu_die_reader): New arg dwo_file, all callers updated.
|
||||
(init_and_read_dies_worker): Get section from
|
||||
this_cu->info_or_types_section. Set sig_type->type_offset_in_section.
|
||||
Watch for DW_AT_GNU_dwo_name and if present lookup the file and
|
||||
continue reading the CU/TU from there.
|
||||
(init_cutu_and_read_dies_no_follow): New arg dwo_file, all callers
|
||||
updated. Get section from this_cu->info_or_types_section.
|
||||
(create_all_comp_units): Initialize this_cu->info_or_types_section.
|
||||
(skip_one_die): New cases DW_FORM_GNU_addr_index,
|
||||
DW_FORM_GNU_str_index.
|
||||
(hash_dwo_file, eq_dwo_file): New functions.
|
||||
(allocate_dwo_file_hash_table): New function.
|
||||
(hash_dwo_unit, eq_dwo_unit): New functions.
|
||||
(allocate_dwo_unit_table): New function.
|
||||
(dwarf2_locate_dwo_sections): New function.
|
||||
(struct create_dwo_info_table_data): New type.
|
||||
(create_debug_info_hash_table_reader): New function.
|
||||
(create_debug_info_hash_table): New function.
|
||||
(try_open_dwo_file, open_dwo_file, init_dwo_file): New function.
|
||||
(lookup_dwo_file): New function.
|
||||
(lookup_dwo_comp_unit, lookup_dwo_type_unit): New functions.
|
||||
(free_dwo_file, free_dwo_file_cleanup): New functions.
|
||||
(free_dwo_file_from_slot, free_dwo_files): New functions.
|
||||
(dwarf2_get_pc_bounds): Handle DW_FORM_GNU_addr_index.
|
||||
(dwarf2_record_block_ranges): Ditto.
|
||||
(read_partial_die): Ditto.
|
||||
(process_enumeration_scope): Update to use type_offset_in_section.
|
||||
(read_full_die_1): New function.
|
||||
(read_full_die): Rewrite.
|
||||
(read_attribute_value): New cases DW_FORM_GNU_addr_index,
|
||||
DW_FORM_GNU_str_index.
|
||||
(read_addr_index_1, read_addr_index): New functions.
|
||||
(read_addr_index_from_leb128): New function.
|
||||
(struct dwarf2_read_addr_index_data): New type.
|
||||
(dwarf2_read_addr_index_reader): New function.
|
||||
(dwarf2_read_addr_index): New function.
|
||||
(read_str_index): New function.
|
||||
(leb128_size): New function.
|
||||
(dwarf_decode_line_header): Delete arg abfd, all callers updated.
|
||||
If processing a type unit from a DWO file, get the line section
|
||||
from the DWO file.
|
||||
(var_decode_location): Watch for DW_OP_GNU_addr_index.
|
||||
(dwarf2_const_value_attr): New cases DW_FORM_GNU_addr_index,
|
||||
DW_FORM_GNU_str_index.
|
||||
(lookup_die_type): Check whether section offset of type's die is
|
||||
known before looking it up. Remove assert. Condition can
|
||||
legimately happen for inter-cu type references.
|
||||
(dwarf_attr_name): Handle Fission attributes.
|
||||
(dwarf_form_name): Handle Fission forms.
|
||||
(dump_die_shallow): New cases DW_FORM_GNU_addr_index,
|
||||
DW_FORM_GNU_str_index.
|
||||
(follow_die_sig): Update to use type_offset_in_section.
|
||||
(decode_locdesc): New case DW_OP_GNU_addr_index.
|
||||
(skip_form_bytes): New cases DW_FORM_GNU_addr_index,
|
||||
DW_FORM_GNU_str_index.
|
||||
(cu_debug_loc_section): New function.
|
||||
(fill_in_loclist_baton, dwarf2_symbol_mark_computed): Call it.
|
||||
(dwarf2_per_objfile_free): Unmap .debug_addr section.
|
||||
Free DWO files if present.
|
||||
* xcoffread.c (dwarf2_xcoff_names): Add .debug_addr.
|
||||
|
||||
Refactor DIE reading.
|
||||
* dwarf2read.c (dwarf2_per_objfile): Replace members
|
||||
debug_info_type_hash and debug_types_type_hash with die_type_hash.
|
||||
|
@ -354,7 +354,8 @@ static const struct dwarf_expr_context_funcs dwarf2_frame_ctx_funcs =
|
||||
ctx_no_get_tls_address,
|
||||
ctx_no_dwarf_call,
|
||||
ctx_no_get_base_type,
|
||||
ctx_no_push_dwarf_reg_entry_value
|
||||
ctx_no_push_dwarf_reg_entry_value,
|
||||
ctx_no_get_addr_index
|
||||
};
|
||||
|
||||
static CORE_ADDR
|
||||
|
@ -732,6 +732,12 @@ execute_stack_op (struct dwarf_expr_context *ctx,
|
||||
result_val = value_from_ulongest (address_type, result);
|
||||
break;
|
||||
|
||||
case DW_OP_GNU_addr_index:
|
||||
op_ptr = read_uleb128 (op_ptr, op_end, &uoffset);
|
||||
result = (ctx->funcs->get_addr_index) (ctx->baton, uoffset);
|
||||
result_val = value_from_ulongest (address_type, result);
|
||||
break;
|
||||
|
||||
case DW_OP_const1u:
|
||||
result = extract_unsigned_integer (op_ptr, 1, byte_order);
|
||||
result_val = value_from_ulongest (address_type, result);
|
||||
@ -1543,6 +1549,14 @@ ctx_no_push_dwarf_reg_entry_value (struct dwarf_expr_context *ctx,
|
||||
_("Support for DW_OP_GNU_entry_value is unimplemented"));
|
||||
}
|
||||
|
||||
/* Stub dwarf_expr_context_funcs.get_addr_index implementation. */
|
||||
|
||||
CORE_ADDR
|
||||
ctx_no_get_addr_index (void *baton, unsigned int index)
|
||||
{
|
||||
error (_("%s is invalid in this context"), "DW_OP_GNU_addr_index");
|
||||
}
|
||||
|
||||
/* Provide a prototype to silence -Wmissing-prototypes. */
|
||||
extern initialize_file_ftype _initialize_dwarf2expr;
|
||||
|
||||
|
@ -85,6 +85,10 @@ struct dwarf_expr_context_funcs
|
||||
int dwarf_reg, CORE_ADDR fb_offset,
|
||||
int deref_size);
|
||||
|
||||
/* Return the address indexed by DW_OP_GNU_addr_index.
|
||||
This can throw an exception if the index is out of range. */
|
||||
CORE_ADDR (*get_addr_index) (void *baton, unsigned int index);
|
||||
|
||||
#if 0
|
||||
/* Not yet implemented. */
|
||||
|
||||
@ -293,6 +297,7 @@ struct type *ctx_no_get_base_type (struct dwarf_expr_context *ctx,
|
||||
void ctx_no_push_dwarf_reg_entry_value (struct dwarf_expr_context *ctx,
|
||||
int dwarf_reg, CORE_ADDR fb_offset,
|
||||
int deref_size);
|
||||
CORE_ADDR ctx_no_get_addr_index (void *baton, unsigned int index);
|
||||
|
||||
int dwarf_block_to_dwarf_reg (const gdb_byte *buf, const gdb_byte *buf_end);
|
||||
|
||||
|
@ -1008,6 +1008,17 @@ dwarf_expr_push_dwarf_reg_entry_value (struct dwarf_expr_context *ctx,
|
||||
ctx->baton = saved_ctx.baton;
|
||||
}
|
||||
|
||||
/* Callback function for dwarf2_evaluate_loc_desc.
|
||||
Fetch the address indexed by DW_OP_GNU_addr_index. */
|
||||
|
||||
static CORE_ADDR
|
||||
dwarf_expr_get_addr_index (void *baton, unsigned int index)
|
||||
{
|
||||
struct dwarf_expr_baton *debaton = (struct dwarf_expr_baton *) baton;
|
||||
|
||||
return dwarf2_read_addr_index (debaton->per_cu, index);
|
||||
}
|
||||
|
||||
/* VALUE must be of type lval_computed with entry_data_value_funcs. Perform
|
||||
the indirect method on it, that is use its stored target value, the sole
|
||||
purpose of entry_data_value_funcs.. */
|
||||
@ -1942,7 +1953,8 @@ static const struct dwarf_expr_context_funcs dwarf_expr_ctx_funcs =
|
||||
dwarf_expr_tls_address,
|
||||
dwarf_expr_dwarf_call,
|
||||
dwarf_expr_get_base_type,
|
||||
dwarf_expr_push_dwarf_reg_entry_value
|
||||
dwarf_expr_push_dwarf_reg_entry_value,
|
||||
dwarf_expr_get_addr_index
|
||||
};
|
||||
|
||||
/* Evaluate a location description, starting at DATA and with length
|
||||
@ -2241,6 +2253,15 @@ needs_dwarf_reg_entry_value (struct dwarf_expr_context *ctx,
|
||||
nf_baton->needs_frame = 1;
|
||||
}
|
||||
|
||||
/* DW_OP_GNU_addr_index doesn't require a frame. */
|
||||
|
||||
static CORE_ADDR
|
||||
needs_get_addr_index (void *baton, unsigned int index)
|
||||
{
|
||||
/* Nothing to do. */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Virtual method table for dwarf2_loc_desc_needs_frame below. */
|
||||
|
||||
static const struct dwarf_expr_context_funcs needs_frame_ctx_funcs =
|
||||
@ -2253,7 +2274,8 @@ static const struct dwarf_expr_context_funcs needs_frame_ctx_funcs =
|
||||
needs_frame_tls_address,
|
||||
needs_frame_dwarf_call,
|
||||
NULL, /* get_base_type */
|
||||
needs_dwarf_reg_entry_value
|
||||
needs_dwarf_reg_entry_value,
|
||||
needs_get_addr_index
|
||||
};
|
||||
|
||||
/* Return non-zero iff the location expression at DATA (length SIZE)
|
||||
|
@ -80,6 +80,9 @@ struct value *dwarf2_evaluate_loc_desc (struct type *type,
|
||||
unsigned short size,
|
||||
struct dwarf2_per_cu_data *per_cu);
|
||||
|
||||
CORE_ADDR dwarf2_read_addr_index (struct dwarf2_per_cu_data *per_cu,
|
||||
unsigned int addr_index);
|
||||
|
||||
/* The symbol location baton types used by the DWARF-2 reader (i.e.
|
||||
SYMBOL_LOCATION_BATON for a LOC_COMPUTED symbol). "struct
|
||||
dwarf2_locexpr_baton" is for a symbol with a single location
|
||||
|
1518
gdb/dwarf2read.c
1518
gdb/dwarf2read.c
File diff suppressed because it is too large
Load Diff
@ -3625,7 +3625,9 @@ bfd_byte *
|
||||
default_symfile_relocate (struct objfile *objfile, asection *sectp,
|
||||
bfd_byte *buf)
|
||||
{
|
||||
bfd *abfd = objfile->obfd;
|
||||
/* Use sectp->owner instead of objfile->obfd. sectp may point to a
|
||||
DWO file. */
|
||||
bfd *abfd = sectp->owner;
|
||||
|
||||
/* We're only interested in sections with relocation
|
||||
information. */
|
||||
|
@ -645,6 +645,7 @@ struct dwarf2_debug_sections {
|
||||
struct dwarf2_section_names str;
|
||||
struct dwarf2_section_names ranges;
|
||||
struct dwarf2_section_names types;
|
||||
struct dwarf2_section_names addr;
|
||||
struct dwarf2_section_names frame;
|
||||
struct dwarf2_section_names eh_frame;
|
||||
struct dwarf2_section_names gdb_index;
|
||||
|
@ -1,3 +1,11 @@
|
||||
2012-04-28 Doug Evans <dje@google.com>
|
||||
|
||||
* gdb.dwarf2/dw2-intercu.S (.Ltype_int2_in_cu2): Renamed from
|
||||
.Ltype_int_in_cu2. Use name "int2" instead of "int".
|
||||
All uses updated.
|
||||
* gdb.dwarf2/dw2-intercu.exp: Add "ptype int2" ahead of
|
||||
"ptype func_cu1" to expand cu2 before cu1.
|
||||
|
||||
2012-04-27 Sergio Durigan Junior <sergiodj@redhat.com>
|
||||
Tom Tromey <tromey@redhat.com>
|
||||
|
||||
|
@ -58,7 +58,7 @@ func_cu1:
|
||||
.byte 1 /* DW_AT_decl_file */
|
||||
.byte 2 /* DW_AT_decl_line */
|
||||
.ascii "func_cu1\0" /* DW_AT_name */
|
||||
.4byte .Ltype_int_in_cu2 /* DW_AT_type */
|
||||
.4byte .Ltype_int2_in_cu2 /* DW_AT_type */
|
||||
.4byte .Lbegin_func_cu1 /* DW_AT_low_pc */
|
||||
.4byte .Lend_func_cu1 /* DW_AT_high_pc */
|
||||
.byte 1 /* DW_AT_frame_base: length */
|
||||
@ -83,9 +83,12 @@ func_cu1:
|
||||
.ascii "GNU C 3.3.3\0" /* DW_AT_producer */
|
||||
.byte 1 /* DW_AT_language (C) */
|
||||
|
||||
.Ltype_int_in_cu2:
|
||||
/* This type is named "int2" and not "int" to ensure it is unique,
|
||||
and thus we can easily ensure we expand this CU and not some
|
||||
other CU with "int". */
|
||||
.Ltype_int2_in_cu2:
|
||||
.uleb128 2 /* Abbrev: DW_TAG_base_type */
|
||||
.ascii "int\0" /* DW_AT_name */
|
||||
.ascii "int2\0" /* DW_AT_name */
|
||||
.byte 4 /* DW_AT_byte_size */
|
||||
.byte 5 /* DW_AT_encoding */
|
||||
|
||||
|
@ -45,8 +45,15 @@ gdb_load ${binfile}
|
||||
|
||||
set remote_dwarf_srcfile [remote_download host ${srcdir}/${subdir}/${dwarf_srcfile}]
|
||||
|
||||
# This needs to be done first so that the CU for int2 gets expanded first.
|
||||
# This exercises the case where the type for this die is hashed, but we
|
||||
# need to perform the inter-cu lookup before looking the type up in the
|
||||
# hash table.
|
||||
gdb_test "ptype int2" "type = int2"
|
||||
|
||||
gdb_test_no_output "set listsize 1"
|
||||
gdb_test "list func_cu1" "4\[ \t\]+File 1 Line 4"
|
||||
gdb_test "ptype func_cu1" "type = int \\(\\)"
|
||||
|
||||
gdb_test "ptype func_cu1" "type = int2 \\(\\)"
|
||||
|
||||
remote_file host delete ${remote_dwarf_srcfile}
|
||||
|
@ -162,6 +162,7 @@ static const struct dwarf2_debug_sections dwarf2_xcoff_names = {
|
||||
{ ".dwstr", NULL },
|
||||
{ ".dwrnges", NULL },
|
||||
{ NULL, NULL }, /* debug_types */
|
||||
{ NULL, NULL }, /* debug_addr */
|
||||
{ ".dwframe", NULL },
|
||||
{ NULL, NULL }, /* eh_frame */
|
||||
{ NULL, NULL }, /* gdb_index */
|
||||
|
Loading…
x
Reference in New Issue
Block a user