<div dir="ltr">Hello everybody,<div><br></div><div>I'm working on adding debug info support for julia and have a few questions about the llvm.dbg intrinsics. Sorry if this is a little long. If any of the things I'm asking about aren't currently possible in LLVM, I'd be more than happy to work on them, if I can get some advice on the general direction (e.g. can everything be retrofitted onto the existing intrinsics or do I need new ones, etc.) </div>

<div><br></div><div>My first question is as follows. Consider the following llvm IR (exerted from a Julia try/catch block)</div><div><br></div><div><div>  call void @llvm.dbg.value(metadata !{%jl_value_t* %16}, i64 0, metadata !19)</div>

<div>  %17 = getelementptr %jl_value_t** %1, i64 1, !dbg !15</div><div>  %18 = load %jl_value_t** %17, !dbg !15</div><div>  call void @llvm.dbg.value(metadata !{%jl_value_t* %18}, i64 0, metadata !20)</div><div>  store i1 false, i1* %"#s55", !dbg !21</div>

<div>  %19 = getelementptr i8* %14, i64 0, !dbg !21</div><div>  call void @jl_enter_handler(i8* %19), !dbg !21</div><div>  %20 = call i32 @sigsetjmp(i8* %19, i32 0), !dbg !21</div><div>  %21 = icmp eq i32 %20, 0, !dbg !21</div>

<div>  br i1 %21, label %try, label %L, !dbg !21</div><div><br></div><div>try:                                              ; preds = %top</div><div>  call void inttoptr (i64 4295956000 to void ()*)(), !dbg !22</div><div>

  %22 = getelementptr %jl_value_t** %4, i64 1, !dbg !22</div><div>  store %jl_value_t* %18, %jl_value_t** %22, !dbg !22</div><div>  call void @llvm.dbg.declare(metadata !{%jl_value_t** %22}, metadata !20)</div></div><div>

<br></div><div>The generated corresponding DWARF info is (corresponding to !20):</div><div><br></div><div><div>                     AT_location( 0x0000005f</div><div>                        0x00000001142f4000 - 0x00000001142f40b2: rsi</div>

<div>                        0x00000001142f40b2 - 0x00000001142f40c3: rsp+104</div><div>                        0x00000001142f4115 - 0x00000001142f4153: rax</div><div>                        0x00000001142f4153 - 0x00000001142f4155: rsp+56 )</div>

</div><div><br></div><div>Now 0x00000001142f40c3 is the location of the `call void @jl_enter_handler(i8* %19)`. So there's a gap in the debug info from there until the next declare. I would like to understand why this is the case and what to do about it (note that %18 is still used later, so it's not the case that it goes out of scope, the stack location is still valid). </div>

<div><br></div><div>My second question is about variables that live at multiple locations. The DWARF standard supports overlapping address ranges and in Julia a variable might be in several locations at once and I'd love to just be able to declare them all and have llvm figure out the appropriate ranges. Some examples of where the variable might live are:</div>

<div><br></div><div>- In the argument array passed to a function (for certain functions we pass an array</div><div>of boxed pointers on the stack)</div><div>- In a GC slot</div><div>- Loaded into registers</div><div><br>
</div>
<div>Sometimes these overlap, so I feel like I ought to just put all of that information into the debug info and have the debugger figure it out. Is there anyway to declare overlapping ranges?</div><div><br></div><div>My third question is related to the argument array. In particular, it should be always possible for the debugger to find out where the argument array is by looking at the gc frame of the calling function and then taking an appropriate offset. I realize this is probably very fancy, but it seems to me that it should be possible to encode this into a DWARF expression and have it just work in the debugger. I'm not sure it is feasible to express this directly using LLVM intrinsics, but it should be fairly straightforward to write myself. Do the necessary hooks exist in LLVM to do something like this (ideally llvm would determine the appropriate address ranges and I'd just provide the single location information a a DWARF expression). If this capability doesn't exist yet, I'd appreciate some pointer about where to add it.</div>

<div><br></div><div>Thanks for reading and I apologize that this has gotten so long. At some point I might have to move some of the more fancy functionality to the custom debugger, side but I'd prefer to encode as much as possible directly into DWARF, so I want to see how far I can get just with that.</div>

<div><br></div><div>Thanks,</div><div>Keno</div><div><br></div><div><br></div><div><br></div></div>