This is the mail archive of the mailing list for the GDB project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch v2 00/10] C99 variable length array support


this patch series (v2) add C99 variable length support to gdb.

It allows the user to evaluate a vla like an ordinary static array e.g. print
its elements instead of printing the pointer to the array. In addition the size
of a vla can be retrieved with gdbs builtin sizeof operator.

    1| void foo (size_t n) {
    2|   int ary[n];
    3|   memset(ary, 0, sizeof(ary));
    4| }

    (gdb) print ary
    $1 = {0 <repeats 42 times>}

    (gdb) print sizeof ary
    $2 = 168

Some technical background

Dwarf allows certain attributes e.g upper/lower bound to be computed
dynamically. To support this feature with the current gdb type-system types
are "normalized". This means types with dynamic properties are converted
to types with static properties.

To convert a type with dynamic properties into one with static properties
access to inferior memory is needed. Therefore we hooked into the following
value constructors value_at/value_at_lazy/value_from_contents_and_address
as they require an inferior address in addition to a type to instantiate
a value. IIF the passed type has dynamic properties we resolve the bounds
and thus the type is modified, not in place but rather by a new copy.

Given the following code snippet:

  struct value *val = value_at (my_vla_type, at_address);

Before this was always true:
  TYPE_LENGTH (value_type (val)) == TYPE_LENGTH (my_vla_type)

This is not the case after applying this patch series. Type normalization
is done in the mentioned value constructors and might change the value type.

Some documentation, examples as well as a github branch with support for c99
and Fortran variable length arrays is availabel at

Changes in v1:
 - Removed patch 05/10: allow side effects for sizeof argument
 - New patch: support for DW_AT_count
 - Replaced undefined_low, high with DWARF_UNDEFINED
 - Add varobj testcase to mi test
 - Fixed commit log
 - Various small issues mentioned in patches 01/10 and 02/10

 -Sanimir & Keven

Sanimir Agovic (10):
  vla: introduce new bound type abstraction adapt uses
  type: add c99 variable length array support
  vla: enable sizeof operator to work with variable length arrays
  vla: enable sizeof operator for indirection
  vla: update type from newly created value
  vla: print "dynamic length" for unresolved dynamic bounds
  test: multi-dimensional c99 vla.
  test: evaluate pointers to C99 vla correctly.
  test: basic c99 vla tests
  test: add mi vla test

 gdb/ada-lang.c                           |   13 +-
 gdb/c-typeprint.c                        |    5 +-
 gdb/cp-valprint.c                        |    2 +
 gdb/d-valprint.c                         |    1 +
 gdb/dwarf2loc.c                          |   60 ++++++-
 gdb/dwarf2loc.h                          |    7 +
 gdb/dwarf2read.c                         |  152 ++++++++++----
 gdb/eval.c                               |   10 +-
 gdb/gdbtypes.c                           |  322 ++++++++++++++++++++++++------
 gdb/gdbtypes.h                           |   59 ++++--
 gdb/jv-valprint.c                        |    1 +
 gdb/parse.c                              |    3 +-
 gdb/testsuite/gdb.base/vla-datatypes.c   |   86 ++++++++
 gdb/testsuite/gdb.base/vla-datatypes.exp |   82 ++++++++
 gdb/testsuite/gdb.base/vla-multi.c       |   55 +++++
 gdb/testsuite/gdb.base/vla-multi.exp     |   44 ++++
 gdb/testsuite/gdb.base/vla-ptr.c         |   63 ++++++
 gdb/testsuite/gdb.base/vla-ptr.exp       |   49 +++++
 gdb/testsuite/gdb.mi/mi-vla-c99.exp      |   80 ++++++++
 gdb/testsuite/gdb.mi/vla.c               |   35 ++++
 gdb/valops.c                             |    3 +
 gdb/value.c                              |   11 +-
 22 files changed, 1013 insertions(+), 130 deletions(-)
 create mode 100644 gdb/testsuite/gdb.base/vla-datatypes.c
 create mode 100644 gdb/testsuite/gdb.base/vla-datatypes.exp
 create mode 100644 gdb/testsuite/gdb.base/vla-multi.c
 create mode 100644 gdb/testsuite/gdb.base/vla-multi.exp
 create mode 100644 gdb/testsuite/gdb.base/vla-ptr.c
 create mode 100644 gdb/testsuite/gdb.base/vla-ptr.exp
 create mode 100644 gdb/testsuite/gdb.mi/mi-vla-c99.exp
 create mode 100644 gdb/testsuite/gdb.mi/vla.c

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]