[RFA,v2,4/6] Expose type alignment on gdb.Type

Message ID 20180427140139.7957-5-tom@tromey.com
State New, archived
Headers

Commit Message

Tom Tromey April 27, 2018, 2:01 p.m. UTC
  This adds an "align" attribute to gdb.Type in the Python API.

2018-04-27  Tom Tromey  <tom@tromey.com>

	* NEWS: Mention Type.align.
	* python/py-type.c (typy_get_align): New function.
	(type_object_getset): Add "align".

2018-04-27  Tom Tromey  <tom@tromey.com>

	* python.texi (Types In Python): Document Type.align.

2018-04-27  Tom Tromey  <tom@tromey.com>

	* gdb.python/py-type.exp: Check align attribute.
	* gdb.python/py-type.c: New "aligncheck" global.
---
 gdb/ChangeLog                        |  6 ++++++
 gdb/NEWS                             |  4 ++++
 gdb/doc/ChangeLog                    |  4 ++++
 gdb/doc/python.texi                  |  7 +++++++
 gdb/python/py-type.c                 | 24 ++++++++++++++++++++++++
 gdb/testsuite/ChangeLog              |  5 +++++
 gdb/testsuite/gdb.python/py-type.c   |  2 ++
 gdb/testsuite/gdb.python/py-type.exp |  4 ++++
 8 files changed, 56 insertions(+)
  

Comments

Eli Zaretskii April 27, 2018, 2:18 p.m. UTC | #1
> From: Tom Tromey <tom@tromey.com>
> Cc: Tom Tromey <tom@tromey.com>
> Date: Fri, 27 Apr 2018 08:01:37 -0600
> 
> This adds an "align" attribute to gdb.Type in the Python API.
> 
> 2018-04-27  Tom Tromey  <tom@tromey.com>
> 
> 	* NEWS: Mention Type.align.
> 	* python/py-type.c (typy_get_align): New function.
> 	(type_object_getset): Add "align".
> 
> 2018-04-27  Tom Tromey  <tom@tromey.com>
> 
> 	* python.texi (Types In Python): Document Type.align.
> 
> 2018-04-27  Tom Tromey  <tom@tromey.com>
> 
> 	* gdb.python/py-type.exp: Check align attribute.
> 	* gdb.python/py-type.c: New "aligncheck" global.

OK for the documentation parts.

Thanks.
  
Pedro Alves April 27, 2018, 6:47 p.m. UTC | #2
On 04/27/2018 03:01 PM, Tom Tromey wrote:

>  static struct type *
>  typy_lookup_typename (const char *type_name, const struct block *block)
>  {
> @@ -1410,6 +1432,8 @@ gdbpy_initialize_types (void)
>  
>  static gdb_PyGetSetDef type_object_getset[] =
>  {
> + { "align", typy_get_align, NULL,
> +   "The alignment of this type, in bytes.", NULL },
>   { "code", typy_get_code, NULL,
>     "The code for this type.", NULL },
>   { "name", typy_get_name, NULL,

I thought it a bit odd to call the field "align" (a verb), so
I went to look what we call the "size" field, thinking that
if it were called literally "size", then "align" would be somewhat
consistent (I would then read "align" as shorthand for "alignment").
But, what I found was that we call the size field "sizeof".
So I think it would be more consistent to call the
alignment field "alignof" instead.  Agree?

Otherwise looks fine to me.

Thanks,
Pedro Alves
  
Tom Tromey April 27, 2018, 8:40 p.m. UTC | #3
>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:

Pedro> So I think it would be more consistent to call the
Pedro> alignment field "alignof" instead.  Agree?

I renamed it.

Tom
  

Patch

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index caab3a7284..4e1f52dbdf 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@ 
+2018-04-27  Tom Tromey  <tom@tromey.com>
+
+	* NEWS: Mention Type.align.
+	* python/py-type.c (typy_get_align): New function.
+	(type_object_getset): Add "align".
+
 2018-04-27  Tom Tromey  <tom@tromey.com>
 
 	* python/py-type.c (type_object_getset): Reindent.
diff --git a/gdb/NEWS b/gdb/NEWS
index 6631b53475..6193070023 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -27,6 +27,10 @@  set|show record btrace cpu
   Controls the processor to be used for enabling errata workarounds for
   branch trace decode.
 
+* Python API
+
+  ** Type alignment is now exposed via the "align" attribute of a gdb.Type.
+
 * New targets
 
 RiscV ELF			riscv*-*-elf
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 83d48781f9..4e7c96bfd4 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,7 @@ 
+2018-04-27  Tom Tromey  <tom@tromey.com>
+
+	* python.texi (Types In Python): Document Type.align.
+
 2018-04-13  Andreas Arnez  <arnez@linux.vnet.ibm.com>
 
 	* gdb.texinfo (Symbols): Mention the fact that "info
diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi
index ebd48fffe7..e5fd713e0a 100644
--- a/gdb/doc/python.texi
+++ b/gdb/doc/python.texi
@@ -930,6 +930,13 @@  description of the @code{Type.fields} method for a description of the
 
 An instance of @code{Type} has the following attributes:
 
+@defvar Type.align
+The alignment of this type, in bytes.  Type alignment comes from the
+debugging information; if it was not specified, then @value{GDBN} will
+use the relevant ABI to try to determine the alignment.  In some
+cases, even this is not possible, and zero will be returned.
+@end defvar
+
 @defvar Type.code
 The type code for this type.  The type code will be one of the
 @code{TYPE_CODE_} constants defined below.
diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c
index fcd6ed5621..bc49ec66ac 100644
--- a/gdb/python/py-type.c
+++ b/gdb/python/py-type.c
@@ -730,6 +730,28 @@  typy_get_sizeof (PyObject *self, void *closure)
   return gdb_py_long_from_longest (TYPE_LENGTH (type));
 }
 
+/* Return the alignment of the type represented by SELF, in bytes.  */
+static PyObject *
+typy_get_align (PyObject *self, void *closure)
+{
+  struct type *type = ((type_object *) self)->type;
+
+  ULONGEST align = 0;
+  TRY
+    {
+      align = type_align (type);
+    }
+  CATCH (except, RETURN_MASK_ALL)
+    {
+      align = 0;
+    }
+  END_CATCH
+
+  /* Ignore exceptions.  */
+
+  return gdb_py_object_from_ulongest (align);
+}
+
 static struct type *
 typy_lookup_typename (const char *type_name, const struct block *block)
 {
@@ -1410,6 +1432,8 @@  gdbpy_initialize_types (void)
 
 static gdb_PyGetSetDef type_object_getset[] =
 {
+ { "align", typy_get_align, NULL,
+   "The alignment of this type, in bytes.", NULL },
  { "code", typy_get_code, NULL,
    "The code for this type.", NULL },
  { "name", typy_get_name, NULL,
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 6909e8e0b1..40e5bff571 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@ 
+2018-04-27  Tom Tromey  <tom@tromey.com>
+
+	* gdb.python/py-type.exp: Check align attribute.
+	* gdb.python/py-type.c: New "aligncheck" global.
+
 2018-04-27  Tom Tromey  <tom@tromey.com>
 
 	PR exp/17095:
diff --git a/gdb/testsuite/gdb.python/py-type.c b/gdb/testsuite/gdb.python/py-type.c
index 2626d4e418..9531c9e6cb 100644
--- a/gdb/testsuite/gdb.python/py-type.c
+++ b/gdb/testsuite/gdb.python/py-type.c
@@ -30,6 +30,8 @@  struct SS
 typedef struct s TS;
 TS ts;
 
+int aligncheck;
+
 #ifdef __cplusplus
 struct C
 {
diff --git a/gdb/testsuite/gdb.python/py-type.exp b/gdb/testsuite/gdb.python/py-type.exp
index b87e86cdf6..382bdff118 100644
--- a/gdb/testsuite/gdb.python/py-type.exp
+++ b/gdb/testsuite/gdb.python/py-type.exp
@@ -278,6 +278,10 @@  if { [build_inferior "${binfile}" "c"] == 0 } {
   gdb_test "python print(gdb.lookup_type('int').optimized_out())" \
       "<optimized out>"
 
+  set sint [get_sizeof int 0]
+  gdb_test "python print(gdb.parse_and_eval('aligncheck').type.align)" \
+      $sint
+
   with_test_prefix "lang_c" {
       runto_bp "break to inspect struct and array."
       test_fields "c"