gdb/dwarf: fix internal error in dwarf2_fetch_cfa_info for FDEs without a CFA rule
Commit a910478f65a5 ("gdb/dwarf: fix internal error when FDEs do not
describe the CFA") fixed the switch on cfa_how in dwarf2_frame_cache,
but there is a very similar switch in dwarf2_fetch_cfa_info that has
the same issue. If the unwind info does not set a rule for the CFA,
fs.regs.cfa_how is left as CFA_UNSET and we hit the default case,
triggering an internal error.
dwarf2_fetch_cfa_info is called from two places, both while compiling
a DWARF expression that contains DW_OP_call_frame_cfa:
- dwarf2_compile_expr_to_ax, when compiling to agent-expression
bytecode
- do_compile_dwarf_expr_to_c, when compiling to C source (used by
the "compile" commands).
Unlike dwarf2_frame_cache, where we can degrade gracefully by setting
undefined_retaddr, the callers of dwarf2_fetch_cfa_info need a concrete
CFA to generate code, so we can't continue. Throw an error with the
same message used a few lines above, when the FDE itself cannot be
found.
Extend the debug-frame-no-cfa.exp test to reproduce this case: add a
compile unit describing the "main" function and with a DW_AT_frame_base
that uses DW_OP_call_frame_cfa and a local variable "x" that uses
DW_OP_fbreg (the evaluation of which requires the CFA). Then, try to
translate the location of "x" to agent-expression bytecode with "maint"
agent. This hits the internal error without the corresponding fix.
Change-Id: I82349e3d9259c8f943eabee5c2fce360876feee8
Approved-by: Kevin Buettner <kevinb@redhat.com>
2 files changed