Bug 26235 - gdbtypes.h:526: internal-error: LONGEST dynamic_prop::const_val() const: Assertion `m_kind == PROP_CONST' failed.
Summary: gdbtypes.h:526: internal-error: LONGEST dynamic_prop::const_val() const: Asse...
Status: RESOLVED FIXED
Alias: None
Product: gdb
Classification: Unclassified
Component: ada (show other bugs)
Version: HEAD
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2020-07-13 22:37 UTC by Tom de Vries
Modified: 2020-07-30 12:59 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments
foo exec (412.17 KB, application/gzip)
2020-07-13 22:42 UTC, Tom de Vries
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Tom de Vries 2020-07-13 22:37:25 UTC
With gcc-10, we run into:
...
$ gdb outputs/gdb.ada/access_to_packed_array/foo -ex 'set pagination off' -ex 'maint expand-symtabs a-except.adb' -ex 'maint print symbols
   ...
     info: array (<>) of character; computed at runtime
     ptr: range 0 .. 2147483647; computed at runtime
     typedef <ada__exceptions__exception_data__append_info_basic_exception_information__TTnameSP1: range src/gdb/gdbtypes.h:526: internal-error: LONGEST dynamic_prop::const_val() const: Assertion `m_kind == PROP_CONST' failed.
...
Comment 1 Tom de Vries 2020-07-13 22:38:36 UTC
Backtrace as assert:
...
#8  0x0000000000b0401b in internal_error (file=0xb4c4a8 "/home/vries/gdb_versions/devel/src/gdb/gdbtypes.h", line=526, 
    fmt=0xb4c44a "%s: Assertion `%s' failed.") at /home/vries/gdb_versions/devel/src/gdbsupport/errors.cc:55
#9  0x0000000000436e4b in dynamic_prop::const_val (this=0x137a0f0) at /home/vries/gdb_versions/devel/src/gdb/gdbtypes.h:526
#10 0x00000000004198ec in ada_discrete_type_high_bound (type=0x137a060) at /home/vries/gdb_versions/devel/src/gdb/ada-lang.c:728
#11 0x0000000000448aec in print_range (type=0x1388110, stream=0x121d1f0, bounds_prefered_p=1)
    at /home/vries/gdb_versions/devel/src/gdb/ada-typeprint.c:160
#12 0x000000000044ae49 in ada_print_type (type0=0x1388110, 
    varstring=0x1379f40 "<ada__exceptions__exception_data__append_info_basic_exception_information__TTnameSP1___XDL_1>", stream=0x121d1f0, 
    show=1, level=5, flags=0xc53620 <type_print_raw_options>) at /home/vries/gdb_versions/devel/src/gdb/ada-typeprint.c:1041
#13 0x00000000004385cb in ada_language::print_type (this=0xff4d60 <ada_language_defn>, type=0x1388110, 
    varstring=0x1379f40 "<ada__exceptions__exception_data__append_info_basic_exception_information__TTnameSP1___XDL_1>", stream=0x121d1f0, 
    show=1, level=5, flags=0xc53620 <type_print_raw_options>) at /home/vries/gdb_versions/devel/src/gdb/ada-lang.c:13877
#14 0x00000000008c071a in print_symbol (gdbarch=0x12314a0, symbol=0x1388210, depth=5, outfile=0x121d1f0)
    at /home/vries/gdb_versions/devel/src/gdb/symmisc.c:584
#15 0x00000000008bfa1c in dump_symtab_1 (symtab=0x1229aa0, outfile=0x121d1f0) at /home/vries/gdb_versions/devel/src/gdb/symmisc.c:353
#16 0x00000000008bfc23 in dump_symtab (symtab=0x1229aa0, outfile=0x121d1f0) at /home/vries/gdb_versions/devel/src/gdb/symmisc.c:411
#17 0x00000000008c02ea in maintenance_print_symbols (args=0x0, from_tty=1) at /home/vries/gdb_versions/devel/src/gdb/symmisc.c:520
#18 0x0000000000501d16 in do_const_cfunc (c=0x1161690, args=0x0, from_tty=1) at /home/vries/gdb_versions/devel/src/gdb/cli/cli-decode.c:95
#19 0x00000000005053a0 in cmd_func (cmd=0x1161690, args=0x0, from_tty=1) at /home/vries/gdb_versions/devel/src/gdb/cli/cli-decode.c:2181
#20 0x000000000091a0c3 in execute_command (p=0x7fffffffe232 "", from_tty=1) at /home/vries/gdb_versions/devel/src/gdb/top.c:668
#21 0x0000000000737cb4 in catch_command_errors (command=0x919b4a <execute_command(char const*, int)>, arg=0x7fffffffe21f "maint print symbols", from_tty=1) at /home/vries/gdb_versions/devel/src/gdb/main.c:457
#22 0x0000000000739087 in captured_main_1 (context=0x7fffffffdb50) at /home/vries/gdb_versions/devel/src/gdb/main.c:1218
#23 0x0000000000739277 in captured_main (data=0x7fffffffdb50) at /home/vries/gdb_versions/devel/src/gdb/main.c:1243
#24 0x00000000007392e2 in gdb_main (args=0x7fffffffdb50) at /home/vries/gdb_versions/devel/src/gdb/main.c:1268
#25 0x0000000000411b39 in main (argc=13, argv=0x7fffffffdc68) at /home/vries/gdb_versions/devel/src/gdb/gdb.c:32
...
Comment 2 Tom de Vries 2020-07-13 22:39:02 UTC
Reason for assert:
...
(gdb) 
#9  0x0000000000436e4b in dynamic_prop::const_val (this=0x137a0f0) at /home/vries/gdb_versions/devel/src/gdb/gdbtypes.h:526
526         gdb_assert (m_kind == PROP_CONST);
(gdb) p m_kind
$1 = PROP_UNDEFINED
...
Comment 3 Tom de Vries 2020-07-13 22:42:18 UTC
Created attachment 12696 [details]
foo exec
Comment 4 Simon Marchi 2020-07-13 23:17:51 UTC
Ok, I was able to reproduce it, but using the Ada distribution from AdaCore, which comes with debug info for the standard library (not sure if that's the right terminology).
Comment 5 Simon Marchi 2020-07-14 02:11:14 UTC
Proposed patch: https://sourceware.org/pipermail/gdb-patches/2020-July/170408.html
Comment 6 Sourceware Commits 2020-07-21 19:13:37 UTC
The master branch has been updated by Simon Marchi <simark@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d1fd641e0b48e75401311528450eb1ddfb3a1fa0

commit d1fd641e0b48e75401311528450eb1ddfb3a1fa0
Author: Simon Marchi <simon.marchi@polymtl.ca>
Date:   Tue Jul 21 15:12:56 2020 -0400

    gdb: handle undefined properties in ada_discrete_type_{low,high}_bound
    
    This patch fixes a failure in test `gdb.ada/access_to_packed_array.exp`.
    The failure was introduced by 8c2e4e0689ea24 ("gdb: add accessors to
    struct dynamic_prop"), but I think it in fact exposed a latent buglet.
    
    Note that to reproduce it, I had to use AdaCore's Ada "distribution"
    [1].  The one that comes with my distro doesn't have debug info for the
    standard library stuff, so the bug wouldn't trigger.
    
    The bug is that while executing the `maint print symbols` command, we
    are accessing the value of a range type's high bound dynamic prop as a
    "const" value (PROP_CONST), when it is actually undefined
    (PROP_UNDEFINED).  It results in this failed assertion:
    
        /home/simark/src/binutils-gdb/gdb/gdbtypes.h:526: internal-error: LONGEST dynamic_prop::const_val() const: Assertion `m_kind == PROP_CONST' failed.
    
    `ada_discrete_type_high_bound` calls `resolve_dynamic_type`, which
    eventually calls `resolve_dynamic_range`.  This one is responsible for
    evaluating a range type's dynamic bounds in the current context and
    returning static values.  It returns a new range type with these static
    bounds.
    
    The resulting bounds are typically properties of the PROP_CONST kind.
    But when it's not possible to evaluate the properties, the properties
    are PROP_UNDEFINED.  In the case we are looking at, it's not possible to
    evaluate the dynamic high bound, which is of type PROP_LOCLIST.  It
    would require a target with registers and a frame, but we run `maint
    print symbols` without a live process.
    
    `ada_discrete_type_high_bound` then accesses the high bound
    unconditionally as a const value, which triggers the assert.
    
    Note that the previous code in resolve_dynamic_range (before commit
    8c2e4e0689ea24) did this:
    
        prop = &TYPE_RANGE_DATA (dyn_range_type)->high;
        if (dwarf2_evaluate_property (prop, NULL, addr_stack, &value))
          {
            high_bound.kind = PROP_CONST;
            high_bound.data.const_val = value;
    
            if (TYPE_RANGE_DATA (dyn_range_type)->flag_upper_bound_is_count)
            high_bound.data.const_val
              = low_bound.data.const_val + high_bound.data.const_val - 1;
          }
        else
          {
            high_bound.kind = PROP_UNDEFINED;
            high_bound.data.const_val = 0;
          }
    
    That did not really made sense, setting the kind to `PROP_UNDEFINED` but
    also setting the `const_val` field.  The `const_val` field is only
    meaningful if the kind if `PROP_CONST`.  The new code
    (post-8c2e4e0689ea24) simply calls `set_undefined ()`.
    
    Fix this by making the caller, `ada_discrete_type_high_bound`, consider
    that a range high bound could be of kind `PROP_UNDEFINED`, and return
    0 in this case.  I made the same change in ada_discrete_type_low_bound.
    I didn't encounter a problem with this function, but the same could in
    theory happen there.
    
    Returning 0 here is kind of a lie, but the goal here is just to restore
    the behavior of pre-8c2e4e0689ea24.
    
    The output of `maint print symbols` is:
    
         typedef <ada__exceptions__exception_data__append_info_basic_exception_information__TTnameSP1: range 1 .. 0;
         record
             ada__exceptions__exception_data__append_info_basic_exception_information__TTnameSP1: range 1 .. 0;
         end record;
    
    Instead of `1 .. 0`, which does not make sense, we could say something
    like `1 .. <dynamic>`.  But that would require more changes than I'm
    willing to do at the moment.
    
    [1] https://www.adacore.com/download
    
    gdb/ChangeLog:
    
            PR ada/26235
            * gdbtypes.c (ada_discrete_type_low_bound,
            ada_discrete_type_high_bound): Handle undefined bounds.
    
    Change-Id: Ia12167e61ef030941c0790f83294f3418e6a7c12
Comment 7 Simon Marchi 2020-07-21 19:14:26 UTC
Fixed.
Comment 8 Tom de Vries 2020-07-30 06:33:37 UTC
(In reply to Simon Marchi from comment #4)
> Ok, I was able to reproduce it, but using the Ada distribution from AdaCore,
> which comes with debug info for the standard library (not sure if that's the
> right terminology).

Hi Simon,

For my understanding, does this mean that you where not able to reproduce this with the exec I attached?  If so, what problem did you ran into?  Did it just not reproduce or were there other issues?
Comment 9 Simon Marchi 2020-07-30 12:29:13 UTC
(In reply to Tom de Vries from comment #8)
> Hi Simon,
> 
> For my understanding, does this mean that you where not able to reproduce
> this with the exec I attached?  If so, what problem did you ran into?  Did
> it just not reproduce or were there other issues?

I just tried it, it does reproduce with your binary.  Seeing the timestamps of the messages, maybe I started working on it before you uploaded the binary, or I just didn't see it.
Comment 10 Tom de Vries 2020-07-30 12:59:58 UTC
(In reply to Simon Marchi from comment #9)
> (In reply to Tom de Vries from comment #8)
> > Hi Simon,
> > 
> > For my understanding, does this mean that you where not able to reproduce
> > this with the exec I attached?  If so, what problem did you ran into?  Did
> > it just not reproduce or were there other issues?
> 
> I just tried it, it does reproduce with your binary.  Seeing the timestamps
> of the messages, maybe I started working on it before you uploaded the
> binary, or I just didn't see it.

Ack, thanks, then I misinterpreted this, and consequently didn't attach anything in PR26318.  I'll try to make sure it's there next time :)