summaryrefslogtreecommitdiffstats
path: root/gnu/usr.bin/binutils/gdb/dwarf2expr.c
diff options
context:
space:
mode:
authorkettenis <kettenis@openbsd.org>2017-08-14 19:41:30 +0000
committerkettenis <kettenis@openbsd.org>2017-08-14 19:41:30 +0000
commit84a83e238ec8f89c0ce5bb1a5d6f3f5cc1612949 (patch)
treee4608c3785b8b13d288d9afd0803f182d38085cc /gnu/usr.bin/binutils/gdb/dwarf2expr.c
parentcatch ENOENT and display a proper error message when a specified disk image is (diff)
downloadwireguard-openbsd-84a83e238ec8f89c0ce5bb1a5d6f3f5cc1612949.tar.xz
wireguard-openbsd-84a83e238ec8f89c0ce5bb1a5d6f3f5cc1612949.zip
Add improvements to the DWARF frame unwinder to support xorguard.
ok mortimer@
Diffstat (limited to 'gnu/usr.bin/binutils/gdb/dwarf2expr.c')
-rw-r--r--gnu/usr.bin/binutils/gdb/dwarf2expr.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/gnu/usr.bin/binutils/gdb/dwarf2expr.c b/gnu/usr.bin/binutils/gdb/dwarf2expr.c
index a60e5a90e86..4267bbdf4eb 100644
--- a/gnu/usr.bin/binutils/gdb/dwarf2expr.c
+++ b/gnu/usr.bin/binutils/gdb/dwarf2expr.c
@@ -505,6 +505,20 @@ execute_stack_op (struct dwarf_expr_context *ctx, unsigned char *op_ptr,
goto no_push;
}
+ case DW_OP_swap:
+ {
+ CORE_ADDR t1, t2;
+
+ if (ctx->stack_len < 2)
+ error ("Not enough elements for DW_OP_swap. Need 2, have %d\n",
+ ctx->stack_len);
+ t1 = ctx->stack[ctx->stack_len - 1];
+ t2 = ctx->stack[ctx->stack_len - 2];
+ ctx->stack[ctx->stack_len - 1] = t2;
+ ctx->stack[ctx->stack_len - 2] = t1;
+ goto no_push;
+ }
+
case DW_OP_deref:
case DW_OP_deref_size:
case DW_OP_abs: