public inbox for libabigail@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 0/5] CTF front-end Bug Fixing and improvement
@ 2022-11-17  3:43 Guillermo E. Martinez
  2022-11-17  3:43 ` [PATCH 1/5] ctf-front-end: Set alignment-in-bits property to 0 Guillermo E. Martinez
                   ` (4 more replies)
  0 siblings, 5 replies; 16+ messages in thread
From: Guillermo E. Martinez @ 2022-11-17  3:43 UTC (permalink / raw)
  To: libabigail; +Cc: Guillermo E. Martinez

Hello,

These patch series are bug fixing and some improvements for
CTF front-end found using libabigail tools as follows:

    abidw --ctf  --exported-interfaces-only elf_{binary,library} > ctf.abi
    abidw  --exported-interfaces-only elf_{binary,library} > dwarf.abi
    abidiff {ctf,dwarf}.abi

ELF binaries/libraries included in packages:

   + libgtk
   + libelf
   + emacs
   + vim
   + grep
   + coreutils
   + Linux Kernel 5.16
   + curl
   + glib
   + zlib
   + findutils
   + recutils
   + poke
   + php
   + lzma
   + bzip2
   + m4
   + and more ...

The patch series rely on the functionality provided in:

   https://sourceware.org/pipermail/libabigail/2022q4/004911.html

Worked in branch: users/dodji/front-end.

Please if you have comments don't hesitate to post it.  I'll really
appreciate them!

Kind regards,
guillermo

Guillermo E. Martinez (5):
  ctf-front-end: Set alignment-in-bits property to 0
  ctf-front-end: Fix size and name for underlying types
  ctf-front-end: Strip qualification from a qualified array type
  ctf-front-end: Fix representation for multidimensional array type
  ctf-front-end: Fix array size representation

 src/abg-ctf-reader.cc                         | 214 +++++++++++++-----
 tests/data/Makefile.am                        |  15 ++
 .../test-diff-pkg-ctf/dirpkg-3-report-1.txt   |   1 -
 .../test-diff-pkg-ctf/dirpkg-3-report-2.txt   |   1 -
 .../gmp-6.x.x86_64-report-0.txt               |   1 +
 .../test-read-ctf/PR27700/test-PR27700.abi    |   6 +-
 tests/data/test-read-ctf/test-PR26568-1.o.abi |  12 +-
 tests/data/test-read-ctf/test-PR26568-2.o.abi |  10 +-
 .../test-ambiguous-struct-A.o.hash.abi        |  10 +-
 .../test-ambiguous-struct-B.o.hash.abi        |   6 +-
 .../test-read-ctf/test-anonymous-fields.o.abi |  10 +-
 .../test-read-ctf/test-array-mdimension.abi   |  16 ++
 .../test-read-ctf/test-array-mdimension.c     |   2 +
 .../test-read-ctf/test-array-mdimension.o     | Bin 0 -> 1360 bytes
 .../test-read-ctf/test-array-of-pointers.abi  |  10 +-
 tests/data/test-read-ctf/test-array-size.abi  |  23 ++
 tests/data/test-read-ctf/test-array-size.c    |   4 +
 tests/data/test-read-ctf/test-array-size.o    | Bin 0 -> 1432 bytes
 .../data/test-read-ctf/test-bitfield-enum.abi |  18 ++
 tests/data/test-read-ctf/test-bitfield-enum.c |  12 +
 tests/data/test-read-ctf/test-bitfield-enum.o | Bin 0 -> 1336 bytes
 tests/data/test-read-ctf/test-bitfield.abi    |  28 +++
 tests/data/test-read-ctf/test-bitfield.c      |  15 ++
 tests/data/test-read-ctf/test-bitfield.o      | Bin 0 -> 1488 bytes
 tests/data/test-read-ctf/test-callback.abi    |   8 +-
 tests/data/test-read-ctf/test-callback2.abi   |   6 +-
 .../test-conflicting-type-syms-a.o.hash.abi   |   2 +-
 .../test-conflicting-type-syms-b.o.hash.abi   |   2 +-
 tests/data/test-read-ctf/test-const-array.abi |  14 ++
 tests/data/test-read-ctf/test-const-array.c   |   2 +
 tests/data/test-read-ctf/test-const-array.o   | Bin 0 -> 1416 bytes
 .../test-read-ctf/test-dynamic-array.o.abi    |  10 +-
 .../test-read-ctf/test-enum-many.o.hash.abi   |   6 +-
 .../test-read-ctf/test-enum-symbol.o.hash.abi |   4 +-
 tests/data/test-read-ctf/test-enum.o.abi      |  10 +-
 tests/data/test-read-ctf/test-fallback.abi    |   2 +-
 .../test-read-ctf/test-forward-type-decl.abi  |   6 +-
 .../test-functions-declaration.abi            |  10 +-
 .../data/test-read-ctf/test-linux-module.abi  |  18 +-
 tests/data/test-read-ctf/test-list-struct.abi |   4 +-
 tests/data/test-read-ctf/test0.abi            |  52 ++---
 tests/data/test-read-ctf/test0.hash.abi       |  30 +--
 tests/data/test-read-ctf/test1.so.abi         |  12 +-
 tests/data/test-read-ctf/test1.so.hash.abi    |   8 +-
 tests/data/test-read-ctf/test2.so.abi         |   8 +-
 tests/data/test-read-ctf/test2.so.hash.abi    |   8 +-
 tests/data/test-read-ctf/test3.so.abi         |   2 +-
 tests/data/test-read-ctf/test3.so.hash.abi    |   2 +-
 tests/data/test-read-ctf/test4.so.abi         |   6 +-
 tests/data/test-read-ctf/test4.so.hash.abi    |   6 +-
 tests/data/test-read-ctf/test5.o.abi          |  28 +--
 tests/data/test-read-ctf/test7.o.abi          |  10 +-
 tests/data/test-read-ctf/test8.o.abi          |   2 +-
 tests/data/test-read-ctf/test9.o.abi          |  48 ++--
 tests/test-read-ctf.cc                        |  45 ++++
 55 files changed, 539 insertions(+), 246 deletions(-)
 create mode 100644 tests/data/test-read-ctf/test-array-mdimension.abi
 create mode 100644 tests/data/test-read-ctf/test-array-mdimension.c
 create mode 100644 tests/data/test-read-ctf/test-array-mdimension.o
 create mode 100644 tests/data/test-read-ctf/test-array-size.abi
 create mode 100644 tests/data/test-read-ctf/test-array-size.c
 create mode 100644 tests/data/test-read-ctf/test-array-size.o
 create mode 100644 tests/data/test-read-ctf/test-bitfield-enum.abi
 create mode 100644 tests/data/test-read-ctf/test-bitfield-enum.c
 create mode 100644 tests/data/test-read-ctf/test-bitfield-enum.o
 create mode 100644 tests/data/test-read-ctf/test-bitfield.abi
 create mode 100644 tests/data/test-read-ctf/test-bitfield.c
 create mode 100644 tests/data/test-read-ctf/test-bitfield.o
 create mode 100644 tests/data/test-read-ctf/test-const-array.abi
 create mode 100644 tests/data/test-read-ctf/test-const-array.c
 create mode 100644 tests/data/test-read-ctf/test-const-array.o

-- 
2.35.1


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 1/5] ctf-front-end: Set alignment-in-bits property to 0
  2022-11-17  3:43 [PATCH 0/5] CTF front-end Bug Fixing and improvement Guillermo E. Martinez
@ 2022-11-17  3:43 ` Guillermo E. Martinez
  2022-11-29 11:46   ` Dodji Seketeli
  2022-11-17  3:43 ` [PATCH 2/5] ctf-front-end: Fix size and name for underlying types Guillermo E. Martinez
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 16+ messages in thread
From: Guillermo E. Martinez @ 2022-11-17  3:43 UTC (permalink / raw)
  To: libabigail; +Cc: Guillermo E. Martinez

When comparing IR generated with DWARF and CTF fron-ends the report
of different shows changes in the `alignment-in-bits' ABI XML propery:

<type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
<type-decl name='int' size-in-bits='32' id='type-id-1'/>

1 Changed variable:

  [C] 'int a' was changed at test-abi.c:8:1:
    type of variable changed:
      type size hasn't changed
      type alignment changed from 32 to 0

So, CTF set the alignment to `0' to base types, function
types and struct types similarly as DWARF front-end does.

	* src/abg-ctf-reader.cc (process_ctf_base_type)
	(process_ctf_function_type, process_ctf_struct_type): Adjust
	`align_in_bits' argument to `0'.
	* tests/data/test-diff-pkg-ctf/dirpkg-3-report-1.txt: Adjust test.
	* tests/data/test-diff-pkg-ctf/dirpkg-3-report-2.txt: Likewise.
	* tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt: Likewise.
	* tests/data/test-read-ctf/PR27700/test-PR27700.abi: Likewise.
	* tests/data/test-read-ctf/test-PR26568-1.o.abi: Likewise.
	* tests/data/test-read-ctf/test-PR26568-2.o.abi: Likewise.
	* tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-anonymous-fields.o.abi: Likewise.
	* tests/data/test-read-ctf/test-array-of-pointers.abi: Likewise.
	* tests/data/test-read-ctf/test-callback.abi: Likewise.
	* tests/data/test-read-ctf/test-callback2.abi: Likewise.
	* tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-dynamic-array.o.abi: Likewise.
	* tests/data/test-read-ctf/test-fallback.abi: Likewise.
	* tests/data/test-read-ctf/test-forward-type-decl.abi: Likewise.
	* tests/data/test-read-ctf/test-functions-declaration.abi: Likewise.
	* tests/data/test-read-ctf/test-linux-module.abi: Likewise.
	* tests/data/test-read-ctf/test-linux-module.abi: Likewise.
	* tests/data/test-read-ctf/test-list-struct.abi: Likewise.
	* tests/data/test-read-ctf/test0.abi: Likewise.
	* tests/data/test-read-ctf/test0.hash.abi: Likewise.
	* tests/data/test-read-ctf/test1.so.abi: Likewise.
	* tests/data/test-read-ctf/test1.so.hash.abi: Likewise.
	* tests/data/test-read-ctf/test2.so.abi: Likewise.
	* tests/data/test-read-ctf/test2.so.hash.abi: Likewise.
	* tests/data/test-read-ctf/test3.so.abi: Likewise.
	* tests/data/test-read-ctf/test3.so.hash.abi: Likewise.
	* tests/data/test-read-ctf/test4.so.abi: Likewise.
	* tests/data/test-read-ctf/test4.so.hash.abi: Likewise.
	* tests/data/test-read-ctf/test5.o.abi: Likewise.
	* tests/data/test-read-ctf/test7.o.abi: Likewise.
	* tests/data/test-read-ctf/test8.o.abi: Likewise.
	* tests/data/test-read-ctf/test9.o.abi: Likewise.

Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
---
 src/abg-ctf-reader.cc                         |  7 +++---
 .../test-diff-pkg-ctf/dirpkg-3-report-1.txt   |  1 -
 .../test-diff-pkg-ctf/dirpkg-3-report-2.txt   |  1 -
 .../gmp-6.x.x86_64-report-0.txt               |  1 +
 .../test-read-ctf/PR27700/test-PR27700.abi    |  2 +-
 tests/data/test-read-ctf/test-PR26568-1.o.abi | 12 +++++-----
 tests/data/test-read-ctf/test-PR26568-2.o.abi | 10 ++++----
 .../test-ambiguous-struct-A.o.hash.abi        | 10 ++++----
 .../test-ambiguous-struct-B.o.hash.abi        |  6 ++---
 .../test-read-ctf/test-anonymous-fields.o.abi | 10 ++++----
 .../test-read-ctf/test-array-of-pointers.abi  | 10 ++++----
 tests/data/test-read-ctf/test-callback.abi    |  8 +++----
 tests/data/test-read-ctf/test-callback2.abi   |  6 ++---
 .../test-conflicting-type-syms-a.o.hash.abi   |  2 +-
 .../test-conflicting-type-syms-b.o.hash.abi   |  2 +-
 .../test-read-ctf/test-dynamic-array.o.abi    | 10 ++++----
 tests/data/test-read-ctf/test-fallback.abi    |  2 +-
 .../test-read-ctf/test-forward-type-decl.abi  |  6 ++---
 .../test-functions-declaration.abi            | 10 ++++----
 .../data/test-read-ctf/test-linux-module.abi  | 18 +++++++-------
 tests/data/test-read-ctf/test-list-struct.abi |  4 ++--
 tests/data/test-read-ctf/test0.abi            | 24 +++++++++----------
 tests/data/test-read-ctf/test0.hash.abi       | 24 +++++++++----------
 tests/data/test-read-ctf/test1.so.abi         |  4 ++--
 tests/data/test-read-ctf/test1.so.hash.abi    |  4 ++--
 tests/data/test-read-ctf/test2.so.abi         |  8 +++----
 tests/data/test-read-ctf/test2.so.hash.abi    |  8 +++----
 tests/data/test-read-ctf/test3.so.abi         |  2 +-
 tests/data/test-read-ctf/test3.so.hash.abi    |  2 +-
 tests/data/test-read-ctf/test4.so.abi         |  6 ++---
 tests/data/test-read-ctf/test4.so.hash.abi    |  6 ++---
 tests/data/test-read-ctf/test5.o.abi          | 18 +++++++-------
 tests/data/test-read-ctf/test7.o.abi          | 10 ++++----
 tests/data/test-read-ctf/test8.o.abi          |  2 +-
 tests/data/test-read-ctf/test9.o.abi          | 20 ++++++++--------
 35 files changed, 137 insertions(+), 139 deletions(-)

diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc
index 9950de57..9c41edf4 100644
--- a/src/abg-ctf-reader.cc
+++ b/src/abg-ctf-reader.cc
@@ -788,7 +788,6 @@ process_ctf_base_type(reader *rdr,
   translation_unit_sptr tunit = rdr->cur_transl_unit();
   type_decl_sptr result;
 
-  ssize_t type_alignment = ctf_type_align(ctf_dictionary, ctf_type);
   const char *type_name = ctf_type_name_raw(ctf_dictionary, ctf_type);
 
   /* Get the type encoding and extract some useful properties of
@@ -827,7 +826,7 @@ process_ctf_base_type(reader *rdr,
         result.reset(new type_decl(rdr->env(),
                                    type_name,
                                    type_encoding.cte_bits,
-                                   type_alignment * 8 /* in bits */,
+                                   /*alignment=*/0,
                                    location(),
                                    type_name /* mangled_name */));
 
@@ -936,7 +935,7 @@ process_ctf_function_type(reader *rdr,
   result.reset(new function_type(ret_type,
                                  function_parms,
                                  tunit->get_address_size(),
-                                 ctf_type_align(ctf_dictionary, ctf_type)));
+                                 /*alignment=*/0));
 
   if (result)
     {
@@ -1095,7 +1094,7 @@ process_ctf_struct_type(reader *rdr,
   result.reset(new class_decl(rdr->env(),
                               struct_type_name,
                               ctf_type_size(ctf_dictionary, ctf_type) * 8,
-                              ctf_type_align(ctf_dictionary, ctf_type) * 8,
+                              /*alignment=*/0,
                               true /* is_struct */,
                               location(),
                               decl_base::VISIBILITY_DEFAULT,
diff --git a/tests/data/test-diff-pkg-ctf/dirpkg-3-report-1.txt b/tests/data/test-diff-pkg-ctf/dirpkg-3-report-1.txt
index 4938d221..aa1d7732 100644
--- a/tests/data/test-diff-pkg-ctf/dirpkg-3-report-1.txt
+++ b/tests/data/test-diff-pkg-ctf/dirpkg-3-report-1.txt
@@ -8,7 +8,6 @@
       parameter 1 of type 'S1*' has sub-type changes:
         in pointed to type 'struct S1':
           type size changed from 0 to 32 (in bits)
-          type alignment changed from 0 to 32
           1 data member insertion:
             'int mem2', at offset 0 (in bits)
 
diff --git a/tests/data/test-diff-pkg-ctf/dirpkg-3-report-2.txt b/tests/data/test-diff-pkg-ctf/dirpkg-3-report-2.txt
index 4938d221..aa1d7732 100644
--- a/tests/data/test-diff-pkg-ctf/dirpkg-3-report-2.txt
+++ b/tests/data/test-diff-pkg-ctf/dirpkg-3-report-2.txt
@@ -8,7 +8,6 @@
       parameter 1 of type 'S1*' has sub-type changes:
         in pointed to type 'struct S1':
           type size changed from 0 to 32 (in bits)
-          type alignment changed from 0 to 32
           1 data member insertion:
             'int mem2', at offset 0 (in bits)
 
diff --git a/tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt b/tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt
index d3915f14..171d6490 100644
--- a/tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt
+++ b/tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt
@@ -133,6 +133,7 @@
                 underlying type 'const mp_limb_t*' changed:
                   entity changed from 'const mp_limb_t*' to 'unsigned long int'
                   type size hasn't changed
+                  type alignment changed from 64 to 0
               parameter 2 of type 'typedef mp_size_t' changed:
                 typedef name changed from mp_size_t to mp_limb_t
                 underlying type 'long int' changed:
diff --git a/tests/data/test-read-ctf/PR27700/test-PR27700.abi b/tests/data/test-read-ctf/PR27700/test-PR27700.abi
index fe3a897d..4f34eb8a 100644
--- a/tests/data/test-read-ctf/PR27700/test-PR27700.abi
+++ b/tests/data/test-read-ctf/PR27700/test-PR27700.abi
@@ -12,7 +12,7 @@
       <enumerator name='foo_e3' value='3'/>
     </enum-decl>
     <pointer-type-def type-id='022218d8' size-in-bits='64' alignment-in-bits='64' id='8750e847'/>
-    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo'>
+    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
       <parameter type-id='8750e847'/>
       <return type-id='48b5725f'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test-PR26568-1.o.abi b/tests/data/test-read-ctf/test-PR26568-1.o.abi
index 7df180d4..60017457 100644
--- a/tests/data/test-read-ctf/test-PR26568-1.o.abi
+++ b/tests/data/test-read-ctf/test-PR26568-1.o.abi
@@ -3,19 +3,19 @@
     <elf-symbol name='fun' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
-    <class-decl name='A' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-3'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-2'/>
+    <class-decl name='A' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-3'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='' type-id='type-id-4' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' alignment-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-5'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-5'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='x' type-id='type-id-1' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='64' alignment-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-6'>
+    <class-decl name='' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-6'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='y' type-id='type-id-2' visibility='default'/>
       </data-member>
@@ -29,7 +29,7 @@
       </data-member>
     </union-decl>
     <pointer-type-def type-id='type-id-3' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
-    <function-decl name='fun' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='fun'>
+    <function-decl name='fun' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fun'>
       <parameter type-id='type-id-7'/>
       <return type-id='type-id-8'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test-PR26568-2.o.abi b/tests/data/test-read-ctf/test-PR26568-2.o.abi
index 44f72263..d038316a 100644
--- a/tests/data/test-read-ctf/test-PR26568-2.o.abi
+++ b/tests/data/test-read-ctf/test-PR26568-2.o.abi
@@ -3,14 +3,14 @@
     <elf-symbol name='fun' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
-    <class-decl name='' size-in-bits='32' alignment-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-3'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-2'/>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-3'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='x' type-id='type-id-1' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='64' alignment-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-4'>
+    <class-decl name='' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-4'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='y' type-id='type-id-2' visibility='default'/>
       </data-member>
@@ -24,7 +24,7 @@
       </data-member>
     </union-decl>
     <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
-    <function-decl name='fun' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='fun'>
+    <function-decl name='fun' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fun'>
       <parameter type-id='type-id-6'/>
       <return type-id='type-id-7'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi b/tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi
index 91ddf181..42ce36de 100644
--- a/tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi
+++ b/tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi
@@ -3,11 +3,11 @@
     <elf-symbol name='foo' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <array-type-def dimensions='1' type-id='3ed987a4' size-in-bits='12800' alignment-in-bits='64' id='e022be37'>
+    <array-type-def dimensions='1' type-id='3ed987a4' size-in-bits='12800' id='e022be37'>
       <subrange length='50' type-id='f0981eeb' id='3c1860ce'/>
     </array-type-def>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='95e97e5e'/>
-    <class-decl name='A' size-in-bits='256' alignment-in-bits='64' is-struct='yes' visibility='default' id='3ed987a4'>
+    <type-decl name='long int' size-in-bits='64' id='95e97e5e'/>
+    <class-decl name='A' size-in-bits='256' is-struct='yes' visibility='default' id='3ed987a4'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='b' type-id='41d98c5d' visibility='default'/>
       </data-member>
@@ -21,13 +21,13 @@
         <var-decl name='b2' type-id='41d98c5d' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='B' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='41d98c5d'>
+    <class-decl name='B' size-in-bits='64' is-struct='yes' visibility='default' id='41d98c5d'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='a' type-id='84d5ac12' visibility='default'/>
       </data-member>
     </class-decl>
     <typedef-decl name='a_array' type-id='e022be37' id='1c12b755'/>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='f0981eeb'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='f0981eeb'/>
     <pointer-type-def type-id='3ed987a4' size-in-bits='64' alignment-in-bits='64' id='84d5ac12'/>
     <pointer-type-def type-id='1c12b755' size-in-bits='64' alignment-in-bits='64' id='55cd64e8'/>
     <var-decl name='foo' type-id='55cd64e8' mangled-name='foo' visibility='default' elf-symbol-id='foo'/>
diff --git a/tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi b/tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi
index cba10afd..351483de 100644
--- a/tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi
+++ b/tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi
@@ -3,8 +3,8 @@
     <elf-symbol name='a' size='24' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='95e97e5e'/>
-    <class-decl name='A' size-in-bits='192' alignment-in-bits='64' is-struct='yes' visibility='default' id='3ed987a4'>
+    <type-decl name='int' size-in-bits='32' id='95e97e5e'/>
+    <class-decl name='A' size-in-bits='192' is-struct='yes' visibility='default' id='3ed987a4'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='b' type-id='41d98c5d' visibility='default'/>
       </data-member>
@@ -15,7 +15,7 @@
         <var-decl name='b2' type-id='41d98c5d' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='B' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='41d98c5d'>
+    <class-decl name='B' size-in-bits='64' is-struct='yes' visibility='default' id='41d98c5d'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='a' type-id='84d5ac12' visibility='default'/>
       </data-member>
diff --git a/tests/data/test-read-ctf/test-anonymous-fields.o.abi b/tests/data/test-read-ctf/test-anonymous-fields.o.abi
index 2df54c3b..987daa57 100644
--- a/tests/data/test-read-ctf/test-anonymous-fields.o.abi
+++ b/tests/data/test-read-ctf/test-anonymous-fields.o.abi
@@ -3,18 +3,18 @@
     <elf-symbol name='t' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <class-decl name='uprobe_task' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-2'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <class-decl name='uprobe_task' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-2'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='' type-id='type-id-3' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' alignment-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-4'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-4'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='dup_xol_work' type-id='type-id-1' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='64' alignment-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-5'>
+    <class-decl name='' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-5'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='vaddr' type-id='type-id-6' visibility='default'/>
       </data-member>
@@ -27,7 +27,7 @@
         <var-decl name='' type-id='type-id-4' visibility='default'/>
       </data-member>
     </union-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-6'/>
     <var-decl name='t' type-id='type-id-2' mangled-name='t' visibility='default' elf-symbol-id='t'/>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/data/test-read-ctf/test-array-of-pointers.abi b/tests/data/test-read-ctf/test-array-of-pointers.abi
index 47135315..c521bbec 100644
--- a/tests/data/test-read-ctf/test-array-of-pointers.abi
+++ b/tests/data/test-read-ctf/test-array-of-pointers.abi
@@ -6,27 +6,27 @@
     <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='256' alignment-in-bits='64' id='type-id-2'>
       <subrange length='4' type-id='type-id-3' id='type-id-4'/>
     </array-type-def>
-    <class-decl name='cgroup' size-in-bits='256' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-5'>
+    <class-decl name='cgroup' size-in-bits='256' is-struct='yes' visibility='default' id='type-id-5'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='s1' type-id='type-id-2' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='css_set' size-in-bits='256' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-6'>
+    <class-decl name='css_set' size-in-bits='256' is-struct='yes' visibility='default' id='type-id-6'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='s0' type-id='type-id-2' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='state' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-7'>
+    <class-decl name='state' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-7'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='cg' type-id='type-id-8' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='task' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-9'>
+    <class-decl name='task' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-9'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='s' type-id='type-id-10' visibility='default'/>
       </data-member>
     </class-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-3'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
     <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
     <pointer-type-def type-id='type-id-6' size-in-bits='64' alignment-in-bits='64' id='type-id-10'/>
     <pointer-type-def type-id='type-id-7' size-in-bits='64' alignment-in-bits='64' id='type-id-1'/>
diff --git a/tests/data/test-read-ctf/test-callback.abi b/tests/data/test-read-ctf/test-callback.abi
index 7f9b6c5f..3c90e737 100644
--- a/tests/data/test-read-ctf/test-callback.abi
+++ b/tests/data/test-read-ctf/test-callback.abi
@@ -4,12 +4,12 @@
     <elf-symbol name='f2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
-    <function-decl name='assign' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='assign'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-2'/>
+    <function-decl name='assign' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='assign'>
       <return type-id='type-id-3'/>
     </function-decl>
-    <function-decl name='f2' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='f2'>
+    <function-decl name='f2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='f2'>
       <parameter type-id='type-id-1'/>
       <parameter type-id='type-id-2'/>
       <return type-id='type-id-3'/>
diff --git a/tests/data/test-read-ctf/test-callback2.abi b/tests/data/test-read-ctf/test-callback2.abi
index c2ffdb18..87b43d06 100644
--- a/tests/data/test-read-ctf/test-callback2.abi
+++ b/tests/data/test-read-ctf/test-callback2.abi
@@ -3,8 +3,8 @@
     <elf-symbol name='s0' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <class-decl name='s0' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-2'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <class-decl name='s0' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-2'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='mem_fun' type-id='type-id-3' visibility='default'/>
       </data-member>
@@ -12,7 +12,7 @@
     <pointer-type-def type-id='type-id-4' size-in-bits='64' alignment-in-bits='64' id='type-id-3'/>
     <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-5'/>
     <var-decl name='s0' type-id='type-id-5' mangled-name='s0' visibility='default' elf-symbol-id='s0'/>
-    <function-type size-in-bits='64' alignment-in-bits='8' id='type-id-4'>
+    <function-type size-in-bits='64' id='type-id-4'>
       <parameter type-id='type-id-5'/>
       <return type-id='type-id-1'/>
     </function-type>
diff --git a/tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi b/tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi
index 85e780a9..79079b04 100644
--- a/tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi
+++ b/tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi
@@ -4,7 +4,7 @@
     <elf-symbol name='ignore2' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='95e97e5e'/>
+    <type-decl name='long int' size-in-bits='64' id='95e97e5e'/>
     <typedef-decl name='a_t' type-id='95e97e5e' id='40acc204'/>
     <typedef-decl name='b_t' type-id='95e97e5e' id='b3d2db81'/>
     <pointer-type-def type-id='40acc204' size-in-bits='64' alignment-in-bits='64' id='c6fd4117'/>
diff --git a/tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi b/tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi
index 400606dd..74b25d36 100644
--- a/tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi
+++ b/tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi
@@ -4,7 +4,7 @@
     <elf-symbol name='ignore1' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='95e97e5e'/>
+    <type-decl name='long int' size-in-bits='64' id='95e97e5e'/>
     <typedef-decl name='a_t' type-id='95e97e5e' id='40acc204'/>
     <typedef-decl name='b_t' type-id='95e97e5e' id='b3d2db81'/>
     <var-decl name='b' type-id='40acc204' mangled-name='b' visibility='default' elf-symbol-id='b'/>
diff --git a/tests/data/test-read-ctf/test-dynamic-array.o.abi b/tests/data/test-read-ctf/test-dynamic-array.o.abi
index a9849d49..a8978c0c 100644
--- a/tests/data/test-read-ctf/test-dynamic-array.o.abi
+++ b/tests/data/test-read-ctf/test-dynamic-array.o.abi
@@ -3,11 +3,11 @@
     <elf-symbol name='use_struct_s' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='type-id-1'/>
-    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='infinite' alignment-in-bits='8' id='type-id-2'>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='infinite' id='type-id-2'>
       <subrange length='infinite' type-id='type-id-3' id='type-id-4'/>
     </array-type-def>
-    <class-decl name='S' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-5'>
+    <class-decl name='S' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-5'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='a' type-id='type-id-6' visibility='default'/>
       </data-member>
@@ -18,10 +18,10 @@
         <var-decl name='c' type-id='type-id-2' visibility='default'/>
       </data-member>
     </class-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-3'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
     <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
     <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
-    <function-decl name='use_struct_s' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='use_struct_s'>
+    <function-decl name='use_struct_s' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='use_struct_s'>
       <parameter type-id='type-id-7'/>
       <return type-id='type-id-8'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test-fallback.abi b/tests/data/test-read-ctf/test-fallback.abi
index e7d30594..9f09cd56 100644
--- a/tests/data/test-read-ctf/test-fallback.abi
+++ b/tests/data/test-read-ctf/test-fallback.abi
@@ -3,7 +3,7 @@
     <elf-symbol name='a' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
     <var-decl name='a' type-id='type-id-1' mangled-name='a' visibility='default' elf-symbol-id='a'/>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/data/test-read-ctf/test-forward-type-decl.abi b/tests/data/test-read-ctf/test-forward-type-decl.abi
index 026e7d32..c239187b 100644
--- a/tests/data/test-read-ctf/test-forward-type-decl.abi
+++ b/tests/data/test-read-ctf/test-forward-type-decl.abi
@@ -3,7 +3,7 @@
     <elf-symbol name='addr' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <class-decl name='address_space' size-in-bits='128' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-1'>
+    <class-decl name='address_space' size-in-bits='128' is-struct='yes' visibility='default' id='type-id-1'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='rb_root' type-id='type-id-2' visibility='default'/>
       </data-member>
@@ -11,12 +11,12 @@
         <var-decl name='page' type-id='type-id-3' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='page' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-4'>
+    <class-decl name='page' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-4'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='mapping' type-id='type-id-5' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='rb_node' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-6'>
+    <class-decl name='rb_node' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-6'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='rb_left' type-id='type-id-2' visibility='default'/>
       </data-member>
diff --git a/tests/data/test-read-ctf/test-functions-declaration.abi b/tests/data/test-read-ctf/test-functions-declaration.abi
index dd8516fd..193221e4 100644
--- a/tests/data/test-read-ctf/test-functions-declaration.abi
+++ b/tests/data/test-read-ctf/test-functions-declaration.abi
@@ -4,19 +4,19 @@
     <elf-symbol name='attribute_container_device_trigger' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-2'/>
     <pointer-type-def type-id='type-id-3' size-in-bits='64' alignment-in-bits='64' id='type-id-4'/>
-    <function-decl name='attribute_container_add_device' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='attribute_container_add_device'>
+    <function-decl name='attribute_container_add_device' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='attribute_container_add_device'>
       <parameter type-id='type-id-4'/>
       <return type-id='type-id-5'/>
     </function-decl>
-    <function-decl name='attribute_container_device_trigger' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='attribute_container_device_trigger'>
+    <function-decl name='attribute_container_device_trigger' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='attribute_container_device_trigger'>
       <parameter type-id='type-id-4'/>
       <return type-id='type-id-5'/>
     </function-decl>
     <type-decl name='void' id='type-id-5'/>
-    <function-type size-in-bits='64' alignment-in-bits='8' id='type-id-3'>
+    <function-type size-in-bits='64' id='type-id-3'>
       <parameter type-id='type-id-1'/>
       <parameter type-id='type-id-2'/>
       <return type-id='type-id-5'/>
diff --git a/tests/data/test-read-ctf/test-linux-module.abi b/tests/data/test-read-ctf/test-linux-module.abi
index e8081f16..933b9f82 100644
--- a/tests/data/test-read-ctf/test-linux-module.abi
+++ b/tests/data/test-read-ctf/test-linux-module.abi
@@ -7,8 +7,8 @@
     <elf-symbol name='global_sym' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x44a6713b'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <class-decl name='__raw_tickets' size-in-bits='32' alignment-in-bits='16' is-struct='yes' visibility='default' id='type-id-2'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <class-decl name='__raw_tickets' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-2'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='owner' type-id='type-id-3' visibility='default'/>
       </data-member>
@@ -16,17 +16,17 @@
         <var-decl name='next' type-id='type-id-3' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='arch_spinlock_t' size-in-bits='32' alignment-in-bits='32' is-struct='yes' naming-typedef-id='type-id-4' visibility='default' id='type-id-5'>
+    <class-decl name='arch_spinlock_t' size-in-bits='32' is-struct='yes' naming-typedef-id='type-id-4' visibility='default' id='type-id-5'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='' type-id='type-id-6' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='raw_spinlock' size-in-bits='32' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-7'>
+    <class-decl name='raw_spinlock' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-7'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='raw_lock' type-id='type-id-4' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='spinlock' size-in-bits='32' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-8'>
+    <class-decl name='spinlock' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-8'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='' type-id='type-id-9' visibility='default'/>
       </data-member>
@@ -50,13 +50,13 @@
         <var-decl name='tickets' type-id='type-id-2' visibility='default'/>
       </data-member>
     </union-decl>
-    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='type-id-12'/>
-    <type-decl name='unsigned short int' size-in-bits='16' alignment-in-bits='16' id='type-id-10'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-12'/>
+    <type-decl name='unsigned short int' size-in-bits='16' id='type-id-10'/>
     <pointer-type-def type-id='type-id-14' size-in-bits='64' alignment-in-bits='64' id='type-id-16'/>
-    <function-decl name='testexport' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='testexport'>
+    <function-decl name='testexport' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='testexport'>
       <return type-id='type-id-1'/>
     </function-decl>
-    <function-decl name='testexport2' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='testexport2'>
+    <function-decl name='testexport2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='testexport2'>
       <parameter type-id='type-id-16'/>
       <return type-id='type-id-1'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test-list-struct.abi b/tests/data/test-read-ctf/test-list-struct.abi
index ecd4d08b..3fdc6aec 100644
--- a/tests/data/test-read-ctf/test-list-struct.abi
+++ b/tests/data/test-read-ctf/test-list-struct.abi
@@ -4,8 +4,8 @@
     <elf-symbol name='n2' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <class-decl name='rb_node_b' size-in-bits='128' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-2'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <class-decl name='rb_node_b' size-in-bits='128' is-struct='yes' visibility='default' id='type-id-2'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='this' type-id='type-id-3' visibility='default'/>
       </data-member>
diff --git a/tests/data/test-read-ctf/test0.abi b/tests/data/test-read-ctf/test0.abi
index 2129de41..05430067 100644
--- a/tests/data/test-read-ctf/test0.abi
+++ b/tests/data/test-read-ctf/test0.abi
@@ -20,21 +20,21 @@
     <elf-symbol name='test_volatile' size='2' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='1' alignment-in-bits='8' id='type-id-1'/>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='type-id-2'/>
-    <type-decl name='float' size-in-bits='32' alignment-in-bits='32' id='type-id-3'/>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-4'/>
-    <array-type-def dimensions='1' type-id='type-id-4' size-in-bits='320' alignment-in-bits='32' id='type-id-5'>
+    <type-decl name='' is-anonymous='yes' size-in-bits='1' id='type-id-1'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-2'/>
+    <type-decl name='float' size-in-bits='32' id='type-id-3'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <array-type-def dimensions='1' type-id='type-id-4' size-in-bits='320' id='type-id-5'>
       <subrange length='10' type-id='type-id-6' id='type-id-7'/>
     </array-type-def>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
-    <type-decl name='short int' size-in-bits='16' alignment-in-bits='16' id='type-id-9'/>
-    <class-decl name='S' size-in-bits='32' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-10'>
+    <type-decl name='long int' size-in-bits='64' id='type-id-8'/>
+    <type-decl name='short int' size-in-bits='16' id='type-id-9'/>
+    <class-decl name='S' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-10'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='type-id-4' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' alignment-in-bits='8' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-11'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-11'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='status0' type-id='type-id-1' visibility='default'/>
       </data-member>
@@ -42,7 +42,7 @@
         <var-decl name='status1' type-id='type-id-1' visibility='default'/>
       </data-member>
     </class-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-6'/>
     <pointer-type-def type-id='type-id-10' size-in-bits='64' alignment-in-bits='64' id='type-id-12'/>
     <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-13'/>
     <qualified-type-def type-id='type-id-10' const='yes' id='type-id-14'/>
@@ -53,11 +53,11 @@
     <var-decl name='test_pointer' type-id='type-id-13' mangled-name='test_pointer' visibility='default' elf-symbol-id='test_pointer'/>
     <var-decl name='test_const' type-id='type-id-14' mangled-name='test_const' visibility='default' elf-symbol-id='test_const'/>
     <var-decl name='test_float' type-id='type-id-3' mangled-name='test_float' visibility='default' elf-symbol-id='test_float'/>
-    <function-decl name='foo_1' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo_1'>
+    <function-decl name='foo_1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo_1'>
       <parameter type-id='type-id-12'/>
       <return type-id='type-id-4'/>
     </function-decl>
-    <function-decl name='main' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='main'>
+    <function-decl name='main' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='main'>
       <return type-id='type-id-4'/>
     </function-decl>
     <var-decl name='test_array' type-id='type-id-5' mangled-name='test_array' visibility='default' elf-symbol-id='test_array'/>
diff --git a/tests/data/test-read-ctf/test0.hash.abi b/tests/data/test-read-ctf/test0.hash.abi
index e98c97db..4aa9a93c 100644
--- a/tests/data/test-read-ctf/test0.hash.abi
+++ b/tests/data/test-read-ctf/test0.hash.abi
@@ -20,21 +20,21 @@
     <elf-symbol name='test_volatile' size='2' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='1' alignment-in-bits='8' id='811c9dc5'/>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='a84c031d'/>
-    <type-decl name='float' size-in-bits='32' alignment-in-bits='32' id='a6c45d85'/>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='95e97e5e'/>
-    <array-type-def dimensions='1' type-id='95e97e5e' size-in-bits='320' alignment-in-bits='32' id='b7bd1749'>
+    <type-decl name='' is-anonymous='yes' size-in-bits='1' id='811c9dc5'/>
+    <type-decl name='char' size-in-bits='8' id='a84c031d'/>
+    <type-decl name='float' size-in-bits='32' id='a6c45d85'/>
+    <type-decl name='int' size-in-bits='32' id='95e97e5e'/>
+    <array-type-def dimensions='1' type-id='95e97e5e' size-in-bits='320' id='b7bd1749'>
       <subrange length='10' type-id='f0981eeb' id='487da03a'/>
     </array-type-def>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='95e97e5f'/>
-    <type-decl name='short int' size-in-bits='16' alignment-in-bits='16' id='95e97e60'/>
-    <class-decl name='S' size-in-bits='32' alignment-in-bits='32' is-struct='yes' visibility='default' id='50d9a3fa'>
+    <type-decl name='long int' size-in-bits='64' id='95e97e5f'/>
+    <type-decl name='short int' size-in-bits='16' id='95e97e60'/>
+    <class-decl name='S' size-in-bits='32' is-struct='yes' visibility='default' id='50d9a3fa'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='95e97e5e' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' alignment-in-bits='8' is-struct='yes' is-anonymous='yes' visibility='default' id='b91ffdee'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='b91ffdee'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='status0' type-id='811c9dc5' visibility='default'/>
       </data-member>
@@ -42,7 +42,7 @@
         <var-decl name='status1' type-id='811c9dc5' visibility='default'/>
       </data-member>
     </class-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='f0981eeb'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='f0981eeb'/>
     <pointer-type-def type-id='50d9a3fa' size-in-bits='64' alignment-in-bits='64' id='fd01f598'/>
     <pointer-type-def type-id='a84c031d' size-in-bits='64' alignment-in-bits='64' id='26a90f95'/>
     <qualified-type-def type-id='50d9a3fa' const='yes' id='0fb3b55d'/>
@@ -53,11 +53,11 @@
     <var-decl name='test_pointer' type-id='26a90f95' mangled-name='test_pointer' visibility='default' elf-symbol-id='test_pointer'/>
     <var-decl name='test_const' type-id='0fb3b55d' mangled-name='test_const' visibility='default' elf-symbol-id='test_const'/>
     <var-decl name='test_float' type-id='a6c45d85' mangled-name='test_float' visibility='default' elf-symbol-id='test_float'/>
-    <function-decl name='foo_1' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo_1'>
+    <function-decl name='foo_1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo_1'>
       <parameter type-id='fd01f598'/>
       <return type-id='95e97e5e'/>
     </function-decl>
-    <function-decl name='main' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='main'>
+    <function-decl name='main' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='main'>
       <return type-id='95e97e5e'/>
     </function-decl>
     <var-decl name='test_array' type-id='b7bd1749' mangled-name='test_array' visibility='default' elf-symbol-id='test_array'/>
diff --git a/tests/data/test-read-ctf/test1.so.abi b/tests/data/test-read-ctf/test1.so.abi
index 4d0895a3..822b57a5 100644
--- a/tests/data/test-read-ctf/test1.so.abi
+++ b/tests/data/test-read-ctf/test1.so.abi
@@ -12,7 +12,7 @@
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
-    <class-decl name='opaque_struct' size-in-bits='32' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-3'>
+    <class-decl name='opaque_struct' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-3'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='type-id-4' visibility='default'/>
       </data-member>
@@ -21,7 +21,7 @@
     <typedef-decl name='opaque_struct' type-id='type-id-3' id='type-id-5'/>
     <pointer-type-def type-id='type-id-4' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
     <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
-    <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='fn'>
+    <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fn'>
       <parameter type-id='type-id-7'/>
       <parameter type-id='type-id-6'/>
       <return type-id='type-id-8'/>
diff --git a/tests/data/test-read-ctf/test1.so.hash.abi b/tests/data/test-read-ctf/test1.so.hash.abi
index 89bbb528..b3ace158 100644
--- a/tests/data/test-read-ctf/test1.so.hash.abi
+++ b/tests/data/test-read-ctf/test1.so.hash.abi
@@ -12,7 +12,7 @@
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
-    <class-decl name='opaque_struct' size-in-bits='32' alignment-in-bits='32' is-struct='yes' visibility='default' id='6cde5052'>
+    <class-decl name='opaque_struct' size-in-bits='32' is-struct='yes' visibility='default' id='6cde5052'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='99fcd3a5' visibility='default'/>
       </data-member>
@@ -21,7 +21,7 @@
     <typedef-decl name='opaque_struct' type-id='6cde5052' id='dae69ca1'/>
     <pointer-type-def type-id='99fcd3a5' size-in-bits='64' alignment-in-bits='64' id='0e0526e0'/>
     <pointer-type-def type-id='dae69ca1' size-in-bits='64' alignment-in-bits='64' id='3f6e71d0'/>
-    <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='fn'>
+    <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fn'>
       <parameter type-id='3f6e71d0'/>
       <parameter type-id='0e0526e0'/>
       <return type-id='48b5725f'/>
diff --git a/tests/data/test-read-ctf/test2.so.abi b/tests/data/test-read-ctf/test2.so.abi
index 53001972..f2fb069d 100644
--- a/tests/data/test-read-ctf/test2.so.abi
+++ b/tests/data/test-read-ctf/test2.so.abi
@@ -7,12 +7,12 @@
     <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <class-decl name='S0' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-1'>
+    <class-decl name='S0' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-1'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='type-id-2' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='S1' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-3'>
+    <class-decl name='S1' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-3'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='type-id-4' visibility='default'/>
       </data-member>
@@ -23,11 +23,11 @@
     <qualified-type-def type-id='type-id-8' const='yes' id='type-id-9'/>
     <pointer-type-def type-id='type-id-9' size-in-bits='64' alignment-in-bits='64' id='type-id-5'/>
     <pointer-type-def type-id='type-id-8' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
-    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='bar'>
+    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar'>
       <parameter type-id='type-id-7'/>
       <return type-id='type-id-8'/>
     </function-decl>
-    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo'>
+    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
       <parameter type-id='type-id-6'/>
       <return type-id='type-id-8'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test2.so.hash.abi b/tests/data/test-read-ctf/test2.so.hash.abi
index 84fcaa96..1efd533a 100644
--- a/tests/data/test-read-ctf/test2.so.hash.abi
+++ b/tests/data/test-read-ctf/test2.so.hash.abi
@@ -7,12 +7,12 @@
     <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <class-decl name='S0' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='109cd6fe'>
+    <class-decl name='S0' size-in-bits='64' is-struct='yes' visibility='default' id='109cd6fe'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='eaa32e2f' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='S1' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='119cd891'>
+    <class-decl name='S1' size-in-bits='64' is-struct='yes' visibility='default' id='119cd891'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='8a34a235' visibility='default'/>
       </data-member>
@@ -23,11 +23,11 @@
     <qualified-type-def type-id='48b5725f' const='yes' id='8581546e'/>
     <pointer-type-def type-id='8581546e' size-in-bits='64' alignment-in-bits='64' id='6e97a70c'/>
     <pointer-type-def type-id='48b5725f' size-in-bits='64' alignment-in-bits='64' id='eaa32e2f'/>
-    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='bar'>
+    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar'>
       <parameter type-id='5e30a4f9'/>
       <return type-id='48b5725f'/>
     </function-decl>
-    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo'>
+    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
       <parameter type-id='842ea234'/>
       <return type-id='48b5725f'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test3.so.abi b/tests/data/test-read-ctf/test3.so.abi
index 25fe7685..8e2492f3 100644
--- a/tests/data/test-read-ctf/test3.so.abi
+++ b/tests/data/test-read-ctf/test3.so.abi
@@ -11,7 +11,7 @@
     <elf-symbol name='foo__' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <function-decl name='__foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='__foo'>
+    <function-decl name='__foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__foo'>
       <return type-id='type-id-1'/>
     </function-decl>
     <type-decl name='void' id='type-id-1'/>
diff --git a/tests/data/test-read-ctf/test3.so.hash.abi b/tests/data/test-read-ctf/test3.so.hash.abi
index 07dd9601..f991d33a 100644
--- a/tests/data/test-read-ctf/test3.so.hash.abi
+++ b/tests/data/test-read-ctf/test3.so.hash.abi
@@ -11,7 +11,7 @@
     <elf-symbol name='foo__' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <function-decl name='__foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='__foo'>
+    <function-decl name='__foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__foo'>
       <return type-id='48b5725f'/>
     </function-decl>
     <type-decl name='void' id='48b5725f'/>
diff --git a/tests/data/test-read-ctf/test4.so.abi b/tests/data/test-read-ctf/test4.so.abi
index 21241d30..9f4e9255 100644
--- a/tests/data/test-read-ctf/test4.so.abi
+++ b/tests/data/test-read-ctf/test4.so.abi
@@ -6,14 +6,14 @@
     <elf-symbol name='cpy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='type-id-1'/>
-    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='type-id-2'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-2'/>
     <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-3'/>
     <qualified-type-def type-id='type-id-3' restrict='yes' id='type-id-4'/>
     <qualified-type-def type-id='type-id-1' const='yes' id='type-id-5'/>
     <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
     <qualified-type-def type-id='type-id-6' restrict='yes' id='type-id-7'/>
-    <function-decl name='cpy' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='cpy'>
+    <function-decl name='cpy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpy'>
       <parameter type-id='type-id-4'/>
       <parameter type-id='type-id-7'/>
       <parameter type-id='type-id-2'/>
diff --git a/tests/data/test-read-ctf/test4.so.hash.abi b/tests/data/test-read-ctf/test4.so.hash.abi
index 40ab7069..1e952c75 100644
--- a/tests/data/test-read-ctf/test4.so.hash.abi
+++ b/tests/data/test-read-ctf/test4.so.hash.abi
@@ -6,14 +6,14 @@
     <elf-symbol name='cpy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='a84c031d'/>
-    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='f0981eeb'/>
+    <type-decl name='char' size-in-bits='8' id='a84c031d'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='f0981eeb'/>
     <pointer-type-def type-id='a84c031d' size-in-bits='64' alignment-in-bits='64' id='26a90f95'/>
     <qualified-type-def type-id='26a90f95' restrict='yes' id='266fe297'/>
     <qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/>
     <pointer-type-def type-id='9b45d938' size-in-bits='64' alignment-in-bits='64' id='80f4b756'/>
     <qualified-type-def type-id='80f4b756' restrict='yes' id='9d26089a'/>
-    <function-decl name='cpy' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='cpy'>
+    <function-decl name='cpy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpy'>
       <parameter type-id='266fe297'/>
       <parameter type-id='9d26089a'/>
       <parameter type-id='f0981eeb'/>
diff --git a/tests/data/test-read-ctf/test5.o.abi b/tests/data/test-read-ctf/test5.o.abi
index 84eb34d7..6d72d7ab 100644
--- a/tests/data/test-read-ctf/test5.o.abi
+++ b/tests/data/test-read-ctf/test5.o.abi
@@ -8,39 +8,39 @@
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
     <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='type-id-2'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-2'/>
     <enum-decl name='E' linkage-name='E' id='type-id-3'>
       <underlying-type type-id='type-id-1'/>
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-4'/>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-5'/>
-    <type-decl name='long long int' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-5'/>
+    <type-decl name='long long int' size-in-bits='64' id='type-id-6'/>
     <typedef-decl name='long_long' type-id='type-id-6' id='type-id-7'/>
     <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
     <qualified-type-def type-id='type-id-4' const='yes' id='type-id-9'/>
     <qualified-type-def type-id='type-id-5' const='yes' id='type-id-10'/>
     <qualified-type-def type-id='type-id-10' volatile='yes' id='type-id-11'/>
-    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo'>
+    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
       <parameter type-id='type-id-8'/>
       <parameter type-id='type-id-11'/>
       <return type-id='type-id-5'/>
     </function-decl>
-    <function-decl name='baz2' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='baz2'>
+    <function-decl name='baz2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='baz2'>
       <parameter type-id='type-id-4'/>
       <return type-id='type-id-7'/>
     </function-decl>
-    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='bar'>
+    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar'>
       <parameter type-id='type-id-9'/>
       <parameter is-variadic='yes'/>
       <return type-id='type-id-12'/>
     </function-decl>
-    <function-decl name='bar2' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='bar2'>
+    <function-decl name='bar2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar2'>
       <parameter type-id='type-id-3'/>
       <return type-id='type-id-12'/>
     </function-decl>
-    <function-decl name='baz' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='baz'>
+    <function-decl name='baz' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='baz'>
       <parameter type-id='type-id-4'/>
       <return type-id='type-id-12'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test7.o.abi b/tests/data/test-read-ctf/test7.o.abi
index 85468e11..65371cf5 100644
--- a/tests/data/test-read-ctf/test7.o.abi
+++ b/tests/data/test-read-ctf/test7.o.abi
@@ -3,8 +3,8 @@
     <elf-symbol name='first_type_constructor' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <class-decl name='first_type' size-in-bits='128' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-2'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <class-decl name='first_type' size-in-bits='128' is-struct='yes' visibility='default' id='type-id-2'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='member0' type-id='type-id-3' visibility='default'/>
       </data-member>
@@ -18,16 +18,16 @@
     <typedef-decl name='character' type-id='type-id-6' id='type-id-4'/>
     <typedef-decl name='constructor' type-id='type-id-7' id='type-id-5'/>
     <typedef-decl name='integer' type-id='type-id-1' id='type-id-3'/>
-    <type-decl name='unsigned char' size-in-bits='8' alignment-in-bits='8' id='type-id-6'/>
+    <type-decl name='unsigned char' size-in-bits='8' id='type-id-6'/>
     <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
     <pointer-type-def type-id='type-id-9' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
-    <function-decl name='first_type_constructor' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='first_type_constructor'>
+    <function-decl name='first_type_constructor' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='first_type_constructor'>
       <parameter type-id='type-id-8'/>
       <return type-id='type-id-10'/>
     </function-decl>
     <type-decl name='variadic parameter type' id='type-id-11'/>
     <type-decl name='void' id='type-id-10'/>
-    <function-type size-in-bits='64' alignment-in-bits='8' id='type-id-9'>
+    <function-type size-in-bits='64' id='type-id-9'>
       <parameter is-variadic='yes'/>
       <return type-id='type-id-10'/>
     </function-type>
diff --git a/tests/data/test-read-ctf/test8.o.abi b/tests/data/test-read-ctf/test8.o.abi
index b6996c29..430bc128 100644
--- a/tests/data/test-read-ctf/test8.o.abi
+++ b/tests/data/test-read-ctf/test8.o.abi
@@ -4,7 +4,7 @@
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
     <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
-    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='bar'>
+    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar'>
       <parameter type-id='type-id-2'/>
       <return type-id='type-id-1'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test9.o.abi b/tests/data/test-read-ctf/test9.o.abi
index c983d17f..331bfc70 100644
--- a/tests/data/test-read-ctf/test9.o.abi
+++ b/tests/data/test-read-ctf/test9.o.abi
@@ -3,31 +3,31 @@
     <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='type-id-1'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
     <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='448' alignment-in-bits='64' id='type-id-3'>
       <subrange length='7' type-id='type-id-4' id='type-id-5'/>
     </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='infinite' alignment-in-bits='8' id='type-id-6'>
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='infinite' id='type-id-6'>
       <subrange length='infinite' type-id='type-id-4' id='type-id-7'/>
     </array-type-def>
-    <type-decl name='double' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
-    <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='320' alignment-in-bits='64' id='type-id-9'>
+    <type-decl name='double' size-in-bits='64' id='type-id-8'/>
+    <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='320' id='type-id-9'>
       <subrange length='5' type-id='type-id-4' id='type-id-10'/>
     </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-9' size-in-bits='960' alignment-in-bits='64' id='type-id-11'>
+    <array-type-def dimensions='1' type-id='type-id-9' size-in-bits='960' id='type-id-11'>
       <subrange length='3' type-id='type-id-4' id='type-id-12'/>
     </array-type-def>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-13'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-13'/>
     <array-type-def dimensions='1' type-id='type-id-14' size-in-bits='256' alignment-in-bits='64' id='type-id-15'>
       <subrange length='4' type-id='type-id-4' id='type-id-16'/>
     </array-type-def>
     <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='640' alignment-in-bits='64' id='type-id-18'>
       <subrange length='10' type-id='type-id-4' id='type-id-19'/>
     </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-13' size-in-bits='160' alignment-in-bits='32' id='type-id-20'>
+    <array-type-def dimensions='1' type-id='type-id-13' size-in-bits='160' id='type-id-20'>
       <subrange length='5' type-id='type-id-4' id='type-id-10'/>
     </array-type-def>
-    <class-decl name='S' size-in-bits='2304' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-21'>
+    <class-decl name='S' size-in-bits='2304' is-struct='yes' visibility='default' id='type-id-21'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='a' type-id='type-id-20' visibility='default'/>
       </data-member>
@@ -44,12 +44,12 @@
         <var-decl name='e' type-id='type-id-6' visibility='default'/>
       </data-member>
     </class-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-4'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-4'/>
     <pointer-type-def type-id='type-id-21' size-in-bits='64' alignment-in-bits='64' id='type-id-22'/>
     <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
     <pointer-type-def type-id='type-id-13' size-in-bits='64' alignment-in-bits='64' id='type-id-14'/>
     <pointer-type-def type-id='type-id-15' size-in-bits='64' alignment-in-bits='64' id='type-id-17'/>
-    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo'>
+    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
       <parameter type-id='type-id-22'/>
       <return type-id='type-id-13'/>
     </function-decl>
-- 
2.35.1


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 2/5] ctf-front-end: Fix size and name for underlying types
  2022-11-17  3:43 [PATCH 0/5] CTF front-end Bug Fixing and improvement Guillermo E. Martinez
  2022-11-17  3:43 ` [PATCH 1/5] ctf-front-end: Set alignment-in-bits property to 0 Guillermo E. Martinez
@ 2022-11-17  3:43 ` Guillermo E. Martinez
  2022-11-29 11:53   ` Dodji Seketeli
  2022-11-17  3:43 ` [PATCH 3/5] ctf-front-end: Strip qualification from a qualified array type Guillermo E. Martinez
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 16+ messages in thread
From: Guillermo E. Martinez @ 2022-11-17  3:43 UTC (permalink / raw)
  To: libabigail; +Cc: Guillermo E. Martinez

It fixed an incorrect representation in size and name for underlying
enum and struct types when it has a bitfield members:

    struct foo
    {
      unsigned bar : 2;
      unsigned baz : 1;
    };

  <type-decl name='' is-anonymous='yes' size-in-bits='2' id='type-id-1'/>

So, `name' empty property, no showing the right enumerator's type and size
in bits:

  <type-decl name='unsigned char' size-in-bits='8' id='type-id-4'/>

	* src/abg-ctf-reader.cc (process_ctf_{base_type,enum_type}):
	Look at ctf refence type to build the underlying type if present.
	* tests/data/Makefile.am: New test cases.
	* tests/data/test-read-ctf/PR27700/test-PR27700.abi: New test input.
	* tests/data/test-read-ctf/test-bitfield-enum.abi: Likewise.
	* tests/data/test-read-ctf/test-bitfield-enum.c: Likewise.
	* tests/data/test-read-ctf/test-bitfield-enum.o: Likewise.
	* tests/data/test-read-ctf/test-bitfield.abi: Likewise.
	* tests/data/test-read-ctf/test-bitfield.c: Likewise.
	* tests/data/test-read-ctf/test-bitfield.o: Likewise.
	* tests/data/test-read-ctf/test-enum-many.o.hash.abi: Adjust.
	* tests/data/test-read-ctf/test-enum-symbol.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-enum.o.abi: Likewise:
	* tests/data/test-read-ctf/test0.abi: Likewise.
	* tests/data/test-read-ctf/test0.hash.abi: Likewise.
	* tests/data/test-read-ctf/test1.so.abi: Likewise.
	* tests/data/test-read-ctf/test1.so.hash.abi: Likewise.
	* tests/data/test-read-ctf/test5.o.abi: Likewise.
	* tests/test-read-ctf.cc: Update test suite.

Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
---
 src/abg-ctf-reader.cc                         |  31 +++++++----
 tests/data/Makefile.am                        |   6 +++
 .../test-read-ctf/PR27700/test-PR27700.abi    |   4 +-
 .../data/test-read-ctf/test-bitfield-enum.abi |  18 +++++++
 tests/data/test-read-ctf/test-bitfield-enum.c |  12 +++++
 tests/data/test-read-ctf/test-bitfield-enum.o | Bin 0 -> 1336 bytes
 tests/data/test-read-ctf/test-bitfield.abi    |  28 ++++++++++
 tests/data/test-read-ctf/test-bitfield.c      |  15 ++++++
 tests/data/test-read-ctf/test-bitfield.o      | Bin 0 -> 1488 bytes
 .../test-read-ctf/test-enum-many.o.hash.abi   |   6 +--
 .../test-read-ctf/test-enum-symbol.o.hash.abi |   4 +-
 tests/data/test-read-ctf/test-enum.o.abi      |  10 ++--
 tests/data/test-read-ctf/test0.abi            |  48 +++++++++---------
 tests/data/test-read-ctf/test0.hash.abi       |  10 ++--
 tests/data/test-read-ctf/test1.so.abi         |   8 +--
 tests/data/test-read-ctf/test1.so.hash.abi    |   4 +-
 tests/data/test-read-ctf/test5.o.abi          |  12 ++---
 tests/test-read-ctf.cc                        |  18 +++++++
 18 files changed, 171 insertions(+), 63 deletions(-)
 create mode 100644 tests/data/test-read-ctf/test-bitfield-enum.abi
 create mode 100644 tests/data/test-read-ctf/test-bitfield-enum.c
 create mode 100644 tests/data/test-read-ctf/test-bitfield-enum.o
 create mode 100644 tests/data/test-read-ctf/test-bitfield.abi
 create mode 100644 tests/data/test-read-ctf/test-bitfield.c
 create mode 100644 tests/data/test-read-ctf/test-bitfield.o

diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc
index 9c41edf4..feafc91d 100644
--- a/src/abg-ctf-reader.cc
+++ b/src/abg-ctf-reader.cc
@@ -788,15 +788,17 @@ process_ctf_base_type(reader *rdr,
   translation_unit_sptr tunit = rdr->cur_transl_unit();
   type_decl_sptr result;
 
-  const char *type_name = ctf_type_name_raw(ctf_dictionary, ctf_type);
+  ctf_id_t ctf_ref = ctf_type_reference(ctf_dictionary, ctf_type);
+  const char *type_name = ctf_type_name_raw(ctf_dictionary,
+                                            (ctf_ref != CTF_ERR) ? ctf_ref : ctf_type);
 
   /* Get the type encoding and extract some useful properties of
      the type from it.  In case of any error, just ignore the
      type.  */
   ctf_encoding_t type_encoding;
   if (ctf_type_encoding(ctf_dictionary,
-                         ctf_type,
-                         &type_encoding))
+                        (ctf_ref != CTF_ERR) ? ctf_ref : ctf_type,
+                        &type_encoding))
     return result;
 
   /* Create the IR type corresponding to the CTF type.  */
@@ -1369,7 +1371,10 @@ process_ctf_enum_type(reader *rdr,
 {
   translation_unit_sptr tunit = rdr->cur_transl_unit();
   enum_type_decl_sptr result;
-  std::string enum_name = ctf_type_name_raw(ctf_dictionary, ctf_type);
+  ctf_id_t ctf_ref = ctf_type_reference(ctf_dictionary, ctf_type);
+  std::string enum_name = ctf_type_name_raw(ctf_dictionary,
+                                            (ctf_ref != CTF_ERR)
+                                              ? ctf_ref : ctf_type);
 
   if (!enum_name.empty())
     if (corpus_sptr corp = rdr->should_reuse_type_from_corpus_group())
@@ -1379,18 +1384,24 @@ process_ctf_enum_type(reader *rdr,
   /* Build a signed integral type for the type of the enumerators, aka
      the underlying type.  The size of the enumerators in bytes is
      specified in the CTF enumeration type.  */
-  size_t utype_size_in_bits = ctf_type_size(ctf_dictionary, ctf_type) * 8;
-  type_decl_sptr utype;
+  size_t utype_size_in_bits = ctf_type_size(ctf_dictionary,
+                                            (ctf_ref != CTF_ERR)
+                                              ? ctf_ref : ctf_type) * 8;
+  string underlying_type_name =
+        build_internal_underlying_enum_type_name(enum_name, true,
+                                                 utype_size_in_bits);
 
+  type_decl_sptr utype;
   utype.reset(new type_decl(rdr->env(),
-                              "",
-                              utype_size_in_bits,
-                              utype_size_in_bits,
-                              location()));
+                            underlying_type_name,
+                            utype_size_in_bits,
+                            utype_size_in_bits,
+                            location()));
   utype->set_is_anonymous(true);
   utype->set_is_artificial(true);
   if (!utype)
     return result;
+
   add_decl_to_scope(utype, tunit->get_global_scope());
   canonicalize(utype);
 
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 4b6e9305..b89a4dd8 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -704,6 +704,12 @@ test-read-ctf/test-linux-module.ko		\
 test-read-ctf/test-fallback.abi		\
 test-read-ctf/test-fallback.c		\
 test-read-ctf/test-fallback.o		\
+test-read-ctf/test-bitfield.abi		\
+test-read-ctf/test-bitfield.c		\
+test-read-ctf/test-bitfield.o		\
+test-read-ctf/test-bitfield-enum.abi	\
+test-read-ctf/test-bitfield-enum.c	\
+test-read-ctf/test-bitfield-enum.o	\
 \
 test-annotate/test0.abi			\
 test-annotate/test1.abi			\
diff --git a/tests/data/test-read-ctf/PR27700/test-PR27700.abi b/tests/data/test-read-ctf/PR27700/test-PR27700.abi
index 4f34eb8a..1a7c229e 100644
--- a/tests/data/test-read-ctf/PR27700/test-PR27700.abi
+++ b/tests/data/test-read-ctf/PR27700/test-PR27700.abi
@@ -3,14 +3,14 @@
     <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='811c9dc5'/>
     <enum-decl name='foo' linkage-name='foo' id='022218d8'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='foo_e0' value='0'/>
       <enumerator name='foo_e1' value='1'/>
       <enumerator name='foo_e2' value='2'/>
       <enumerator name='foo_e3' value='3'/>
     </enum-decl>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
     <pointer-type-def type-id='022218d8' size-in-bits='64' alignment-in-bits='64' id='8750e847'/>
     <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
       <parameter type-id='8750e847'/>
diff --git a/tests/data/test-read-ctf/test-bitfield-enum.abi b/tests/data/test-read-ctf/test-bitfield-enum.abi
new file mode 100644
index 00000000..b95f1781
--- /dev/null
+++ b/tests/data/test-read-ctf/test-bitfield-enum.abi
@@ -0,0 +1,18 @@
+<abi-corpus version='2.1' path='data/test-read-ctf/test-bitfield-enum.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='e' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr address-size='64' language='LANG_C'>
+    <enum-decl name='event_kind' linkage-name='event_kind' id='type-id-1'>
+      <underlying-type type-id='type-id-2'/>
+      <enumerator name='NO_EVENT' value='0'/>
+    </enum-decl>
+    <class-decl name='input' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='kind' type-id='type-id-1' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-2'/>
+    <var-decl name='e' type-id='type-id-3' mangled-name='e' visibility='default' elf-symbol-id='e'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-bitfield-enum.c b/tests/data/test-read-ctf/test-bitfield-enum.c
new file mode 100644
index 00000000..502ec06a
--- /dev/null
+++ b/tests/data/test-read-ctf/test-bitfield-enum.c
@@ -0,0 +1,12 @@
+/* gcc -gctf -c test-bitfield-enum.c -o test-bitfield-enum.o */
+enum event_kind
+{
+  NO_EVENT,
+};
+
+struct input
+{
+  enum event_kind kind : 16;
+};
+
+struct input e;
diff --git a/tests/data/test-read-ctf/test-bitfield-enum.o b/tests/data/test-read-ctf/test-bitfield-enum.o
new file mode 100644
index 0000000000000000000000000000000000000000..2c532f50c724f7bf4327b7c36699a432ca08eab1
GIT binary patch
literal 1336
zcmbVL&2G~`5T1lkeh>7}s)CE@g;e0R6E4sLvQ&j4gu(@SLuGAm(^c(tWN#ojAvp0!
z9C;I-0bT%R?A>IwlnWz$p1<!~?~LqElUL9Cy&hQW!86!owhFN9Z{nm46SxI8;n$DB
zx)W_EFu<5_-QW)T_lPfuD~Qm5VtOB9pZK>CWILVPqFR91M<C}e<wFD+#m1h{CFmRg
ze3SSfls>(XDu?Oo)5*zX`UV!NkuxRoKq?JV%@-P4f`I6}Dn*p8(p6N|JS#-h)LB%>
zl&5mWWf3azG18*ZO_X!Z+c2yJ&%;cgby+I)nG{7H3biO%25@|IbQlber*98}(PI{~
zI2gy{@n{r34TfSl7qu+$io7^zuZ#~n=T(eR27Ty#cjm*{y1bjws{Z!WAHdJwerFd8
z+wJDN&iZT`EcEX$09dmsHBZs&y7T8Y(qgHB(Jp|cO#=+~fRC!AnSiNE3x+d<jpo^f
z$!BW8=5>XW>y>}E|H<#6h-TgL#EF;N)Zg2EY*3B9Ki3jBabjQp0DJUp|4YB#uQ|id
zA7R};lc)(j(00A1m%<1+REvr1*oh%NbZQh@z4eDq&82>}1h;qz_a)Y@A?Uwz?W@uI
y_o7|7Ml@eb{clG9!jNwmp4IO;b$|D5%N%NXhQ6NP=Gz!trr$IAca~_pzm`9z|8lDU

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test-bitfield.abi b/tests/data/test-read-ctf/test-bitfield.abi
new file mode 100644
index 00000000..4231ba3e
--- /dev/null
+++ b/tests/data/test-read-ctf/test-bitfield.abi
@@ -0,0 +1,28 @@
+<abi-corpus version='2.1' path='data/test-read-ctf/test-bitfield.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='f' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='fb' size='1' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr address-size='64' language='LANG_C'>
+    <class-decl name='foo' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='bar' type-id='type-id-2' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='2'>
+        <var-decl name='baz' type-id='type-id-2' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <class-decl name='foobar' size-in-bits='8' is-struct='yes' visibility='default' id='type-id-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='bar' type-id='type-id-4' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='2'>
+        <var-decl name='baz' type-id='type-id-4' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='unsigned char' size-in-bits='8' id='type-id-4'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-2'/>
+    <var-decl name='f' type-id='type-id-1' mangled-name='f' visibility='default' elf-symbol-id='f'/>
+    <var-decl name='fb' type-id='type-id-3' mangled-name='fb' visibility='default' elf-symbol-id='fb'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-bitfield.c b/tests/data/test-read-ctf/test-bitfield.c
new file mode 100644
index 00000000..7d76d2f4
--- /dev/null
+++ b/tests/data/test-read-ctf/test-bitfield.c
@@ -0,0 +1,15 @@
+/* gcc -gctf -c test-bitfield.c -o test-bitfield.o */
+struct foo
+{
+  unsigned bar : 2;
+  unsigned baz : 1;
+};
+
+struct foobar 
+{
+  unsigned char bar : 2;
+  unsigned char baz : 1;
+};
+
+struct foo f;
+struct foobar fb;
diff --git a/tests/data/test-read-ctf/test-bitfield.o b/tests/data/test-read-ctf/test-bitfield.o
new file mode 100644
index 0000000000000000000000000000000000000000..c23c8188d880587f2ba78b8b852cdb067607e4b6
GIT binary patch
literal 1488
zcmbVM&2G~`5FVEh3S3$$Arvm|iB=FhNe{FYLXj${gb+85NZ8IMu}JL7-in3`cOC%o
z6g&e@fw=Ju@B%QOcgI<lp93S!&dm4CjCUs8zJ2uc@kS7kNI(y19SKUbb!qL78+T0C
z=^B0i+Sw51fjDe8t!}Y}hOA#$-?3h1#W#*v?^~5vIBweOFn5C$g3sS%#m9gnkEIJg
zglFUseawa0YdKgzJ;V2q7n>To!uG)6&AoRG-bD`2A&r_o-G&p09E`K4Wl85nozDt2
z3G+fznpCWBK)`LeY~B!-q-jd=yj-d{U8SqItdeY@;=0P>MV=;UK1=dNzfiAZt!iDz
zlSC(t+pknI>1TRsqBPgjTrDP1Ms#{|avbiRK6}0&4iBP1Gzdq7(P%gv9EE%8;!IWf
zQWZK`?3+=|PD2i`S1#kBgHPD4NMK{^<X-~5L*IV*Iok|uH@~7`r1y@+C2sp;*1j{+
z6kDRGUM+Q!velKbbMdsg&=g@g6s2`d5if?1a*0VPDoU*)o~&Q%BztA!S#chnRVD93
zulyVTUwoU(FoXF!S@#&P-Cw+RUW@Ls1?D`rh8Z{K?}uN1hg0zO{#I|_P1{KJF2Fr@
z{GQ;(I9T3$q!-eVbASzy?8s-Ec-O(;O1;=)2Xj+{_Q|>Ex?a#H?BG57>6;et?}c5t
yf_wP2;14bM5&_FqRzOmJ3m^+{fA_#Y*n0dAb4BJB4DaMm^&f5h3rV!rum1@|M0T$L

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test-enum-many.o.hash.abi b/tests/data/test-read-ctf/test-enum-many.o.hash.abi
index 116325f9..9119525b 100644
--- a/tests/data/test-read-ctf/test-enum-many.o.hash.abi
+++ b/tests/data/test-read-ctf/test-enum-many.o.hash.abi
@@ -4,14 +4,13 @@
     <elf-symbol name='foo' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='811c9dc5'/>
     <enum-decl name='e' linkage-name='e' id='a6c2eddf'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='ENUMSAMPLE_1' value='0'/>
       <enumerator name='ENUMSAMPLE_2' value='1'/>
     </enum-decl>
     <enum-decl name='ie' linkage-name='ie' id='1ee696ca'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='IE_0' value='-10'/>
       <enumerator name='IE_1' value='-9'/>
       <enumerator name='IE_2' value='-8'/>
@@ -61,6 +60,7 @@
       <enumerator name='IE_2E' value='36'/>
       <enumerator name='IE_2F' value='37'/>
     </enum-decl>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
     <var-decl name='foo' type-id='a6c2eddf' mangled-name='foo' visibility='default' elf-symbol-id='foo'/>
     <var-decl name='bar' type-id='1ee696ca' mangled-name='bar' visibility='default' elf-symbol-id='bar'/>
   </abi-instr>
diff --git a/tests/data/test-read-ctf/test-enum-symbol.o.hash.abi b/tests/data/test-read-ctf/test-enum-symbol.o.hash.abi
index f4911bc4..da68828c 100644
--- a/tests/data/test-read-ctf/test-enum-symbol.o.hash.abi
+++ b/tests/data/test-read-ctf/test-enum-symbol.o.hash.abi
@@ -3,13 +3,13 @@
     <elf-symbol name='primary1' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='811c9dc5'/>
     <enum-decl name='' is-anonymous='yes' id='08f5ca17'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='red1' value='0'/>
       <enumerator name='green1' value='1'/>
       <enumerator name='blue1' value='2'/>
     </enum-decl>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
     <var-decl name='primary1' type-id='08f5ca17' mangled-name='primary1' visibility='default' elf-symbol-id='primary1'/>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/data/test-read-ctf/test-enum.o.abi b/tests/data/test-read-ctf/test-enum.o.abi
index bd3a55be..e13ebdd0 100644
--- a/tests/data/test-read-ctf/test-enum.o.abi
+++ b/tests/data/test-read-ctf/test-enum.o.abi
@@ -4,19 +4,19 @@
     <elf-symbol name='foo' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <enum-decl name='e' linkage-name='e' id='type-id-2'>
-      <underlying-type type-id='type-id-1'/>
+    <enum-decl name='e' linkage-name='e' id='type-id-1'>
+      <underlying-type type-id='type-id-2'/>
       <enumerator name='ENUMSAMPLE_1' value='0'/>
       <enumerator name='ENUMSAMPLE_2' value='1'/>
     </enum-decl>
     <enum-decl name='ie' linkage-name='ie' id='type-id-3'>
-      <underlying-type type-id='type-id-1'/>
+      <underlying-type type-id='type-id-2'/>
       <enumerator name='IENUMSAMPLE_1' value='-10'/>
       <enumerator name='IENUMSAMPLE_2' value='-9'/>
       <enumerator name='IENUMSAMPLE_3' value='-8'/>
     </enum-decl>
-    <var-decl name='foo' type-id='type-id-2' mangled-name='foo' visibility='default' elf-symbol-id='foo'/>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-2'/>
+    <var-decl name='foo' type-id='type-id-1' mangled-name='foo' visibility='default' elf-symbol-id='foo'/>
     <var-decl name='bar' type-id='type-id-3' mangled-name='bar' visibility='default' elf-symbol-id='bar'/>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/data/test-read-ctf/test0.abi b/tests/data/test-read-ctf/test0.abi
index 05430067..60d3cf1e 100644
--- a/tests/data/test-read-ctf/test0.abi
+++ b/tests/data/test-read-ctf/test0.abi
@@ -20,47 +20,47 @@
     <elf-symbol name='test_volatile' size='2' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='1' id='type-id-1'/>
-    <type-decl name='char' size-in-bits='8' id='type-id-2'/>
-    <type-decl name='float' size-in-bits='32' id='type-id-3'/>
-    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
-    <array-type-def dimensions='1' type-id='type-id-4' size-in-bits='320' id='type-id-5'>
-      <subrange length='10' type-id='type-id-6' id='type-id-7'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <type-decl name='float' size-in-bits='32' id='type-id-2'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-3'/>
+    <array-type-def dimensions='1' type-id='type-id-3' size-in-bits='320' id='type-id-4'>
+      <subrange length='10' type-id='type-id-5' id='type-id-6'/>
     </array-type-def>
-    <type-decl name='long int' size-in-bits='64' id='type-id-8'/>
-    <type-decl name='short int' size-in-bits='16' id='type-id-9'/>
-    <class-decl name='S' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-10'>
+    <type-decl name='long int' size-in-bits='64' id='type-id-7'/>
+    <type-decl name='short int' size-in-bits='16' id='type-id-8'/>
+    <class-decl name='S' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-9'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='m0' type-id='type-id-4' visibility='default'/>
+        <var-decl name='m0' type-id='type-id-3' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-11'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-10'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='status0' type-id='type-id-1' visibility='default'/>
+        <var-decl name='status0' type-id='type-id-11' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='1'>
-        <var-decl name='status1' type-id='type-id-1' visibility='default'/>
+        <var-decl name='status1' type-id='type-id-11' visibility='default'/>
       </data-member>
     </class-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-6'/>
-    <pointer-type-def type-id='type-id-10' size-in-bits='64' alignment-in-bits='64' id='type-id-12'/>
-    <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-13'/>
-    <qualified-type-def type-id='type-id-10' const='yes' id='type-id-14'/>
-    <pointer-type-def type-id='type-id-8' size-in-bits='64' alignment-in-bits='64' id='type-id-15'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-11'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-5'/>
+    <pointer-type-def type-id='type-id-9' size-in-bits='64' alignment-in-bits='64' id='type-id-12'/>
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-13'/>
+    <qualified-type-def type-id='type-id-9' const='yes' id='type-id-14'/>
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' alignment-in-bits='64' id='type-id-15'/>
     <qualified-type-def type-id='type-id-15' restrict='yes' id='type-id-16'/>
-    <qualified-type-def type-id='type-id-9' volatile='yes' id='type-id-17'/>
-    <var-decl name='status' type-id='type-id-11' mangled-name='status' visibility='default' elf-symbol-id='status'/>
+    <qualified-type-def type-id='type-id-8' volatile='yes' id='type-id-17'/>
+    <var-decl name='status' type-id='type-id-10' mangled-name='status' visibility='default' elf-symbol-id='status'/>
     <var-decl name='test_pointer' type-id='type-id-13' mangled-name='test_pointer' visibility='default' elf-symbol-id='test_pointer'/>
     <var-decl name='test_const' type-id='type-id-14' mangled-name='test_const' visibility='default' elf-symbol-id='test_const'/>
-    <var-decl name='test_float' type-id='type-id-3' mangled-name='test_float' visibility='default' elf-symbol-id='test_float'/>
+    <var-decl name='test_float' type-id='type-id-2' mangled-name='test_float' visibility='default' elf-symbol-id='test_float'/>
     <function-decl name='foo_1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo_1'>
       <parameter type-id='type-id-12'/>
-      <return type-id='type-id-4'/>
+      <return type-id='type-id-3'/>
     </function-decl>
     <function-decl name='main' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='main'>
-      <return type-id='type-id-4'/>
+      <return type-id='type-id-3'/>
     </function-decl>
-    <var-decl name='test_array' type-id='type-id-5' mangled-name='test_array' visibility='default' elf-symbol-id='test_array'/>
+    <var-decl name='test_array' type-id='type-id-4' mangled-name='test_array' visibility='default' elf-symbol-id='test_array'/>
     <var-decl name='test_restrict' type-id='type-id-16' mangled-name='test_restrict' visibility='default' elf-symbol-id='test_restrict'/>
     <var-decl name='test_volatile' type-id='type-id-17' mangled-name='test_volatile' visibility='default' elf-symbol-id='test_volatile'/>
   </abi-instr>
diff --git a/tests/data/test-read-ctf/test0.hash.abi b/tests/data/test-read-ctf/test0.hash.abi
index 4aa9a93c..76dd581e 100644
--- a/tests/data/test-read-ctf/test0.hash.abi
+++ b/tests/data/test-read-ctf/test0.hash.abi
@@ -20,7 +20,6 @@
     <elf-symbol name='test_volatile' size='2' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='1' id='811c9dc5'/>
     <type-decl name='char' size-in-bits='8' id='a84c031d'/>
     <type-decl name='float' size-in-bits='32' id='a6c45d85'/>
     <type-decl name='int' size-in-bits='32' id='95e97e5e'/>
@@ -34,14 +33,15 @@
         <var-decl name='m0' type-id='95e97e5e' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='b91ffdee'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='000d9e42'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='status0' type-id='811c9dc5' visibility='default'/>
+        <var-decl name='status0' type-id='f0981eec' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='1'>
-        <var-decl name='status1' type-id='811c9dc5' visibility='default'/>
+        <var-decl name='status1' type-id='f0981eec' visibility='default'/>
       </data-member>
     </class-decl>
+    <type-decl name='unsigned int' size-in-bits='32' id='f0981eec'/>
     <type-decl name='unsigned long int' size-in-bits='64' id='f0981eeb'/>
     <pointer-type-def type-id='50d9a3fa' size-in-bits='64' alignment-in-bits='64' id='fd01f598'/>
     <pointer-type-def type-id='a84c031d' size-in-bits='64' alignment-in-bits='64' id='26a90f95'/>
@@ -49,7 +49,7 @@
     <pointer-type-def type-id='95e97e5f' size-in-bits='64' alignment-in-bits='64' id='7292109c'/>
     <qualified-type-def type-id='7292109c' restrict='yes' id='6942f6a4'/>
     <qualified-type-def type-id='95e97e60' volatile='yes' id='e024ff18'/>
-    <var-decl name='status' type-id='b91ffdee' mangled-name='status' visibility='default' elf-symbol-id='status'/>
+    <var-decl name='status' type-id='000d9e42' mangled-name='status' visibility='default' elf-symbol-id='status'/>
     <var-decl name='test_pointer' type-id='26a90f95' mangled-name='test_pointer' visibility='default' elf-symbol-id='test_pointer'/>
     <var-decl name='test_const' type-id='0fb3b55d' mangled-name='test_const' visibility='default' elf-symbol-id='test_const'/>
     <var-decl name='test_float' type-id='a6c45d85' mangled-name='test_float' visibility='default' elf-symbol-id='test_float'/>
diff --git a/tests/data/test-read-ctf/test1.so.abi b/tests/data/test-read-ctf/test1.so.abi
index 822b57a5..2ecd5826 100644
--- a/tests/data/test-read-ctf/test1.so.abi
+++ b/tests/data/test-read-ctf/test1.so.abi
@@ -6,9 +6,8 @@
     <elf-symbol name='fn' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <enum-decl name='opaque_enum' linkage-name='opaque_enum' id='type-id-2'>
-      <underlying-type type-id='type-id-1'/>
+    <enum-decl name='opaque_enum' linkage-name='opaque_enum' id='type-id-1'>
+      <underlying-type type-id='type-id-2'/>
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
@@ -17,8 +16,9 @@
         <var-decl name='m0' type-id='type-id-4' visibility='default'/>
       </data-member>
     </class-decl>
-    <typedef-decl name='opaque_enum' type-id='type-id-2' id='type-id-4'/>
+    <typedef-decl name='opaque_enum' type-id='type-id-1' id='type-id-4'/>
     <typedef-decl name='opaque_struct' type-id='type-id-3' id='type-id-5'/>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-2'/>
     <pointer-type-def type-id='type-id-4' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
     <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
     <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fn'>
diff --git a/tests/data/test-read-ctf/test1.so.hash.abi b/tests/data/test-read-ctf/test1.so.hash.abi
index b3ace158..4f8633dd 100644
--- a/tests/data/test-read-ctf/test1.so.hash.abi
+++ b/tests/data/test-read-ctf/test1.so.hash.abi
@@ -6,9 +6,8 @@
     <elf-symbol name='fn' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='811c9dc5'/>
     <enum-decl name='opaque_enum' linkage-name='opaque_enum' id='55763a91'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
@@ -19,6 +18,7 @@
     </class-decl>
     <typedef-decl name='opaque_enum' type-id='55763a91' id='99fcd3a5'/>
     <typedef-decl name='opaque_struct' type-id='6cde5052' id='dae69ca1'/>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
     <pointer-type-def type-id='99fcd3a5' size-in-bits='64' alignment-in-bits='64' id='0e0526e0'/>
     <pointer-type-def type-id='dae69ca1' size-in-bits='64' alignment-in-bits='64' id='3f6e71d0'/>
     <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fn'>
diff --git a/tests/data/test-read-ctf/test5.o.abi b/tests/data/test-read-ctf/test5.o.abi
index 6d72d7ab..814aff7f 100644
--- a/tests/data/test-read-ctf/test5.o.abi
+++ b/tests/data/test-read-ctf/test5.o.abi
@@ -7,10 +7,9 @@
     <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <type-decl name='char' size-in-bits='8' id='type-id-2'/>
-    <enum-decl name='E' linkage-name='E' id='type-id-3'>
-      <underlying-type type-id='type-id-1'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <enum-decl name='E' linkage-name='E' id='type-id-2'>
+      <underlying-type type-id='type-id-3'/>
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
@@ -18,7 +17,8 @@
     <type-decl name='long int' size-in-bits='64' id='type-id-5'/>
     <type-decl name='long long int' size-in-bits='64' id='type-id-6'/>
     <typedef-decl name='long_long' type-id='type-id-6' id='type-id-7'/>
-    <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-3'/>
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
     <qualified-type-def type-id='type-id-4' const='yes' id='type-id-9'/>
     <qualified-type-def type-id='type-id-5' const='yes' id='type-id-10'/>
     <qualified-type-def type-id='type-id-10' volatile='yes' id='type-id-11'/>
@@ -37,7 +37,7 @@
       <return type-id='type-id-12'/>
     </function-decl>
     <function-decl name='bar2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar2'>
-      <parameter type-id='type-id-3'/>
+      <parameter type-id='type-id-2'/>
       <return type-id='type-id-12'/>
     </function-decl>
     <function-decl name='baz' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='baz'>
diff --git a/tests/test-read-ctf.cc b/tests/test-read-ctf.cc
index 14e63ef0..5d0e7435 100644
--- a/tests/test-read-ctf.cc
+++ b/tests/test-read-ctf.cc
@@ -345,6 +345,24 @@ static InOutSpec in_out_specs[] =
     "output/test-read-ctf/test-fallback.abi",
     NULL,
   },
+  {
+    "data/test-read-ctf/test-bitfield.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-bitfield.abi",
+    "output/test-read-ctf/test-bitfield.abi",
+    "--ctf",
+  },
+  {
+    "data/test-read-ctf/test-bitfield-enum.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-bitfield-enum.abi",
+    "output/test-read-ctf/test-bitfield-enum.abi",
+    "--ctf",
+   },
   // This should be the last entry.
   {NULL, NULL, NULL, SEQUENCE_TYPE_ID_STYLE, NULL, NULL}
 };
-- 
2.35.1


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 3/5] ctf-front-end: Strip qualification from a qualified array type
  2022-11-17  3:43 [PATCH 0/5] CTF front-end Bug Fixing and improvement Guillermo E. Martinez
  2022-11-17  3:43 ` [PATCH 1/5] ctf-front-end: Set alignment-in-bits property to 0 Guillermo E. Martinez
  2022-11-17  3:43 ` [PATCH 2/5] ctf-front-end: Fix size and name for underlying types Guillermo E. Martinez
@ 2022-11-17  3:43 ` Guillermo E. Martinez
  2022-11-30  9:33   ` Dodji Seketeli
  2022-11-17  3:43 ` [PATCH 4/5] ctf-front-end: Fix representation for multidimensional " Guillermo E. Martinez
  2022-11-17  3:43 ` [PATCH 5/5] ctf-front-end: Fix array size representation Guillermo E. Martinez
  4 siblings, 1 reply; 16+ messages in thread
From: Guillermo E. Martinez @ 2022-11-17  3:43 UTC (permalink / raw)
  To: libabigail; +Cc: Guillermo E. Martinez

Redundant qualifier is emitted by CTF frond-end building IR for array
definitions:

   const char a[32];

   <qualified-type-def type-id='type-id-1' const='yes' id='type-id-2'/>
   <qualified-type-def type-id='type-id-3' const='yes' id='type-id-6'/>

Thus the diff reports:
   [C] 'const char[32] const a'

So, It strips the qualifiers from the array types.

	* src/abg-ctf-reader.cc (maybe_strip_qualification): New definition.
	(process_ctf_qualified_type): Strip redundant qualifiers.
	* tests/data/test-read-ctf/test-const-array.abi: New test.
	* tests/data/test-read-ctf/test-const-array.c: Likewise.
	* tests/data/test-read-ctf/test-const-array.o: Likewise.

Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
---
 src/abg-ctf-reader.cc                         |  57 +++++++++++++++++-
 tests/data/Makefile.am                        |   3 +
 tests/data/test-read-ctf/test-const-array.abi |  14 +++++
 tests/data/test-read-ctf/test-const-array.c   |   2 +
 tests/data/test-read-ctf/test-const-array.o   | Bin 0 -> 1416 bytes
 tests/test-read-ctf.cc                        |   9 +++
 6 files changed, 83 insertions(+), 2 deletions(-)
 create mode 100644 tests/data/test-read-ctf/test-const-array.abi
 create mode 100644 tests/data/test-read-ctf/test-const-array.c
 create mode 100644 tests/data/test-read-ctf/test-const-array.o

diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc
index feafc91d..7c267bb1 100644
--- a/src/abg-ctf-reader.cc
+++ b/src/abg-ctf-reader.cc
@@ -1261,6 +1261,51 @@ process_ctf_array_type(reader *rdr,
   return result;
 }
 
+/// Strip qualification from a qualified type, when it makes sense.
+///
+/// CTF constructs "const const char [N]" for "const char foo[N]"
+/// definition; This redundant types then causes bad diagnostics
+/// when it is compared with an DWARF IR.
+///
+/// This function thus strips the const qualifier from the type in
+/// that case.  It might contain code to strip other cases like this
+/// in the future.
+///
+/// @param t the type to strip const qualification from.
+///
+/// @param rdr the @ref reader to use.
+///
+/// @return the stripped type or just return @p t.
+static decl_base_sptr
+maybe_strip_qualification(const qualified_type_def_sptr t,
+                          reader *rdr)
+{
+  if (!t)
+    return t;
+
+  decl_base_sptr result = t;
+  type_base_sptr u = t->get_underlying_type();
+
+  if (is_array_type(u) || is_typedef_of_array(u))
+    {
+      array_type_def_sptr array = is_array_type(u);
+      ABG_ASSERT(array);
+      // We should not be editing types that are already canonicalized.
+      ABG_ASSERT(!array->get_canonical_type());
+      type_base_sptr element_type = array->get_element_type();
+
+      if (qualified_type_def_sptr qualified = is_qualified_type(element_type))
+        {
+          qualified_type_def::CV quals = qualified->get_cv_quals();
+          quals |= t->get_cv_quals();
+          qualified->set_cv_quals(quals);
+          result = is_decl(u);
+        }
+    }
+
+  return result;
+}
+
 /// Build and return a qualified type libabigail IR.
 ///
 /// @param rdr the read context.
@@ -1304,8 +1349,16 @@ process_ctf_qualified_type(reader *rdr,
   result.reset(new qualified_type_def(utype, qualifiers, location()));
   if (result)
     {
-      decl_base_sptr qualified_type_decl = get_type_declaration(result);
-      add_decl_to_scope(qualified_type_decl, tunit->get_global_scope());
+      // Strip some potentially redundant type qualifiers from
+      // the qualified type we just built.
+      decl_base_sptr d = maybe_strip_qualification(is_qualified_type(result),
+                                                   rdr);
+      if (!d)
+        d = get_type_declaration(result);
+      ABG_ASSERT(d);
+
+      add_decl_to_scope(d, tunit->get_global_scope());
+      result = is_type(d);
       rdr->add_type(ctf_dictionary, ctf_type, result);
     }
 
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index b89a4dd8..8d4a2b8f 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -710,6 +710,9 @@ test-read-ctf/test-bitfield.o		\
 test-read-ctf/test-bitfield-enum.abi	\
 test-read-ctf/test-bitfield-enum.c	\
 test-read-ctf/test-bitfield-enum.o	\
+test-read-ctf/test-const-array.abi	\
+test-read-ctf/test-const-array.c	\
+test-read-ctf/test-const-array.o	\
 \
 test-annotate/test0.abi			\
 test-annotate/test1.abi			\
diff --git a/tests/data/test-read-ctf/test-const-array.abi b/tests/data/test-read-ctf/test-const-array.abi
new file mode 100644
index 00000000..bd60b098
--- /dev/null
+++ b/tests/data/test-read-ctf/test-const-array.abi
@@ -0,0 +1,14 @@
+<abi-corpus version='2.1' path='data/test-read-ctf/test-const-array.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='a' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr address-size='64' language='LANG_C'>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='256' id='type-id-3'>
+      <subrange length='32' type-id='type-id-4' id='type-id-5'/>
+    </array-type-def>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-4'/>
+    <qualified-type-def type-id='type-id-1' const='yes' id='type-id-2'/>
+    <var-decl name='a' type-id='type-id-3' mangled-name='a' visibility='default' elf-symbol-id='a'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-const-array.c b/tests/data/test-read-ctf/test-const-array.c
new file mode 100644
index 00000000..4ffecf87
--- /dev/null
+++ b/tests/data/test-read-ctf/test-const-array.c
@@ -0,0 +1,2 @@
+/* gcc -gctf -c test-const-array.c -o test-const-array.o */
+const char a[32];
diff --git a/tests/data/test-read-ctf/test-const-array.o b/tests/data/test-read-ctf/test-const-array.o
new file mode 100644
index 0000000000000000000000000000000000000000..b50e2fe5a7f7c86b3220c08782ee1d72035cc4d3
GIT binary patch
literal 1416
zcmbtU&2H2%5T3NlQhpA!LRAG4GACL=oNPFi1B$4i91sU2?sc+eH)__YY*#cVu1LM`
zNPQEY0bT%R5__|?Rz1K-<N5o(vB&Z5x3?eOZA1}xiQqL1k<S8r-x&P7b91;4_u%)>
z(X#SrfWQcS(k-VC(4L^4qTWK?b4tG3Z%h{Pn`lTfipQM`W9pOlKCL^n(8dI2s7^B4
z6Uw>JP&aDE&XuWVN={j&EC@*E%|a$cTeL}|MOn+l=rXCRLKM|ZRCTQ6*ThO=O)?c$
zbZ)Grn8v03(nn>ZjE#lXqUELE_6B==bo7etAAkIOz$Pzw%2Sr5SvHxZhiqS7oJn0R
zq_Uzu=zGxl87kcil5oc8s+$R8lE}q$H#Z5@NAT-Uh<S*K?XG)YVIDwJ$Jd7w0Nk_-
zD+;t$_jc|*D=#c?x+dU-F~ISPfa|8ul+A+X0<Ib>IZhHAE6P(B&(t|T(+y5<TYrH6
zvyYKZGrRY)Y?d#*>rQxoPq9on|M)yQ_fB9#{xhu88~s=Q3*?49Y0I1zl<-4_*a>1N
zxBM{@2_<(x)<we-#)nuUXgWYT@5J$+2YHw7I8=Ir>T|2m%XP^$*iV?djT)Z+hvSFm
zqPt!df`weFUpfAJ2fpiYo=^WnBzI85Z%6qp*L0VH6$!`M#@agm6UUb;TyjJHU(J<n
AdH?_b

literal 0
HcmV?d00001

diff --git a/tests/test-read-ctf.cc b/tests/test-read-ctf.cc
index 5d0e7435..61a5682c 100644
--- a/tests/test-read-ctf.cc
+++ b/tests/test-read-ctf.cc
@@ -363,6 +363,15 @@ static InOutSpec in_out_specs[] =
     "output/test-read-ctf/test-bitfield-enum.abi",
     "--ctf",
    },
+   {
+     "data/test-read-ctf/test-const-array.o",
+     "",
+     "",
+     SEQUENCE_TYPE_ID_STYLE,
+     "data/test-read-ctf/test-const-array.abi",
+     "output/test-read-ctf/test-const-array.abi",
+     "--ctf",
+  },
   // This should be the last entry.
   {NULL, NULL, NULL, SEQUENCE_TYPE_ID_STYLE, NULL, NULL}
 };
-- 
2.35.1


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 4/5] ctf-front-end: Fix representation for multidimensional array type
  2022-11-17  3:43 [PATCH 0/5] CTF front-end Bug Fixing and improvement Guillermo E. Martinez
                   ` (2 preceding siblings ...)
  2022-11-17  3:43 ` [PATCH 3/5] ctf-front-end: Strip qualification from a qualified array type Guillermo E. Martinez
@ 2022-11-17  3:43 ` Guillermo E. Martinez
  2022-11-30  9:43   ` Dodji Seketeli
  2022-11-17  3:43 ` [PATCH 5/5] ctf-front-end: Fix array size representation Guillermo E. Martinez
  4 siblings, 1 reply; 16+ messages in thread
From: Guillermo E. Martinez @ 2022-11-17  3:43 UTC (permalink / raw)
  To: libabigail; +Cc: Guillermo E. Martinez

To build an IR for multidimensional array the CTF front-end
iterates over the element types recursively, so a definition as
follows:

  char a[2][3][4][5];

Produces: 'char[2][3][4] a[5]' instead of 'char a[2][3][4][5]', it
considers always multidimensional arrays as unidimensional creating
a `array-type-def' node for each dimension:

  <array-type-def dimensions='1' type-id='type-id-1' ... >
    <subrange length='2' type-id='type-id-3' id='type-id-4'/>
  </array-type-def>
  <array-type-def dimensions='1' type-id='type-id-2' ... >
    <subrange length='3' type-id='type-id-3' id='type-id-6'/>
  </array-type-def>
  ...

Instead of:

  <array-type-def dimensions='4' type-id='type-id-1' ... >
     <subrange length='2' type-id='type-id-3' id='type-id-4'/>
     <subrange length='3' type-id='type-id-3' id='type-id-5'/>
     ...
  </array-type-def>

	* src/abg-ctf-reader.cc (+build_array_ctf_range): New definition.
	* tests/data/Makefile.am: Add new testcase.
	* tests/data/test-read-ctf/test-array-mdimension.abi: New testcase.
	* tests/data/test-read-ctf/test-array-mdimension.c: Likewise.
	* tests/data/test-read-ctf/test-array-mdimension.o: Likewise.
	* tests/data/test-read-ctf/test9.o.abi: Adjust.
	* tests/test-read-ctf.cc: Update testsuite.

Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
---
 src/abg-ctf-reader.cc                         | 119 ++++++++++++------
 tests/data/Makefile.am                        |   3 +
 .../test-read-ctf/test-array-mdimension.abi   |  16 +++
 .../test-read-ctf/test-array-mdimension.c     |   2 +
 .../test-read-ctf/test-array-mdimension.o     | Bin 0 -> 1360 bytes
 tests/data/test-read-ctf/test9.o.abi          |  36 +++---
 tests/test-read-ctf.cc                        |  27 ++--
 7 files changed, 135 insertions(+), 68 deletions(-)
 create mode 100644 tests/data/test-read-ctf/test-array-mdimension.abi
 create mode 100644 tests/data/test-read-ctf/test-array-mdimension.c
 create mode 100644 tests/data/test-read-ctf/test-array-mdimension.o

diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc
index 7c267bb1..ba4eed16 100644
--- a/src/abg-ctf-reader.cc
+++ b/src/abg-ctf-reader.cc
@@ -1171,6 +1171,58 @@ process_ctf_union_type(reader *rdr,
   return result;
 }
 
+/// Build and return an array subrange.
+///
+/// @param rdr the read context.
+///
+/// @param ctf_dictionary the CTF dictionary where @ref index
+/// will be found.
+///
+/// @param index the CTF type ID for the array index.
+///
+/// @param nelems the elements number of the array.
+///
+/// @return a shared pointer to subrange built.
+static array_type_def::subrange_sptr
+build_array_ctf_range(reader *rdr, ctf_dict_t *dic,
+                      ctf_id_t index, uint64_t nelems)
+{
+  bool is_infinite = false;
+  corpus_sptr corp = rdr->corpus();
+  translation_unit_sptr tunit = rdr->cur_transl_unit();
+  array_type_def::subrange_sptr subrange;
+  array_type_def::subrange_type::bound_value lower_bound;
+  array_type_def::subrange_type::bound_value upper_bound;
+
+  type_base_sptr index_type = rdr->lookup_type(corp, tunit,
+                                               dic, index);
+  if (!index_type)
+    return nullptr;
+
+  lower_bound.set_unsigned(0); /* CTF supports C only.  */
+  upper_bound.set_unsigned(nelems > 0 ? nelems - 1 : 0U);
+
+  /* for VLAs number of array elements is 0 */
+  if (upper_bound.get_unsigned_value() == 0)
+    is_infinite = true;
+
+  subrange.reset(new array_type_def::subrange_type(rdr->env(),
+                                                   "",
+                                                   lower_bound,
+                                                   upper_bound,
+                                                   index_type,
+                                                   location(),
+                                                   translation_unit::LANG_C));
+  if (!subrange)
+    return nullptr;
+
+  subrange->is_infinite(is_infinite);
+  add_decl_to_scope(subrange, tunit->get_global_scope());
+  canonicalize(subrange);
+
+  return subrange;
+}
+
 /// Build and return an array type libabigail IR.
 ///
 /// @param rdr the read context.
@@ -1189,64 +1241,51 @@ process_ctf_array_type(reader *rdr,
   translation_unit_sptr tunit = rdr->cur_transl_unit();
   array_type_def_sptr result;
   ctf_arinfo_t ctf_ainfo;
-  bool is_infinite = false;
 
   /* First, get the information about the CTF array.  */
   if (static_cast<ctf_id_t>(ctf_array_info(ctf_dictionary,
-					   ctf_type,
-					   &ctf_ainfo)) == CTF_ERR)
+                                           ctf_type,
+                                           &ctf_ainfo)) == CTF_ERR)
     return result;
 
   ctf_id_t ctf_element_type = ctf_ainfo.ctr_contents;
   ctf_id_t ctf_index_type = ctf_ainfo.ctr_index;
   uint64_t nelems = ctf_ainfo.ctr_nelems;
+  array_type_def::subrange_sptr subrange;
+  array_type_def::subranges_type subranges;
+
+  int type_array_kind = ctf_type_kind(ctf_dictionary, ctf_element_type);
+  while (type_array_kind == CTF_K_ARRAY)
+    {
+      if (static_cast<ctf_id_t>(ctf_array_info(ctf_dictionary,
+                                               ctf_element_type,
+                                               &ctf_ainfo)) == CTF_ERR)
+        return result;
+
+      subrange = build_array_ctf_range(rdr, ctf_dictionary,
+                                       ctf_ainfo.ctr_index,
+                                       ctf_ainfo.ctr_nelems);
+      subranges.push_back(subrange);
+      ctf_element_type = ctf_ainfo.ctr_contents;
+      type_array_kind = ctf_type_kind(ctf_dictionary, ctf_element_type);
+    }
+
+  std::reverse(subranges.begin(), subranges.end());
 
   /* Make sure the element type is generated.  */
   type_base_sptr element_type = rdr->lookup_type(corp, tunit,
-						 ctf_dictionary,
-						 ctf_element_type);
+                                                 ctf_dictionary,
+                                                 ctf_element_type);
   if (!element_type)
     return result;
 
-  /* Ditto for the index type.  */
-  type_base_sptr index_type = rdr->lookup_type(corp, tunit,
-					       ctf_dictionary,
-					       ctf_index_type);
-  if (!index_type)
-    return result;
-
   result = dynamic_pointer_cast<array_type_def>(rdr->lookup_type(ctf_dictionary,
-                                                                  ctf_type));
+                                                                 ctf_type));
   if (result)
     return result;
 
-  /* The number of elements of the array determines the IR subranges
-     type to build.  */
-  array_type_def::subranges_type subranges;
-  array_type_def::subrange_sptr subrange;
-  array_type_def::subrange_type::bound_value lower_bound;
-  array_type_def::subrange_type::bound_value upper_bound;
-
-  lower_bound.set_unsigned(0); /* CTF supports C only.  */
-  upper_bound.set_unsigned(nelems > 0 ? nelems - 1 : 0U);
-
-  /* for VLAs number of array elements is 0 */
-  if (upper_bound.get_unsigned_value() == 0)
-    is_infinite = true;
-
-  subrange.reset(new array_type_def::subrange_type(rdr->env(),
-                                                   "",
-                                                   lower_bound,
-                                                   upper_bound,
-                                                   index_type,
-                                                   location(),
-                                                   translation_unit::LANG_C));
-  if (!subrange)
-    return result;
-
-  subrange->is_infinite(is_infinite);
-  add_decl_to_scope(subrange, tunit->get_global_scope());
-  canonicalize(subrange);
+  subrange = build_array_ctf_range(rdr, ctf_dictionary,
+                                   ctf_index_type, nelems);
   subranges.push_back(subrange);
 
   /* Finally build the IR for the array type and return it.  */
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 8d4a2b8f..d04ecf3f 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -713,6 +713,9 @@ test-read-ctf/test-bitfield-enum.o	\
 test-read-ctf/test-const-array.abi	\
 test-read-ctf/test-const-array.c	\
 test-read-ctf/test-const-array.o	\
+test-read-ctf/test-array-mdimension.abi	\
+test-read-ctf/test-array-mdimension.c	\
+test-read-ctf/test-array-mdimension.o	\
 \
 test-annotate/test0.abi			\
 test-annotate/test1.abi			\
diff --git a/tests/data/test-read-ctf/test-array-mdimension.abi b/tests/data/test-read-ctf/test-array-mdimension.abi
new file mode 100644
index 00000000..177284d2
--- /dev/null
+++ b/tests/data/test-read-ctf/test-array-mdimension.abi
@@ -0,0 +1,16 @@
+<abi-corpus version='2.1' path='data/test-read-ctf/test-array-mdimension.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='a' size='120' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr address-size='64' language='LANG_C'>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <array-type-def dimensions='4' type-id='type-id-1' size-in-bits='960' id='type-id-2'>
+      <subrange length='2' type-id='type-id-3' id='type-id-4'/>
+      <subrange length='3' type-id='type-id-3' id='type-id-5'/>
+      <subrange length='4' type-id='type-id-3' id='type-id-6'/>
+      <subrange length='5' type-id='type-id-3' id='type-id-7'/>
+    </array-type-def>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <var-decl name='a' type-id='type-id-2' mangled-name='a' visibility='default' elf-symbol-id='a'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-array-mdimension.c b/tests/data/test-read-ctf/test-array-mdimension.c
new file mode 100644
index 00000000..317fc589
--- /dev/null
+++ b/tests/data/test-read-ctf/test-array-mdimension.c
@@ -0,0 +1,2 @@
+/* gcc -gctf -c test-array-mdimension.c -o test-array-mdimension.o */
+char a[2][3][4][5];
diff --git a/tests/data/test-read-ctf/test-array-mdimension.o b/tests/data/test-read-ctf/test-array-mdimension.o
new file mode 100644
index 0000000000000000000000000000000000000000..5b392d89439a1e39111c350ba2ee8baf7cdb4a14
GIT binary patch
literal 1360
zcmbVM&2G~`5T3Ll{9P!g0vB_l6?pBWT<8H=s-OrVZX7wRoh7mGPqf~u@rhUH8^ELR
z2)qH$051SD_N=`u;lfDcnf>Pbc6Y{3KD~JJa&IyLYZG`5<I17{S9@cgbZG*&;THV-
zJ{>CeM+!_aC%?gd2jdm`27QKp$WA$*H=~IBeZtUYq)jO6?Jfo4(1F9D03E*17)7=Y
zr#ldrB3p-F!v*0KAzMogMP03ei>k?2m0AXQWk5o-u1giAZQ4e)mRX^qMrToxr!vh~
zGB3hPT}DPVriqr)$Sw`FlFKkNANrNlTDD=i%u9uP*OkZs&d<(HgQN4e?~a4{iHJoU
zEaJstK98RTM{2uKn#e{L$Njwnz9$Os&XccBFF22Wz3ZJ(Yu2bfg&)7{+QxgB9KblW
ztu0Vj;f~8o0MWFikts%_`?$85QCkCoW&t8?8W1=KeAFd11fr^q64*xA7@2+K^{ToM
z8(m}DrnRU4cYJ_K>XpBtVV`8k{!IM2J;X9$<3xIX(ucpEzWxz1=)3)wewZ)s6mYcR
z2`2uYR7>cA_S7qSOPC{vu$ah>874k<FiNf7##0A#sh=&u1$S^?BX%9#`F(bZFRb_P
yMYD2^Xug)}-&p^O$v2s2_4I#2Mz}wF!Vh^<`aWFq+d9DFF8vAX-@9VWef@8H9&fb(

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test9.o.abi b/tests/data/test-read-ctf/test9.o.abi
index 331bfc70..9f5a7466 100644
--- a/tests/data/test-read-ctf/test9.o.abi
+++ b/tests/data/test-read-ctf/test9.o.abi
@@ -11,47 +11,45 @@
       <subrange length='infinite' type-id='type-id-4' id='type-id-7'/>
     </array-type-def>
     <type-decl name='double' size-in-bits='64' id='type-id-8'/>
-    <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='320' id='type-id-9'>
+    <array-type-def dimensions='2' type-id='type-id-8' size-in-bits='960' id='type-id-9'>
       <subrange length='5' type-id='type-id-4' id='type-id-10'/>
+      <subrange length='3' type-id='type-id-4' id='type-id-11'/>
     </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-9' size-in-bits='960' id='type-id-11'>
-      <subrange length='3' type-id='type-id-4' id='type-id-12'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-12'/>
+    <array-type-def dimensions='1' type-id='type-id-13' size-in-bits='256' alignment-in-bits='64' id='type-id-14'>
+      <subrange length='4' type-id='type-id-4' id='type-id-15'/>
     </array-type-def>
-    <type-decl name='int' size-in-bits='32' id='type-id-13'/>
-    <array-type-def dimensions='1' type-id='type-id-14' size-in-bits='256' alignment-in-bits='64' id='type-id-15'>
-      <subrange length='4' type-id='type-id-4' id='type-id-16'/>
+    <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='640' alignment-in-bits='64' id='type-id-17'>
+      <subrange length='10' type-id='type-id-4' id='type-id-18'/>
     </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='640' alignment-in-bits='64' id='type-id-18'>
-      <subrange length='10' type-id='type-id-4' id='type-id-19'/>
-    </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-13' size-in-bits='160' id='type-id-20'>
+    <array-type-def dimensions='1' type-id='type-id-12' size-in-bits='160' id='type-id-19'>
       <subrange length='5' type-id='type-id-4' id='type-id-10'/>
     </array-type-def>
-    <class-decl name='S' size-in-bits='2304' is-struct='yes' visibility='default' id='type-id-21'>
+    <class-decl name='S' size-in-bits='2304' is-struct='yes' visibility='default' id='type-id-20'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='a' type-id='type-id-20' visibility='default'/>
+        <var-decl name='a' type-id='type-id-19' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='192'>
         <var-decl name='b' type-id='type-id-3' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='640'>
-        <var-decl name='c' type-id='type-id-11' visibility='default'/>
+        <var-decl name='c' type-id='type-id-9' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='1600'>
-        <var-decl name='d' type-id='type-id-18' visibility='default'/>
+        <var-decl name='d' type-id='type-id-17' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='2240'>
         <var-decl name='e' type-id='type-id-6' visibility='default'/>
       </data-member>
     </class-decl>
     <type-decl name='unsigned long int' size-in-bits='64' id='type-id-4'/>
-    <pointer-type-def type-id='type-id-21' size-in-bits='64' alignment-in-bits='64' id='type-id-22'/>
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' alignment-in-bits='64' id='type-id-21'/>
     <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
-    <pointer-type-def type-id='type-id-13' size-in-bits='64' alignment-in-bits='64' id='type-id-14'/>
-    <pointer-type-def type-id='type-id-15' size-in-bits='64' alignment-in-bits='64' id='type-id-17'/>
+    <pointer-type-def type-id='type-id-12' size-in-bits='64' alignment-in-bits='64' id='type-id-13'/>
+    <pointer-type-def type-id='type-id-14' size-in-bits='64' alignment-in-bits='64' id='type-id-16'/>
     <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
-      <parameter type-id='type-id-22'/>
-      <return type-id='type-id-13'/>
+      <parameter type-id='type-id-21'/>
+      <return type-id='type-id-12'/>
     </function-decl>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/test-read-ctf.cc b/tests/test-read-ctf.cc
index 61a5682c..a2193303 100644
--- a/tests/test-read-ctf.cc
+++ b/tests/test-read-ctf.cc
@@ -362,15 +362,24 @@ static InOutSpec in_out_specs[] =
     "data/test-read-ctf/test-bitfield-enum.abi",
     "output/test-read-ctf/test-bitfield-enum.abi",
     "--ctf",
-   },
-   {
-     "data/test-read-ctf/test-const-array.o",
-     "",
-     "",
-     SEQUENCE_TYPE_ID_STYLE,
-     "data/test-read-ctf/test-const-array.abi",
-     "output/test-read-ctf/test-const-array.abi",
-     "--ctf",
+  },
+  {
+    "data/test-read-ctf/test-const-array.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-const-array.abi",
+    "output/test-read-ctf/test-const-array.abi",
+    "--ctf",
+  },
+  {
+    "data/test-read-ctf/test-array-mdimension.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-array-mdimension.abi",
+    "output/test-read-ctf/test-array-mdimension.abi",
+    "--ctf",
   },
   // This should be the last entry.
   {NULL, NULL, NULL, SEQUENCE_TYPE_ID_STYLE, NULL, NULL}
-- 
2.35.1


^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCH 5/5] ctf-front-end: Fix array size representation
  2022-11-17  3:43 [PATCH 0/5] CTF front-end Bug Fixing and improvement Guillermo E. Martinez
                   ` (3 preceding siblings ...)
  2022-11-17  3:43 ` [PATCH 4/5] ctf-front-end: Fix representation for multidimensional " Guillermo E. Martinez
@ 2022-11-17  3:43 ` Guillermo E. Martinez
  2022-11-30  9:58   ` Dodji Seketeli
  4 siblings, 1 reply; 16+ messages in thread
From: Guillermo E. Martinez @ 2022-11-17  3:43 UTC (permalink / raw)
  To: libabigail; +Cc: Guillermo E. Martinez

Array with a single element is represented as infinite array.

<array-type-def dimensions='1' ... size-in-bits='infinite' ...>
    <subrange length='infinite' type-id='type-id-3' .../>
</array-type-def>

	* src/abg-ctf-reader.cc (build_array_ctf_range): Use
	* tests/data/Makefile.am: Add new test.
	`upper_bound' and number of elements to indicate infinite
	array size.
	* tests/data/test-read-ctf/test-array-size.abi: New test.
	* tests/data/test-read-ctf/test-array-size.c: Likewise.
	* tests/data/test-read-ctf/test-array-size.o: Likewise.
	* tests/test-read-ctf.cc: Update testsuite.

Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
---
 src/abg-ctf-reader.cc                        |   2 +-
 tests/data/Makefile.am                       |   3 +++
 tests/data/test-read-ctf/test-array-size.abi |  23 +++++++++++++++++++
 tests/data/test-read-ctf/test-array-size.c   |   4 ++++
 tests/data/test-read-ctf/test-array-size.o   | Bin 0 -> 1432 bytes
 tests/data/test-read-ctf/test9.o.abi         |   4 ++--
 tests/test-read-ctf.cc                       |   9 ++++++++
 7 files changed, 42 insertions(+), 3 deletions(-)
 create mode 100644 tests/data/test-read-ctf/test-array-size.abi
 create mode 100644 tests/data/test-read-ctf/test-array-size.c
 create mode 100644 tests/data/test-read-ctf/test-array-size.o

diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc
index ba4eed16..18217d81 100644
--- a/src/abg-ctf-reader.cc
+++ b/src/abg-ctf-reader.cc
@@ -1203,7 +1203,7 @@ build_array_ctf_range(reader *rdr, ctf_dict_t *dic,
   upper_bound.set_unsigned(nelems > 0 ? nelems - 1 : 0U);
 
   /* for VLAs number of array elements is 0 */
-  if (upper_bound.get_unsigned_value() == 0)
+  if (upper_bound.get_unsigned_value() == 0 && nelems == 0)
     is_infinite = true;
 
   subrange.reset(new array_type_def::subrange_type(rdr->env(),
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index d04ecf3f..e994aff3 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -716,6 +716,9 @@ test-read-ctf/test-const-array.o	\
 test-read-ctf/test-array-mdimension.abi	\
 test-read-ctf/test-array-mdimension.c	\
 test-read-ctf/test-array-mdimension.o	\
+test-read-ctf/test-array-size.abi	\
+test-read-ctf/test-array-size.c		\
+test-read-ctf/test-array-size.o		\
 \
 test-annotate/test0.abi			\
 test-annotate/test1.abi			\
diff --git a/tests/data/test-read-ctf/test-array-size.abi b/tests/data/test-read-ctf/test-array-size.abi
new file mode 100644
index 00000000..3fbc65b6
--- /dev/null
+++ b/tests/data/test-read-ctf/test-array-size.abi
@@ -0,0 +1,23 @@
+<abi-corpus version='2.1' path='data/test-read-ctf/test-array-size.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='bar' size='1' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='baz' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='foo' size='2' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr address-size='64' language='LANG_C'>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='8' id='type-id-2'>
+      <subrange length='1' type-id='type-id-3' id='type-id-4'/>
+    </array-type-def>
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='16' id='type-id-5'>
+      <subrange length='2' type-id='type-id-3' id='type-id-6'/>
+    </array-type-def>
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='infinite' id='type-id-7'>
+      <subrange length='infinite' type-id='type-id-3' id='type-id-8'/>
+    </array-type-def>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <var-decl name='bar' type-id='type-id-2' mangled-name='bar' visibility='default' elf-symbol-id='bar'/>
+    <var-decl name='baz' type-id='type-id-7' mangled-name='baz' visibility='default' elf-symbol-id='baz'/>
+    <var-decl name='foo' type-id='type-id-5' mangled-name='foo' visibility='default' elf-symbol-id='foo'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-array-size.c b/tests/data/test-read-ctf/test-array-size.c
new file mode 100644
index 00000000..fe2f3fef
--- /dev/null
+++ b/tests/data/test-read-ctf/test-array-size.c
@@ -0,0 +1,4 @@
+/* gcc -gctf -c test-array-size.c -o test-array-size.o */
+char foo[2];
+char bar[1];
+char baz[0];
diff --git a/tests/data/test-read-ctf/test-array-size.o b/tests/data/test-read-ctf/test-array-size.o
new file mode 100644
index 0000000000000000000000000000000000000000..8e4d8b147bcf9ae2fcfe3d6f2caca05868f6b341
GIT binary patch
literal 1432
zcmbVM&2G~`5T29}elMj5kU+vnNVEd4op7QDWT}Em2ysK=!eQ-f6AQ<#?5!I20*}Ev
zaN!Yn3~ulW@B%QOvzx3};lfDc`R1E%Ry$)SA78wFxic7$wE;b+O=el5?>ifubTFYC
zbe(?x7_KW1HxjzZ7=Fii%<(h3W*@R&V!zCOj~$x8VAOz70}q|K&j|4<QzMRSBgT{f
zt?U*8G`P_EQbax8oCRr*2SM3f)>KsGEI2Ehd{(Myke8ZHs)|ysr1FBId9_ec+NNz(
z)iNto)YMs2<f%;anaqo@ROgXajc%f;)UtzNt>iS!^vNodbuHVl$uE@1h>nkr4uk#U
zH*XJu@lz3tIGDtf$#@(;3-;CWRMq)Hm0A`D-3`0l1q`ttZsIuy->@@l1Cu**+EOo~
zKBQlNdL$=%?7Q98R~5U*+lIHfJ^!xZ@t%5y9fZA6-8GVE+J%-WM_sSt+#;=(ngq5-
zB5fKHyg7bU3oL>}S!pGB^svz~`(W}}c_vQlir1yv-ZlO=!CaWpd~54tk~QiByAR7g
zU;xhFOJW6H^!p!i9pCrA`rUVqqx}9STR7+vJlGPi!Aoh(8gTgCy7tKkAG;)D+i&Bc
z!@1HgR^XCbw6B=E!fwAeEB|Wx{d-|ou0iJaqW;tLFOB$`(b<0d=fJ@Gy9fWy9C{y#
UWBypXT-(-vZu;Lly?}oIUzApI#Q*>R

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test9.o.abi b/tests/data/test-read-ctf/test9.o.abi
index 9f5a7466..5c89f821 100644
--- a/tests/data/test-read-ctf/test9.o.abi
+++ b/tests/data/test-read-ctf/test9.o.abi
@@ -7,8 +7,8 @@
     <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='448' alignment-in-bits='64' id='type-id-3'>
       <subrange length='7' type-id='type-id-4' id='type-id-5'/>
     </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='infinite' id='type-id-6'>
-      <subrange length='infinite' type-id='type-id-4' id='type-id-7'/>
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='8' id='type-id-6'>
+      <subrange length='1' type-id='type-id-4' id='type-id-7'/>
     </array-type-def>
     <type-decl name='double' size-in-bits='64' id='type-id-8'/>
     <array-type-def dimensions='2' type-id='type-id-8' size-in-bits='960' id='type-id-9'>
diff --git a/tests/test-read-ctf.cc b/tests/test-read-ctf.cc
index a2193303..f561f7fa 100644
--- a/tests/test-read-ctf.cc
+++ b/tests/test-read-ctf.cc
@@ -381,6 +381,15 @@ static InOutSpec in_out_specs[] =
     "output/test-read-ctf/test-array-mdimension.abi",
     "--ctf",
   },
+  {
+    "data/test-read-ctf/test-array-size.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-array-size.abi",
+    "output/test-read-ctf/test-array-size.abi",
+    "--ctf",
+  },
   // This should be the last entry.
   {NULL, NULL, NULL, SEQUENCE_TYPE_ID_STYLE, NULL, NULL}
 };
-- 
2.35.1


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 1/5] ctf-front-end: Set alignment-in-bits property to 0
  2022-11-17  3:43 ` [PATCH 1/5] ctf-front-end: Set alignment-in-bits property to 0 Guillermo E. Martinez
@ 2022-11-29 11:46   ` Dodji Seketeli
  0 siblings, 0 replies; 16+ messages in thread
From: Dodji Seketeli @ 2022-11-29 11:46 UTC (permalink / raw)
  To: Guillermo E. Martinez via Libabigail; +Cc: Guillermo E. Martinez

Hello Guillermo,

"Guillermo E. Martinez via Libabigail" <libabigail@sourceware.org> a
écrit:

> When comparing IR generated with DWARF and CTF fron-ends the report
> of different shows changes in the `alignment-in-bits' ABI XML propery:
>
> <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
> <type-decl name='int' size-in-bits='32' id='type-id-1'/>
>
> 1 Changed variable:
>
>   [C] 'int a' was changed at test-abi.c:8:1:
>     type of variable changed:
>       type size hasn't changed
>       type alignment changed from 32 to 0
>
> So, CTF set the alignment to `0' to base types, function
> types and struct types similarly as DWARF front-end does.

Right, this makes sense.

>
> 	* src/abg-ctf-reader.cc (process_ctf_base_type)
> 	(process_ctf_function_type, process_ctf_struct_type): Adjust
> 	`align_in_bits' argument to `0'.
> 	* tests/data/test-diff-pkg-ctf/dirpkg-3-report-1.txt: Adjust test.
> 	* tests/data/test-diff-pkg-ctf/dirpkg-3-report-2.txt: Likewise.
> 	* tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt: Likewise.
> 	* tests/data/test-read-ctf/PR27700/test-PR27700.abi: Likewise.
> 	* tests/data/test-read-ctf/test-PR26568-1.o.abi: Likewise.
> 	* tests/data/test-read-ctf/test-PR26568-2.o.abi: Likewise.
> 	* tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test-anonymous-fields.o.abi: Likewise.
> 	* tests/data/test-read-ctf/test-array-of-pointers.abi: Likewise.
> 	* tests/data/test-read-ctf/test-callback.abi: Likewise.
> 	* tests/data/test-read-ctf/test-callback2.abi: Likewise.
> 	* tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test-dynamic-array.o.abi: Likewise.
> 	* tests/data/test-read-ctf/test-fallback.abi: Likewise.
> 	* tests/data/test-read-ctf/test-forward-type-decl.abi: Likewise.
> 	* tests/data/test-read-ctf/test-functions-declaration.abi: Likewise.
> 	* tests/data/test-read-ctf/test-linux-module.abi: Likewise.
> 	* tests/data/test-read-ctf/test-linux-module.abi: Likewise.
> 	* tests/data/test-read-ctf/test-list-struct.abi: Likewise.
> 	* tests/data/test-read-ctf/test0.abi: Likewise.
> 	* tests/data/test-read-ctf/test0.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test1.so.abi: Likewise.
> 	* tests/data/test-read-ctf/test1.so.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test2.so.abi: Likewise.
> 	* tests/data/test-read-ctf/test2.so.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test3.so.abi: Likewise.
> 	* tests/data/test-read-ctf/test3.so.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test4.so.abi: Likewise.
> 	* tests/data/test-read-ctf/test4.so.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test5.o.abi: Likewise.
> 	* tests/data/test-read-ctf/test7.o.abi: Likewise.
> 	* tests/data/test-read-ctf/test8.o.abi: Likewise.
> 	* tests/data/test-read-ctf/test9.o.abi: Likewise.

OK, the patch looks good to me.  I have just slightly amended the commit
log introductory paragraphs.  Please find below the patch as applied to
master.  Thanks!

[...]

> Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
> ---

[...]

Cheers,

From 8b832a9edfadc2d99f3354555938f68a70471183 Mon Sep 17 00:00:00 2001
From: "Guillermo E. Martinez" <guillermo.e.martinez@oracle.com>
Date: Wed, 16 Nov 2022 21:43:01 -0600
Subject: [PATCH] ctf-reader: Set alignment-in-bits property to 0

When comparing the IR generated with the CTF front-end against the one
generated with the DWARF front-end, the report shows changes in type
alignments:

1 Changed variable:

  [C] 'int a' was changed at test-abi.c:8:1:
    type of variable changed:
      type size hasn't changed
      type alignment changed from 32 to 0

For the sake of consistency, this patch makes the CTF front-end set
the alignment to `0' for base types, function types and struct types
similarly to what the DWARF front-end does.

	* src/abg-ctf-reader.cc (process_ctf_base_type)
	(process_ctf_function_type, process_ctf_struct_type): Adjust
	`align_in_bits' argument to `0'.
	* tests/data/test-diff-pkg-ctf/dirpkg-3-report-1.txt: Adjust test.
	* tests/data/test-diff-pkg-ctf/dirpkg-3-report-2.txt: Likewise.
	* tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt: Likewise.
	* tests/data/test-read-ctf/PR27700/test-PR27700.abi: Likewise.
	* tests/data/test-read-ctf/test-PR26568-1.o.abi: Likewise.
	* tests/data/test-read-ctf/test-PR26568-2.o.abi: Likewise.
	* tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-anonymous-fields.o.abi: Likewise.
	* tests/data/test-read-ctf/test-array-of-pointers.abi: Likewise.
	* tests/data/test-read-ctf/test-callback.abi: Likewise.
	* tests/data/test-read-ctf/test-callback2.abi: Likewise.
	* tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-dynamic-array.o.abi: Likewise.
	* tests/data/test-read-ctf/test-fallback.abi: Likewise.
	* tests/data/test-read-ctf/test-forward-type-decl.abi: Likewise.
	* tests/data/test-read-ctf/test-functions-declaration.abi: Likewise.
	* tests/data/test-read-ctf/test-linux-module.abi: Likewise.
	* tests/data/test-read-ctf/test-linux-module.abi: Likewise.
	* tests/data/test-read-ctf/test-list-struct.abi: Likewise.
	* tests/data/test-read-ctf/test0.abi: Likewise.
	* tests/data/test-read-ctf/test0.hash.abi: Likewise.
	* tests/data/test-read-ctf/test1.so.abi: Likewise.
	* tests/data/test-read-ctf/test1.so.hash.abi: Likewise.
	* tests/data/test-read-ctf/test2.so.abi: Likewise.
	* tests/data/test-read-ctf/test2.so.hash.abi: Likewise.
	* tests/data/test-read-ctf/test3.so.abi: Likewise.
	* tests/data/test-read-ctf/test3.so.hash.abi: Likewise.
	* tests/data/test-read-ctf/test4.so.abi: Likewise.
	* tests/data/test-read-ctf/test4.so.hash.abi: Likewise.
	* tests/data/test-read-ctf/test5.o.abi: Likewise.
	* tests/data/test-read-ctf/test7.o.abi: Likewise.
	* tests/data/test-read-ctf/test8.o.abi: Likewise.
	* tests/data/test-read-ctf/test9.o.abi: Likewise.

Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 src/abg-ctf-reader.cc                         |  7 +++---
 .../test-diff-pkg-ctf/dirpkg-3-report-1.txt   |  1 -
 .../test-diff-pkg-ctf/dirpkg-3-report-2.txt   |  1 -
 .../gmp-6.x.x86_64-report-0.txt               |  1 +
 .../test-read-ctf/PR27700/test-PR27700.abi    |  2 +-
 tests/data/test-read-ctf/test-PR26568-1.o.abi | 12 +++++-----
 tests/data/test-read-ctf/test-PR26568-2.o.abi | 10 ++++----
 .../test-ambiguous-struct-A.o.hash.abi        | 10 ++++----
 .../test-ambiguous-struct-B.o.hash.abi        |  6 ++---
 .../test-read-ctf/test-anonymous-fields.o.abi | 10 ++++----
 .../test-read-ctf/test-array-of-pointers.abi  | 10 ++++----
 tests/data/test-read-ctf/test-callback.abi    |  8 +++----
 tests/data/test-read-ctf/test-callback2.abi   |  6 ++---
 .../test-conflicting-type-syms-a.o.hash.abi   |  2 +-
 .../test-conflicting-type-syms-b.o.hash.abi   |  2 +-
 .../test-read-ctf/test-dynamic-array.o.abi    | 10 ++++----
 tests/data/test-read-ctf/test-fallback.abi    |  2 +-
 .../test-read-ctf/test-forward-type-decl.abi  |  6 ++---
 .../test-functions-declaration.abi            | 10 ++++----
 .../data/test-read-ctf/test-linux-module.abi  | 18 +++++++-------
 tests/data/test-read-ctf/test-list-struct.abi |  4 ++--
 tests/data/test-read-ctf/test0.abi            | 24 +++++++++----------
 tests/data/test-read-ctf/test0.hash.abi       | 24 +++++++++----------
 tests/data/test-read-ctf/test1.so.abi         |  4 ++--
 tests/data/test-read-ctf/test1.so.hash.abi    |  4 ++--
 tests/data/test-read-ctf/test2.so.abi         |  8 +++----
 tests/data/test-read-ctf/test2.so.hash.abi    |  8 +++----
 tests/data/test-read-ctf/test3.so.abi         |  2 +-
 tests/data/test-read-ctf/test3.so.hash.abi    |  2 +-
 tests/data/test-read-ctf/test4.so.abi         |  6 ++---
 tests/data/test-read-ctf/test4.so.hash.abi    |  6 ++---
 tests/data/test-read-ctf/test5.o.abi          | 18 +++++++-------
 tests/data/test-read-ctf/test7.o.abi          | 10 ++++----
 tests/data/test-read-ctf/test8.o.abi          |  2 +-
 tests/data/test-read-ctf/test9.o.abi          | 20 ++++++++--------
 35 files changed, 137 insertions(+), 139 deletions(-)

diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc
index 9bcb9424..cbc5cbca 100644
--- a/src/abg-ctf-reader.cc
+++ b/src/abg-ctf-reader.cc
@@ -783,7 +783,6 @@ process_ctf_base_type(reader *rdr,
   translation_unit_sptr tunit = rdr->cur_transl_unit();
   type_decl_sptr result;
 
-  ssize_t type_alignment = ctf_type_align(ctf_dictionary, ctf_type);
   const char *type_name = ctf_type_name_raw(ctf_dictionary, ctf_type);
 
   /* Get the type encoding and extract some useful properties of
@@ -822,7 +821,7 @@ process_ctf_base_type(reader *rdr,
         result.reset(new type_decl(rdr->env(),
                                    type_name,
                                    type_encoding.cte_bits,
-                                   type_alignment * 8 /* in bits */,
+                                   /*alignment=*/0,
                                    location(),
                                    type_name /* mangled_name */));
 
@@ -929,7 +928,7 @@ process_ctf_function_type(reader *rdr,
   result.reset(new function_type(ret_type,
                                  function_parms,
                                  tunit->get_address_size(),
-                                 ctf_type_align(ctf_dictionary, ctf_type)));
+                                 /*alignment=*/0));
 
   if (result)
     {
@@ -1087,7 +1086,7 @@ process_ctf_struct_type(reader *rdr,
   result.reset(new class_decl(rdr->env(),
                               struct_type_name,
                               ctf_type_size(ctf_dictionary, ctf_type) * 8,
-                              ctf_type_align(ctf_dictionary, ctf_type) * 8,
+                              /*alignment=*/0,
                               true /* is_struct */,
                               location(),
                               decl_base::VISIBILITY_DEFAULT,
diff --git a/tests/data/test-diff-pkg-ctf/dirpkg-3-report-1.txt b/tests/data/test-diff-pkg-ctf/dirpkg-3-report-1.txt
index 4938d221..aa1d7732 100644
--- a/tests/data/test-diff-pkg-ctf/dirpkg-3-report-1.txt
+++ b/tests/data/test-diff-pkg-ctf/dirpkg-3-report-1.txt
@@ -8,7 +8,6 @@
       parameter 1 of type 'S1*' has sub-type changes:
         in pointed to type 'struct S1':
           type size changed from 0 to 32 (in bits)
-          type alignment changed from 0 to 32
           1 data member insertion:
             'int mem2', at offset 0 (in bits)
 
diff --git a/tests/data/test-diff-pkg-ctf/dirpkg-3-report-2.txt b/tests/data/test-diff-pkg-ctf/dirpkg-3-report-2.txt
index 4938d221..aa1d7732 100644
--- a/tests/data/test-diff-pkg-ctf/dirpkg-3-report-2.txt
+++ b/tests/data/test-diff-pkg-ctf/dirpkg-3-report-2.txt
@@ -8,7 +8,6 @@
       parameter 1 of type 'S1*' has sub-type changes:
         in pointed to type 'struct S1':
           type size changed from 0 to 32 (in bits)
-          type alignment changed from 0 to 32
           1 data member insertion:
             'int mem2', at offset 0 (in bits)
 
diff --git a/tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt b/tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt
index d3915f14..171d6490 100644
--- a/tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt
+++ b/tests/data/test-diff-pkg-ctf/gmp-6.x.x86_64-report-0.txt
@@ -133,6 +133,7 @@
                 underlying type 'const mp_limb_t*' changed:
                   entity changed from 'const mp_limb_t*' to 'unsigned long int'
                   type size hasn't changed
+                  type alignment changed from 64 to 0
               parameter 2 of type 'typedef mp_size_t' changed:
                 typedef name changed from mp_size_t to mp_limb_t
                 underlying type 'long int' changed:
diff --git a/tests/data/test-read-ctf/PR27700/test-PR27700.abi b/tests/data/test-read-ctf/PR27700/test-PR27700.abi
index fe3a897d..4f34eb8a 100644
--- a/tests/data/test-read-ctf/PR27700/test-PR27700.abi
+++ b/tests/data/test-read-ctf/PR27700/test-PR27700.abi
@@ -12,7 +12,7 @@
       <enumerator name='foo_e3' value='3'/>
     </enum-decl>
     <pointer-type-def type-id='022218d8' size-in-bits='64' alignment-in-bits='64' id='8750e847'/>
-    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo'>
+    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
       <parameter type-id='8750e847'/>
       <return type-id='48b5725f'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test-PR26568-1.o.abi b/tests/data/test-read-ctf/test-PR26568-1.o.abi
index 7df180d4..60017457 100644
--- a/tests/data/test-read-ctf/test-PR26568-1.o.abi
+++ b/tests/data/test-read-ctf/test-PR26568-1.o.abi
@@ -3,19 +3,19 @@
     <elf-symbol name='fun' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
-    <class-decl name='A' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-3'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-2'/>
+    <class-decl name='A' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-3'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='' type-id='type-id-4' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' alignment-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-5'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-5'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='x' type-id='type-id-1' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='64' alignment-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-6'>
+    <class-decl name='' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-6'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='y' type-id='type-id-2' visibility='default'/>
       </data-member>
@@ -29,7 +29,7 @@
       </data-member>
     </union-decl>
     <pointer-type-def type-id='type-id-3' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
-    <function-decl name='fun' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='fun'>
+    <function-decl name='fun' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fun'>
       <parameter type-id='type-id-7'/>
       <return type-id='type-id-8'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test-PR26568-2.o.abi b/tests/data/test-read-ctf/test-PR26568-2.o.abi
index 44f72263..d038316a 100644
--- a/tests/data/test-read-ctf/test-PR26568-2.o.abi
+++ b/tests/data/test-read-ctf/test-PR26568-2.o.abi
@@ -3,14 +3,14 @@
     <elf-symbol name='fun' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
-    <class-decl name='' size-in-bits='32' alignment-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-3'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-2'/>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-3'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='x' type-id='type-id-1' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='64' alignment-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-4'>
+    <class-decl name='' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-4'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='y' type-id='type-id-2' visibility='default'/>
       </data-member>
@@ -24,7 +24,7 @@
       </data-member>
     </union-decl>
     <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
-    <function-decl name='fun' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='fun'>
+    <function-decl name='fun' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fun'>
       <parameter type-id='type-id-6'/>
       <return type-id='type-id-7'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi b/tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi
index 91ddf181..42ce36de 100644
--- a/tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi
+++ b/tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi
@@ -3,11 +3,11 @@
     <elf-symbol name='foo' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <array-type-def dimensions='1' type-id='3ed987a4' size-in-bits='12800' alignment-in-bits='64' id='e022be37'>
+    <array-type-def dimensions='1' type-id='3ed987a4' size-in-bits='12800' id='e022be37'>
       <subrange length='50' type-id='f0981eeb' id='3c1860ce'/>
     </array-type-def>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='95e97e5e'/>
-    <class-decl name='A' size-in-bits='256' alignment-in-bits='64' is-struct='yes' visibility='default' id='3ed987a4'>
+    <type-decl name='long int' size-in-bits='64' id='95e97e5e'/>
+    <class-decl name='A' size-in-bits='256' is-struct='yes' visibility='default' id='3ed987a4'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='b' type-id='41d98c5d' visibility='default'/>
       </data-member>
@@ -21,13 +21,13 @@
         <var-decl name='b2' type-id='41d98c5d' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='B' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='41d98c5d'>
+    <class-decl name='B' size-in-bits='64' is-struct='yes' visibility='default' id='41d98c5d'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='a' type-id='84d5ac12' visibility='default'/>
       </data-member>
     </class-decl>
     <typedef-decl name='a_array' type-id='e022be37' id='1c12b755'/>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='f0981eeb'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='f0981eeb'/>
     <pointer-type-def type-id='3ed987a4' size-in-bits='64' alignment-in-bits='64' id='84d5ac12'/>
     <pointer-type-def type-id='1c12b755' size-in-bits='64' alignment-in-bits='64' id='55cd64e8'/>
     <var-decl name='foo' type-id='55cd64e8' mangled-name='foo' visibility='default' elf-symbol-id='foo'/>
diff --git a/tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi b/tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi
index cba10afd..351483de 100644
--- a/tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi
+++ b/tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi
@@ -3,8 +3,8 @@
     <elf-symbol name='a' size='24' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='95e97e5e'/>
-    <class-decl name='A' size-in-bits='192' alignment-in-bits='64' is-struct='yes' visibility='default' id='3ed987a4'>
+    <type-decl name='int' size-in-bits='32' id='95e97e5e'/>
+    <class-decl name='A' size-in-bits='192' is-struct='yes' visibility='default' id='3ed987a4'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='b' type-id='41d98c5d' visibility='default'/>
       </data-member>
@@ -15,7 +15,7 @@
         <var-decl name='b2' type-id='41d98c5d' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='B' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='41d98c5d'>
+    <class-decl name='B' size-in-bits='64' is-struct='yes' visibility='default' id='41d98c5d'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='a' type-id='84d5ac12' visibility='default'/>
       </data-member>
diff --git a/tests/data/test-read-ctf/test-anonymous-fields.o.abi b/tests/data/test-read-ctf/test-anonymous-fields.o.abi
index 2df54c3b..987daa57 100644
--- a/tests/data/test-read-ctf/test-anonymous-fields.o.abi
+++ b/tests/data/test-read-ctf/test-anonymous-fields.o.abi
@@ -3,18 +3,18 @@
     <elf-symbol name='t' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <class-decl name='uprobe_task' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-2'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <class-decl name='uprobe_task' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-2'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='' type-id='type-id-3' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' alignment-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-4'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-4'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='dup_xol_work' type-id='type-id-1' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='64' alignment-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-5'>
+    <class-decl name='' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-5'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='vaddr' type-id='type-id-6' visibility='default'/>
       </data-member>
@@ -27,7 +27,7 @@
         <var-decl name='' type-id='type-id-4' visibility='default'/>
       </data-member>
     </union-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-6'/>
     <var-decl name='t' type-id='type-id-2' mangled-name='t' visibility='default' elf-symbol-id='t'/>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/data/test-read-ctf/test-array-of-pointers.abi b/tests/data/test-read-ctf/test-array-of-pointers.abi
index 47135315..c521bbec 100644
--- a/tests/data/test-read-ctf/test-array-of-pointers.abi
+++ b/tests/data/test-read-ctf/test-array-of-pointers.abi
@@ -6,27 +6,27 @@
     <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='256' alignment-in-bits='64' id='type-id-2'>
       <subrange length='4' type-id='type-id-3' id='type-id-4'/>
     </array-type-def>
-    <class-decl name='cgroup' size-in-bits='256' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-5'>
+    <class-decl name='cgroup' size-in-bits='256' is-struct='yes' visibility='default' id='type-id-5'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='s1' type-id='type-id-2' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='css_set' size-in-bits='256' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-6'>
+    <class-decl name='css_set' size-in-bits='256' is-struct='yes' visibility='default' id='type-id-6'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='s0' type-id='type-id-2' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='state' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-7'>
+    <class-decl name='state' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-7'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='cg' type-id='type-id-8' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='task' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-9'>
+    <class-decl name='task' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-9'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='s' type-id='type-id-10' visibility='default'/>
       </data-member>
     </class-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-3'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
     <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
     <pointer-type-def type-id='type-id-6' size-in-bits='64' alignment-in-bits='64' id='type-id-10'/>
     <pointer-type-def type-id='type-id-7' size-in-bits='64' alignment-in-bits='64' id='type-id-1'/>
diff --git a/tests/data/test-read-ctf/test-callback.abi b/tests/data/test-read-ctf/test-callback.abi
index 7f9b6c5f..3c90e737 100644
--- a/tests/data/test-read-ctf/test-callback.abi
+++ b/tests/data/test-read-ctf/test-callback.abi
@@ -4,12 +4,12 @@
     <elf-symbol name='f2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
-    <function-decl name='assign' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='assign'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-2'/>
+    <function-decl name='assign' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='assign'>
       <return type-id='type-id-3'/>
     </function-decl>
-    <function-decl name='f2' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='f2'>
+    <function-decl name='f2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='f2'>
       <parameter type-id='type-id-1'/>
       <parameter type-id='type-id-2'/>
       <return type-id='type-id-3'/>
diff --git a/tests/data/test-read-ctf/test-callback2.abi b/tests/data/test-read-ctf/test-callback2.abi
index c2ffdb18..87b43d06 100644
--- a/tests/data/test-read-ctf/test-callback2.abi
+++ b/tests/data/test-read-ctf/test-callback2.abi
@@ -3,8 +3,8 @@
     <elf-symbol name='s0' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <class-decl name='s0' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-2'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <class-decl name='s0' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-2'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='mem_fun' type-id='type-id-3' visibility='default'/>
       </data-member>
@@ -12,7 +12,7 @@
     <pointer-type-def type-id='type-id-4' size-in-bits='64' alignment-in-bits='64' id='type-id-3'/>
     <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-5'/>
     <var-decl name='s0' type-id='type-id-5' mangled-name='s0' visibility='default' elf-symbol-id='s0'/>
-    <function-type size-in-bits='64' alignment-in-bits='8' id='type-id-4'>
+    <function-type size-in-bits='64' id='type-id-4'>
       <parameter type-id='type-id-5'/>
       <return type-id='type-id-1'/>
     </function-type>
diff --git a/tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi b/tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi
index 85e780a9..79079b04 100644
--- a/tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi
+++ b/tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi
@@ -4,7 +4,7 @@
     <elf-symbol name='ignore2' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='95e97e5e'/>
+    <type-decl name='long int' size-in-bits='64' id='95e97e5e'/>
     <typedef-decl name='a_t' type-id='95e97e5e' id='40acc204'/>
     <typedef-decl name='b_t' type-id='95e97e5e' id='b3d2db81'/>
     <pointer-type-def type-id='40acc204' size-in-bits='64' alignment-in-bits='64' id='c6fd4117'/>
diff --git a/tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi b/tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi
index 400606dd..74b25d36 100644
--- a/tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi
+++ b/tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi
@@ -4,7 +4,7 @@
     <elf-symbol name='ignore1' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='95e97e5e'/>
+    <type-decl name='long int' size-in-bits='64' id='95e97e5e'/>
     <typedef-decl name='a_t' type-id='95e97e5e' id='40acc204'/>
     <typedef-decl name='b_t' type-id='95e97e5e' id='b3d2db81'/>
     <var-decl name='b' type-id='40acc204' mangled-name='b' visibility='default' elf-symbol-id='b'/>
diff --git a/tests/data/test-read-ctf/test-dynamic-array.o.abi b/tests/data/test-read-ctf/test-dynamic-array.o.abi
index a9849d49..a8978c0c 100644
--- a/tests/data/test-read-ctf/test-dynamic-array.o.abi
+++ b/tests/data/test-read-ctf/test-dynamic-array.o.abi
@@ -3,11 +3,11 @@
     <elf-symbol name='use_struct_s' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='type-id-1'/>
-    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='infinite' alignment-in-bits='8' id='type-id-2'>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='infinite' id='type-id-2'>
       <subrange length='infinite' type-id='type-id-3' id='type-id-4'/>
     </array-type-def>
-    <class-decl name='S' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-5'>
+    <class-decl name='S' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-5'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='a' type-id='type-id-6' visibility='default'/>
       </data-member>
@@ -18,10 +18,10 @@
         <var-decl name='c' type-id='type-id-2' visibility='default'/>
       </data-member>
     </class-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-3'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
     <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
     <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
-    <function-decl name='use_struct_s' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='use_struct_s'>
+    <function-decl name='use_struct_s' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='use_struct_s'>
       <parameter type-id='type-id-7'/>
       <return type-id='type-id-8'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test-fallback.abi b/tests/data/test-read-ctf/test-fallback.abi
index e7d30594..9f09cd56 100644
--- a/tests/data/test-read-ctf/test-fallback.abi
+++ b/tests/data/test-read-ctf/test-fallback.abi
@@ -3,7 +3,7 @@
     <elf-symbol name='a' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
     <var-decl name='a' type-id='type-id-1' mangled-name='a' visibility='default' elf-symbol-id='a'/>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/data/test-read-ctf/test-forward-type-decl.abi b/tests/data/test-read-ctf/test-forward-type-decl.abi
index 026e7d32..c239187b 100644
--- a/tests/data/test-read-ctf/test-forward-type-decl.abi
+++ b/tests/data/test-read-ctf/test-forward-type-decl.abi
@@ -3,7 +3,7 @@
     <elf-symbol name='addr' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <class-decl name='address_space' size-in-bits='128' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-1'>
+    <class-decl name='address_space' size-in-bits='128' is-struct='yes' visibility='default' id='type-id-1'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='rb_root' type-id='type-id-2' visibility='default'/>
       </data-member>
@@ -11,12 +11,12 @@
         <var-decl name='page' type-id='type-id-3' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='page' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-4'>
+    <class-decl name='page' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-4'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='mapping' type-id='type-id-5' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='rb_node' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-6'>
+    <class-decl name='rb_node' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-6'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='rb_left' type-id='type-id-2' visibility='default'/>
       </data-member>
diff --git a/tests/data/test-read-ctf/test-functions-declaration.abi b/tests/data/test-read-ctf/test-functions-declaration.abi
index dd8516fd..193221e4 100644
--- a/tests/data/test-read-ctf/test-functions-declaration.abi
+++ b/tests/data/test-read-ctf/test-functions-declaration.abi
@@ -4,19 +4,19 @@
     <elf-symbol name='attribute_container_device_trigger' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-2'/>
     <pointer-type-def type-id='type-id-3' size-in-bits='64' alignment-in-bits='64' id='type-id-4'/>
-    <function-decl name='attribute_container_add_device' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='attribute_container_add_device'>
+    <function-decl name='attribute_container_add_device' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='attribute_container_add_device'>
       <parameter type-id='type-id-4'/>
       <return type-id='type-id-5'/>
     </function-decl>
-    <function-decl name='attribute_container_device_trigger' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='attribute_container_device_trigger'>
+    <function-decl name='attribute_container_device_trigger' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='attribute_container_device_trigger'>
       <parameter type-id='type-id-4'/>
       <return type-id='type-id-5'/>
     </function-decl>
     <type-decl name='void' id='type-id-5'/>
-    <function-type size-in-bits='64' alignment-in-bits='8' id='type-id-3'>
+    <function-type size-in-bits='64' id='type-id-3'>
       <parameter type-id='type-id-1'/>
       <parameter type-id='type-id-2'/>
       <return type-id='type-id-5'/>
diff --git a/tests/data/test-read-ctf/test-linux-module.abi b/tests/data/test-read-ctf/test-linux-module.abi
index e8081f16..933b9f82 100644
--- a/tests/data/test-read-ctf/test-linux-module.abi
+++ b/tests/data/test-read-ctf/test-linux-module.abi
@@ -7,8 +7,8 @@
     <elf-symbol name='global_sym' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes' crc='0x44a6713b'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <class-decl name='__raw_tickets' size-in-bits='32' alignment-in-bits='16' is-struct='yes' visibility='default' id='type-id-2'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <class-decl name='__raw_tickets' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-2'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='owner' type-id='type-id-3' visibility='default'/>
       </data-member>
@@ -16,17 +16,17 @@
         <var-decl name='next' type-id='type-id-3' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='arch_spinlock_t' size-in-bits='32' alignment-in-bits='32' is-struct='yes' naming-typedef-id='type-id-4' visibility='default' id='type-id-5'>
+    <class-decl name='arch_spinlock_t' size-in-bits='32' is-struct='yes' naming-typedef-id='type-id-4' visibility='default' id='type-id-5'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='' type-id='type-id-6' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='raw_spinlock' size-in-bits='32' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-7'>
+    <class-decl name='raw_spinlock' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-7'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='raw_lock' type-id='type-id-4' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='spinlock' size-in-bits='32' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-8'>
+    <class-decl name='spinlock' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-8'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='' type-id='type-id-9' visibility='default'/>
       </data-member>
@@ -50,13 +50,13 @@
         <var-decl name='tickets' type-id='type-id-2' visibility='default'/>
       </data-member>
     </union-decl>
-    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='type-id-12'/>
-    <type-decl name='unsigned short int' size-in-bits='16' alignment-in-bits='16' id='type-id-10'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-12'/>
+    <type-decl name='unsigned short int' size-in-bits='16' id='type-id-10'/>
     <pointer-type-def type-id='type-id-14' size-in-bits='64' alignment-in-bits='64' id='type-id-16'/>
-    <function-decl name='testexport' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='testexport'>
+    <function-decl name='testexport' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='testexport'>
       <return type-id='type-id-1'/>
     </function-decl>
-    <function-decl name='testexport2' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='testexport2'>
+    <function-decl name='testexport2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='testexport2'>
       <parameter type-id='type-id-16'/>
       <return type-id='type-id-1'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test-list-struct.abi b/tests/data/test-read-ctf/test-list-struct.abi
index ecd4d08b..3fdc6aec 100644
--- a/tests/data/test-read-ctf/test-list-struct.abi
+++ b/tests/data/test-read-ctf/test-list-struct.abi
@@ -4,8 +4,8 @@
     <elf-symbol name='n2' size='16' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <class-decl name='rb_node_b' size-in-bits='128' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-2'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <class-decl name='rb_node_b' size-in-bits='128' is-struct='yes' visibility='default' id='type-id-2'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='this' type-id='type-id-3' visibility='default'/>
       </data-member>
diff --git a/tests/data/test-read-ctf/test0.abi b/tests/data/test-read-ctf/test0.abi
index 2129de41..05430067 100644
--- a/tests/data/test-read-ctf/test0.abi
+++ b/tests/data/test-read-ctf/test0.abi
@@ -20,21 +20,21 @@
     <elf-symbol name='test_volatile' size='2' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='1' alignment-in-bits='8' id='type-id-1'/>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='type-id-2'/>
-    <type-decl name='float' size-in-bits='32' alignment-in-bits='32' id='type-id-3'/>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-4'/>
-    <array-type-def dimensions='1' type-id='type-id-4' size-in-bits='320' alignment-in-bits='32' id='type-id-5'>
+    <type-decl name='' is-anonymous='yes' size-in-bits='1' id='type-id-1'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-2'/>
+    <type-decl name='float' size-in-bits='32' id='type-id-3'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <array-type-def dimensions='1' type-id='type-id-4' size-in-bits='320' id='type-id-5'>
       <subrange length='10' type-id='type-id-6' id='type-id-7'/>
     </array-type-def>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
-    <type-decl name='short int' size-in-bits='16' alignment-in-bits='16' id='type-id-9'/>
-    <class-decl name='S' size-in-bits='32' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-10'>
+    <type-decl name='long int' size-in-bits='64' id='type-id-8'/>
+    <type-decl name='short int' size-in-bits='16' id='type-id-9'/>
+    <class-decl name='S' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-10'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='type-id-4' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' alignment-in-bits='8' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-11'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-11'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='status0' type-id='type-id-1' visibility='default'/>
       </data-member>
@@ -42,7 +42,7 @@
         <var-decl name='status1' type-id='type-id-1' visibility='default'/>
       </data-member>
     </class-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-6'/>
     <pointer-type-def type-id='type-id-10' size-in-bits='64' alignment-in-bits='64' id='type-id-12'/>
     <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-13'/>
     <qualified-type-def type-id='type-id-10' const='yes' id='type-id-14'/>
@@ -53,11 +53,11 @@
     <var-decl name='test_pointer' type-id='type-id-13' mangled-name='test_pointer' visibility='default' elf-symbol-id='test_pointer'/>
     <var-decl name='test_const' type-id='type-id-14' mangled-name='test_const' visibility='default' elf-symbol-id='test_const'/>
     <var-decl name='test_float' type-id='type-id-3' mangled-name='test_float' visibility='default' elf-symbol-id='test_float'/>
-    <function-decl name='foo_1' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo_1'>
+    <function-decl name='foo_1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo_1'>
       <parameter type-id='type-id-12'/>
       <return type-id='type-id-4'/>
     </function-decl>
-    <function-decl name='main' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='main'>
+    <function-decl name='main' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='main'>
       <return type-id='type-id-4'/>
     </function-decl>
     <var-decl name='test_array' type-id='type-id-5' mangled-name='test_array' visibility='default' elf-symbol-id='test_array'/>
diff --git a/tests/data/test-read-ctf/test0.hash.abi b/tests/data/test-read-ctf/test0.hash.abi
index e98c97db..4aa9a93c 100644
--- a/tests/data/test-read-ctf/test0.hash.abi
+++ b/tests/data/test-read-ctf/test0.hash.abi
@@ -20,21 +20,21 @@
     <elf-symbol name='test_volatile' size='2' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='1' alignment-in-bits='8' id='811c9dc5'/>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='a84c031d'/>
-    <type-decl name='float' size-in-bits='32' alignment-in-bits='32' id='a6c45d85'/>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='95e97e5e'/>
-    <array-type-def dimensions='1' type-id='95e97e5e' size-in-bits='320' alignment-in-bits='32' id='b7bd1749'>
+    <type-decl name='' is-anonymous='yes' size-in-bits='1' id='811c9dc5'/>
+    <type-decl name='char' size-in-bits='8' id='a84c031d'/>
+    <type-decl name='float' size-in-bits='32' id='a6c45d85'/>
+    <type-decl name='int' size-in-bits='32' id='95e97e5e'/>
+    <array-type-def dimensions='1' type-id='95e97e5e' size-in-bits='320' id='b7bd1749'>
       <subrange length='10' type-id='f0981eeb' id='487da03a'/>
     </array-type-def>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='95e97e5f'/>
-    <type-decl name='short int' size-in-bits='16' alignment-in-bits='16' id='95e97e60'/>
-    <class-decl name='S' size-in-bits='32' alignment-in-bits='32' is-struct='yes' visibility='default' id='50d9a3fa'>
+    <type-decl name='long int' size-in-bits='64' id='95e97e5f'/>
+    <type-decl name='short int' size-in-bits='16' id='95e97e60'/>
+    <class-decl name='S' size-in-bits='32' is-struct='yes' visibility='default' id='50d9a3fa'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='95e97e5e' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' alignment-in-bits='8' is-struct='yes' is-anonymous='yes' visibility='default' id='b91ffdee'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='b91ffdee'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='status0' type-id='811c9dc5' visibility='default'/>
       </data-member>
@@ -42,7 +42,7 @@
         <var-decl name='status1' type-id='811c9dc5' visibility='default'/>
       </data-member>
     </class-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='f0981eeb'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='f0981eeb'/>
     <pointer-type-def type-id='50d9a3fa' size-in-bits='64' alignment-in-bits='64' id='fd01f598'/>
     <pointer-type-def type-id='a84c031d' size-in-bits='64' alignment-in-bits='64' id='26a90f95'/>
     <qualified-type-def type-id='50d9a3fa' const='yes' id='0fb3b55d'/>
@@ -53,11 +53,11 @@
     <var-decl name='test_pointer' type-id='26a90f95' mangled-name='test_pointer' visibility='default' elf-symbol-id='test_pointer'/>
     <var-decl name='test_const' type-id='0fb3b55d' mangled-name='test_const' visibility='default' elf-symbol-id='test_const'/>
     <var-decl name='test_float' type-id='a6c45d85' mangled-name='test_float' visibility='default' elf-symbol-id='test_float'/>
-    <function-decl name='foo_1' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo_1'>
+    <function-decl name='foo_1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo_1'>
       <parameter type-id='fd01f598'/>
       <return type-id='95e97e5e'/>
     </function-decl>
-    <function-decl name='main' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='main'>
+    <function-decl name='main' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='main'>
       <return type-id='95e97e5e'/>
     </function-decl>
     <var-decl name='test_array' type-id='b7bd1749' mangled-name='test_array' visibility='default' elf-symbol-id='test_array'/>
diff --git a/tests/data/test-read-ctf/test1.so.abi b/tests/data/test-read-ctf/test1.so.abi
index 4d0895a3..822b57a5 100644
--- a/tests/data/test-read-ctf/test1.so.abi
+++ b/tests/data/test-read-ctf/test1.so.abi
@@ -12,7 +12,7 @@
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
-    <class-decl name='opaque_struct' size-in-bits='32' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-3'>
+    <class-decl name='opaque_struct' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-3'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='type-id-4' visibility='default'/>
       </data-member>
@@ -21,7 +21,7 @@
     <typedef-decl name='opaque_struct' type-id='type-id-3' id='type-id-5'/>
     <pointer-type-def type-id='type-id-4' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
     <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
-    <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='fn'>
+    <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fn'>
       <parameter type-id='type-id-7'/>
       <parameter type-id='type-id-6'/>
       <return type-id='type-id-8'/>
diff --git a/tests/data/test-read-ctf/test1.so.hash.abi b/tests/data/test-read-ctf/test1.so.hash.abi
index 89bbb528..b3ace158 100644
--- a/tests/data/test-read-ctf/test1.so.hash.abi
+++ b/tests/data/test-read-ctf/test1.so.hash.abi
@@ -12,7 +12,7 @@
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
-    <class-decl name='opaque_struct' size-in-bits='32' alignment-in-bits='32' is-struct='yes' visibility='default' id='6cde5052'>
+    <class-decl name='opaque_struct' size-in-bits='32' is-struct='yes' visibility='default' id='6cde5052'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='99fcd3a5' visibility='default'/>
       </data-member>
@@ -21,7 +21,7 @@
     <typedef-decl name='opaque_struct' type-id='6cde5052' id='dae69ca1'/>
     <pointer-type-def type-id='99fcd3a5' size-in-bits='64' alignment-in-bits='64' id='0e0526e0'/>
     <pointer-type-def type-id='dae69ca1' size-in-bits='64' alignment-in-bits='64' id='3f6e71d0'/>
-    <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='fn'>
+    <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fn'>
       <parameter type-id='3f6e71d0'/>
       <parameter type-id='0e0526e0'/>
       <return type-id='48b5725f'/>
diff --git a/tests/data/test-read-ctf/test2.so.abi b/tests/data/test-read-ctf/test2.so.abi
index 53001972..f2fb069d 100644
--- a/tests/data/test-read-ctf/test2.so.abi
+++ b/tests/data/test-read-ctf/test2.so.abi
@@ -7,12 +7,12 @@
     <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <class-decl name='S0' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-1'>
+    <class-decl name='S0' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-1'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='type-id-2' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='S1' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-3'>
+    <class-decl name='S1' size-in-bits='64' is-struct='yes' visibility='default' id='type-id-3'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='type-id-4' visibility='default'/>
       </data-member>
@@ -23,11 +23,11 @@
     <qualified-type-def type-id='type-id-8' const='yes' id='type-id-9'/>
     <pointer-type-def type-id='type-id-9' size-in-bits='64' alignment-in-bits='64' id='type-id-5'/>
     <pointer-type-def type-id='type-id-8' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
-    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='bar'>
+    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar'>
       <parameter type-id='type-id-7'/>
       <return type-id='type-id-8'/>
     </function-decl>
-    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo'>
+    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
       <parameter type-id='type-id-6'/>
       <return type-id='type-id-8'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test2.so.hash.abi b/tests/data/test-read-ctf/test2.so.hash.abi
index 84fcaa96..1efd533a 100644
--- a/tests/data/test-read-ctf/test2.so.hash.abi
+++ b/tests/data/test-read-ctf/test2.so.hash.abi
@@ -7,12 +7,12 @@
     <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <class-decl name='S0' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='109cd6fe'>
+    <class-decl name='S0' size-in-bits='64' is-struct='yes' visibility='default' id='109cd6fe'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='eaa32e2f' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='S1' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='119cd891'>
+    <class-decl name='S1' size-in-bits='64' is-struct='yes' visibility='default' id='119cd891'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='m0' type-id='8a34a235' visibility='default'/>
       </data-member>
@@ -23,11 +23,11 @@
     <qualified-type-def type-id='48b5725f' const='yes' id='8581546e'/>
     <pointer-type-def type-id='8581546e' size-in-bits='64' alignment-in-bits='64' id='6e97a70c'/>
     <pointer-type-def type-id='48b5725f' size-in-bits='64' alignment-in-bits='64' id='eaa32e2f'/>
-    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='bar'>
+    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar'>
       <parameter type-id='5e30a4f9'/>
       <return type-id='48b5725f'/>
     </function-decl>
-    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo'>
+    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
       <parameter type-id='842ea234'/>
       <return type-id='48b5725f'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test3.so.abi b/tests/data/test-read-ctf/test3.so.abi
index 25fe7685..8e2492f3 100644
--- a/tests/data/test-read-ctf/test3.so.abi
+++ b/tests/data/test-read-ctf/test3.so.abi
@@ -11,7 +11,7 @@
     <elf-symbol name='foo__' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <function-decl name='__foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='__foo'>
+    <function-decl name='__foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__foo'>
       <return type-id='type-id-1'/>
     </function-decl>
     <type-decl name='void' id='type-id-1'/>
diff --git a/tests/data/test-read-ctf/test3.so.hash.abi b/tests/data/test-read-ctf/test3.so.hash.abi
index 07dd9601..f991d33a 100644
--- a/tests/data/test-read-ctf/test3.so.hash.abi
+++ b/tests/data/test-read-ctf/test3.so.hash.abi
@@ -11,7 +11,7 @@
     <elf-symbol name='foo__' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <function-decl name='__foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='__foo'>
+    <function-decl name='__foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__foo'>
       <return type-id='48b5725f'/>
     </function-decl>
     <type-decl name='void' id='48b5725f'/>
diff --git a/tests/data/test-read-ctf/test4.so.abi b/tests/data/test-read-ctf/test4.so.abi
index 21241d30..9f4e9255 100644
--- a/tests/data/test-read-ctf/test4.so.abi
+++ b/tests/data/test-read-ctf/test4.so.abi
@@ -6,14 +6,14 @@
     <elf-symbol name='cpy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='type-id-1'/>
-    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='type-id-2'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-2'/>
     <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-3'/>
     <qualified-type-def type-id='type-id-3' restrict='yes' id='type-id-4'/>
     <qualified-type-def type-id='type-id-1' const='yes' id='type-id-5'/>
     <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
     <qualified-type-def type-id='type-id-6' restrict='yes' id='type-id-7'/>
-    <function-decl name='cpy' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='cpy'>
+    <function-decl name='cpy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpy'>
       <parameter type-id='type-id-4'/>
       <parameter type-id='type-id-7'/>
       <parameter type-id='type-id-2'/>
diff --git a/tests/data/test-read-ctf/test4.so.hash.abi b/tests/data/test-read-ctf/test4.so.hash.abi
index 40ab7069..1e952c75 100644
--- a/tests/data/test-read-ctf/test4.so.hash.abi
+++ b/tests/data/test-read-ctf/test4.so.hash.abi
@@ -6,14 +6,14 @@
     <elf-symbol name='cpy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='a84c031d'/>
-    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='f0981eeb'/>
+    <type-decl name='char' size-in-bits='8' id='a84c031d'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='f0981eeb'/>
     <pointer-type-def type-id='a84c031d' size-in-bits='64' alignment-in-bits='64' id='26a90f95'/>
     <qualified-type-def type-id='26a90f95' restrict='yes' id='266fe297'/>
     <qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/>
     <pointer-type-def type-id='9b45d938' size-in-bits='64' alignment-in-bits='64' id='80f4b756'/>
     <qualified-type-def type-id='80f4b756' restrict='yes' id='9d26089a'/>
-    <function-decl name='cpy' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='cpy'>
+    <function-decl name='cpy' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpy'>
       <parameter type-id='266fe297'/>
       <parameter type-id='9d26089a'/>
       <parameter type-id='f0981eeb'/>
diff --git a/tests/data/test-read-ctf/test5.o.abi b/tests/data/test-read-ctf/test5.o.abi
index 84eb34d7..6d72d7ab 100644
--- a/tests/data/test-read-ctf/test5.o.abi
+++ b/tests/data/test-read-ctf/test5.o.abi
@@ -8,39 +8,39 @@
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
     <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='type-id-2'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-2'/>
     <enum-decl name='E' linkage-name='E' id='type-id-3'>
       <underlying-type type-id='type-id-1'/>
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-4'/>
-    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-5'/>
-    <type-decl name='long long int' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
+    <type-decl name='long int' size-in-bits='64' id='type-id-5'/>
+    <type-decl name='long long int' size-in-bits='64' id='type-id-6'/>
     <typedef-decl name='long_long' type-id='type-id-6' id='type-id-7'/>
     <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
     <qualified-type-def type-id='type-id-4' const='yes' id='type-id-9'/>
     <qualified-type-def type-id='type-id-5' const='yes' id='type-id-10'/>
     <qualified-type-def type-id='type-id-10' volatile='yes' id='type-id-11'/>
-    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo'>
+    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
       <parameter type-id='type-id-8'/>
       <parameter type-id='type-id-11'/>
       <return type-id='type-id-5'/>
     </function-decl>
-    <function-decl name='baz2' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='baz2'>
+    <function-decl name='baz2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='baz2'>
       <parameter type-id='type-id-4'/>
       <return type-id='type-id-7'/>
     </function-decl>
-    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='bar'>
+    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar'>
       <parameter type-id='type-id-9'/>
       <parameter is-variadic='yes'/>
       <return type-id='type-id-12'/>
     </function-decl>
-    <function-decl name='bar2' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='bar2'>
+    <function-decl name='bar2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar2'>
       <parameter type-id='type-id-3'/>
       <return type-id='type-id-12'/>
     </function-decl>
-    <function-decl name='baz' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='baz'>
+    <function-decl name='baz' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='baz'>
       <parameter type-id='type-id-4'/>
       <return type-id='type-id-12'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test7.o.abi b/tests/data/test-read-ctf/test7.o.abi
index 85468e11..65371cf5 100644
--- a/tests/data/test-read-ctf/test7.o.abi
+++ b/tests/data/test-read-ctf/test7.o.abi
@@ -3,8 +3,8 @@
     <elf-symbol name='first_type_constructor' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <class-decl name='first_type' size-in-bits='128' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-2'>
+    <type-decl name='int' size-in-bits='32' id='type-id-1'/>
+    <class-decl name='first_type' size-in-bits='128' is-struct='yes' visibility='default' id='type-id-2'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='member0' type-id='type-id-3' visibility='default'/>
       </data-member>
@@ -18,16 +18,16 @@
     <typedef-decl name='character' type-id='type-id-6' id='type-id-4'/>
     <typedef-decl name='constructor' type-id='type-id-7' id='type-id-5'/>
     <typedef-decl name='integer' type-id='type-id-1' id='type-id-3'/>
-    <type-decl name='unsigned char' size-in-bits='8' alignment-in-bits='8' id='type-id-6'/>
+    <type-decl name='unsigned char' size-in-bits='8' id='type-id-6'/>
     <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
     <pointer-type-def type-id='type-id-9' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
-    <function-decl name='first_type_constructor' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='first_type_constructor'>
+    <function-decl name='first_type_constructor' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='first_type_constructor'>
       <parameter type-id='type-id-8'/>
       <return type-id='type-id-10'/>
     </function-decl>
     <type-decl name='variadic parameter type' id='type-id-11'/>
     <type-decl name='void' id='type-id-10'/>
-    <function-type size-in-bits='64' alignment-in-bits='8' id='type-id-9'>
+    <function-type size-in-bits='64' id='type-id-9'>
       <parameter is-variadic='yes'/>
       <return type-id='type-id-10'/>
     </function-type>
diff --git a/tests/data/test-read-ctf/test8.o.abi b/tests/data/test-read-ctf/test8.o.abi
index b6996c29..430bc128 100644
--- a/tests/data/test-read-ctf/test8.o.abi
+++ b/tests/data/test-read-ctf/test8.o.abi
@@ -4,7 +4,7 @@
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
     <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
-    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='bar'>
+    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar'>
       <parameter type-id='type-id-2'/>
       <return type-id='type-id-1'/>
     </function-decl>
diff --git a/tests/data/test-read-ctf/test9.o.abi b/tests/data/test-read-ctf/test9.o.abi
index c983d17f..331bfc70 100644
--- a/tests/data/test-read-ctf/test9.o.abi
+++ b/tests/data/test-read-ctf/test9.o.abi
@@ -3,31 +3,31 @@
     <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='type-id-1'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
     <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='448' alignment-in-bits='64' id='type-id-3'>
       <subrange length='7' type-id='type-id-4' id='type-id-5'/>
     </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='infinite' alignment-in-bits='8' id='type-id-6'>
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='infinite' id='type-id-6'>
       <subrange length='infinite' type-id='type-id-4' id='type-id-7'/>
     </array-type-def>
-    <type-decl name='double' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
-    <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='320' alignment-in-bits='64' id='type-id-9'>
+    <type-decl name='double' size-in-bits='64' id='type-id-8'/>
+    <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='320' id='type-id-9'>
       <subrange length='5' type-id='type-id-4' id='type-id-10'/>
     </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-9' size-in-bits='960' alignment-in-bits='64' id='type-id-11'>
+    <array-type-def dimensions='1' type-id='type-id-9' size-in-bits='960' id='type-id-11'>
       <subrange length='3' type-id='type-id-4' id='type-id-12'/>
     </array-type-def>
-    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-13'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-13'/>
     <array-type-def dimensions='1' type-id='type-id-14' size-in-bits='256' alignment-in-bits='64' id='type-id-15'>
       <subrange length='4' type-id='type-id-4' id='type-id-16'/>
     </array-type-def>
     <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='640' alignment-in-bits='64' id='type-id-18'>
       <subrange length='10' type-id='type-id-4' id='type-id-19'/>
     </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-13' size-in-bits='160' alignment-in-bits='32' id='type-id-20'>
+    <array-type-def dimensions='1' type-id='type-id-13' size-in-bits='160' id='type-id-20'>
       <subrange length='5' type-id='type-id-4' id='type-id-10'/>
     </array-type-def>
-    <class-decl name='S' size-in-bits='2304' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-21'>
+    <class-decl name='S' size-in-bits='2304' is-struct='yes' visibility='default' id='type-id-21'>
       <data-member access='public' layout-offset-in-bits='0'>
         <var-decl name='a' type-id='type-id-20' visibility='default'/>
       </data-member>
@@ -44,12 +44,12 @@
         <var-decl name='e' type-id='type-id-6' visibility='default'/>
       </data-member>
     </class-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-4'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-4'/>
     <pointer-type-def type-id='type-id-21' size-in-bits='64' alignment-in-bits='64' id='type-id-22'/>
     <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
     <pointer-type-def type-id='type-id-13' size-in-bits='64' alignment-in-bits='64' id='type-id-14'/>
     <pointer-type-def type-id='type-id-15' size-in-bits='64' alignment-in-bits='64' id='type-id-17'/>
-    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo'>
+    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
       <parameter type-id='type-id-22'/>
       <return type-id='type-id-13'/>
     </function-decl>
-- 
2.38.1



-- 
		Dodji

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 2/5] ctf-front-end: Fix size and name for underlying types
  2022-11-17  3:43 ` [PATCH 2/5] ctf-front-end: Fix size and name for underlying types Guillermo E. Martinez
@ 2022-11-29 11:53   ` Dodji Seketeli
  2022-11-29 13:59     ` Dodji Seketeli
  2022-11-29 18:53     ` [PATCH 2/5] ctf-front-end: " Guillermo E. Martinez
  0 siblings, 2 replies; 16+ messages in thread
From: Dodji Seketeli @ 2022-11-29 11:53 UTC (permalink / raw)
  To: Guillermo E. Martinez via Libabigail; +Cc: Guillermo E. Martinez

Hello Guillermo,

"Guillermo E. Martinez via Libabigail" <libabigail@sourceware.org> a
écrit:

> It fixed an incorrect representation in size and name for underlying
> enum and struct types when it has a bitfield members:
>
>     struct foo
>     {
>       unsigned bar : 2;
>       unsigned baz : 1;
>     };
>
>   <type-decl name='' is-anonymous='yes' size-in-bits='2' id='type-id-1'/>
>
> So, `name' empty property, no showing the right enumerator's type and size
> in bits:
>
>   <type-decl name='unsigned char' size-in-bits='8' id='type-id-4'/>

Hmmh, I think here, the name should be "unsigned int", because "unsigned
bar" implicitly means 'unsigned int bar".  And the size-in-bits should
be set to 32.

I have thus changed the introductory paragraphs of this commit log to
the following:

    This patch fixes an incorrect representation in size and name of the
    underlying type of enums as well as underlying types of bitfield data
    members types.

    For instance, consider this struct.

        struct foo
        {
          unsigned bar : 2;
          unsigned baz : 1;
        };

    The data members bar and baz have an underlying type that is "unsigned
    int".  Yet, the CTF front-end represents the underlying type of these
    data members as:

      <type-decl name='' is-anonymous='yes' size-in-bits='2' id='type-id-1'/>

    The name property is empty, and it should be "unsigned int".

    The size in bit is '2', but it should be the size of the underlying
    "unsigned int", in bits, which is 32.

    In other words, the underlying type of bar and baz should be:

      <type-decl name='unsigned int' size-in-bits='32' id='type-id-4'/>

    Note that today, libabigail doesn't represent the bitfield properties
    of the data member.  Those bitfield properties are properties of the
    data member, not of their type.  This is a known "Not Yet Implemented"
    feature request that has been filed upstream at
    https://sourceware.org/bugzilla/show_bug.cgi?id=27334.

    Similarly, the underlying type of enums is not properly represented by
    the CTF front-end.

    Fixed thus.

It's a little bit more verbose, but hopefully, that should give a little
bit more context for future code maintenance.

>
> 	* src/abg-ctf-reader.cc (process_ctf_{base_type,enum_type}):
> 	Look at ctf refence type to build the underlying type if present.
> 	* tests/data/Makefile.am: New test cases.
> 	* tests/data/test-read-ctf/PR27700/test-PR27700.abi: New test input.
> 	* tests/data/test-read-ctf/test-bitfield-enum.abi: Likewise.
> 	* tests/data/test-read-ctf/test-bitfield-enum.c: Likewise.
> 	* tests/data/test-read-ctf/test-bitfield-enum.o: Likewise.
> 	* tests/data/test-read-ctf/test-bitfield.abi: Likewise.
> 	* tests/data/test-read-ctf/test-bitfield.c: Likewise.
> 	* tests/data/test-read-ctf/test-bitfield.o: Likewise.
> 	* tests/data/test-read-ctf/test-enum-many.o.hash.abi: Adjust.
> 	* tests/data/test-read-ctf/test-enum-symbol.o.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test-enum.o.abi: Likewise:
> 	* tests/data/test-read-ctf/test0.abi: Likewise.
> 	* tests/data/test-read-ctf/test0.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test1.so.abi: Likewise.
> 	* tests/data/test-read-ctf/test1.so.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test5.o.abi: Likewise.
> 	* tests/test-read-ctf.cc: Update test suite.
>
> Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>

Applied to the master branch with the change above.  Please find below
the actual patch that got applied.

Many thanks!

[...]

From 217f579bf788a11643c0066a7dc8aa76faa5a05d Mon Sep 17 00:00:00 2001
From: "Guillermo E. Martinez" <guillermo.e.martinez@oracle.com>
Date: Wed, 16 Nov 2022 21:43:02 -0600
Subject: [PATCH] ctf-reader: Fix size and name for underlying types

This patch fixes an incorrect representation in size and name of the
underlying type of enums as well as underlying types of bitfield data
members types.

For instance, consider this struct.

    struct foo
    {
      unsigned bar : 2;
      unsigned baz : 1;
    };

The data members bar and baz have an underlying type that is "unsigned
int".  Yet, the CTF front-end represents the underlying type of these
data members as:

  <type-decl name='' is-anonymous='yes' size-in-bits='2' id='type-id-1'/>

The name property is empty, and it should be "unsigned int".

The size in bit is '2', but it should be the size of the underlying
"unsigned int", in bits, which is 32.

In other words, the underlying type of bar and baz should be:

  <type-decl name='unsigned int' size-in-bits='32' id='type-id-4'/>

Note that today, libabigail doesn't represent the bitfield properties
of the data member.  Those bitfield properties are properties of the
data member, not of their type.  This is a known "Not Yet Implemented"
feature request that has been filed upstream at
https://sourceware.org/bugzilla/show_bug.cgi?id=27334.

Similarly, the underlying type of enums is not properly represented by
the CTF front-end.

Fixed thus.

	* src/abg-ctf-reader.cc (process_ctf_{base_type,enum_type}):
	Look at ctf refence type to build the underlying type if present.
	* tests/data/Makefile.am: New test cases.
	* tests/data/test-read-ctf/PR27700/test-PR27700.abi: New test input.
	* tests/data/test-read-ctf/test-bitfield-enum.abi: Likewise.
	* tests/data/test-read-ctf/test-bitfield-enum.c: Likewise.
	* tests/data/test-read-ctf/test-bitfield-enum.o: Likewise.
	* tests/data/test-read-ctf/test-bitfield.abi: Likewise.
	* tests/data/test-read-ctf/test-bitfield.c: Likewise.
	* tests/data/test-read-ctf/test-bitfield.o: Likewise.
	* tests/data/test-read-ctf/test-enum-many.o.hash.abi: Adjust.
	* tests/data/test-read-ctf/test-enum-symbol.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-enum.o.abi: Likewise:
	* tests/data/test-read-ctf/test0.abi: Likewise.
	* tests/data/test-read-ctf/test0.hash.abi: Likewise.
	* tests/data/test-read-ctf/test1.so.abi: Likewise.
	* tests/data/test-read-ctf/test1.so.hash.abi: Likewise.
	* tests/data/test-read-ctf/test5.o.abi: Likewise.
	* tests/test-read-ctf.cc: Update test suite.

Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 src/abg-ctf-reader.cc | 31 +++++++++++++++++++++----------
 1 file changed, 21 insertions(+), 10 deletions(-)

diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc
index cbc5cbca..d000556b 100644
--- a/src/abg-ctf-reader.cc
+++ b/src/abg-ctf-reader.cc
@@ -783,15 +783,17 @@ process_ctf_base_type(reader *rdr,
   translation_unit_sptr tunit = rdr->cur_transl_unit();
   type_decl_sptr result;
 
-  const char *type_name = ctf_type_name_raw(ctf_dictionary, ctf_type);
+  ctf_id_t ctf_ref = ctf_type_reference(ctf_dictionary, ctf_type);
+  const char *type_name = ctf_type_name_raw(ctf_dictionary,
+                                            (ctf_ref != CTF_ERR) ? ctf_ref : ctf_type);
 
   /* Get the type encoding and extract some useful properties of
      the type from it.  In case of any error, just ignore the
      type.  */
   ctf_encoding_t type_encoding;
   if (ctf_type_encoding(ctf_dictionary,
-                         ctf_type,
-                         &type_encoding))
+                        (ctf_ref != CTF_ERR) ? ctf_ref : ctf_type,
+                        &type_encoding))
     return result;
 
   /* Create the IR type corresponding to the CTF type.  */
@@ -1357,7 +1359,10 @@ process_ctf_enum_type(reader *rdr,
 {
   translation_unit_sptr tunit = rdr->cur_transl_unit();
   enum_type_decl_sptr result;
-  std::string enum_name = ctf_type_name_raw(ctf_dictionary, ctf_type);
+  ctf_id_t ctf_ref = ctf_type_reference(ctf_dictionary, ctf_type);
+  std::string enum_name = ctf_type_name_raw(ctf_dictionary,
+                                            (ctf_ref != CTF_ERR)
+                                              ? ctf_ref : ctf_type);
 
   if (!enum_name.empty())
     if (corpus_sptr corp = rdr->should_reuse_type_from_corpus_group())
@@ -1367,18 +1372,24 @@ process_ctf_enum_type(reader *rdr,
   /* Build a signed integral type for the type of the enumerators, aka
      the underlying type.  The size of the enumerators in bytes is
      specified in the CTF enumeration type.  */
-  size_t utype_size_in_bits = ctf_type_size(ctf_dictionary, ctf_type) * 8;
-  type_decl_sptr utype;
+  size_t utype_size_in_bits = ctf_type_size(ctf_dictionary,
+                                            (ctf_ref != CTF_ERR)
+                                              ? ctf_ref : ctf_type) * 8;
+  string underlying_type_name =
+        build_internal_underlying_enum_type_name(enum_name, true,
+                                                 utype_size_in_bits);
 
+  type_decl_sptr utype;
   utype.reset(new type_decl(rdr->env(),
-                              "",
-                              utype_size_in_bits,
-                              utype_size_in_bits,
-                              location()));
+                            underlying_type_name,
+                            utype_size_in_bits,
+                            utype_size_in_bits,
+                            location()));
   utype->set_is_anonymous(true);
   utype->set_is_artificial(true);
   if (!utype)
     return result;
+
   add_decl_to_scope(utype, tunit->get_global_scope());
   canonicalize(utype);
 
-- 
2.38.1


-- 
		Dodji

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 2/5] ctf-front-end: Fix size and name for underlying types
  2022-11-29 11:53   ` Dodji Seketeli
@ 2022-11-29 13:59     ` Dodji Seketeli
  2022-11-29 18:32       ` [PATCHv2 2/5]ctf-front-end: " Guillermo E. Martinez
  2022-11-29 18:53     ` [PATCH 2/5] ctf-front-end: " Guillermo E. Martinez
  1 sibling, 1 reply; 16+ messages in thread
From: Dodji Seketeli @ 2022-11-29 13:59 UTC (permalink / raw)
  To: Guillermo E. Martinez; +Cc: Guillermo E. Martinez via Libabigail

Hello Guillermo,

When applying the patch "ctf-front-end: Fix size and name for underlying
types", the patch wouldn't apply cleanly, so I had to edit it.

I screwed up and forgot to apply the tests part of the patch.

Please find below the testing part that I forgot to apply.

Could you please review it and sign it off?

Thank you and sorry for my mistake.

Cheers,

From 454c88e6b5381e4376a6062e18dbe888d0eb5e72 Mon Sep 17 00:00:00 2001
From: Dodji Seketeli <dodji@redhat.com>
Date: Tue, 29 Nov 2022 13:42:43 +0100
Subject: [PATCH] test-read-ctf: Update tests for fixing size and name for
 underlying types

When applying the previous commit the testing bit felt through the
crack.  Oops.  Fixed thus.

Here is the link to the initial post:
https://inbox.sourceware.org/libabigail/871qpmou3k.fsf@seketeli.org/T/#m5f37b419e580a2a4ea9d91a9394382d886358809

	* src/abg-ctf-reader.cc (process_ctf_{base_type,enum_type}):
	Look at ctf refence type to build the underlying type if present.
	* tests/data/Makefile.am: New test cases.
	* tests/data/test-read-ctf/PR27700/test-PR27700.abi: New test input.
	* tests/data/test-read-ctf/test-bitfield-enum.abi: Likewise.
	* tests/data/test-read-ctf/test-bitfield-enum.c: Likewise.
	* tests/data/test-read-ctf/test-bitfield-enum.o: Likewise.
	* tests/data/test-read-ctf/test-bitfield.abi: Likewise.
	* tests/data/test-read-ctf/test-bitfield.c: Likewise.
	* tests/data/test-read-ctf/test-bitfield.o: Likewise.
	* tests/data/test-read-ctf/test-enum-many.o.hash.abi: Adjust.
	* tests/data/test-read-ctf/test-enum-symbol.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-enum.o.abi: Likewise:
	* tests/data/test-read-ctf/test0.abi: Likewise.
	* tests/data/test-read-ctf/test0.hash.abi: Likewise.
	* tests/data/test-read-ctf/test1.so.abi: Likewise.
	* tests/data/test-read-ctf/test1.so.hash.abi: Likewise.
	* tests/data/test-read-ctf/test5.o.abi: Likewise.
	* tests/test-read-ctf.cc: Update test suite.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 tests/data/Makefile.am                        |   6 +++
 .../test-read-ctf/PR27700/test-PR27700.abi    |   4 +-
 .../data/test-read-ctf/test-bitfield-enum.abi |  18 +++++++
 tests/data/test-read-ctf/test-bitfield-enum.c |  12 +++++
 tests/data/test-read-ctf/test-bitfield-enum.o | Bin 0 -> 1336 bytes
 tests/data/test-read-ctf/test-bitfield.abi    |  28 ++++++++++
 tests/data/test-read-ctf/test-bitfield.c      |  15 ++++++
 tests/data/test-read-ctf/test-bitfield.o      | Bin 0 -> 1488 bytes
 .../test-read-ctf/test-enum-many.o.hash.abi   |   6 +--
 .../test-read-ctf/test-enum-symbol.o.hash.abi |   4 +-
 tests/data/test-read-ctf/test-enum.o.abi      |  10 ++--
 tests/data/test-read-ctf/test0.abi            |  48 +++++++++---------
 tests/data/test-read-ctf/test0.hash.abi       |  10 ++--
 tests/data/test-read-ctf/test1.so.abi         |   8 +--
 tests/data/test-read-ctf/test1.so.hash.abi    |   4 +-
 tests/data/test-read-ctf/test5.o.abi          |  12 ++---
 tests/test-read-ctf.cc                        |  18 +++++++
 17 files changed, 150 insertions(+), 53 deletions(-)
 create mode 100644 tests/data/test-read-ctf/test-bitfield-enum.abi
 create mode 100644 tests/data/test-read-ctf/test-bitfield-enum.c
 create mode 100644 tests/data/test-read-ctf/test-bitfield-enum.o
 create mode 100644 tests/data/test-read-ctf/test-bitfield.abi
 create mode 100644 tests/data/test-read-ctf/test-bitfield.c
 create mode 100644 tests/data/test-read-ctf/test-bitfield.o

diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 4b6e9305..b89a4dd8 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -704,6 +704,12 @@ test-read-ctf/test-linux-module.ko		\
 test-read-ctf/test-fallback.abi		\
 test-read-ctf/test-fallback.c		\
 test-read-ctf/test-fallback.o		\
+test-read-ctf/test-bitfield.abi		\
+test-read-ctf/test-bitfield.c		\
+test-read-ctf/test-bitfield.o		\
+test-read-ctf/test-bitfield-enum.abi	\
+test-read-ctf/test-bitfield-enum.c	\
+test-read-ctf/test-bitfield-enum.o	\
 \
 test-annotate/test0.abi			\
 test-annotate/test1.abi			\
diff --git a/tests/data/test-read-ctf/PR27700/test-PR27700.abi b/tests/data/test-read-ctf/PR27700/test-PR27700.abi
index 4f34eb8a..1a7c229e 100644
--- a/tests/data/test-read-ctf/PR27700/test-PR27700.abi
+++ b/tests/data/test-read-ctf/PR27700/test-PR27700.abi
@@ -3,14 +3,14 @@
     <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='811c9dc5'/>
     <enum-decl name='foo' linkage-name='foo' id='022218d8'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='foo_e0' value='0'/>
       <enumerator name='foo_e1' value='1'/>
       <enumerator name='foo_e2' value='2'/>
       <enumerator name='foo_e3' value='3'/>
     </enum-decl>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
     <pointer-type-def type-id='022218d8' size-in-bits='64' alignment-in-bits='64' id='8750e847'/>
     <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
       <parameter type-id='8750e847'/>
diff --git a/tests/data/test-read-ctf/test-bitfield-enum.abi b/tests/data/test-read-ctf/test-bitfield-enum.abi
new file mode 100644
index 00000000..b95f1781
--- /dev/null
+++ b/tests/data/test-read-ctf/test-bitfield-enum.abi
@@ -0,0 +1,18 @@
+<abi-corpus version='2.1' path='data/test-read-ctf/test-bitfield-enum.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='e' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr address-size='64' language='LANG_C'>
+    <enum-decl name='event_kind' linkage-name='event_kind' id='type-id-1'>
+      <underlying-type type-id='type-id-2'/>
+      <enumerator name='NO_EVENT' value='0'/>
+    </enum-decl>
+    <class-decl name='input' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='kind' type-id='type-id-1' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-2'/>
+    <var-decl name='e' type-id='type-id-3' mangled-name='e' visibility='default' elf-symbol-id='e'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-bitfield-enum.c b/tests/data/test-read-ctf/test-bitfield-enum.c
new file mode 100644
index 00000000..502ec06a
--- /dev/null
+++ b/tests/data/test-read-ctf/test-bitfield-enum.c
@@ -0,0 +1,12 @@
+/* gcc -gctf -c test-bitfield-enum.c -o test-bitfield-enum.o */
+enum event_kind
+{
+  NO_EVENT,
+};
+
+struct input
+{
+  enum event_kind kind : 16;
+};
+
+struct input e;
diff --git a/tests/data/test-read-ctf/test-bitfield-enum.o b/tests/data/test-read-ctf/test-bitfield-enum.o
new file mode 100644
index 0000000000000000000000000000000000000000..2c532f50c724f7bf4327b7c36699a432ca08eab1
GIT binary patch
literal 1336
zcmbVL&2G~`5T1lkeh>7}s)CE@g;e0R6E4sLvQ&j4gu(@SLuGAm(^c(tWN#ojAvp0!
z9C;I-0bT%R?A>IwlnWz$p1<!~?~LqElUL9Cy&hQW!86!owhFN9Z{nm46SxI8;n$DB
zx)W_EFu<5_-QW)T_lPfuD~Qm5VtOB9pZK>CWILVPqFR91M<C}e<wFD+#m1h{CFmRg
ze3SSfls>(XDu?Oo)5*zX`UV!NkuxRoKq?JV%@-P4f`I6}Dn*p8(p6N|JS#-h)LB%>
zl&5mWWf3azG18*ZO_X!Z+c2yJ&%;cgby+I)nG{7H3biO%25@|IbQlber*98}(PI{~
zI2gy{@n{r34TfSl7qu+$io7^zuZ#~n=T(eR27Ty#cjm*{y1bjws{Z!WAHdJwerFd8
z+wJDN&iZT`EcEX$09dmsHBZs&y7T8Y(qgHB(Jp|cO#=+~fRC!AnSiNE3x+d<jpo^f
z$!BW8=5>XW>y>}E|H<#6h-TgL#EF;N)Zg2EY*3B9Ki3jBabjQp0DJUp|4YB#uQ|id
zA7R};lc)(j(00A1m%<1+REvr1*oh%NbZQh@z4eDq&82>}1h;qz_a)Y@A?Uwz?W@uI
y_o7|7Ml@eb{clG9!jNwmp4IO;b$|D5%N%NXhQ6NP=Gz!trr$IAca~_pzm`9z|8lDU

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test-bitfield.abi b/tests/data/test-read-ctf/test-bitfield.abi
new file mode 100644
index 00000000..4231ba3e
--- /dev/null
+++ b/tests/data/test-read-ctf/test-bitfield.abi
@@ -0,0 +1,28 @@
+<abi-corpus version='2.1' path='data/test-read-ctf/test-bitfield.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='f' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='fb' size='1' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr address-size='64' language='LANG_C'>
+    <class-decl name='foo' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='bar' type-id='type-id-2' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='2'>
+        <var-decl name='baz' type-id='type-id-2' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <class-decl name='foobar' size-in-bits='8' is-struct='yes' visibility='default' id='type-id-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='bar' type-id='type-id-4' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='2'>
+        <var-decl name='baz' type-id='type-id-4' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='unsigned char' size-in-bits='8' id='type-id-4'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-2'/>
+    <var-decl name='f' type-id='type-id-1' mangled-name='f' visibility='default' elf-symbol-id='f'/>
+    <var-decl name='fb' type-id='type-id-3' mangled-name='fb' visibility='default' elf-symbol-id='fb'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-bitfield.c b/tests/data/test-read-ctf/test-bitfield.c
new file mode 100644
index 00000000..7d76d2f4
--- /dev/null
+++ b/tests/data/test-read-ctf/test-bitfield.c
@@ -0,0 +1,15 @@
+/* gcc -gctf -c test-bitfield.c -o test-bitfield.o */
+struct foo
+{
+  unsigned bar : 2;
+  unsigned baz : 1;
+};
+
+struct foobar 
+{
+  unsigned char bar : 2;
+  unsigned char baz : 1;
+};
+
+struct foo f;
+struct foobar fb;
diff --git a/tests/data/test-read-ctf/test-bitfield.o b/tests/data/test-read-ctf/test-bitfield.o
new file mode 100644
index 0000000000000000000000000000000000000000..c23c8188d880587f2ba78b8b852cdb067607e4b6
GIT binary patch
literal 1488
zcmbVM&2G~`5FVEh3S3$$Arvm|iB=FhNe{FYLXj${gb+85NZ8IMu}JL7-in3`cOC%o
z6g&e@fw=Ju@B%QOcgI<lp93S!&dm4CjCUs8zJ2uc@kS7kNI(y19SKUbb!qL78+T0C
z=^B0i+Sw51fjDe8t!}Y}hOA#$-?3h1#W#*v?^~5vIBweOFn5C$g3sS%#m9gnkEIJg
zglFUseawa0YdKgzJ;V2q7n>To!uG)6&AoRG-bD`2A&r_o-G&p09E`K4Wl85nozDt2
z3G+fznpCWBK)`LeY~B!-q-jd=yj-d{U8SqItdeY@;=0P>MV=;UK1=dNzfiAZt!iDz
zlSC(t+pknI>1TRsqBPgjTrDP1Ms#{|avbiRK6}0&4iBP1Gzdq7(P%gv9EE%8;!IWf
zQWZK`?3+=|PD2i`S1#kBgHPD4NMK{^<X-~5L*IV*Iok|uH@~7`r1y@+C2sp;*1j{+
z6kDRGUM+Q!velKbbMdsg&=g@g6s2`d5if?1a*0VPDoU*)o~&Q%BztA!S#chnRVD93
zulyVTUwoU(FoXF!S@#&P-Cw+RUW@Ls1?D`rh8Z{K?}uN1hg0zO{#I|_P1{KJF2Fr@
z{GQ;(I9T3$q!-eVbASzy?8s-Ec-O(;O1;=)2Xj+{_Q|>Ex?a#H?BG57>6;et?}c5t
yf_wP2;14bM5&_FqRzOmJ3m^+{fA_#Y*n0dAb4BJB4DaMm^&f5h3rV!rum1@|M0T$L

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test-enum-many.o.hash.abi b/tests/data/test-read-ctf/test-enum-many.o.hash.abi
index 116325f9..9119525b 100644
--- a/tests/data/test-read-ctf/test-enum-many.o.hash.abi
+++ b/tests/data/test-read-ctf/test-enum-many.o.hash.abi
@@ -4,14 +4,13 @@
     <elf-symbol name='foo' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='811c9dc5'/>
     <enum-decl name='e' linkage-name='e' id='a6c2eddf'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='ENUMSAMPLE_1' value='0'/>
       <enumerator name='ENUMSAMPLE_2' value='1'/>
     </enum-decl>
     <enum-decl name='ie' linkage-name='ie' id='1ee696ca'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='IE_0' value='-10'/>
       <enumerator name='IE_1' value='-9'/>
       <enumerator name='IE_2' value='-8'/>
@@ -61,6 +60,7 @@
       <enumerator name='IE_2E' value='36'/>
       <enumerator name='IE_2F' value='37'/>
     </enum-decl>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
     <var-decl name='foo' type-id='a6c2eddf' mangled-name='foo' visibility='default' elf-symbol-id='foo'/>
     <var-decl name='bar' type-id='1ee696ca' mangled-name='bar' visibility='default' elf-symbol-id='bar'/>
   </abi-instr>
diff --git a/tests/data/test-read-ctf/test-enum-symbol.o.hash.abi b/tests/data/test-read-ctf/test-enum-symbol.o.hash.abi
index f4911bc4..da68828c 100644
--- a/tests/data/test-read-ctf/test-enum-symbol.o.hash.abi
+++ b/tests/data/test-read-ctf/test-enum-symbol.o.hash.abi
@@ -3,13 +3,13 @@
     <elf-symbol name='primary1' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='811c9dc5'/>
     <enum-decl name='' is-anonymous='yes' id='08f5ca17'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='red1' value='0'/>
       <enumerator name='green1' value='1'/>
       <enumerator name='blue1' value='2'/>
     </enum-decl>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
     <var-decl name='primary1' type-id='08f5ca17' mangled-name='primary1' visibility='default' elf-symbol-id='primary1'/>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/data/test-read-ctf/test-enum.o.abi b/tests/data/test-read-ctf/test-enum.o.abi
index bd3a55be..e13ebdd0 100644
--- a/tests/data/test-read-ctf/test-enum.o.abi
+++ b/tests/data/test-read-ctf/test-enum.o.abi
@@ -4,19 +4,19 @@
     <elf-symbol name='foo' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <enum-decl name='e' linkage-name='e' id='type-id-2'>
-      <underlying-type type-id='type-id-1'/>
+    <enum-decl name='e' linkage-name='e' id='type-id-1'>
+      <underlying-type type-id='type-id-2'/>
       <enumerator name='ENUMSAMPLE_1' value='0'/>
       <enumerator name='ENUMSAMPLE_2' value='1'/>
     </enum-decl>
     <enum-decl name='ie' linkage-name='ie' id='type-id-3'>
-      <underlying-type type-id='type-id-1'/>
+      <underlying-type type-id='type-id-2'/>
       <enumerator name='IENUMSAMPLE_1' value='-10'/>
       <enumerator name='IENUMSAMPLE_2' value='-9'/>
       <enumerator name='IENUMSAMPLE_3' value='-8'/>
     </enum-decl>
-    <var-decl name='foo' type-id='type-id-2' mangled-name='foo' visibility='default' elf-symbol-id='foo'/>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-2'/>
+    <var-decl name='foo' type-id='type-id-1' mangled-name='foo' visibility='default' elf-symbol-id='foo'/>
     <var-decl name='bar' type-id='type-id-3' mangled-name='bar' visibility='default' elf-symbol-id='bar'/>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/data/test-read-ctf/test0.abi b/tests/data/test-read-ctf/test0.abi
index 05430067..60d3cf1e 100644
--- a/tests/data/test-read-ctf/test0.abi
+++ b/tests/data/test-read-ctf/test0.abi
@@ -20,47 +20,47 @@
     <elf-symbol name='test_volatile' size='2' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='1' id='type-id-1'/>
-    <type-decl name='char' size-in-bits='8' id='type-id-2'/>
-    <type-decl name='float' size-in-bits='32' id='type-id-3'/>
-    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
-    <array-type-def dimensions='1' type-id='type-id-4' size-in-bits='320' id='type-id-5'>
-      <subrange length='10' type-id='type-id-6' id='type-id-7'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <type-decl name='float' size-in-bits='32' id='type-id-2'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-3'/>
+    <array-type-def dimensions='1' type-id='type-id-3' size-in-bits='320' id='type-id-4'>
+      <subrange length='10' type-id='type-id-5' id='type-id-6'/>
     </array-type-def>
-    <type-decl name='long int' size-in-bits='64' id='type-id-8'/>
-    <type-decl name='short int' size-in-bits='16' id='type-id-9'/>
-    <class-decl name='S' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-10'>
+    <type-decl name='long int' size-in-bits='64' id='type-id-7'/>
+    <type-decl name='short int' size-in-bits='16' id='type-id-8'/>
+    <class-decl name='S' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-9'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='m0' type-id='type-id-4' visibility='default'/>
+        <var-decl name='m0' type-id='type-id-3' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-11'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-10'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='status0' type-id='type-id-1' visibility='default'/>
+        <var-decl name='status0' type-id='type-id-11' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='1'>
-        <var-decl name='status1' type-id='type-id-1' visibility='default'/>
+        <var-decl name='status1' type-id='type-id-11' visibility='default'/>
       </data-member>
     </class-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-6'/>
-    <pointer-type-def type-id='type-id-10' size-in-bits='64' alignment-in-bits='64' id='type-id-12'/>
-    <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-13'/>
-    <qualified-type-def type-id='type-id-10' const='yes' id='type-id-14'/>
-    <pointer-type-def type-id='type-id-8' size-in-bits='64' alignment-in-bits='64' id='type-id-15'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-11'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-5'/>
+    <pointer-type-def type-id='type-id-9' size-in-bits='64' alignment-in-bits='64' id='type-id-12'/>
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-13'/>
+    <qualified-type-def type-id='type-id-9' const='yes' id='type-id-14'/>
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' alignment-in-bits='64' id='type-id-15'/>
     <qualified-type-def type-id='type-id-15' restrict='yes' id='type-id-16'/>
-    <qualified-type-def type-id='type-id-9' volatile='yes' id='type-id-17'/>
-    <var-decl name='status' type-id='type-id-11' mangled-name='status' visibility='default' elf-symbol-id='status'/>
+    <qualified-type-def type-id='type-id-8' volatile='yes' id='type-id-17'/>
+    <var-decl name='status' type-id='type-id-10' mangled-name='status' visibility='default' elf-symbol-id='status'/>
     <var-decl name='test_pointer' type-id='type-id-13' mangled-name='test_pointer' visibility='default' elf-symbol-id='test_pointer'/>
     <var-decl name='test_const' type-id='type-id-14' mangled-name='test_const' visibility='default' elf-symbol-id='test_const'/>
-    <var-decl name='test_float' type-id='type-id-3' mangled-name='test_float' visibility='default' elf-symbol-id='test_float'/>
+    <var-decl name='test_float' type-id='type-id-2' mangled-name='test_float' visibility='default' elf-symbol-id='test_float'/>
     <function-decl name='foo_1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo_1'>
       <parameter type-id='type-id-12'/>
-      <return type-id='type-id-4'/>
+      <return type-id='type-id-3'/>
     </function-decl>
     <function-decl name='main' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='main'>
-      <return type-id='type-id-4'/>
+      <return type-id='type-id-3'/>
     </function-decl>
-    <var-decl name='test_array' type-id='type-id-5' mangled-name='test_array' visibility='default' elf-symbol-id='test_array'/>
+    <var-decl name='test_array' type-id='type-id-4' mangled-name='test_array' visibility='default' elf-symbol-id='test_array'/>
     <var-decl name='test_restrict' type-id='type-id-16' mangled-name='test_restrict' visibility='default' elf-symbol-id='test_restrict'/>
     <var-decl name='test_volatile' type-id='type-id-17' mangled-name='test_volatile' visibility='default' elf-symbol-id='test_volatile'/>
   </abi-instr>
diff --git a/tests/data/test-read-ctf/test0.hash.abi b/tests/data/test-read-ctf/test0.hash.abi
index 4aa9a93c..76dd581e 100644
--- a/tests/data/test-read-ctf/test0.hash.abi
+++ b/tests/data/test-read-ctf/test0.hash.abi
@@ -20,7 +20,6 @@
     <elf-symbol name='test_volatile' size='2' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='1' id='811c9dc5'/>
     <type-decl name='char' size-in-bits='8' id='a84c031d'/>
     <type-decl name='float' size-in-bits='32' id='a6c45d85'/>
     <type-decl name='int' size-in-bits='32' id='95e97e5e'/>
@@ -34,14 +33,15 @@
         <var-decl name='m0' type-id='95e97e5e' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='b91ffdee'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='000d9e42'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='status0' type-id='811c9dc5' visibility='default'/>
+        <var-decl name='status0' type-id='f0981eec' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='1'>
-        <var-decl name='status1' type-id='811c9dc5' visibility='default'/>
+        <var-decl name='status1' type-id='f0981eec' visibility='default'/>
       </data-member>
     </class-decl>
+    <type-decl name='unsigned int' size-in-bits='32' id='f0981eec'/>
     <type-decl name='unsigned long int' size-in-bits='64' id='f0981eeb'/>
     <pointer-type-def type-id='50d9a3fa' size-in-bits='64' alignment-in-bits='64' id='fd01f598'/>
     <pointer-type-def type-id='a84c031d' size-in-bits='64' alignment-in-bits='64' id='26a90f95'/>
@@ -49,7 +49,7 @@
     <pointer-type-def type-id='95e97e5f' size-in-bits='64' alignment-in-bits='64' id='7292109c'/>
     <qualified-type-def type-id='7292109c' restrict='yes' id='6942f6a4'/>
     <qualified-type-def type-id='95e97e60' volatile='yes' id='e024ff18'/>
-    <var-decl name='status' type-id='b91ffdee' mangled-name='status' visibility='default' elf-symbol-id='status'/>
+    <var-decl name='status' type-id='000d9e42' mangled-name='status' visibility='default' elf-symbol-id='status'/>
     <var-decl name='test_pointer' type-id='26a90f95' mangled-name='test_pointer' visibility='default' elf-symbol-id='test_pointer'/>
     <var-decl name='test_const' type-id='0fb3b55d' mangled-name='test_const' visibility='default' elf-symbol-id='test_const'/>
     <var-decl name='test_float' type-id='a6c45d85' mangled-name='test_float' visibility='default' elf-symbol-id='test_float'/>
diff --git a/tests/data/test-read-ctf/test1.so.abi b/tests/data/test-read-ctf/test1.so.abi
index 822b57a5..2ecd5826 100644
--- a/tests/data/test-read-ctf/test1.so.abi
+++ b/tests/data/test-read-ctf/test1.so.abi
@@ -6,9 +6,8 @@
     <elf-symbol name='fn' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <enum-decl name='opaque_enum' linkage-name='opaque_enum' id='type-id-2'>
-      <underlying-type type-id='type-id-1'/>
+    <enum-decl name='opaque_enum' linkage-name='opaque_enum' id='type-id-1'>
+      <underlying-type type-id='type-id-2'/>
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
@@ -17,8 +16,9 @@
         <var-decl name='m0' type-id='type-id-4' visibility='default'/>
       </data-member>
     </class-decl>
-    <typedef-decl name='opaque_enum' type-id='type-id-2' id='type-id-4'/>
+    <typedef-decl name='opaque_enum' type-id='type-id-1' id='type-id-4'/>
     <typedef-decl name='opaque_struct' type-id='type-id-3' id='type-id-5'/>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-2'/>
     <pointer-type-def type-id='type-id-4' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
     <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
     <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fn'>
diff --git a/tests/data/test-read-ctf/test1.so.hash.abi b/tests/data/test-read-ctf/test1.so.hash.abi
index b3ace158..4f8633dd 100644
--- a/tests/data/test-read-ctf/test1.so.hash.abi
+++ b/tests/data/test-read-ctf/test1.so.hash.abi
@@ -6,9 +6,8 @@
     <elf-symbol name='fn' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='811c9dc5'/>
     <enum-decl name='opaque_enum' linkage-name='opaque_enum' id='55763a91'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
@@ -19,6 +18,7 @@
     </class-decl>
     <typedef-decl name='opaque_enum' type-id='55763a91' id='99fcd3a5'/>
     <typedef-decl name='opaque_struct' type-id='6cde5052' id='dae69ca1'/>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
     <pointer-type-def type-id='99fcd3a5' size-in-bits='64' alignment-in-bits='64' id='0e0526e0'/>
     <pointer-type-def type-id='dae69ca1' size-in-bits='64' alignment-in-bits='64' id='3f6e71d0'/>
     <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fn'>
diff --git a/tests/data/test-read-ctf/test5.o.abi b/tests/data/test-read-ctf/test5.o.abi
index 6d72d7ab..814aff7f 100644
--- a/tests/data/test-read-ctf/test5.o.abi
+++ b/tests/data/test-read-ctf/test5.o.abi
@@ -7,10 +7,9 @@
     <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <type-decl name='char' size-in-bits='8' id='type-id-2'/>
-    <enum-decl name='E' linkage-name='E' id='type-id-3'>
-      <underlying-type type-id='type-id-1'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <enum-decl name='E' linkage-name='E' id='type-id-2'>
+      <underlying-type type-id='type-id-3'/>
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
@@ -18,7 +17,8 @@
     <type-decl name='long int' size-in-bits='64' id='type-id-5'/>
     <type-decl name='long long int' size-in-bits='64' id='type-id-6'/>
     <typedef-decl name='long_long' type-id='type-id-6' id='type-id-7'/>
-    <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-3'/>
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
     <qualified-type-def type-id='type-id-4' const='yes' id='type-id-9'/>
     <qualified-type-def type-id='type-id-5' const='yes' id='type-id-10'/>
     <qualified-type-def type-id='type-id-10' volatile='yes' id='type-id-11'/>
@@ -37,7 +37,7 @@
       <return type-id='type-id-12'/>
     </function-decl>
     <function-decl name='bar2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar2'>
-      <parameter type-id='type-id-3'/>
+      <parameter type-id='type-id-2'/>
       <return type-id='type-id-12'/>
     </function-decl>
     <function-decl name='baz' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='baz'>
diff --git a/tests/test-read-ctf.cc b/tests/test-read-ctf.cc
index 043032ff..a0b399fc 100644
--- a/tests/test-read-ctf.cc
+++ b/tests/test-read-ctf.cc
@@ -345,6 +345,24 @@ static InOutSpec in_out_specs[] =
     "output/test-read-ctf/test-fallback.abi",
     NULL,
   },
+  {
+    "data/test-read-ctf/test-bitfield.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-bitfield.abi",
+    "output/test-read-ctf/test-bitfield.abi",
+    "--ctf",
+  },
+  {
+    "data/test-read-ctf/test-bitfield-enum.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-bitfield-enum.abi",
+    "output/test-read-ctf/test-bitfield-enum.abi",
+    "--ctf",
+   },
   // This should be the last entry.
   {NULL, NULL, NULL, SEQUENCE_TYPE_ID_STYLE, NULL, NULL, NULL}
 };
-- 
2.38.1



-- 
		Dodji

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [PATCHv2 2/5]ctf-front-end: Fix size and name for underlying types
  2022-11-29 13:59     ` Dodji Seketeli
@ 2022-11-29 18:32       ` Guillermo E. Martinez
  2022-11-30  9:14         ` Dodji Seketeli
  0 siblings, 1 reply; 16+ messages in thread
From: Guillermo E. Martinez @ 2022-11-29 18:32 UTC (permalink / raw)
  To: libabigail; +Cc: Dodji Seketeli, Dodji Seketeli, Guillermo E . Martinez

From: Dodji Seketeli <dodji@seketeli.org>

Hello, this is the second version of the patch to Fix size and name for
underlying types, those changes are done for comments:

   https://inbox.sourceware.org/libabigail/87v8mxoo9g.fsf@seketeli.org/

Comments will be welcomed!,
guillermo
--

This patch fixes an incorrect representation in size and name of the
underlying type of enums as well as underlying types of bitfield data
members types.

For instance, consider this struct.

    struct foo
    {
       unsigned bar : 2;
       unsigned baz : 1;
    };

The data members bar and baz have an underlying type that is "unsigned
int".  Yet, the CTF front-end represents the underlying type of these
data members as:

  <type-decl name='' is-anonymous='yes' size-in-bits='2' id='type-id-1'/>

The name property is empty, and it should be "unsigned int".

The size in bit is '2', but it should be the size of the underlying
"unsigned int", in bits, which is 32.

In other words, the underlying type of bar and baz should be:

  <type-decl name='unsigned int' size-in-bits='32' id='type-id-4'/>

Note that today, libabigail doesn't represent the bitfield properties
of the data member.  Those bitfield properties are properties of the
data member, not of their type.  This is a known "Not Yet Implemented"
feature request that has been filed upstream at
https://sourceware.org/bugzilla/show_bug.cgi?id=27334.

Similarly, the underlying type of enums is not properly represented by
the CTF front-end.

Fixed thus.

	* src/abg-ctf-reader.cc (process_ctf_{base_type,enum_type}):
	Look at ctf refence type to build the underlying type if present.
	* tests/data/Makefile.am: New test cases.
	* tests/data/test-read-ctf/PR27700/test-PR27700.abi: New test input.
	* tests/data/test-read-ctf/test-bitfield-enum.abi: Likewise.
	* tests/data/test-read-ctf/test-bitfield-enum.c: Likewise.
	* tests/data/test-read-ctf/test-bitfield-enum.o: Likewise.
	* tests/data/test-read-ctf/test-bitfield.abi: Likewise.
	* tests/data/test-read-ctf/test-bitfield.c: Likewise.
	* tests/data/test-read-ctf/test-bitfield.o: Likewise.
	* tests/data/test-read-ctf/test-enum-many.o.hash.abi: Adjust.
	* tests/data/test-read-ctf/test-enum-symbol.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-enum.o.abi: Likewise:
	* tests/data/test-read-ctf/test0.abi: Likewise.
	* tests/data/test-read-ctf/test0.hash.abi: Likewise.
	* tests/data/test-read-ctf/test1.so.abi: Likewise.
	* tests/data/test-read-ctf/test1.so.hash.abi: Likewise.
	* tests/data/test-read-ctf/test5.o.abi: Likewise.
	* tests/test-read-ctf.cc: Update test suite.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
---
 tests/data/Makefile.am                        |   6 +++
 .../test-read-ctf/PR27700/test-PR27700.abi    |   4 +-
 .../data/test-read-ctf/test-bitfield-enum.abi |  18 +++++++
 tests/data/test-read-ctf/test-bitfield-enum.c |  12 +++++
 tests/data/test-read-ctf/test-bitfield-enum.o | Bin 0 -> 1336 bytes
 tests/data/test-read-ctf/test-bitfield.abi    |  28 ++++++++++
 tests/data/test-read-ctf/test-bitfield.c      |  15 ++++++
 tests/data/test-read-ctf/test-bitfield.o      | Bin 0 -> 1488 bytes
 .../test-read-ctf/test-enum-many.o.hash.abi   |   6 +--
 .../test-read-ctf/test-enum-symbol.o.hash.abi |   4 +-
 tests/data/test-read-ctf/test-enum.o.abi      |  10 ++--
 tests/data/test-read-ctf/test0.abi            |  48 +++++++++---------
 tests/data/test-read-ctf/test0.hash.abi       |  10 ++--
 tests/data/test-read-ctf/test1.so.abi         |   8 +--
 tests/data/test-read-ctf/test1.so.hash.abi    |   4 +-
 tests/data/test-read-ctf/test5.o.abi          |  12 ++---
 tests/test-read-ctf.cc                        |  18 +++++++
 17 files changed, 150 insertions(+), 53 deletions(-)
 create mode 100644 tests/data/test-read-ctf/test-bitfield-enum.abi
 create mode 100644 tests/data/test-read-ctf/test-bitfield-enum.c
 create mode 100644 tests/data/test-read-ctf/test-bitfield-enum.o
 create mode 100644 tests/data/test-read-ctf/test-bitfield.abi
 create mode 100644 tests/data/test-read-ctf/test-bitfield.c
 create mode 100644 tests/data/test-read-ctf/test-bitfield.o

diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 4b6e9305..b89a4dd8 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -704,6 +704,12 @@ test-read-ctf/test-linux-module.ko		\
 test-read-ctf/test-fallback.abi		\
 test-read-ctf/test-fallback.c		\
 test-read-ctf/test-fallback.o		\
+test-read-ctf/test-bitfield.abi		\
+test-read-ctf/test-bitfield.c		\
+test-read-ctf/test-bitfield.o		\
+test-read-ctf/test-bitfield-enum.abi	\
+test-read-ctf/test-bitfield-enum.c	\
+test-read-ctf/test-bitfield-enum.o	\
 \
 test-annotate/test0.abi			\
 test-annotate/test1.abi			\
diff --git a/tests/data/test-read-ctf/PR27700/test-PR27700.abi b/tests/data/test-read-ctf/PR27700/test-PR27700.abi
index 4f34eb8a..1a7c229e 100644
--- a/tests/data/test-read-ctf/PR27700/test-PR27700.abi
+++ b/tests/data/test-read-ctf/PR27700/test-PR27700.abi
@@ -3,14 +3,14 @@
     <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='811c9dc5'/>
     <enum-decl name='foo' linkage-name='foo' id='022218d8'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='foo_e0' value='0'/>
       <enumerator name='foo_e1' value='1'/>
       <enumerator name='foo_e2' value='2'/>
       <enumerator name='foo_e3' value='3'/>
     </enum-decl>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
     <pointer-type-def type-id='022218d8' size-in-bits='64' alignment-in-bits='64' id='8750e847'/>
     <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
       <parameter type-id='8750e847'/>
diff --git a/tests/data/test-read-ctf/test-bitfield-enum.abi b/tests/data/test-read-ctf/test-bitfield-enum.abi
new file mode 100644
index 00000000..b95f1781
--- /dev/null
+++ b/tests/data/test-read-ctf/test-bitfield-enum.abi
@@ -0,0 +1,18 @@
+<abi-corpus version='2.1' path='data/test-read-ctf/test-bitfield-enum.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='e' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr address-size='64' language='LANG_C'>
+    <enum-decl name='event_kind' linkage-name='event_kind' id='type-id-1'>
+      <underlying-type type-id='type-id-2'/>
+      <enumerator name='NO_EVENT' value='0'/>
+    </enum-decl>
+    <class-decl name='input' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='kind' type-id='type-id-1' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-2'/>
+    <var-decl name='e' type-id='type-id-3' mangled-name='e' visibility='default' elf-symbol-id='e'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-bitfield-enum.c b/tests/data/test-read-ctf/test-bitfield-enum.c
new file mode 100644
index 00000000..502ec06a
--- /dev/null
+++ b/tests/data/test-read-ctf/test-bitfield-enum.c
@@ -0,0 +1,12 @@
+/* gcc -gctf -c test-bitfield-enum.c -o test-bitfield-enum.o */
+enum event_kind
+{
+  NO_EVENT,
+};
+
+struct input
+{
+  enum event_kind kind : 16;
+};
+
+struct input e;
diff --git a/tests/data/test-read-ctf/test-bitfield-enum.o b/tests/data/test-read-ctf/test-bitfield-enum.o
new file mode 100644
index 0000000000000000000000000000000000000000..2c532f50c724f7bf4327b7c36699a432ca08eab1
GIT binary patch
literal 1336
zcmbVL&2G~`5T1lkeh>7}s)CE@g;e0R6E4sLvQ&j4gu(@SLuGAm(^c(tWN#ojAvp0!
z9C;I-0bT%R?A>IwlnWz$p1<!~?~LqElUL9Cy&hQW!86!owhFN9Z{nm46SxI8;n$DB
zx)W_EFu<5_-QW)T_lPfuD~Qm5VtOB9pZK>CWILVPqFR91M<C}e<wFD+#m1h{CFmRg
ze3SSfls>(XDu?Oo)5*zX`UV!NkuxRoKq?JV%@-P4f`I6}Dn*p8(p6N|JS#-h)LB%>
zl&5mWWf3azG18*ZO_X!Z+c2yJ&%;cgby+I)nG{7H3biO%25@|IbQlber*98}(PI{~
zI2gy{@n{r34TfSl7qu+$io7^zuZ#~n=T(eR27Ty#cjm*{y1bjws{Z!WAHdJwerFd8
z+wJDN&iZT`EcEX$09dmsHBZs&y7T8Y(qgHB(Jp|cO#=+~fRC!AnSiNE3x+d<jpo^f
z$!BW8=5>XW>y>}E|H<#6h-TgL#EF;N)Zg2EY*3B9Ki3jBabjQp0DJUp|4YB#uQ|id
zA7R};lc)(j(00A1m%<1+REvr1*oh%NbZQh@z4eDq&82>}1h;qz_a)Y@A?Uwz?W@uI
y_o7|7Ml@eb{clG9!jNwmp4IO;b$|D5%N%NXhQ6NP=Gz!trr$IAca~_pzm`9z|8lDU

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test-bitfield.abi b/tests/data/test-read-ctf/test-bitfield.abi
new file mode 100644
index 00000000..4231ba3e
--- /dev/null
+++ b/tests/data/test-read-ctf/test-bitfield.abi
@@ -0,0 +1,28 @@
+<abi-corpus version='2.1' path='data/test-read-ctf/test-bitfield.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='f' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='fb' size='1' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr address-size='64' language='LANG_C'>
+    <class-decl name='foo' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='bar' type-id='type-id-2' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='2'>
+        <var-decl name='baz' type-id='type-id-2' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <class-decl name='foobar' size-in-bits='8' is-struct='yes' visibility='default' id='type-id-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='bar' type-id='type-id-4' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='2'>
+        <var-decl name='baz' type-id='type-id-4' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='unsigned char' size-in-bits='8' id='type-id-4'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-2'/>
+    <var-decl name='f' type-id='type-id-1' mangled-name='f' visibility='default' elf-symbol-id='f'/>
+    <var-decl name='fb' type-id='type-id-3' mangled-name='fb' visibility='default' elf-symbol-id='fb'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-bitfield.c b/tests/data/test-read-ctf/test-bitfield.c
new file mode 100644
index 00000000..66f53704
--- /dev/null
+++ b/tests/data/test-read-ctf/test-bitfield.c
@@ -0,0 +1,15 @@
+/* gcc -gctf -c test-bitfield.c -o test-bitfield.o */
+struct foo
+{
+  unsigned bar : 2;
+  unsigned baz : 1;
+};
+
+struct foobar
+{
+  unsigned char bar : 2;
+  unsigned char baz : 1;
+};
+
+struct foo f;
+struct foobar fb;
diff --git a/tests/data/test-read-ctf/test-bitfield.o b/tests/data/test-read-ctf/test-bitfield.o
new file mode 100644
index 0000000000000000000000000000000000000000..c23c8188d880587f2ba78b8b852cdb067607e4b6
GIT binary patch
literal 1488
zcmbVM&2G~`5FVEh3S3$$Arvm|iB=FhNe{FYLXj${gb+85NZ8IMu}JL7-in3`cOC%o
z6g&e@fw=Ju@B%QOcgI<lp93S!&dm4CjCUs8zJ2uc@kS7kNI(y19SKUbb!qL78+T0C
z=^B0i+Sw51fjDe8t!}Y}hOA#$-?3h1#W#*v?^~5vIBweOFn5C$g3sS%#m9gnkEIJg
zglFUseawa0YdKgzJ;V2q7n>To!uG)6&AoRG-bD`2A&r_o-G&p09E`K4Wl85nozDt2
z3G+fznpCWBK)`LeY~B!-q-jd=yj-d{U8SqItdeY@;=0P>MV=;UK1=dNzfiAZt!iDz
zlSC(t+pknI>1TRsqBPgjTrDP1Ms#{|avbiRK6}0&4iBP1Gzdq7(P%gv9EE%8;!IWf
zQWZK`?3+=|PD2i`S1#kBgHPD4NMK{^<X-~5L*IV*Iok|uH@~7`r1y@+C2sp;*1j{+
z6kDRGUM+Q!velKbbMdsg&=g@g6s2`d5if?1a*0VPDoU*)o~&Q%BztA!S#chnRVD93
zulyVTUwoU(FoXF!S@#&P-Cw+RUW@Ls1?D`rh8Z{K?}uN1hg0zO{#I|_P1{KJF2Fr@
z{GQ;(I9T3$q!-eVbASzy?8s-Ec-O(;O1;=)2Xj+{_Q|>Ex?a#H?BG57>6;et?}c5t
yf_wP2;14bM5&_FqRzOmJ3m^+{fA_#Y*n0dAb4BJB4DaMm^&f5h3rV!rum1@|M0T$L

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test-enum-many.o.hash.abi b/tests/data/test-read-ctf/test-enum-many.o.hash.abi
index 116325f9..9119525b 100644
--- a/tests/data/test-read-ctf/test-enum-many.o.hash.abi
+++ b/tests/data/test-read-ctf/test-enum-many.o.hash.abi
@@ -4,14 +4,13 @@
     <elf-symbol name='foo' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='811c9dc5'/>
     <enum-decl name='e' linkage-name='e' id='a6c2eddf'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='ENUMSAMPLE_1' value='0'/>
       <enumerator name='ENUMSAMPLE_2' value='1'/>
     </enum-decl>
     <enum-decl name='ie' linkage-name='ie' id='1ee696ca'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='IE_0' value='-10'/>
       <enumerator name='IE_1' value='-9'/>
       <enumerator name='IE_2' value='-8'/>
@@ -61,6 +60,7 @@
       <enumerator name='IE_2E' value='36'/>
       <enumerator name='IE_2F' value='37'/>
     </enum-decl>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
     <var-decl name='foo' type-id='a6c2eddf' mangled-name='foo' visibility='default' elf-symbol-id='foo'/>
     <var-decl name='bar' type-id='1ee696ca' mangled-name='bar' visibility='default' elf-symbol-id='bar'/>
   </abi-instr>
diff --git a/tests/data/test-read-ctf/test-enum-symbol.o.hash.abi b/tests/data/test-read-ctf/test-enum-symbol.o.hash.abi
index f4911bc4..da68828c 100644
--- a/tests/data/test-read-ctf/test-enum-symbol.o.hash.abi
+++ b/tests/data/test-read-ctf/test-enum-symbol.o.hash.abi
@@ -3,13 +3,13 @@
     <elf-symbol name='primary1' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='811c9dc5'/>
     <enum-decl name='' is-anonymous='yes' id='08f5ca17'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='red1' value='0'/>
       <enumerator name='green1' value='1'/>
       <enumerator name='blue1' value='2'/>
     </enum-decl>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
     <var-decl name='primary1' type-id='08f5ca17' mangled-name='primary1' visibility='default' elf-symbol-id='primary1'/>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/data/test-read-ctf/test-enum.o.abi b/tests/data/test-read-ctf/test-enum.o.abi
index bd3a55be..e13ebdd0 100644
--- a/tests/data/test-read-ctf/test-enum.o.abi
+++ b/tests/data/test-read-ctf/test-enum.o.abi
@@ -4,19 +4,19 @@
     <elf-symbol name='foo' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <enum-decl name='e' linkage-name='e' id='type-id-2'>
-      <underlying-type type-id='type-id-1'/>
+    <enum-decl name='e' linkage-name='e' id='type-id-1'>
+      <underlying-type type-id='type-id-2'/>
       <enumerator name='ENUMSAMPLE_1' value='0'/>
       <enumerator name='ENUMSAMPLE_2' value='1'/>
     </enum-decl>
     <enum-decl name='ie' linkage-name='ie' id='type-id-3'>
-      <underlying-type type-id='type-id-1'/>
+      <underlying-type type-id='type-id-2'/>
       <enumerator name='IENUMSAMPLE_1' value='-10'/>
       <enumerator name='IENUMSAMPLE_2' value='-9'/>
       <enumerator name='IENUMSAMPLE_3' value='-8'/>
     </enum-decl>
-    <var-decl name='foo' type-id='type-id-2' mangled-name='foo' visibility='default' elf-symbol-id='foo'/>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-2'/>
+    <var-decl name='foo' type-id='type-id-1' mangled-name='foo' visibility='default' elf-symbol-id='foo'/>
     <var-decl name='bar' type-id='type-id-3' mangled-name='bar' visibility='default' elf-symbol-id='bar'/>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/data/test-read-ctf/test0.abi b/tests/data/test-read-ctf/test0.abi
index 05430067..60d3cf1e 100644
--- a/tests/data/test-read-ctf/test0.abi
+++ b/tests/data/test-read-ctf/test0.abi
@@ -20,47 +20,47 @@
     <elf-symbol name='test_volatile' size='2' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='1' id='type-id-1'/>
-    <type-decl name='char' size-in-bits='8' id='type-id-2'/>
-    <type-decl name='float' size-in-bits='32' id='type-id-3'/>
-    <type-decl name='int' size-in-bits='32' id='type-id-4'/>
-    <array-type-def dimensions='1' type-id='type-id-4' size-in-bits='320' id='type-id-5'>
-      <subrange length='10' type-id='type-id-6' id='type-id-7'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <type-decl name='float' size-in-bits='32' id='type-id-2'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-3'/>
+    <array-type-def dimensions='1' type-id='type-id-3' size-in-bits='320' id='type-id-4'>
+      <subrange length='10' type-id='type-id-5' id='type-id-6'/>
     </array-type-def>
-    <type-decl name='long int' size-in-bits='64' id='type-id-8'/>
-    <type-decl name='short int' size-in-bits='16' id='type-id-9'/>
-    <class-decl name='S' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-10'>
+    <type-decl name='long int' size-in-bits='64' id='type-id-7'/>
+    <type-decl name='short int' size-in-bits='16' id='type-id-8'/>
+    <class-decl name='S' size-in-bits='32' is-struct='yes' visibility='default' id='type-id-9'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='m0' type-id='type-id-4' visibility='default'/>
+        <var-decl name='m0' type-id='type-id-3' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-11'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-10'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='status0' type-id='type-id-1' visibility='default'/>
+        <var-decl name='status0' type-id='type-id-11' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='1'>
-        <var-decl name='status1' type-id='type-id-1' visibility='default'/>
+        <var-decl name='status1' type-id='type-id-11' visibility='default'/>
       </data-member>
     </class-decl>
-    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-6'/>
-    <pointer-type-def type-id='type-id-10' size-in-bits='64' alignment-in-bits='64' id='type-id-12'/>
-    <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-13'/>
-    <qualified-type-def type-id='type-id-10' const='yes' id='type-id-14'/>
-    <pointer-type-def type-id='type-id-8' size-in-bits='64' alignment-in-bits='64' id='type-id-15'/>
+    <type-decl name='unsigned int' size-in-bits='32' id='type-id-11'/>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-5'/>
+    <pointer-type-def type-id='type-id-9' size-in-bits='64' alignment-in-bits='64' id='type-id-12'/>
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-13'/>
+    <qualified-type-def type-id='type-id-9' const='yes' id='type-id-14'/>
+    <pointer-type-def type-id='type-id-7' size-in-bits='64' alignment-in-bits='64' id='type-id-15'/>
     <qualified-type-def type-id='type-id-15' restrict='yes' id='type-id-16'/>
-    <qualified-type-def type-id='type-id-9' volatile='yes' id='type-id-17'/>
-    <var-decl name='status' type-id='type-id-11' mangled-name='status' visibility='default' elf-symbol-id='status'/>
+    <qualified-type-def type-id='type-id-8' volatile='yes' id='type-id-17'/>
+    <var-decl name='status' type-id='type-id-10' mangled-name='status' visibility='default' elf-symbol-id='status'/>
     <var-decl name='test_pointer' type-id='type-id-13' mangled-name='test_pointer' visibility='default' elf-symbol-id='test_pointer'/>
     <var-decl name='test_const' type-id='type-id-14' mangled-name='test_const' visibility='default' elf-symbol-id='test_const'/>
-    <var-decl name='test_float' type-id='type-id-3' mangled-name='test_float' visibility='default' elf-symbol-id='test_float'/>
+    <var-decl name='test_float' type-id='type-id-2' mangled-name='test_float' visibility='default' elf-symbol-id='test_float'/>
     <function-decl name='foo_1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo_1'>
       <parameter type-id='type-id-12'/>
-      <return type-id='type-id-4'/>
+      <return type-id='type-id-3'/>
     </function-decl>
     <function-decl name='main' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='main'>
-      <return type-id='type-id-4'/>
+      <return type-id='type-id-3'/>
     </function-decl>
-    <var-decl name='test_array' type-id='type-id-5' mangled-name='test_array' visibility='default' elf-symbol-id='test_array'/>
+    <var-decl name='test_array' type-id='type-id-4' mangled-name='test_array' visibility='default' elf-symbol-id='test_array'/>
     <var-decl name='test_restrict' type-id='type-id-16' mangled-name='test_restrict' visibility='default' elf-symbol-id='test_restrict'/>
     <var-decl name='test_volatile' type-id='type-id-17' mangled-name='test_volatile' visibility='default' elf-symbol-id='test_volatile'/>
   </abi-instr>
diff --git a/tests/data/test-read-ctf/test0.hash.abi b/tests/data/test-read-ctf/test0.hash.abi
index 4aa9a93c..76dd581e 100644
--- a/tests/data/test-read-ctf/test0.hash.abi
+++ b/tests/data/test-read-ctf/test0.hash.abi
@@ -20,7 +20,6 @@
     <elf-symbol name='test_volatile' size='2' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='1' id='811c9dc5'/>
     <type-decl name='char' size-in-bits='8' id='a84c031d'/>
     <type-decl name='float' size-in-bits='32' id='a6c45d85'/>
     <type-decl name='int' size-in-bits='32' id='95e97e5e'/>
@@ -34,14 +33,15 @@
         <var-decl name='m0' type-id='95e97e5e' visibility='default'/>
       </data-member>
     </class-decl>
-    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='b91ffdee'>
+    <class-decl name='' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='000d9e42'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='status0' type-id='811c9dc5' visibility='default'/>
+        <var-decl name='status0' type-id='f0981eec' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='1'>
-        <var-decl name='status1' type-id='811c9dc5' visibility='default'/>
+        <var-decl name='status1' type-id='f0981eec' visibility='default'/>
       </data-member>
     </class-decl>
+    <type-decl name='unsigned int' size-in-bits='32' id='f0981eec'/>
     <type-decl name='unsigned long int' size-in-bits='64' id='f0981eeb'/>
     <pointer-type-def type-id='50d9a3fa' size-in-bits='64' alignment-in-bits='64' id='fd01f598'/>
     <pointer-type-def type-id='a84c031d' size-in-bits='64' alignment-in-bits='64' id='26a90f95'/>
@@ -49,7 +49,7 @@
     <pointer-type-def type-id='95e97e5f' size-in-bits='64' alignment-in-bits='64' id='7292109c'/>
     <qualified-type-def type-id='7292109c' restrict='yes' id='6942f6a4'/>
     <qualified-type-def type-id='95e97e60' volatile='yes' id='e024ff18'/>
-    <var-decl name='status' type-id='b91ffdee' mangled-name='status' visibility='default' elf-symbol-id='status'/>
+    <var-decl name='status' type-id='000d9e42' mangled-name='status' visibility='default' elf-symbol-id='status'/>
     <var-decl name='test_pointer' type-id='26a90f95' mangled-name='test_pointer' visibility='default' elf-symbol-id='test_pointer'/>
     <var-decl name='test_const' type-id='0fb3b55d' mangled-name='test_const' visibility='default' elf-symbol-id='test_const'/>
     <var-decl name='test_float' type-id='a6c45d85' mangled-name='test_float' visibility='default' elf-symbol-id='test_float'/>
diff --git a/tests/data/test-read-ctf/test1.so.abi b/tests/data/test-read-ctf/test1.so.abi
index 822b57a5..2ecd5826 100644
--- a/tests/data/test-read-ctf/test1.so.abi
+++ b/tests/data/test-read-ctf/test1.so.abi
@@ -6,9 +6,8 @@
     <elf-symbol name='fn' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <enum-decl name='opaque_enum' linkage-name='opaque_enum' id='type-id-2'>
-      <underlying-type type-id='type-id-1'/>
+    <enum-decl name='opaque_enum' linkage-name='opaque_enum' id='type-id-1'>
+      <underlying-type type-id='type-id-2'/>
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
@@ -17,8 +16,9 @@
         <var-decl name='m0' type-id='type-id-4' visibility='default'/>
       </data-member>
     </class-decl>
-    <typedef-decl name='opaque_enum' type-id='type-id-2' id='type-id-4'/>
+    <typedef-decl name='opaque_enum' type-id='type-id-1' id='type-id-4'/>
     <typedef-decl name='opaque_struct' type-id='type-id-3' id='type-id-5'/>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-2'/>
     <pointer-type-def type-id='type-id-4' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
     <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
     <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fn'>
diff --git a/tests/data/test-read-ctf/test1.so.hash.abi b/tests/data/test-read-ctf/test1.so.hash.abi
index b3ace158..4f8633dd 100644
--- a/tests/data/test-read-ctf/test1.so.hash.abi
+++ b/tests/data/test-read-ctf/test1.so.hash.abi
@@ -6,9 +6,8 @@
     <elf-symbol name='fn' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='811c9dc5'/>
     <enum-decl name='opaque_enum' linkage-name='opaque_enum' id='55763a91'>
-      <underlying-type type-id='811c9dc5'/>
+      <underlying-type type-id='9cac1fee'/>
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
@@ -19,6 +18,7 @@
     </class-decl>
     <typedef-decl name='opaque_enum' type-id='55763a91' id='99fcd3a5'/>
     <typedef-decl name='opaque_struct' type-id='6cde5052' id='dae69ca1'/>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
     <pointer-type-def type-id='99fcd3a5' size-in-bits='64' alignment-in-bits='64' id='0e0526e0'/>
     <pointer-type-def type-id='dae69ca1' size-in-bits='64' alignment-in-bits='64' id='3f6e71d0'/>
     <function-decl name='fn' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fn'>
diff --git a/tests/data/test-read-ctf/test5.o.abi b/tests/data/test-read-ctf/test5.o.abi
index 6d72d7ab..814aff7f 100644
--- a/tests/data/test-read-ctf/test5.o.abi
+++ b/tests/data/test-read-ctf/test5.o.abi
@@ -7,10 +7,9 @@
     <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
   <abi-instr address-size='64' language='LANG_C'>
-    <type-decl name='' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-1'/>
-    <type-decl name='char' size-in-bits='8' id='type-id-2'/>
-    <enum-decl name='E' linkage-name='E' id='type-id-3'>
-      <underlying-type type-id='type-id-1'/>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <enum-decl name='E' linkage-name='E' id='type-id-2'>
+      <underlying-type type-id='type-id-3'/>
       <enumerator name='e0' value='0'/>
       <enumerator name='e1' value='1'/>
     </enum-decl>
@@ -18,7 +17,8 @@
     <type-decl name='long int' size-in-bits='64' id='type-id-5'/>
     <type-decl name='long long int' size-in-bits='64' id='type-id-6'/>
     <typedef-decl name='long_long' type-id='type-id-6' id='type-id-7'/>
-    <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
+    <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='type-id-3'/>
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
     <qualified-type-def type-id='type-id-4' const='yes' id='type-id-9'/>
     <qualified-type-def type-id='type-id-5' const='yes' id='type-id-10'/>
     <qualified-type-def type-id='type-id-10' volatile='yes' id='type-id-11'/>
@@ -37,7 +37,7 @@
       <return type-id='type-id-12'/>
     </function-decl>
     <function-decl name='bar2' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='bar2'>
-      <parameter type-id='type-id-3'/>
+      <parameter type-id='type-id-2'/>
       <return type-id='type-id-12'/>
     </function-decl>
     <function-decl name='baz' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='baz'>
diff --git a/tests/test-read-ctf.cc b/tests/test-read-ctf.cc
index 043032ff..a0b399fc 100644
--- a/tests/test-read-ctf.cc
+++ b/tests/test-read-ctf.cc
@@ -345,6 +345,24 @@ static InOutSpec in_out_specs[] =
     "output/test-read-ctf/test-fallback.abi",
     NULL,
   },
+  {
+    "data/test-read-ctf/test-bitfield.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-bitfield.abi",
+    "output/test-read-ctf/test-bitfield.abi",
+    "--ctf",
+  },
+  {
+    "data/test-read-ctf/test-bitfield-enum.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-bitfield-enum.abi",
+    "output/test-read-ctf/test-bitfield-enum.abi",
+    "--ctf",
+   },
   // This should be the last entry.
   {NULL, NULL, NULL, SEQUENCE_TYPE_ID_STYLE, NULL, NULL, NULL}
 };
-- 
2.35.1


^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 2/5] ctf-front-end: Fix size and name for underlying types
  2022-11-29 11:53   ` Dodji Seketeli
  2022-11-29 13:59     ` Dodji Seketeli
@ 2022-11-29 18:53     ` Guillermo E. Martinez
  1 sibling, 0 replies; 16+ messages in thread
From: Guillermo E. Martinez @ 2022-11-29 18:53 UTC (permalink / raw)
  To: Dodji Seketeli, Guillermo E. Martinez via Libabigail



On 29/11/22 5:53, Dodji Seketeli wrote:
> Hello Guillermo,
> 
> "Guillermo E. Martinez via Libabigail" <libabigail@sourceware.org> a
> écrit:
> 
>> It fixed an incorrect representation in size and name for underlying
>> enum and struct types when it has a bitfield members:
>>
>>      struct foo
>>      {
>>        unsigned bar : 2;
>>        unsigned baz : 1;
>>      };
>>
>>    <type-decl name='' is-anonymous='yes' size-in-bits='2' id='type-id-1'/>
>>
>> So, `name' empty property, no showing the right enumerator's type and size
>> in bits:
>>
>>    <type-decl name='unsigned char' size-in-bits='8' id='type-id-4'/>
> 
> Hmmh, I think here, the name should be "unsigned int", because "unsigned
> bar" implicitly means 'unsigned int bar".  And the size-in-bits should
> be set to 32.
> 

Oh. Sorry, that's right.

> I have thus changed the introductory paragraphs of this commit log to
> the following:
> 
>      This patch fixes an incorrect representation in size and name of the
>      underlying type of enums as well as underlying types of bitfield data
>      members types.
> 
>      For instance, consider this struct.
> 
>          struct foo
>          {
>            unsigned bar : 2;
>            unsigned baz : 1;
>          };
> 
>      The data members bar and baz have an underlying type that is "unsigned
>      int".  Yet, the CTF front-end represents the underlying type of these
>      data members as:
> 
>        <type-decl name='' is-anonymous='yes' size-in-bits='2' id='type-id-1'/>
> 
>      The name property is empty, and it should be "unsigned int".
> 
>      The size in bit is '2', but it should be the size of the underlying
>      "unsigned int", in bits, which is 32.
> 
>      In other words, the underlying type of bar and baz should be:
> 
>        <type-decl name='unsigned int' size-in-bits='32' id='type-id-4'/>
> 
>      Note that today, libabigail doesn't represent the bitfield properties
>      of the data member.  Those bitfield properties are properties of the
>      data member, not of their type.  This is a known "Not Yet Implemented"
>      feature request that has been filed upstream at
>      https://sourceware.org/bugzilla/show_bug.cgi?id=27334.
> 
>      Similarly, the underlying type of enums is not properly represented by
>      the CTF front-end.
> 
>      Fixed thus.
> 
> It's a little bit more verbose, but hopefully, that should give a little
> bit more context for future code maintenance.
>

Totally agree. Thanks Dodji.

>>[...]

Kind regards,
guillermo

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCHv2 2/5]ctf-front-end: Fix size and name for underlying types
  2022-11-29 18:32       ` [PATCHv2 2/5]ctf-front-end: " Guillermo E. Martinez
@ 2022-11-30  9:14         ` Dodji Seketeli
  0 siblings, 0 replies; 16+ messages in thread
From: Dodji Seketeli @ 2022-11-30  9:14 UTC (permalink / raw)
  To: Guillermo E. Martinez; +Cc: libabigail, Dodji Seketeli

Hello Guillermo,

"Guillermo E. Martinez" <guillermo.e.martinez@oracle.com> a écrit:

[...]

>
> 	* src/abg-ctf-reader.cc (process_ctf_{base_type,enum_type}):
> 	Look at ctf refence type to build the underlying type if present.
> 	* tests/data/Makefile.am: New test cases.
> 	* tests/data/test-read-ctf/PR27700/test-PR27700.abi: New test input.
> 	* tests/data/test-read-ctf/test-bitfield-enum.abi: Likewise.
> 	* tests/data/test-read-ctf/test-bitfield-enum.c: Likewise.
> 	* tests/data/test-read-ctf/test-bitfield-enum.o: Likewise.
> 	* tests/data/test-read-ctf/test-bitfield.abi: Likewise.
> 	* tests/data/test-read-ctf/test-bitfield.c: Likewise.
> 	* tests/data/test-read-ctf/test-bitfield.o: Likewise.
> 	* tests/data/test-read-ctf/test-enum-many.o.hash.abi: Adjust.
> 	* tests/data/test-read-ctf/test-enum-symbol.o.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test-enum.o.abi: Likewise:
> 	* tests/data/test-read-ctf/test0.abi: Likewise.
> 	* tests/data/test-read-ctf/test0.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test1.so.abi: Likewise.
> 	* tests/data/test-read-ctf/test1.so.hash.abi: Likewise.
> 	* tests/data/test-read-ctf/test5.o.abi: Likewise.
> 	* tests/test-read-ctf.cc: Update test suite.
>
> Signed-off-by: Dodji Seketeli <dodji@redhat.com>
> Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>

Thanks!

I haven't been clear in my message.  The first part of the patch got
committed already at
https://sourceware.org/git/?p=libabigail.git;a=commit;h=217f579bf788a11643c0066a7dc8aa76faa5a05d.
It was only the testing part that was missing from that commit.  That is
why I sent you the missing (testing) part for review.

Thanks again for reviewing it.  I have thus applied that second part.
It's at
https://sourceware.org/git/?p=libabigail.git;a=commit;h=5efe2247c3447dc994a27dfe32e571023091213e.

[...]

Cheers,

-- 
		Dodji

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/5] ctf-front-end: Strip qualification from a qualified array type
  2022-11-17  3:43 ` [PATCH 3/5] ctf-front-end: Strip qualification from a qualified array type Guillermo E. Martinez
@ 2022-11-30  9:33   ` Dodji Seketeli
  2022-12-02  3:48     ` Guillermo E. Martinez
  0 siblings, 1 reply; 16+ messages in thread
From: Dodji Seketeli @ 2022-11-30  9:33 UTC (permalink / raw)
  To: Guillermo E. Martinez via Libabigail; +Cc: Guillermo E. Martinez

Hello Guillermo,

"Guillermo E. Martinez via Libabigail" <libabigail@sourceware.org> a
écrit:

Thank you for this work!

The patch in general looks good to me.  I have made some minor
adjustments and applied the result to the repository.

Please find below the few comments that I have.

> Redundant qualifier is emitted by CTF frond-end building IR for array
> definitions:
>
>    const char a[32];
>
>    <qualified-type-def type-id='type-id-1' const='yes' id='type-id-2'/>
>    <qualified-type-def type-id='type-id-3' const='yes' id='type-id-6'/>
>
> Thus the diff reports:
>    [C] 'const char[32] const a'
>
> So, It strips the qualifiers from the array types.

I see.  We do something similar in the DWARF front-end.  This is because
GCC emits some redundant const qualifier in these cases.

I thought I'd give a little bit more context because I am seeing now
that this is not obvious.  I had to look it up a little to remember
fully ;-)

Sorry, I haven't given enough context in the DWARF front-end so I am
repairing my bad here.

So, here is what I am proposing as an introductory comment to this
commit log:

    Sometimes, GCC emits some redundant const qualifiers around arrays.

    For instance, consider this function:

        $ cat -n test.c
             1	const char a[32];
             2
             3	char
             4	foo()
             5	{
             6	  return a[0];
             7	}
        $

    Notice how at line 1, the type of the variable 'a' is "array of const
    char".

    Let's compile the function and emit CTF debug info:

        $ gcc -gctf -c test.c
        $

    Let's see what IR libabigail emits from the CTF information:

        $ abidw --ctf --annotate test.o  | cat -n
             1	<abi-corpus version='2.1' path='test.o' architecture='elf-amd-x86_64'>
             2	  <elf-function-symbols>
             3	    <!-- foo -->
             4	    <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
             5	  </elf-function-symbols>
             6	  <elf-variable-symbols>
             7	    <!-- signed char -->
             8	    <elf-symbol name='a' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
             9	  </elf-variable-symbols>
            10	  <abi-instr address-size='64' language='LANG_C'>
            11	    <!-- char -->
            12	    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='type-id-1'/>
            13	    <!-- const char[32] -->
            14	    <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='256' alignment-in-bits='8' id='type-id-3'>
            15	      <!-- <anonymous range>[32] -->
            16	      <subrange length='32' type-id='type-id-4' id='type-id-5'/>
            17	    </array-type-def>
            18	    <!-- unsigned long int -->
            19	    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-4'/>
            20	    <!-- const char -->
            21	    <qualified-type-def type-id='type-id-1' const='yes' id='type-id-2'/>
            22	    <!-- const char[32] const -->
            23	    <qualified-type-def type-id='type-id-3' const='yes' id='type-id-6'/>
            24	    <!-- const char[32] const a -->
            25	    <var-decl name='a' type-id='type-id-6' mangled-name='a' visibility='default' elf-symbol-id='a'/>
            26	    <!-- char foo() -->
            27	    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo'>
            28	      <!-- char -->
            29	      <return type-id='type-id-1'/>
            30	    </function-decl>
            31	  </abi-instr>
            32	</abi-corpus>
        $

    Notice how at line 25, the variable 'a' is described as having the
    type which ID is 'type-id-6' defined at line 23.  It's a "const array
    of const char".

    GCC has thus added a redundant "const" qualifier to the array.

    The C language specification in paragraph [6.7.3]/8 says:

        If the specification of an array type includes any type
        qualifiers, the element type is so- qualified, not the array type.

    This means that a "const array of char" is the same as an "array of
    const char".  So a "const array of const char" is the same an "array
    of const char".

    This patch performs that removal of redundant qualifier.

[...]


> --- a/src/abg-ctf-reader.cc
> +++ b/src/abg-ctf-reader.cc

[...]


> +/// Strip qualification from a qualified type, when it makes sense.
> +///
> +/// CTF constructs "const const char [N]" for "const char foo[N]"
> +/// definition; This redundant types then causes bad diagnostics
> +/// when it is compared with an DWARF IR.
> +///
> +/// This function thus strips the const qualifier from the type in
> +/// that case.  It might contain code to strip other cases like this
> +/// in the future.

I have updated this part of the comment of the function to explain a
little bit more what we want to do here:

    +/// Strip qualification from a qualified type, when it makes sense.
    +///
    +/// The C language specification says in [6.7.3]/8:
    +///
    +///     [If the specification of an array type includes any type
    +///      qualifiers, the element type is so- qualified, not the
    +///      array type.]
    +///
    +/// In more mundane words, a const array of int is the same as an
    +/// array of const int.
    +///
    +/// This function thus removes the qualifiers of the array and applies
    +/// them to the array element.  The function then pretends that the
    +/// array itself it not qualified.
    +///
    +/// It might contain code to strip other cases like this in the
    +/// future.

> +///
> +/// @param t the type to strip const qualification from.
> +///
> +/// @param rdr the @ref reader to use.
> +///
> +/// @return the stripped type or just return @p t.
> +static decl_base_sptr
> +maybe_strip_qualification(const qualified_type_def_sptr t,
> +                          reader *rdr)

I believe the "rdr" parameter is useless here.  So I removed it.  I have
updated the doxygen comment accordingly.

> +{
> +  if (!t)
> +    return t;
> +
> +  decl_base_sptr result = t;
> +  type_base_sptr u = t->get_underlying_type();
> +
> +  if (is_array_type(u) || is_typedef_of_array(u))

I believe the "|| is_typedef_of_array(u)" is not appropriate here
because this code doesn't deal with "typedef of array types" yet.  When
we deal with it (in the future, when we come across cases like that)
we'll handle it here.  So I am removing this part from now.

> +    {

Here, I am adding this comment:

+      // Let's apply the qualifiers of the array to the array element
+      // and pretend that the array itself is not qualified, as per
+      // section [6.7.3]/8 of the C specification.

> +      array_type_def_sptr array = is_array_type(u);
> +      ABG_ASSERT(array);
> +      // We should not be editing types that are already canonicalized.
> +      ABG_ASSERT(!array->get_canonical_type());
> +      type_base_sptr element_type = array->get_element_type();
> +
> +      if (qualified_type_def_sptr qualified = is_qualified_type(element_type))
> +        {
> +          qualified_type_def::CV quals = qualified->get_cv_quals();
> +          quals |= t->get_cv_quals();

I am adding this comment:

+	  // So we apply the qualifiers of the array to the array
+	  // element.

> +          qualified->set_cv_quals(quals);
> +          result = is_decl(u);
> +        }
> +    }
> +
> +  return result;
> +}

[...]

Please find below the resulting patch that I have applied to the master
branch of the git repository.

Cheers,

From 4511e4f5bf2f1575669c886cc8989581d390fbcd Mon Sep 17 00:00:00 2001
From: "Guillermo E. Martinez" <guillermo.e.martinez@oracle.com>
Date: Wed, 16 Nov 2022 21:43:03 -0600
Subject: [PATCH] ctf-reader: Strip qualification from a qualified array type

Sometimes, GCC emits some redundant const qualifiers around arrays.

For instance, consider this function:

    $ cat -n test.c
	 1	const char a[32];
	 2
	 3	char
	 4	foo()
	 5	{
	 6	  return a[0];
	 7	}
    $

Notice how at line 1, the type of the variable 'a' is "array of const
char".

Let's compile the function and emit CTF debug info:

    $ gcc -gctf -c test.c
    $

Let's see what IR libabigail emits from the CTF information:

    $ abidw --ctf --annotate test.o  | cat -n
	 1	<abi-corpus version='2.1' path='test.o' architecture='elf-amd-x86_64'>
	 2	  <elf-function-symbols>
	 3	    <!-- foo -->
	 4	    <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
	 5	  </elf-function-symbols>
	 6	  <elf-variable-symbols>
	 7	    <!-- signed char -->
	 8	    <elf-symbol name='a' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
	 9	  </elf-variable-symbols>
	10	  <abi-instr address-size='64' language='LANG_C'>
	11	    <!-- char -->
	12	    <type-decl name='char' size-in-bits='8' alignment-in-bits='8' id='type-id-1'/>
	13	    <!-- const char[32] -->
	14	    <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='256' alignment-in-bits='8' id='type-id-3'>
	15	      <!-- <anonymous range>[32] -->
	16	      <subrange length='32' type-id='type-id-4' id='type-id-5'/>
	17	    </array-type-def>
	18	    <!-- unsigned long int -->
	19	    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-4'/>
	20	    <!-- const char -->
	21	    <qualified-type-def type-id='type-id-1' const='yes' id='type-id-2'/>
	22	    <!-- const char[32] const -->
	23	    <qualified-type-def type-id='type-id-3' const='yes' id='type-id-6'/>
	24	    <!-- const char[32] const a -->
	25	    <var-decl name='a' type-id='type-id-6' mangled-name='a' visibility='default' elf-symbol-id='a'/>
	26	    <!-- char foo() -->
	27	    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8' elf-symbol-id='foo'>
	28	      <!-- char -->
	29	      <return type-id='type-id-1'/>
	30	    </function-decl>
	31	  </abi-instr>
	32	</abi-corpus>
    $

Notice how at line 25, the variable 'a' is described as having the
type which ID is 'type-id-6' defined at line 23.  It's a "const array
of const char".

GCC has thus added a redundant "const" qualifier to the array.

The C language specification in paragraph [6.7.3]/8 says:

    If the specification of an array type includes any type
    qualifiers, the element type is so- qualified, not the array type.

This means that a "const array of char" is the same as an "array of
const char".  So a "const array of const char" is the same an "array
of const char".

This patch performs that removal of redundant qualifier.

	* src/abg-ctf-reader.cc (maybe_strip_qualification): New
	definition.
	(process_ctf_qualified_type): Strip redundant qualifiers.
	* tests/data/test-read-ctf/test-const-array.abi: New test.
	* tests/data/test-read-ctf/test-const-array.c: Likewise.
	* tests/data/test-read-ctf/test-const-array.o: Likewise.
	* tests/Makefile.am: Add the new test material to source
	distribution.

Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 src/abg-ctf-reader.cc                         |  70 +++++++++++++++++-
 tests/data/Makefile.am                        |   3 +
 tests/data/test-read-ctf/test-const-array.abi |  14 ++++
 tests/data/test-read-ctf/test-const-array.c   |   2 +
 tests/data/test-read-ctf/test-const-array.o   | Bin 0 -> 1416 bytes
 tests/test-read-ctf.cc                        |  11 ++-
 6 files changed, 97 insertions(+), 3 deletions(-)
 create mode 100644 tests/data/test-read-ctf/test-const-array.abi
 create mode 100644 tests/data/test-read-ctf/test-const-array.c
 create mode 100644 tests/data/test-read-ctf/test-const-array.o

diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc
index d000556b..7615a44e 100644
--- a/src/abg-ctf-reader.cc
+++ b/src/abg-ctf-reader.cc
@@ -1251,6 +1251,65 @@ process_ctf_array_type(reader *rdr,
   return result;
 }
 
+/// Strip qualification from a qualified type, when it makes sense.
+///
+/// The C language specification says in [6.7.3]/8:
+///
+///     [If the specification of an array type includes any type
+///      qualifiers, the element type is so- qualified, not the
+///      array type.]
+///
+/// In more mundane words, a const array of int is the same as an
+/// array of const int.
+///
+/// This function thus removes the qualifiers of the array and applies
+/// them to the array element.  The function then pretends that the
+/// array itself it not qualified.
+///
+/// It might contain code to strip other cases like this in the
+/// future.
+///
+/// @param t the type to strip const qualification from.
+///
+/// @param rdr the @ref reader to use.
+///
+/// @return the stripped type or just return @p t.
+static decl_base_sptr
+maybe_strip_qualification(const qualified_type_def_sptr t)
+{
+  if (!t)
+    return t;
+
+  decl_base_sptr result = t;
+  type_base_sptr u = t->get_underlying_type();
+
+  if (is_array_type(u))
+    {
+      // Let's apply the qualifiers of the array to the array element
+      // and pretend that the array itself is not qualified, as per
+      // section [6.7.3]/8 of the C specification.
+
+      array_type_def_sptr array = is_array_type(u);
+      ABG_ASSERT(array);
+      // We should not be editing types that are already canonicalized.
+      ABG_ASSERT(!array->get_canonical_type());
+      type_base_sptr element_type = array->get_element_type();
+
+      if (qualified_type_def_sptr qualified = is_qualified_type(element_type))
+        {
+          qualified_type_def::CV quals = qualified->get_cv_quals();
+          quals |= t->get_cv_quals();
+	  // So we apply the qualifiers of the array to the array
+	  // element.
+          qualified->set_cv_quals(quals);
+	  // Let's pretend that the array is no more qualified.
+          result = is_decl(u);
+        }
+    }
+
+  return result;
+}
+
 /// Build and return a qualified type libabigail IR.
 ///
 /// @param rdr the read context.
@@ -1293,8 +1352,15 @@ process_ctf_qualified_type(reader *rdr,
   result.reset(new qualified_type_def(utype, qualifiers, location()));
   if (result)
     {
-      decl_base_sptr qualified_type_decl = get_type_declaration(result);
-      add_decl_to_scope(qualified_type_decl, tunit->get_global_scope());
+      // Strip some potentially redundant type qualifiers from
+      // the qualified type we just built.
+      decl_base_sptr d = maybe_strip_qualification(is_qualified_type(result));
+      if (!d)
+        d = get_type_declaration(result);
+      ABG_ASSERT(d);
+
+      add_decl_to_scope(d, tunit->get_global_scope());
+      result = is_type(d);
       rdr->add_type(ctf_dictionary, ctf_type, result);
     }
 
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index b89a4dd8..8d4a2b8f 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -710,6 +710,9 @@ test-read-ctf/test-bitfield.o		\
 test-read-ctf/test-bitfield-enum.abi	\
 test-read-ctf/test-bitfield-enum.c	\
 test-read-ctf/test-bitfield-enum.o	\
+test-read-ctf/test-const-array.abi	\
+test-read-ctf/test-const-array.c	\
+test-read-ctf/test-const-array.o	\
 \
 test-annotate/test0.abi			\
 test-annotate/test1.abi			\
diff --git a/tests/data/test-read-ctf/test-const-array.abi b/tests/data/test-read-ctf/test-const-array.abi
new file mode 100644
index 00000000..bd60b098
--- /dev/null
+++ b/tests/data/test-read-ctf/test-const-array.abi
@@ -0,0 +1,14 @@
+<abi-corpus version='2.1' path='data/test-read-ctf/test-const-array.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='a' size='32' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr address-size='64' language='LANG_C'>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='256' id='type-id-3'>
+      <subrange length='32' type-id='type-id-4' id='type-id-5'/>
+    </array-type-def>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-4'/>
+    <qualified-type-def type-id='type-id-1' const='yes' id='type-id-2'/>
+    <var-decl name='a' type-id='type-id-3' mangled-name='a' visibility='default' elf-symbol-id='a'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-const-array.c b/tests/data/test-read-ctf/test-const-array.c
new file mode 100644
index 00000000..4ffecf87
--- /dev/null
+++ b/tests/data/test-read-ctf/test-const-array.c
@@ -0,0 +1,2 @@
+/* gcc -gctf -c test-const-array.c -o test-const-array.o */
+const char a[32];
diff --git a/tests/data/test-read-ctf/test-const-array.o b/tests/data/test-read-ctf/test-const-array.o
new file mode 100644
index 0000000000000000000000000000000000000000..b50e2fe5a7f7c86b3220c08782ee1d72035cc4d3
GIT binary patch
literal 1416
zcmbtU&2H2%5T3NlQhpA!LRAG4GACL=oNPFi1B$4i91sU2?sc+eH)__YY*#cVu1LM`
zNPQEY0bT%R5__|?Rz1K-<N5o(vB&Z5x3?eOZA1}xiQqL1k<S8r-x&P7b91;4_u%)>
z(X#SrfWQcS(k-VC(4L^4qTWK?b4tG3Z%h{Pn`lTfipQM`W9pOlKCL^n(8dI2s7^B4
z6Uw>JP&aDE&XuWVN={j&EC@*E%|a$cTeL}|MOn+l=rXCRLKM|ZRCTQ6*ThO=O)?c$
zbZ)Grn8v03(nn>ZjE#lXqUELE_6B==bo7etAAkIOz$Pzw%2Sr5SvHxZhiqS7oJn0R
zq_Uzu=zGxl87kcil5oc8s+$R8lE}q$H#Z5@NAT-Uh<S*K?XG)YVIDwJ$Jd7w0Nk_-
zD+;t$_jc|*D=#c?x+dU-F~ISPfa|8ul+A+X0<Ib>IZhHAE6P(B&(t|T(+y5<TYrH6
zvyYKZGrRY)Y?d#*>rQxoPq9on|M)yQ_fB9#{xhu88~s=Q3*?49Y0I1zl<-4_*a>1N
zxBM{@2_<(x)<we-#)nuUXgWYT@5J$+2YHw7I8=Ir>T|2m%XP^$*iV?djT)Z+hvSFm
zqPt!df`weFUpfAJ2fpiYo=^WnBzI85Z%6qp*L0VH6$!`M#@agm6UUb;TyjJHU(J<n
AdH?_b

literal 0
HcmV?d00001

diff --git a/tests/test-read-ctf.cc b/tests/test-read-ctf.cc
index a0b399fc..f2d529e2 100644
--- a/tests/test-read-ctf.cc
+++ b/tests/test-read-ctf.cc
@@ -362,7 +362,16 @@ static InOutSpec in_out_specs[] =
     "data/test-read-ctf/test-bitfield-enum.abi",
     "output/test-read-ctf/test-bitfield-enum.abi",
     "--ctf",
-   },
+  },
+  {
+    "data/test-read-ctf/test-const-array.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-const-array.abi",
+    "output/test-read-ctf/test-const-array.abi",
+    "--ctf",
+  },
   // This should be the last entry.
   {NULL, NULL, NULL, SEQUENCE_TYPE_ID_STYLE, NULL, NULL, NULL}
 };
-- 
2.38.1


-- 
		Dodji

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 4/5] ctf-front-end: Fix representation for multidimensional array type
  2022-11-17  3:43 ` [PATCH 4/5] ctf-front-end: Fix representation for multidimensional " Guillermo E. Martinez
@ 2022-11-30  9:43   ` Dodji Seketeli
  0 siblings, 0 replies; 16+ messages in thread
From: Dodji Seketeli @ 2022-11-30  9:43 UTC (permalink / raw)
  To: Guillermo E. Martinez via Libabigail; +Cc: Guillermo E. Martinez

Hello Guillermo,

"Guillermo E. Martinez via Libabigail" <libabigail@sourceware.org> a
écrit:

> To build an IR for multidimensional array the CTF front-end
> iterates over the element types recursively, so a definition as
> follows:
>
>   char a[2][3][4][5];
>
> Produces: 'char[2][3][4] a[5]' instead of 'char a[2][3][4][5]', it
> considers always multidimensional arrays as unidimensional creating
> a `array-type-def' node for each dimension:
>
>   <array-type-def dimensions='1' type-id='type-id-1' ... >
>     <subrange length='2' type-id='type-id-3' id='type-id-4'/>
>   </array-type-def>
>   <array-type-def dimensions='1' type-id='type-id-2' ... >
>     <subrange length='3' type-id='type-id-3' id='type-id-6'/>
>   </array-type-def>
>   ...
>
> Instead of:
>
>   <array-type-def dimensions='4' type-id='type-id-1' ... >
>      <subrange length='2' type-id='type-id-3' id='type-id-4'/>
>      <subrange length='3' type-id='type-id-3' id='type-id-5'/>
>      ...
>   </array-type-def>
>
> 	* src/abg-ctf-reader.cc (+build_array_ctf_range): New definition.
> 	* tests/data/Makefile.am: Add new testcase.
> 	* tests/data/test-read-ctf/test-array-mdimension.abi: New testcase.
> 	* tests/data/test-read-ctf/test-array-mdimension.c: Likewise.
> 	* tests/data/test-read-ctf/test-array-mdimension.o: Likewise.
> 	* tests/data/test-read-ctf/test9.o.abi: Adjust.
> 	* tests/test-read-ctf.cc: Update testsuite.

[...]

I believe the patch wasn't applying cleanly because the code in the
master branch changed since your original post. So I had to massage
things a little bit in the hunks touching src/abg-ctf-reader.cc.
Nothing major.

Please find below the resulting patch that I have applied to the master
branch of the repository.

Many thanks!

Cheers,


From e33a74fb8c096bc190704402983acfeca25fc3ee Mon Sep 17 00:00:00 2001
From: "Guillermo E. Martinez" <guillermo.e.martinez@oracle.com>
Date: Wed, 16 Nov 2022 21:43:04 -0600
Subject: [PATCH] ctf-reader: Fix representation of multidimensional arrays

To build an IR for multidimensional array the CTF front-end iterates
over the element types recursively.

So, consider the array definition:

  char a[2][3][4][5];

It's represented as

  'char[2][3][4] a[5]'

instead of:

  'char a[2][3][4][5]'

It always considers multidimensional arrays as unidimensional creating
a `array-type-def' node for each dimension:

  <array-type-def dimensions='1' type-id='type-id-1' ... >
    <subrange length='2' type-id='type-id-3' id='type-id-4'/>
  </array-type-def>
  <array-type-def dimensions='1' type-id='type-id-2' ... >
    <subrange length='3' type-id='type-id-3' id='type-id-6'/>
  </array-type-def>
  ...

Instead of:

  <array-type-def dimensions='4' type-id='type-id-1' ... >
     <subrange length='2' type-id='type-id-3' id='type-id-4'/>
     <subrange length='3' type-id='type-id-3' id='type-id-5'/>
     ...
  </array-type-def>

Fixed thus.

	* src/abg-ctf-reader.cc (+build_array_ctf_range): New definition.
	* tests/data/Makefile.am: Add new testcase.
	* tests/data/test-read-ctf/test-array-mdimension.abi: New testcase.
	* tests/data/test-read-ctf/test-array-mdimension.c: Likewise.
	* tests/data/test-read-ctf/test-array-mdimension.o: Likewise.
	* tests/data/test-read-ctf/test9.o.abi: Adjust.
	* tests/test-read-ctf.cc: Update testsuite.

Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 src/abg-ctf-reader.cc                         | 101 +++++++++++++-----
 tests/data/Makefile.am                        |   3 +
 .../test-read-ctf/test-array-mdimension.abi   |  16 +++
 .../test-read-ctf/test-array-mdimension.c     |   2 +
 .../test-read-ctf/test-array-mdimension.o     | Bin 0 -> 1360 bytes
 tests/data/test-read-ctf/test9.o.abi          |  36 +++----
 tests/test-read-ctf.cc                        |   9 ++
 7 files changed, 120 insertions(+), 47 deletions(-)
 create mode 100644 tests/data/test-read-ctf/test-array-mdimension.abi
 create mode 100644 tests/data/test-read-ctf/test-array-mdimension.c
 create mode 100644 tests/data/test-read-ctf/test-array-mdimension.o

diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc
index c48e61a4..b4b957d2 100644
--- a/src/abg-ctf-reader.cc
+++ b/src/abg-ctf-reader.cc
@@ -1163,6 +1163,57 @@ process_ctf_union_type(reader *rdr,
   return result;
 }
 
+/// Build and return an array subrange.
+///
+/// @param rdr the read context.
+///
+/// @param ctf_dictionary the CTF dictionary where @ref index
+/// will be found.
+///
+/// @param index the CTF type ID for the array index.
+///
+/// @param nelems the elements number of the array.
+///
+/// @return a shared pointer to subrange built.
+static array_type_def::subrange_sptr
+build_array_ctf_range(reader *rdr, ctf_dict_t *dic,
+                      ctf_id_t index, uint64_t nelems)
+{
+  bool is_infinite = false;
+  corpus_sptr corp = rdr->corpus();
+  translation_unit_sptr tunit = rdr->cur_transl_unit();
+  array_type_def::subrange_sptr subrange;
+  array_type_def::subrange_type::bound_value lower_bound;
+  array_type_def::subrange_type::bound_value upper_bound;
+
+  type_base_sptr index_type = rdr->build_type(dic, index);
+  if (!index_type)
+    return nullptr;
+
+  lower_bound.set_unsigned(0); /* CTF supports C only.  */
+  upper_bound.set_unsigned(nelems > 0 ? nelems - 1 : 0U);
+
+  /* for VLAs number of array elements is 0 */
+  if (upper_bound.get_unsigned_value() == 0)
+    is_infinite = true;
+
+  subrange.reset(new array_type_def::subrange_type(rdr->env(),
+                                                   "",
+                                                   lower_bound,
+                                                   upper_bound,
+                                                   index_type,
+                                                   location(),
+                                                   translation_unit::LANG_C));
+  if (!subrange)
+    return nullptr;
+
+  subrange->is_infinite(is_infinite);
+  add_decl_to_scope(subrange, tunit->get_global_scope());
+  canonicalize(subrange);
+
+  return subrange;
+}
+
 /// Build and return an array type libabigail IR.
 ///
 /// @param rdr the read context.
@@ -1181,7 +1232,6 @@ process_ctf_array_type(reader *rdr,
   translation_unit_sptr tunit = rdr->cur_transl_unit();
   array_type_def_sptr result;
   ctf_arinfo_t ctf_ainfo;
-  bool is_infinite = false;
 
   /* First, get the information about the CTF array.  */
   if (static_cast<ctf_id_t>(ctf_array_info(ctf_dictionary,
@@ -1192,6 +1242,26 @@ process_ctf_array_type(reader *rdr,
   ctf_id_t ctf_element_type = ctf_ainfo.ctr_contents;
   ctf_id_t ctf_index_type = ctf_ainfo.ctr_index;
   uint64_t nelems = ctf_ainfo.ctr_nelems;
+  array_type_def::subrange_sptr subrange;
+  array_type_def::subranges_type subranges;
+
+  int type_array_kind = ctf_type_kind(ctf_dictionary, ctf_element_type);
+  while (type_array_kind == CTF_K_ARRAY)
+    {
+      if (static_cast<ctf_id_t>(ctf_array_info(ctf_dictionary,
+                                               ctf_element_type,
+                                               &ctf_ainfo)) == CTF_ERR)
+        return result;
+
+      subrange = build_array_ctf_range(rdr, ctf_dictionary,
+                                       ctf_ainfo.ctr_index,
+                                       ctf_ainfo.ctr_nelems);
+      subranges.push_back(subrange);
+      ctf_element_type = ctf_ainfo.ctr_contents;
+      type_array_kind = ctf_type_kind(ctf_dictionary, ctf_element_type);
+    }
+
+  std::reverse(subranges.begin(), subranges.end());
 
   /* Make sure the element type is generated.  */
   type_base_sptr element_type = rdr->build_type(ctf_dictionary,
@@ -1210,33 +1280,8 @@ process_ctf_array_type(reader *rdr,
   if (result)
     return result;
 
-  /* The number of elements of the array determines the IR subranges
-     type to build.  */
-  array_type_def::subranges_type subranges;
-  array_type_def::subrange_sptr subrange;
-  array_type_def::subrange_type::bound_value lower_bound;
-  array_type_def::subrange_type::bound_value upper_bound;
-
-  lower_bound.set_unsigned(0); /* CTF supports C only.  */
-  upper_bound.set_unsigned(nelems > 0 ? nelems - 1 : 0U);
-
-  /* for VLAs number of array elements is 0 */
-  if (upper_bound.get_unsigned_value() == 0)
-    is_infinite = true;
-
-  subrange.reset(new array_type_def::subrange_type(rdr->env(),
-                                                   "",
-                                                   lower_bound,
-                                                   upper_bound,
-                                                   index_type,
-                                                   location(),
-                                                   translation_unit::LANG_C));
-  if (!subrange)
-    return result;
-
-  subrange->is_infinite(is_infinite);
-  add_decl_to_scope(subrange, tunit->get_global_scope());
-  canonicalize(subrange);
+  subrange = build_array_ctf_range(rdr, ctf_dictionary,
+                                   ctf_index_type, nelems);
   subranges.push_back(subrange);
 
   /* Finally build the IR for the array type and return it.  */
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 8d4a2b8f..d04ecf3f 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -713,6 +713,9 @@ test-read-ctf/test-bitfield-enum.o	\
 test-read-ctf/test-const-array.abi	\
 test-read-ctf/test-const-array.c	\
 test-read-ctf/test-const-array.o	\
+test-read-ctf/test-array-mdimension.abi	\
+test-read-ctf/test-array-mdimension.c	\
+test-read-ctf/test-array-mdimension.o	\
 \
 test-annotate/test0.abi			\
 test-annotate/test1.abi			\
diff --git a/tests/data/test-read-ctf/test-array-mdimension.abi b/tests/data/test-read-ctf/test-array-mdimension.abi
new file mode 100644
index 00000000..177284d2
--- /dev/null
+++ b/tests/data/test-read-ctf/test-array-mdimension.abi
@@ -0,0 +1,16 @@
+<abi-corpus version='2.1' path='data/test-read-ctf/test-array-mdimension.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='a' size='120' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr address-size='64' language='LANG_C'>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <array-type-def dimensions='4' type-id='type-id-1' size-in-bits='960' id='type-id-2'>
+      <subrange length='2' type-id='type-id-3' id='type-id-4'/>
+      <subrange length='3' type-id='type-id-3' id='type-id-5'/>
+      <subrange length='4' type-id='type-id-3' id='type-id-6'/>
+      <subrange length='5' type-id='type-id-3' id='type-id-7'/>
+    </array-type-def>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <var-decl name='a' type-id='type-id-2' mangled-name='a' visibility='default' elf-symbol-id='a'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-array-mdimension.c b/tests/data/test-read-ctf/test-array-mdimension.c
new file mode 100644
index 00000000..317fc589
--- /dev/null
+++ b/tests/data/test-read-ctf/test-array-mdimension.c
@@ -0,0 +1,2 @@
+/* gcc -gctf -c test-array-mdimension.c -o test-array-mdimension.o */
+char a[2][3][4][5];
diff --git a/tests/data/test-read-ctf/test-array-mdimension.o b/tests/data/test-read-ctf/test-array-mdimension.o
new file mode 100644
index 0000000000000000000000000000000000000000..5b392d89439a1e39111c350ba2ee8baf7cdb4a14
GIT binary patch
literal 1360
zcmbVM&2G~`5T3Ll{9P!g0vB_l6?pBWT<8H=s-OrVZX7wRoh7mGPqf~u@rhUH8^ELR
z2)qH$051SD_N=`u;lfDcnf>Pbc6Y{3KD~JJa&IyLYZG`5<I17{S9@cgbZG*&;THV-
zJ{>CeM+!_aC%?gd2jdm`27QKp$WA$*H=~IBeZtUYq)jO6?Jfo4(1F9D03E*17)7=Y
zr#ldrB3p-F!v*0KAzMogMP03ei>k?2m0AXQWk5o-u1giAZQ4e)mRX^qMrToxr!vh~
zGB3hPT}DPVriqr)$Sw`FlFKkNANrNlTDD=i%u9uP*OkZs&d<(HgQN4e?~a4{iHJoU
zEaJstK98RTM{2uKn#e{L$Njwnz9$Os&XccBFF22Wz3ZJ(Yu2bfg&)7{+QxgB9KblW
ztu0Vj;f~8o0MWFikts%_`?$85QCkCoW&t8?8W1=KeAFd11fr^q64*xA7@2+K^{ToM
z8(m}DrnRU4cYJ_K>XpBtVV`8k{!IM2J;X9$<3xIX(ucpEzWxz1=)3)wewZ)s6mYcR
z2`2uYR7>cA_S7qSOPC{vu$ah>874k<FiNf7##0A#sh=&u1$S^?BX%9#`F(bZFRb_P
yMYD2^Xug)}-&p^O$v2s2_4I#2Mz}wF!Vh^<`aWFq+d9DFF8vAX-@9VWef@8H9&fb(

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test9.o.abi b/tests/data/test-read-ctf/test9.o.abi
index 331bfc70..9f5a7466 100644
--- a/tests/data/test-read-ctf/test9.o.abi
+++ b/tests/data/test-read-ctf/test9.o.abi
@@ -11,47 +11,45 @@
       <subrange length='infinite' type-id='type-id-4' id='type-id-7'/>
     </array-type-def>
     <type-decl name='double' size-in-bits='64' id='type-id-8'/>
-    <array-type-def dimensions='1' type-id='type-id-8' size-in-bits='320' id='type-id-9'>
+    <array-type-def dimensions='2' type-id='type-id-8' size-in-bits='960' id='type-id-9'>
       <subrange length='5' type-id='type-id-4' id='type-id-10'/>
+      <subrange length='3' type-id='type-id-4' id='type-id-11'/>
     </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-9' size-in-bits='960' id='type-id-11'>
-      <subrange length='3' type-id='type-id-4' id='type-id-12'/>
+    <type-decl name='int' size-in-bits='32' id='type-id-12'/>
+    <array-type-def dimensions='1' type-id='type-id-13' size-in-bits='256' alignment-in-bits='64' id='type-id-14'>
+      <subrange length='4' type-id='type-id-4' id='type-id-15'/>
     </array-type-def>
-    <type-decl name='int' size-in-bits='32' id='type-id-13'/>
-    <array-type-def dimensions='1' type-id='type-id-14' size-in-bits='256' alignment-in-bits='64' id='type-id-15'>
-      <subrange length='4' type-id='type-id-4' id='type-id-16'/>
+    <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='640' alignment-in-bits='64' id='type-id-17'>
+      <subrange length='10' type-id='type-id-4' id='type-id-18'/>
     </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='640' alignment-in-bits='64' id='type-id-18'>
-      <subrange length='10' type-id='type-id-4' id='type-id-19'/>
-    </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-13' size-in-bits='160' id='type-id-20'>
+    <array-type-def dimensions='1' type-id='type-id-12' size-in-bits='160' id='type-id-19'>
       <subrange length='5' type-id='type-id-4' id='type-id-10'/>
     </array-type-def>
-    <class-decl name='S' size-in-bits='2304' is-struct='yes' visibility='default' id='type-id-21'>
+    <class-decl name='S' size-in-bits='2304' is-struct='yes' visibility='default' id='type-id-20'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='a' type-id='type-id-20' visibility='default'/>
+        <var-decl name='a' type-id='type-id-19' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='192'>
         <var-decl name='b' type-id='type-id-3' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='640'>
-        <var-decl name='c' type-id='type-id-11' visibility='default'/>
+        <var-decl name='c' type-id='type-id-9' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='1600'>
-        <var-decl name='d' type-id='type-id-18' visibility='default'/>
+        <var-decl name='d' type-id='type-id-17' visibility='default'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='2240'>
         <var-decl name='e' type-id='type-id-6' visibility='default'/>
       </data-member>
     </class-decl>
     <type-decl name='unsigned long int' size-in-bits='64' id='type-id-4'/>
-    <pointer-type-def type-id='type-id-21' size-in-bits='64' alignment-in-bits='64' id='type-id-22'/>
+    <pointer-type-def type-id='type-id-20' size-in-bits='64' alignment-in-bits='64' id='type-id-21'/>
     <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-2'/>
-    <pointer-type-def type-id='type-id-13' size-in-bits='64' alignment-in-bits='64' id='type-id-14'/>
-    <pointer-type-def type-id='type-id-15' size-in-bits='64' alignment-in-bits='64' id='type-id-17'/>
+    <pointer-type-def type-id='type-id-12' size-in-bits='64' alignment-in-bits='64' id='type-id-13'/>
+    <pointer-type-def type-id='type-id-14' size-in-bits='64' alignment-in-bits='64' id='type-id-16'/>
     <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
-      <parameter type-id='type-id-22'/>
-      <return type-id='type-id-13'/>
+      <parameter type-id='type-id-21'/>
+      <return type-id='type-id-12'/>
     </function-decl>
   </abi-instr>
 </abi-corpus>
diff --git a/tests/test-read-ctf.cc b/tests/test-read-ctf.cc
index f2d529e2..f3d46118 100644
--- a/tests/test-read-ctf.cc
+++ b/tests/test-read-ctf.cc
@@ -372,6 +372,15 @@ static InOutSpec in_out_specs[] =
     "output/test-read-ctf/test-const-array.abi",
     "--ctf",
   },
+  {
+    "data/test-read-ctf/test-array-mdimension.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-array-mdimension.abi",
+    "output/test-read-ctf/test-array-mdimension.abi",
+    "--ctf",
+  },
   // This should be the last entry.
   {NULL, NULL, NULL, SEQUENCE_TYPE_ID_STYLE, NULL, NULL, NULL}
 };
-- 
2.38.1


-- 
		Dodji

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 5/5] ctf-front-end: Fix array size representation
  2022-11-17  3:43 ` [PATCH 5/5] ctf-front-end: Fix array size representation Guillermo E. Martinez
@ 2022-11-30  9:58   ` Dodji Seketeli
  0 siblings, 0 replies; 16+ messages in thread
From: Dodji Seketeli @ 2022-11-30  9:58 UTC (permalink / raw)
  To: Guillermo E. Martinez via Libabigail; +Cc: Guillermo E. Martinez

Hello Guillermo,

"Guillermo E. Martinez via Libabigail" <libabigail@sourceware.org> a
écrit:

> Array with a single element is represented as infinite array.
>
> <array-type-def dimensions='1' ... size-in-bits='infinite' ...>
>     <subrange length='infinite' type-id='type-id-3' .../>
> </array-type-def>

Hmmh, actually I think it's a little bit more involved than that.

This case is for "variable length arrays", for instance, defined as:

int a[];

There is also an extension known as "zero-length arrays", supported by
GCC and various other compilers since forever:
https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html.  It's an extension
because strictly speaking an array can't have a zero size in C.

I see the "zero-length array" as another way to specify a variable
length array in the context of the "flexible array member" idiom:
https://en.wikipedia.org/wiki/Flexible_array_member.  Those were
standardized in C99, by the way.

So, it's those types of array that are represented in the libabigail IR
as being of "non known size".  The IR uses the "infinite" keyword,
similarly to what DWARF does.

I have thus updated the introductory paragraphs of the commit log accordingly.
>
> 	* src/abg-ctf-reader.cc (build_array_ctf_range): Use
> 	* tests/data/Makefile.am: Add new test.
> 	`upper_bound' and number of elements to indicate infinite
> 	array size.
> 	* tests/data/test-read-ctf/test-array-size.abi: New test.
> 	* tests/data/test-read-ctf/test-array-size.c: Likewise.
> 	* tests/data/test-read-ctf/test-array-size.o: Likewise.
> 	* tests/test-read-ctf.cc: Update testsuite.
>
> Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>

The patch otherwise looks good to me.  Please find below what was
actually applied to the master repository.

[...]

Cheers,

From 77ae31417697dde8d3119e042dafd7dddb9538e1 Mon Sep 17 00:00:00 2001
From: "Guillermo E. Martinez via Libabigail" <libabigail@sourceware.org>
Date: Wed, 16 Nov 2022 21:43:05 -0600
Subject: [PATCH] ctf-reader: Fix array size representation

A variable length array (VLA), or a flexible array member (with its
size set to zero to recognize such cases) is represented in the
libabigail IR as an array with "non-finite" length.  This is a way to
say that the length of the array is not statically known.

The ABIXML array-type-def element looks like:

<array-type-def dimensions='1' ... size-in-bits='infinite' ...>
    <subrange length='infinite' type-id='type-id-3' .../>
</array-type-def>

The patch teaches the ctf-reader to correctly set the size of the
array for VLAs.

	* src/abg-ctf-reader.cc (build_array_ctf_range): Use
	* tests/data/Makefile.am: Add new test.
	`upper_bound' and number of elements to indicate infinite
	array size.
	* tests/data/test-read-ctf/test-array-size.abi: New test.
	* tests/data/test-read-ctf/test-array-size.c: Likewise.
	* tests/data/test-read-ctf/test-array-size.o: Likewise.
	* tests/test-read-ctf.cc: Update testsuite.

Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
Signed-off-by: Dodji Seketeli <dodji@redhat.com>
---
 src/abg-ctf-reader.cc                        |   2 +-
 tests/data/Makefile.am                       |   3 +++
 tests/data/test-read-ctf/test-array-size.abi |  23 +++++++++++++++++++
 tests/data/test-read-ctf/test-array-size.c   |   4 ++++
 tests/data/test-read-ctf/test-array-size.o   | Bin 0 -> 1432 bytes
 tests/data/test-read-ctf/test9.o.abi         |   4 ++--
 tests/test-read-ctf.cc                       |   9 ++++++++
 7 files changed, 42 insertions(+), 3 deletions(-)
 create mode 100644 tests/data/test-read-ctf/test-array-size.abi
 create mode 100644 tests/data/test-read-ctf/test-array-size.c
 create mode 100644 tests/data/test-read-ctf/test-array-size.o

diff --git a/src/abg-ctf-reader.cc b/src/abg-ctf-reader.cc
index b4b957d2..e0b8bfb1 100644
--- a/src/abg-ctf-reader.cc
+++ b/src/abg-ctf-reader.cc
@@ -1194,7 +1194,7 @@ build_array_ctf_range(reader *rdr, ctf_dict_t *dic,
   upper_bound.set_unsigned(nelems > 0 ? nelems - 1 : 0U);
 
   /* for VLAs number of array elements is 0 */
-  if (upper_bound.get_unsigned_value() == 0)
+  if (upper_bound.get_unsigned_value() == 0 && nelems == 0)
     is_infinite = true;
 
   subrange.reset(new array_type_def::subrange_type(rdr->env(),
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index d04ecf3f..e994aff3 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -716,6 +716,9 @@ test-read-ctf/test-const-array.o	\
 test-read-ctf/test-array-mdimension.abi	\
 test-read-ctf/test-array-mdimension.c	\
 test-read-ctf/test-array-mdimension.o	\
+test-read-ctf/test-array-size.abi	\
+test-read-ctf/test-array-size.c		\
+test-read-ctf/test-array-size.o		\
 \
 test-annotate/test0.abi			\
 test-annotate/test1.abi			\
diff --git a/tests/data/test-read-ctf/test-array-size.abi b/tests/data/test-read-ctf/test-array-size.abi
new file mode 100644
index 00000000..3fbc65b6
--- /dev/null
+++ b/tests/data/test-read-ctf/test-array-size.abi
@@ -0,0 +1,23 @@
+<abi-corpus version='2.1' path='data/test-read-ctf/test-array-size.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='bar' size='1' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='baz' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='foo' size='2' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-variable-symbols>
+  <abi-instr address-size='64' language='LANG_C'>
+    <type-decl name='char' size-in-bits='8' id='type-id-1'/>
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='8' id='type-id-2'>
+      <subrange length='1' type-id='type-id-3' id='type-id-4'/>
+    </array-type-def>
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='16' id='type-id-5'>
+      <subrange length='2' type-id='type-id-3' id='type-id-6'/>
+    </array-type-def>
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='infinite' id='type-id-7'>
+      <subrange length='infinite' type-id='type-id-3' id='type-id-8'/>
+    </array-type-def>
+    <type-decl name='unsigned long int' size-in-bits='64' id='type-id-3'/>
+    <var-decl name='bar' type-id='type-id-2' mangled-name='bar' visibility='default' elf-symbol-id='bar'/>
+    <var-decl name='baz' type-id='type-id-7' mangled-name='baz' visibility='default' elf-symbol-id='baz'/>
+    <var-decl name='foo' type-id='type-id-5' mangled-name='foo' visibility='default' elf-symbol-id='foo'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-array-size.c b/tests/data/test-read-ctf/test-array-size.c
new file mode 100644
index 00000000..fe2f3fef
--- /dev/null
+++ b/tests/data/test-read-ctf/test-array-size.c
@@ -0,0 +1,4 @@
+/* gcc -gctf -c test-array-size.c -o test-array-size.o */
+char foo[2];
+char bar[1];
+char baz[0];
diff --git a/tests/data/test-read-ctf/test-array-size.o b/tests/data/test-read-ctf/test-array-size.o
new file mode 100644
index 0000000000000000000000000000000000000000..8e4d8b147bcf9ae2fcfe3d6f2caca05868f6b341
GIT binary patch
literal 1432
zcmbVM&2G~`5T29}elMj5kU+vnNVEd4op7QDWT}Em2ysK=!eQ-f6AQ<#?5!I20*}Ev
zaN!Yn3~ulW@B%QOvzx3};lfDc`R1E%Ry$)SA78wFxic7$wE;b+O=el5?>ifubTFYC
zbe(?x7_KW1HxjzZ7=Fii%<(h3W*@R&V!zCOj~$x8VAOz70}q|K&j|4<QzMRSBgT{f
zt?U*8G`P_EQbax8oCRr*2SM3f)>KsGEI2Ehd{(Myke8ZHs)|ysr1FBId9_ec+NNz(
z)iNto)YMs2<f%;anaqo@ROgXajc%f;)UtzNt>iS!^vNodbuHVl$uE@1h>nkr4uk#U
zH*XJu@lz3tIGDtf$#@(;3-;CWRMq)Hm0A`D-3`0l1q`ttZsIuy->@@l1Cu**+EOo~
zKBQlNdL$=%?7Q98R~5U*+lIHfJ^!xZ@t%5y9fZA6-8GVE+J%-WM_sSt+#;=(ngq5-
zB5fKHyg7bU3oL>}S!pGB^svz~`(W}}c_vQlir1yv-ZlO=!CaWpd~54tk~QiByAR7g
zU;xhFOJW6H^!p!i9pCrA`rUVqqx}9STR7+vJlGPi!Aoh(8gTgCy7tKkAG;)D+i&Bc
z!@1HgR^XCbw6B=E!fwAeEB|Wx{d-|ou0iJaqW;tLFOB$`(b<0d=fJ@Gy9fWy9C{y#
UWBypXT-(-vZu;Lly?}oIUzApI#Q*>R

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test9.o.abi b/tests/data/test-read-ctf/test9.o.abi
index 9f5a7466..5c89f821 100644
--- a/tests/data/test-read-ctf/test9.o.abi
+++ b/tests/data/test-read-ctf/test9.o.abi
@@ -7,8 +7,8 @@
     <array-type-def dimensions='1' type-id='type-id-2' size-in-bits='448' alignment-in-bits='64' id='type-id-3'>
       <subrange length='7' type-id='type-id-4' id='type-id-5'/>
     </array-type-def>
-    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='infinite' id='type-id-6'>
-      <subrange length='infinite' type-id='type-id-4' id='type-id-7'/>
+    <array-type-def dimensions='1' type-id='type-id-1' size-in-bits='8' id='type-id-6'>
+      <subrange length='1' type-id='type-id-4' id='type-id-7'/>
     </array-type-def>
     <type-decl name='double' size-in-bits='64' id='type-id-8'/>
     <array-type-def dimensions='2' type-id='type-id-8' size-in-bits='960' id='type-id-9'>
diff --git a/tests/test-read-ctf.cc b/tests/test-read-ctf.cc
index f3d46118..236ccbf2 100644
--- a/tests/test-read-ctf.cc
+++ b/tests/test-read-ctf.cc
@@ -381,6 +381,15 @@ static InOutSpec in_out_specs[] =
     "output/test-read-ctf/test-array-mdimension.abi",
     "--ctf",
   },
+  {
+    "data/test-read-ctf/test-array-size.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-array-size.abi",
+    "output/test-read-ctf/test-array-size.abi",
+    "--ctf",
+  },
   // This should be the last entry.
   {NULL, NULL, NULL, SEQUENCE_TYPE_ID_STYLE, NULL, NULL, NULL}
 };
-- 
2.38.1


-- 
		Dodji

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [PATCH 3/5] ctf-front-end: Strip qualification from a qualified array type
  2022-11-30  9:33   ` Dodji Seketeli
@ 2022-12-02  3:48     ` Guillermo E. Martinez
  0 siblings, 0 replies; 16+ messages in thread
From: Guillermo E. Martinez @ 2022-12-02  3:48 UTC (permalink / raw)
  To: Dodji Seketeli; +Cc: Guillermo E. Martinez via Libabigail

On Wed, Nov 30, 2022 at 10:33:12AM +0100, Dodji Seketeli wrote:
> Hello Guillermo,
> 

Hi Dodji,

Thanks so much for the explanation, tweak the patch and add comments!.

Best regards,
guillermo

> "Guillermo E. Martinez via Libabigail" <libabigail@sourceware.org> a
> écrit:
>[...] 

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2022-12-02  3:49 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-17  3:43 [PATCH 0/5] CTF front-end Bug Fixing and improvement Guillermo E. Martinez
2022-11-17  3:43 ` [PATCH 1/5] ctf-front-end: Set alignment-in-bits property to 0 Guillermo E. Martinez
2022-11-29 11:46   ` Dodji Seketeli
2022-11-17  3:43 ` [PATCH 2/5] ctf-front-end: Fix size and name for underlying types Guillermo E. Martinez
2022-11-29 11:53   ` Dodji Seketeli
2022-11-29 13:59     ` Dodji Seketeli
2022-11-29 18:32       ` [PATCHv2 2/5]ctf-front-end: " Guillermo E. Martinez
2022-11-30  9:14         ` Dodji Seketeli
2022-11-29 18:53     ` [PATCH 2/5] ctf-front-end: " Guillermo E. Martinez
2022-11-17  3:43 ` [PATCH 3/5] ctf-front-end: Strip qualification from a qualified array type Guillermo E. Martinez
2022-11-30  9:33   ` Dodji Seketeli
2022-12-02  3:48     ` Guillermo E. Martinez
2022-11-17  3:43 ` [PATCH 4/5] ctf-front-end: Fix representation for multidimensional " Guillermo E. Martinez
2022-11-30  9:43   ` Dodji Seketeli
2022-11-17  3:43 ` [PATCH 5/5] ctf-front-end: Fix array size representation Guillermo E. Martinez
2022-11-30  9:58   ` Dodji Seketeli

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).