Change ptid_t::tid to ULONGEST
authorTom Tromey <tromey@adacore.com>
Thu, 16 Sep 2021 19:55:04 +0000 (13:55 -0600)
committerTom Tromey <tromey@adacore.com>
Thu, 23 Sep 2021 15:30:54 +0000 (09:30 -0600)
The ptid_t 'tid' member is normally used as an address in gdb -- both
bsd-uthread and ravenscar-thread use it this way.  However, because
the type is 'long', this can cause problems with sign extension.

This patch changes the type to ULONGEST to ensure that sign extension
does not occur.

gdb/ada-tasks.c
gdb/bsd-uthread.c
gdb/infrun.c
gdb/python/py-infthread.c
gdb/ravenscar-thread.c
gdb/remote.c
gdbserver/target.cc
gdbsupport/ptid.cc
gdbsupport/ptid.h

index 80a72216f96ea6939edb8740a4acee09a5c092b7..bef26e8e43fccc22ad6ec0614f7c5a9d155cdbbd 100644 (file)
@@ -1233,7 +1233,8 @@ info_task (struct ui_out *uiout, const char *taskno_str, struct inferior *inf)
     fprintf_styled (gdb_stdout, metadata_style.style (), _("<no name>\n"));
 
   /* Print the TID and LWP.  */
-  printf_filtered (_("Thread: %#lx\n"), task_info->ptid.tid ());
+  printf_filtered (_("Thread: 0x%s\n"), phex_nz (task_info->ptid.tid (),
+                                                sizeof (ULONGEST)));
   printf_filtered (_("LWP: %#lx\n"), task_info->ptid.lwp ());
 
   /* If set, print the base CPU.  */
index f8353f070419c46770d934057a2f9aceed83cfce..1e594983bcd2a33f0e9cf079775d0e6f1df66519 100644 (file)
@@ -538,8 +538,9 @@ std::string
 bsd_uthread_target::pid_to_str (ptid_t ptid)
 {
   if (ptid.tid () != 0)
-    return string_printf ("process %d, thread 0x%lx",
-                         ptid.pid (), ptid.tid ());
+    return string_printf ("process %d, thread 0x%s",
+                         ptid.pid (),
+                         phex_nz (ptid.tid (), sizeof (ULONGEST)));
 
   return normal_pid_to_str (ptid);
 }
index d1ac9b4cbbb51955e35ad960b598240bbe87777a..9567130f0d382498ad425dc6bc4e0aadbb1ca512 100644 (file)
@@ -4646,11 +4646,9 @@ wait_one ()
 static void
 save_waitstatus (struct thread_info *tp, const target_waitstatus *ws)
 {
-  infrun_debug_printf ("saving status %s for %d.%ld.%ld",
+  infrun_debug_printf ("saving status %s for %s",
                       target_waitstatus_to_string (ws).c_str (),
-                      tp->ptid.pid (),
-                      tp->ptid.lwp (),
-                      tp->ptid.tid ());
+                      tp->ptid.to_string ().c_str ());
 
   /* Record for later.  */
   tp->set_pending_waitstatus (*ws);
@@ -4845,9 +4843,9 @@ handle_one (const wait_one_event &event)
          struct regcache *regcache;
 
          infrun_debug_printf
-           ("target_wait %s, saving status for %d.%ld.%ld",
+           ("target_wait %s, saving status for %s",
             target_waitstatus_to_string (&event.ws).c_str (),
-            t->ptid.pid (), t->ptid.lwp (), t->ptid.tid ());
+            t->ptid.to_string ().c_str ());
 
          /* Record for later.  */
          save_waitstatus (t, &event.ws);
index 5645442a42696ed21d9841ec5a9b21c7a7a93b3e..74bbe9935f0a6d41b74e3e842d8a151f9a46c46b 100644 (file)
@@ -296,7 +296,8 @@ PyObject *
 gdbpy_create_ptid_object (ptid_t ptid)
 {
   int pid;
-  long tid, lwp;
+  long lwp;
+  ULONGEST tid;
   PyObject *ret;
 
   ret = PyTuple_New (3);
@@ -313,7 +314,7 @@ gdbpy_create_ptid_object (ptid_t ptid)
   gdbpy_ref<> lwp_obj = gdb_py_object_from_longest (lwp);
   if (lwp_obj == nullptr)
     return nullptr;
-  gdbpy_ref<> tid_obj = gdb_py_object_from_longest (tid);
+  gdbpy_ref<> tid_obj = gdb_py_object_from_ulongest (tid);
   if (tid_obj == nullptr)
     return nullptr;
 
index 634af466790f6d3931005c8a03e2009ec317e32e..6cc583ce3488f598dd5ffd92dc1050fded73a12d 100644 (file)
@@ -164,7 +164,7 @@ private:
      needed because sometimes the runtime will report an active task
      that hasn't yet been put on the list of tasks that is read by
      ada-tasks.c.  */
-  std::unordered_map<long, int> m_cpu_map;
+  std::unordered_map<ULONGEST, int> m_cpu_map;
 };
 
 /* Return true iff PTID corresponds to a ravenscar task.  */
@@ -469,7 +469,8 @@ ravenscar_thread_target::pid_to_str (ptid_t ptid)
   if (!is_ravenscar_task (ptid))
     return beneath ()->pid_to_str (ptid);
 
-  return string_printf ("Ravenscar Thread %#x", (int) ptid.tid ());
+  return string_printf ("Ravenscar Thread 0x%s",
+                       phex_nz (ptid.tid (), sizeof (ULONGEST)));
 }
 
 /* Temporarily set the ptid of a regcache to some other value.  When
index 49ed209921172f383e4cc7d6cdb62c9519dc7cc6..3ece443ad1891c23a9d3a8a63ea4be501d15eaf8 100644 (file)
@@ -6907,8 +6907,9 @@ remote_target::remote_stop_ns (ptid_t ptid)
            == resume_state::RESUMED_PENDING_VCONT)
          {
            remote_debug_printf ("Enqueueing phony stop reply for thread pending "
-                                "vCont-resume (%d, %ld, %ld)", tp->ptid.pid(),
-                                tp->ptid.lwp (), tp->ptid.tid ());
+                                "vCont-resume (%d, %ld, %s)", tp->ptid.pid(),
+                                tp->ptid.lwp (),
+                                pulongest (tp->ptid.tid ()));
 
            /* Check that the thread wasn't resumed with a signal.
               Generating a phony stop would result in losing the
index 6660cc04fd50f2ca23308110db778ad90a7c5b01..988c6d50c5c9f3f7d8c314417fb45757f390ca69 100644 (file)
@@ -286,8 +286,8 @@ target_pid_to_str (ptid_t ptid)
   else if (ptid == null_ptid)
     xsnprintf (buf, sizeof (buf), "<null thread>");
   else if (ptid.tid () != 0)
-    xsnprintf (buf, sizeof (buf), "Thread %d.0x%lx",
-              ptid.pid (), ptid.tid ());
+    xsnprintf (buf, sizeof (buf), "Thread %d.0x%s",
+              ptid.pid (), phex_nz (ptid.tid (), sizeof (ULONGEST)));
   else if (ptid.lwp () != 0)
     xsnprintf (buf, sizeof (buf), "LWP %d.%ld",
               ptid.pid (), ptid.lwp ());
index 2417120b1eedbf59f33995ddbf8e396ef44dd845..e51806626127098929bf7dceda3e8eaeb36b7925 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "common-defs.h"
 #include "ptid.h"
+#include "print-utils.h"
 
 /* See ptid.h for these.  */
 
@@ -30,5 +31,5 @@ ptid_t const minus_one_ptid = ptid_t::make_minus_one ();
 std::string
 ptid_t::to_string () const
 {
-  return string_printf ("%d.%ld.%ld", m_pid, m_lwp, m_tid);
+  return string_printf ("%d.%ld.%s", m_pid, m_lwp, pulongest (m_tid));
 }
index a2553b29c1a8342d44118a25af27b8c1dbde58eb..7cdf468589dbbb9cadb89dfdf9c40caf06507da3 100644 (file)
@@ -34,6 +34,7 @@
 
 #include <functional>
 #include <string>
+#include "gdbsupport/common-types.h"
 
 class ptid_t
 {
@@ -47,7 +48,7 @@ public:
      A ptid with only a PID (LWP and TID equal to zero) is usually used to
      represent a whole process, including all its lwps/threads.  */
 
-  explicit constexpr ptid_t (int pid, long lwp = 0, long tid = 0)
+  explicit constexpr ptid_t (int pid, long lwp = 0, ULONGEST tid = 0)
     : m_pid (pid), m_lwp (lwp), m_tid (tid)
   {}
 
@@ -73,7 +74,7 @@ public:
 
   /* Fetch the tid (thread id) component from a ptid.  */
 
-  constexpr long tid () const
+  constexpr ULONGEST tid () const
   { return m_tid; }
 
   /* Return true if the ptid represents a whole process, including all its
@@ -149,7 +150,7 @@ private:
   long m_lwp;
 
   /* Thread id.  */
-  long m_tid;
+  ULONGEST m_tid;
 };
 
 /* Functor to hash a ptid.  */