aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2016-08-19 12:07:45 +0100
committerPedro Alves <palves@redhat.com>2016-08-19 12:12:18 +0100
commited036b4052193ba6790ba7ee94a33a364ace3b55 (patch)
treea8555c4f79efed4c46f0e7dde1564798a72cede9
parentc8ef42eed100c2439e600e846caa7437da93ac17 (diff)
downloadgdb-ed036b4052193ba6790ba7ee94a33a364ace3b55.zip
gdb-ed036b4052193ba6790ba7ee94a33a364ace3b55.tar.gz
gdb-ed036b4052193ba6790ba7ee94a33a364ace3b55.tar.bz2
x32: gdbserver's agent bytecode JIT: fix "call" emission
Running fast tracepoint tests on x32 exposes a latent bug in the agent bytecode jitting. There's a code path that forgets to emit the call opcode... Whoops. Fixes a bunch of gdb.trace/trace-condition.exp FAILs, like: (gdb) continue Continuing. Thread 1 "trace-condition" received signal SIGSEGV, Segmentation fault. 0x7ffec016 in ?? () (gdb) FAIL: gdb.trace/trace-condition.exp: ftrace: $rip == *set_point: advance through tracing gdb/gdbserver/ChangeLog: 2016-08-19 Pedro Alves <palves@redhat.com> * linux-x86-low.c (amd64_emit_call): Emit missing call opcode.
-rw-r--r--gdb/gdbserver/ChangeLog4
-rw-r--r--gdb/gdbserver/linux-x86-low.c2
2 files changed, 6 insertions, 0 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index f59d389..c28c2cb 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,5 +1,9 @@
2016-08-19 Pedro Alves <palves@redhat.com>
+ * linux-x86-low.c (amd64_emit_call): Emit missing call opcode.
+
+2016-08-19 Pedro Alves <palves@redhat.com>
+
* linux-x86-low.c (amd64_install_fast_tracepoint_jump_pad): Fix
comment. Use memcpy instead of casting through unsigned long.
diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
index 1ba98ba..d847b93 100644
--- a/gdb/gdbserver/linux-x86-low.c
+++ b/gdb/gdbserver/linux-x86-low.c
@@ -1842,6 +1842,8 @@ amd64_emit_call (CORE_ADDR fn)
else
{
int offset32 = offset64; /* we know we can't overflow here. */
+
+ buf[i++] = 0xe8; /* call <reladdr> */
memcpy (buf + i, &offset32, 4);
i += 4;
}