[RFA,v2,4/6] Expose type alignment on gdb.Type
Commit Message
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
> 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.
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
>>>>> "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
@@ -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.
@@ -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
@@ -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
@@ -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.
@@ -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,
@@ -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:
@@ -30,6 +30,8 @@ struct SS
typedef struct s TS;
TS ts;
+int aligncheck;
+
#ifdef __cplusplus
struct C
{
@@ -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"