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