diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2012-03-19 19:59:19 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2012-03-19 19:59:19 +0000 |
commit | b64f50a1aee2274fa2ec530a8ad191ae0f27706c (patch) | |
tree | b34da35118094c744fd8deb4d5b85e480bfadc83 | |
parent | 2e98ca5343c02e2f2e0721b38f759373ba46e321 (diff) | |
download | gdb-b64f50a1aee2274fa2ec530a8ad191ae0f27706c.zip gdb-b64f50a1aee2274fa2ec530a8ad191ae0f27706c.tar.gz gdb-b64f50a1aee2274fa2ec530a8ad191ae0f27706c.tar.bz2 |
gdb/
Code cleanupp: Use cu_offset and sect_offset compile time type checking.
* dwarf2expr.c (add_piece, dwarf_get_base_type, execute_stack_op)
(ctx_no_dwarf_call, ctx_no_get_base_type): Use cu_offset and
sect_offset.
* dwarf2expr.h (cu_offset, sect_offset): New types.
(struct dwarf_expr_context_funcs) <dwarf_call>
(struct dwarf_expr_context_funcs) <get_base_type>: Use cu_offset and
sect_offset.
(struct dwarf_expr_context) <len>: Improve the comment.
(struct dwarf_expr_piece, ctx_no_dwarf_call, ctx_no_get_base_type): Use
cu_offset and sect_offset.
* dwarf2loc.c (per_cu_dwarf_call, dwarf_expr_dwarf_call)
(dwarf_expr_get_base_type, needs_frame_dwarf_call)
(dwarf2_compile_expr_to_ax, disassemble_dwarf_expression): Likewise.
* dwarf2loc.h: Include dwarf2expr.h.
(dwarf2_fetch_die_location_block, dwarf2_get_die_type): Use cu_offset
and sect_offset.
* dwarf2read.c (struct dwarf2_per_objfile) <debug_types_type_hash>:
Improve the comment.
(struct comp_unit_head, struct dwarf2_cu, struct dwarf2_per_cu_data)
(struct signatured_type, struct line_header, struct partial_die_info)
(struct die_info, find_partial_die, dwarf2_get_ref_die_offset)
(lookup_signatured_type_at_offset, dwarf2_find_containing_comp_unit)
(get_die_type_at_offset, create_cus_from_index)
(create_signatured_type_table_from_index, dw2_get_file_names)
(offset_in_cu_p, read_comp_unit_head, error_check_comp_unit_head)
(read_and_check_comp_unit_head, read_and_check_type_unit_head)
(create_debug_types_hash_table, process_psymtab_comp_unit)
(load_partial_comp_unit, create_all_comp_units)
(partial_die_parent_scope, partial_die_full_name, skip_one_die)
(load_full_comp_unit, dwarf2_physname, read_import_statement)
(inherit_abstract_dies, read_func_scope, read_call_site_scope)
(dwarf2_add_member_fn, process_enumeration_scope, read_module_type)
(read_typedef, die_hash, die_eq, read_full_die, dwarf2_read_abbrevs)
(load_partial_dies, read_partial_die, find_partial_die_in_comp_unit)
(find_partial_die, read_attribute_value, lookup_die_type)
(dump_die_shallow, store_in_ref_table): Use cu_offset and sect_offset.
(is_ref_attr): New function comment.
(dwarf2_get_ref_die_offset): New function comment, new variable retval.
Use cu_offset and sect_offset.
(follow_die_offset, follow_die_ref, dwarf2_fetch_die_location_block)
(dwarf2_get_die_type, follow_die_sig, lookup_signatured_type_at_offset)
(load_full_type_unit, read_signatured_type, per_cu_header_read_in)
(dwarf2_find_containing_comp_unit, struct dwarf2_offset_and_type)
(offset_and_type_hash, offset_and_type_eq, set_die_type)
(get_die_type_at_offset, partial_die_hash, partial_die_eq)
(write_one_signatured_type, write_psymtabs_to_index): Use cu_offset and
sect_offset.
-rw-r--r-- | gdb/ChangeLog | 51 | ||||
-rw-r--r-- | gdb/dwarf2expr.c | 52 | ||||
-rw-r--r-- | gdb/dwarf2expr.h | 25 | ||||
-rw-r--r-- | gdb/dwarf2loc.c | 45 | ||||
-rw-r--r-- | gdb/dwarf2loc.h | 6 | ||||
-rw-r--r-- | gdb/dwarf2read.c | 365 |
6 files changed, 333 insertions, 211 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3059d69..aad141b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,56 @@ 2012-03-19 Jan Kratochvil <jan.kratochvil@redhat.com> + Code cleanupp: Use cu_offset and sect_offset compile time type checking. + * dwarf2expr.c (add_piece, dwarf_get_base_type, execute_stack_op) + (ctx_no_dwarf_call, ctx_no_get_base_type): Use cu_offset and + sect_offset. + * dwarf2expr.h (cu_offset, sect_offset): New types. + (struct dwarf_expr_context_funcs) <dwarf_call> + (struct dwarf_expr_context_funcs) <get_base_type>: Use cu_offset and + sect_offset. + (struct dwarf_expr_context) <len>: Improve the comment. + (struct dwarf_expr_piece, ctx_no_dwarf_call, ctx_no_get_base_type): Use + cu_offset and sect_offset. + * dwarf2loc.c (per_cu_dwarf_call, dwarf_expr_dwarf_call) + (dwarf_expr_get_base_type, needs_frame_dwarf_call) + (dwarf2_compile_expr_to_ax, disassemble_dwarf_expression): Likewise. + * dwarf2loc.h: Include dwarf2expr.h. + (dwarf2_fetch_die_location_block, dwarf2_get_die_type): Use cu_offset + and sect_offset. + * dwarf2read.c (struct dwarf2_per_objfile) <debug_types_type_hash>: + Improve the comment. + (struct comp_unit_head, struct dwarf2_cu, struct dwarf2_per_cu_data) + (struct signatured_type, struct line_header, struct partial_die_info) + (struct die_info, find_partial_die, dwarf2_get_ref_die_offset) + (lookup_signatured_type_at_offset, dwarf2_find_containing_comp_unit) + (get_die_type_at_offset, create_cus_from_index) + (create_signatured_type_table_from_index, dw2_get_file_names) + (offset_in_cu_p, read_comp_unit_head, error_check_comp_unit_head) + (read_and_check_comp_unit_head, read_and_check_type_unit_head) + (create_debug_types_hash_table, process_psymtab_comp_unit) + (load_partial_comp_unit, create_all_comp_units) + (partial_die_parent_scope, partial_die_full_name, skip_one_die) + (load_full_comp_unit, dwarf2_physname, read_import_statement) + (inherit_abstract_dies, read_func_scope, read_call_site_scope) + (dwarf2_add_member_fn, process_enumeration_scope, read_module_type) + (read_typedef, die_hash, die_eq, read_full_die, dwarf2_read_abbrevs) + (load_partial_dies, read_partial_die, find_partial_die_in_comp_unit) + (find_partial_die, read_attribute_value, lookup_die_type) + (dump_die_shallow, store_in_ref_table): Use cu_offset and sect_offset. + (is_ref_attr): New function comment. + (dwarf2_get_ref_die_offset): New function comment, new variable retval. + Use cu_offset and sect_offset. + (follow_die_offset, follow_die_ref, dwarf2_fetch_die_location_block) + (dwarf2_get_die_type, follow_die_sig, lookup_signatured_type_at_offset) + (load_full_type_unit, read_signatured_type, per_cu_header_read_in) + (dwarf2_find_containing_comp_unit, struct dwarf2_offset_and_type) + (offset_and_type_hash, offset_and_type_eq, set_die_type) + (get_die_type_at_offset, partial_die_hash, partial_die_eq) + (write_one_signatured_type, write_psymtabs_to_index): Use cu_offset and + sect_offset. + +2012-03-19 Jan Kratochvil <jan.kratochvil@redhat.com> + Code cleanup. * python/py-auto-load.c (source_section_scripts): New variable back_to. Turn fclose and xfree calls into make_cleanup_fclose and make_cleanup diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c index 6757204..700d8cc 100644 --- a/gdb/dwarf2expr.c +++ b/gdb/dwarf2expr.c @@ -342,7 +342,7 @@ add_piece (struct dwarf_expr_context *ctx, ULONGEST size, ULONGEST offset) } else if (p->location == DWARF_VALUE_IMPLICIT_POINTER) { - p->v.ptr.die = ctx->len; + p->v.ptr.die.cu_off = ctx->len; p->v.ptr.offset = value_as_long (dwarf_expr_fetch (ctx, 0)); } else if (p->location == DWARF_VALUE_REGISTER) @@ -464,7 +464,7 @@ base_types_equal_p (struct type *t1, struct type *t2) size. */ static struct type * -dwarf_get_base_type (struct dwarf_expr_context *ctx, ULONGEST die, int size) +dwarf_get_base_type (struct dwarf_expr_context *ctx, cu_offset die, int size) { struct type *result; @@ -869,7 +869,7 @@ execute_stack_op (struct dwarf_expr_context *ctx, error (_("DWARF-2 expression error: DW_OP_GNU_implicit_pointer " "is not allowed in frame context")); - /* The referred-to DIE. */ + /* The referred-to DIE of cu_offset kind. */ ctx->len = extract_unsigned_integer (op_ptr, ctx->ref_addr_size, byte_order); op_ptr += ctx->ref_addr_size; @@ -1031,9 +1031,10 @@ execute_stack_op (struct dwarf_expr_context *ctx, if (op == DW_OP_GNU_deref_type) { - ULONGEST type_die; + cu_offset type_die; - op_ptr = read_uleb128 (op_ptr, op_end, &type_die); + op_ptr = read_uleb128 (op_ptr, op_end, &uoffset); + type_die.cu_off = uoffset; type = dwarf_get_base_type (ctx, type_die, 0); } else @@ -1335,15 +1336,23 @@ execute_stack_op (struct dwarf_expr_context *ctx, goto no_push; case DW_OP_call2: - result = extract_unsigned_integer (op_ptr, 2, byte_order); - op_ptr += 2; - ctx->funcs->dwarf_call (ctx, result); + { + cu_offset offset; + + offset.cu_off = extract_unsigned_integer (op_ptr, 2, byte_order); + op_ptr += 2; + ctx->funcs->dwarf_call (ctx, offset); + } goto no_push; case DW_OP_call4: - result = extract_unsigned_integer (op_ptr, 4, byte_order); - op_ptr += 4; - ctx->funcs->dwarf_call (ctx, result); + { + cu_offset offset; + + offset.cu_off = extract_unsigned_integer (op_ptr, 4, byte_order); + op_ptr += 4; + ctx->funcs->dwarf_call (ctx, offset); + } goto no_push; case DW_OP_GNU_entry_value: @@ -1386,12 +1395,13 @@ execute_stack_op (struct dwarf_expr_context *ctx, case DW_OP_GNU_const_type: { - ULONGEST type_die; + cu_offset type_die; int n; const gdb_byte *data; struct type *type; - op_ptr = read_uleb128 (op_ptr, op_end, &type_die); + op_ptr = read_uleb128 (op_ptr, op_end, &uoffset); + type_die.cu_off = uoffset; n = *op_ptr++; data = op_ptr; op_ptr += n; @@ -1403,11 +1413,12 @@ execute_stack_op (struct dwarf_expr_context *ctx, case DW_OP_GNU_regval_type: { - ULONGEST type_die; + cu_offset type_die; struct type *type; op_ptr = read_uleb128 (op_ptr, op_end, ®); - op_ptr = read_uleb128 (op_ptr, op_end, &type_die); + op_ptr = read_uleb128 (op_ptr, op_end, &uoffset); + type_die.cu_off = uoffset; type = dwarf_get_base_type (ctx, type_die, 0); result = (ctx->funcs->read_reg) (ctx->baton, reg); @@ -1420,12 +1431,13 @@ execute_stack_op (struct dwarf_expr_context *ctx, case DW_OP_GNU_convert: case DW_OP_GNU_reinterpret: { - ULONGEST type_die; + cu_offset type_die; struct type *type; - op_ptr = read_uleb128 (op_ptr, op_end, &type_die); + op_ptr = read_uleb128 (op_ptr, op_end, &uoffset); + type_die.cu_off = uoffset; - if (type_die == 0) + if (type_die.cu_off == 0) type = address_type; else type = dwarf_get_base_type (ctx, type_die, 0); @@ -1506,7 +1518,7 @@ ctx_no_get_tls_address (void *baton, CORE_ADDR offset) /* Stub dwarf_expr_context_funcs.dwarf_call implementation. */ void -ctx_no_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset) +ctx_no_dwarf_call (struct dwarf_expr_context *ctx, cu_offset die_offset) { error (_("%s is invalid in this context"), "DW_OP_call*"); } @@ -1514,7 +1526,7 @@ ctx_no_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset) /* Stub dwarf_expr_context_funcs.get_base_type implementation. */ struct type * -ctx_no_get_base_type (struct dwarf_expr_context *ctx, size_t die) +ctx_no_get_base_type (struct dwarf_expr_context *ctx, cu_offset die) { error (_("Support for typed DWARF is not supported in this context")); } diff --git a/gdb/dwarf2expr.h b/gdb/dwarf2expr.h index fd70bf9..6b5d649 100644 --- a/gdb/dwarf2expr.h +++ b/gdb/dwarf2expr.h @@ -25,6 +25,18 @@ struct dwarf_expr_context; +/* Offset relative to the start of its containing CU (compilation unit). */ +typedef struct +{ + unsigned int cu_off; +} cu_offset; + +/* Offset relative to the start of its .debug_info or .debug_types section. */ +typedef struct +{ + unsigned int sect_off; +} sect_offset; + /* Virtual method table for struct dwarf_expr_context below. */ struct dwarf_expr_context_funcs @@ -53,14 +65,14 @@ struct dwarf_expr_context_funcs /* Execute DW_AT_location expression for the DWARF expression subroutine in the DIE at DIE_OFFSET in the CU from CTX. Do not touch STACK while it being passed to and returned from the called DWARF subroutine. */ - void (*dwarf_call) (struct dwarf_expr_context *ctx, size_t die_offset); + void (*dwarf_call) (struct dwarf_expr_context *ctx, cu_offset die_offset); /* Return the base type given by the indicated DIE. This can throw an exception if the DIE is invalid or does not represent a base type. If can also be NULL in the special case where the callbacks are not performing evaluation, and thus it is meaningful to substitute a stub type of the correct size. */ - struct type *(*get_base_type) (struct dwarf_expr_context *ctx, size_t die); + struct type *(*get_base_type) (struct dwarf_expr_context *ctx, cu_offset die); /* Push on DWARF stack an entry evaluated for DW_TAG_GNU_call_site's DWARF_REG/FB_OFFSET at the caller of specified BATON. If DWARF register @@ -160,7 +172,7 @@ struct dwarf_expr_context /* For DWARF_VALUE_LITERAL, the current literal value's length and data. For DWARF_VALUE_IMPLICIT_POINTER, LEN is the offset of the - target DIE. */ + target DIE of cu_offset kind. */ ULONGEST len; const gdb_byte *data; @@ -231,7 +243,7 @@ struct dwarf_expr_piece struct { /* The referent DIE from DW_OP_GNU_implicit_pointer. */ - ULONGEST die; + cu_offset die; /* The byte offset into the resulting data. */ LONGEST offset; } ptr; @@ -275,8 +287,9 @@ void ctx_no_get_frame_base (void *baton, const gdb_byte **start, CORE_ADDR ctx_no_get_frame_cfa (void *baton); CORE_ADDR ctx_no_get_frame_pc (void *baton); CORE_ADDR ctx_no_get_tls_address (void *baton, CORE_ADDR offset); -void ctx_no_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset); -struct type *ctx_no_get_base_type (struct dwarf_expr_context *ctx, size_t die); +void ctx_no_dwarf_call (struct dwarf_expr_context *ctx, cu_offset die_offset); +struct type *ctx_no_get_base_type (struct dwarf_expr_context *ctx, + cu_offset die); void ctx_no_push_dwarf_reg_entry_value (struct dwarf_expr_context *ctx, int dwarf_reg, CORE_ADDR fb_offset, int deref_size); diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index 8f10681..863a5fa 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -284,7 +284,7 @@ dwarf_expr_tls_address (void *baton, CORE_ADDR offset) call and return. */ static void -per_cu_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset, +per_cu_dwarf_call (struct dwarf_expr_context *ctx, cu_offset die_offset, struct dwarf2_per_cu_data *per_cu, CORE_ADDR (*get_frame_pc) (void *baton), void *baton) @@ -303,7 +303,7 @@ per_cu_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset, /* Helper interface of per_cu_dwarf_call for dwarf2_evaluate_loc_desc. */ static void -dwarf_expr_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset) +dwarf_expr_dwarf_call (struct dwarf_expr_context *ctx, cu_offset die_offset) { struct dwarf_expr_baton *debaton = ctx->baton; @@ -314,7 +314,8 @@ dwarf_expr_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset) /* Callback function for dwarf2_evaluate_loc_desc. */ static struct type * -dwarf_expr_get_base_type (struct dwarf_expr_context *ctx, size_t die_offset) +dwarf_expr_get_base_type (struct dwarf_expr_context *ctx, + cu_offset die_offset) { struct dwarf_expr_baton *debaton = ctx->baton; @@ -2221,7 +2222,7 @@ needs_frame_tls_address (void *baton, CORE_ADDR offset) /* Helper interface of per_cu_dwarf_call for dwarf2_loc_desc_needs_frame. */ static void -needs_frame_dwarf_call (struct dwarf_expr_context *ctx, size_t die_offset) +needs_frame_dwarf_call (struct dwarf_expr_context *ctx, cu_offset die_offset) { struct needs_frame_baton *nf_baton = ctx->baton; @@ -3014,11 +3015,13 @@ dwarf2_compile_expr_to_ax (struct agent_expr *expr, struct axs_value *loc, { struct dwarf2_locexpr_baton block; int size = (op == DW_OP_call2 ? 2 : 4); + cu_offset offset; uoffset = extract_unsigned_integer (op_ptr, size, byte_order); op_ptr += size; - block = dwarf2_fetch_die_location_block (uoffset, per_cu, + offset.cu_off = uoffset; + block = dwarf2_fetch_die_location_block (offset, per_cu, get_ax_pc, expr); /* DW_OP_call_ref is currently not supported. */ @@ -3517,43 +3520,48 @@ disassemble_dwarf_expression (struct ui_file *stream, case DW_OP_GNU_deref_type: { int addr_size = *data++; - ULONGEST offset; + cu_offset offset; struct type *type; - data = read_uleb128 (data, end, &offset); + data = read_uleb128 (data, end, &ul); + offset.cu_off = ul; type = dwarf2_get_die_type (offset, per_cu); fprintf_filtered (stream, "<"); type_print (type, "", stream, -1); - fprintf_filtered (stream, " [0x%s]> %d", phex_nz (offset, 0), + fprintf_filtered (stream, " [0x%s]> %d", phex_nz (offset.cu_off, 0), addr_size); } break; case DW_OP_GNU_const_type: { - ULONGEST type_die; + cu_offset type_die; struct type *type; - data = read_uleb128 (data, end, &type_die); + data = read_uleb128 (data, end, &ul); + type_die.cu_off = ul; type = dwarf2_get_die_type (type_die, per_cu); fprintf_filtered (stream, "<"); type_print (type, "", stream, -1); - fprintf_filtered (stream, " [0x%s]>", phex_nz (type_die, 0)); + fprintf_filtered (stream, " [0x%s]>", phex_nz (type_die.cu_off, 0)); } break; case DW_OP_GNU_regval_type: { - ULONGEST type_die, reg; + ULONGEST reg; + cu_offset type_die; struct type *type; data = read_uleb128 (data, end, ®); - data = read_uleb128 (data, end, &type_die); + data = read_uleb128 (data, end, &ul); + type_die.cu_off = ul; type = dwarf2_get_die_type (type_die, per_cu); fprintf_filtered (stream, "<"); type_print (type, "", stream, -1); - fprintf_filtered (stream, " [0x%s]> [$%s]", phex_nz (type_die, 0), + fprintf_filtered (stream, " [0x%s]> [$%s]", + phex_nz (type_die.cu_off, 0), locexpr_regname (arch, reg)); } break; @@ -3561,11 +3569,12 @@ disassemble_dwarf_expression (struct ui_file *stream, case DW_OP_GNU_convert: case DW_OP_GNU_reinterpret: { - ULONGEST type_die; + cu_offset type_die; - data = read_uleb128 (data, end, &type_die); + data = read_uleb128 (data, end, &ul); + type_die.cu_off = ul; - if (type_die == 0) + if (type_die.cu_off == 0) fprintf_filtered (stream, "<0>"); else { @@ -3574,7 +3583,7 @@ disassemble_dwarf_expression (struct ui_file *stream, type = dwarf2_get_die_type (type_die, per_cu); fprintf_filtered (stream, "<"); type_print (type, "", stream, -1); - fprintf_filtered (stream, " [0x%s]>", phex_nz (type_die, 0)); + fprintf_filtered (stream, " [0x%s]>", phex_nz (type_die.cu_off, 0)); } } break; diff --git a/gdb/dwarf2loc.h b/gdb/dwarf2loc.h index 45b0fd8..b359733 100644 --- a/gdb/dwarf2loc.h +++ b/gdb/dwarf2loc.h @@ -20,6 +20,8 @@ #if !defined (DWARF2LOC_H) #define DWARF2LOC_H +#include "dwarf2expr.h" + struct symbol_computed_ops; struct objfile; struct dwarf2_per_cu_data; @@ -61,11 +63,11 @@ const gdb_byte *dwarf2_find_location_expression CORE_ADDR pc); struct dwarf2_locexpr_baton dwarf2_fetch_die_location_block - (unsigned int offset_in_cu, struct dwarf2_per_cu_data *per_cu, + (cu_offset offset_in_cu, struct dwarf2_per_cu_data *per_cu, CORE_ADDR (*get_frame_pc) (void *baton), void *baton); -struct type *dwarf2_get_die_type (unsigned int die_offset, +struct type *dwarf2_get_die_type (cu_offset die_offset, struct dwarf2_per_cu_data *per_cu); /* Evaluate a location description, starting at DATA and with length diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 2eb5f40..4b49484 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -216,7 +216,7 @@ struct dwarf2_per_objfile To keep things simple we allocate both lazily. */ htab_t debug_info_type_hash; - /* Table mapping type .debug_types DIE offsets to types. + /* Table mapping type .debug_types DIE sect_offset to types. This is NULL if not allocated yet. */ htab_t debug_types_type_hash; }; @@ -260,7 +260,7 @@ struct comp_unit_head short version; unsigned char addr_size; unsigned char signed_addr_p; - unsigned int abbrev_offset; + sect_offset abbrev_offset; /* Size of file offsets; either 4 or 8. */ unsigned int offset_size; @@ -270,11 +270,11 @@ struct comp_unit_head /* Offset to the first byte of this compilation unit header in the .debug_info section, for resolving relative reference dies. */ - unsigned int offset; + sect_offset offset; /* Offset to first die in this cu from the start of the cu. This will be the first byte following the compilation unit header. */ - unsigned int first_die_offset; + cu_offset first_die_offset; }; /* Type used for delaying computation of method physnames. @@ -338,7 +338,8 @@ struct dwarf2_cu /* Storage for the abbrev table. */ struct obstack abbrev_obstack; - /* Hash table holding all the loaded partial DIEs. */ + /* Hash table holding all the loaded partial DIEs + with partial_die->offset.SECT_OFF as hash. */ htab_t partial_dies; /* Storage for things with the same lifetime as this read-in compilation @@ -357,7 +358,8 @@ struct dwarf2_cu /* How many compilation units ago was this CU last referenced? */ int last_used; - /* A hash table of die offsets for following references. */ + /* A hash table of DIE cu_offset for following references with + die_info->offset.sect_off as hash. */ htab_t die_hash; /* Full DIEs if read in. */ @@ -406,7 +408,7 @@ struct dwarf2_per_cu_data - if it doesn't, GDB will fall over anyway. NOTE: Unlike comp_unit_head.length, this length includes initial_length_size. */ - unsigned int offset; + sect_offset offset; unsigned int length : 29; /* Flag indicating this compilation unit will be read in before @@ -452,8 +454,8 @@ struct signatured_type { ULONGEST signature; - /* Offset in .debug_types of the type defined by this TU. */ - unsigned int type_offset; + /* Offset in this TU of the type defined by this TU. */ + cu_offset type_offset; /* The CU(/TU) of this type. */ struct dwarf2_per_cu_data per_cu; @@ -530,7 +532,7 @@ struct line_header struct partial_die_info { /* Offset of this DIE. */ - unsigned int offset; + sect_offset offset; /* DWARF-2 tag for this DIE. */ ENUM_BITFIELD(dwarf_tag) tag : 16; @@ -585,7 +587,7 @@ struct partial_die_info /* If HAS_SPECIFICATION, the offset of the DIE referred to by DW_AT_specification (or DW_AT_abstract_origin or DW_AT_extension). */ - unsigned int spec_offset; + sect_offset spec_offset; /* Pointers to this DIE's parent, first child, and next sibling, if any. */ @@ -649,7 +651,7 @@ struct die_info unsigned int abbrev; /* Offset in .debug_info or .debug_types section. */ - unsigned int offset; + sect_offset offset; /* The dies in a compilation unit form an n-ary tree. PARENT points to this die's parent; CHILD points to the first child of @@ -911,7 +913,7 @@ static gdb_byte *read_partial_die (struct partial_die_info *, gdb_byte *, gdb_byte *, struct dwarf2_cu *); -static struct partial_die_info *find_partial_die (unsigned int, +static struct partial_die_info *find_partial_die (sect_offset, struct dwarf2_cu *); static void fixup_partial_die (struct partial_die_info *, @@ -1162,7 +1164,7 @@ static void store_in_ref_table (struct die_info *, static int is_ref_attr (struct attribute *); -static unsigned int dwarf2_get_ref_die_offset (struct attribute *); +static sect_offset dwarf2_get_ref_die_offset (struct attribute *); static LONGEST dwarf2_get_attr_constant_value (struct attribute *, int); @@ -1180,8 +1182,7 @@ static struct die_info *follow_die_sig (struct die_info *, static struct signatured_type *lookup_signatured_type_at_offset (struct objfile *objfile, - struct dwarf2_section_info *section, - unsigned int offset); + struct dwarf2_section_info *section, sect_offset offset); static void load_full_type_unit (struct dwarf2_per_cu_data *per_cu); @@ -1225,7 +1226,7 @@ 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 - (unsigned int offset, struct objfile *objfile); + (sect_offset offset, struct objfile *objfile); static void init_one_comp_unit (struct dwarf2_cu *cu, struct dwarf2_per_cu_data *per_cu); @@ -1259,7 +1260,7 @@ 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 (unsigned int, +static struct type *get_die_type_at_offset (sect_offset, struct dwarf2_per_cu_data *per_cu); static struct type *get_die_type (struct die_info *die, struct dwarf2_cu *cu); @@ -1891,7 +1892,7 @@ create_cus_from_index (struct objfile *objfile, const gdb_byte *cu_list, the_cu = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct dwarf2_per_cu_data); - the_cu->offset = offset; + the_cu->offset.sect_off = offset; the_cu->length = length; the_cu->objfile = objfile; the_cu->v.quick = OBSTACK_ZALLOC (&objfile->objfile_obstack, @@ -1936,9 +1937,9 @@ create_signatured_type_table_from_index (struct objfile *objfile, type_sig = OBSTACK_ZALLOC (&objfile->objfile_obstack, struct signatured_type); type_sig->signature = signature; - type_sig->type_offset = type_offset; + type_sig->type_offset.cu_off = type_offset; type_sig->per_cu.debug_types_section = section; - type_sig->per_cu.offset = offset; + type_sig->per_cu.offset.sect_off = offset; type_sig->per_cu.objfile = objfile; type_sig->per_cu.v.quick = OBSTACK_ZALLOC (&objfile->objfile_obstack, @@ -2268,7 +2269,7 @@ dw2_get_file_names (struct objfile *objfile, else sec = &dwarf2_per_objfile->info; dwarf2_read_section (objfile, sec); - info_ptr = sec->buffer + this_cu->offset; + info_ptr = sec->buffer + this_cu->offset.sect_off; info_ptr = read_and_check_comp_unit_head (&cu.header, sec, info_ptr, this_cu->debug_types_section != NULL); @@ -2994,14 +2995,13 @@ dwarf2_build_psymtabs (struct objfile *objfile) /* Return TRUE if OFFSET is within CU_HEADER. */ static inline int -offset_in_cu_p (const struct comp_unit_head *cu_header, unsigned int offset) +offset_in_cu_p (const struct comp_unit_head *cu_header, sect_offset offset) { - unsigned int bottom = cu_header->offset; - unsigned int top = (cu_header->offset - + cu_header->length - + cu_header->initial_length_size); + sect_offset bottom = { cu_header->offset.sect_off }; + sect_offset top = { (cu_header->offset.sect_off + cu_header->length + + cu_header->initial_length_size) }; - return (offset >= bottom && offset < top); + return (offset.sect_off >= bottom.sect_off && offset.sect_off < top.sect_off); } /* Read in the comp unit header information from the debug_info at info_ptr. @@ -3021,8 +3021,8 @@ read_comp_unit_head (struct comp_unit_head *cu_header, info_ptr += bytes_read; cu_header->version = read_2_bytes (abfd, info_ptr); info_ptr += 2; - cu_header->abbrev_offset = read_offset (abfd, info_ptr, cu_header, - &bytes_read); + 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; @@ -3051,22 +3051,22 @@ error_check_comp_unit_head (struct comp_unit_head *header, "(is %d, should be 2, 3, or 4) [in module %s]"), header->version, filename); - if (header->abbrev_offset + if (header->abbrev_offset.sect_off >= dwarf2_section_size (dwarf2_per_objfile->objfile, &dwarf2_per_objfile->abbrev)) error (_("Dwarf Error: bad offset (0x%lx) in compilation unit header " "(offset 0x%lx + 6) [in module %s]"), - (long) header->abbrev_offset, (long) header->offset, + (long) header->abbrev_offset.sect_off, (long) header->offset.sect_off, filename); /* Cast to unsigned long to use 64-bit arithmetic when possible to avoid potential 32-bit overflow. */ - if (((unsigned long) header->offset + if (((unsigned long) header->offset.sect_off + header->length + header->initial_length_size) > 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, + (long) header->length, (long) header->offset.sect_off, filename); } @@ -3083,7 +3083,7 @@ read_and_check_comp_unit_head (struct comp_unit_head *header, gdb_byte *beg_of_comp_unit = info_ptr; bfd *abfd = section->asection->owner; - header->offset = beg_of_comp_unit - section->buffer; + header->offset.sect_off = beg_of_comp_unit - section->buffer; info_ptr = read_comp_unit_head (header, info_ptr, abfd); @@ -3092,7 +3092,7 @@ read_and_check_comp_unit_head (struct comp_unit_head *header, if (is_debug_types_section) info_ptr += 8 /*signature*/ + header->offset_size; - header->first_die_offset = info_ptr - beg_of_comp_unit; + header->first_die_offset.cu_off = info_ptr - beg_of_comp_unit; error_check_comp_unit_head (header, section); @@ -3106,12 +3106,12 @@ static gdb_byte * read_and_check_type_unit_head (struct comp_unit_head *header, struct dwarf2_section_info *section, gdb_byte *info_ptr, - ULONGEST *signature, unsigned int *type_offset) + ULONGEST *signature, cu_offset *type_offset) { gdb_byte *beg_of_comp_unit = info_ptr; bfd *abfd = section->asection->owner; - header->offset = beg_of_comp_unit - section->buffer; + header->offset.sect_off = beg_of_comp_unit - section->buffer; info_ptr = read_comp_unit_head (header, info_ptr, abfd); @@ -3121,10 +3121,10 @@ read_and_check_type_unit_head (struct comp_unit_head *header, *signature = read_8_bytes (abfd, info_ptr); info_ptr += 8; if (type_offset != NULL) - *type_offset = read_offset_1 (abfd, info_ptr, header->offset_size); + type_offset->cu_off = read_offset_1 (abfd, info_ptr, header->offset_size); info_ptr += header->offset_size; - header->first_die_offset = info_ptr - beg_of_comp_unit; + header->first_die_offset.cu_off = info_ptr - beg_of_comp_unit; error_check_comp_unit_head (header, section); @@ -3280,15 +3280,15 @@ create_debug_types_hash_table (struct objfile *objfile) end_ptr = info_ptr + section->size; while (info_ptr < end_ptr) { - unsigned int offset; - unsigned int type_offset; + sect_offset offset; + cu_offset type_offset; ULONGEST signature; struct signatured_type *type_sig; void **slot; gdb_byte *ptr = info_ptr; struct comp_unit_head header; - offset = ptr - section->buffer; + offset.sect_off = ptr - section->buffer; /* We need to read the type's signature in order to build the hash table, but we don't need anything else just yet. */ @@ -3320,7 +3320,7 @@ create_debug_types_hash_table (struct objfile *objfile) complaint (&symfile_complaints, _("debug type entry at offset 0x%x is duplicate to the " "entry at offset 0x%x, signature 0x%s"), - offset, dup_sig->per_cu.offset, + offset.sect_off, dup_sig->per_cu.offset.sect_off, phex (signature, sizeof (signature))); gdb_assert (signature == dup_sig->signature); } @@ -3328,7 +3328,8 @@ create_debug_types_hash_table (struct objfile *objfile) if (dwarf2_die_debug) fprintf_unfiltered (gdb_stdlog, " offset 0x%x, signature 0x%s\n", - offset, phex (signature, sizeof (signature))); + offset.sect_off, + phex (signature, sizeof (signature))); info_ptr = info_ptr + header.initial_length_size + header.length; } @@ -3434,7 +3435,7 @@ process_psymtab_comp_unit (struct dwarf2_per_cu_data *this_cu, struct objfile *objfile = this_cu->objfile; bfd *abfd = objfile->obfd; gdb_byte *buffer = section->buffer; - gdb_byte *info_ptr = buffer + this_cu->offset; + gdb_byte *info_ptr = buffer + this_cu->offset.sect_off; unsigned int buffer_size = section->size; gdb_byte *beg_of_comp_unit = info_ptr; struct die_info *comp_unit_die; @@ -3489,7 +3490,7 @@ process_psymtab_comp_unit (struct dwarf2_per_cu_data *this_cu, if (is_debug_types_section) { /* LENGTH has not been set yet for type units. */ - gdb_assert (this_cu->offset == cu.header.offset); + gdb_assert (this_cu->offset.sect_off == cu.header.offset.sect_off); this_cu->length = cu.header.length + cu.header.initial_length_size; } else if (comp_unit_die->tag == DW_TAG_partial_unit) @@ -3696,7 +3697,7 @@ load_partial_comp_unit (struct dwarf2_per_cu_data *this_cu) gdb_assert (! this_cu->debug_types_section); gdb_assert (section->readin); - info_ptr = section->buffer + this_cu->offset; + info_ptr = section->buffer + this_cu->offset.sect_off; if (this_cu->cu == NULL) { @@ -3722,7 +3723,7 @@ load_partial_comp_unit (struct dwarf2_per_cu_data *this_cu) else { cu = this_cu->cu; - info_ptr += cu->header.first_die_offset; + info_ptr += cu->header.first_die_offset.cu_off; } /* Read the abbrevs for this compilation unit into a table. */ @@ -3781,9 +3782,9 @@ create_all_comp_units (struct objfile *objfile) { unsigned int length, initial_length_size; struct dwarf2_per_cu_data *this_cu; - unsigned int offset; + sect_offset offset; - offset = info_ptr - dwarf2_per_objfile->info.buffer; + offset.sect_off = info_ptr - dwarf2_per_objfile->info.buffer; /* Read just enough information to find out where the next compilation unit is. */ @@ -3985,7 +3986,7 @@ partial_die_parent_scope (struct partial_die_info *pdi, ignoring them. */ complaint (&symfile_complaints, _("unhandled containing DIE tag %d for DIE at %d"), - parent->tag, pdi->offset); + parent->tag, pdi->offset.sect_off); parent->scope = grandparent_scope; } @@ -4015,9 +4016,10 @@ partial_die_full_name (struct partial_die_info *pdi, struct attribute attr; struct dwarf2_cu *ref_cu = cu; + /* DW_FORM_ref_addr is using section offset. */ attr.name = 0; attr.form = DW_FORM_ref_addr; - attr.u.addr = pdi->offset; + attr.u.addr = pdi->offset.sect_off; die = follow_die_ref (NULL, &attr, &ref_cu); return xstrdup (dwarf2_full_name (NULL, die, ref_cu)); @@ -4412,7 +4414,7 @@ skip_one_die (gdb_byte *buffer, gdb_byte *info_ptr, complaint (&symfile_complaints, _("ignoring absolute DW_AT_sibling")); else - return buffer + dwarf2_get_ref_die_offset (&attr); + return buffer + dwarf2_get_ref_die_offset (&attr).sect_off; } /* If it isn't DW_AT_sibling, skip this attribute. */ @@ -4696,7 +4698,7 @@ load_full_comp_unit (struct dwarf2_per_cu_data *per_cu) struct objfile *objfile = per_cu->objfile; bfd *abfd = objfile->obfd; struct dwarf2_cu *cu; - unsigned int offset; + sect_offset offset; gdb_byte *info_ptr, *beg_of_comp_unit; struct cleanup *free_cu_cleanup = NULL; struct attribute *attr; @@ -4708,7 +4710,7 @@ load_full_comp_unit (struct dwarf2_per_cu_data *per_cu) offset = per_cu->offset; dwarf2_read_section (objfile, &dwarf2_per_objfile->info); - info_ptr = dwarf2_per_objfile->info.buffer + offset; + info_ptr = dwarf2_per_objfile->info.buffer + offset.sect_off; beg_of_comp_unit = info_ptr; if (per_cu->cu == NULL) @@ -4735,12 +4737,12 @@ load_full_comp_unit (struct dwarf2_per_cu_data *per_cu) /* Complete the cu_header. */ cu->header.offset = offset; - cu->header.first_die_offset = info_ptr - beg_of_comp_unit; + cu->header.first_die_offset.cu_off = info_ptr - beg_of_comp_unit; } else { cu = per_cu->cu; - info_ptr += cu->header.first_die_offset; + info_ptr += cu->header.first_die_offset.cu_off; } cu->dies = read_comp_unit (info_ptr, cu); @@ -5379,7 +5381,7 @@ dwarf2_physname (char *name, struct die_info *die, struct dwarf2_cu *cu) 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, objfile->name); + physname, canon, mangled, die->offset.sect_off, objfile->name); /* Prefer DW_AT_linkage_name (in the CANON form) - when it is available here - over computed PHYSNAME. It is safer @@ -5516,7 +5518,7 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) complaint (&symfile_complaints, _("child DW_TAG_imported_declaration expected " "- DIE at 0x%x [in module %s]"), - child_die->offset, objfile->name); + child_die->offset.sect_off, objfile->name); continue; } @@ -5537,7 +5539,7 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu) complaint (&symfile_complaints, _("child DW_TAG_imported_declaration has unknown " "imported name - DIE at 0x%x [in module %s]"), - child_die->offset, objfile->name); + child_die->offset.sect_off, objfile->name); continue; } @@ -5844,8 +5846,8 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu) struct die_info *child_die; unsigned die_children_count; /* CU offsets which were referenced by children of the current DIE. */ - unsigned *offsets; - unsigned *offsets_end, *offsetp; + sect_offset *offsets; + sect_offset *offsets_end, *offsetp; /* Parent of DIE - referenced by DW_AT_abstract_origin. */ struct die_info *origin_die; /* Iterator of the ORIGIN_DIE children. */ @@ -5875,7 +5877,7 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu) && origin_die->tag == DW_TAG_subprogram)) complaint (&symfile_complaints, _("DIE 0x%x and its abstract origin 0x%x have different tags"), - die->offset, origin_die->offset); + die->offset.sect_off, origin_die->offset.sect_off); child_die = die->child; die_children_count = 0; @@ -5918,13 +5920,13 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu) && 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, - child_origin_die->offset); + "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, - child_origin_die->offset); + "different parents"), child_die->offset.sect_off, + child_origin_die->offset.sect_off); else *offsets_end++ = child_origin_die->offset; } @@ -5933,20 +5935,22 @@ inherit_abstract_dies (struct die_info *die, struct dwarf2_cu *cu) qsort (offsets, offsets_end - offsets, sizeof (*offsets), unsigned_int_compar); for (offsetp = offsets + 1; offsetp < offsets_end; offsetp++) - if (offsetp[-1] == *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, *offsetp); + die->offset.sect_off, offsetp->sect_off); offsetp = offsets; origin_child_die = origin_die->child; while (origin_child_die && origin_child_die->tag) { /* Is ORIGIN_CHILD_DIE referenced by any of the DIE children? */ - while (offsetp < offsets_end && *offsetp < origin_child_die->offset) + while (offsetp < offsets_end + && offsetp->sect_off < origin_child_die->offset.sect_off) offsetp++; - if (offsetp >= offsets_end || *offsetp > origin_child_die->offset) + if (offsetp >= offsets_end + || offsetp->sect_off > origin_child_die->offset.sect_off) { /* Found that ORIGIN_CHILD_DIE is really not referenced. */ process_die (origin_child_die, origin_cu); @@ -5997,7 +6001,8 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) if (name == NULL) { complaint (&symfile_complaints, - _("missing name for subprogram DIE at %d"), die->offset); + _("missing name for subprogram DIE at %d"), + die->offset.sect_off); return; } @@ -6009,7 +6014,7 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) complaint (&symfile_complaints, _("cannot get low and high bounds " "for subprogram DIE at %d"), - die->offset); + die->offset.sect_off); return; } @@ -6221,7 +6226,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) complaint (&symfile_complaints, _("missing DW_AT_low_pc for DW_TAG_GNU_call_site " "DIE 0x%x [in module %s]"), - die->offset, objfile->name); + die->offset.sect_off, objfile->name); return; } pc = DW_ADDR (attr) + baseaddr; @@ -6237,7 +6242,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) complaint (&symfile_complaints, _("Duplicate PC %s for DW_TAG_GNU_call_site " "DIE 0x%x [in module %s]"), - paddress (gdbarch, pc), die->offset, objfile->name); + paddress (gdbarch, pc), die->offset.sect_off, objfile->name); return; } @@ -6252,7 +6257,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) 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, objfile->name); + child_die->tag, child_die->offset.sect_off, objfile->name); continue; } @@ -6310,7 +6315,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) complaint (&symfile_complaints, _("Cannot find function owning DW_TAG_GNU_call_site " "DIE 0x%x [in module %s]"), - die->offset, objfile->name); + die->offset.sect_off, objfile->name); } } @@ -6347,7 +6352,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) complaint (&symfile_complaints, _("DW_AT_GNU_call_site_target target DIE has invalid " "physname, for referencing DIE 0x%x [in module %s]"), - die->offset, objfile->name); + die->offset.sect_off, objfile->name); else SET_FIELD_PHYSNAME (call_site->target, (char *) target_physname); } @@ -6360,7 +6365,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) 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, objfile->name); + die->offset.sect_off, objfile->name); else SET_FIELD_PHYSADDR (call_site->target, lowpc + baseaddr); } @@ -6369,7 +6374,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) 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, objfile->name); + die->offset.sect_off, objfile->name); call_site->per_cu = cu->per_cu; @@ -6398,7 +6403,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) 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, objfile->name); + child_die->offset.sect_off, objfile->name); continue; } parameter->dwarf_reg = dwarf_block_to_dwarf_reg (DW_BLOCK (attr)->data, @@ -6412,7 +6417,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) _("Only single DW_OP_reg or DW_OP_fbreg is supported " "for DW_FORM_block* DW_AT_location for " "DW_TAG_GNU_call_site child DIE 0x%x [in module %s]"), - child_die->offset, objfile->name); + child_die->offset.sect_off, objfile->name); continue; } @@ -6422,7 +6427,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) 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, objfile->name); + child_die->offset.sect_off, objfile->name); continue; } parameter->value = DW_BLOCK (attr)->data; @@ -6440,7 +6445,7 @@ read_call_site_scope (struct die_info *die, struct dwarf2_cu *cu) 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, objfile->name); + child_die->offset.sect_off, objfile->name); else { parameter->data_value = DW_BLOCK (attr)->data; @@ -7491,7 +7496,7 @@ dwarf2_add_member_fn (struct field_info *fip, struct die_info *die, complaint (&symfile_complaints, _("Member function \"%s\" (offset %d) is virtual " "but the vtable offset is not specified"), - fieldname, die->offset); + fieldname, die->offset.sect_off); ALLOCATE_CPLUS_STRUCT_TYPE (type); TYPE_CPLUS_DYNAMIC (type) = 1; } @@ -8084,8 +8089,8 @@ process_enumeration_scope (struct die_info *die, struct dwarf2_cu *cu) = lookup_signatured_type_at_offset (dwarf2_per_objfile->objfile, cu->per_cu->debug_types_section, cu->per_cu->offset); - if (type_sig->per_cu.offset + type_sig->type_offset - != die->offset) + if (type_sig->per_cu.offset.sect_off + type_sig->type_offset.cu_off + != die->offset.sect_off) return; } @@ -8411,7 +8416,7 @@ read_module_type (struct die_info *die, struct dwarf2_cu *cu) if (!module_name) complaint (&symfile_complaints, _("DW_TAG_module has no name, offset 0x%x"), - die->offset); + die->offset.sect_off); type = init_type (TYPE_CODE_MODULE, 0, 0, module_name, objfile); /* determine_prefix uses TYPE_TAG_NAME. */ @@ -8867,7 +8872,7 @@ read_typedef (struct die_info *die, struct dwarf2_cu *cu) complaint (&symfile_complaints, _("Self-referential DW_TAG_typedef " "- DIE at 0x%x [in module %s]"), - die->offset, objfile->name); + die->offset.sect_off, objfile->name); TYPE_TARGET_TYPE (this_type) = NULL; } return this_type; @@ -9135,7 +9140,7 @@ die_hash (const void *item) { const struct die_info *die = item; - return die->offset; + return die->offset.sect_off; } /* Trivial comparison function for die_info structures: two DIEs @@ -9147,7 +9152,7 @@ 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 == die_rhs->offset; + return die_lhs->offset.sect_off == die_rhs->offset.sect_off; } /* Read a whole compilation unit into a linked list of dies. */ @@ -9296,13 +9301,14 @@ read_full_die (const struct die_reader_specs *reader, struct die_info **diep, gdb_byte *info_ptr, int *has_children) { - unsigned int abbrev_number, bytes_read, i, offset; + 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 = info_ptr - reader->buffer; + offset.sect_off = info_ptr - reader->buffer; abbrev_number = read_unsigned_leb128 (abfd, info_ptr, &bytes_read); info_ptr += bytes_read; if (!abbrev_number) @@ -9362,7 +9368,8 @@ dwarf2_read_abbrevs (struct dwarf2_cu *cu) dwarf2_read_section (dwarf2_per_objfile->objfile, &dwarf2_per_objfile->abbrev); - abbrev_ptr = dwarf2_per_objfile->abbrev.buffer + cu_header->abbrev_offset; + abbrev_ptr = (dwarf2_per_objfile->abbrev.buffer + + cu_header->abbrev_offset.sect_off); abbrev_number = read_unsigned_leb128 (abfd, abbrev_ptr, &bytes_read); abbrev_ptr += bytes_read; @@ -9649,7 +9656,7 @@ load_partial_dies (bfd *abfd, gdb_byte *buffer, gdb_byte *info_ptr, complaint (&symfile_complaints, _("DW_TAG_typedef has childen - GCC PR debug/47510 bug " "- DIE at 0x%x [in module %s]"), - part_die->offset, objfile->name); + part_die->offset.sect_off, objfile->name); /* If we're at the second level, and we're an enumerator, and our parent has no specification (meaning possibly lives in a @@ -9723,7 +9730,7 @@ load_partial_dies (bfd *abfd, gdb_byte *buffer, gdb_byte *info_ptr, void **slot; slot = htab_find_slot_with_hash (cu->partial_dies, part_die, - part_die->offset, INSERT); + part_die->offset.sect_off, INSERT); *slot = part_die; } @@ -9789,7 +9796,7 @@ read_partial_die (struct partial_die_info *part_die, memset (part_die, 0, sizeof (struct partial_die_info)); - part_die->offset = info_ptr - buffer; + part_die->offset.sect_off = info_ptr - buffer; info_ptr += abbrev_len; @@ -9882,7 +9889,7 @@ read_partial_die (struct partial_die_info *part_die, complaint (&symfile_complaints, _("ignoring absolute DW_AT_sibling")); else - part_die->sibling = buffer + dwarf2_get_ref_die_offset (&attr); + part_die->sibling = buffer + dwarf2_get_ref_die_offset (&attr).sect_off; break; case DW_AT_byte_size: part_die->has_byte_size = 1; @@ -9940,7 +9947,7 @@ read_partial_die (struct partial_die_info *part_die, _("DW_AT_low_pc %s is zero " "for DIE at 0x%x [in module %s]"), paddress (gdbarch, part_die->lowpc), - part_die->offset, objfile->name); + part_die->offset.sect_off, objfile->name); } /* dwarf2_get_pc_bounds has also the strict low < high requirement. */ else if (part_die->lowpc >= part_die->highpc) @@ -9952,7 +9959,7 @@ read_partial_die (struct partial_die_info *part_die, "for DIE at 0x%x [in module %s]"), paddress (gdbarch, part_die->lowpc), paddress (gdbarch, part_die->highpc), - part_die->offset, objfile->name); + part_die->offset.sect_off, objfile->name); } else part_die->has_pc_info = 1; @@ -9964,13 +9971,14 @@ read_partial_die (struct partial_die_info *part_die, /* Find a cached partial DIE at OFFSET in CU. */ static struct partial_die_info * -find_partial_die_in_comp_unit (unsigned int offset, struct dwarf2_cu *cu) +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); + lookup_die = htab_find_with_hash (cu->partial_dies, &part_die, + offset.sect_off); return lookup_die; } @@ -9981,7 +9989,7 @@ find_partial_die_in_comp_unit (unsigned int offset, struct dwarf2_cu *cu) DW_FORM_ref_sig8). */ static struct partial_die_info * -find_partial_die (unsigned int offset, struct dwarf2_cu *cu) +find_partial_die (sect_offset offset, struct dwarf2_cu *cu) { struct objfile *objfile = cu->objfile; struct dwarf2_per_cu_data *per_cu = NULL; @@ -10028,8 +10036,8 @@ find_partial_die (unsigned int offset, struct dwarf2_cu *cu) make_cleanup (dwarf2_free_abbrev_table, per_cu->cu); } info_ptr = (dwarf2_per_objfile->info.buffer - + per_cu->cu->header.offset - + per_cu->cu->header.first_die_offset); + + per_cu->cu->header.offset.sect_off + + per_cu->cu->header.first_die_offset.cu_off); abbrev = peek_die_abbrev (info_ptr, &bytes_read, per_cu->cu); info_ptr = read_partial_die (&comp_unit_die, abbrev, bytes_read, objfile->obfd, @@ -10050,7 +10058,7 @@ find_partial_die (unsigned int offset, struct dwarf2_cu *cu) internal_error (__FILE__, __LINE__, _("could not find partial DIE 0x%x " "in cache [from module %s]\n"), - offset, bfd_get_filename (objfile->obfd)); + offset.sect_off, bfd_get_filename (objfile->obfd)); return pd; } @@ -10295,19 +10303,23 @@ read_attribute_value (struct attribute *attr, unsigned form, info_ptr += bytes_read; break; case DW_FORM_ref1: - DW_ADDR (attr) = cu->header.offset + read_1_byte (abfd, info_ptr); + DW_ADDR (attr) = (cu->header.offset.sect_off + + read_1_byte (abfd, info_ptr)); info_ptr += 1; break; case DW_FORM_ref2: - DW_ADDR (attr) = cu->header.offset + read_2_bytes (abfd, info_ptr); + DW_ADDR (attr) = (cu->header.offset.sect_off + + read_2_bytes (abfd, info_ptr)); info_ptr += 2; break; case DW_FORM_ref4: - DW_ADDR (attr) = cu->header.offset + read_4_bytes (abfd, info_ptr); + DW_ADDR (attr) = (cu->header.offset.sect_off + + read_4_bytes (abfd, info_ptr)); info_ptr += 4; break; case DW_FORM_ref8: - DW_ADDR (attr) = cu->header.offset + read_8_bytes (abfd, info_ptr); + DW_ADDR (attr) = (cu->header.offset.sect_off + + read_8_bytes (abfd, info_ptr)); info_ptr += 8; break; case DW_FORM_ref_sig8: @@ -10319,7 +10331,7 @@ read_attribute_value (struct attribute *attr, unsigned form, info_ptr += 8; break; case DW_FORM_ref_udata: - DW_ADDR (attr) = (cu->header.offset + DW_ADDR (attr) = (cu->header.offset.sect_off + read_unsigned_leb128 (abfd, info_ptr, &bytes_read)); info_ptr += bytes_read; break; @@ -12281,7 +12293,7 @@ lookup_die_type (struct die_info *die, struct attribute *attr, if (is_ref_attr (attr)) { - unsigned int offset = dwarf2_get_ref_die_offset (attr); + sect_offset offset = dwarf2_get_ref_die_offset (attr); this_type = get_die_type_at_offset (offset, cu->per_cu); } @@ -12289,17 +12301,18 @@ lookup_die_type (struct die_info *die, struct attribute *attr, { struct signatured_type *sig_type = DW_SIGNATURED_TYPE (attr); struct dwarf2_cu *sig_cu; - unsigned int offset; + sect_offset offset; /* sig_type will be NULL if the signatured type is missing from the debug info. */ if (sig_type == NULL) error (_("Dwarf Error: Cannot find signatured DIE referenced from DIE " "at 0x%x [in module %s]"), - die->offset, objfile->name); + die->offset.sect_off, objfile->name); gdb_assert (sig_type->per_cu.debug_types_section); - offset = sig_type->per_cu.offset + sig_type->type_offset; + offset.sect_off = (sig_type->per_cu.offset.sect_off + + sig_type->type_offset.cu_off); this_type = get_die_type_at_offset (offset, &sig_type->per_cu); } else @@ -12331,8 +12344,8 @@ lookup_die_type (struct die_info *die, struct attribute *attr, /* read_type_die already issued a complaint. */ message = xstrprintf (_("<unknown type in %s, CU 0x%x, DIE 0x%x>"), objfile->name, - cu->header.offset, - die->offset); + cu->header.offset.sect_off, + die->offset.sect_off); saved = obstack_copy0 (&objfile->objfile_obstack, message, strlen (message)); xfree (message); @@ -13919,13 +13932,13 @@ dump_die_shallow (struct ui_file *f, int indent, struct die_info *die) print_spaces (indent, f); fprintf_unfiltered (f, "Die: %s (abbrev %d, offset 0x%x)\n", - dwarf_tag_name (die->tag), die->abbrev, die->offset); + 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); + die->parent->offset.sect_off); } print_spaces (indent, f); @@ -13982,7 +13995,7 @@ dump_die_shallow (struct ui_file *f, int indent, struct die_info *die) case DW_FORM_ref_sig8: if (DW_SIGNATURED_TYPE (&die->attrs[i]) != NULL) fprintf_unfiltered (f, "signatured type, offset: 0x%x", - DW_SIGNATURED_TYPE (&die->attrs[i])->per_cu.offset); + DW_SIGNATURED_TYPE (&die->attrs[i])->per_cu.offset.sect_off); else fprintf_unfiltered (f, "signatured type, offset: unknown"); break; @@ -14071,11 +14084,15 @@ 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, INSERT); + slot = htab_find_slot_with_hash (cu->die_hash, die, die->offset.sect_off, + INSERT); *slot = die; } +/* DW_ADDR is always stored already as sect_offset; despite for the forms + besides DW_FORM_ref_addr it is stored as cu_offset in the DWARF file. */ + static int is_ref_attr (struct attribute *attr) { @@ -14093,16 +14110,22 @@ is_ref_attr (struct attribute *attr) } } -static unsigned int +/* Return DIE offset of ATTR. Return 0 with complaint if ATTR is not of the + required kind. */ + +static sect_offset dwarf2_get_ref_die_offset (struct attribute *attr) { + sect_offset retval = { DW_ADDR (attr) }; + if (is_ref_attr (attr)) - return DW_ADDR (attr); + return retval; + retval.sect_off = 0; complaint (&symfile_complaints, _("unsupported die ref attribute form: '%s'"), dwarf_form_name (attr->form)); - return 0; + return retval; } /* Return the constant value held by ATTR. Return DEFAULT_VALUE if @@ -14199,7 +14222,7 @@ follow_die_ref_or_sig (struct die_info *src_die, struct attribute *attr, Returns NULL if OFFSET is invalid. */ static struct die_info * -follow_die_offset (unsigned int offset, struct dwarf2_cu **ref_cu) +follow_die_offset (sect_offset offset, struct dwarf2_cu **ref_cu) { struct die_info temp_die; struct dwarf2_cu *target_cu, *cu = *ref_cu; @@ -14237,7 +14260,7 @@ follow_die_offset (unsigned int offset, struct dwarf2_cu **ref_cu) *ref_cu = target_cu; temp_die.offset = offset; - return htab_find_with_hash (target_cu->die_hash, &temp_die, offset); + return htab_find_with_hash (target_cu->die_hash, &temp_die, offset.sect_off); } /* Follow reference attribute ATTR of SRC_DIE. @@ -14248,7 +14271,7 @@ static struct die_info * follow_die_ref (struct die_info *src_die, struct attribute *attr, struct dwarf2_cu **ref_cu) { - unsigned int offset = dwarf2_get_ref_die_offset (attr); + sect_offset offset = dwarf2_get_ref_die_offset (attr); struct dwarf2_cu *cu = *ref_cu; struct die_info *die; @@ -14256,7 +14279,7 @@ follow_die_ref (struct die_info *src_die, struct attribute *attr, if (!die) error (_("Dwarf Error: Cannot find DIE at 0x%x referenced from DIE " "at 0x%x [in module %s]"), - offset, src_die->offset, cu->objfile->name); + offset.sect_off, src_die->offset.sect_off, cu->objfile->name); return die; } @@ -14266,12 +14289,12 @@ follow_die_ref (struct die_info *src_die, struct attribute *attr, dwarf2_locexpr_baton->data has lifetime of PER_CU->OBJFILE. */ struct dwarf2_locexpr_baton -dwarf2_fetch_die_location_block (unsigned int offset_in_cu, +dwarf2_fetch_die_location_block (cu_offset offset_in_cu, struct dwarf2_per_cu_data *per_cu, CORE_ADDR (*get_frame_pc) (void *baton), void *baton) { - unsigned int offset = per_cu->offset + offset_in_cu; + sect_offset offset = { per_cu->offset.sect_off + offset_in_cu.cu_off }; struct dwarf2_cu *cu; struct die_info *die; struct attribute *attr; @@ -14286,7 +14309,7 @@ dwarf2_fetch_die_location_block (unsigned int offset_in_cu, die = follow_die_offset (offset, &cu); if (!die) error (_("Dwarf Error: Cannot find DIE at 0x%x referenced in module %s"), - offset, per_cu->objfile->name); + offset.sect_off, per_cu->objfile->name); attr = dwarf2_attr (die, DW_AT_location, cu); if (!attr) @@ -14314,7 +14337,7 @@ dwarf2_fetch_die_location_block (unsigned int offset_in_cu, 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, per_cu->objfile->name); + offset.sect_off, per_cu->objfile->name); retval.data = DW_BLOCK (attr)->data; retval.size = DW_BLOCK (attr)->size; @@ -14330,11 +14353,15 @@ dwarf2_fetch_die_location_block (unsigned int offset_in_cu, PER_CU. */ struct type * -dwarf2_get_die_type (unsigned int die_offset, +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); - return get_die_type_at_offset (per_cu->offset + die_offset, per_cu); + + 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); } /* Follow the signature attribute ATTR in SRC_DIE. @@ -14356,7 +14383,7 @@ follow_die_sig (struct die_info *src_die, struct attribute *attr, if (sig_type == NULL) error (_("Dwarf Error: Cannot find signatured DIE referenced from DIE " "at 0x%x [in module %s]"), - src_die->offset, objfile->name); + src_die->offset.sect_off, objfile->name); /* If necessary, add it to the queue and load its DIEs. */ @@ -14366,8 +14393,10 @@ follow_die_sig (struct die_info *src_die, struct attribute *attr, gdb_assert (sig_type->per_cu.cu != NULL); sig_cu = sig_type->per_cu.cu; - temp_die.offset = sig_cu->header.offset + sig_type->type_offset; - die = htab_find_with_hash (sig_cu->die_hash, &temp_die, temp_die.offset); + temp_die.offset.sect_off = (sig_type->per_cu.offset.sect_off + + sig_type->type_offset.cu_off); + die = htab_find_with_hash (sig_cu->die_hash, &temp_die, + temp_die.offset.sect_off); if (die) { *ref_cu = sig_cu; @@ -14376,7 +14405,7 @@ follow_die_sig (struct die_info *src_die, struct attribute *attr, error (_("Dwarf Error: Cannot find signatured DIE at 0x%x referenced " "from DIE at 0x%x [in module %s]"), - sig_type->type_offset, src_die->offset, objfile->name); + temp_die.offset.sect_off, src_die->offset.sect_off, objfile->name); } /* Given an offset of a signatured type, return its signatured_type. */ @@ -14384,9 +14413,9 @@ follow_die_sig (struct die_info *src_die, struct attribute *attr, static struct signatured_type * lookup_signatured_type_at_offset (struct objfile *objfile, struct dwarf2_section_info *section, - unsigned int offset) + sect_offset offset) { - gdb_byte *info_ptr = section->buffer + offset; + gdb_byte *info_ptr = section->buffer + offset.sect_off; unsigned int length, initial_length_size; unsigned int sig_offset; struct signatured_type find_entry, *type_sig; @@ -14402,7 +14431,7 @@ lookup_signatured_type_at_offset (struct objfile *objfile, /* This is only used to lookup previously recorded types. If we didn't find it, it's our bug. */ gdb_assert (type_sig != NULL); - gdb_assert (offset == type_sig->per_cu.offset); + gdb_assert (offset.sect_off == type_sig->per_cu.offset.sect_off); return type_sig; } @@ -14414,7 +14443,7 @@ load_full_type_unit (struct dwarf2_per_cu_data *per_cu) { struct objfile *objfile = per_cu->objfile; struct dwarf2_section_info *sect = per_cu->debug_types_section; - unsigned int offset = per_cu->offset; + sect_offset offset = per_cu->offset; struct signatured_type *type_sig; dwarf2_read_section (objfile, sect); @@ -14448,7 +14477,7 @@ read_signatured_type (struct signatured_type *type_sig) struct dwarf2_section_info *section = type_sig->per_cu.debug_types_section; dwarf2_read_section (objfile, section); - types_ptr = section->buffer + type_sig->per_cu.offset; + types_ptr = section->buffer + type_sig->per_cu.offset.sect_off; gdb_assert (type_sig->per_cu.cu == NULL); @@ -15799,7 +15828,7 @@ per_cu_header_read_in (struct comp_unit_head *cu_headerp, objfile = per_cu->objfile; per_objfile = objfile_data (objfile, dwarf2_objfile_data_key); - info_ptr = per_objfile->info.buffer + per_cu->offset; + info_ptr = per_objfile->info.buffer + per_cu->offset.sect_off; memset (cu_headerp, 0, sizeof (*cu_headerp)); read_comp_unit_head (cu_headerp, info_ptr, objfile->obfd); @@ -15866,7 +15895,7 @@ dwarf2_per_cu_text_offset (struct dwarf2_per_cu_data *per_cu) the DIE at OFFSET. Raises an error on failure. */ static struct dwarf2_per_cu_data * -dwarf2_find_containing_comp_unit (unsigned int offset, +dwarf2_find_containing_comp_unit (sect_offset offset, struct objfile *objfile) { struct dwarf2_per_cu_data *this_cu; @@ -15878,29 +15907,32 @@ dwarf2_find_containing_comp_unit (unsigned int offset, { int mid = low + (high - low) / 2; - if (dwarf2_per_objfile->all_comp_units[mid]->offset >= offset) + if (dwarf2_per_objfile->all_comp_units[mid]->offset.sect_off + >= offset.sect_off) high = mid; else low = mid + 1; } gdb_assert (low == high); - if (dwarf2_per_objfile->all_comp_units[low]->offset > offset) + if (dwarf2_per_objfile->all_comp_units[low]->offset.sect_off + > offset.sect_off) { if (low == 0) error (_("Dwarf Error: could not find partial DIE containing " "offset 0x%lx [in module %s]"), - (long) offset, bfd_get_filename (objfile->obfd)); + (long) offset.sect_off, bfd_get_filename (objfile->obfd)); - gdb_assert (dwarf2_per_objfile->all_comp_units[low-1]->offset <= offset); + 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 >= this_cu->offset + this_cu->length) - error (_("invalid dwarf2 offset %u"), offset); - gdb_assert (offset < this_cu->offset + this_cu->length); + && 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; } } @@ -16094,7 +16126,7 @@ dwarf2_free_objfile (struct objfile *objfile) struct dwarf2_offset_and_type { - unsigned int offset; + sect_offset offset; struct type *type; }; @@ -16105,7 +16137,7 @@ offset_and_type_hash (const void *item) { const struct dwarf2_offset_and_type *ofs = item; - return ofs->offset; + return ofs->offset.sect_off; } /* Equality function for a dwarf2_offset_and_type. */ @@ -16116,7 +16148,7 @@ offset_and_type_eq (const void *item_lhs, const void *item_rhs) const struct dwarf2_offset_and_type *ofs_lhs = item_lhs; const struct dwarf2_offset_and_type *ofs_rhs = item_rhs; - return ofs_lhs->offset == ofs_rhs->offset; + return ofs_lhs->offset.sect_off == ofs_rhs->offset.sect_off; } /* Set the type associated with DIE to TYPE. Save it in CU's hash @@ -16177,11 +16209,12 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) ofs.offset = die->offset; ofs.type = type; slot = (struct dwarf2_offset_and_type **) - htab_find_slot_with_hash (*type_hash_ptr, &ofs, ofs.offset, INSERT); + htab_find_slot_with_hash (*type_hash_ptr, &ofs, ofs.offset.sect_off, + INSERT); if (*slot) complaint (&symfile_complaints, _("A problem internal to GDB: DIE 0x%x has type already set"), - die->offset); + die->offset.sect_off); *slot = obstack_alloc (&objfile->objfile_obstack, sizeof (**slot)); **slot = ofs; return type; @@ -16191,7 +16224,7 @@ set_die_type (struct die_info *die, struct type *type, struct dwarf2_cu *cu) table, or return NULL if the die does not have a saved type. */ static struct type * -get_die_type_at_offset (unsigned int offset, +get_die_type_at_offset (sect_offset offset, struct dwarf2_per_cu_data *per_cu) { struct dwarf2_offset_and_type *slot, ofs; @@ -16205,7 +16238,7 @@ get_die_type_at_offset (unsigned int offset, return NULL; ofs.offset = offset; - slot = htab_find_with_hash (type_hash, &ofs, ofs.offset); + slot = htab_find_with_hash (type_hash, &ofs, ofs.offset.sect_off); if (slot) return slot->type; else @@ -16299,7 +16332,7 @@ partial_die_hash (const void *item) { const struct partial_die_info *part_die = item; - return part_die->offset; + return part_die->offset.sect_off; } /* Trivial comparison function for partial_die_info structures: two DIEs @@ -16311,7 +16344,7 @@ 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 == part_die_rhs->offset; + return part_die_lhs->offset.sect_off == part_die_rhs->offset.sect_off; } static struct cmd_list_element *set_dwarf2_cmdlist; @@ -16919,9 +16952,10 @@ write_one_signatured_type (void **slot, void *d) psymtab->n_static_syms, info->cu_index, 1); - store_unsigned_integer (val, 8, BFD_ENDIAN_LITTLE, entry->per_cu.offset); + 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); + store_unsigned_integer (val, 8, BFD_ENDIAN_LITTLE, entry->type_offset.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); @@ -17034,7 +17068,8 @@ write_psymtabs_to_index (struct objfile *objfile, const char *dir) gdb_assert (*slot == NULL); *slot = map; - store_unsigned_integer (val, 8, BFD_ENDIAN_LITTLE, per_cu->offset); + 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); |