I am interested in tracking precisely locations of local variables / function parameters in the binary (whether the variable is on the stack, in a register, or maybe both). I know that this is part of the debug information, which can be potentially dropped by optimization passes. Is there any way to verify after each pass the location of the variable?
I mean, right before any optimization, we can find the local variable i on the stack, and after -mem2reg, maybe the variable is now in an SSA register %i, then after Register Allocation, %I is mapped into the physical register r1 on ARM, for example. I think about implementing a pass that will be inserted after each optimization pass to verify that the variable is still there and get its location, but not sure how to do this precisely. I would appreciate any help/advice/pointer on how to tackle this.
Thank you for your time
Son Tuan Vu
The debug information does try to track what happens to parameters and local variables. In the IR this is done with llvm.dbg.value intrinsic functions, and in Machine IR this is done with DBG_VALUE instructions. These have operands that point to the metadata describing the variable, and the location or value of the variable. Ideally each optimization would preserve this information, unless the variable is actually “optimized away” at which point of course there is no location anymore.
The assignment of stack locations or physical registers is done very late, so in earlier phases these locations simply don’t exist yet. The location/value would be an IR value. But it sounds like you are mostly interested in making sure the information isn’t dropped, and you can do that by looking at all of the dbg.value or DBG_VALUE instructions.
Hope this helps,
Thank you for your reply. I have some more questions inlined below.
Son Tuan Vu