diff options
author | Pedro Alves <palves@redhat.com> | 2016-08-19 12:07:45 +0100 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2016-08-19 12:12:18 +0100 |
commit | ed036b4052193ba6790ba7ee94a33a364ace3b55 (patch) | |
tree | a8555c4f79efed4c46f0e7dde1564798a72cede9 | |
parent | c8ef42eed100c2439e600e846caa7437da93ac17 (diff) | |
download | gdb-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/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/gdbserver/linux-x86-low.c | 2 |
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; } |