[llvm-dev] Have the debugger show an away with a dynamic size?

Levo DeLellis via llvm-dev llvm-dev at lists.llvm.org
Sat Feb 15 08:17:56 PST 2020


Thanks for the suggestions but it doesn't appear to be working correctly
for me. I tried building the below after seeing the results with "clang -g
-std=c99 test.c" and got the same result

LLDB thinks MyArray is 81 elements long even though 81 and 80 doesn't show
up anywhere in the llvm-ir (I tried again using an llvm ir file made by
clang -g -std=c99 test.c -S -emit-llvm and clang -g test.ll)

$ cat test.c
int foo(int s) {
    int MyArray[s];
    int i;
    for (i = 0; i < s; ++i)
        MyArray[i] = s;
    return 0;
}

int main(){
    foo(5);
    return 0;
}
$ clang -g test.c
$ lldb ./a.out
(lldb) target create "./a.out"
Current executable set to './a.out' (x86_64).
(lldb) break set -f test.c -l 6
Breakpoint 1: where = a.out`foo + 101 at test.c:7, address =
0x0000000000400505
(lldb) r
Process 3205 launched: './a.out' (x86_64)
Process 3205 stopped
* thread #1, name = 'a.out', stop reason = breakpoint 1.1
    frame #0: 0x0000000000400505 a.out`foo(s=5) at test.c:7
   4      for (i = 0; i < s; ++i)
   5          MyArray[i] = s;
   6      return 0;
-> 7   }
   8
   9   int main(){
   10      foo(5);
(lldb) frame variable
(int) s = 5
(unsigned long) __vla_expr0 = 5
(int) i = 5
(int [81]) MyArray = {
  [0] = 5
  [1] = 5
  [2] = 5
  [3] = 5
  [4] = 5
  [5] = 0
  [6] = -136481184
  [7] = 32767
  [8] = -8408
  [9] = 32767
  [10] = -8544
  [11] = 32767
  [12] = 1
  [13] = 5
  [14] = 5
  [15] = 0
  [16] = -8512
  [17] = 32767
  [18] = 0
  [19] = 5
  [20] = -8432
  [21] = 32767
  [22] = 4195641
  [23] = 0
  [24] = -8208
  [25] = 32767
  [26] = 0
  [27] = 0
  [28] = 4195664
  [29] = 0
  [30] = -140485737
  [31] = 32767
  [32] = 0
  [33] = 32
  [34] = -8200
  [35] = 32767
  [36] = 0
  [37] = 1
  [38] = 4195616
  [39] = 0
  [40] = 0
  [41] = 0
  [42] = -1953144313
  [43] = 1284291557
  [44] = 4195248
  [45] = 0
  [46] = -8208
  [47] = 32767
  [48] = 0
  [49] = 0
  [50] = 0
  [51] = 0
  [52] = 1064657415
  [53] = -1284291430
  [54] = 933978631
  [55] = -1284287451
  [56] = 0
  [57] = 32767
  [58] = 0
  [59] = 0
  [60] = 0
  [61] = 0
  [62] = -136423629
  [63] = 32767
  [64] = -136530376
  [65] = 32767
  [66] = 386784
  [67] = 0
  [68] = 0
  [69] = 0
  [70] = 0
  [71] = 0
  [72] = 0
  [73] = 0
  [74] = 4195248
  [75] = 0
  [76] = -8208
  [77] = 32767
  [78] = 4195290
  [79] = 0
  [80] = -8216
}


On Thu, Feb 13, 2020 at 3:53 PM Adrian Prantl <aprantl at apple.com> wrote:

> Take a look at the IR clang produces for C99 variable-length arrays.
>
> -- adrian
>
> On Feb 13, 2020, at 10:03 AM, Levo DeLellis via llvm-dev <
> llvm-dev at lists.llvm.org> wrote:
>
> Hi. I searched and the closest thing I could find was this
> http://lists.llvm.org/pipermail/llvm-dev/2018-February/121348.html
>
> Currently a known sized array looks and debugs as expected. I use
> llvm.dbg.declare with DICompositeType tag: DW_TAG_array_type and the size
> field. In my language arrays are always passed around with a pointer and
> size pair. I'd like debugging to show up as nicely instead of a pointer
> addr with no information about the elements. How would I do this? I don't
> use the C API, I output llvm-ir directly. I was hoping I can call
> llvm.dbg.declare/addr/value to specify the pointer, name and size of the
> variable but I really have no idea how to pass the size to the debugger.
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200215/08640157/attachment.html>


More information about the llvm-dev mailing list