From 90ad9178f19221a836cae3b4b2298ee0a968017a Mon Sep 17 00:00:00 2001 From: Carl Love Date: Mon, 15 Nov 2021 20:31:06 +0000 Subject: [PATCH] gdb: PowerPC fix gdb.base/break-interp.exp This patch fixes eight test failures on PowerPC for the test gdb.base/break-interp.exp. The patch adds a funtion and registers it to setup the displaced stepping for ppc-linux platform. The patch moves the struct ppc_inferior_data to the ppc-tdep.h include file to make it visible to the ppc-linux-tdep.c and rs6000-tdep.c files. Additionally the function get_ppc_per_inferior is made external in ppc-tdep.h to make it visible in both files. Tested on Power 10 ppc64le-linux with no regressions. --- gdb/ppc-linux-tdep.c | 22 ++++++++++++++++++++++ gdb/ppc-tdep.h | 10 ++++++++++ gdb/rs6000-tdep.c | 10 +--------- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c index 6df2411397c..9e895425497 100644 --- a/gdb/ppc-linux-tdep.c +++ b/gdb/ppc-linux-tdep.c @@ -2014,6 +2014,23 @@ ppc64_linux_gcc_target_options (struct gdbarch *gdbarch) return ""; } +static displaced_step_prepare_status +ppc_linux_displaced_step_prepare (gdbarch *arch, thread_info *thread, + CORE_ADDR &displaced_pc) +{ + ppc_inferior_data *per_inferior = get_ppc_per_inferior (thread->inf); + if (!per_inferior->disp_step_buf.has_value ()) + { + /* Figure out where the displaced step buffer is. */ + CORE_ADDR disp_step_buf_addr + = linux_displaced_step_location (thread->inf->gdbarch); + + per_inferior->disp_step_buf.emplace (disp_step_buf_addr); + } + + return per_inferior->disp_step_buf->prepare (thread, displaced_pc); +} + static void ppc_linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) @@ -2190,6 +2207,11 @@ ppc_linux_init_abi (struct gdbarch_info info, ppc_init_linux_record_tdep (&ppc_linux_record_tdep, 4); ppc_init_linux_record_tdep (&ppc64_linux_record_tdep, 8); + + /* Setup displaced stepping. */ + set_gdbarch_displaced_step_prepare (gdbarch, + ppc_linux_displaced_step_prepare); + } void _initialize_ppc_linux_tdep (); diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h index 6b305c460b1..cfd0aacc34a 100644 --- a/gdb/ppc-tdep.h +++ b/gdb/ppc-tdep.h @@ -438,4 +438,14 @@ extern int ppc_process_record (struct gdbarch *gdbarch, /* Estimate for the maximum number of instructions in a function epilogue. */ #define PPC_MAX_EPILOGUE_INSTRUCTIONS 52 +struct ppc_inferior_data +{ + /* This is an optional in case we add more fields to ppc_inferior_data, we + don't want it instantiated as soon as we get the ppc_inferior_data for an + inferior. */ + gdb::optional disp_step_buf; +}; + +extern ppc_inferior_data * get_ppc_per_inferior (inferior *inf); + #endif /* ppc-tdep.h */ diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c index 0d618943186..87a494e0bb8 100644 --- a/gdb/rs6000-tdep.c +++ b/gdb/rs6000-tdep.c @@ -155,19 +155,11 @@ static const char *powerpc_vector_abi_string = "auto"; /* PowerPC-related per-inferior data. */ -struct ppc_inferior_data -{ - /* This is an optional in case we add more fields to ppc_inferior_data, we - don't want it instantiated as soon as we get the ppc_inferior_data for an - inferior. */ - gdb::optional disp_step_buf; -}; - static inferior_key ppc_inferior_data_key; /* Get the per-inferior PowerPC data for INF. */ -static ppc_inferior_data * +ppc_inferior_data * get_ppc_per_inferior (inferior *inf) { ppc_inferior_data *per_inf = ppc_inferior_data_key.get (inf); -- 2.30.2