[Dwarf-Discuss] DW_OP_regX vs. DW_OP_bregX 0
Robinson, Paul T (NonStop)
paul.t.robinson at hp.com
Thu Feb 12 11:42:44 PST 2009
Jakub Jelinek wrote:
>GCC uses DW_OP_regX heavily in lots of places, e.g. in .dwarf_frame when
>dynamic stack realignment is needed:
>DW_CFA_expression: r7 (edi) (DW_OP_reg5; DW_OP_const1s: -8; DW_OP_and;
>DW_OP_const1s: -4; DW_OP_plus)
>or e.g. in .dwarf_loc for
>DW_OP_reg4; DW_OP_deref etc.
>But I've been recently pointed at Dwarf3's 2.6.1 which seems to forbid this.
>What's the rationale for it? When DW_OP_reg5 is used alone, it has slightly
>different meaning from DW_OP_breg5 0 (the former means the value can be
>changed by tweaking the register, the latter is more like an rvalue), but
>when it is not used alone, is there a reason why DW_OP_regX couldn't be
>treated as a more compact form of DW_OP_bregX 0?
DW_CFA_expression takes a location expression. That is, an expression
that specifies a storage location, somewhere in the machine.
DW_OP_reg5 says the location is register 5.
DW_OP_breg5 0 says it is the memory address contained in register 5.
Clearly these are different locations (register vs. memory).
GCC is producing nonstandard expressions.
>I'm afraid changing all DW_OP_regX in GCC to DW_OP_bregX 0 except for
>DW_OP_regX alone in a location list will bloat the debug and unwind info a
If the 0 offset happens really a lot, it could be worth doing something
about it. Blessing GCC's current behavior doesn't feel right, though,
as it overloads DW_OP_regN to mean one thing when used by itself and
another thing when embedded in a larger expression. This puts an
unnecessary burden on the interpreter.
I might rather suggest a new set of operators, say DW_OP_cregN, which
are exactly equivalent to DW_OP_bregN 0. (creg = content of register.)
More information about the Dwarf-Discuss