<div dir="ltr"><div>Hello List!</div><div><br></div><div>I'm trying to add LLDB/DWARF debugging information to the RoboVM opensource fork [1] </div><div>Java AOT compiler. RoboVM uses the LLVM 3.6 (pre-release version) debugging format </div><div>and I got the basics working, but can't get the stack variable inspection to work. </div><div>The IR is generated by RoboVM's own implementation, not by the LLVM Cpp API.</div><div><br></div><div>The  "fr v" command doesn't show any local variables. Below the generated IR</div><div>for a method, the debugging info for this CU and the dwarfdump output.</div><div>I can't see the void* pointer argument %env in lldb. (Metadata Lines !38 - !42)</div><div><br></div><div>Any hint what I'm doing wrong would be great, since I ran out of ideas.</div><div><br></div><div>Thanks for your time, and sorry if this is the wrong place to ask!</div><div>Florian</div><div><br></div><div>[1] <a href="https://github.com/florianf/robovm/tree/dwarf_debugging_branch">https://github.com/florianf/robovm/tree/dwarf_debugging_branch</a></div><div><br></div><div>LLDB Version:</div><div>lldb-350.0.21.9</div><div><br></div><div>CLANG Version & Command:</div><div>Apple LLVM version 7.3.0 (clang-703.0.31)</div><div>clang++ -o Main -g -arch x86_64 -Wl,-filelist,objects0 -L vm/target/binaries/macosx/x86_64 -ObjC -exported_symbols_list exported_symbols -Wl,-no_implicit_dylibs -Wl,-dead_strip -fPIC -mmacosx-version-min=10.9 -Wl,-no_pie -lrobovm-bc-dbg -force_load vm/target/binaries/macosx/x86_64/librobovm-rt-dbg.a -lrobovm-debug-dbg -lrobovm-core-dbg -lgc-dbg -lpthread -ldl -lm -lz -liconv -lsqlite3 -framework Foundation -framework CoreServices</div><div><br></div><div>Generated IR for a method:</div><div><br></div><div>define weak i32 @"[J]Main.instanceMethod(I)I"(%Env* %p0, %Object* %p1, i32 %p2) nounwind noinline optsize {</div><div>label0:</div><div>    %__envStack = alloca %Env*</div><div>    store %Env* %p0, %Env** %__envStack</div><div>    call void @"llvm.dbg.declare"(metadata %Env** %__envStack, metadata !39), !dbg !57</div><div>    %r0 = alloca %Object*</div><div>    %i0 = alloca i32</div><div>    %r1 = alloca %Object*</div><div>    %$r2 = alloca %Object*</div><div>    %$r3 = alloca %Object*</div><div>    %$i1 = alloca i32</div><div>    %$i2 = alloca i32</div><div>    %$i3 = alloca i32</div><div>    call void @"checkso"()</div><div>    store %Object* %p1, %Object** %r0, !dbg !58</div><div>    store i32 %p2, i32* %i0, !dbg !63</div><div>    %t0 = call %Object* @"[j]str_ndiiiddd_00[ldcstring]"(%Env* %p0), !dbg !51</div><div>    store %Object* %t0, %Object** %r1, !dbg !56</div><div>    %t1 = load %Object** %r0, !dbg !52</div><div>    %t2 = call %Object* @"[j]Main.scAttr(Ltest/sub/SubClass;)[get]"(%Env* %p0, %Object* %t1), !dbg !64</div><div>    store %Object* %t2, %Object** %$r2, !dbg !45</div><div>    %t3 = load %Object** %$r2, !dbg !65</div><div>    %t4 = call i8 @"checknull"(%Env* %p0, %Object* %t3), !dbg !43</div><div>    call void @"[j]test.sub.SubClass.throwSomething()V[Invokevirtual(Main,test/sub/SubClass)]"(%Env* %p0, %Object* %t3), !dbg !50</div><div>    %t5 = call %Object* @"[j]str_777_00[ldcstring]"(%Env* %p0), !dbg !49</div><div>    store %Object* %t5, %Object** %$r3, !dbg !46</div><div>    %t6 = load %Object** %$r3, !dbg !67</div><div>    %t7 = call i32 @"[j]java.lang.String.length()I[Invokevirtual(Main,java/lang/String)]"(%Env* %p0, %Object* %t6), !dbg !54</div><div>    store i32 %t7, i32* %$i1, !dbg !59</div><div>    %t8 = load %Object** %r1, !dbg !55</div><div>    %t9 = call i32 @"[j]java.lang.String.length()I[Invokevirtual(Main,java/lang/String)]"(%Env* %p0, %Object* %t8), !dbg !44</div><div>    store i32 %t9, i32* %$i2, !dbg !60</div><div>    %t11 = load i32* %$i1, !dbg !53</div><div>    %t12 = load i32* %$i2, !dbg !61</div><div>    %t10 = add i32 %t11, %t12, !dbg !47</div><div>    store i32 %t10, i32* %$i3, !dbg !62</div><div>    %t13 = load i32* %$i3, !dbg !66</div><div>    ret i32 %t13, !dbg !48</div><div>}</div><div><br></div><div>Debugging Metadata:</div><div>!<a href="http://llvm.dbg.cu">llvm.dbg.cu</a> = !{!7}</div><div>!llvm.module.flags = !{!3, !4}</div><div><br></div><div>!0 = !{}</div><div>!1 = !{!"Main.java", !"/Users/generalsolutions/Documents/runtime-EclipseApplication/RobovmConsole/src/main/java/"}</div><div>!2 = !{!18, !38, !68, !78}</div><div>!3 = !{i32 2, !"Dwarf Version", i32 2}</div><div>!4 = !{i32 2, !"Debug Info Version", i32 2}</div><div>!5 = !{!"0x29", !1} ; [ DW_TAG_file_type ] [ /Users/generalsolutions/Documents/runtime-EclipseApplication/RobovmConsole/src/main/java/Main.java ]</div><div>!6 = !{!"0x258"} ; [ DW_TAG_expression ]</div><div>!7 = !{!"0x11\0011\00RoboVM 2.2.0-SNAPSHOT\001\00\000\00\001", !1, !0, !0, !2, !0, !0} ; [ DW_TAG_compile_unit ] [ /Users/generalsolutions/Documents/runtime-EclipseApplication/RobovmConsole/src/main/java/Main.java ] [ DW_LANG_Java ]</div><div>!8 = !{!"0x24\00boolean\000\008\008\000\000\002", null, null} ; [ DW_TAG_base_type ] [ boolean ] [ line 0, size 8, align 8, offset 0, enc DW_ATE_boolean ]</div><div>!9 = !{!"0x24\00byte\000\008\008\000\000\006", null, null} ; [ DW_TAG_base_type ] [ byte ] [ line 0, size 8, align 8, offset 0, enc DW_ATE_signed_char ]</div><div>!10 = !{!"0x24\00short\000\0016\0016\000\000\005", null, null} ; [ DW_TAG_base_type ] [ short ] [ line 0, size 16, align 16, offset 0, enc DW_ATE_signed ]</div><div>!11 = !{!"0x24\00char\000\0016\0016\000\000\007", null, null} ; [ DW_TAG_base_type ] [ char ] [ line 0, size 16, align 16, offset 0, enc DW_ATE_unsigned ]</div><div>!12 = !{!"0x24\00int\000\0032\0032\000\000\005", null, null} ; [ DW_TAG_base_type ] [ int ] [ line 0, size 32, align 32, offset 0, enc DW_ATE_signed ]</div><div>!13 = !{!"0x24\00long\000\0064\0064\000\000\005", null, null} ; [ DW_TAG_base_type ] [ long ] [ line 0, size 64, align 64, offset 0, enc DW_ATE_signed ]</div><div>!14 = !{!"0x24\00float\000\0032\0032\000\000\004", null, null} ; [ DW_TAG_base_type ] [ float ] [ line 0, size 32, align 32, offset 0, enc DW_ATE_float ]</div><div>!15 = !{!"0x24\00double\000\0064\0064\000\000\004", null, null} ; [ DW_TAG_base_type ] [ double ] [ line 0, size 64, align 64, offset 0, enc DW_ATE_float ]</div><div>!16 = !{!"0xf\00Env\000\0064\0064\000\000", null, null, null} ; [ DW_TAG_pointer_type ] [ Env ] [ line 0, size 64, align 64, offset 0 ] [ from ]</div><div>!17 = !{!"0xf\00Object\000\0064\0064\000\000", null, null, null} ; [ DW_TAG_pointer_type ] [ Object ] [ line 0, size 64, align 64, offset 0 ] [ from ]</div><div>!18 = !{!"0x2e\00[J]Main.<init>(I)V\00[J]Main.<init>(I)V\00\007\000\001\000\000\00256\000\007", !1, !5, !22, null, void (%Env*, %Object*, i32)* @"[J]Main.<init>(I)V", null, null, !20} ; [ DW_TAG_subprogram ] [ line 7 ] [ def ] [ [J]Main.<init>(I)V ]</div><div>!19 = !{!"0x101\00env\0016777223\000", !18, !5, !17} ; [ DW_TAG_arg_variable ] [ env ] [ line 7 ]</div><div>!20 = !{}</div><div>!21 = !{null, !16, !17, !12}</div><div>!22 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !21, null, null, null} ; [ DW_TAG_subroutine_type ] [ line 0, size 0, align 0, offset 0 ] [ from ]</div><div>!23 = !{i32 9, i32 0, !18, null}</div><div>!24 = !{i32 7, i32 0, !18, null}</div><div>!25 = !{i32 8, i32 0, !18, null}</div><div>!26 = !{i32 9, i32 0, !18, null}</div><div>!27 = !{i32 10, i32 0, !18, null}</div><div>!28 = !{i32 9, i32 0, !18, null}</div><div>!29 = !{i32 8, i32 0, !18, null}</div><div>!30 = !{i32 7, i32 0, !18, null}</div><div>!31 = !{i32 7, i32 0, !18, null}</div><div>!32 = !{i32 9, i32 0, !18, null}</div><div>!33 = !{i32 7, i32 0, !18, null}</div><div>!34 = !{i32 7, i32 0, !18, null}</div><div>!35 = !{i32 9, i32 0, !18, null}</div><div>!36 = !{i32 9, i32 0, !18, null}</div><div>!37 = !{i32 9, i32 0, !18, null}</div><div>!38 = !{!"0x2e\00[J]Main.instanceMethod(I)I\00[J]Main.instanceMethod(I)I\00\0013\000\001\000\000\00256\000\0013", !1, !5, !42, null, i32 (%Env*, %Object*, i32)* @"[J]Main.instanceMethod(I)I", null, null, !40} ; [ DW_TAG_subprogram ] [ line 13 ] [ def ] [ [J]Main.instanceMethod(I)I ]</div><div>!39 = !{!"0x101\00env\0016777229\000", !38, !5, !17} ; [ DW_TAG_arg_variable ] [ env ] [ line 13 ]</div><div>!40 = !{}</div><div>!41 = !{!12, !16, !17, !12}</div><div>!42 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !41, null, null, null} ; [ DW_TAG_subroutine_type ] [ line 0, size 0, align 0, offset 0 ] [ from ]</div><div>!43 = !{i32 14, i32 0, !38, null}</div><div>!44 = !{i32 15, i32 0, !38, null}</div><div>!45 = !{i32 14, i32 0, !38, null}</div><div>!46 = !{i32 15, i32 0, !38, null}</div><div>!47 = !{i32 15, i32 0, !38, null}</div><div>!48 = !{i32 15, i32 0, !38, null}</div><div>!49 = !{i32 15, i32 0, !38, null}</div><div>!50 = !{i32 14, i32 0, !38, null}</div><div>!51 = !{i32 13, i32 0, !38, null}</div><div>!52 = !{i32 14, i32 0, !38, null}</div><div>!53 = !{i32 15, i32 0, !38, null}</div><div>!54 = !{i32 15, i32 0, !38, null}</div><div>!55 = !{i32 15, i32 0, !38, null}</div><div>!56 = !{i32 13, i32 0, !38, null}</div><div>!57 = !{i32 13, i32 0, !38, null}</div><div>!58 = !{i32 13, i32 0, !38, null}</div><div>!59 = !{i32 15, i32 0, !38, null}</div><div>!60 = !{i32 15, i32 0, !38, null}</div><div>!61 = !{i32 15, i32 0, !38, null}</div><div>!62 = !{i32 15, i32 0, !38, null}</div><div>!63 = !{i32 13, i32 0, !38, null}</div><div>!64 = !{i32 14, i32 0, !38, null}</div><div>!65 = !{i32 14, i32 0, !38, null}</div><div>!66 = !{i32 15, i32 0, !38, null}</div><div>!67 = !{i32 15, i32 0, !38, null}</div><div>!68 = !{!"0x2e\00[J]Main.anotherMethod(JJLjava/lang/String;)I\00[J]Main.anotherMethod(JJLjava/lang/String;)I\00\0019\000\001\000\000\00256\000\0019", !1, !5, !72, null, i32 (%Env*, i64, i64, %Object*)* @"[J]Main.anotherMethod(JJLjava/lang/String;)I", null, null, !70} ; [ DW_TAG_subprogram ] [ line 19 ] [ def ] [ [J]Main.anotherMethod(JJLjava/lang/String;)I ]</div><div>!69 = !{!"0x101\00env\0016777235\000", !68, !5, !17} ; [ DW_TAG_arg_variable ] [ env ] [ line 19 ]</div><div>!70 = !{}</div><div>!71 = !{!12, !16, !17, !13, !13, !17}</div><div>!72 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !71, null, null, null} ; [ DW_TAG_subroutine_type ] [ line 0, size 0, align 0, offset 0 ] [ from ]</div><div>!73 = !{i32 19, i32 0, !68, null}</div><div>!74 = !{i32 19, i32 0, !68, null}</div><div>!75 = !{i32 19, i32 0, !68, null}</div><div>!76 = !{i32 19, i32 0, !68, null}</div><div>!77 = !{i32 19, i32 0, !68, null}</div><div>!78 = !{!"0x2e\00[J]Main.main([Ljava/lang/String;)V\00[J]Main.main([Ljava/lang/String;)V\00\0024\000\001\000\000\00256\000\0024", !1, !5, !82, null, void (%Env*, %Object*)* @"[J]Main.main([Ljava/lang/String;)V", null, null, !80} ; [ DW_TAG_subprogram ] [ line 24 ] [ def ] [ [J]Main.main([Ljava/lang/String;)V ]</div><div>!79 = !{!"0x101\00env\0016777240\000", !78, !5, !17} ; [ DW_TAG_arg_variable ] [ env ] [ line 24 ]</div><div>!80 = !{}</div><div>!81 = !{null, !16, !17, !17}</div><div>!82 = !{!"0x15\00\000\000\000\000\000\000", null, null, null, !81, null, null, null} ; [ DW_TAG_subroutine_type ] [ line 0, size 0, align 0, offset 0 ] [ from ]</div><div>!83 = !{i32 29, i32 0, !78, null}</div><div>!84 = !{i32 30, i32 0, !78, null}</div><div>!85 = !{i32 45, i32 0, !78, null}</div><div>!86 = !{i32 24, i32 0, !78, null}</div><div>!87 = !{i32 29, i32 0, !78, null}</div><div>!88 = !{i32 30, i32 0, !78, null}</div><div>!89 = !{i32 24, i32 0, !78, null}</div><div>!90 = !{i32 29, i32 0, !78, null}</div><div>!91 = !{i32 29, i32 0, !78, null}</div><div>!92 = !{i32 29, i32 0, !78, null}</div><div>!93 = !{i32 24, i32 0, !78, null}</div><div>!94 = !{i32 30, i32 0, !78, null}</div><div>!95 = !{i32 29, i32 0, !78, null}</div><div>!96 = !{i32 24, i32 0, !78, null}</div><div><br></div><div>LLDB Backtrace:</div><div>frame #3 is implemented in assembler, frame #0 is the method whith the %env arg:</div><div>* thread #1: tid = 0xc6189, 0x000000010052861f Main`[J]Main.instanceMethod(I)I at Main.java:13, queue = 'com.apple.main-thread', stop reason = breakpoint 1.1</div><div>  * frame #0: 0x000000010052861f Main`[J]Main.instanceMethod(I)I at Main.java:13</div><div>    frame #1: 0x0000000100528586 Main`[j]Main.instanceMethod(I)I[Invokevirtual(Main,Main)] + 9</div><div>    frame #2: 0x00000001005287a8 Main`[J]Main.main([Ljava/lang/String;)V + 101 at Main.java:30</div><div>    frame #3: 0x0000000100bd763e Main`_call0 + 142 at call0-darwin-x86_64.s:80</div><div>    frame #4: 0x0000000100bbb661 Main`callVoidMethod(env=0x0000000101f4afa0, callInfo=0x00007fff5fbff500) + 145 at method.c:640</div><div>    frame #5: 0x0000000100bc1cc2 Main`rvmCallVoidClassMethodA(env=0x0000000101f4afa0, clazz=0x0000000103885580, method=0x000000010388f550, args=0x0000000103869fa0) + 514 at method.c:1177</div><div>    frame #6: 0x0000000100bc1d32 Main`rvmCallVoidClassMethodV(env=0x0000000101f4afa0, clazz=0x0000000103885580, method=0x000000010388f550, args=0x00007fff5fbff810) + 82 at method.c:1183</div><div>    frame #7: 0x0000000100bc1ead Main`rvmCallVoidClassMethod(env=0x0000000101f4afa0, clazz=0x0000000103885580, method=0x000000010388f550) + 365 at method.c:1189</div><div>    frame #8: 0x0000000100bae158 Main`rvmRun(env=0x0000000101f4afa0) + 344 at init.c:498</div><div>    frame #9: 0x0000000100b984a2 Main`bcmain(argc=2, argv=0x00007fff5fbff918) + 178 at bc.c:97</div><div>    frame #10: 0x0000000100b9d87b Main`main(argc=2, argv=0x00007fff5fbff918) + 27 at bc.c:103</div><div>    frame #11: 0x00007fff886005ad libdyld.dylib`start + 1</div><div>    frame #12: 0x00007fff886005ad libdyld.dylib`start + 1</div><div><br></div><div>dwarfdump output:</div><div>    ----------------------------------------------------------------------</div><div>     File: Main.class.o (x86_64)</div><div>    ----------------------------------------------------------------------</div><div>    .debug_info contents:</div><div><br></div><div>    0x00000000: Compile Unit: length = 0x000000e0  version = 0x0002  abbr_offset = 0x00000000  addr_size = 0x08  (next CU at 0x000000e4)</div><div><br></div><div>    0x0000000b: TAG_compile_unit [1] *</div><div>                 AT_producer( "RoboVM 2.2.0-SNAPSHOT" )</div><div>                 AT_language( DW_LANG_Java )</div><div>                 AT_name( "Main.java" )</div><div>                 AT_stmt_list( 0x00000000 )</div><div>                 AT_comp_dir( "/Users/generalsolutions/Documents/runtime-EclipseApplication/RobovmConsole/src/main/java/" )</div><div>                 AT_APPLE_optimized( 0x01 )</div><div>                 AT_low_pc( 0x0000000000000000 )</div><div>                 AT_ranges( 0x00000000</div><div>                    [0x00000000000006f0 - 0x000000000000080b)</div><div>                    [0x0000000000000878 - 0x0000000000000893)</div><div>                    [0x0000000000000893 - 0x0000000000000901)</div><div>                     End )</div><div><br></div><div>    0x0000002b:     TAG_subprogram [2] *</div><div>                     AT_low_pc( 0x00000000000006f0 )</div><div>                     AT_high_pc( 0x000000000000076f )</div><div>                     AT_frame_base( rbp )</div><div>                     AT_name( "[J]Main.<init>(I)V" )</div><div>                     AT_decl_file( "Main.java" )</div><div>                     AT_decl_line( 7 )</div><div>                     AT_external( 0x01 )</div><div><br></div><div>    0x00000045:         TAG_formal_parameter [3]  </div><div>                         AT_location( fbreg -8 )</div><div>                         AT_name( "env" )</div><div>                         AT_decl_file( "Main.java" )</div><div>                         AT_decl_line( 7 )</div><div>                         AT_type( {0x000000de} ( Object ) )</div><div><br></div><div>    0x00000053:         NULL</div><div><br></div><div>    0x00000054:     TAG_subprogram [4] *</div><div>                     AT_low_pc( 0x000000000000076f )</div><div>                     AT_high_pc( 0x000000000000080b )</div><div>                     AT_frame_base( rbp )</div><div>                     AT_name( "[J]Main.instanceMethod(I)I" )</div><div>                     AT_decl_file( "Main.java" )</div><div>                     AT_decl_line( 13 )</div><div>                     AT_type( {0x000000d7} ( int ) )</div><div>                     AT_external( 0x01 )</div><div><br></div><div>    0x00000072:         TAG_formal_parameter [3]  </div><div>                         AT_location( fbreg -8 )</div><div>                         AT_name( "env" )</div><div>                         AT_decl_file( "Main.java" )</div><div>                         AT_decl_line( 13 )</div><div>                         AT_type( {0x000000de} ( Object ) )</div><div><br></div><div>    0x00000080:         NULL</div><div><br></div><div>    0x00000081:     TAG_subprogram [4] *</div><div>                     AT_low_pc( 0x0000000000000878 )</div><div>                     AT_high_pc( 0x0000000000000893 )</div><div>                     AT_frame_base( rbp )</div><div>                     AT_name( "[J]Main.anotherMethod(JJLjava/lang/String;)I" )</div><div>                     AT_decl_file( "Main.java" )</div><div>                     AT_decl_line( 19 )</div><div>                     AT_type( {0x000000d7} ( int ) )</div><div>                     AT_external( 0x01 )</div><div><br></div><div>    0x0000009f:         TAG_formal_parameter [3]  </div><div>                         AT_location( fbreg -8 )</div><div>                         AT_name( "env" )</div><div>                         AT_decl_file( "Main.java" )</div><div>                         AT_decl_line( 19 )</div><div>                         AT_type( {0x000000de} ( Object ) )</div><div><br></div><div>    0x000000ad:         NULL</div><div><br></div><div>    0x000000ae:     TAG_subprogram [2] *</div><div>                     AT_low_pc( 0x0000000000000893 )</div><div>                     AT_high_pc( 0x0000000000000901 )</div><div>                     AT_frame_base( rbp )</div><div>                     AT_name( "[J]Main.main([Ljava/lang/String;)V" )</div><div>                     AT_decl_file( "Main.java" )</div><div>                     AT_decl_line( 24 )</div><div>                     AT_external( 0x01 )</div><div><br></div><div>    0x000000c8:         TAG_formal_parameter [3]  </div><div>                         AT_location( fbreg -8 )</div><div>                         AT_name( "env" )</div><div>                         AT_decl_file( "Main.java" )</div><div>                         AT_decl_line( 24 )</div><div>                         AT_type( {0x000000de} ( Object ) )</div><div><br></div><div>    0x000000d6:         NULL</div><div><br></div><div>    0x000000d7:     TAG_base_type [5]  </div><div>                     AT_name( "int" )</div><div>                     AT_encoding( DW_ATE_signed )</div><div>                     AT_byte_size( 0x04 )</div><div><br></div><div>    0x000000de:     TAG_pointer_type [6]  </div><div>                     AT_name( "Object" )</div><div><br></div><div>    0x000000e3:     NULL</div><div><br></div></div>