summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog16
-rw-r--r--gdb/dwarf2expr.c4
-rw-r--r--gdb/dwarf2expr.h4
-rw-r--r--gdb/dwarf2loc.c14
-rw-r--r--gdb/dwarf2loc.h7
-rw-r--r--gdb/dwarf2read.c23
-rw-r--r--gdb/testsuite/ChangeLog7
-rw-r--r--gdb/testsuite/gdb.dwarf2/implptr-64bit.S57
-rw-r--r--gdb/testsuite/gdb.dwarf2/implptr-64bit.exp20
9 files changed, 113 insertions, 39 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index fc2678a10e7..fc84e686478 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,21 @@
2012-12-10 Tom Tromey <tromey@redhat.com>
+ * dwarf2read.c (dwarf2_fetch_die_loc_sect_off): New function.
+ (dwarf2_fetch_die_loc_cu_off): Rename from
+ dwarf2_fetch_die_location_block. Rewrite to use
+ dwarf2_fetch_die_loc_sect_off.
+ * dwarf2loc.h (dwarf2_fetch_die_loc_sect_off): Declare.
+ (dwarf2_fetch_die_loc_cu_off): Rename.
+ * dwarf2loc.c (indirect_pieced_value): Use
+ dwarf2_fetch_die_loc_sect_off.
+ * dwarf2expr.h (struct dwarf_expr_context) <len, data>: Update
+ comment.
+ (struct dwarf_expr_piece) <v.ptr.die>: Now a sect_offset.
+ * dwarf2expr.c (add_piece): Update.
+ (execute_stack_op) <DW_OP_GNU_implicit_pointer>: Update comment.
+
+2012-12-10 Tom Tromey <tromey@redhat.com>
+
* buildsym.c (struct pending_block): Move from buildsym.h.
(pending_blocks): Likewise; now static.
(pending_block_obstack): New global.
diff --git a/gdb/dwarf2expr.c b/gdb/dwarf2expr.c
index 214b371e569..877add44d83 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.cu_off = ctx->len;
+ p->v.ptr.die.sect_off = ctx->len;
p->v.ptr.offset = value_as_long (dwarf_expr_fetch (ctx, 0));
}
else if (p->location == DWARF_VALUE_REGISTER)
@@ -872,7 +872,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 of cu_offset kind. */
+ /* The referred-to DIE of sect_offset kind. */
ctx->len = extract_unsigned_integer (op_ptr, ctx->ref_addr_size,
byte_order);
op_ptr += ctx->ref_addr_size;
diff --git a/gdb/dwarf2expr.h b/gdb/dwarf2expr.h
index 19efbfd78bb..1b890dcf570 100644
--- a/gdb/dwarf2expr.h
+++ b/gdb/dwarf2expr.h
@@ -165,7 +165,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 of cu_offset kind. */
+ target DIE of sect_offset kind. */
ULONGEST len;
const gdb_byte *data;
@@ -236,7 +236,7 @@ struct dwarf_expr_piece
struct
{
/* The referent DIE from DW_OP_GNU_implicit_pointer. */
- cu_offset die;
+ sect_offset die;
/* The byte offset into the resulting data. */
LONGEST offset;
} ptr;
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c
index 0f8e9af6676..0a5200a8a90 100644
--- a/gdb/dwarf2loc.c
+++ b/gdb/dwarf2loc.c
@@ -429,8 +429,7 @@ per_cu_dwarf_call (struct dwarf_expr_context *ctx, cu_offset die_offset,
{
struct dwarf2_locexpr_baton block;
- block = dwarf2_fetch_die_location_block (die_offset, per_cu,
- get_frame_pc, baton);
+ block = dwarf2_fetch_die_loc_cu_off (die_offset, per_cu, get_frame_pc, baton);
/* DW_OP_call_ref is currently not supported. */
gdb_assert (block.per_cu == per_cu);
@@ -2038,9 +2037,10 @@ indirect_pieced_value (struct value *value)
byte_offset = value_as_address (value);
gdb_assert (piece);
- baton = dwarf2_fetch_die_location_block (piece->v.ptr.die, c->per_cu,
- get_frame_address_in_block_wrapper,
- frame);
+ baton
+ = dwarf2_fetch_die_loc_sect_off (piece->v.ptr.die, c->per_cu,
+ get_frame_address_in_block_wrapper,
+ frame);
return dwarf2_evaluate_loc_desc_full (TYPE_TARGET_TYPE (type), frame,
baton.data, baton.size, baton.per_cu,
@@ -3205,8 +3205,8 @@ dwarf2_compile_expr_to_ax (struct agent_expr *expr, struct axs_value *loc,
op_ptr += size;
offset.cu_off = uoffset;
- block = dwarf2_fetch_die_location_block (offset, per_cu,
- get_ax_pc, expr);
+ block = dwarf2_fetch_die_loc_cu_off (offset, per_cu,
+ get_ax_pc, expr);
/* DW_OP_call_ref is currently not supported. */
gdb_assert (block.per_cu == per_cu);
diff --git a/gdb/dwarf2loc.h b/gdb/dwarf2loc.h
index 0f1076798c8..6a8b3c8c7b9 100644
--- a/gdb/dwarf2loc.h
+++ b/gdb/dwarf2loc.h
@@ -62,7 +62,12 @@ const gdb_byte *dwarf2_find_location_expression
size_t *locexpr_length,
CORE_ADDR pc);
-struct dwarf2_locexpr_baton dwarf2_fetch_die_location_block
+struct dwarf2_locexpr_baton dwarf2_fetch_die_loc_sect_off
+ (sect_offset offset_in_cu, struct dwarf2_per_cu_data *per_cu,
+ CORE_ADDR (*get_frame_pc) (void *baton),
+ void *baton);
+
+struct dwarf2_locexpr_baton dwarf2_fetch_die_loc_cu_off
(cu_offset offset_in_cu, struct dwarf2_per_cu_data *per_cu,
CORE_ADDR (*get_frame_pc) (void *baton),
void *baton);
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
index 6eea17e6981..2168c69ef2d 100644
--- a/gdb/dwarf2read.c
+++ b/gdb/dwarf2read.c
@@ -17334,12 +17334,11 @@ 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 (cu_offset offset_in_cu,
- struct dwarf2_per_cu_data *per_cu,
- CORE_ADDR (*get_frame_pc) (void *baton),
- void *baton)
+dwarf2_fetch_die_loc_sect_off (sect_offset offset,
+ struct dwarf2_per_cu_data *per_cu,
+ CORE_ADDR (*get_frame_pc) (void *baton),
+ void *baton)
{
- sect_offset offset = { per_cu->offset.sect_off + offset_in_cu.cu_off };
struct dwarf2_cu *cu;
struct die_info *die;
struct attribute *attr;
@@ -17394,6 +17393,20 @@ dwarf2_fetch_die_location_block (cu_offset offset_in_cu,
return retval;
}
+/* Like dwarf2_fetch_die_loc_sect_off, but take a CU
+ offset. */
+
+struct dwarf2_locexpr_baton
+dwarf2_fetch_die_loc_cu_off (cu_offset offset_in_cu,
+ struct dwarf2_per_cu_data *per_cu,
+ CORE_ADDR (*get_frame_pc) (void *baton),
+ void *baton)
+{
+ sect_offset offset = { per_cu->offset.sect_off + offset_in_cu.cu_off };
+
+ return dwarf2_fetch_die_loc_sect_off (offset, per_cu, get_frame_pc, baton);
+}
+
/* Return the type of the DIE at DIE_OFFSET in the CU named by
PER_CU. */
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index de29aa386aa..9f38c8d38a2 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,10 @@
+2012-12-10 Tom Tromey <tromey@redhat.com>
+
+ * gdb.dwarf2/implptr-64bit.exp: Run tests with two CUs as well.
+ (test): Add "two_cu" argument.
+ * gdb.dwarf2/implptr-64bit.S: Move subprogram later; use ref_addr
+ for types; allow two CUs.
+
2012-12-09 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.dwarf2/dw2-compdir-oldgcc.S: New file.
diff --git a/gdb/testsuite/gdb.dwarf2/implptr-64bit.S b/gdb/testsuite/gdb.dwarf2/implptr-64bit.S
index be8db5c182c..d0d870ac880 100644
--- a/gdb/testsuite/gdb.dwarf2/implptr-64bit.S
+++ b/gdb/testsuite/gdb.dwarf2/implptr-64bit.S
@@ -18,11 +18,12 @@ d:
/* Length of Compilation Unit Info */
#if OFFSET_SIZE == 4
# define OFFSET .4byte
- .4byte debug_end - 1f
+# define HEADER_LINE1
+# define HEADER_LINE2(END) .4byte END - 1f
#elif OFFSET_SIZE == 8
# define OFFSET .8byte
- .4byte 0xffffffff
- .8byte debug_end - 1f
+# define HEADER_LINE1 .4byte 0xffffffff
+# define HEADER_LINE2(END) .8byte END - 1f
#else
# error
#endif
@@ -40,6 +41,16 @@ d:
#else
# error
#endif
+
+#if TWO_CU
+# define END1 .Lcu_end_1
+#else
+# define END1 debug_end
+#endif
+
+ HEADER_LINE1
+ HEADER_LINE2(END1)
+
1:
.2byte DWARF_VERSION /* DWARF version number */
OFFSET .Ldebug_abbrev0 /* Offset Into Abbrev. Section */
@@ -68,13 +79,6 @@ d:
.byte 0x0 /* end of children of DW_TAG_structure_type */
- .uleb128 6 /* Abbrev: DW_TAG_subprogram */
- .ascii "main\0" /* DW_AT_name */
- ADDR main /* DW_AT_low_pc */
- ADDR main + 0x100 /* DW_AT_high_pc */
- .4byte .Ltype_int - d /* DW_AT_type */
- .byte 1 /* DW_AT_external */
-
.Ltype_structptr:
.uleb128 0x5 /* DW_TAG_pointer_type */
.byte ADDR_SIZE /* DW_AT_byte_size */
@@ -90,7 +94,32 @@ d:
3:
.byte 1, 1, 1, 1
2:
- .4byte .Ltype_struct - d /* DW_AT_type */
+ REF_ADDR .Ltype_struct - d /* DW_AT_type */
+
+#if TWO_CU
+ .byte 0x0 /* end of children of CU */
+.Lcu_end_1:
+
+ HEADER_LINE1
+ HEADER_LINE2 (debug_end)
+
+1:
+ .2byte DWARF_VERSION /* DWARF version number */
+ OFFSET .Ldebug_abbrev0 /* Offset Into Abbrev. Section */
+ .byte ADDR_SIZE /* Pointer Size (in bytes) */
+
+ .uleb128 0x1 /* (DIE (0xb) DW_TAG_compile_unit) */
+ .ascii "GNU C 4.4.3\0" /* DW_AT_producer */
+ .byte 0x1 /* DW_AT_language */
+ .ascii "1.c\0" /* DW_AT_name */
+#endif
+
+ .uleb128 6 /* Abbrev: DW_TAG_subprogram */
+ .ascii "main\0" /* DW_AT_name */
+ ADDR main /* DW_AT_low_pc */
+ ADDR main + 0x100 /* DW_AT_high_pc */
+ REF_ADDR .Ltype_int - d /* DW_AT_type */
+ .byte 1 /* DW_AT_external */
.uleb128 0x4 /* (DW_TAG_variable) */
.ascii "p\0" /* DW_AT_name */
@@ -100,7 +129,7 @@ d:
REF_ADDR .Lvar_out - d /* referenced DIE */
.sleb128 0 /* offset */
2:
- .4byte .Ltype_structptr - d /* DW_AT_type */
+ REF_ADDR .Ltype_structptr - d /* DW_AT_type */
.byte 0x0 /* end of children of main */
@@ -152,7 +181,7 @@ debug_end:
.uleb128 0x02 /* (DW_AT_location) */
.uleb128 0xa /* (DW_FORM_block1) */
.uleb128 0x49 /* (DW_AT_type) */
- .uleb128 0x13 /* (DW_FORM_ref4) */
+ .uleb128 0x10 /* (DW_FORM_ref_addr) */
.byte 0x0
.byte 0x0
@@ -176,7 +205,7 @@ debug_end:
.uleb128 0x12 /* DW_AT_high_pc */
.uleb128 0x1 /* DW_FORM_addr */
.uleb128 0x49 /* DW_AT_type */
- .uleb128 0x13 /* DW_FORM_ref4 */
+ .uleb128 0x10 /* DW_FORM_ref_addr */
.uleb128 0x3f /* DW_AT_external */
.uleb128 0xc /* DW_FORM_flag */
.byte 0x0 /* Terminator */
diff --git a/gdb/testsuite/gdb.dwarf2/implptr-64bit.exp b/gdb/testsuite/gdb.dwarf2/implptr-64bit.exp
index 78f1594d1e6..066cf782d1b 100644
--- a/gdb/testsuite/gdb.dwarf2/implptr-64bit.exp
+++ b/gdb/testsuite/gdb.dwarf2/implptr-64bit.exp
@@ -22,16 +22,16 @@ if {![dwarf2_support]} {
standard_testfile .S
set mainfile main.c
-proc test { dwarf_version offset_size addr_size ref_addr_size } {
+proc test { dwarf_version offset_size addr_size ref_addr_size two_cu } {
global testfile srcfile mainfile
# 32-bit targets do not support any of the testcases; keep quiet there.
set opts {quiet}
- foreach n { dwarf_version offset_size addr_size ref_addr_size } {
+ foreach n { dwarf_version offset_size addr_size ref_addr_size two_cu } {
lappend opts "additional_flags=-D[string toupper $n]=[expr "\$$n"]"
}
- set name "d${dwarf_version}o${offset_size}a${addr_size}r${ref_addr_size}"
+ set name "d${dwarf_version}o${offset_size}a${addr_size}r${ref_addr_size}t${two_cu}"
set executable ${testfile}-${name}
if [prepare_for_testing ${testfile}.exp $executable "${srcfile} ${mainfile}" $opts] {
return -1
@@ -44,8 +44,12 @@ proc test { dwarf_version offset_size addr_size ref_addr_size } {
gdb_test "p/x p->f" " = 0x1010101" $name
}
-# DWARF_VERSION OFFSET_SIZE ADDR_SIZE REF_ADDR_SIZE
-test 2 8 4 4
-test 2 4 8 8
-test 3 8 4 8
-test 3 4 8 4
+# DWARF_VERSION OFFSET_SIZE ADDR_SIZE REF_ADDR_SIZE TWO_CU
+test 2 8 4 4 0
+test 2 4 8 8 0
+test 3 8 4 8 0
+test 3 4 8 4 0
+test 2 8 4 4 1
+test 2 4 8 8 1
+test 3 8 4 8 1
+test 3 4 8 4 1