http://sourceware.org/ml/gdb-patches/2014-07/msg00277.html Subject: [patchv3] Fix crash on optimized-out entry data values --Dxnq1zWXvFF0Q93v Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Wed, 09 Jul 2014 17:31:21 +0200, Jan Kratochvil wrote: > On Wed, 09 Jul 2014 13:52:00 +0200, Pedro Alves wrote: > > On 07/09/2014 11:33 AM, Jan Kratochvil wrote: > > > --- a/gdb/value.c > > > +++ b/gdb/value.c > > > @@ -198,12 +198,13 @@ struct value > > > unsigned int lazy : 1; > > > > > > /* If nonzero, this is the value of a variable that does not > > > - actually exist in the program. If nonzero, and LVAL is > > > + actually fully exist in the program. If nonzero, and LVAL is > > > lval_register, this is a register ($pc, $sp, etc., never a > > > program variable) that has not been saved in the frame. All > > > optimized-out values are treated pretty much the same, except > > > registers have a different string representation and related > > > - error strings. */ > > > + error strings. It is true also for only partially optimized > > > + out variables - see the 'unavailable' field below. */ > > > unsigned int optimized_out : 1; > > > > > > /* If value is a variable, is it initialized or not. */ > > > @@ -334,7 +335,10 @@ struct value > > > valid if lazy is nonzero. */ > > > gdb_byte *contents; > > > > > > - /* Unavailable ranges in CONTENTS. We mark unavailable ranges, > > > + /* If OPTIMIZED_OUT is false then UNAVAILABLE must be VEC_empty > > > + (not necessarily NULL). > > > > Hmm, why? We can collect only part of a non-optimized out value. > > What am I missing? > > I miss some documentation how these availability fields interact together. >From a comment in mail Message-Id: <201102071427.55970.pedro@codesourcery.com> We give preference to printing rather than , since if a value had been optimized out at compile time, it can never be collected at run-time. it seems it is just reversed, that 'unavailable' can exist only for !optimized_out and it cannot exist for for optimized_out values. > You are right, this patch regresses during gdbserver mode. It PASSes now even in gdbserver mode. Thanks, Jan --Dxnq1zWXvFF0Q93v Content-Type: text/plain; charset=us-ascii Content-Disposition: inline; filename="optimfix3.patch" gdb/ 2014-07-09 Jan Kratochvil * value.c (struct value): Extend the comment for fields optimized_out and unavailable. (value_available_contents_bits_eq): Handle OPTIMIZED_OUT values as special cases. gdb/testsuite/ 2014-07-09 Jan Kratochvil * gdb.arch/amd64-entry-value-paramref.S: New file. * gdb.arch/amd64-entry-value-paramref.cc: New file. * gdb.arch/amd64-entry-value-paramref.exp: New file. * gdb.arch/amd64-optimout-repeat.S: New file. * gdb.arch/amd64-optimout-repeat.c: New file. * gdb.arch/amd64-optimout-repeat.exp: New file. diff --git a/gdb/value.c b/gdb/value.c index 557056f..c017c75 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -198,12 +198,14 @@ struct value unsigned int lazy : 1; /* If nonzero, this is the value of a variable that does not - actually exist in the program. If nonzero, and LVAL is + actually exist in the program at all. If nonzero, and LVAL is lval_register, this is a register ($pc, $sp, etc., never a program variable) that has not been saved in the frame. All optimized-out values are treated pretty much the same, except registers have a different string representation and related - error strings. */ + error strings. When it is zero it still maybe only partially + available (equally partially optimized out) - see the + 'unavailable' field below. */ unsigned int optimized_out : 1; /* If value is a variable, is it initialized or not. */ @@ -334,7 +336,9 @@ struct value valid if lazy is nonzero. */ gdb_byte *contents; - /* Unavailable ranges in CONTENTS. We mark unavailable ranges, + /* If OPTIMIZED_OUT is nonzero then UNAVAILABLE must be VEC_empty + (not necessarily NULL). Otherwise it specifies + unavailable ranges in CONTENTS. We mark unavailable ranges, rather than available, since the common and default case is for a value to be available. This is filled in at value read time. The unavailable ranges are tracked in bits. */ @@ -701,6 +705,13 @@ value_available_contents_bits_eq (const struct value *val1, int offset1, /* See function description in value.h. */ gdb_assert (!val1->lazy && !val2->lazy); + gdb_assert (!val1->optimized_out || VEC_empty (range_s, val1->unavailable)); + gdb_assert (!val2->optimized_out || VEC_empty (range_s, val2->unavailable)); + if (val1->optimized_out != val2->optimized_out) + return 0; + if (val1->optimized_out && val2->optimized_out) + return 1; + while (length > 0) { range_s *r1, *r2; diff --git a/gdb/testsuite/gdb.arch/amd64-entry-value-paramref.S b/gdb/testsuite/gdb.arch/amd64-entry-value-paramref.S new file mode 100644 index 0000000..a1e9d0a --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-entry-value-paramref.S @@ -0,0 +1,459 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2014 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 . */ + +/* This file is compiled from gdb.arch/amd64-entry-value-paramref.cc + using -g -dA -S -O2. + Additionally it has been patched. */ + + .file "amd64-entry-value-paramref.cc" + .text +.Ltext0: + .p2align 4,,15 + .type _ZL3barRi.constprop.0, @function +_ZL3barRi.constprop.0: +.LFB2: + .file 1 "gdb.arch/amd64-entry-value-paramref.cc" + # gdb.arch/amd64-entry-value-paramref.cc:21 + .loc 1 21 0 + .cfi_startproc +.LVL0: +# BLOCK 2 freq:10000 seq:0 +# PRED: ENTRY [100.0%] (FALLTHRU) + # gdb.arch/amd64-entry-value-paramref.cc:23 + .loc 1 23 0 + movl vv(%rip), %eax + # gdb.arch/amd64-entry-value-paramref.cc:24 + .loc 1 24 0 + movq %rdi, p(%rip) + # gdb.arch/amd64-entry-value-paramref.cc:23 + .loc 1 23 0 + addl $1, %eax + movl %eax, vv(%rip) + # gdb.arch/amd64-entry-value-paramref.cc:25 + .loc 1 25 0 + movl (%rdi), %eax +# SUCC: EXIT [100.0%] + # gdb.arch/amd64-entry-value-paramref.cc:26 + .loc 1 26 0 + ret + .cfi_endproc +.LFE2: + .size _ZL3barRi.constprop.0, .-_ZL3barRi.constprop.0 + .section .text.startup,"ax",@progbits + .p2align 4,,15 + .globl main + .type main, @function +main: +.LFB1: + # gdb.arch/amd64-entry-value-paramref.cc:30 + .loc 1 30 0 + .cfi_startproc +# BLOCK 2 freq:10000 seq:0 +# PRED: ENTRY [100.0%] (FALLTHRU) + subq $16, %rsp + .cfi_def_cfa_offset 24 +.LBB2: + # gdb.arch/amd64-entry-value-paramref.cc:32 + .loc 1 32 0 + leaq 12(%rsp), %rdi + # gdb.arch/amd64-entry-value-paramref.cc:31 + .loc 1 31 0 + movl $10, 12(%rsp) + # gdb.arch/amd64-entry-value-paramref.cc:32 + .loc 1 32 0 + call _ZL3barRi.constprop.0 +.LVL1: +.LBE2: + # gdb.arch/amd64-entry-value-paramref.cc:33 + .loc 1 33 0 + addq $16, %rsp + .cfi_def_cfa_offset 8 +# SUCC: EXIT [100.0%] + ret + .cfi_endproc +.LFE1: + .size main, .-main + .globl p + .bss + .align 8 + .type p, @object + .size p, 8 +p: + .zero 8 + .globl vv + .align 4 + .type vv, @object + .size vv, 4 +vv: + .zero 4 + .text +.Letext0: + .section .debug_info,"",@progbits +.Ldebug_info0: + .long .Linfo_end - .Linfo_start # Length of Compilation Unit Info +.Linfo_start: + .value 0x4 # DWARF version number + .long .Ldebug_abbrev0 # Offset Into Abbrev. Section + .byte 0x8 # Pointer Size (in bytes) + .uleb128 0x1 # (DIE (0xb) DW_TAG_compile_unit) + .long .LASF0 # DW_AT_producer: "GNU C++ 4.8.2 20131212 (Red Hat 4.8.2-7) -mtune=generic -march=x86-64 -g -O2" + .byte 0x4 # DW_AT_language + .long .LASF1 # DW_AT_name: "gdb.arch/amd64-entry-value-paramref.cc" + .long .LASF2 # DW_AT_comp_dir: "" + .long .Ldebug_ranges0+0 # DW_AT_ranges + .quad 0 # DW_AT_low_pc + .long .Ldebug_line0 # DW_AT_stmt_list +DIE29: .uleb128 0x2 # (DIE (0x29) DW_TAG_subprogram) + .ascii "bar\0" # DW_AT_name + .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-entry-value-paramref.cc) + .byte 0x15 # DW_AT_decl_line + .long DIE45 # DW_AT_type + .byte 0x1 # DW_AT_inline +DIE39: .uleb128 0x3 # (DIE (0x39) DW_TAG_formal_parameter) + .ascii "ref\0" # DW_AT_name + .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-entry-value-paramref.cc) + .byte 0x15 # DW_AT_decl_line + .long DIE4c # DW_AT_type + .byte 0 # end of children of DIE 0x29 +DIE45: .uleb128 0x4 # (DIE (0x45) DW_TAG_base_type) + .byte 0x4 # DW_AT_byte_size + .byte 0x5 # DW_AT_encoding + .ascii "int\0" # DW_AT_name +DIE4c: .uleb128 0x5 # (DIE (0x4c) DW_TAG_const_type) + .long DIE51 # DW_AT_type +DIE51: .uleb128 0x6 # (DIE (0x51) DW_TAG_reference_type) + .byte 0x8 # DW_AT_byte_size + .long DIE45 # DW_AT_type +DIE57: .uleb128 0x7 # (DIE (0x57) DW_TAG_subprogram) + .long DIE29 # DW_AT_abstract_origin + .quad .LFB2 # DW_AT_low_pc + .quad .LFE2-.LFB2 # DW_AT_high_pc + .uleb128 0x1 # DW_AT_frame_base + .byte 0x9c # DW_OP_call_frame_cfa + # DW_AT_GNU_all_call_sites +DIE72: .uleb128 0x8 # (DIE (0x72) DW_TAG_formal_parameter) + .long DIE39 # DW_AT_abstract_origin + .uleb128 0x1 # DW_AT_location + .byte 0x55 # DW_OP_reg5 + .byte 0 # end of children of DIE 0x57 +DIE7a: .uleb128 0x9 # (DIE (0x7a) DW_TAG_subprogram) + # DW_AT_external + .long .LASF3 # DW_AT_name: "main" + .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-entry-value-paramref.cc) + .byte 0x1d # DW_AT_decl_line + .long DIE45 # DW_AT_type + .quad .LFB1 # DW_AT_low_pc + .quad .LFE1-.LFB1 # DW_AT_high_pc + .uleb128 0x1 # DW_AT_frame_base + .byte 0x9c # DW_OP_call_frame_cfa + # DW_AT_GNU_all_call_sites +DIE9b: .uleb128 0xa # (DIE (0x9b) DW_TAG_lexical_block) + .quad .LBB2 # DW_AT_low_pc + .quad .LBE2-.LBB2 # DW_AT_high_pc +DIEac: .uleb128 0xb # (DIE (0xac) DW_TAG_variable) + .ascii "var\0" # DW_AT_name + .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-entry-value-paramref.cc) + .byte 0x1f # DW_AT_decl_line + .long DIE45 # DW_AT_type + .uleb128 0x2 # DW_AT_location + .byte 0x91 # DW_OP_fbreg + .sleb128 -12 +DIEba: .uleb128 0xc # (DIE (0xba) DW_TAG_GNU_call_site) + .quad .LVL1 # DW_AT_low_pc + .long DIE57 # DW_AT_abstract_origin +DIEc7: .uleb128 0xd # (DIE (0xc7) DW_TAG_GNU_call_site_parameter) + .uleb128 0x1 # DW_AT_location + .byte 0x55 # DW_OP_reg5 + .uleb128 0x2 # DW_AT_GNU_call_site_value + .byte 0x91 # DW_OP_fbreg + .sleb128 -12 +#if 0 + .uleb128 0x1 # DW_AT_GNU_call_site_data_value + .byte 0x3a # DW_OP_lit10 +#else + .uleb128 1f - 2f # DW_AT_GNU_call_site_data_value +2: + .byte 0xf3 # DW_OP_GNU_entry_value + .uleb128 1f - 3f +3: + .byte 0x55 # DW_OP_reg5 +1: +#endif + .byte 0 # end of children of DIE 0xba + .byte 0 # end of children of DIE 0x9b + .byte 0 # end of children of DIE 0x7a +DIEd2: .uleb128 0xe # (DIE (0xd2) DW_TAG_variable) + .ascii "vv\0" # DW_AT_name + .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-entry-value-paramref.cc) + .byte 0x12 # DW_AT_decl_line + .long DIEe6 # DW_AT_type + # DW_AT_external + .uleb128 0x9 # DW_AT_location + .byte 0x3 # DW_OP_addr + .quad vv +DIEe6: .uleb128 0xf # (DIE (0xe6) DW_TAG_volatile_type) + .long DIE45 # DW_AT_type +DIEeb: .uleb128 0xe # (DIE (0xeb) DW_TAG_variable) + .ascii "p\0" # DW_AT_name + .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-entry-value-paramref.cc) + .byte 0x12 # DW_AT_decl_line + .long DIEfe # DW_AT_type + # DW_AT_external + .uleb128 0x9 # DW_AT_location + .byte 0x3 # DW_OP_addr + .quad p +DIEfe: .uleb128 0x10 # (DIE (0xfe) DW_TAG_pointer_type) + .byte 0x8 # DW_AT_byte_size + .long DIEe6 # DW_AT_type + .byte 0 # end of children of DIE 0xb +.Linfo_end: + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .uleb128 0x1 # (abbrev code) + .uleb128 0x11 # (TAG: DW_TAG_compile_unit) + .byte 0x1 # DW_children_yes + .uleb128 0x25 # (DW_AT_producer) + .uleb128 0xe # (DW_FORM_strp) + .uleb128 0x13 # (DW_AT_language) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3 # (DW_AT_name) + .uleb128 0xe # (DW_FORM_strp) + .uleb128 0x1b # (DW_AT_comp_dir) + .uleb128 0xe # (DW_FORM_strp) + .uleb128 0x55 # (DW_AT_ranges) + .uleb128 0x17 # (DW_FORM_sec_offset) + .uleb128 0x11 # (DW_AT_low_pc) + .uleb128 0x1 # (DW_FORM_addr) + .uleb128 0x10 # (DW_AT_stmt_list) + .uleb128 0x17 # (DW_FORM_sec_offset) + .byte 0 + .byte 0 + .uleb128 0x2 # (abbrev code) + .uleb128 0x2e # (TAG: DW_TAG_subprogram) + .byte 0x1 # DW_children_yes + .uleb128 0x3 # (DW_AT_name) + .uleb128 0x8 # (DW_FORM_string) + .uleb128 0x3a # (DW_AT_decl_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3b # (DW_AT_decl_line) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x20 # (DW_AT_inline) + .uleb128 0xb # (DW_FORM_data1) + .byte 0 + .byte 0 + .uleb128 0x3 # (abbrev code) + .uleb128 0x5 # (TAG: DW_TAG_formal_parameter) + .byte 0 # DW_children_no + .uleb128 0x3 # (DW_AT_name) + .uleb128 0x8 # (DW_FORM_string) + .uleb128 0x3a # (DW_AT_decl_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3b # (DW_AT_decl_line) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x4 # (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 + .uleb128 0x5 # (abbrev code) + .uleb128 0x26 # (TAG: DW_TAG_const_type) + .byte 0 # DW_children_no + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x6 # (abbrev code) + .uleb128 0x10 # (TAG: DW_TAG_reference_type) + .byte 0 # 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 0 + .byte 0 + .uleb128 0x7 # (abbrev code) + .uleb128 0x2e # (TAG: DW_TAG_subprogram) + .byte 0x1 # DW_children_yes + .uleb128 0x31 # (DW_AT_abstract_origin) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x11 # (DW_AT_low_pc) + .uleb128 0x1 # (DW_FORM_addr) + .uleb128 0x12 # (DW_AT_high_pc) + .uleb128 0x7 # (DW_FORM_data8) + .uleb128 0x40 # (DW_AT_frame_base) + .uleb128 0x18 # (DW_FORM_exprloc) + .uleb128 0x2117 # (DW_AT_GNU_all_call_sites) + .uleb128 0x19 # (DW_FORM_flag_present) + .byte 0 + .byte 0 + .uleb128 0x8 # (abbrev code) + .uleb128 0x5 # (TAG: DW_TAG_formal_parameter) + .byte 0 # DW_children_no + .uleb128 0x31 # (DW_AT_abstract_origin) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x2 # (DW_AT_location) + .uleb128 0x18 # (DW_FORM_exprloc) + .byte 0 + .byte 0 + .uleb128 0x9 # (abbrev code) + .uleb128 0x2e # (TAG: DW_TAG_subprogram) + .byte 0x1 # DW_children_yes + .uleb128 0x3f # (DW_AT_external) + .uleb128 0x19 # (DW_FORM_flag_present) + .uleb128 0x3 # (DW_AT_name) + .uleb128 0xe # (DW_FORM_strp) + .uleb128 0x3a # (DW_AT_decl_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3b # (DW_AT_decl_line) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x11 # (DW_AT_low_pc) + .uleb128 0x1 # (DW_FORM_addr) + .uleb128 0x12 # (DW_AT_high_pc) + .uleb128 0x7 # (DW_FORM_data8) + .uleb128 0x40 # (DW_AT_frame_base) + .uleb128 0x18 # (DW_FORM_exprloc) + .uleb128 0x2117 # (DW_AT_GNU_all_call_sites) + .uleb128 0x19 # (DW_FORM_flag_present) + .byte 0 + .byte 0 + .uleb128 0xa # (abbrev code) + .uleb128 0xb # (TAG: DW_TAG_lexical_block) + .byte 0x1 # DW_children_yes + .uleb128 0x11 # (DW_AT_low_pc) + .uleb128 0x1 # (DW_FORM_addr) + .uleb128 0x12 # (DW_AT_high_pc) + .uleb128 0x7 # (DW_FORM_data8) + .byte 0 + .byte 0 + .uleb128 0xb # (abbrev code) + .uleb128 0x34 # (TAG: DW_TAG_variable) + .byte 0 # DW_children_no + .uleb128 0x3 # (DW_AT_name) + .uleb128 0x8 # (DW_FORM_string) + .uleb128 0x3a # (DW_AT_decl_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3b # (DW_AT_decl_line) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x2 # (DW_AT_location) + .uleb128 0x18 # (DW_FORM_exprloc) + .byte 0 + .byte 0 + .uleb128 0xc # (abbrev code) + .uleb128 0x4109 # (TAG: DW_TAG_GNU_call_site) + .byte 0x1 # DW_children_yes + .uleb128 0x11 # (DW_AT_low_pc) + .uleb128 0x1 # (DW_FORM_addr) + .uleb128 0x31 # (DW_AT_abstract_origin) + .uleb128 0x13 # (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0xd # (abbrev code) + .uleb128 0x410a # (TAG: DW_TAG_GNU_call_site_parameter) + .byte 0 # DW_children_no + .uleb128 0x2 # (DW_AT_location) + .uleb128 0x18 # (DW_FORM_exprloc) + .uleb128 0x2111 # (DW_AT_GNU_call_site_value) + .uleb128 0x18 # (DW_FORM_exprloc) + .uleb128 0x2112 # (DW_AT_GNU_call_site_data_value) + .uleb128 0x18 # (DW_FORM_exprloc) + .byte 0 + .byte 0 + .uleb128 0xe # (abbrev code) + .uleb128 0x34 # (TAG: DW_TAG_variable) + .byte 0 # DW_children_no + .uleb128 0x3 # (DW_AT_name) + .uleb128 0x8 # (DW_FORM_string) + .uleb128 0x3a # (DW_AT_decl_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3b # (DW_AT_decl_line) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x3f # (DW_AT_external) + .uleb128 0x19 # (DW_FORM_flag_present) + .uleb128 0x2 # (DW_AT_location) + .uleb128 0x18 # (DW_FORM_exprloc) + .byte 0 + .byte 0 + .uleb128 0xf # (abbrev code) + .uleb128 0x35 # (TAG: DW_TAG_volatile_type) + .byte 0 # DW_children_no + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x10 # (abbrev code) + .uleb128 0xf # (TAG: DW_TAG_pointer_type) + .byte 0 # 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 0 + .byte 0 + .byte 0 + .section .debug_aranges,"",@progbits + .long 0x3c # Length of Address Ranges Info + .value 0x2 # DWARF Version + .long .Ldebug_info0 # Offset of Compilation Unit Info + .byte 0x8 # Size of Address + .byte 0 # Size of Segment Descriptor + .value 0 # Pad to 16 byte boundary + .value 0 + .quad .Ltext0 # Address + .quad .Letext0-.Ltext0 # Length + .quad .LFB1 # Address + .quad .LFE1-.LFB1 # Length + .quad 0 + .quad 0 + .section .debug_ranges,"",@progbits +.Ldebug_ranges0: + .quad .Ltext0 # Offset 0 + .quad .Letext0 + .quad .LFB1 # Offset 0x10 + .quad .LFE1 + .quad 0 + .quad 0 + .section .debug_line,"",@progbits +.Ldebug_line0: + .section .debug_str,"MS",@progbits,1 +.LASF1: + .string "gdb.arch/amd64-entry-value-paramref.cc" +.LASF2: + .string "" +.LASF0: + .string "GNU C++ 4.8.2 20131212 (Red Hat 4.8.2-7) -mtune=generic -march=x86-64 -g -O2" +.LASF3: + .string "main" + .ident "GCC: (GNU) 4.8.2 20131212 (Red Hat 4.8.2-7)" + .section .note.GNU-stack,"",@progbits diff --git a/gdb/testsuite/gdb.arch/amd64-entry-value-paramref.cc b/gdb/testsuite/gdb.arch/amd64-entry-value-paramref.cc new file mode 100644 index 0000000..aa473a3 --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-entry-value-paramref.cc @@ -0,0 +1,33 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2014 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 . */ + +volatile int vv, *p; + +static __attribute__((noinline)) int +bar (int &ref) +{ + vv++; /* break-here */ + p = &ref; + return ref; +} + +int +main (void) +{ + int var = 10; + return bar (var); +} diff --git a/gdb/testsuite/gdb.arch/amd64-entry-value-paramref.exp b/gdb/testsuite/gdb.arch/amd64-entry-value-paramref.exp new file mode 100644 index 0000000..f06247d --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-entry-value-paramref.exp @@ -0,0 +1,35 @@ +# Copyright (C) 2014 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 . + +standard_testfile .S .cc + +if { ![istarget x86_64-*-* ] || ![is_lp64_target] } { + verbose "Skipping amd64-entry-value-paramref." + return +} + +if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} "c++"] } { + return -1 +} + +if ![runto_main] { + return -1 +} + +set srcfile $srcfile2 +gdb_breakpoint [gdb_get_line_number "break-here"] + +gdb_continue_to_breakpoint "break-here" ".* break-here .*" +gdb_test "frame" {bar \(ref=@0x[0-9a-f]+: 10, ref@entry=@0x[0-9a-f]+: \) at .*} diff --git a/gdb/testsuite/gdb.arch/amd64-optimout-repeat.S b/gdb/testsuite/gdb.arch/amd64-optimout-repeat.S new file mode 100644 index 0000000..2f8f4d2 --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-optimout-repeat.S @@ -0,0 +1,297 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2012-2014 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 . */ + +/* This file is compiled from gdb.arch/amd64-entry-value-param.c + using -g -dA -S -O2. */ + + .file "amd64-optimout-repeat.c" + .text +.Ltext0: + .section .text.unlikely,"ax",@progbits +.LCOLDB0: + .section .text.startup,"ax",@progbits +.LHOTB0: + .p2align 4,,15 + .section .text.unlikely +.Ltext_cold0: + .section .text.startup + .globl main + .type main, @function +main: +.LFB0: + .file 1 "gdb.arch/amd64-optimout-repeat.c" + # gdb.arch/amd64-optimout-repeat.c:20 + .loc 1 20 0 + .cfi_startproc +# BLOCK 2 freq:10000 seq:0 +# PRED: ENTRY [100.0%] (FALLTHRU) +.LVL0: + # gdb.arch/amd64-optimout-repeat.c:29 + .loc 1 29 0 + xorl %eax, %eax +# SUCC: EXIT [100.0%] + ret + .cfi_endproc +.LFE0: + .size main, .-main + .section .text.unlikely +.LCOLDE0: + .section .text.startup +.LHOTE0: + .text +.Letext0: + .section .text.unlikely +.Letext_cold0: + .section .debug_info,"",@progbits +.Ldebug_info0: + .long 0x97 # Length of Compilation Unit Info + .value 0x4 # DWARF version number + .long .Ldebug_abbrev0 # Offset Into Abbrev. Section + .byte 0x8 # Pointer Size (in bytes) + .uleb128 0x1 # (DIE (0xb) DW_TAG_compile_unit) + .long .LASF1 # DW_AT_producer: "GNU C 4.9.1 20140709 (prerelease) -mtune=generic -march=x86-64 -g -O2" + .byte 0x1 # DW_AT_language + .long .LASF2 # DW_AT_name: "gdb.arch/amd64-optimout-repeat.c" + .long .LASF3 # DW_AT_comp_dir: "" + .long .Ldebug_ranges0+0 # DW_AT_ranges + .quad 0 # DW_AT_low_pc + .long .Ldebug_line0 # DW_AT_stmt_list + .uleb128 0x2 # (DIE (0x29) DW_TAG_subprogram) + # DW_AT_external + .long .LASF4 # DW_AT_name: "main" + .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-optimout-repeat.c) + .byte 0x13 # DW_AT_decl_line + # DW_AT_prototyped + .long 0x7c # DW_AT_type + .quad .LFB0 # DW_AT_low_pc + .quad .LFE0-.LFB0 # DW_AT_high_pc + .uleb128 0x1 # DW_AT_frame_base + .byte 0x9c # DW_OP_call_frame_cfa + # DW_AT_GNU_all_call_sites + .long 0x7c # DW_AT_sibling + .uleb128 0x3 # (DIE (0x4a) DW_TAG_structure_type) + .value 0x404 # DW_AT_byte_size + .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-optimout-repeat.c) + .byte 0x15 # DW_AT_decl_line + .long 0x6a # DW_AT_sibling + .uleb128 0x4 # (DIE (0x53) DW_TAG_member) + .ascii "i\0" # DW_AT_name + .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-optimout-repeat.c) + .byte 0x17 # DW_AT_decl_line + .long 0x7c # DW_AT_type + .byte 0 # DW_AT_data_member_location + .uleb128 0x4 # (DIE (0x5d) DW_TAG_member) + .ascii "xxx\0" # DW_AT_name + .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-optimout-repeat.c) + .byte 0x18 # DW_AT_decl_line + .long 0x83 # DW_AT_type + .byte 0x4 # DW_AT_data_member_location + .byte 0 # end of children of DIE 0x4a + .uleb128 0x5 # (DIE (0x6a) DW_TAG_variable) + .ascii "v\0" # DW_AT_name + .byte 0x1 # DW_AT_decl_file (gdb.arch/amd64-optimout-repeat.c) + .byte 0x1a # DW_AT_decl_line + .long 0x4a # DW_AT_type + .uleb128 0x7 # DW_AT_location + .byte 0x30 # DW_OP_lit0 + .byte 0x9f # DW_OP_stack_value + .byte 0x93 # DW_OP_piece + .uleb128 0x4 + .byte 0x93 # DW_OP_piece + .uleb128 0x400 + .byte 0 # end of children of DIE 0x29 + .uleb128 0x6 # (DIE (0x7c) DW_TAG_base_type) + .byte 0x4 # DW_AT_byte_size + .byte 0x5 # DW_AT_encoding + .ascii "int\0" # DW_AT_name + .uleb128 0x7 # (DIE (0x83) DW_TAG_array_type) + .long 0x7c # DW_AT_type + .long 0x93 # DW_AT_sibling + .uleb128 0x8 # (DIE (0x8c) DW_TAG_subrange_type) + .long 0x93 # DW_AT_type + .byte 0xff # DW_AT_upper_bound + .byte 0 # end of children of DIE 0x83 + .uleb128 0x9 # (DIE (0x93) DW_TAG_base_type) + .byte 0x8 # DW_AT_byte_size + .byte 0x7 # DW_AT_encoding + .long .LASF0 # DW_AT_name: "sizetype" + .byte 0 # end of children of DIE 0xb + .section .debug_abbrev,"",@progbits +.Ldebug_abbrev0: + .uleb128 0x1 # (abbrev code) + .uleb128 0x11 # (TAG: DW_TAG_compile_unit) + .byte 0x1 # DW_children_yes + .uleb128 0x25 # (DW_AT_producer) + .uleb128 0xe # (DW_FORM_strp) + .uleb128 0x13 # (DW_AT_language) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3 # (DW_AT_name) + .uleb128 0xe # (DW_FORM_strp) + .uleb128 0x1b # (DW_AT_comp_dir) + .uleb128 0xe # (DW_FORM_strp) + .uleb128 0x55 # (DW_AT_ranges) + .uleb128 0x17 # (DW_FORM_sec_offset) + .uleb128 0x11 # (DW_AT_low_pc) + .uleb128 0x1 # (DW_FORM_addr) + .uleb128 0x10 # (DW_AT_stmt_list) + .uleb128 0x17 # (DW_FORM_sec_offset) + .byte 0 + .byte 0 + .uleb128 0x2 # (abbrev code) + .uleb128 0x2e # (TAG: DW_TAG_subprogram) + .byte 0x1 # DW_children_yes + .uleb128 0x3f # (DW_AT_external) + .uleb128 0x19 # (DW_FORM_flag_present) + .uleb128 0x3 # (DW_AT_name) + .uleb128 0xe # (DW_FORM_strp) + .uleb128 0x3a # (DW_AT_decl_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3b # (DW_AT_decl_line) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x27 # (DW_AT_prototyped) + .uleb128 0x19 # (DW_FORM_flag_present) + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x11 # (DW_AT_low_pc) + .uleb128 0x1 # (DW_FORM_addr) + .uleb128 0x12 # (DW_AT_high_pc) + .uleb128 0x7 # (DW_FORM_data8) + .uleb128 0x40 # (DW_AT_frame_base) + .uleb128 0x18 # (DW_FORM_exprloc) + .uleb128 0x2117 # (DW_AT_GNU_all_call_sites) + .uleb128 0x19 # (DW_FORM_flag_present) + .uleb128 0x1 # (DW_AT_sibling) + .uleb128 0x13 # (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x3 # (abbrev code) + .uleb128 0x13 # (TAG: DW_TAG_structure_type) + .byte 0x1 # DW_children_yes + .uleb128 0xb # (DW_AT_byte_size) + .uleb128 0x5 # (DW_FORM_data2) + .uleb128 0x3a # (DW_AT_decl_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3b # (DW_AT_decl_line) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x1 # (DW_AT_sibling) + .uleb128 0x13 # (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x4 # (abbrev code) + .uleb128 0xd # (TAG: DW_TAG_member) + .byte 0 # DW_children_no + .uleb128 0x3 # (DW_AT_name) + .uleb128 0x8 # (DW_FORM_string) + .uleb128 0x3a # (DW_AT_decl_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3b # (DW_AT_decl_line) + .uleb128 0xb # (DW_FORM_data1) + .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 0x5 # (abbrev code) + .uleb128 0x34 # (TAG: DW_TAG_variable) + .byte 0 # DW_children_no + .uleb128 0x3 # (DW_AT_name) + .uleb128 0x8 # (DW_FORM_string) + .uleb128 0x3a # (DW_AT_decl_file) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x3b # (DW_AT_decl_line) + .uleb128 0xb # (DW_FORM_data1) + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x2 # (DW_AT_location) + .uleb128 0x18 # (DW_FORM_exprloc) + .byte 0 + .byte 0 + .uleb128 0x6 # (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 + .uleb128 0x7 # (abbrev code) + .uleb128 0x1 # (TAG: DW_TAG_array_type) + .byte 0x1 # DW_children_yes + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x1 # (DW_AT_sibling) + .uleb128 0x13 # (DW_FORM_ref4) + .byte 0 + .byte 0 + .uleb128 0x8 # (abbrev code) + .uleb128 0x21 # (TAG: DW_TAG_subrange_type) + .byte 0 # DW_children_no + .uleb128 0x49 # (DW_AT_type) + .uleb128 0x13 # (DW_FORM_ref4) + .uleb128 0x2f # (DW_AT_upper_bound) + .uleb128 0xb # (DW_FORM_data1) + .byte 0 + .byte 0 + .uleb128 0x9 # (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 0xe # (DW_FORM_strp) + .byte 0 + .byte 0 + .byte 0 + .section .debug_aranges,"",@progbits + .long 0x2c # Length of Address Ranges Info + .value 0x2 # DWARF Version + .long .Ldebug_info0 # Offset of Compilation Unit Info + .byte 0x8 # Size of Address + .byte 0 # Size of Segment Descriptor + .value 0 # Pad to 16 byte boundary + .value 0 + .quad .LFB0 # Address + .quad .LFE0-.LFB0 # Length + .quad 0 + .quad 0 + .section .debug_ranges,"",@progbits +.Ldebug_ranges0: + .quad .LFB0 # Offset 0 + .quad .LFE0 + .quad 0 + .quad 0 + .section .debug_line,"",@progbits +.Ldebug_line0: + .section .debug_str,"MS",@progbits,1 +.LASF0: + .string "sizetype" +.LASF2: + .string "gdb.arch/amd64-optimout-repeat.c" +.LASF1: + .string "GNU C 4.9.1 20140709 (prerelease) -mtune=generic -march=x86-64 -g -O2" +.LASF3: + .string "" +.LASF4: + .string "main" + .ident "GCC: (GNU) 4.9.1 20140709 (prerelease)" + .section .note.GNU-stack,"",@progbits diff --git a/gdb/testsuite/gdb.arch/amd64-optimout-repeat.c b/gdb/testsuite/gdb.arch/amd64-optimout-repeat.c new file mode 100644 index 0000000..a32b6de --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-optimout-repeat.c @@ -0,0 +1,29 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2014 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 . */ + +int +main (void) +{ + struct + { + int i; + int xxx[0x100]; + } + v = { 0 }; + + return v.i; +} diff --git a/gdb/testsuite/gdb.arch/amd64-optimout-repeat.exp b/gdb/testsuite/gdb.arch/amd64-optimout-repeat.exp new file mode 100644 index 0000000..f3c93a4 --- /dev/null +++ b/gdb/testsuite/gdb.arch/amd64-optimout-repeat.exp @@ -0,0 +1,36 @@ +# Copyright (C) 2014 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 . + +standard_testfile .S .c +set opts {} + +if [info exists COMPILE] { + # make check RUNTESTFLAGS="gdb.arch/amd64-optimout-repeat.exp COMPILE=1" + set srcfile ${srcfile2} + lappend opts debug optimize=-O2 +} elseif { ![istarget x86_64-*-* ] || ![is_lp64_target] } { + verbose "Skipping amd64-optimout-repeat." + return +} + +if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile} $opts] } { + return -1 +} + +if ![runto_main] { + return -1 +} + +gdb_test "print v" { = {i = 0, xxx = { }}} --Dxnq1zWXvFF0Q93v--