aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2loc.c
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2014-05-14 14:25:01 -0600
committerJan Kratochvil <jan.kratochvil@redhat.com>2014-12-12 22:26:57 +0100
commita8fd55897077beda3717e0672807c1b2940e330a (patch)
tree5d9eaf4c263980c04f456ca021c7a66f645ed59d /gdb/dwarf2loc.c
parented12ef62ccad3b86e25ec3b042d8bf7f15c75909 (diff)
downloadgdb-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.c30
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,
+ &regnum, &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: