In the version of LLVM I’m using (Apple tag 2352.1), it seems that the DWARF emitter cannot produce DWARF location lists to outline when user variables live and where. Instead it uses a crutch of DW_AT_start_scope to specify each solitary location where an assignment to a user variable does occur.
This is unsatisfactory for machines that put user variables in registers because it doesn’t specify when a register is used for some other purpose, leaving the debugger no clue about when a user’s variable might be “dead”. Instead, the debugger will silently tell the user whatever happens to be in that register at the time.
To do the right thing, I think the register allocator needs to emit llvm.dbg.value calls to specify “undef” as the new value for a variable whenever the register a variable lives in is repurposed. And then the DWARF emitter needs to use the pair of llvm.dbg.value calls to emit a location list if necessary (ie, the variable lives in more than one register during its overall lifetime, or isn’t available for its entire scope.)
Does this sound reasonable? If so, who is active in the DWARF emitter and can help or advise on any relevant changes (since 2352.1, or planned) in this area? It does seem likely to me that this deficiency might have been addressed already, or at least have plans in place.
MTS | Stream Compute SW | AMD