gdb/
Fix DW_OP_GNU_implicit_pointer for DWARF32 v3+ on 64-bit arches. * dwarf2-frame.c (execute_stack_op): Initialize ctx->ref_addr_size. * dwarf2expr.c (execute_stack_op) <DW_OP_GNU_implicit_pointer>: Use ctx->ref_addr_size. Handle its invalid value. * dwarf2expr.h (struct dwarf_expr_context): New field ref_addr_size. * dwarf2loc.c (dwarf2_evaluate_loc_desc_full) (dwarf2_loc_desc_needs_frame): Initialize ctx->ref_addr_size. * dwarf2loc.h (dwarf2_per_cu_ref_addr_size): New declaration. * dwarf2read.c (decode_locdesc): Initialize ctx->ref_addr_size. (dwarf2_per_cu_ref_addr_size): New function. gdb/testsuite/ Fix DW_OP_GNU_implicit_pointer for DWARF32 v3+ on 64-bit arches. * gdb.dwarf2/implptr-64bit.S: New file. * gdb.dwarf2/implptr-64bit.exp: New file.
This commit is contained in:
parent
c471e7909f
commit
181cebd4f8
|
@ -1,3 +1,16 @@
|
|||
2011-10-09 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Fix DW_OP_GNU_implicit_pointer for DWARF32 v3+ on 64-bit arches.
|
||||
* dwarf2-frame.c (execute_stack_op): Initialize ctx->ref_addr_size.
|
||||
* dwarf2expr.c (execute_stack_op) <DW_OP_GNU_implicit_pointer>: Use
|
||||
ctx->ref_addr_size. Handle its invalid value.
|
||||
* dwarf2expr.h (struct dwarf_expr_context): New field ref_addr_size.
|
||||
* dwarf2loc.c (dwarf2_evaluate_loc_desc_full)
|
||||
(dwarf2_loc_desc_needs_frame): Initialize ctx->ref_addr_size.
|
||||
* dwarf2loc.h (dwarf2_per_cu_ref_addr_size): New declaration.
|
||||
* dwarf2read.c (decode_locdesc): Initialize ctx->ref_addr_size.
|
||||
(dwarf2_per_cu_ref_addr_size): New function.
|
||||
|
||||
2011-10-09 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Code cleanup.
|
||||
|
|
|
@ -371,6 +371,7 @@ execute_stack_op (const gdb_byte *exp, ULONGEST len, int addr_size,
|
|||
|
||||
ctx->gdbarch = get_frame_arch (this_frame);
|
||||
ctx->addr_size = addr_size;
|
||||
ctx->ref_addr_size = -1;
|
||||
ctx->offset = offset;
|
||||
ctx->baton = this_frame;
|
||||
ctx->funcs = &dwarf2_frame_ctx_funcs;
|
||||
|
|
|
@ -709,10 +709,14 @@ execute_stack_op (struct dwarf_expr_context *ctx,
|
|||
ULONGEST die;
|
||||
LONGEST len;
|
||||
|
||||
if (ctx->ref_addr_size == -1)
|
||||
error (_("DWARF-2 expression error: DW_OP_GNU_implicit_pointer "
|
||||
"is not allowed in frame context"));
|
||||
|
||||
/* The referred-to DIE. */
|
||||
ctx->len = extract_unsigned_integer (op_ptr, ctx->addr_size,
|
||||
ctx->len = extract_unsigned_integer (op_ptr, ctx->ref_addr_size,
|
||||
byte_order);
|
||||
op_ptr += ctx->addr_size;
|
||||
op_ptr += ctx->ref_addr_size;
|
||||
|
||||
/* The byte offset into the data. */
|
||||
op_ptr = read_sleb128 (op_ptr, op_end, &len);
|
||||
|
|
|
@ -125,6 +125,10 @@ struct dwarf_expr_context
|
|||
/* Target address size in bytes. */
|
||||
int addr_size;
|
||||
|
||||
/* DW_FORM_ref_addr size in bytes. If -1 DWARF is executed from a frame
|
||||
context and operations depending on DW_FORM_ref_addr are not allowed. */
|
||||
int ref_addr_size;
|
||||
|
||||
/* Offset used to relocate DW_OP_addr argument. */
|
||||
CORE_ADDR offset;
|
||||
|
||||
|
|
|
@ -1118,6 +1118,7 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame,
|
|||
|
||||
ctx->gdbarch = get_objfile_arch (objfile);
|
||||
ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
|
||||
ctx->ref_addr_size = dwarf2_per_cu_ref_addr_size (per_cu);
|
||||
ctx->offset = dwarf2_per_cu_text_offset (per_cu);
|
||||
ctx->baton = &baton;
|
||||
ctx->funcs = &dwarf_expr_ctx_funcs;
|
||||
|
@ -1398,6 +1399,7 @@ dwarf2_loc_desc_needs_frame (const gdb_byte *data, unsigned short size,
|
|||
|
||||
ctx->gdbarch = get_objfile_arch (objfile);
|
||||
ctx->addr_size = dwarf2_per_cu_addr_size (per_cu);
|
||||
ctx->ref_addr_size = dwarf2_per_cu_ref_addr_size (per_cu);
|
||||
ctx->offset = dwarf2_per_cu_text_offset (per_cu);
|
||||
ctx->baton = &baton;
|
||||
ctx->funcs = &needs_frame_ctx_funcs;
|
||||
|
|
|
@ -39,6 +39,10 @@ struct objfile *dwarf2_per_cu_objfile (struct dwarf2_per_cu_data *cu);
|
|||
/* Return the address size given in the compilation unit header for CU. */
|
||||
CORE_ADDR dwarf2_per_cu_addr_size (struct dwarf2_per_cu_data *cu);
|
||||
|
||||
/* Return the DW_FORM_ref_addr size given in the compilation unit header for
|
||||
CU. */
|
||||
int dwarf2_per_cu_ref_addr_size (struct dwarf2_per_cu_data *cu);
|
||||
|
||||
/* Return the offset size given in the compilation unit header for CU. */
|
||||
int dwarf2_per_cu_offset_size (struct dwarf2_per_cu_data *cu);
|
||||
|
||||
|
|
|
@ -14223,6 +14223,7 @@ decode_locdesc (struct dwarf_block *blk, struct dwarf2_cu *cu)
|
|||
|
||||
ctx->gdbarch = get_objfile_arch (objfile);
|
||||
ctx->addr_size = cu->header.addr_size;
|
||||
ctx->ref_addr_size = dwarf2_per_cu_ref_addr_size (cu->per_cu);
|
||||
ctx->offset = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
|
||||
ctx->baton = ctx;
|
||||
ctx->funcs = &decode_locdesc_ctx_funcs;
|
||||
|
@ -15313,6 +15314,22 @@ dwarf2_per_cu_offset_size (struct dwarf2_per_cu_data *per_cu)
|
|||
return cu_headerp->offset_size;
|
||||
}
|
||||
|
||||
/* See its dwarf2loc.h declaration. */
|
||||
|
||||
int
|
||||
dwarf2_per_cu_ref_addr_size (struct dwarf2_per_cu_data *per_cu)
|
||||
{
|
||||
struct comp_unit_head cu_header_local;
|
||||
const struct comp_unit_head *cu_headerp;
|
||||
|
||||
cu_headerp = per_cu_header_read_in (&cu_header_local, per_cu);
|
||||
|
||||
if (cu_headerp->version == 2)
|
||||
return cu_headerp->addr_size;
|
||||
else
|
||||
return cu_headerp->offset_size;
|
||||
}
|
||||
|
||||
/* Return the text offset of the CU. The returned offset comes from
|
||||
this CU's objfile. If this objfile came from a separate debuginfo
|
||||
file, then the offset may be different from the corresponding
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2011-10-09 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Fix DW_OP_GNU_implicit_pointer for DWARF32 v3+ on 64-bit arches.
|
||||
* gdb.dwarf2/implptr-64bit.S: New file.
|
||||
* gdb.dwarf2/implptr-64bit.exp: New file.
|
||||
|
||||
2011-10-09 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
Fix initial language detection with -readnow.
|
||||
|
|
|
@ -0,0 +1,197 @@
|
|||
/* Copyright 2010, 2011 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
.section .debug_info
|
||||
d:
|
||||
/* Length of Compilation Unit Info */
|
||||
#if OFFSET_SIZE == 4
|
||||
# define OFFSET .4byte
|
||||
.4byte debug_end - 1f
|
||||
#elif OFFSET_SIZE == 8
|
||||
# define OFFSET .8byte
|
||||
.4byte 0xffffffff
|
||||
.8byte debug_end - 1f
|
||||
#else
|
||||
# error
|
||||
#endif
|
||||
#if ADDR_SIZE == 4
|
||||
# define ADDR .4byte
|
||||
#elif ADDR_SIZE == 8
|
||||
# define ADDR .8byte
|
||||
#else
|
||||
# error
|
||||
#endif
|
||||
#if REF_ADDR_SIZE == 4
|
||||
# define REF_ADDR .4byte
|
||||
#elif REF_ADDR_SIZE == 8
|
||||
# define REF_ADDR .8byte
|
||||
#else
|
||||
# error
|
||||
#endif
|
||||
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 */
|
||||
|
||||
.Ltype_int:
|
||||
.uleb128 0x7 /* DW_TAG_base_type */
|
||||
.byte 0x4 /* DW_AT_byte_size */
|
||||
.byte 0x5 /* DW_AT_encoding */
|
||||
.ascii "int\0" /* DW_AT_name */
|
||||
|
||||
.Ltype_struct:
|
||||
.uleb128 0x2 /* DW_TAG_structure_type */
|
||||
.ascii "s\0" /* DW_AT_name */
|
||||
.byte 4 /* DW_AT_byte_size */
|
||||
|
||||
.uleb128 0x3 /* DW_TAG_member */
|
||||
.ascii "f\0" /* DW_AT_name */
|
||||
.4byte .Ltype_int - d /* DW_AT_type */
|
||||
.byte 0 /* DW_AT_data_member_location */
|
||||
|
||||
.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 */
|
||||
.4byte .Ltype_struct - d /* DW_AT_type */
|
||||
|
||||
.Lvar_out:
|
||||
.uleb128 0x4 /* (DW_TAG_variable) */
|
||||
.ascii "v\0" /* DW_AT_name */
|
||||
.byte 2f - 1f /* DW_AT_location: DW_FORM_block1 */
|
||||
1:
|
||||
.byte 0x9e /* DW_OP_implicit_value */
|
||||
.uleb128 2f - 3f
|
||||
3:
|
||||
.byte 1, 1, 1, 1
|
||||
2:
|
||||
.4byte .Ltype_struct - d /* DW_AT_type */
|
||||
|
||||
.uleb128 0x4 /* (DW_TAG_variable) */
|
||||
.ascii "p\0" /* DW_AT_name */
|
||||
.byte 2f - 1f /* DW_AT_location: DW_FORM_block1 */
|
||||
1:
|
||||
.byte 0xf2 /* DW_OP_GNU_implicit_pointer */
|
||||
REF_ADDR .Lvar_out - d /* referenced DIE */
|
||||
.sleb128 0 /* offset */
|
||||
2:
|
||||
.4byte .Ltype_structptr - d /* DW_AT_type */
|
||||
|
||||
.byte 0x0 /* end of children of main */
|
||||
|
||||
.byte 0x0 /* end of children of CU */
|
||||
debug_end:
|
||||
|
||||
.section .debug_abbrev
|
||||
.Ldebug_abbrev0:
|
||||
|
||||
.uleb128 0x1 /* (abbrev code) */
|
||||
.uleb128 0x11 /* (TAG: DW_TAG_compile_unit) */
|
||||
.byte 0x1 /* DW_children_yes */
|
||||
.uleb128 0x25 /* (DW_AT_producer) */
|
||||
.uleb128 0x8 /* (DW_FORM_string) */
|
||||
.uleb128 0x13 /* (DW_AT_language) */
|
||||
.uleb128 0xb /* (DW_FORM_data1) */
|
||||
.uleb128 0x3 /* (DW_AT_name) */
|
||||
.uleb128 0x8 /* (DW_FORM_string) */
|
||||
.byte 0x0
|
||||
.byte 0x0
|
||||
|
||||
.uleb128 0x2 /* (abbrev code) */
|
||||
.uleb128 0x13 /* (TAG: DW_TAG_structure_type) */
|
||||
.byte 0x1 /* DW_children_yes */
|
||||
.uleb128 0x3 /* (DW_AT_name) */
|
||||
.uleb128 0x8 /* (DW_FORM_string) */
|
||||
.uleb128 0xb /* (DW_AT_byte_size) */
|
||||
.uleb128 0xb /* (DW_FORM_data1) */
|
||||
.byte 0
|
||||
.byte 0
|
||||
|
||||
.uleb128 0x3 /* (abbrev code) */
|
||||
.uleb128 0xd /* (TAG: DW_TAG_member) */
|
||||
.byte 0 /* DW_children_no */
|
||||
.uleb128 0x3 /* (DW_AT_name) */
|
||||
.uleb128 0x8 /* (DW_FORM_string) */
|
||||
.uleb128 0x49 /* (DW_AT_type) */
|
||||
.uleb128 0x13 /* (DW_FORM_ref4) */
|
||||
.uleb128 0x38 /* (DW_AT_data_member_location) */
|
||||
.uleb128 0xb /* (DW_FORM_data1) */
|
||||
.byte 0
|
||||
.byte 0
|
||||
|
||||
.uleb128 0x4 /* (abbrev code) */
|
||||
.uleb128 0x34 /* (TAG: DW_TAG_variable) */
|
||||
.byte 0x0 /* DW_children_yes */
|
||||
.uleb128 0x3 /* (DW_AT_name) */
|
||||
.uleb128 0x8 /* (DW_FORM_string) */
|
||||
.uleb128 0x02 /* (DW_AT_location) */
|
||||
.uleb128 0xa /* (DW_FORM_block1) */
|
||||
.uleb128 0x49 /* (DW_AT_type) */
|
||||
.uleb128 0x13 /* (DW_FORM_ref4) */
|
||||
.byte 0x0
|
||||
.byte 0x0
|
||||
|
||||
.uleb128 0x5 /* (abbrev code) */
|
||||
.uleb128 0xf /* (TAG: DW_TAG_pointer_type) */
|
||||
.byte 0x0 /* DW_children_no */
|
||||
.uleb128 0xb /* (DW_AT_byte_size) */
|
||||
.uleb128 0xb /* (DW_FORM_data1) */
|
||||
.uleb128 0x49 /* (DW_AT_type) */
|
||||
.uleb128 0x13 /* (DW_FORM_ref4) */
|
||||
.byte 0x0
|
||||
.byte 0x0
|
||||
|
||||
.uleb128 6 /* Abbrev code */
|
||||
.uleb128 0x2e /* DW_TAG_subprogram */
|
||||
.byte 1 /* has_children */
|
||||
.uleb128 0x3 /* DW_AT_name */
|
||||
.uleb128 0x8 /* DW_FORM_string */
|
||||
.uleb128 0x11 /* DW_AT_low_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x12 /* DW_AT_high_pc */
|
||||
.uleb128 0x1 /* DW_FORM_addr */
|
||||
.uleb128 0x49 /* DW_AT_type */
|
||||
.uleb128 0x13 /* DW_FORM_ref4 */
|
||||
.uleb128 0x3f /* DW_AT_external */
|
||||
.uleb128 0xc /* DW_FORM_flag */
|
||||
.byte 0x0 /* Terminator */
|
||||
.byte 0x0 /* Terminator */
|
||||
|
||||
.uleb128 0x7 /* (abbrev code) */
|
||||
.uleb128 0x24 /* (TAG: DW_TAG_base_type) */
|
||||
.byte 0 /* DW_children_no */
|
||||
.uleb128 0xb /* (DW_AT_byte_size) */
|
||||
.uleb128 0xb /* (DW_FORM_data1) */
|
||||
.uleb128 0x3e /* (DW_AT_encoding) */
|
||||
.uleb128 0xb /* (DW_FORM_data1) */
|
||||
.uleb128 0x3 /* (DW_AT_name) */
|
||||
.uleb128 0x8 /* (DW_FORM_string) */
|
||||
.byte 0
|
||||
.byte 0
|
||||
|
||||
.byte 0x0
|
|
@ -0,0 +1,52 @@
|
|||
# Copyright 2011 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
load_lib dwarf.exp
|
||||
|
||||
# This test can only be run on targets which support DWARF-2 and use gas.
|
||||
if {![dwarf2_support]} {
|
||||
return 0
|
||||
}
|
||||
|
||||
set testfile "implptr-64bit"
|
||||
set srcfile ${testfile}.S
|
||||
set mainfile main.c
|
||||
|
||||
proc test { dwarf_version offset_size addr_size ref_addr_size } {
|
||||
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 } {
|
||||
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 executable ${testfile}-${name}
|
||||
if [prepare_for_testing ${testfile}.exp $executable "${srcfile} ${mainfile}" $opts] {
|
||||
return -1
|
||||
}
|
||||
|
||||
if ![runto_main] {
|
||||
return -1
|
||||
}
|
||||
|
||||
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
|
Loading…
Reference in New Issue