gdb: add inferior::{arch, set_arch}
authorSimon Marchi <simon.marchi@efficios.com>
Fri, 29 Sep 2023 18:24:35 +0000 (14:24 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Tue, 10 Oct 2023 14:44:35 +0000 (10:44 -0400)
Make the inferior's gdbarch field private, and add getters and setters.
This helped me by allowing putting breakpoints on set_arch to know when
the inferior's arch was set.  A subsequent patch in this series also
adds more things in set_arch.

Change-Id: I0005bd1ef4cd6b612af501201cec44e457998eec
Reviewed-By: John Baldwin <jhb@FreeBSD.org>
Approved-By: Andrew Burgess <aburgess@redhat.com>
25 files changed:
gdb/aarch64-linux-nat.c
gdb/amd-dbgapi-target.c
gdb/amd64-linux-nat.c
gdb/arch-utils.c
gdb/arm-fbsd-tdep.c
gdb/auxv.c
gdb/inferior.c
gdb/inferior.h
gdb/infrun.c
gdb/jit.c
gdb/linux-tdep.c
gdb/ppc-linux-tdep.c
gdb/proc-service.c
gdb/process-stratum-target.c
gdb/python/py-inferior.c
gdb/python/python.c
gdb/regcache.c
gdb/remote.c
gdb/rs6000-tdep.c
gdb/scoped-mock-context.h
gdb/solib-rocm.c
gdb/symfile-mem.c
gdb/tui/tui-disasm.c
gdb/unittests/frame_info_ptr-selftests.c
gdb/value.c

index c1d59b5d77c7c98874c0c98462201b53efa83ad4..eb54db4bff4809acf3328b676fd15a28d3247fcd 100644 (file)
@@ -1005,24 +1005,24 @@ aarch64_linux_nat_target::thread_architecture (ptid_t ptid)
   /* If this is a 32-bit architecture, then this is ARM, not AArch64.
      There's no SVE vectors here, so just return the inferior
      architecture.  */
-  if (gdbarch_bfd_arch_info (inf->gdbarch)->bits_per_word == 32)
-    return inf->gdbarch;
+  if (gdbarch_bfd_arch_info (inf->arch ())->bits_per_word == 32)
+    return inf->arch ();
 
   /* Only return the inferior's gdbarch if both vq and svq match the ones in
      the tdep.  */
   aarch64_gdbarch_tdep *tdep
-    = gdbarch_tdep<aarch64_gdbarch_tdep> (inf->gdbarch);
+    = gdbarch_tdep<aarch64_gdbarch_tdep> (inf->arch ());
   uint64_t vq = aarch64_sve_get_vq (ptid.lwp ());
   uint64_t svq = aarch64_za_get_svq (ptid.lwp ());
   if (vq == tdep->vq && svq == tdep->sme_svq)
-    return inf->gdbarch;
+    return inf->arch ();
 
   /* We reach here if any vector length for the thread is different from its
      value at process start.  Lookup gdbarch via info (potentially creating a
      new one) by using a target description that corresponds to the new vq/svq
      value and the current architecture features.  */
 
-  const struct target_desc *tdesc = gdbarch_target_desc (inf->gdbarch);
+  const struct target_desc *tdesc = gdbarch_target_desc (inf->arch ());
   aarch64_features features = aarch64_features_from_target_desc (tdesc);
   features.vq = vq;
   features.svq = svq;
index e5783580a62e65fbfca677aacad65ace35829f18..22c812628762207c3ff937b823f6a3486fb9b2e3 100644 (file)
@@ -430,7 +430,7 @@ amd_dbgapi_target_breakpoint::check_status (struct bpstat *bs)
 
   if (it == info->breakpoint_map.end ())
     error (_("Could not find breakpoint_id for breakpoint at %s"),
-          paddress (inf->gdbarch, bs->bp_location_at->address));
+          paddress (inf->arch (), bs->bp_location_at->address));
 
   amd_dbgapi_breakpoint_id_t breakpoint_id { it->first };
   amd_dbgapi_breakpoint_action_t action;
@@ -443,7 +443,7 @@ amd_dbgapi_target_breakpoint::check_status (struct bpstat *bs)
   if (status != AMD_DBGAPI_STATUS_SUCCESS)
     error (_("amd_dbgapi_report_breakpoint_hit failed for breakpoint %ld "
             "at %s (%s)"),
-          breakpoint_id.handle, paddress (inf->gdbarch, bs->bp_location_at->address),
+          breakpoint_id.handle, paddress (inf->arch (), bs->bp_location_at->address),
           get_status_string (status));
 
   if (action == AMD_DBGAPI_BREAKPOINT_ACTION_RESUME)
index 6571be40bb5e14dbfc6ed4b75ce00bcd7f08770c..f7f9a483def830727b04fcf7e55c5e57a480af9d 100644 (file)
@@ -337,7 +337,7 @@ ps_err_e
 ps_get_thread_area (struct ps_prochandle *ph,
                    lwpid_t lwpid, int idx, void **base)
 {
-  if (gdbarch_bfd_arch_info (ph->thread->inf->gdbarch)->bits_per_word == 32)
+  if (gdbarch_bfd_arch_info (ph->thread->inf->arch ())->bits_per_word == 32)
     {
       unsigned int base_addr;
       ps_err_e result;
index 2e597beb5d43a1357d5ea708bfba55f8d77130dc..5331bd864431c87be51791782ca99d4e876ad367 100644 (file)
@@ -1488,7 +1488,7 @@ set_target_gdbarch (struct gdbarch *new_gdbarch)
 {
   gdb_assert (new_gdbarch != NULL);
   gdb_assert (new_gdbarch->initialized_p);
-  current_inferior ()->gdbarch = new_gdbarch;
+  current_inferior ()->set_arch (new_gdbarch);
   gdb::observers::architecture_changed.notify (new_gdbarch);
   registers_changed ();
 }
@@ -1498,7 +1498,7 @@ set_target_gdbarch (struct gdbarch *new_gdbarch)
 struct gdbarch *
 target_gdbarch (void)
 {
-  return current_inferior ()->gdbarch;
+  return current_inferior ()->arch ();
 }
 
 void _initialize_gdbarch_utils ();
index b46fa91d0a0be0d5e0183043b258b96622aa11ed..b6aa42a4fd056bf65262ec77ecac0be23e575d11 100644 (file)
@@ -247,7 +247,7 @@ arm_fbsd_read_description_auxv (bool tls)
   const gdb::optional<gdb::byte_vector> &auxv = target_read_auxv ();
   return arm_fbsd_read_description_auxv (auxv,
                                         current_inferior ()->top_target (),
-                                        current_inferior ()->gdbarch,
+                                        current_inferior ()->arch (),
                                         tls);
 }
 
index 8cda0b687b46ff722c09c5e8b6bdbe8b720723fb..45f3e920d80dc047d7f635f06fe3dde0da032642 100644 (file)
@@ -418,7 +418,7 @@ target_auxv_search (CORE_ADDR match, CORE_ADDR *valp)
     return -1;
 
   return target_auxv_search (*auxv, current_inferior ()->top_target (),
-                            current_inferior ()->gdbarch, match, valp);
+                            current_inferior ()->arch (), match, valp);
 }
 
 /* Print the description of a single AUXV entry on the specified file.  */
@@ -580,7 +580,7 @@ fprint_target_auxv (struct ui_file *file)
   size_t len = auxv->size ();
 
   while (parse_auxv (current_inferior ()->top_target (),
-                    current_inferior ()->gdbarch,
+                    current_inferior ()->arch (),
                     &ptr, data + len, &type, &val) > 0)
     {
       gdbarch_print_auxv_entry (gdbarch, file, type, val);
index 550bbd2827c02da47555c30db5951cb3b5d9049b..12419da2c3a976724deadcc19cbbb5bf42670946 100644 (file)
@@ -847,10 +847,10 @@ add_inferior_with_spaces (void)
   /* Setup the inferior's initial arch, based on information obtained
      from the global "set ..." options.  */
   gdbarch_info info;
-  inf->gdbarch = gdbarch_find_by_info (info);
+  inf->set_arch (gdbarch_find_by_info (info));
   /* The "set ..." options reject invalid settings, so we should
      always have a valid arch by now.  */
-  gdb_assert (inf->gdbarch != NULL);
+  gdb_assert (inf->arch () != nullptr);
 
   return inf;
 }
@@ -1014,7 +1014,7 @@ clone_inferior_command (const char *args, int from_tty)
       inf = add_inferior (0);
       inf->pspace = pspace;
       inf->aspace = pspace->aspace;
-      inf->gdbarch = orginf->gdbarch;
+      inf->set_arch (orginf->arch ());
 
       switch_to_inferior_and_push_target (inf, no_connection, orginf);
 
index 29c90d15efaead1a1b07e18ece81b9dbce4d1d99..29e26a5846b44a138522d2aa9630c0fb96d45607 100644 (file)
@@ -553,6 +553,14 @@ public:
     return m_cwd;
   }
 
+  /* Set this inferior's arch.  */
+  void set_arch (gdbarch *arch)
+  { m_gdbarch = arch; }
+
+  /* Get this inferior's arch.  */
+  gdbarch *arch ()
+  { return m_gdbarch; }
+
   /* Convenient handle (GDB inferior id).  Unique across all
      inferiors.  */
   int num = 0;
@@ -648,19 +656,6 @@ public:
      user supplied description's filename, if any; etc.).  */
   target_desc_info tdesc_info;
 
-  /* The architecture associated with the inferior through the
-     connection to the target.
-
-     The architecture vector provides some information that is really
-     a property of the inferior, accessed through a particular target:
-     ptrace operations; the layout of certain RSP packets; the
-     solib_ops vector; etc.  To differentiate architecture accesses to
-     per-inferior/target properties from
-     per-thread/per-frame/per-objfile properties, accesses to
-     per-inferior/target properties should be made through
-     this gdbarch.  */
-  struct gdbarch *gdbarch = NULL;
-
   /* Data related to displaced stepping.  */
   displaced_step_inferior_state displaced_step_state;
 
@@ -687,6 +682,19 @@ private:
   /* The current working directory that will be used when starting
      this inferior.  */
   std::string m_cwd;
+
+  /* The architecture associated with the inferior through the
+     connection to the target.
+
+     The architecture vector provides some information that is really
+     a property of the inferior, accessed through a particular target:
+     ptrace operations; the layout of certain RSP packets; the
+     solib_ops vector; etc.  To differentiate architecture accesses to
+     per-inferior/target properties from
+     per-thread/per-frame/per-objfile properties, accesses to
+     per-inferior/target properties should be made through
+     this gdbarch.  */
+  gdbarch *m_gdbarch = nullptr;
 };
 
 /* Add an inferior to the inferior list, print a message that a new
index 4730d2904423ccf54eb4ef8394227962f4e32246..784f0b96ebf566d26af5ed6ee502c1283d879b85 100644 (file)
@@ -505,7 +505,7 @@ holding the child stopped.  Try \"set detach-on-fork\" or \
 
          child_inf->attach_flag = parent_inf->attach_flag;
          copy_terminal_info (child_inf, parent_inf);
-         child_inf->gdbarch = parent_inf->gdbarch;
+         child_inf->set_arch (parent_inf->arch ());
          child_inf->tdesc_info = parent_inf->tdesc_info;
 
          child_inf->symfile_flags = SYMFILE_NO_READ;
@@ -580,7 +580,7 @@ holding the child stopped.  Try \"set detach-on-fork\" or \
 
       child_inf->attach_flag = parent_inf->attach_flag;
       copy_terminal_info (child_inf, parent_inf);
-      child_inf->gdbarch = parent_inf->gdbarch;
+      child_inf->set_arch (parent_inf->arch ());
       child_inf->tdesc_info = parent_inf->tdesc_info;
 
       if (has_vforked)
@@ -5821,7 +5821,7 @@ handle_inferior_event (struct execution_control_state *ecs)
        }
       else
        {
-         struct gdbarch *gdbarch = current_inferior ()->gdbarch;
+         struct gdbarch *gdbarch = current_inferior ()->arch ();
 
          if (gdbarch_gdb_signal_to_target_p (gdbarch))
            {
@@ -9847,7 +9847,7 @@ namespace selftests
 static void
 infrun_thread_ptid_changed ()
 {
-  gdbarch *arch = current_inferior ()->gdbarch;
+  gdbarch *arch = current_inferior ()->arch ();
 
   /* The thread which inferior_ptid represents changes ptid.  */
   {
index 804c832f47d387231c70346646f1ba978ca883e5..1997be77b83514748107761b03fa33d2d38a3021 100644 (file)
--- a/gdb/jit.c
+++ b/gdb/jit.c
@@ -1159,7 +1159,7 @@ jit_inferior_init (inferior *inf)
   struct jit_descriptor descriptor;
   struct jit_code_entry cur_entry;
   CORE_ADDR cur_entry_addr;
-  struct gdbarch *gdbarch = inf->gdbarch;
+  struct gdbarch *gdbarch = inf->arch ();
   program_space *pspace = inf->pspace;
 
   jit_debug_printf ("called");
index f03a5b9533291f7d56dea55d6bba4c1bd94513b1..f7b8a594097684b64e27ce4e7df9a39efbe55423 100644 (file)
@@ -2615,7 +2615,7 @@ linux_displaced_step_prepare (gdbarch *arch, thread_info *thread,
       /* Figure out the location of the buffers.  They are contiguous, starting
         at DISP_STEP_BUF_ADDR.  They are all of size BUF_LEN.  */
       CORE_ADDR disp_step_buf_addr
-       = linux_displaced_step_location (thread->inf->gdbarch);
+       = linux_displaced_step_location (thread->inf->arch ());
       int buf_len = gdbarch_displaced_step_buffer_length (arch);
 
       linux_gdbarch_data *gdbarch_data = get_linux_gdbarch_data (arch);
@@ -2701,7 +2701,7 @@ linux_get_hwcap ()
 {
   return linux_get_hwcap (target_read_auxv (),
                          current_inferior ()->top_target (),
-                         current_inferior ()->gdbarch);
+                         current_inferior ()->arch ());
 }
 
 /* See linux-tdep.h.  */
@@ -2720,7 +2720,7 @@ linux_get_hwcap2 ()
 {
   return linux_get_hwcap2 (target_read_auxv (),
                           current_inferior ()->top_target (),
-                          current_inferior ()->gdbarch);
+                          current_inferior ()->arch ());
 }
 
 /* Display whether the gcore command is using the
index 784dafa59dbf31f79e409e4ec037560f107c1922..7c75bb5693d810c1eca142e389a073fee2ff88ef 100644 (file)
@@ -2080,7 +2080,7 @@ ppc_linux_displaced_step_prepare  (gdbarch *arch, thread_info *thread,
     {
       /* Figure out where the displaced step buffer is.  */
       CORE_ADDR disp_step_buf_addr
-       = linux_displaced_step_location (thread->inf->gdbarch);
+       = linux_displaced_step_location (thread->inf->arch ());
 
       per_inferior->disp_step_buf.emplace (disp_step_buf_addr);
     }
index f735eb0ac812d5896c6a5ab846a7f7601447e894..e41278dbe6a8d64a714a6fe588126920b3677c30 100644 (file)
@@ -137,7 +137,7 @@ get_ps_regcache (struct ps_prochandle *ph, lwpid_t lwpid)
   inferior *inf = ph->thread->inf;
   return get_thread_arch_regcache (inf->process_target (),
                                   ptid_t (inf->pid, lwpid),
-                                  inf->gdbarch);
+                                  inf->arch ());
 }
 
 /* Get the general registers of LWP LWPID within the target process PH
index 5c031203e89e2c7b842c50966f9a9cba70dfdace..173c3ecad1345a3f4b94fcfea765c8daa2539b22 100644 (file)
@@ -45,7 +45,7 @@ process_stratum_target::thread_architecture (ptid_t ptid)
 {
   inferior *inf = find_inferior_ptid (this, ptid);
   gdb_assert (inf != NULL);
-  return inf->gdbarch;
+  return inf->arch ();
 }
 
 bool
index 1f20b9acd11286b47344874dc8d43be30e422b8a..50d20c33b9d97e761adf656b800104877e3b090a 100644 (file)
@@ -788,7 +788,7 @@ infpy_architecture (PyObject *self, PyObject *args)
 
   INFPY_REQUIRE_VALID (inf);
 
-  return gdbarch_to_arch_object (inf->inferior->gdbarch);
+  return gdbarch_to_arch_object (inf->inferior->arch ());
 }
 
 /* Implement repr() for gdb.Inferior.  */
index faa7e0c217d9358db49870eca040a4186ef392a1..e56d2463d597f114f3c53dfe50bfbf1cec2a4338 100644 (file)
@@ -1375,7 +1375,7 @@ gdbpy_format_address (PyObject *self, PyObject *args, PyObject *kw)
       /* Grab both of these from the current inferior, and its associated
         default architecture.  */
       pspace = current_inferior ()->pspace;
-      gdbarch = current_inferior ()->gdbarch;
+      gdbarch = current_inferior ()->arch ();
     }
   else if (arch_obj == nullptr || pspace_obj == nullptr)
     {
index 91b20b7a2a2f11f27bd45d852bd9812d9b3fa598..5acac2b8e4724437e495364c48ddddec1d47ff47 100644 (file)
@@ -1627,7 +1627,7 @@ get_thread_arch_aspace_regcache_and_check (inferior *inf_for_target_calls,
   /* We currently only test with a single gdbarch.  Any gdbarch will do, so use
      the current inferior's gdbarch.  Also use the current inferior's address
      space.  */
-  gdbarch *arch = inf_for_target_calls->gdbarch;
+  gdbarch *arch = inf_for_target_calls->arch ();
   address_space *aspace = inf_for_target_calls->aspace;
   regcache *regcache = get_thread_arch_aspace_regcache (inf_for_target_calls,
                                                        ptid, arch, aspace);
@@ -1645,8 +1645,8 @@ struct regcache_test_data
 {
   regcache_test_data ()
       /* The specific arch doesn't matter.  */
-    : test_ctx_1 (current_inferior ()->gdbarch),
-      test_ctx_2 (current_inferior ()->gdbarch)
+    : test_ctx_1 (current_inferior ()->arch ()),
+      test_ctx_2 (current_inferior ()->arch ())
   {
     /* Ensure the regcaches container is empty at the start.  */
     registers_changed ();
@@ -2094,7 +2094,7 @@ regcache_thread_ptid_changed ()
   registers_changed ();
 
   /* Any arch will do.  */
-  gdbarch *arch = current_inferior ()->gdbarch;
+  gdbarch *arch = current_inferior ()->arch ();
 
   /* Prepare two targets with one thread each, with the same ptid.  */
   scoped_mock_context<test_target_ops> target1 (arch);
index ae08c980efce59570834c8bdb04c8eb87e7a55da..ff3f55d591fde86a7a1ac8fe74002575f5cf55f6 100644 (file)
@@ -7161,7 +7161,7 @@ remote_target::remote_stop_ns (ptid_t ptid)
            sr->ptid = tp->ptid;
            sr->rs = rs;
            sr->ws.set_stopped (GDB_SIGNAL_0);
-           sr->arch = tp->inf->gdbarch;
+           sr->arch = tp->inf->arch ();
            sr->stop_reason = TARGET_STOPPED_BY_NO_REASON;
            sr->watch_data_address = 0;
            sr->core = 0;
@@ -7899,7 +7899,7 @@ Packet: '%s'\n"),
                          continue;
                        }
 
-                     event->arch = inf->gdbarch;
+                     event->arch = inf->arch ();
                      rsa = event->rs->get_remote_arch_state (event->arch);
                    }
 
index 23397d037ae88f9d3c7c0aa1159be3de8f3c4cbd..bae6737852d887d1f5a7a7569f9ce6700d7e0fef 100644 (file)
@@ -1087,7 +1087,7 @@ ppc_displaced_step_prepare  (gdbarch *arch, thread_info *thread,
     {
       /* Figure out where the displaced step buffer is.  */
       CORE_ADDR disp_step_buf_addr
-       = displaced_step_at_entry_point (thread->inf->gdbarch);
+       = displaced_step_at_entry_point (thread->inf->arch ());
 
       per_inferior->disp_step_buf.emplace (disp_step_buf_addr);
     }
index 9ad7ebf5f0c4b5ff5c258e09d95b6090c86209e1..5b5f46df7ba139bab447ebacc45dfd91fbb9c75e 100644 (file)
@@ -52,7 +52,7 @@ struct scoped_mock_context
 
     mock_inferior.thread_list.push_back (mock_thread);
     mock_inferior.ptid_thread_map[mock_ptid] = &mock_thread;
-    mock_inferior.gdbarch = gdbarch;
+    mock_inferior.set_arch (gdbarch);
     mock_inferior.aspace = mock_pspace.aspace;
     mock_inferior.pspace = &mock_pspace;
 
index 6b84f09e88bacb1532ba8e82d66586e9d210db8b..b24d0e8fb23590e6c090d3081d63d14ded4e13b7 100644 (file)
@@ -773,7 +773,7 @@ rocm_update_solib_list ()
       rocm_solib_ops.handle_event = rocm_solib_handle_event;
 
       /* Engage the ROCm so_ops.  */
-      set_gdbarch_so_ops (current_inferior ()->gdbarch, &rocm_solib_ops);
+      set_gdbarch_so_ops (current_inferior ()->arch (), &rocm_solib_ops);
     }
 }
 
index 7ac3ac709ecb23e190a93f75c1d7c75fdec776ed..956f10e387e6f924940fbcdcb5a652b37a38ccc1 100644 (file)
@@ -162,7 +162,7 @@ add_vsyscall_page (inferior *inf)
 {
   struct mem_range vsyscall_range;
 
-  if (gdbarch_vsyscall_range (inf->gdbarch, &vsyscall_range))
+  if (gdbarch_vsyscall_range (inf->arch (), &vsyscall_range))
     {
       struct bfd *bfd;
 
index 03c78aa1291117e23ac10f2175c835fb4ba8c440..c1ed491c5580311368551537cfc25826ba5cd3c1 100644 (file)
@@ -539,7 +539,7 @@ run_tests ()
 {
   if (current_inferior () != nullptr)
     {
-      struct gdbarch *gdbarch = current_inferior ()->gdbarch;
+      gdbarch *gdbarch = current_inferior ()->arch ();
 
       /* Check that tui_find_disassembly_address robustly handles the case of
         being passed a PC for which gdb_print_insn throws a MEMORY_ERROR.  */
index 77052b3065f921dab3d50cd14df6ee285146c9d5..668133aa11c5af322e7ff4197bcf621c87f859c7 100644 (file)
@@ -51,7 +51,7 @@ static void
 test_user_created_frame ()
 {
   scoped_mock_context<test_target_ops> mock_context
-    (current_inferior ()->gdbarch);
+    (current_inferior ()->arch ());
   frame_info_ptr frame = create_new_frame (0x1234, 0x5678);
 
   validate_user_created_frame (get_frame_id (frame));
index 1cc326256293f1c4b37d01ccb34d283e38df2e8d..190887471c35fd4e8834081cf244b99a3011ace3 100644 (file)
@@ -4222,7 +4222,7 @@ test_insert_into_bit_range_vector ()
 static void
 test_value_copy ()
 {
-  type *type = builtin_type (current_inferior ()->gdbarch)->builtin_int;
+  type *type = builtin_type (current_inferior ()->arch ())->builtin_int;
 
   /* Verify that we can copy an entirely optimized out value, that may not have
      its contents allocated.  */