This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[commit] [patch 2/2] typedef-checking for CU relative vs. absolute offsets
- From: Jan Kratochvil <jan dot kratochvil at redhat dot com>
- To: Joel Brobecker <brobecker at adacore dot com>, Tom Tromey <tromey at redhat dot com>
- Cc: gdb-patches at sourceware dot org
- Date: Mon, 19 Mar 2012 21:01:05 +0100
- Subject: [commit] [patch 2/2] typedef-checking for CU relative vs. absolute offsets
On Fri, 09 Mar 2012 20:51:50 +0100, Joel Brobecker wrote:
> > Another proposal is 'cu_o' and 'sect_o' or even 'cu_off' or 'sect_off'.
>
> I would personally go with the second option (cu_off and sect_off).
On Fri, 09 Mar 2012 20:55:52 +0100, Tom Tromey wrote:
> I think they are ok too. DWARF doesn't provide these terms exactly, but
> pretty close, e.g.:
Checked in.
Thanks,
Jan
http://sourceware.org/ml/gdb-cvs/2012-03/msg00238.html
--- src/gdb/ChangeLog 2012/03/19 18:23:51 1.14028
+++ src/gdb/ChangeLog 2012/03/19 19:59:15 1.14029
@@ -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
--- src/gdb/dwarf2expr.c 2012/03/01 21:13:58 1.79
+++ src/gdb/dwarf2expr.c 2012/03/19 19:59:18 1.80
@@ -342,7 +342,7 @@
}
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
/* 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 @@
/* 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"));
}
--- src/gdb/dwarf2expr.h 2012/01/04 08:17:00 1.43
+++ src/gdb/dwarf2expr.h 2012/03/19 19:59:18 1.44
@@ -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 @@
/* 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 @@
/* 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
{
/* 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 @@
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);
--- src/gdb/dwarf2loc.c 2012/03/13 01:16:07 1.141
+++ src/gdb/dwarf2loc.c 2012/03/19 19:59:19 1.142
@@ -284,7 +284,7 @@
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 @@
/* 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 @@
/* 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 @@
/* 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 @@
{
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 @@
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 @@
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 @@
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;
--- src/gdb/dwarf2loc.h 2012/03/08 19:37:07 1.30
+++ src/gdb/dwarf2loc.h 2012/03/19 19:59:19 1.31
@@ -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 @@
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
--- src/gdb/dwarf2read.c 2012/03/16 18:26:00 1.626
+++ src/gdb/dwarf2read.c 2012/03/19 19:59:19 1.627
@@ -216,7 +216,7 @@
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 @@
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 @@
/* 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 @@
/* 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 @@
/* 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 @@
- 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 @@
{
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 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 @@
/* 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 @@
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 @@
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 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 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 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_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 @@
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 @@
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 @@
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 @@
/* 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 @@
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 @@
"(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 @@
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 @@
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 @@
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 @@
*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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
{
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
/* 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 @@
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 @@
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 @@
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 @@
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 @@
&& 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 @@
&& 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
_("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 @@
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 @@
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 @@
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 @@
= 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 @@
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 @@
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 @@
{
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 @@
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 @@
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_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 @@
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 @@
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 @@
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 @@
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 @@
_("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 @@
"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 @@
/* 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
{
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 @@
/* 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 @@
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 @@
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 @@
{
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 @@
}
}
-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 @@
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 @@
*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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
/* 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 @@
{
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 @@
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 @@
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 @@
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 @@
{
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 @@
struct dwarf2_offset_and_type
{
- unsigned int offset;
+ sect_offset offset;
struct type *type;
};
@@ -16105,7 +16137,7 @@
{
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 @@
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 @@
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 @@
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 @@
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 @@
{
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 @@
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 @@
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 @@
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);