diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2011-10-09 18:46:41 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2011-10-09 18:46:41 +0000 |
commit | 181cebd4f8897990b94df2d979b16911d2281657 (patch) | |
tree | 0e9cb55caaea5bd017f8dd805b3d9d9b0ac0f3d9 /gdb/testsuite | |
parent | c471e7909f052d386656f328b365d5ef84fd0fdb (diff) | |
download | gdb-181cebd4f8897990b94df2d979b16911d2281657.zip gdb-181cebd4f8897990b94df2d979b16911d2281657.tar.gz gdb-181cebd4f8897990b94df2d979b16911d2281657.tar.bz2 |
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.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/implptr-64bit.S | 197 | ||||
-rw-r--r-- | gdb/testsuite/gdb.dwarf2/implptr-64bit.exp | 52 |
3 files changed, 255 insertions, 0 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 8c9a719..d21d922 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,11 @@ 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. * gdb.cp/readnow-language.cc: New file. * gdb.cp/readnow-language.exp: New file. diff --git a/gdb/testsuite/gdb.dwarf2/implptr-64bit.S b/gdb/testsuite/gdb.dwarf2/implptr-64bit.S new file mode 100644 index 0000000..6efb7de --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/implptr-64bit.S @@ -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 diff --git a/gdb/testsuite/gdb.dwarf2/implptr-64bit.exp b/gdb/testsuite/gdb.dwarf2/implptr-64bit.exp new file mode 100644 index 0000000..c2bcd23 --- /dev/null +++ b/gdb/testsuite/gdb.dwarf2/implptr-64bit.exp @@ -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 |