Index: docs/SourceLevelDebugging.rst =================================================================== --- docs/SourceLevelDebugging.rst +++ docs/SourceLevelDebugging.rst @@ -531,6 +531,7 @@ variable to their machine locations over ranges of instructions. From IR to object emission, the major transformations which affect variable location fidelity are: + 1. Instruction Selection 2. Register allocation 3. Block layout @@ -539,6 +540,14 @@ significantly change the ordering of the program, and occurs in a number of different passes. +Some variable locations are not transformed during CodeGen. Stack locations +specified by ``llvm.dbg.declare`` are valid and unchanging for the entire +duration of the function, and are recorded in a simple MachineFunction table. +Location changes in the prologue and epilogue of a function are also ignored: +frame setup and destruction may take several instructions, require a +disproportionate amount of debugging information in the output binary to +describe, and should be stepped over by debuggers anyway. + Variable locations in Instruction Selection and MIR --------------------------------------------------- @@ -573,7 +582,8 @@ DBG_VALUE %1, $noreg, !123, !DIExpression() And have the following operands: - * The first operand can record the variable location as a register, an + * The first operand can record the variable location as a register, + a frame index, an immediate, or the base address register if the original debug intrinsic referred to memory. ``$noreg`` indicates the variable location is undefined, equivalent to an ``undef`` dbg.value operand.