[Dwarf-Discuss] DW_CFA_def_cfa_expression vs DW_CFA_def_cfa_register

Michael Eager eager at eagercon.com
Thu Apr 22 21:39:37 PDT 2010


Roland McGrath wrote:
> If an FDE contains:
> 
> 	...
> 	DW_CFA_def_cfa REGNO OFFSET
> 	...
> 	DW_def_cfa_expression BLOCK
> 	...
> 	DW_def_cfa_register REGNO
> 	...
> 
> then what is the offset value in force after DW_def_cfa_register?
> (The same question applies to the register number in force for
> a DW_CFA_def_cfa_offset{,_sf} after DW_def_cfa_expression.)
> 
> It seems to be implied that "current CFA state" is not either an expression
> block OR a (REGNO, OFFSET) pair, but rather is a (REGNO, OFFSET) pair AND
> an optional expression block that supercedes it.  DW_CFA_def_cfa* ops other
> than DW_CFA_def_cfa_expression remove the expression block from the current
> state, so the hidden REGNO and/or OFFSET (if not just replaced) again prevail.
> 
> Is that how it's intended to be read?  If so, it seems sufficiently
> nonobvious to merit some mention in the text for DW_CFA_def_cfa_expression.
> If not, and the case above is intended to reset OFFSET to zero or something
> like that, then the standard as written really doesn't say that at all and
> is incorrect.

There is nothing in the description of DW_CFA_* to suggest that there are
any hidden values, a stack for CFA definitions, or that any previous register
or offset values that are no longer valid are somehow reinstated.

Following DW_DEF_cfa_expression, there are no saved or hidden register
or offset values.  There is simply an expression used to compute the CFA.

In your example, I would suggest that following a DW_DEF_cfa_expression,
you use DW_CFA_def_cfa with a register and offset.  If you intend the
offset to be zero, you should specify it explicitly.

--
Michael Eager	 eager at eagercon.com
1960 Park Blvd., Palo Alto, CA 94306  650-325-8077



More information about the Dwarf-Discuss mailing list