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

Adrian Prantl via llvm-dev llvm-dev at lists.llvm.org
Mon Feb 17 08🔞37 PST 2020


That is interesting. According to LLDB's test/lang/c/vla/* frame variable for a VLA is supposed to work. Frame variable is also supposed to hide the __vla_expr0 artificial helper variable. Is this an older LLDB from your system or an LLDB you built from source? If yes, would you mind filing a bugreport about this?

thanks, adrian

On Feb 15, 2020, at 8:17 AM, Levo DeLellis <levo.delellis at gmail.com> wrote:

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' (x8664)._ _(lldb) break set -f test.c -l 6_ _Breakpoint 1: where = a.outfoo + 101 at test.c:7, address = 0x0000000000400505_ _(lldb) r_ _Process 3205 launched: './a.out' (x8664)_ _Process 3205 stopped_ _* thread #1, name = 'a.out', stop reason = breakpoint 1.1_ _frame #0: 0x0000000000400505 a.outfoo(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) vlaexpr0 = 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: DWTAGarraytype 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



More information about the llvm-dev mailing list