gdb/python: add a 'connection_num' attribute to Inferior objects
authorTankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Fri, 14 May 2021 09:56:31 +0000 (11:56 +0200)
committerTankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Fri, 14 May 2021 13:33:23 +0000 (15:33 +0200)
Define a 'connection_num' attribute for Inferior objects.  The
read-only attribute is the ID of the connection of an inferior, as
printed by "info inferiors".  In GDB's internal terminology, that's
the process stratum target of the inferior.  If the inferior has no
target connection, the attribute is None.

gdb/ChangeLog:
2021-05-14  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

* python/py-inferior.c (infpy_get_connection_num): New function.
(inferior_object_getset): Add a new element for 'connection_num'.
* NEWS: Mention the 'connection_num' attribute of Inferior objects.

gdb/doc/ChangeLog:
2021-05-14  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

* python.texi (Inferiors In Python): Mention the 'connection_num'
attribute.

gdb/testsuite/ChangeLog:
2021-05-14  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

* gdb.python/py-inferior.exp: Add test cases for 'connection_num'.

gdb/ChangeLog
gdb/NEWS
gdb/doc/ChangeLog
gdb/doc/python.texi
gdb/python/py-inferior.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.python/py-inferior.exp

index 4bed8c2b60457e21079d15bc7f6cfda97844c757..d44b06d955940fb598eb337373b9f90f492b359a 100644 (file)
@@ -1,3 +1,9 @@
+2021-05-14  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
+
+       * python/py-inferior.c (infpy_get_connection_num): New function.
+       (inferior_object_getset): Add a new element for 'connection_num'.
+       * NEWS: Mention the 'connection_num' attribute of Inferior objects.
+
 2021-05-14  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * remote.c (check_pending_events_prevent_wildcard_vcont): Change
index 6e147cb031826336da6451f614833f39b4e68613..ab678acec8bfd45ebd50a4db3f60c2eb097cfde4 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -211,6 +211,12 @@ QMemTags
      value-reference-value, value-rvalue-reference-value and
      value-const-value.
 
+* Python API
+
+  ** Inferior objects now contain a read-only 'connection_num' attribute that
+     gives the connection number as seen in 'info connections' and
+     'info inferiors'.
+
 *** Changes in GDB 10
 
 * There are new feature names for ARC targets: "org.gnu.gdb.arc.core"
index 9990cd904852a694b66ecdff37f95e49bc213284..db72a479d86b6157ffa24f1476a2e9f9e3a2dfb4 100644 (file)
@@ -1,3 +1,8 @@
+2021-05-14  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
+
+       * python.texi (Inferiors In Python): Mention the 'connection_num'
+       attribute.
+
 2021-05-12  George Barrett  <bob@bob131.so>
 
        * guile.texi (Values From Inferior In Guile): Add documentation
index 4865634537df3587bcaa7102adeed2f681f86f17..f1ca6f7ed128966d51c69d495b8a91e5c3b5924e 100644 (file)
@@ -3065,6 +3065,12 @@ A @code{gdb.Inferior} object has the following attributes:
 ID of inferior, as assigned by GDB.
 @end defvar
 
+@defvar Inferior.connection_num
+ID of inferior's connection as assigned by @value{GDBN}, or None if
+the inferior is not connected to a target.
+@xref{Inferiors Connections and Programs}.
+@end defvar
+
 @defvar Inferior.pid
 Process ID of the inferior, as assigned by the underlying operating
 system.
index 94c2c2329e9ae83bf000002c215b936cfef5cd2d..336c6426b8c86289adbc7c23ad55cd4ffd101490 100644 (file)
@@ -427,6 +427,23 @@ infpy_get_num (PyObject *self, void *closure)
   return gdb_py_object_from_longest (inf->inferior->num).release ();
 }
 
+/* Return the connection number of the given inferior, or None if a
+   connection does not exist.  */
+
+static PyObject *
+infpy_get_connection_num (PyObject *self, void *closure)
+{
+  inferior_object *inf = (inferior_object *) self;
+
+  INFPY_REQUIRE_VALID (inf);
+
+  process_stratum_target *target = inf->inferior->process_target ();
+  if (target == nullptr)
+    Py_RETURN_NONE;
+
+  return PyLong_FromLong (target->connection_number);
+}
+
 static PyObject *
 infpy_get_pid (PyObject *self, void *closure)
 {
@@ -943,6 +960,8 @@ gdbpy_initialize_inferior (void)
 static gdb_PyGetSetDef inferior_object_getset[] =
 {
   { "num", infpy_get_num, NULL, "ID of inferior, as assigned by GDB.", NULL },
+  { "connection_num", infpy_get_connection_num, NULL,
+    "ID of inferior's connection, as assigned by GDB.", NULL },
   { "pid", infpy_get_pid, NULL, "PID of inferior, as assigned by the OS.",
     NULL },
   { "was_attached", infpy_get_was_attached, NULL,
index cb0a04ebcc076c7ac8c71060b6833adabc19b6f0..fbe2d216066a691b5d5d0af61d90e84bed1c8ef9 100644 (file)
@@ -1,3 +1,7 @@
+2021-05-14  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
+
+       * gdb.python/py-inferior.exp: Add test cases for 'connection_num'.
+
 2021-05-14  Kent Cheung  <kent.cheung@arm.com>
            Andrew Burgess  <andrew.burgess@embecosm.com>
 
index 9df74e05182c122822d3b5c96f44c17311ecc69c..2252215b721715966a63ac6a658a67b885a541d4 100644 (file)
@@ -51,6 +51,7 @@ gdb_py_test_silent_cmd "python i0 = inferiors\[0\]" "get first inferior" 0
 
 gdb_test "python print ('result = %s' % (i0 == inferiors\[0\]))" " = True" "test equality comparison (true)"
 gdb_test "python print ('result = %s' % i0.num)" " = \[0-9\]+" "test Inferior.num"
+gdb_test "python print ('result = %s' % i0.connection_num)" " = \[0-9\]+" "test Inferior.connection_num"
 gdb_test "python print ('result = %s' % i0.pid)" " = \[0-9\]+" "test Inferior.pid"
 gdb_test "python print ('result = %s' % i0.was_attached)" " = False" "test Inferior.was_attached"
 gdb_test "python print (i0.threads ())" "\\(<gdb.InferiorThread object at 0x\[\[:xdigit:\]\]+>,\\)" "test Inferior.threads"
@@ -262,6 +263,8 @@ with_test_prefix "is_valid" {
     # correctly.
     gdb_test "python print (inf_list\[1\].num)" \
        "RuntimeError: Inferior no longer exists.*"
+    gdb_test "python print (inf_list\[1\].connection_num)" \
+       "RuntimeError: Inferior no longer exists.*"
     gdb_test "python print (inf_list\[1\].pid)" \
        "RuntimeError: Inferior no longer exists.*"
     gdb_test "python print (inf_list\[1\].was_attached)" \
@@ -278,10 +281,30 @@ with_test_prefix "is_valid" {
 with_test_prefix "selected_inferior" {
     gdb_test "inferior 1" ".*" "switch to first inferior"
     gdb_test "py print (gdb.selected_inferior().num)" "1" "first inferior selected"
+    gdb_test "py print (gdb.selected_inferior().connection_num)" "1" \
+       "first inferior's connection"
+    # Figure out if inf 1 has a native target.
+    set inf_1_is_native [gdb_is_target_native]
 
-    gdb_test "add-inferior" "Added inferior 3 on connection .*" "create new inferior"
+    gdb_test "add-inferior -no-connection" "Added inferior 3" "create new inferior"
     gdb_test "inferior 3" ".*" "switch to third inferior"
     gdb_test "py print (gdb.selected_inferior().num)" "3" "third inferior selected"
+    gdb_test "py print (gdb.selected_inferior().connection_num)" "None" \
+       "third inferior's None connection"
+    gdb_test "target native" "Done.  Use the \"run\" command to start a process." \
+       "target for the third inferior"
+
+    # If inf 1 has a native target, inf 3's target is shared with 1's.
+    # Otherwise, it must have created a new target with a new number.
+    if {$inf_1_is_native} {
+       set expected_connection_num 1
+    } else {
+       set expected_connection_num 2
+    }
+    gdb_test "py print (gdb.selected_inferior().connection_num)" \
+       "$expected_connection_num" \
+       "third inferior's native connection"
+
     gdb_test "inferior 1" ".*" "switch back to first inferior"
     gdb_test_no_output "remove-inferiors 3" "remove second inferior"
 }