On 07/19/2018 10:30 AM, Richard Biener wrote: > On Wed, Jul 18, 2018 at 3:42 PM Tom de Vries <tdevr...@suse.de> wrote: >> >> On 07/06/2018 12:28 PM, Richard Biener wrote: >>> On Thu, Jul 5, 2018 at 4:12 PM Tom de Vries <tdevr...@suse.de> wrote: >>>> >>>> On 07/05/2018 01:39 PM, Richard Biener wrote: >>>>> On Thu, Jul 5, 2018 at 1:25 PM Tom de Vries <tdevr...@suse.de> wrote: >>>>>> >>>>>> [ was: Re: [testsuite/guality, committed] Prevent optimization of local >>>>>> in >>>>>> vla-1.c ] >>>>>> >>>>>> On Wed, Jul 04, 2018 at 02:32:27PM +0200, Tom de Vries wrote: >>>>>>> On 07/03/2018 11:05 AM, Tom de Vries wrote: >>>>>>>> On 07/02/2018 10:16 AM, Jakub Jelinek wrote: >>>>>>>>> On Mon, Jul 02, 2018 at 09:44:04AM +0200, Richard Biener wrote: >>>>>>>>>> Given the array has size i + 1 it's upper bound should be 'i' and 'i' >>>>>>>>>> should be available via DW_OP_[GNU_]entry_value. >>>>>>>>>> >>>>>>>>>> I see it is >>>>>>>>>> >>>>>>>>>> <175> DW_AT_upper_bound : 10 byte block: 75 1 8 20 24 8 20 26 >>>>>>>>>> 31 >>>>>>>>>> 1c (DW_OP_breg5 (rdi): 1; DW_OP_const1u: 32; DW_OP_shl; >>>>>>>>>> DW_OP_const1u: 32; DW_OP_shra; DW_OP_lit1; DW_OP_minus) >>>>>>>>>> >>>>>>>>>> and %rdi is 1. Not sure why gdb fails to print it's length. Yes, >>>>>>>>>> the >>>>>>>>>> storage itself doesn't have a location but the >>>>>>>>>> type specifies the size. >>>>>>>>>> >>>>>>>>>> (gdb) ptype a >>>>>>>>>> type = char [variable length] >>>>>>>>>> (gdb) p sizeof(a) >>>>>>>>>> $3 = 0 >>>>>>>>>> >>>>>>>>>> this looks like a gdb bug to me? >>>>>>>>>> >>>>>>>> >>>>>>>> With gdb patch: >>>>>>>> ... >>>>>>>> diff --git a/gdb/findvar.c b/gdb/findvar.c >>>>>>>> index 8ad5e25cb2..ebaff923a1 100644 >>>>>>>> --- a/gdb/findvar.c >>>>>>>> +++ b/gdb/findvar.c >>>>>>>> @@ -789,6 +789,8 @@ default_read_var_value >>>>>>>> break; >>>>>>>> >>>>>>>> case LOC_OPTIMIZED_OUT: >>>>>>>> + if (is_dynamic_type (type)) >>>>>>>> + type = resolve_dynamic_type (type, NULL, >>>>>>>> + /* Unused address. */ 0); >>>>>>>> return allocate_optimized_out_value (type); >>>>>>>> >>>>>>>> default: >>>>>>>> ... >>>>>>>> >>>>>>>> I get: >>>>>>>> ... >>>>>>>> $ ./gdb -batch -ex "b f1" -ex "r" -ex "p sizeof (a)" vla-1.exe >>>>>>>> Breakpoint 1 at 0x4004a8: file vla-1.c, line 17. >>>>>>>> >>>>>>>> Breakpoint 1, f1 (i=i@entry=5) at vla-1.c:17 >>>>>>>> 17 return a[0]; >>>>>>>> $1 = 6 >>>>>>>> ... >>>>>>>> >>>>>>> >>>>>>> Well, for -O1 and -O2. >>>>>>> >>>>>>> For O3, I get instead: >>>>>>> ... >>>>>>> $ ./gdb vla-1.exe -q -batch -ex "b f1" -ex "run" -ex "p sizeof (a)" >>>>>>> Breakpoint 1 at 0x4004b0: f1. (2 locations) >>>>>>> >>>>>>> Breakpoint 1, f1 (i=5) at vla-1.c:17 >>>>>>> 17 return a[0]; >>>>>>> $1 = 0 >>>>>>> ... >>>>>>> >>>>>> >>>>>> Hi, >>>>>> >>>>>> When compiling guality/vla-1.c with -O3 -g, vla 'a[i + 1]' in f1 is >>>>>> optimized >>>>>> away, but f1 still contains a debug expression describing the upper >>>>>> bound of the >>>>>> vla (D.1914): >>>>>> ... >>>>>> __attribute__((noinline)) >>>>>> f1 (intD.6 iD.1900) >>>>>> { >>>>>> <bb 2> >>>>>> saved_stack.1_2 = __builtin_stack_save (); >>>>>> # DEBUG BEGIN_STMT >>>>>> # DEBUG D#3 => i_1(D) + 1 >>>>>> # DEBUG D#2 => (long intD.8) D#3 >>>>>> # DEBUG D#1 => D#2 + -1 >>>>>> # DEBUG D.1914 => (sizetype) D#1 >>>>>> ... >>>>>> >>>>>> Then f1 is cloned to a version f1.constprop with no parameters, >>>>>> eliminating >>>>>> parameter i, and 'DEBUG D#3 => i_1(D) + 1' turns into 'D#3 => NULL'. >>>>>> Consequently, 'print sizeof (a)' yields '0' in gdb. >>>>> >>>>> So does gdb correctly recognize there isn't any size available or do we >>>>> somehow >>>>> generate invalid debug info, not recognizing that D#3 => NULL means >>>>> "optimized out" and thus all dependent expressions are "optimized out" as >>>>> well? >>>>> >>>>> That is, shouldn't gdb do >>>>> >>>>> (gdb) print sizeof (a) >>>>> <optimized out> >>>>> >>>>> ? >>>> >>>> The type for the vla gcc is emitting is an DW_TAG_array_type with >>>> DW_TAG_subrange_type without DW_AT_upper_bound or DW_AT_count, which >>>> makes the upper bound value 'unknown'. So I'd say the debug info is valid. >>> >>> OK, that sounds reasonable. I wonder if languages like Ada have a way >>> to declare an array type with unknown upper bound but known lower bound. >>> For >>> >>> typedef int arr[]; >>> arr *x; >>> >>> we generate just >>> >>> <1><2d>: Abbrev Number: 2 (DW_TAG_typedef) >>> <2e> DW_AT_name : arr >>> <32> DW_AT_decl_file : 1 >>> <33> DW_AT_decl_line : 1 >>> <34> DW_AT_decl_column : 13 >>> <35> DW_AT_type : <0x39> >>> <1><39>: Abbrev Number: 3 (DW_TAG_array_type) >>> <3a> DW_AT_type : <0x44> >>> <3e> DW_AT_sibling : <0x44> >>> <2><42>: Abbrev Number: 4 (DW_TAG_subrange_type) >>> <2><43>: Abbrev Number: 0 >>> >>> which does >>> >>> (gdb) ptype arr >>> type = int [] >>> (gdb) ptype x >>> type = int (*)[] >>> (gdb) p sizeof (arr) >>> $1 = 0 >>> >>> so I wonder whether the patch makes it print <optimized out> >>> instead? I think both 0 and <optimized out> are less than ideal >>> and maybe <variable size> would be better. In the type case >>> above it's certainly not "optimized out". >>> >> >> I ran into trouble with the earlier posted gdb patch, in >> gdb/testsuite/gdb.fortran/vla-sizeof.exp. >> >> I've submitted a second try to gdb-patches ("[PATCH][exp] Interpret size >> of vla with unknown size as <optimized out>" at >> https://sourceware.org/ml/gdb-patches/2018-07/msg00541.html ). It >> handles the zero-sized array in the C example above correctly. > > Thanks. Without -gstrict-dwarf we can use DW_OP_GNU_variable_value > and if that doesn't have a location it should be <optimized out>. > > I wonder if it makes sense to disambiguate things from the gcc side > by generating an empty location description for known optimized out > values (the standard seems to explicitely call that out as a way to > say "optimized out").
Agreed, that makes sense, and thanks for pointing that out. [ Found it at dwarf5 doc, 2.6.1.1.1 Empty Location Descriptions. ] If I manage to find or construct a test-case where this is applicable on trunk, I'll take a look. Thanks, - Tom > Because int a[] is different from int a[x] where > x is optimized out. >