[PATCH v2 00/17] Fast tracepoint support for ARMv7

Antoine Tremblay
2016-06-09T12:56:49Z

Hi,

This is a v2 of:
https://sourceware.org/ml/gdb-patches/2015-10/msg00195.html

It needs to be applied on top of tracepoints support for ARM see:
https://sourceware.org/ml/gdb-patches/2016-01/msg00111.html

This patch enables fast tracepoints for ARM on Linux.

It has been reworked by Simon Marchi and Antoine Tremblay and the
following features have been added:

* Relocation of many PC relative instructions.

* JIT compilation of the condition expression.

There are some limitations:

* The tracepoint insertion will fail if the distance from the
instruction to the jump pad is big.

* It is only possible to place fast tracepoints on 4-byte
instructions, which also limits the valid locations in Thumb mode.

Known Issues:

There is a possible issue while stepping out of the jump pad as discussed
here: https://sourceware.org/ml/gdb-patches/2016-01/msg00673.html

But this issue is present in x86 with hardware single stepping too. So I
don't think it's related to this series and can be addressed separately.
I'm still mentioning it as it may be relevant while testing software
single stepping out of the jump pad.

Patches:

Patches 1-9: Share instruction decoding code between GDB and GDBServer so
that it can be used for instruction relocation in GDBServer.

Patch 10: Refactors install_fast_tracepoint_jump_pad to pass a pointer to
the tracepoint, instead of separate arguments.

Patch 11: Enables software single stepping out of the jump pad.

Patch 12: Adds all the functions needed to assemble ARM instructions
needed in the jump pad and in the JIT condition evaluation.

Patch 13: Adds fast tracepoint support, without JIT condition evaluation
and PC-relative instructions support.

Patch 14: Adds JIT condition evaluation support.

Patch 15-17: Adds PC-relative instruction relocation support.

Tested on ARMv7 linux {unix, native-gdbserver, native-extended-gdbserver}
no regression observed.

Antoine Tremblay (4):
Use software single step to step out of a fast tracepoint jump pad
Add ARM/Thumb instruction assembler for fast tracepoints
Fast tracepoint support for ARM on Linux
JIT conditions support for ARM tracepoints.

Simon Marchi (13):
arm-tdep.c: Replace arguments to decode function by a structure
arm-tdep.c: Refactor displaced stepping relocation functions
arm-tdep.c: Move debug printout from decode to copy function
arm-tdep.c: Use relocation visitor in ARM instruction decoding
arm-tdep.c: Use relocation visitor in Thumb 32-bits instruction
decoding
arm-tdep.c: Use relocation visitor in Thumb 16-bits instruction
decoding
Move ARM instruction decode functions to arch/arm-insn-reloc.c
Move Thumb 32 bits instruction decode functions to
arch/arm-insn-reloc.c
Move Thumb 16 bits instruction decode functions to
arch/arm-insn-reloc.c
gdbserver: pass pointer to struct tracepoint to
install_fast_tracepoint_jump_pad
arm: Move insn_references_pc to common code
arm fast tracepoints: Relocation of ARM instructions
arm fast tracepoints: Relocation of Thumb 32-bits instructions

gdb/Makefile.in | 29 +-
gdb/NEWS | 4 +
gdb/aarch64-tdep.c | 3 +-
gdb/arch/aarch64-insn.c | 3 +-
gdb/arch/aarch64-insn.h | 32 +-
gdb/arch/arm-insn-emit.c | 1550 +++++++++++++++++++++
gdb/arch/arm-insn-emit.h | 1087 +++++++++++++++
gdb/arch/arm-insn-reloc.c | 881 ++++++++++++
gdb/arch/arm-insn-reloc.h | 109 ++
gdb/arch/arm-insn-utils.c | 44 +
gdb/arch/arm-insn-utils.h | 80 ++
gdb/arch/arm.h | 2 +
gdb/arm-tdep.c | 1464 +++++---------------
gdb/configure.tgt | 7 +-
gdb/gdbserver/Makefile.in | 29 +-
gdb/gdbserver/configure.srv | 8 +
gdb/gdbserver/linux-aarch32-low.c | 8 -
gdb/gdbserver/linux-aarch32-low.h | 8 +
gdb/gdbserver/linux-aarch64-low.c | 80 +-
gdb/gdbserver/linux-arm-ipa.c | 228 ++++
gdb/gdbserver/linux-arm-low.c | 1960 ++++++++++++++++++++++++++-
gdb/gdbserver/linux-low.c | 21 +-
gdb/gdbserver/linux-low.h | 5 +-
gdb/gdbserver/linux-x86-low.c | 63 +-
gdb/gdbserver/target.h | 26 +-
gdb/gdbserver/tracepoint.c | 138 +-
gdb/gdbserver/tracepoint.h | 126 ++
gdb/testsuite/gdb.trace/ftrace-arm-insn.S | 378 ++++++
gdb/testsuite/gdb.trace/ftrace-arm-insn.c | 94 ++
gdb/testsuite/gdb.trace/ftrace-arm-insn.exp | 111 ++
gdb/testsuite/lib/trace-support.exp | 3 +-
31 files changed, 7130 insertions(+), 1451 deletions(-)
create mode 100644 gdb/arch/arm-insn-emit.c
create mode 100644 gdb/arch/arm-insn-emit.h
create mode 100644 gdb/arch/arm-insn-reloc.c
create mode 100644 gdb/arch/arm-insn-reloc.h
create mode 100644 gdb/arch/arm-insn-utils.c
create mode 100644 gdb/arch/arm-insn-utils.h
create mode 100644 gdb/gdbserver/linux-arm-ipa.c
create mode 100644 gdb/testsuite/gdb.trace/ftrace-arm-insn.S
create mode 100644 gdb/testsuite/gdb.trace/ftrace-arm-insn.c
create mode 100644 gdb/testsuite/gdb.trace/ftrace-arm-insn.exp

--
2.8.1