diff options
author | Tom Tromey <tromey@redhat.com> | 2014-05-14 14:25:01 -0600 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2014-12-12 22:26:57 +0100 |
commit | a8fd55897077beda3717e0672807c1b2940e330a (patch) | |
tree | 5d9eaf4c263980c04f456ca021c7a66f645ed59d /gdb/dwarf2loc.c | |
parent | ed12ef62ccad3b86e25ec3b042d8bf7f15c75909 (diff) | |
download | gdb-a8fd55897077beda3717e0672807c1b2940e330a.zip gdb-a8fd55897077beda3717e0672807c1b2940e330a.tar.gz gdb-a8fd55897077beda3717e0672807c1b2940e330a.tar.bz2 |
split dwarf2_fetch_cfa_info from dwarf2_compile_expr_to_ax
This removes dwarf2_compile_expr_to_ax, replacing it with a utility
function that fetches the CFA data and adding the code to actually
compile to an agent expression directly into
dwarf2_compile_expr_to_ax. This refactoring lets a later patch reuse
the new dwarf2_fetch_cfa_info.
gdb/ChangeLog
2014-12-12 Tom Tromey <tromey@redhat.com>
* dwarf2loc.c (dwarf2_compile_expr_to_ax) <DW_OP_call_frame_cfa>:
Update.
* dwarf2-frame.c (dwarf2_fetch_cfa_info): New function, based on
dwarf2_compile_cfa_to_ax.
(dwarf2_compile_cfa_to_ax): Remove.
* dwarf2-frame.h (dwarf2_fetch_cfa_info): Declare.
(dwarf2_compile_cfa_to_ax): Remove.
Diffstat (limited to 'gdb/dwarf2loc.c')
-rw-r--r-- | gdb/dwarf2loc.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/gdb/dwarf2loc.c b/gdb/dwarf2loc.c index fbaa7d3..bbe4568 100644 --- a/gdb/dwarf2loc.c +++ b/gdb/dwarf2loc.c @@ -3282,8 +3282,34 @@ dwarf2_compile_expr_to_ax (struct agent_expr *expr, struct axs_value *loc, break; case DW_OP_call_frame_cfa: - dwarf2_compile_cfa_to_ax (expr, loc, arch, expr->scope, per_cu); - loc->kind = axs_lvalue_memory; + { + int regnum; + CORE_ADDR text_offset; + LONGEST off; + const gdb_byte *cfa_start, *cfa_end; + + if (dwarf2_fetch_cfa_info (arch, expr->scope, per_cu, + ®num, &off, + &text_offset, &cfa_start, &cfa_end)) + { + /* Register. */ + ax_reg (expr, regnum); + if (off != 0) + { + ax_const_l (expr, off); + ax_simple (expr, aop_add); + } + } + else + { + /* Another expression. */ + ax_const_l (expr, text_offset); + dwarf2_compile_expr_to_ax (expr, loc, arch, addr_size, + cfa_start, cfa_end, per_cu); + } + + loc->kind = axs_lvalue_memory; + } break; case DW_OP_GNU_push_tls_address: |