HomePhabricator

Fix (and improve) the support for C99 variable length array types

Description

Fix (and improve) the support for C99 variable length array types

Clang recently improved its DWARF support for C VLA types. The DWARF
now looks like this:

0x00000051: DW_TAG_variable [4]

DW_AT_location( fbreg -32 )
DW_AT_name( "__vla_expr" )
DW_AT_type( {0x000000d3} ( long unsigned int ) )
DW_AT_artificial( true )

...
0x000000da: DW_TAG_array_type [10] *

DW_AT_type( {0x000000cc} ( int ) )

0x000000df: DW_TAG_subrange_type [11]

DW_AT_type( {0x000000e9} ( __ARRAY_SIZE_TYPE__ ) )
DW_AT_count( {0x00000051} )

Without this patch LLDB will naively interpret the DIE offset 0x51 as
the static size of the array, which is clearly wrong. This patch
extends ValueObject::GetNumChildren to query the dynamic properties of
incomplete array types.

See the testcase for an example:

4   int foo(int a) {
5   	     int vla[a];
6   	       for (int i = 0; i < a; ++i)
7   	           vla[i] = i;
8

-> 9 pause(); // break here

10  		return vla[a-1];
11   }

(lldb) fr v vla
(int []) vla = ([0] = 0, [1] = 1, [2] = 2, [3] = 3)
(lldb) quit

rdar://problem/21814005

Differential Revision: https://reviews.llvm.org/D53530

Details