diff mbox series

[v4] Add regression tests for ctf reading

Message ID 20211214062515.655198-1-guillermo.e.martinez@oracle.com
State New
Headers show
Series [v4] Add regression tests for ctf reading | expand

Commit Message

Guillermo E. Martinez Dec. 14, 2021, 6:25 a.m. UTC
Hello libabigail team,

This patch includes regression tests v4 for CTF.

The changes from v3:
        - Add mising files in CTF test harness
        - make distcheck-fast run successfuly.

Dependencies/limitations:

* It relies in the following patch:
https://sourceware.org/pipermail/libabigail/2021q4/003910.html

* Some CTF tests were *disabled* because it generates the XML ABI
corpus with *same information* but the XML nodes *are not* always
in the *same order*, so using diff command fails. Details here:
https://sourceware.org/pipermail/libabigail/2021q4/003824.html

Comments will be appreciated.

Thanks in advanced!,
Guillermo

 
This patch implements some regression tests for ctf reading.
Since the code share a lot of functionalities already used
in the readi-dwarf test, a library was built and test common
harness were moved to a common location. So input files for
test-read-{dwarf,ctf}.cc now are located in:
tests/data/test-read-common directory, ABIs description are
stored in the same location but in a separate file, one for
each binary debugging information: (e.g, test4-ctf.so.abi
and test4-dwarf.so.abi)

	* tests/test-read-ctf.cc: New ctf reading regression test.
	* tests/test-read-common.cc: New library to be used with
	test-read-{ctf,dwarf}.cc.
	* tests/test-read-common.h: Likewise.
	* tests/test-annotate.cc (in_out_specs): Adjust path for input files.
	* tests/Makefile.am: Build new tests/test-read-ctf.cc file.
	* tests/data/Makefile.am: Add test inputs and expected files.
	Add libtestreadcommon.a test library and use it for test-read-{ctf,dwarf}.
	* tests/test-read-dwarf.cc: Adapt test to use libtestreadcommon.a in
	test-read-common.{cc,h}.
	* tests/data/test-annotate/test3.so.abi: Adjust ELF input path file
	location to ./tests/data/test-read-common.
	* tests/data/test-annotate/test4.so.abi: Likewise.
	* tests/data/test-read-common/PR26261: Move test harness to
	test-read-common directory.
	* tests/data/test-read-common/PR27700: Likewise.
	* tests/data/test-read-common/test-PR26568-*: Likewise.
	* tests/data/test-read-common/test3.{c,so}: Likewise.
	* tests/data/test-read-common/test4.{c,so}: Likewise.
	* tests/data/test-read-common/crti*: Helper object to export
	_init and _fini sysmbols.
	* tests/data/test-read-ctf/test-ambiguous-struct-A.c: New testcase.
	* tests/data/test-read-ctf/test-ambiguous-struct-B.c: Likewise.
	* tests/data/test-read-ctf/test-conflicting-type-syms-a.c: Likewise.
	* tests/data/test-read-ctf/test-conflicting-type-syms-b.c: Likewise.
	* tests/data/test-read-ctf/test-enum.c: Likewise.
	* tests/data/test-read-ctf/test-enum-many.c: Likewise.
	* tests/data/test-read-ctf/test-enum-symbol.c: Likewise.
	* tests/data/test-read-ctf/test-struct-iteration.c: Likewise.
	* tests/data/test-read-ctf/test-dynamic-array.c: Likewise.
	* tests/data/test-read-ctf/test0.c: Likewise.
	* tests/data/test-read-ctf/test1.c: Likewise.
	* tests/data/test-read-ctf/test2.c: Likewise.
	* tests/data/test-read-ctf/test5.c: Likewise.
	* tests/data/test-read-ctf/test7.{c,h}: Likewise.
	* tests/data/test-read-ctf/test8.c: Likewise.
	* tests/data/test-read-ctf/test9.c: Likewise.
	* tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi: Testcase
	expected result.
	* tests/data/test-read-ctf/PR26261/PR26261-exe.abi: Likewise.
	* tests/data/test-read-ctf/PR27700/test-PR27700.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-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-enum.o.abi: Likewise.
	* tests/data/test-read-ctf/test-enum-many.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-enum-symbol.o.hash.abi: Likewise.
	* tests/data/test-read-ctf/test-struct-iteration.o.abi: Likewise.
	* tests/data/test-read-ctf/test-dynamic-array.o.abi: Likewise.
	* tests/data/test-read-ctf/test0: Likewise.
	* tests/data/test-read-ctf/test0*.abi: Likewise.
	* tests/data/test-read-ctf/test1.so: Likewise.
	* tests/data/test-read-ctf/test1*.abi: Likewise.
	* tests/data/test-read-ctf/test2.so: Likewise.
	* tests/data/test-read-ctf/test2*.abi: Likewise.
	* tests/data/test-read-ctf/test3.so.abi: Likewise.
	* tests/data/test-read-ctf/test4*.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.
	* tests/data/test-read-dwarf/PR26261/PR26261-exe.abi: Update
	expected abixml file.
	* tests/data/test-read-dwarf/PR27700/test-PR27700.abi: Likewise.
	* tests/data/test-read-dwarf/test-PR26568-1.*.abi: Likewise.
	* tests/data/test-read-dwarf/test3*.abi: Likewise.
	* tests/data/test-read-dwarf/test4*.abi: Likewise.
	* doc/api/libabigail.doxy: Add tests/test-read-common.{cc,h} to
	doxygen.

Signed-off-by: Guillermo E. Martinez <guillermo.e.martinez@oracle.com>
---
 doc/api/libabigail.doxy                       |   6 +-
 tests/Makefile.am                             |  24 +-
 tests/data/Makefile.am                        | 113 ++++--
 tests/data/test-annotate/test3.so.abi         |   4 +-
 tests/data/test-annotate/test4.so.abi         |  10 +-
 .../PR26261/Makefile                          |   4 +-
 .../data/test-read-common/PR26261/PR26261-exe | Bin 0 -> 19032 bytes
 .../PR26261/PR26261-main.c                    |   0
 .../test-read-common/PR26261/PR26261-main.o   | Bin 0 -> 4800 bytes
 .../PR26261/PR26261-obja.c                    |   0
 .../PR26261/PR26261-obja.h                    |   0
 .../test-read-common/PR26261/PR26261-obja.o   | Bin 0 -> 3592 bytes
 .../PR26261/PR26261-objb.c                    |   0
 .../PR26261/PR26261-objb.h                    |   0
 .../test-read-common/PR26261/PR26261-objb.o   | Bin 0 -> 3560 bytes
 .../PR27700/include-dir/priv.h                |   0
 .../PR27700/include-dir/pub.h                 |   0
 .../PR27700/pub-incdir/inc.h                  |   0
 .../PR27700/test-PR27700.c                    |   2 +
 .../test-read-common/PR27700/test-PR27700.o   | Bin 0 -> 3552 bytes
 tests/data/test-read-common/crti.c            |  22 ++
 .../test-PR26568-1.c                          |   3 +
 tests/data/test-read-common/test-PR26568-1.o  | Bin 0 -> 3536 bytes
 .../test-PR26568-2.c                          |   3 +
 tests/data/test-read-common/test-PR26568-2.o  | Bin 0 -> 3048 bytes
 .../test3-alias-1.suppr                       |   0
 .../test3-alias-2.suppr                       |   0
 .../test3-alias-3.suppr                       |   0
 .../test3-alias-4.suppr                       |   0
 tests/data/test-read-common/test3.c           |  26 ++
 tests/data/test-read-common/test3.so          | Bin 0 -> 14824 bytes
 tests/data/test-read-common/test4.c           |  11 +
 tests/data/test-read-common/test4.so          | Bin 0 -> 16560 bytes
 .../test-read-ctf/PR26261/PR26261-exe.abi     |  58 +++
 .../test-read-ctf/PR27700/test-PR27700.abi    |  22 ++
 tests/data/test-read-ctf/test-PR26568-1.o.abi |  56 +++
 tests/data/test-read-ctf/test-PR26568-2.o.abi |  39 ++
 tests/data/test-read-ctf/test-alias.c         |  15 +
 tests/data/test-read-ctf/test-alias.o.abi     |  19 +
 .../test-read-ctf/test-ambiguous-struct-A.c   |   8 +
 .../test-read-ctf/test-ambiguous-struct-A.o   | Bin 0 -> 1504 bytes
 .../test-ambiguous-struct-A.o.hash.abi        |  36 ++
 .../test-read-ctf/test-ambiguous-struct-B.c   |   5 +
 .../test-read-ctf/test-ambiguous-struct-B.o   | Bin 0 -> 1344 bytes
 .../test-ambiguous-struct-B.o.hash.abi        |  23 ++
 .../test-conflicting-type-syms-a.c            |   5 +
 .../test-conflicting-type-syms-a.o            | Bin 0 -> 1360 bytes
 .../test-conflicting-type-syms-a.o.hash.abi   |  14 +
 .../test-conflicting-type-syms-b.c            |   5 +
 .../test-conflicting-type-syms-b.o            | Bin 0 -> 1344 bytes
 .../test-conflicting-type-syms-b.o.hash.abi   |  13 +
 tests/data/test-read-ctf/test-dynamic-array.c |  13 +
 tests/data/test-read-ctf/test-dynamic-array.o | Bin 0 -> 1712 bytes
 .../test-read-ctf/test-dynamic-array.o.abi    |  30 ++
 tests/data/test-read-ctf/test-enum-many.c     |  10 +
 tests/data/test-read-ctf/test-enum-many.o     | Bin 0 -> 2032 bytes
 .../test-read-ctf/test-enum-many.o.hash.abi   |  69 ++++
 tests/data/test-read-ctf/test-enum-symbol.c   |   1 +
 tests/data/test-read-ctf/test-enum-symbol.o   | Bin 0 -> 1312 bytes
 .../test-read-ctf/test-enum-symbol.o.hash.abi |  16 +
 tests/data/test-read-ctf/test-enum.c          |   8 +
 tests/data/test-read-ctf/test-enum.o          | Bin 0 -> 1440 bytes
 tests/data/test-read-ctf/test-enum.o.abi      |  24 ++
 .../test-read-ctf/test-struct-iteration.c     |  28 ++
 .../test-read-ctf/test-struct-iteration.o.abi |  96 +++++
 tests/data/test-read-ctf/test0                | Bin 0 -> 16656 bytes
 tests/data/test-read-ctf/test0.abi            |  54 +++
 tests/data/test-read-ctf/test0.c              |  32 ++
 tests/data/test-read-ctf/test0.hash.abi       |  54 +++
 tests/data/test-read-ctf/test1.c              |  25 ++
 tests/data/test-read-ctf/test1.so             | Bin 0 -> 15592 bytes
 tests/data/test-read-ctf/test1.so.abi         |  23 ++
 tests/data/test-read-ctf/test1.so.hash.abi    |  23 ++
 tests/data/test-read-ctf/test2.c              |  19 +
 tests/data/test-read-ctf/test2.so             | Bin 0 -> 15616 bytes
 tests/data/test-read-ctf/test2.so.abi         |  25 ++
 tests/data/test-read-ctf/test2.so.hash.abi    |  25 ++
 tests/data/test-read-ctf/test3.so.abi         |  12 +
 tests/data/test-read-ctf/test3.so.hash.abi    |  12 +
 tests/data/test-read-ctf/test4.so.abi         |  14 +
 tests/data/test-read-ctf/test4.so.hash.abi    |  14 +
 tests/data/test-read-ctf/test5.c              |  41 ++
 tests/data/test-read-ctf/test5.o              | Bin 0 -> 2720 bytes
 tests/data/test-read-ctf/test5.o.abi          |  50 +++
 tests/data/test-read-ctf/test6.c              |  35 ++
 tests/data/test-read-ctf/test6.o.abi          |   0
 tests/data/test-read-ctf/test7.c              |   8 +
 tests/data/test-read-ctf/test7.h              |  24 ++
 tests/data/test-read-ctf/test7.o              | Bin 0 -> 2152 bytes
 tests/data/test-read-ctf/test7.o.abi          |  42 +++
 tests/data/test-read-ctf/test8.c              |   7 +
 tests/data/test-read-ctf/test8.o              | Bin 0 -> 1496 bytes
 tests/data/test-read-ctf/test8.o.abi          |  13 +
 tests/data/test-read-ctf/test9.c              |  13 +
 tests/data/test-read-ctf/test9.o              | Bin 0 -> 1864 bytes
 tests/data/test-read-ctf/test9.o.abi          |  57 +++
 .../data/test-read-dwarf/PR26261/PR26261-exe  | Bin 10976 -> 0 bytes
 .../test-read-dwarf/PR26261/PR26261-exe.abi   |  52 ++-
 .../test-read-dwarf/PR27700/test-PR27700.abi  |  10 +-
 .../test-read-dwarf/PR27700/test-PR27700.o    | Bin 3248 -> 0 bytes
 tests/data/test-read-dwarf/test-PR26568-1.o   | Bin 2864 -> 0 bytes
 .../data/test-read-dwarf/test-PR26568-1.o.abi |  20 +-
 tests/data/test-read-dwarf/test-PR26568-2.o   | Bin 2824 -> 0 bytes
 .../data/test-read-dwarf/test-PR26568-2.o.abi |  18 +-
 .../test-read-dwarf/test3-alias-1.so.hash.abi |   6 +-
 .../test-read-dwarf/test3-alias-2.so.hash.abi |   6 +-
 .../test-read-dwarf/test3-alias-3.so.hash.abi |   6 +-
 .../test-read-dwarf/test3-alias-4.so.hash.abi |   2 +-
 tests/data/test-read-dwarf/test3.c            |  11 -
 tests/data/test-read-dwarf/test3.so           | Bin 8851 -> 0 bytes
 tests/data/test-read-dwarf/test3.so.abi       |   6 +-
 tests/data/test-read-dwarf/test3.so.hash.abi  |   6 +-
 tests/data/test-read-dwarf/test4.c            |  14 -
 tests/data/test-read-dwarf/test4.so           | Bin 3364 -> 0 bytes
 tests/data/test-read-dwarf/test4.so.abi       |  12 +-
 tests/data/test-read-dwarf/test4.so.hash.abi  |  12 +-
 tests/test-annotate.cc                        |   4 +-
 tests/test-read-common.cc                     | 264 +++++++++++++
 tests/test-read-common.h                      | 179 +++++++++
 tests/test-read-ctf.cc                        | 353 +++++++++++++++++
 tests/test-read-dwarf.cc                      | 356 +++++++-----------
 121 files changed, 2441 insertions(+), 359 deletions(-)
 rename tests/data/{test-read-dwarf => test-read-common}/PR26261/Makefile (82%)
 create mode 100755 tests/data/test-read-common/PR26261/PR26261-exe
 rename tests/data/{test-read-dwarf => test-read-common}/PR26261/PR26261-main.c (100%)
 create mode 100644 tests/data/test-read-common/PR26261/PR26261-main.o
 rename tests/data/{test-read-dwarf => test-read-common}/PR26261/PR26261-obja.c (100%)
 rename tests/data/{test-read-dwarf => test-read-common}/PR26261/PR26261-obja.h (100%)
 create mode 100644 tests/data/test-read-common/PR26261/PR26261-obja.o
 rename tests/data/{test-read-dwarf => test-read-common}/PR26261/PR26261-objb.c (100%)
 rename tests/data/{test-read-dwarf => test-read-common}/PR26261/PR26261-objb.h (100%)
 create mode 100644 tests/data/test-read-common/PR26261/PR26261-objb.o
 rename tests/data/{test-read-dwarf => test-read-common}/PR27700/include-dir/priv.h (100%)
 rename tests/data/{test-read-dwarf => test-read-common}/PR27700/include-dir/pub.h (100%)
 rename tests/data/{test-read-dwarf => test-read-common}/PR27700/pub-incdir/inc.h (100%)
 rename tests/data/{test-read-dwarf => test-read-common}/PR27700/test-PR27700.c (55%)
 create mode 100644 tests/data/test-read-common/PR27700/test-PR27700.o
 create mode 100644 tests/data/test-read-common/crti.c
 rename tests/data/{test-read-dwarf => test-read-common}/test-PR26568-1.c (61%)
 create mode 100644 tests/data/test-read-common/test-PR26568-1.o
 rename tests/data/{test-read-dwarf => test-read-common}/test-PR26568-2.c (56%)
 create mode 100644 tests/data/test-read-common/test-PR26568-2.o
 rename tests/data/{test-read-dwarf => test-read-common}/test3-alias-1.suppr (100%)
 rename tests/data/{test-read-dwarf => test-read-common}/test3-alias-2.suppr (100%)
 rename tests/data/{test-read-dwarf => test-read-common}/test3-alias-3.suppr (100%)
 rename tests/data/{test-read-dwarf => test-read-common}/test3-alias-4.suppr (100%)
 create mode 100644 tests/data/test-read-common/test3.c
 create mode 100755 tests/data/test-read-common/test3.so
 create mode 100644 tests/data/test-read-common/test4.c
 create mode 100755 tests/data/test-read-common/test4.so
 create mode 100644 tests/data/test-read-ctf/PR26261/PR26261-exe.abi
 create mode 100644 tests/data/test-read-ctf/PR27700/test-PR27700.abi
 create mode 100644 tests/data/test-read-ctf/test-PR26568-1.o.abi
 create mode 100644 tests/data/test-read-ctf/test-PR26568-2.o.abi
 create mode 100644 tests/data/test-read-ctf/test-alias.c
 create mode 100644 tests/data/test-read-ctf/test-alias.o.abi
 create mode 100644 tests/data/test-read-ctf/test-ambiguous-struct-A.c
 create mode 100644 tests/data/test-read-ctf/test-ambiguous-struct-A.o
 create mode 100644 tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi
 create mode 100644 tests/data/test-read-ctf/test-ambiguous-struct-B.c
 create mode 100644 tests/data/test-read-ctf/test-ambiguous-struct-B.o
 create mode 100644 tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi
 create mode 100644 tests/data/test-read-ctf/test-conflicting-type-syms-a.c
 create mode 100644 tests/data/test-read-ctf/test-conflicting-type-syms-a.o
 create mode 100644 tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi
 create mode 100644 tests/data/test-read-ctf/test-conflicting-type-syms-b.c
 create mode 100644 tests/data/test-read-ctf/test-conflicting-type-syms-b.o
 create mode 100644 tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi
 create mode 100644 tests/data/test-read-ctf/test-dynamic-array.c
 create mode 100644 tests/data/test-read-ctf/test-dynamic-array.o
 create mode 100644 tests/data/test-read-ctf/test-dynamic-array.o.abi
 create mode 100644 tests/data/test-read-ctf/test-enum-many.c
 create mode 100644 tests/data/test-read-ctf/test-enum-many.o
 create mode 100644 tests/data/test-read-ctf/test-enum-many.o.hash.abi
 create mode 100644 tests/data/test-read-ctf/test-enum-symbol.c
 create mode 100644 tests/data/test-read-ctf/test-enum-symbol.o
 create mode 100644 tests/data/test-read-ctf/test-enum-symbol.o.hash.abi
 create mode 100644 tests/data/test-read-ctf/test-enum.c
 create mode 100644 tests/data/test-read-ctf/test-enum.o
 create mode 100644 tests/data/test-read-ctf/test-enum.o.abi
 create mode 100644 tests/data/test-read-ctf/test-struct-iteration.c
 create mode 100644 tests/data/test-read-ctf/test-struct-iteration.o.abi
 create mode 100755 tests/data/test-read-ctf/test0
 create mode 100644 tests/data/test-read-ctf/test0.abi
 create mode 100644 tests/data/test-read-ctf/test0.c
 create mode 100644 tests/data/test-read-ctf/test0.hash.abi
 create mode 100644 tests/data/test-read-ctf/test1.c
 create mode 100755 tests/data/test-read-ctf/test1.so
 create mode 100644 tests/data/test-read-ctf/test1.so.abi
 create mode 100644 tests/data/test-read-ctf/test1.so.hash.abi
 create mode 100644 tests/data/test-read-ctf/test2.c
 create mode 100755 tests/data/test-read-ctf/test2.so
 create mode 100644 tests/data/test-read-ctf/test2.so.abi
 create mode 100644 tests/data/test-read-ctf/test2.so.hash.abi
 create mode 100644 tests/data/test-read-ctf/test3.so.abi
 create mode 100644 tests/data/test-read-ctf/test3.so.hash.abi
 create mode 100644 tests/data/test-read-ctf/test4.so.abi
 create mode 100644 tests/data/test-read-ctf/test4.so.hash.abi
 create mode 100644 tests/data/test-read-ctf/test5.c
 create mode 100644 tests/data/test-read-ctf/test5.o
 create mode 100644 tests/data/test-read-ctf/test5.o.abi
 create mode 100644 tests/data/test-read-ctf/test6.c
 create mode 100644 tests/data/test-read-ctf/test6.o.abi
 create mode 100644 tests/data/test-read-ctf/test7.c
 create mode 100644 tests/data/test-read-ctf/test7.h
 create mode 100644 tests/data/test-read-ctf/test7.o
 create mode 100644 tests/data/test-read-ctf/test7.o.abi
 create mode 100644 tests/data/test-read-ctf/test8.c
 create mode 100644 tests/data/test-read-ctf/test8.o
 create mode 100644 tests/data/test-read-ctf/test8.o.abi
 create mode 100644 tests/data/test-read-ctf/test9.c
 create mode 100644 tests/data/test-read-ctf/test9.o
 create mode 100644 tests/data/test-read-ctf/test9.o.abi
 delete mode 100755 tests/data/test-read-dwarf/PR26261/PR26261-exe
 delete mode 100644 tests/data/test-read-dwarf/PR27700/test-PR27700.o
 delete mode 100644 tests/data/test-read-dwarf/test-PR26568-1.o
 delete mode 100644 tests/data/test-read-dwarf/test-PR26568-2.o
 delete mode 100644 tests/data/test-read-dwarf/test3.c
 delete mode 100755 tests/data/test-read-dwarf/test3.so
 delete mode 100644 tests/data/test-read-dwarf/test4.c
 delete mode 100755 tests/data/test-read-dwarf/test4.so
 create mode 100644 tests/test-read-common.cc
 create mode 100644 tests/test-read-common.h
 create mode 100644 tests/test-read-ctf.cc

Comments

Dodji Seketeli Dec. 14, 2021, 3:47 p.m. UTC | #1
Hello Guillermo,

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

[...]

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

Applied to master, thanks!

[...]

Cheers,
diff mbox series

Patch

diff --git a/doc/api/libabigail.doxy b/doc/api/libabigail.doxy
index e3136dd8..33f0eb49 100644
--- a/doc/api/libabigail.doxy
+++ b/doc/api/libabigail.doxy
@@ -683,7 +683,11 @@  WARN_LOGFILE           = LIBABIGAIL_OUTPUT/doc/api/doxygen-warnings.txt
 # directories like "/usr/src/myproject". Separate the files or directories
 # with spaces.
 
-INPUT                  =  LIBABIGAIL_INPUT/src LIBABIGAIL_INPUT/include/
+INPUT                  =  LIBABIGAIL_INPUT/src \
+                          LIBABIGAIL_INPUT/include \
+                          LIBABIGAIL_INPUT/tests/test-read-common.cc \
+                          LIBABIGAIL_INPUT/tests/test-read-common.h
+
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
diff --git a/tests/Makefile.am b/tests/Makefile.am
index e3855aea..17e2d4b4 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -25,6 +25,10 @@  runtestdifffilter		\
 runtestreaddwarf	        \
 runtestcanonicalizetypes.sh
 
+if CTF_READER
+TESTS += runtestreadctf
+endif
+
 # rather cheap tests
 TESTS+=				\
 runtestabicompat		\
@@ -72,7 +76,7 @@  runtestcanonicalizetypes.output.final.txt
 
 noinst_PROGRAMS= $(TESTS) testirwalker testdiff2 printdifftree
 noinst_SCRIPTS = mockfedabipkgdiff
-noinst_LTLIBRARIES = libtestutils.la libcatch.la
+noinst_LTLIBRARIES = libtestutils.la libtestreadcommon.la libcatch.la
 
 libtestutils_la_SOURCES=	\
 test-utils.h 			\
@@ -82,15 +86,31 @@  libtestutils_la_CXXFLAGS=		\
 -DABIGAIL_SRC_DIR=\"${abs_top_srcdir}\"  	\
 -DABIGAIL_BUILD_DIR=\"${abs_top_builddir}\"
 
+libtestreadcommon_la_SOURCES=	\
+test-read-common.h 		\
+test-read-common.cc
+
+libtestreadcommon_la_CXXFLAGS=			\
+-DABIGAIL_SRC_DIR=\"${abs_top_srcdir}\"  	\
+-DABIGAIL_BUILD_DIR=\"${abs_top_builddir}\"
+
 libcatch_la_SOURCES = lib/catch.cc lib/catch.hpp
 
 runtestreadwrite_SOURCES=test-read-write.cc
 runtestreadwrite_LDADD=libtestutils.la $(top_builddir)/src/libabigail.la
 
 runtestreaddwarf_SOURCES=test-read-dwarf.cc
-runtestreaddwarf_LDADD=libtestutils.la $(top_builddir)/src/libabigail.la
+runtestreaddwarf_LDADD=libtestreadcommon.la libtestutils.la	\
+		       $(top_builddir)/src/libabigail.la
 runtestreaddwarf_LDFLAGS=-pthread
 
+if CTF_READER
+runtestreadctf_SOURCES=test-read-ctf.cc
+runtestreadctf_LDADD=libtestreadcommon.la libtestutils.la	\
+		     $(top_builddir)/src/libabigail.la
+runtestreadctf_LDFLAGS=-pthread
+endif
+
 runtestannotate_SOURCES=test-annotate.cc
 runtestannotate_LDADD=libtestutils.la $(top_builddir)/src/libabigail.la
 
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 7edb1e24..686bbf13 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -457,6 +457,31 @@  test-diff-dwarf/PR25058-liblttng-ctl-report-1.txt \
 test-diff-dwarf/PR25058-liblttng-ctl.so \
 test-diff-dwarf/PR25058-liblttng-ctl2.10.so \
 \
+test-read-common/test3.c		\
+test-read-common/test3.so		\
+test-read-common/test3-alias-1.suppr	\
+test-read-common/test3-alias-2.suppr	\
+test-read-common/test3-alias-3.suppr	\
+test-read-common/test3-alias-4.suppr	\
+test-read-common/test4.c		\
+test-read-common/test4.so		\
+test-read-common/PR26261/Makefile	\
+test-read-common/PR26261/PR26261-obja.c	\
+test-read-common/PR26261/PR26261-objb.c	\
+test-read-common/PR26261/PR26261-exe	\
+test-read-common/PR26261/PR26261-main.c	\
+test-read-common/PR26261/PR26261-obja.h	\
+test-read-common/PR26261/PR26261-objb.h	\
+test-read-common/test-PR26568-1.c	\
+test-read-common/test-PR26568-2.c	\
+test-read-common/test-PR26568-2.o	\
+test-read-common/test-PR26568-1.o	\
+test-read-common/PR27700/include-dir/priv.h	\
+test-read-common/PR27700/include-dir/pub.h	\
+test-read-common/PR27700/pub-incdir/inc.h	\
+test-read-common/PR27700/test-PR27700.c	\
+test-read-common/PR27700/test-PR27700.o	\
+\
 test-read-dwarf/test0			\
 test-read-dwarf/test0.abi			\
 test-read-dwarf/test0.hash.abi		\
@@ -471,20 +496,12 @@  test-read-dwarf/test2-1.cc		\
 test-read-dwarf/test2.so		\
 test-read-dwarf/test2.so.abi		\
 test-read-dwarf/test2.so.hash.abi	\
-test-read-dwarf/test3.c		\
-test-read-dwarf/test3.so		\
 test-read-dwarf/test3.so.abi		\
 test-read-dwarf/test3.so.hash.abi	\
 test-read-dwarf/test3-alias-1.so.hash.abi \
-test-read-dwarf/test3-alias-1.suppr \
 test-read-dwarf/test3-alias-2.so.hash.abi \
-test-read-dwarf/test3-alias-2.suppr \
 test-read-dwarf/test3-alias-3.so.hash.abi \
-test-read-dwarf/test3-alias-3.suppr \
 test-read-dwarf/test3-alias-4.so.hash.abi \
-test-read-dwarf/test3-alias-4.suppr \
-test-read-dwarf/test4.c		\
-test-read-dwarf/test4.so		\
 test-read-dwarf/test4.so.abi		\
 test-read-dwarf/test4.so.hash.abi	\
 test-read-dwarf/test5.cc		\
@@ -552,18 +569,7 @@  test-read-dwarf/PR25042-libgdbm-clang-dwarf5.so.6.0.0.abi \
 test-read-dwarf/test25-bogus-binary.elf \
 test-read-dwarf/test26-bogus-binary.elf \
 test-read-dwarf/test27-bogus-binary.elf \
-test-read-dwarf/PR26261/Makefile \
 test-read-dwarf/PR26261/PR26261-exe.abi \
-test-read-dwarf/PR26261/PR26261-obja.c \
-test-read-dwarf/PR26261/PR26261-objb.c \
-test-read-dwarf/PR26261/PR26261-exe \
-test-read-dwarf/PR26261/PR26261-main.c \
-test-read-dwarf/PR26261/PR26261-obja.h \
-test-read-dwarf/PR26261/PR26261-objb.h \
-test-read-dwarf/test-PR26568-1.c     \
-test-read-dwarf/test-PR26568-2.c     \
-test-read-dwarf/test-PR26568-2.o     \
-test-read-dwarf/test-PR26568-1.o     \
 test-read-dwarf/test-PR26568-1.o.abi \
 test-read-dwarf/test-PR26568-2.o.abi \
 test-read-dwarf/test-libandroid.so \
@@ -572,18 +578,77 @@  test-read-dwarf/test-suppressed-alias.c \
 test-read-dwarf/test-suppressed-alias.o \
 test-read-dwarf/test-suppressed-alias.o.abi \
 test-read-dwarf/test-suppressed-alias.suppr \
-test-read-dwarf/PR27700/include-dir/priv.h  \
-test-read-dwarf/PR27700/include-dir/pub.h  \
-test-read-dwarf/PR27700/pub-incdir/inc.h  \
 test-read-dwarf/PR27700/test-PR27700.abi  \
-test-read-dwarf/PR27700/test-PR27700.c  \
-test-read-dwarf/PR27700/test-PR27700.o  \
 test-read-dwarf/test-libaaudio.so       \
 test-read-dwarf/test-libaaudio.so.abi   \
 test-read-dwarf/PR28584/PR28584-smv.cc  \
 test-read-dwarf/PR28584/PR28584-smv.clang.o \
 test-read-dwarf/PR28584/PR28584-smv.clang.o.abi \
 \
+test-read-ctf/test0		\
+test-read-ctf/test0.abi		\
+test-read-ctf/test0.c		\
+test-read-ctf/test0.hash.abi	\
+test-read-ctf/test1.c		\
+test-read-ctf/test1.so		\
+test-read-ctf/test1.so.abi	\
+test-read-ctf/test1.so.hash.abi	\
+test-read-ctf/test2.c		\
+test-read-ctf/test2.so		\
+test-read-ctf/test2.so.abi	\
+test-read-ctf/test2.so.hash.abi	\
+test-read-ctf/test3.so.abi	\
+test-read-ctf/test3.so.hash.abi	\
+test-read-ctf/test4.so.abi	\
+test-read-ctf/test4.so.hash.abi	\
+test-read-ctf/test5.c		\
+test-read-ctf/test5.o		\
+test-read-ctf/test5.o.abi	\
+test-read-ctf/test6.c		\
+test-read-ctf/test6.o.abi	\
+test-read-ctf/test7.c		\
+test-read-ctf/test7.h		\
+test-read-ctf/test7.o		\
+test-read-ctf/test7.o.abi	\
+test-read-ctf/test8.c		\
+test-read-ctf/test8.o		\
+test-read-ctf/test8.o.abi	\
+test-read-ctf/test9.c		\
+test-read-ctf/test9.o		\
+test-read-ctf/test9.o.abi	\
+test-read-ctf/test-alias.c	\
+test-read-ctf/test-alias.o.abi	\
+test-read-ctf/test-ambiguous-struct-A.c	\
+test-read-ctf/test-ambiguous-struct-A.o	\
+test-read-ctf/test-ambiguous-struct-A.o.hash.abi	 \
+test-read-ctf/test-ambiguous-struct-B.c		\
+test-read-ctf/test-ambiguous-struct-B.o		\
+test-read-ctf/test-ambiguous-struct-B.o.hash.abi	\
+test-read-ctf/test-conflicting-type-syms-a.c		\
+test-read-ctf/test-conflicting-type-syms-a.o		\
+test-read-ctf/test-conflicting-type-syms-a.o.hash.abi	\
+test-read-ctf/test-conflicting-type-syms-b.c		\
+test-read-ctf/test-conflicting-type-syms-b.o		\
+test-read-ctf/test-conflicting-type-syms-b.o.hash.abi	\
+test-read-ctf/test-dynamic-array.c	\
+test-read-ctf/test-dynamic-array.o	\
+test-read-ctf/test-dynamic-array.o.abi	\
+test-read-ctf/test-enum.c		\
+test-read-ctf/test-enum-many.c		\
+test-read-ctf/test-enum-many.o		\
+test-read-ctf/test-enum-many.o.hash.abi		\
+test-read-ctf/test-enum.o		\
+test-read-ctf/test-enum.o.abi		\
+test-read-ctf/test-enum-symbol.c		\
+test-read-ctf/test-enum-symbol.o		\
+test-read-ctf/test-enum-symbol.o.hash.abi	\
+test-read-ctf/test-PR26568-1.o.abi		\
+test-read-ctf/test-PR26568-2.o.abi		\
+test-read-ctf/test-struct-iteration.c		\
+test-read-ctf/test-struct-iteration.o.abi	\
+test-read-ctf/PR27700/test-PR27700.abi	\
+test-read-ctf/PR26261/PR26261-exe.abi	\
+\
 test-annotate/test0.abi			\
 test-annotate/test1.abi			\
 test-annotate/test2.so.abi		\
diff --git a/tests/data/test-annotate/test3.so.abi b/tests/data/test-annotate/test3.so.abi
index c4911724..320d886a 100644
--- a/tests/data/test-annotate/test3.so.abi
+++ b/tests/data/test-annotate/test3.so.abi
@@ -16,9 +16,9 @@ 
     <!-- foo__ -->
     <elf-symbol name='foo__' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
-  <abi-instr address-size='64' path='test3.c' comp-dir-path='/home/skumari/Tasks/source_repo/dodji/libabigail/tests/data/test-read-dwarf' language='LANG_C89'>
+  <abi-instr address-size='64' path='test3.c' comp-dir-path='/home/byby/oracle/src/libabigail/tests/data/test-read-common' language='LANG_C89'>
     <!-- void __foo() -->
-    <function-decl name='__foo' mangled-name='__foo' filepath='/home/skumari/Tasks/source_repo/dodji/libabigail/tests/data/test-read-dwarf/test3.c' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__foo'>
+    <function-decl name='__foo' mangled-name='__foo' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test3.c' line='23' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__foo'>
       <!-- void -->
       <return type-id='type-id-1'/>
     </function-decl>
diff --git a/tests/data/test-annotate/test4.so.abi b/tests/data/test-annotate/test4.so.abi
index c3550e35..7913e324 100644
--- a/tests/data/test-annotate/test4.so.abi
+++ b/tests/data/test-annotate/test4.so.abi
@@ -6,7 +6,7 @@ 
     <!-- cpy -->
     <elf-symbol name='cpy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
-  <abi-instr address-size='64' path='test4.c' comp-dir-path='/home/mark/src/tests' language='LANG_C89'>
+  <abi-instr address-size='64' path='test4.c' comp-dir-path='/home/byby/oracle/src/libabigail/tests/data/test-read-common' language='LANG_C99'>
     <!-- char -->
     <type-decl name='char' size-in-bits='8' id='type-id-1'/>
     <!-- unsigned int -->
@@ -22,13 +22,13 @@ 
     <!-- const char* restrict -->
     <qualified-type-def type-id='type-id-6' restrict='yes' id='type-id-7'/>
     <!-- char* cpy(char* restrict, const char* restrict, unsigned int) -->
-    <function-decl name='cpy' mangled-name='cpy' filepath='/home/mark/src/tests/test4.c' line='2' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpy'>
+    <function-decl name='cpy' mangled-name='cpy' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test4.c' line='4' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpy'>
       <!-- parameter of type 'char* restrict' -->
-      <parameter type-id='type-id-4' name='s1' filepath='/home/mark/src/tests/test4.c' line='2' column='1'/>
+      <parameter type-id='type-id-4' name='s1' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test4.c' line='4' column='1'/>
       <!-- parameter of type 'const char* restrict' -->
-      <parameter type-id='type-id-7' name='s2' filepath='/home/mark/src/tests/test4.c' line='2' column='1'/>
+      <parameter type-id='type-id-7' name='s2' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test4.c' line='4' column='1'/>
       <!-- parameter of type 'unsigned int' -->
-      <parameter type-id='type-id-2' name='n' filepath='/home/mark/src/tests/test4.c' line='2' column='1'/>
+      <parameter type-id='type-id-2' name='n' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test4.c' line='4' column='1'/>
       <!-- char* -->
       <return type-id='type-id-3'/>
     </function-decl>
diff --git a/tests/data/test-read-dwarf/PR26261/Makefile b/tests/data/test-read-common/PR26261/Makefile
similarity index 82%
rename from tests/data/test-read-dwarf/PR26261/Makefile
rename to tests/data/test-read-common/PR26261/Makefile
index f66fa38a..dc9c27a3 100644
--- a/tests/data/test-read-dwarf/PR26261/Makefile
+++ b/tests/data/test-read-common/PR26261/Makefile
@@ -1,7 +1,7 @@ 
 SRCS	= PR26261-obja.c PR26261-objb.c PR26261-main.c
 EXE	= PR26261-exe
 OBJS	= $(SRCS:.c=.o)
-CFLAGS	= -Wall -g
+CFLAGS	= -Wall -g -gctf
 
 all: $(EXE)
 
@@ -9,7 +9,7 @@  all: $(EXE)
 	$(CC) $(CFLAGS) -c $<
 
 $(EXE): $(OBJS)
-	gcc -fPIC $(OBJS) -o $@
+	$(CC) -fPIC $(OBJS) -o $@
 
 cleanobjs:
 	rm -rf $(OBJS)
diff --git a/tests/data/test-read-common/PR26261/PR26261-exe b/tests/data/test-read-common/PR26261/PR26261-exe
new file mode 100755
index 0000000000000000000000000000000000000000..cf253f60263bda0d0fe62c9628ad1ca3fe081abf
GIT binary patch
literal 19032
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
Q`$tSygC6WR7Y`}^2NhnMHvj+t

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-dwarf/PR26261/PR26261-main.c b/tests/data/test-read-common/PR26261/PR26261-main.c
similarity index 100%
rename from tests/data/test-read-dwarf/PR26261/PR26261-main.c
rename to tests/data/test-read-common/PR26261/PR26261-main.c
diff --git a/tests/data/test-read-common/PR26261/PR26261-main.o b/tests/data/test-read-common/PR26261/PR26261-main.o
new file mode 100644
index 0000000000000000000000000000000000000000..c4200379d19c9dfee2546a52e9993b8739b43b51
GIT binary patch
literal 4800
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
VITtb#Bv1ZvH2)5lrBe|5{~w{-$}a!_

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-dwarf/PR26261/PR26261-obja.c b/tests/data/test-read-common/PR26261/PR26261-obja.c
similarity index 100%
rename from tests/data/test-read-dwarf/PR26261/PR26261-obja.c
rename to tests/data/test-read-common/PR26261/PR26261-obja.c
diff --git a/tests/data/test-read-dwarf/PR26261/PR26261-obja.h b/tests/data/test-read-common/PR26261/PR26261-obja.h
similarity index 100%
rename from tests/data/test-read-dwarf/PR26261/PR26261-obja.h
rename to tests/data/test-read-common/PR26261/PR26261-obja.h
diff --git a/tests/data/test-read-common/PR26261/PR26261-obja.o b/tests/data/test-read-common/PR26261/PR26261-obja.o
new file mode 100644
index 0000000000000000000000000000000000000000..8f8b8f77cc3fa6c6af890a62f4ab4a424027c7f5
GIT binary patch
literal 3592
zcmbtXeQZ-z6u+<A%3xb92t&rm3P||uCuA@QTBwd0V2+PrOh&rb?yW1ducdt*9by;^
zKLEi+l(>MA2q6+thcFrPRYEW#F``JAN+L0W8jVpy0)#*GocGS{9&a@ydb0b@Ilp^;
z=bm@JUbp^<h1DiOU|a<DDC_q)%GgVV{kB&%y{wdtVD&Yduh(pT?sn&jvwwY`Z{k5(
z2=^Gv2NN4+!PX7!O|oZ#rXkH>qNpw;D@7xZ8g-g6k1b1K794a4G>|FSSEibpJr!)=
zmpug9q2X#iH`rci1<+<dYlnvUsTOtI!Qkt}G6<d4Sh$IWWra1%{<xCxD{XPfFZvC>
z2Y{t>S=7y<9u}R>np3hr7Fa1VXG<(9IRkBhHfJm$1|yO)nFu-~;eZ$jhs1Eio{A@x
zgd|3tij-86&L&Y2Rnrb&lRX%VMq{$GZi%PTQ|ac~j;S3%wN{!)c8V(JetP$J=Q5eh
zXPHmWu>BjnJB5<?_(NUZ{JjO8jUN>Zi=6UqEU0yLAMS3x@w#`JyJOkv{Mnuw*P+DC
z_9NHJJl%&oF1v4(x#NYuZW!*mQ8qokWfSW%74L4WDy>#_jr!>~_G-g9Z`ES!)^Na_
zmn^R_vwdfa6~3^nYd}2{wx6+V^jdwhXTN{2a$K+QP1?4rrMGSQ!mp>E{_)C%%z;Jz
zZ<kpvx|(nOuw&^uYutXMVMoKFp%=%$(Q$0si<>{VzPx(n`d?O6jkr9juhR2y*E6dN
z?(8?)9{<w2{YW%;{P?=BPMpm5efay)yY`-wM@KjKdo7uY);&e<-7`<F0d-vx8ygz~
zOt6@nGM~4PVXTO;c?%${0Cuhuv>*s~EhVUMa-o4yq0X~Os4zW%+f^?G0vnt?7o{Dh
zJcz&V=9ynxZ}Yil+T0$8%i*$lTpqU@nr)Jlj!TJfRFV}jGTCO2Dk)i-6Ov>AgW!sZ
zV9T8JtV(<344XX!e?g^L+p{Tol^k0m_ish5M!rA#sATS^clW&PwzS)<`FE`HzH4JX
zskkaEE>4@fuiYvOMngT*mrh%LUbuS9H{{sxx~;w~3(H4tdGf9K(Ft|cMLqTDl{fdC
z+Iyuov2)C&$iYK<*FIeon=$M8$G$kN)Q_xMUsKNJ`+SesCc$e?zRx>SU3BQx0}Cu>
zVnPNnE&}<y{^8UitX;x{v{e{gJgBe}I?Dmah5`%A*j$VC1(UDDTnz!}|BGPWeD>$x
zxw>IRbHQ-Y;Po<4@|b#+4Cu(?*O;Lvj};pb&CO#a18^%K!*uni?}$-!XYjisdm~W>
z{_c2@>gSb@fH+=|V<~<ZX~gkuYRNA(;N<d4S*<L48lZEEE?z%dc+gPzxSGdUJsBLw
z_eI&JscihS<iAE5S4clD|I%O{{fXuIjPc_r560vBt{{J!0e_c#{J@~__>VQ0Rg&iT
zdGfuajpNz~$J+JvGe@#5s)zy5N<z~u+)|{p!W{VNV2(gC$sBkII1*AsbTmnURLCEe
zn`025+F~G(kXrBQ789Zzl7Oe9M8dMfDKHK<5%#M-ewyG`Vh%Z`NDern_M{>PSCJo*
zQ;v8d26vazMtP+ce{({NO7w#NQ;h~b&K+M@p3X}~_8gFpv3eN`4r2Pffc*>bkwc99
zi4cQl=)dxD9~pDvuzdUthE9X4?kg4J2N}sA7b)-+&CNayVGQ>xo_lXLLNf|!LjNHA
zLC|<kIUj#mq0EDpYy3vqv^&(O{s-rC1kZIY{%zv(`+&zA`E}5dtNz<mzl(@iKXN&r
z*B=IqrivmpHIWwdse90Yu}#pQYy3%c)u)M%<Kx*kj-LVy$LDo|sY)x2zlj5+d97Tx
z1FrIUVjho0fvnL~_Q}IIzY}^?el|ig))0TH0p~of@%J6K^`UPQUyq?}j6DDtP8BUT
zhN$um@s0Ds>*sN2z`&eFejo8?@j%i>{t3V_)Jy$b?V<JK`vli-C^XLJc&@QAhm}5R
qedvJT?-Jx1`S{O<@$LYK{Y?B(=;*{ae^^s4elOL3LB~bY$o~g0^_1oS

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-dwarf/PR26261/PR26261-objb.c b/tests/data/test-read-common/PR26261/PR26261-objb.c
similarity index 100%
rename from tests/data/test-read-dwarf/PR26261/PR26261-objb.c
rename to tests/data/test-read-common/PR26261/PR26261-objb.c
diff --git a/tests/data/test-read-dwarf/PR26261/PR26261-objb.h b/tests/data/test-read-common/PR26261/PR26261-objb.h
similarity index 100%
rename from tests/data/test-read-dwarf/PR26261/PR26261-objb.h
rename to tests/data/test-read-common/PR26261/PR26261-objb.h
diff --git a/tests/data/test-read-common/PR26261/PR26261-objb.o b/tests/data/test-read-common/PR26261/PR26261-objb.o
new file mode 100644
index 0000000000000000000000000000000000000000..65a5168053eb1909dd5f39cd084ea4579d4153cd
GIT binary patch
literal 3560
zcmbtWeQZ-z6u+<C%Eq>C@-gOMu7G?D=+}@jQM9fyP(GaC*rGuD+P-#$_H}uE9UTc_
zjE{_unZ*z@lNkw2jS30F5QP}2Q3)u7M2swfz(V{W@ehHR2x!!EUeDd?TZxID?Dm}V
zyXSY#dH3CW-?lATQEw0g#zkOHu@R4>jJ4#A*e=a<u~IgXH7?up!?HbF@Aj<!{Lb|p
z0}pa?gLDpP9GC^iF&M9sJsUKYG=YhtxkkoH(EzOt<fBlK34II1jzth)jD_47j$+1U
ziZzqX$pu{r1F-TE(9_bm7CZxN7Yxixy=Zmw!Osx$7<AfV;Q$NED)YC93Jc1fR#ow+
z?X8l>=TX_3Iu>=ZXf+EaWKYbu(Z}p9v8ZJCwfoxbF-7!8Bzs)(+aqD0=nIF$aKxHu
zjjM_zM(wH;SL618sEV3t1u$Us$D+}gY;RayT~l4-<l2g<ZGP-WTPe^Vp##GGWZ#wZ
zsZ{E#)LEgwtl715p0RwW-uGc=-pqPoZi!U<=wMw(&h*YMQ<XO)UN}Ej9P$Q?w`+I2
zS(ek=`}oV-BR{Tlo7T4VJa4(wwS8rC@!1>RAw$07xZ}_(=W0XKyP66QjL#kDof&jE
zW^50z1>+0wb&k|Oq<JHLvTs56fVtCEl6(EymgDztRBd?4R=V?9cj#zuhxPRLmw(Q0
zTeBkgg@1p?mCkPIo1$+|omqTusO*=V(zn;S`@j3?)Pb!7PY8eJ6;;d{)BH&P$~(Jm
z7>>VN?wxP)PF&L6_s5Z=vFiS92UniF|NgbphOO5wN=?FD_Rg1u=5!-`T^ytOx+HqN
zULO<8ra<aKM+IXAjMXiNuw2+pcF=+#{BABng-Kw5QK{uK2$hCnzTYS@%N1BYY_qhK
z?l2f3UcXNg@+LX9SsvLYOII~o+|Gp-XSK~?b6Bb!)lMf2%WNsxDk<TpB&%Yi%3_VG
z30Ybkl4Jn=;EIaBWpT2$##-~3#TtS?zZy*MQEh*Ytp6Z2#MdF&cVfTO++iunxmP0h
z4^^D0yehm{m^2+5`mNj_4V{?3X5QL!!qt=Ru_q@q>~rs3F=f);=iXWxozYNVaH27}
z@z;Z&9=^OvdA;IN<jBC`ElmZnCu?^-eetx~IBC(sWfr#7?OtS=4UbjzFV94M(P4%~
zXAD?yP=ypf@E9VH&-<T1JYmafCL~LQ$%SL`dSG%2;5bm=MKbn`xn#G&U1X|<0Q4Uq
zm^X*r{wv!wyuoZRTprl%XfZPFsu(q4WOP;OW{j**hooI2D;kC4<uxv&AMF`2imnKL
zH4I-slz~4xc96NQyaM8Q0Zyg(aikH)r&&dQsSYQXm6L%hHN5-5o<lh1$y_ZwSSY-1
z+GA`3861z3zgvfwk>5>PUza`-TK>!vitC4>kDr!?wRn8q_2kdf;UAFCKXBM5#-Ad*
zhBU{|k?$g{uWKP3*DQ10m@VEORYf0YRY~g>ZmCjIWj6d$Fq<zPXEr?aHbshvwt(bI
zggjw67=r-K7JWWNYWv5usEBe%0$v6s5|$-SfjZno*rWOQC4yUs+2oii+2Dv;<ErT2
zM1Dw4*jkks+*N8j<&|1IK}C#8^nm|UO$I)$9e=Mpor{d&b3i`EX3A7>5X;;PIKLc!
zvWT8P3u5pL{Z~HjBYjRR%j+w;NuA4ZUuhUW$VdiBQQ*F`JN&B)W4K@O+`EP&(#B0X
zl(z^U4;mrP=jW^rux#}kXw$w%e6Bd3`;8Ca-y}Z24|u$u-vATY`X8hX;UFURk6g~@
z{f7b5uPIU{(F=V6oea^(24F5*{X9JUAj!01SRc>6zJ3BQ%*p!%Q<EUo=X{Ry`doLw
zgvRHIDR7ARn>mp*599nE&ez2?;X{GUO{?Kw&g1$GnBn$t5Ez}r&&1Hy$G!&`E)~6Q
z4AG>E`1*C>{qwlbz`&e({>Q|x<$<L2{7(SKP#4W})j{u%?-P7~55eGkj%TZlIc`z?
rL3BXy{}SZt`T2n9?+$?2Svr3Yqmv=}^~0XB@q4NNuQRx4>iK^InN@{8

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-dwarf/PR27700/include-dir/priv.h b/tests/data/test-read-common/PR27700/include-dir/priv.h
similarity index 100%
rename from tests/data/test-read-dwarf/PR27700/include-dir/priv.h
rename to tests/data/test-read-common/PR27700/include-dir/priv.h
diff --git a/tests/data/test-read-dwarf/PR27700/include-dir/pub.h b/tests/data/test-read-common/PR27700/include-dir/pub.h
similarity index 100%
rename from tests/data/test-read-dwarf/PR27700/include-dir/pub.h
rename to tests/data/test-read-common/PR27700/include-dir/pub.h
diff --git a/tests/data/test-read-dwarf/PR27700/pub-incdir/inc.h b/tests/data/test-read-common/PR27700/pub-incdir/inc.h
similarity index 100%
rename from tests/data/test-read-dwarf/PR27700/pub-incdir/inc.h
rename to tests/data/test-read-common/PR27700/pub-incdir/inc.h
diff --git a/tests/data/test-read-dwarf/PR27700/test-PR27700.c b/tests/data/test-read-common/PR27700/test-PR27700.c
similarity index 55%
rename from tests/data/test-read-dwarf/PR27700/test-PR27700.c
rename to tests/data/test-read-common/PR27700/test-PR27700.c
index b44a3226..a16a0bb7 100644
--- a/tests/data/test-read-dwarf/PR27700/test-PR27700.c
+++ b/tests/data/test-read-common/PR27700/test-PR27700.c
@@ -1,5 +1,7 @@ 
 #include "include-dir/priv.h"
 
+/* gcc -I. -gctf -gdwarf -c -o test-PR27700.o test-PR27700.c */
+
 void
 foo(enum foo* c __attribute__((unused)))
 {
diff --git a/tests/data/test-read-common/PR27700/test-PR27700.o b/tests/data/test-read-common/PR27700/test-PR27700.o
new file mode 100644
index 0000000000000000000000000000000000000000..99dea2d13509c26e5d856bcb0d4eb803923f3c8a
GIT binary patch
literal 3552
zcmbtWeQZ-z6u)mR>!e%R7!KxUc-sVu($}sdYy%k^i~9(JkP!kTlJ&KHYa7<rrhS8s
zL?oCXm_?W17swyRKm7g!7r>984p<Nr6BYh|sL`k-A}j_>6cP-c^WHsexs;gbN$)%N
z{LcB^d+xpOp4TTI>+33#Bt{~!HkPvpWh_vV>$jWTc2>piXX|_RUh3KV#Er4dC$Ilt
zFQTAk>TqobjSWY^W<Yx$8e&b*a7yUcqdg58N+~qNE1}`Q4?wd)tAhqojIlB_1sX`P
zrI^IWtHM|si~C$S9ve&~unlNFOEp@`Z>c6WtfylUT?@-G-C$c2u`oKAH=2lR-rz`Z
z#G6Q|p&`wiPKCTfv7j1^Mby}kXE>QQQkoj~8d};&d&8=snq3coVNWO#k0*5R+J1j?
zv(INaxS@osg<@{|@Bv~b3OaM}N+b{nXn|i?e`%k*@<pjE+3?=}bJzc<zObpj<C*G<
z?Xwy-*7o^#_0IR5IXiLUge!Pxm*E?4eC?G}EpIq_#^>2C-RM~K`rhi&tF_zZh3v=?
z$5F}6Y_3`->}!QI&sFKP&8?YRA<cA@&xS3wOSY0Wr_<S6xzxGL+3J+w0PGJjr?bsz
zbHSD>(u!(ZiRD{RjkNYT+p96Ecp4)|Z)MRO#vC(%)(f8OdVIJzklgytsj$8vlU&8&
zi7$6P$QY!xGV9-9g=g)|LFXXu$BzM@<D1dZ(NAw?I%YNOaa4^(2HT7JMz8nX3RHBp
z9H0FB^u!tay1K8=PL`f`u$NX9oxbB(&GYxeQE$-`+jQ&Xv#&$<n)PyLW3$}oSA2?3
z_WS&ejnHJbmPu-<SX|Q$b!egNi5tVZwmhQg0EWO+Q=#bcOv@6_lEtzo0>6+kNH3N7
z9_7|e3(D=o3(s~;Kj|yA|6Ld9^xo{cJR`hmanUl@c>n3&YocpDJpA$0p_Ajv_sjgP
z$Df<C+TE=mIXdmH&*BG8U0Zk1mz?<SZFwrz-SkuauczDx+?V$qo{UfJxO#p?-|Zbg
z&vty2yf{AjZk6)B_k#nU>~1|Kl?`nOvF^^!rLr4VyYOF@YF$(r&H^tK5a2>e6L<kh
zByQ7sW^sqKy`M>$a;c`&Q8EV3TEMZPz(F(C;VR!<)LB;C1p#Q^LvUO>yLP*f+eVuy
zIBnwf=YAV=2$7a)W7F?}V=1~@Y^>}qupE$?dHI-Y#3(EZp4^4Uih@FG#+mc?lSW1y
zE8D}+P-a@n%rt)$RRZ3`Z7iB7xPRH|41F38$Ima49blu-ymVIG7M#T!xV>7yDerXx
zzKz?D3ph7fly}5Dsj6c>SkOsupHam4dJE3(&t`7V7x1UKoxcybpYL#du@L_)w_64L
zH*U8H_)Tv2a4qI3a~#hk|6G`o9*G-j5VVo9bd-9AmNA%u-xa0=(`lw)c~Mf@kg9~W
z;BaIhrVl0{!0fBRU`pG1hg(gldPD<W9%U$|Yea#0sEhD`Y2$Yb>K#+`grO;L^*w1r
z4Q=6eL?2d?sRUF-V}y^ZMF$2`YFy(B{GX}@__%lU9?)>@ypz3O+{V~^sRIMC{C5Za
ztME}kME(MZ!8`h2`HO%nj)~LK{ErGw!DLH_PlW=>AbWVAZkgGq5XKt8gLS1n8)0>J
z@=GuCaqt_B5b@#TZOTe`iaDX<PY$NcsN6%0T@Nl3qk(y7l)v=e9M$XzVQej+h4O!u
zzYz3)0`o^M@hSfpV1?#?na@vk3c^ewKG|XD6q^4lKL49M5a-7lMSPln7%-fl@`SD_
zSNQx-5x_O=AL*Tdn|vCW$0hj-Im&HP6h{0p;!^<Ew>bY10Vf{m{hTj^u?4s(1%!Cy
zdJ8&OSNU=YW^T?G_l5GOz~j)tF-87H&TpYWu0{SazzdyU29pAzbHekhfJS`63(bwZ
uF+TqVG(hnG4su2QeSnFz10WXV_mBQ3A%-IEALdkuKgRR_!er$hBL5%iFLg!$

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-common/crti.c b/tests/data/test-read-common/crti.c
new file mode 100644
index 00000000..47dc4e47
--- /dev/null
+++ b/tests/data/test-read-common/crti.c
@@ -0,0 +1,22 @@ 
+/*
+ * gcc -c -std=c89 -mtune=generic -march=x86-64 crti.c
+ *
+ * NOTE: linking with _old_ crti.o exposes _init and _fini as
+ *       global symbols, the newer versions don't.
+ *
+ * 0000000000000000 g     F .init  0000000000000000 .hidden _init
+ * 0000000000000000 g     F .fini  0000000000000000 .hidden _fini
+ *
+ * So this is a dummy c-runtime object.
+ *
+ */
+
+void __attribute__((visibility("default")))
+_init(void)
+{
+}
+
+void __attribute__((visibility("default")))
+_fini(void)
+{
+}
diff --git a/tests/data/test-read-dwarf/test-PR26568-1.c b/tests/data/test-read-common/test-PR26568-1.c
similarity index 61%
rename from tests/data/test-read-dwarf/test-PR26568-1.c
rename to tests/data/test-read-common/test-PR26568-1.c
index 6eec3558..a551ac7c 100644
--- a/tests/data/test-read-dwarf/test-PR26568-1.c
+++ b/tests/data/test-read-common/test-PR26568-1.c
@@ -1,3 +1,6 @@ 
+/* gcc -std=c89 -gctf -g -mtune=generic -march=x86-64 -c \
+ *     -o test-PR26568-1.o test-PR26568-1.c */
+
 struct A {
   union {
     struct {
diff --git a/tests/data/test-read-common/test-PR26568-1.o b/tests/data/test-read-common/test-PR26568-1.o
new file mode 100644
index 0000000000000000000000000000000000000000..f50f6c95609367cffa94b660da6ef5ae572141c6
GIT binary patch
literal 3536
zcmbtXdu&r>6#wqJb_2Uod5pp4sED!weQbkKMMlRQ%<!7iA)q*JySuhodpp{@+0GC)
zri2B=Mub3kN`OFoHDV$V2?Zw%<zYk(gcuedgoGH;_y<N4J?Hj2TXz{T(GzaZIlu4x
z&N=tH-#vG%tzI}ULl78=z$(~)M<`>p*#ovqHC-&1jbZgQ-9OcIuen>ZvHI>g6-TS)
zM0S=zpQ+0bYP!wwm7o50BQt~e50SxjCTP5{0A4+CDcl|h8U;EUk1=}HV+@n=E)9rV
zxQlU^!weS+u4SnfGa&BbalkJ`pM>X9T^;<6go|=f4Avf<ats_3us?{)#Tvsn$dySA
z^2-W~vOq}oTF{KKO4b(gH?pQync01zpk#N)+%bD7EP4WxJrefV1Ae#Y_IpKtz}ngp
zQNofKv@23XiP#%OMN~~IfQ?p9C>RXMDWJBlw0uUn(^_Kl@bYv=A8Y*RuIm?)$>itB
zUg1FAGS{oqbmMEQ++`mouIY*o4L7vO=C01Iugxg?AoK9vvVuu3olkzIb2}2N6YGlF
zO!JoBoM`D<KH{lkojuNian8Ku&J`UCFF6xOUi2S~88`hExK&<y=^C4Kd{k$6za{rd
zkI_(Qimx`ZJxh#d)lR6dqxbZ+=+a5k8HX{mFH+^}^SvGQJ+gkv$PKR_@5p>N_UN8H
z+b48iJaM$*h39$~ygBvq`HdO%y0I0)(Z$0$n&S(~ZvXh@l<$t^&${;Q&cZvd#Alvh
z7fyK|`1<6I>8E@4eSc<c!V#L7c=G)0ZOy;j%v-d^c-c4W_q$`3zauPrZ(}Ibr{A<a
z=h;F1IqvE2inwakDmN2MhQ@toJKz-OY+x&qq=#c`11$)`pQapCc$08}F`@t1XMjCI
z_0%m8^m%Mp|Dw($=(D@_>V@o489Lz2UtDjgDw%01DYZFl4oj({w4?+sOOX_9k;49<
zBr9T|*kTPTt+F)RE6D(Qz!k$D-|VQf+*&@}V)ep5kJ6MnaQ#QHRc@9;FU$P)uuWA?
zaZP@7*VfII!#gbI>XY#t{nO_*$d1i*>zbTb&Rn1T(ObDcSG;lghi<RfQk4DGAzR_@
zL%ZrK8WQrB9T)eX>l|J1cr5YF(q4UWd*57hS9N}y@tGTA7nB{Cu;dR@?Mhcx;nu#&
z+iZSS)f1K?xYgo+xle43zvb!#018Y1A&D4?z<uhUzo|@UuVX^gEaV%rvg5E=00g{H
z9>bqXlX-ncRgOV~0QB!8m^YLC`u9-F@Wh6KnXZ3c4PMsKOd1SB{BRADa&^pjA3WzC
z94FVvw0_ik#3-C0*7P}nBPca-aTzP8?<ZwOT%BYX1cLcd5a*Ls^>fwV0o=;{@m%8$
z^&fYzr*Ite&{RigMH-HE>$ty(Yi%Ct4fEjSCZR8YHhv-xp#GodKJ63XogAk*K=^Ks
z&(P#~pZjyT*4DLf9QPo7ADAr?3o4=;v=UBfA6beNRhSLOKC`(a5oW`;*%p=pqODPK
zw|X1=a#IKbR9ker!&2LzWic$uUI}<<lz?BBhyr!UM7Tlq@v{Qsh1ukgBH7?ovqlur
z)69LZ+-hqHhhPXPF`ifQH8h3Apu}(Rf2w@o<KEG8rF1TC&~qXjW7Fkfa1cvB3%K5d
zKSPL?KN(_h4*XaCG~jA;Vp*ym&@5_PR!)4)FuKYEw_vg~(S)%QSi|?&l@_C#d_$8Q
z9|aoUJL2bYd@g9U6fJPPg&*3T+$W_8WA*ppoB4*?iO98<Ukmt9{U>?<^gd$$$R$4Y
z?*~k~rvR}zygt3}h@og>8vz@t{vBRFs<Ifv`ZyD`^;-eMoYW_ns%+!+Jp^z~^+|UC
zuJS1{#bZ+-?J3p&OJT&1!-~r9k4PEqoIh2A6OZ%`&ew#ogPgC$iAVSmFz~xDXvTqm
znDe#!Lj4o}G#Hpu%fHI`P735&%l`y$40Z8!Qa=8%qH}`J??JeTPxw%^F^8Fdq^_a^
of`4BiSIfu$1@K1=)_~mNeELq(igy37r=j>Ay#FtV$hDUL5BAK1d;kCd

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-dwarf/test-PR26568-2.c b/tests/data/test-read-common/test-PR26568-2.c
similarity index 56%
rename from tests/data/test-read-dwarf/test-PR26568-2.c
rename to tests/data/test-read-common/test-PR26568-2.c
index 656e8eea..6a439746 100644
--- a/tests/data/test-read-dwarf/test-PR26568-2.c
+++ b/tests/data/test-read-common/test-PR26568-2.c
@@ -1,3 +1,6 @@ 
+/* gcc -std=c89 -gctf -g -mtune=generic -march=x86-64 -c \
+ *     -o test-PR26568-2.o test-PR26568-2.c */
+
 union A {
   struct {
     int x;
diff --git a/tests/data/test-read-common/test-PR26568-2.o b/tests/data/test-read-common/test-PR26568-2.o
new file mode 100644
index 0000000000000000000000000000000000000000..b192d52132766d4f95136e23f93de43a64d8cc2e
GIT binary patch
literal 3048
zcmbtVZERCz6n<~-S_<1r*<g+j^@@T_*0K#Zwi&QvUo9G3AVdekcDvnfi)%O9yHQXh
z13ze{5kyRgLyRIHh6s@#AR;!H0rM+H#VGtSA^V|0gP9r_KlGg2bGFN+#zar@_MG#a
z^StN0U$@WHK3r#$B*7wyC1TuTREUF)aocB@J~2&96|4M-VSnQ3YySS)Yv&9cE&oa9
z1cyCCwn_ekd;8i?#Mqn%Xd12&A6WBwGMW4|d0yI=|CsODLU~3*b#USPM=#0+`zJZd
zmb<t1?Ru_s;gO7kd+(lg&$^-HkUdy*bp6pS^LpzYuDZNGbCjKplWR`&)l_`FY$QK_
z;}2hjn+J{we{`;GxW-qwKQTS)@mcGY0&(^2%+9esUcaS}(w9DTo$<Nlj~bV{4riRn
z8%oTsoLEzzU1hs?W6tR}*4(jYc*nWm(k}y%Q*)=u@8-=oZ9ld)M}&7|HvS&H@?zyL
z2iEm|(JOwI&p%KqK5M$NIpoeBT(;rF!hzu_{eP?+c<adC%kwK&U%0ll^Mdp6qQT1>
z;&RuL%)V43ydOok^!1I}+}s=#lFQNh=Go1+3z5A|tX&CdcHtCW(2^wGaAl*yNnn6+
zr;X+jHn1lfo>4-w-zFxG1?4Qs?%cZ9E;(~;GVnUPB5g`XL>KkTS1HxSi<IILZ;`i1
zDJd!`E{37Z)8gG)v?HuVbhWcU@r3oBh_<**ivZXHt{QD=UmPzl^OW7Mc-m6!7@d4f
z{qQ>D1M>qOZ^3tu1PTM+E|5xk`d8$x)OU`=Vk0ApO{%I3?GNRhtlKn{H9GzJ2Zu%j
zy8^pLuh%AqDh`bf)((wU><%OXyMIdTt~mLQeQ=I1HyUVY+;U0E%6BE*LcI2J)vuzy
zy1G)C2TLjVmvumI888$Wb{N1AHX$VuW0A<`{-;tv+O$GQakn%xYl3q-1ZM$`17$A$
zRJq*G+p4o2DkPx)4}$Y%h~NH77lxBb2MgKg`qq#vOpnzRmc>MqH*U%zbKEgmvdA)d
zDKiIDj;SAGjTq9knC@v<QBqb~R_-bBwun$q1YlnCB(Tl<nT;F}#IalM4ChBde1c)6
ze)7m>+(Z5h(zruo*Bb2m2*-RpQ<l|aAa35JrwF&s!#S8QQw}P)V}@AsXA_S3*#D#C
z^FA@&M>xNC#`h3jN}BQa$bXQuwXQ-q?tyt9gg3S^tgAuLdNifm+0wPRF1)R(t_p83
z78Bm6)~R}1wO~(MQ%5A!1u?@`gTbiQdsA4As*yJBW=dyAL}Ln+U=!gc!*A&d<A+0d
zBVD@Yg;(Z@>1xXp<hMn7yxq|*_`K*Fsg~B>6pE^0jn?*m)J!1bp7D9|Ts|`Rd>F@E
zv)ly^V&*%5@eux`5i9>*$icVpU-`wrHRj|8MK#+=zd)LmB~27U0N<aF6G%7HqfC;I
z?++p7=M%mdbh`RiDgFv+R?KI=0gQC~ZM0DfIFYoK{}ABm`d8?2^E<-+@!c_>`)>t|
zN`W;l#|h+j$`NaB69m%LZ=m{dB4T~~mRaj}1BP>QpI{o|qQ{E+V-~K@`bh{He4dz+
zn~9Hcvv3;o`ypuX%}HQiBK~{}&OFwy65o<09M%g>3C!dCePH0ZP&tN$llazs;r==C
z6c{+Cm0wQ$a!w>|<sSz;-T9rT^W%Gh=jVpOe8$t&#!}r>|9f;ma$z9X%EvpAZmay*
d6bS#nrM%Qy*+xADMmqkF)c;v?GT7Gr{~OR-KGpyL

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-dwarf/test3-alias-1.suppr b/tests/data/test-read-common/test3-alias-1.suppr
similarity index 100%
rename from tests/data/test-read-dwarf/test3-alias-1.suppr
rename to tests/data/test-read-common/test3-alias-1.suppr
diff --git a/tests/data/test-read-dwarf/test3-alias-2.suppr b/tests/data/test-read-common/test3-alias-2.suppr
similarity index 100%
rename from tests/data/test-read-dwarf/test3-alias-2.suppr
rename to tests/data/test-read-common/test3-alias-2.suppr
diff --git a/tests/data/test-read-dwarf/test3-alias-3.suppr b/tests/data/test-read-common/test3-alias-3.suppr
similarity index 100%
rename from tests/data/test-read-dwarf/test3-alias-3.suppr
rename to tests/data/test-read-common/test3-alias-3.suppr
diff --git a/tests/data/test-read-dwarf/test3-alias-4.suppr b/tests/data/test-read-common/test3-alias-4.suppr
similarity index 100%
rename from tests/data/test-read-dwarf/test3-alias-4.suppr
rename to tests/data/test-read-common/test3-alias-4.suppr
diff --git a/tests/data/test-read-common/test3.c b/tests/data/test-read-common/test3.c
new file mode 100644
index 00000000..0d8e7f87
--- /dev/null
+++ b/tests/data/test-read-common/test3.c
@@ -0,0 +1,26 @@ 
+/*
+ * Test file for creating multiple alias for a symbol
+ *
+ * NOTE: linking with _old_ crti.o exposes _init and _fini as
+ *       global symbols, the newer versions don't.
+ *
+ * 0000000000000000 g     F .init  0000000000000000 .hidden _init
+ * 0000000000000000 g     F .fini  0000000000000000 .hidden _fini
+ *
+ * This test is looking for those symbols which are not experted.
+ * So it's linked with dummy crti.o to avoid false positives.
+ *
+ * gcc -std=c89 -shared -gctf -g -mtune=generic -march=x86-64 -fPIC \
+ *     -nostartfiles -Wl,-soname=test3.so.1 -o test3.so test3.c crti.o
+ *
+ */
+
+void __foo(void);
+void foo(void) __attribute__((weak, alias("__foo")));
+void foo__(void) __attribute__((weak, alias("__foo")));
+void __foo__(void) __attribute__((alias("__foo")));
+
+void __foo(void)
+{
+
+}
diff --git a/tests/data/test-read-common/test3.so b/tests/data/test-read-common/test3.so
new file mode 100755
index 0000000000000000000000000000000000000000..3dfb69e998b5d91dcadc283974557ec294e2c074
GIT binary patch
literal 14824
zcmeHOPiz!b7=N?d(n4V={{&K!P7FjK?(DW;!yhZHrKQ9|um+<>GtTbLb~kos$nF$d
z5+f&4q9z<YcpxEB;?a{FOiVbNG<q;zlnWO<0491dv3|dq@7s>U6s*L=!~2rAzxTfP
zeeb>b%{Om$cfNUld}<<N7)m6oUQjD7rAD~p=3%jb?ugnzpF7m{(6(cx>!I40*+?a*
zdZRYx=tPy<N!$^c(Htx>zi>X2^$A>JwV;fP`PQMYzy>E0C<iUb^JU0vEq>iREY|p_
zbr#u9Q2buG8&v*{-#PXxn$f^X+{^O`hI5eaW%3J;kNY17OpBV9b^b#>g;s<^7ZqT9
zUaSZ4Aa+z$;2w6+p}>Ccw<>eFV<e1N^uzCJYq6(#rM3CiM-Orxw?AL_`MZ0$&+h+{
zqpnp2<35cU`GBw{$a*Si`pu-@O7>j|d-y@090zd=eJ){-<4Chtwq5o8=+m~9UH9sN
zva1AYwq7b*E#Deaf!hiWp*ldLXweL41~dbj0nLDBKr^5j&<tn>Gy`j6;QZv(yVu^j
z{dZW~5ZYQZpc&8%Xa+O`ngPv#W<WEb8PE)91~dbjf&V!Jcz$Y9!L!#>XV24fR^w~v
z@SGBo;day_eP8zYUTWa^>C(OB<q^W~3Ew9Ck?=AhWP1e4xHPSd`Cg-MV^{Yz8gvio
zQ5MNIeC9fu>%Ed0+qCXQGT^@F3H?X(ze)YCuF_9kS~LTi0nLDBKr^5j&<tn>Gy|Fe
z&46Y=Gw=`t@;kSWdn9RiAGbF$O5X1#vE#g6{8olsKr%APZ+|ZP!0X(`?`p^*elU|r
z&hs7a-w>%)k+Fwy7vp~or^d#PnfvLN{{eGg&?;I*bFer#FhIrJ@6KOvoArk41<vdN
z^(-wVS~TaXCo-FpD;+0Ar!qogV;eP$VKGVZ%z!9k=elGbweg8Ewix?z+j_G7ef?XE
ztzEr4X&sh2u{)bP)^oh)XwNgdp&r?FX*UfqNu^VDtAiNMF#gDG0^lrDp-O*v!ZSvH
zW^*Q7Px#SksP!3{I=j=D%4Es-qF=9YUiO^#j_1GY;V%+%?8wo_aAoEj!JOv~&$u2D
zSf-}aEZ2tTj|}C94x9Oza!{pDGv5j-!{wtzGhaP-dQ25+e#0%47D@{Rzv+}`-9oEb
zE>QNjQ>xE6_1OZ_zgvZh6F6Zt-*lZyzU(&|zQ?KIWjfAu!C`l(2g}J`<h!ToVV9=I
zsUxzKlJ_TINCNJW*)Q)MgiZQD)THIR<8_j>{CNELla_yPt)f4+%J?I!m+MyY``bj7
zn?c<wEBoZ@XGhNv`?gKz)*hd<C#FZwjN6kZr&p5k!!&$O&<_*yfBmULHj4H?Wi(+Z
z*bz_=_$c_d>?JC=cIYfzo**QVjUbFiYCjcLo+Jjspg2Uw6vnNxS__T9DG>(E2y0TC
z@#d_W)2b<}vfz<fgh5kTfjb{4%ku-*g3*PhPg_8+pe(m$SDQ}5wQChJlUC^HH0ot#
zAr5J$ph{3BwOg8-v7M&l&A2UT*1f7Pb*EHnx)-H2TlZY4(;}q`wT<?ZOFs>PErz$<
z_I@q<w(P&WO^0U=v&#OC`@`?c%f9$u=ZYZW7LxRjv`X!x3ifvKzrz*5n{0^r5DADJ
zh};MARL9ujFZUBcSwDOr5>`=5spnWHVJDlNVEa8Qc1ZdkCq1qqnO~V~$e5g8*3VYz
zELAY3_{%;ah^r(n!n^43pKsj%H8biFoEJmJ<os3A<Jjf=wD&K0e~AxR<`sYJcM#mv
zVUj#fQQ&?P7ap#C9<V;q#qEX;MXeigWs2>4DLS|u<OL<ym7MFtRs7#z$I}=rCQ1K~
zsV}L6`3?3*e8wed`zduMb+BJz|EaihitQJyOCIMQeibVG(iIy+<`VpB75@*|AKzBu
zB7Sj{*p1sQvA@ZN_@aY2llYPA7x&qA?8OGSKNvM8Vmef1UQutMN}B%<96#TPA!E}2
EFPZjRv;Y7A

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-common/test4.c b/tests/data/test-read-common/test4.c
new file mode 100644
index 00000000..ad274022
--- /dev/null
+++ b/tests/data/test-read-common/test4.c
@@ -0,0 +1,11 @@ 
+// gcc -shared -gctf -gdwarf-3 -mtune=generic -march=x86-64 -std=c99 -fPIC -o test4.so test4.c
+
+char *
+cpy (char * restrict s1, const char * restrict s2, unsigned int n)
+{
+  char *t1 = s1;
+  const char *t2 = s2;
+  while(n-- > 0)
+    *t1++ = *t2++;
+  return s1;
+}
diff --git a/tests/data/test-read-common/test4.so b/tests/data/test-read-common/test4.so
new file mode 100755
index 0000000000000000000000000000000000000000..0394bf5cc4404c29b1627258d9b11319035bd671
GIT binary patch
literal 16560
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
Ww9?1oO`$gaIeKwITIB=ySn+Q+OAa^y

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/PR26261/PR26261-exe.abi b/tests/data/test-read-ctf/PR26261/PR26261-exe.abi
new file mode 100644
index 00000000..cb2e2f13
--- /dev/null
+++ b/tests/data/test-read-ctf/PR26261/PR26261-exe.abi
@@ -0,0 +1,58 @@ 
+<abi-corpus version='2.1' path='data/test-read-common/PR26261/PR26261-exe'>
+  <elf-function-symbols>
+    <elf-symbol name='__libc_csu_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='__libc_csu_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='_start' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='fun_obja' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='fun_objb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='main' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='wrapped_call' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <elf-symbol name='_IO_stdin_used' 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='char' size-in-bits='8' alignment-in-bits='8' id='type-id-1'/>
+    <class-decl name='SA' size-in-bits='192' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='m1' type-id='type-id-3' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='m2' type-id='type-id-4' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='m3' type-id='type-id-5' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <class-decl name='SB' size-in-bits='128' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-6'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='m1' type-id='type-id-3' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='m2' type-id='type-id-7' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-3'/>
+    <typedef-decl name='fn_ptr_type_a2_t' type-id='type-id-8' id='type-id-5'/>
+    <typedef-decl name='fn_ptr_type_a_t' type-id='type-id-8' id='type-id-4'/>
+    <typedef-decl name='fn_ptr_type_b_t' type-id='type-id-9' id='type-id-7'/>
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-10'/>
+    <pointer-type-def type-id='type-id-6' size-in-bits='64' alignment-in-bits='64' id='type-id-11'/>
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-12'/>
+    <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-8'/>
+    <pointer-type-def type-id='type-id-15' size-in-bits='64' alignment-in-bits='64' id='type-id-9'/>
+    <function-type size-in-bits='64' alignment-in-bits='8' id='type-id-14'>
+      <parameter type-id='type-id-3'/>
+      <parameter type-id='type-id-3'/>
+      <return type-id='type-id-16'/>
+    </function-type>
+    <function-type size-in-bits='64' alignment-in-bits='8' id='type-id-15'>
+      <parameter type-id='type-id-3'/>
+      <parameter type-id='type-id-3'/>
+      <parameter type-id='type-id-1'/>
+      <return type-id='type-id-16'/>
+    </function-type>
+    <type-decl name='void' id='type-id-16'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/PR27700/test-PR27700.abi b/tests/data/test-read-ctf/PR27700/test-PR27700.abi
new file mode 100644
index 00000000..62df1017
--- /dev/null
+++ b/tests/data/test-read-ctf/PR27700/test-PR27700.abi
@@ -0,0 +1,22 @@ 
+<abi-corpus version='2.1' path='data/test-read-common/PR27700/test-PR27700.o'>
+  <elf-function-symbols>
+    <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'/>
+      <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='unsigned int' size-in-bits='32' alignment-in-bits='32' id='f0981eeb'/>
+    <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'>
+      <parameter type-id='8750e847'/>
+      <return type-id='48b5725f'/>
+    </function-decl>
+    <type-decl name='void' id='48b5725f'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-PR26568-1.o.abi b/tests/data/test-read-ctf/test-PR26568-1.o.abi
new file mode 100644
index 00000000..d62474ec
--- /dev/null
+++ b/tests/data/test-read-ctf/test-PR26568-1.o.abi
@@ -0,0 +1,56 @@ 
+<abi-corpus version='2.1' path='data/test-read-common/test-PR26568-1.o'>
+  <elf-function-symbols>
+    <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'>
+    <class-decl name='A' size-in-bits='64' alignment-in-bits='64' is-struct='yes' visibility='default' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='' type-id='type-id-2' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='' type-id='type-id-3' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='x' type-id='type-id-4' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='' type-id='type-id-5' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='y' type-id='type-id-6' 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-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='x' type-id='type-id-4' 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'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='y' type-id='type-id-6' visibility='default'/>
+      </data-member>
+    </class-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-6'/>
+    <union-decl name='' size-in-bits='64' is-anonymous='yes' visibility='default' id='type-id-2'>
+      <data-member access='public'>
+        <var-decl name='' type-id='type-id-3' visibility='default'/>
+      </data-member>
+      <data-member access='public'>
+        <var-decl name='x' type-id='type-id-4' visibility='default'/>
+      </data-member>
+      <data-member access='public'>
+        <var-decl name='' type-id='type-id-5' visibility='default'/>
+      </data-member>
+      <data-member access='public'>
+        <var-decl name='y' type-id='type-id-6' visibility='default'/>
+      </data-member>
+    </union-decl>
+    <pointer-type-def type-id='type-id-1' 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'>
+      <parameter type-id='type-id-7'/>
+      <return type-id='type-id-8'/>
+    </function-decl>
+    <type-decl name='void' id='type-id-8'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-PR26568-2.o.abi b/tests/data/test-read-ctf/test-PR26568-2.o.abi
new file mode 100644
index 00000000..a934d15b
--- /dev/null
+++ b/tests/data/test-read-ctf/test-PR26568-2.o.abi
@@ -0,0 +1,39 @@ 
+<abi-corpus version='2.1' path='data/test-read-common/test-PR26568-2.o'>
+  <elf-function-symbols>
+    <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'>
+    <class-decl name='' size-in-bits='32' alignment-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-1'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='x' type-id='type-id-2' 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-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='y' type-id='type-id-4' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-2'/>
+    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-4'/>
+    <union-decl name='A' size-in-bits='64' visibility='default' id='type-id-5'>
+      <data-member access='public'>
+        <var-decl name='' type-id='type-id-1' visibility='default'/>
+      </data-member>
+      <data-member access='public'>
+        <var-decl name='x' type-id='type-id-2' visibility='default'/>
+      </data-member>
+      <data-member access='public'>
+        <var-decl name='' type-id='type-id-3' visibility='default'/>
+      </data-member>
+      <data-member access='public'>
+        <var-decl name='y' type-id='type-id-4' visibility='default'/>
+      </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'>
+      <parameter type-id='type-id-6'/>
+      <return type-id='type-id-7'/>
+    </function-decl>
+    <type-decl name='void' id='type-id-7'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-alias.c b/tests/data/test-read-ctf/test-alias.c
new file mode 100644
index 00000000..1b497a18
--- /dev/null
+++ b/tests/data/test-read-ctf/test-alias.c
@@ -0,0 +1,15 @@ 
+
+// function aliases
+
+void main_func(void);
+void alias_func(void) __attribute__((weak, alias("main_func")));
+
+void main_func(void)
+{
+
+}
+
+// variables aliases
+
+int main_var;
+extern int alias_var __attribute__((weak, alias("main_var")));
diff --git a/tests/data/test-read-ctf/test-alias.o.abi b/tests/data/test-read-ctf/test-alias.o.abi
new file mode 100644
index 00000000..1fe61b8f
--- /dev/null
+++ b/tests/data/test-read-ctf/test-alias.o.abi
@@ -0,0 +1,19 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test-alias.o'>
+  <elf-function-symbols>
+    <elf-symbol name='alias_func' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='main_func' type='func-type' binding='global-binding' visibility='default-visibility' alias='alias_func,main_var,alias_var' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <elf-symbol name='alias_var' size='4' type='object-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='main_var' 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='95e97e5e'/>
+    <function-decl name='main_func' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8'>
+      <return type-id='48b5725f'/>
+    </function-decl>
+    <var-decl name='alias_var' type-id='95e97e5e' mangled-name='alias_var' visibility='default'/>
+    <var-decl name='main_var' type-id='95e97e5e' mangled-name='main_var' visibility='default'/>
+    <type-decl name='void' id='48b5725f'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-ambiguous-struct-A.c b/tests/data/test-read-ctf/test-ambiguous-struct-A.c
new file mode 100644
index 00000000..67047c44
--- /dev/null
+++ b/tests/data/test-read-ctf/test-ambiguous-struct-A.c
@@ -0,0 +1,8 @@ 
+struct A;
+struct B { struct A *a; };
+struct A { struct B b; long foo; long bar; struct B b2; };
+
+typedef struct A a_array[50];
+a_array *foo __attribute__((__used__));
+
+static struct A a __attribute ((__used__));
diff --git a/tests/data/test-read-ctf/test-ambiguous-struct-A.o b/tests/data/test-read-ctf/test-ambiguous-struct-A.o
new file mode 100644
index 0000000000000000000000000000000000000000..4ea891f656de09da4ecf490b2d3223820334c0f0
GIT binary patch
literal 1504
zcmbtU&2G~`5FVFMC`eU{IG`dV_e2ZWPI5si0=ZOB2_bGA5v*M|jfm~YUQ5jho`VD8
zQOX<e1n>;-0`PtIE{>MMg^|9UnQwmVnT_-A$@8Zxo+nm3c_h7OSrPw2Z^x|}%T>7|
zKfVoCY~-Oepf4M2KodUj1^584fbj>weWS_ICeP;sTeNQilmWn3fZp<<F9H<ivVROP
zejRvk>>JQ$0CO$@kX81KJBt1~pL>f|AL~4kYcv?=v&KLKK<=z|n&*1k_p$6tBD1oX
z_|rnmaal^DDoMtoI<_h5>7>Yx+OT@9s!A=|G$qkVnP*Y5NET69sdSb_b(Kc5X`+(p
zL``QwGp}`(sXWqIt?TGWY1Ntm$fF?D$DOBg<Tqtg2S{&H9qfmx$l<}kp1*VW;^nSC
z8i&Jh=#Piv(FpK&veS81P4leKYPM@f;+}ngGouXiduQaVc*f^W|0RqM<oi!Ihxh5>
zrhF5yns>0--e4EtJ+;EAgL8*d?FJ>R7r9mmw5~dRVlADWY6-b936r{(5Zl60<{VnW
zqSRT4A+a%)zBT@&Xu^3_Vl{eU-{C)WH!pr%PLJ5}t?TY}8v$}lpI@6Ax96XSTYnoV
z+~wcuW2c4h`1jzuJ(&{ofP8d<jw>VNkQ*|2NxquIyGtBRTW|H=61SYX#t-uxv2`}|
z3<keZH+{np?tA_I-I)gL=hiY58}bbu$Qr;M+j{=@P%Phh{rSn%Z}(Jdx$nOT*1bC>
Oem3>5+N%C=>wf{e$$~-v

literal 0
HcmV?d00001

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
new file mode 100644
index 00000000..922a1daf
--- /dev/null
+++ b/tests/data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi
@@ -0,0 +1,36 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test-ambiguous-struct-A.o'>
+  <elf-variable-symbols>
+    <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'>
+      <subrange length='50' type-id='7359adad' id='3c1860ce'/>
+    </array-type-def>
+    <class-decl name='A' size-in-bits='256' alignment-in-bits='64' 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>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='foo' type-id='bd54fe1a' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='bar' type-id='bd54fe1a' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <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'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='a' type-id='84d5ac12' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='bd54fe1a'/>
+    <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='7359adad'/>
+    <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='a' type-id='3ed987a4' mangled-name='a' visibility='default'/>
+    <var-decl name='foo' type-id='55cd64e8' mangled-name='foo' visibility='default'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-ambiguous-struct-B.c b/tests/data/test-read-ctf/test-ambiguous-struct-B.c
new file mode 100644
index 00000000..95a93469
--- /dev/null
+++ b/tests/data/test-read-ctf/test-ambiguous-struct-B.c
@@ -0,0 +1,5 @@ 
+struct A;
+struct B { struct A *a; };
+struct A { struct B b; int foo; struct B b2; };
+
+static struct A a __attribute__((__used__));
diff --git a/tests/data/test-read-ctf/test-ambiguous-struct-B.o b/tests/data/test-read-ctf/test-ambiguous-struct-B.o
new file mode 100644
index 0000000000000000000000000000000000000000..06bd0f502a874ad4a10c4beb5788eaace44c2bf9
GIT binary patch
literal 1344
zcmbtTO>fjN5S^3-3YGX$RiRdu!iiQ8XLpZ1ptKbfA;gUn;^3ri8?o7}Vn^zp=&9l-
zapa%y8_FMmH;LU?R^h^|US{Uao2+M&e0}}?%}NxJvxr{NkU5s<Vr7W4F3f0+?$fWI
zqwC7XAfXXr#;V05cmrsF8`dp2=KljWS^ETF<KA06HlM=Z2H04;24n!&9|9Ku^LGK*
z9qx^Lit`8E0S{=Oaw_MBPU@QSDM|d&v$|4gzRZ_t-N<65Qr#5ktjuLzp2~8Tv<qz-
zC9BjZZFG7pjqJh%<Z)7%lRlFb^ljbh1oE~p$$=<{jt&p^;+>-pA9v%)RE)(qo{p!J
z2@vn7^Mz{4O3jU&?c$L3%-x*mz>cCH%sGo}&U60DxIUt*-=Ss;MAU7pukcPg<H3>}
z&o7CDURFlt@TTegnTw1%Hzar=Byz1uU>Ug770*OsUK=Ga2o@rXFE&4&w_?%MnA|Mg
z|Np1&=fXn|?vn+%OT+y=LxDMdmwe0o#EZlJ=cw^}`?vn<J==Tmci`JgB;h@|p78~?
z6%>P%CeSc9X0d0Vtnh`$ap?M;-}5+Mdg%l{d4u*HIR5UsZ_Lwvv;E<@cvrr$EbQg_
sciaEgitoYmj$OaotK+R~aQ3F#1Jgy}SdYPm&yI!Lw*Pb2HC)2}KYuZ9CjbBd

literal 0
HcmV?d00001

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
new file mode 100644
index 00000000..28291eb5
--- /dev/null
+++ b/tests/data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi
@@ -0,0 +1,23 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test-ambiguous-struct-B.o'>
+  <abi-instr address-size='64' language='LANG_C'>
+    <class-decl name='A' size-in-bits='192' alignment-in-bits='64' 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>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='foo' type-id='95e97e5e' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <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'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='a' type-id='84d5ac12' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='95e97e5e'/>
+    <pointer-type-def type-id='3ed987a4' size-in-bits='64' alignment-in-bits='64' id='84d5ac12'/>
+    <var-decl name='a' type-id='3ed987a4' mangled-name='a' visibility='default'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-conflicting-type-syms-a.c b/tests/data/test-read-ctf/test-conflicting-type-syms-a.c
new file mode 100644
index 00000000..65414877
--- /dev/null
+++ b/tests/data/test-read-ctf/test-conflicting-type-syms-a.c
@@ -0,0 +1,5 @@ 
+typedef long a_t;
+typedef long b_t;
+
+a_t *a;
+b_t ignore2;
diff --git a/tests/data/test-read-ctf/test-conflicting-type-syms-a.o b/tests/data/test-read-ctf/test-conflicting-type-syms-a.o
new file mode 100644
index 0000000000000000000000000000000000000000..9b7e7469adf5d14fea6a63a25b319da49f960507
GIT binary patch
literal 1360
zcmbtTOK#La5G@bG5P}pD!~zKxh7C!;_KcTVAWIR6gb*uOB4|4u$HJe9-I2x{a)lg&
zV{jAB02hFIc6X-Lnye`4xvE~(>**?wuim~to_HP^^XLt&Gs6;HPu6iVgb6*MZTj<T
zdQ*9}ZlNuXfrlDC`;Uz8j49&|;}PSr_TUhM*S|l5KH+qmJ=+2Jogp0KF{GX00%cR@
zeo-qDUlgSbK}B9St&Ax;Zz>t3ecDG&E3#5XU7JN^k&3j)MNtNq%TBdYRFRUM>Y`Jj
z#1IBdo(7pZ8?&sb&&ncGMV$w#U&^5Ct1b{>Ms#v?bm;G$eE78QFXC_>&i!~EFBS}c
zPp+1-Eh<?nQSR$I4?FNVxyxV~P00I+9T@X;zUf_<9(dHJ^!u;PA@&)&!#0tP?*je>
z13Y#MGoCPdaQlSoZBoc%E0MBS?dZ=<q~uCbi2YHRb{&PhJAO13rl+uOlni;=pi?6I
zrt`eM43}-gJ5v34r~i3AWifU#a}G(I+@$V)pK}2m{)e_Dc4Eb@{w3G2)7$j;9&EeW
zzb0R^ch5vA!Gmq)6rGe7+yicoX3LIs<133pX!OP(TAbZ_VH#|5L+?B0?lFdM(&}Al
zy?ZZrezdt-9P>l#zan9~&p@BiKLN=G-rYU;Eq&+#63g7NcDc4mA8Y+*ON-Fe{{z~E
BcuD{O

literal 0
HcmV?d00001

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
new file mode 100644
index 00000000..03dd56b3
--- /dev/null
+++ b/tests/data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi
@@ -0,0 +1,14 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test-conflicting-type-syms-a.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='a' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <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='bd54fe1a'/>
+    <typedef-decl name='a_t' type-id='bd54fe1a' id='40acc204'/>
+    <typedef-decl name='b_t' type-id='bd54fe1a' id='b3d2db81'/>
+    <pointer-type-def type-id='40acc204' size-in-bits='64' alignment-in-bits='64' id='c6fd4117'/>
+    <var-decl name='a' type-id='c6fd4117' mangled-name='a' visibility='default'/>
+    <var-decl name='ignore2' type-id='b3d2db81' mangled-name='ignore2' visibility='default'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-conflicting-type-syms-b.c b/tests/data/test-read-ctf/test-conflicting-type-syms-b.c
new file mode 100644
index 00000000..e458021e
--- /dev/null
+++ b/tests/data/test-read-ctf/test-conflicting-type-syms-b.c
@@ -0,0 +1,5 @@ 
+typedef long a_t;
+typedef long b_t;
+
+a_t b;
+b_t ignore1;
diff --git a/tests/data/test-read-ctf/test-conflicting-type-syms-b.o b/tests/data/test-read-ctf/test-conflicting-type-syms-b.o
new file mode 100644
index 0000000000000000000000000000000000000000..609f320b49bf443539e090b687903a3f877e3b6a
GIT binary patch
literal 1344
zcmbtTO>fjN5S^5zK#>qd9FWQ(^g>&Rv)SVwP^1cq5aPxWfs?w~h<vOPS86W6&*10q
zPx>3$6XF8%Hg-0$wkJk<o;S}kUi&Hg{q_4dTb@TYJbFdz%Bn;^w$?me(U|Vj4qabP
zhMlMD7P`wEcxd2re#`jAz`!lWBgSKsp@Bm;zrT(7n9Ci`97oU}tZ2`vsH@D+D^2pV
zrUalotLjEY6fWvgg-MrmVcp2IP+{AoVUZ^?$upT3!TGY)jgn=kRjb?ZRBE}R0gI<W
zs?Yi=t*f&lPjy~pf$o+nXuGlv5|I*}93Rj9gOd**5B+E+ref;Prn4ww_y_7@shYf0
zm6pXJt~_D*jN1$zVGq1t&}?|7-sHXQLB{@suKtcSaG$Zeat~GSJ@P&SI=n>KOn7#1
z^Xt}5lHez6nQ+!kpBI*Cb)iYXI}%CTl3?F>sY|?^L{)1g__aZ+W%||BS#>U!P0jx3
zuD{d&tb05RPqv*yVyCvH>+dt(fQIjG9Pzjqad-YX@4?fX=JEZHWANXIFFCtsVk^eN
z@uyG2>h?yw18q8V^ki-tUpTs*w|UO{mXBN2CUHaWJJ#+n@c$jh!pyt(a^H_OcNXXT
tH1l6jaNJ{{&(1%A$N}B;9{O)He}rNbMjn)1W}D{s&80pKojq~q{{dYmdA0xm

literal 0
HcmV?d00001

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
new file mode 100644
index 00000000..35bcac7a
--- /dev/null
+++ b/tests/data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi
@@ -0,0 +1,13 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test-conflicting-type-syms-b.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='b' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <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='bd54fe1a'/>
+    <typedef-decl name='a_t' type-id='bd54fe1a' id='40acc204'/>
+    <typedef-decl name='b_t' type-id='bd54fe1a' id='b3d2db81'/>
+    <var-decl name='b' type-id='40acc204' mangled-name='b' visibility='default'/>
+    <var-decl name='ignore1' type-id='b3d2db81' mangled-name='ignore1' visibility='default'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-dynamic-array.c b/tests/data/test-read-ctf/test-dynamic-array.c
new file mode 100644
index 00000000..77a9b5a1
--- /dev/null
+++ b/tests/data/test-read-ctf/test-dynamic-array.c
@@ -0,0 +1,13 @@ 
+// test dynamic arrays definitions
+// information was detected f field.
+
+struct S
+{
+  char *a;
+  char b[0];
+  char c[];
+};
+
+void use_struct_s(struct S *)
+{
+}
diff --git a/tests/data/test-read-ctf/test-dynamic-array.o b/tests/data/test-read-ctf/test-dynamic-array.o
new file mode 100644
index 0000000000000000000000000000000000000000..c588c8bc45805bfd0a97b81312e81aa99948e2b3
GIT binary patch
literal 1712
zcmbtU&1(}u6n~q>v}zk_ks?-PMZ^@{*(4|FK_bDnsCZC%Ea~iKnk?=|*qumL5W#~`
zPyLe$di8JcBzV<RZ~ES5Cf$zlq7UA_&)>Y+-^}j2$IrGamIYcYcnD{a&H{`U&iqc{
zc3=gTVQ=^7+wRfZ)8qY5KfhKhx~Z)lWvggOmy~`+`%(FK(9%epa9!6iq!@0Xc2F;%
z-c)`Kt=dhEaEQ^HtJ4N9p`z4itqyrpStCPr+DA$L$lKE*jUlnr{?->UxLBlSk9tAX
zOYnz01rA{n5A1QA1%p`h?I4!mfe){fpbz6r^fH-_ec8*v9VU@*z1+*)B;|f6+${Co
zFz~n+40sSa;}P}>9=TFvGIRS}^1^j6*>`+-IF0&w%%i|}c$)H@`2aiJ?v~xydA_%4
zx7w`9ns&R{ZnaSDhM0^*8bl(NJlrfuu<<>JSnNk)tdlY^mWuUVxT@aSdh-IT$*Q%n
zyts6XMLHl-lFRgXRA2p2>8{kav4P^h2(4R%AHU|67v|i+b!=QK<%?MaCWai7h;wWg
zBkbZiy#RCxX2P;OlH3D^j8E-Qds0j!Fd`qAmu0|^czh%gkq9hKq+rOMlS%HsQt==j
zvr(EL)iMW`ijXrg>>Z{&60?#2<7^<9xYM^&uhmh`j29K_^V5B|(4n0EVs!qgb_{Fc
z?_!<K^<VM#5o@kVBlZ0EM$rhNrSMGxmE?<RyjRMRtMS@ym2&0QQ{7Nb&gp%EIr<Tt
zyF(ajytyy)8}QVcCcdE(53pVq6Tgo|`c6CLCiK56{56%QpCDm1UgzmG&DjJwP{{)d
mQ0N}f8Jl?e0h(uzDL7I1+Z2?<r1c8c=HYcREMdtt@xK8~j*u|`

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test-dynamic-array.o.abi b/tests/data/test-read-ctf/test-dynamic-array.o.abi
new file mode 100644
index 00000000..02b22811
--- /dev/null
+++ b/tests/data/test-read-ctf/test-dynamic-array.o.abi
@@ -0,0 +1,30 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test-dynamic-array.o'>
+  <elf-function-symbols>
+    <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'>
+      <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'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='a' type-id='type-id-6' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='b' type-id='type-id-2' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <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'/>
+    <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'>
+      <parameter type-id='type-id-7'/>
+      <return type-id='type-id-8'/>
+    </function-decl>
+    <type-decl name='void' id='type-id-8'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-enum-many.c b/tests/data/test-read-ctf/test-enum-many.c
new file mode 100644
index 00000000..f2297d72
--- /dev/null
+++ b/tests/data/test-read-ctf/test-enum-many.c
@@ -0,0 +1,10 @@ 
+/* Looked up item by item. */
+enum e { ENUMSAMPLE_1 = 0, ENUMSAMPLE_2 = 1 };
+
+/* Looked up via both sorts of iterator in turn.  */
+enum ie { IE_0 = -10, IE_1, IE_2, IE_3, IE_4, IE_5, IE_6, IE_7, IE_8, IE_9, IE_A, IE_B, IE_C, IE_D, IE_E, IE_F,
+	  IE_10, IE_11, IE_12, IE_13, IE_14, IE_15, IE_16, IE_17, IE_18, IE_19, IE_1A, IE_1B, IE_1C, IE_1D, IE_1E, IE_1F,
+	  IE_20, IE_21, IE_22, IE_23, IE_24, IE_25, IE_26, IE_27, IE_28, IE_29, IE_2A, IE_2B, IE_2C, IE_2D, IE_2E, IE_2F};
+
+enum e foo;
+enum ie bar;
diff --git a/tests/data/test-read-ctf/test-enum-many.o b/tests/data/test-read-ctf/test-enum-many.o
new file mode 100644
index 0000000000000000000000000000000000000000..c54f96bd4240a845737024343671da2561abd96e
GIT binary patch
literal 2032
zcmbuAIcyU_6o$tT&JZBn;dDX}f#9`gI06wMo8Uy8ii9E|Box-pCb5Xuk#{4-1)`v$
zqM||+R8&+nq=JTu3K}XzK?4;6iTg1B|Gb+l3sgMid;iRvncus!yOXQ=)BW=j2^B^{
z9aVF^u&PvM!CX5l&8%uxOV#_AP4mK$6Oo0BQ6wt^lF-)}zYXT2&8c~$9H6qsHvR;d
zb~K^QI)gqO+ro}g3pthqyFn(Hn?n0zy<RuaPtYFdXXs(*7ibRp71|H|20aD+4jqL4
zfDS=_LN7oe^<gMu1n{>@fH&&`UY7@W9n*l@a|J8}*T5oh9dHkBfF<B2SPE`|W^e~A
z19w3SxCfSl`(Oo_0le>rpcOm@tH2Ym8axGSz;mz`ya4OKE3h8C0UN+u&;~w$jo=&D
z1o+rDLl;50uPxB6(ACgw&^Blix((V6-2v@@c0;#AHMA4j1Kj~V0!4(+CZQaaKRa~h
zT<*-^>HM&cc8r>Gz0#QLj3i60uS$+Oksr=5X(q$8muVl<ex?IVJxm9g4l(7JjxqHy
z9cRij^)u;)p*U)>)Z(edREw(?TP?m?jI}sxvDV_P#axTK7JDuJM*L0VipAfEzY%{U
z{zm+b_#5#z;%~&?h`$kkBmPGGO~2x{j8-bDU{_Uoyi#`3g<7GOu2k*fgp>BF#q>m}
zU>8bbc4;CtHR<_P$1bOR$Me1Pi0#|bOrbcED*B_1p5soHQ)Sz&Sw*D=`ucj4T?1!_
zb|tm3GFB#OGDd5V>~f|joocD<xV}BHOCD<Yz41NA8hi(dN34aB2>OjzAgunW9B)$Z
z>hTf2*R8W(d*i#}9KO%2hrbo7;+>|VHxzD`vb<W^w+m3e+R*W^<vY{9vba6UDtMl<
zur)}PGH+E`ZpC*j++E7^?c(L2KjuzZlhq0~#INy+{x9Uag9XotXk??ENISlt?HFTi
zeq;`t*;qg9#@Fw}0MDd<t>;)YX7@WN?t#WVIh18W%*2f2b2a9$hBN!O_!6w^{;fLq
zTcJ-c#=~}WYG?dHgTeURlc@7-<~bgXu3&xqy5jpmzxZ1EoDbGtVh6$Vp7X->Jck*q
g$F@l74}$ePpQ91Ke*Pc$+xln0`is%UXvf$80+<N)-T(jq

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
new file mode 100644
index 00000000..26bc048c
--- /dev/null
+++ b/tests/data/test-read-ctf/test-enum-many.o.hash.abi
@@ -0,0 +1,69 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test-enum-many.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='bar' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <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'/>
+      <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'/>
+      <enumerator name='IE_0' value='-10'/>
+      <enumerator name='IE_1' value='-9'/>
+      <enumerator name='IE_2' value='-8'/>
+      <enumerator name='IE_3' value='-7'/>
+      <enumerator name='IE_4' value='-6'/>
+      <enumerator name='IE_5' value='-5'/>
+      <enumerator name='IE_6' value='-4'/>
+      <enumerator name='IE_7' value='-3'/>
+      <enumerator name='IE_8' value='-2'/>
+      <enumerator name='IE_9' value='-1'/>
+      <enumerator name='IE_A' value='0'/>
+      <enumerator name='IE_B' value='1'/>
+      <enumerator name='IE_C' value='2'/>
+      <enumerator name='IE_D' value='3'/>
+      <enumerator name='IE_E' value='4'/>
+      <enumerator name='IE_F' value='5'/>
+      <enumerator name='IE_10' value='6'/>
+      <enumerator name='IE_11' value='7'/>
+      <enumerator name='IE_12' value='8'/>
+      <enumerator name='IE_13' value='9'/>
+      <enumerator name='IE_14' value='10'/>
+      <enumerator name='IE_15' value='11'/>
+      <enumerator name='IE_16' value='12'/>
+      <enumerator name='IE_17' value='13'/>
+      <enumerator name='IE_18' value='14'/>
+      <enumerator name='IE_19' value='15'/>
+      <enumerator name='IE_1A' value='16'/>
+      <enumerator name='IE_1B' value='17'/>
+      <enumerator name='IE_1C' value='18'/>
+      <enumerator name='IE_1D' value='19'/>
+      <enumerator name='IE_1E' value='20'/>
+      <enumerator name='IE_1F' value='21'/>
+      <enumerator name='IE_20' value='22'/>
+      <enumerator name='IE_21' value='23'/>
+      <enumerator name='IE_22' value='24'/>
+      <enumerator name='IE_23' value='25'/>
+      <enumerator name='IE_24' value='26'/>
+      <enumerator name='IE_25' value='27'/>
+      <enumerator name='IE_26' value='28'/>
+      <enumerator name='IE_27' value='29'/>
+      <enumerator name='IE_28' value='30'/>
+      <enumerator name='IE_29' value='31'/>
+      <enumerator name='IE_2A' value='32'/>
+      <enumerator name='IE_2B' value='33'/>
+      <enumerator name='IE_2C' value='34'/>
+      <enumerator name='IE_2D' value='35'/>
+      <enumerator name='IE_2E' value='36'/>
+      <enumerator name='IE_2F' value='37'/>
+    </enum-decl>
+    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='95e97e5e'/>
+    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='f0981eeb'/>
+    <var-decl name='foo' type-id='a6c2eddf' mangled-name='foo' visibility='default'/>
+    <var-decl name='bar' type-id='1ee696ca' mangled-name='bar' visibility='default'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-enum-symbol.c b/tests/data/test-read-ctf/test-enum-symbol.c
new file mode 100644
index 00000000..f7f99c67
--- /dev/null
+++ b/tests/data/test-read-ctf/test-enum-symbol.c
@@ -0,0 +1 @@ 
+enum {red1, green1, blue1} primary1;
diff --git a/tests/data/test-read-ctf/test-enum-symbol.o b/tests/data/test-read-ctf/test-enum-symbol.o
new file mode 100644
index 0000000000000000000000000000000000000000..eebd9ed01364c80627dcf56976b64d63ade4ec4a
GIT binary patch
literal 1312
zcmbtT&5qPC40e}c`4bXoIUpgV!i8Ny)9GB0_JAraum~Y;9Fa&mVWy%#qa>BKr+p0`
zhc|&&fD0!C_SWf?>~g}AWBc>xBzDu&7jItfL=kw2;2CTqj{<zy+4}jJo5Kyb4nMxm
z#>~N%0yFeUud?1k`yBNYmG+NW{aKd)9unWjyX@aYO9$+sqU;hUCeP?)1}md=lYy!_
zok7>wa@FW%Ts96irmUsuGf3BMty9&jK5dOGDxF$Wq*bY;Dp#_sl5S(2(XvjRw$7$Y
z>ExN4Ah=8l_i>1H)76RXYt>ew060E6I*j*^-@ZGDvxS(8dAyh}vJ5re*C!i|$Lq$)
z%Fo2#`!Ze~tFWi&3t?U&j(z_g4=v?q@cnm)-$CFu;1pTLy{W6@@5_&~0f7xUsn9wz
z*tPeZK5-yu8X%OlAaD}6v^DhwqG_EL*hpfXEIx6(YC5qoEq3pEf06&R_pqLNruQ(F
zd>TyraDERkN7!~U134eexizeRgbaGa|EeG7%sYkg6U4(kiJH@b@^dib8gett5H=qf
zgY%S$j|1G-dwYm^?@y`fBJcw4Ys9Xgjz2kXvgZ2mUNozz5G|~w{AaFz#pG+u^YwQp
hcsP4XedGH3%=3m}AL2i8{@YRV7Zcx)%)trk{{VTabvgh5

literal 0
HcmV?d00001

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
new file mode 100644
index 00000000..d128b5b1
--- /dev/null
+++ b/tests/data/test-read-ctf/test-enum-symbol.o.hash.abi
@@ -0,0 +1,16 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test-enum-symbol.o'>
+  <elf-variable-symbols>
+    <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'/>
+      <enumerator name='red1' value='0'/>
+      <enumerator name='green1' value='1'/>
+      <enumerator name='blue1' value='2'/>
+    </enum-decl>
+    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='f0981eeb'/>
+    <var-decl name='primary1' type-id='08f5ca17' mangled-name='primary1' visibility='default'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-enum.c b/tests/data/test-read-ctf/test-enum.c
new file mode 100644
index 00000000..aa60d727
--- /dev/null
+++ b/tests/data/test-read-ctf/test-enum.c
@@ -0,0 +1,8 @@ 
+/* Looked up item by item. */
+enum e { ENUMSAMPLE_1 = 0, ENUMSAMPLE_2 = 1 };
+
+/* Looked up via both sorts of iterator in turn.  */
+enum ie { IENUMSAMPLE_1 = -10, IENUMSAMPLE_2, IENUMSAMPLE_3 };
+
+enum e foo;
+enum ie bar;
diff --git a/tests/data/test-read-ctf/test-enum.o b/tests/data/test-read-ctf/test-enum.o
new file mode 100644
index 0000000000000000000000000000000000000000..03dba69405ee471f00be6e93fb727ee80e42618a
GIT binary patch
literal 1440
zcmb_cO>fgc5FMA$77!9WAR!?n!-W>G9h+M#A)_i(MQw$IDh>#hwX;bqVmq=oQgcA?
zYxn{D0{#LwZtxf20NlcxWH)hFg%cx9-prf#*4fF&yUxLr6~`eH4n3k}XIP?dE6X~b
zl`&nR%k<-GYcWZe5?V*ic}=Gae2@Hyyny6qoFHFnWR7d*IdSNn7La)kK8N{R+z_qu
z%thWqLNn8PsDDnU(;eV1;6Cs-@C6WIJPt|f933A%e|-4tpmP#7n~26mo%IXZb+bZI
zCTahSwAn>xW)F!Cy|Sc4R1^%#Tn5P`nFM7e(xD9MDh-BNB9g2xvY|H~)vA&r50tD`
z9dv~fv(f|E^-|TFcd{7geoC~rySwdf?j0R(xnbnD{k9vmqcB9eoAPudt1Op=62q<e
zRf)`gE`op!`*c1rXTs4v@AO~6^A>%d+M25%HWr`G{CTX|(7bt;LE?LQ`Z{Jy<kyp2
zi3F&sISx#v<f$T`_d<SB*W_a-cqwzfDEURHq>qbvwG!zY-S>;JKdMTsLrwV2{D-)S
zGk6E9)>*ODo7UdvZ48(*-(#bTO<|$!zl%Blj{fH7Su+;<*5m`AeI}1$enIrCq193d
z4RdW4H{yd9-fwVR8o$Bq2G^8+Hi9O3j`k_IHRR$?M(e+5zx}@KeXz{-@)7Hre9aBw
m5|Sz7zriGed3*QF548U}H;u5b#lMI1{BO1YRm01r?f(OkDUBQe

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test-enum.o.abi b/tests/data/test-read-ctf/test-enum.o.abi
new file mode 100644
index 00000000..88e6ad61
--- /dev/null
+++ b/tests/data/test-read-ctf/test-enum.o.abi
@@ -0,0 +1,24 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test-enum.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='bar' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <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'/>
+      <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'/>
+      <enumerator name='IENUMSAMPLE_1' value='-10'/>
+      <enumerator name='IENUMSAMPLE_2' value='-9'/>
+      <enumerator name='IENUMSAMPLE_3' value='-8'/>
+    </enum-decl>
+    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-4'/>
+    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='type-id-5'/>
+    <var-decl name='foo' type-id='type-id-2' mangled-name='foo' visibility='default'/>
+    <var-decl name='bar' type-id='type-id-3' mangled-name='bar' visibility='default'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test-struct-iteration.c b/tests/data/test-read-ctf/test-struct-iteration.c
new file mode 100644
index 00000000..7df67ada
--- /dev/null
+++ b/tests/data/test-read-ctf/test-struct-iteration.c
@@ -0,0 +1,28 @@ 
+#include <unistd.h>
+
+struct foo_t
+{
+  int foo;
+  size_t bar;
+  const char *baz;
+  struct foo_t *self;
+  union
+  {
+    double should_not_appear;
+    char *nor_should_this;
+  } named;
+  struct
+  {
+    long unnamed_sub_member;
+    union
+    {
+      double one_more_level;
+      long yes_really_one_more;
+    };
+  };
+  struct {};		/* Empty ones */
+  union {};
+  int after_the_end;
+};
+
+struct foo_t used;
diff --git a/tests/data/test-read-ctf/test-struct-iteration.o.abi b/tests/data/test-read-ctf/test-struct-iteration.o.abi
new file mode 100644
index 00000000..72e0bdc3
--- /dev/null
+++ b/tests/data/test-read-ctf/test-struct-iteration.o.abi
@@ -0,0 +1,96 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test-struct-iteration-ctf.o'>
+  <elf-variable-symbols>
+    <elf-symbol name='used' size='64' 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' alignment-in-bits='8' id='type-id-1'/>
+    <class-decl name='' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-2'/>
+    <class-decl name='' size-in-bits='128' alignment-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-3'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='unnamed_sub_member' type-id='type-id-4' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='' type-id='type-id-5' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='one_more_level' type-id='type-id-6' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='yes_really_one_more' type-id='type-id-4' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <class-decl name='foo_t' size-in-bits='512' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-7'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='foo' type-id='type-id-8' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='bar' type-id='type-id-9' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='128'>
+        <var-decl name='baz' type-id='type-id-10' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='192'>
+        <var-decl name='self' type-id='type-id-11' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='256'>
+        <var-decl name='named' type-id='type-id-12' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='' type-id='type-id-3' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='unnamed_sub_member' type-id='type-id-4' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='' type-id='type-id-5' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='one_more_level' type-id='type-id-6' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='yes_really_one_more' type-id='type-id-4' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='' type-id='type-id-2' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='' type-id='type-id-13' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='448'>
+        <var-decl name='after_the_end' type-id='type-id-8' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='double' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
+    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-8'/>
+    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-4'/>
+    <type-decl name='short int' size-in-bits='16' alignment-in-bits='16' id='type-id-14'/>
+    <type-decl name='signed char' size-in-bits='8' alignment-in-bits='8' id='type-id-15'/>
+    <typedef-decl name='size_t' type-id='type-id-16' id='type-id-9'/>
+    <union-decl name='' size-in-bits='64' is-anonymous='yes' visibility='default' id='type-id-12'>
+      <data-member access='public'>
+        <var-decl name='should_not_appear' type-id='type-id-6' visibility='default'/>
+      </data-member>
+      <data-member access='public'>
+        <var-decl name='nor_should_this' type-id='type-id-17' visibility='default'/>
+      </data-member>
+    </union-decl>
+    <union-decl name='' is-anonymous='yes' visibility='default' id='type-id-13'/>
+    <union-decl name='' size-in-bits='64' is-anonymous='yes' visibility='default' id='type-id-5'>
+      <data-member access='public'>
+        <var-decl name='one_more_level' type-id='type-id-6' visibility='default'/>
+      </data-member>
+      <data-member access='public'>
+        <var-decl name='yes_really_one_more' type-id='type-id-4' visibility='default'/>
+      </data-member>
+    </union-decl>
+    <type-decl name='unsigned char' size-in-bits='8' alignment-in-bits='8' id='type-id-18'/>
+    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='type-id-19'/>
+    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-16'/>
+    <type-decl name='unsigned short int' size-in-bits='16' alignment-in-bits='16' id='type-id-20'/>
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-17'/>
+    <qualified-type-def type-id='type-id-1' const='yes' id='type-id-21'/>
+    <pointer-type-def type-id='type-id-21' 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-11'/>
+    <var-decl name='used' type-id='type-id-7' mangled-name='used' visibility='default'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test0 b/tests/data/test-read-ctf/test0
new file mode 100755
index 0000000000000000000000000000000000000000..aca7fbacdfff7ad2caf0142390710373a8da72a1
GIT binary patch
literal 16656
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

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test0.abi b/tests/data/test-read-ctf/test0.abi
new file mode 100644
index 00000000..50ca26f4
--- /dev/null
+++ b/tests/data/test-read-ctf/test0.abi
@@ -0,0 +1,54 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test0'>
+  <elf-function-symbols>
+    <elf-symbol name='__libc_csu_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='__libc_csu_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='_start' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='foo_1' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='main' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <elf-symbol name='_IO_stdin_used' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='status' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='test_array' size='40' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='test_const' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='test_float' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='test_pointer' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='test_restrict' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <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'/>
+    <class-decl name='S' size-in-bits='32' alignment-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>
+    </class-decl>
+    <class-decl name='' size-in-bits='32' alignment-in-bits='8' is-struct='yes' is-anonymous='yes' visibility='default' id='type-id-5'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='status0' type-id='type-id-1' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1'>
+        <var-decl name='status1' type-id='type-id-1' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='float' size-in-bits='32' alignment-in-bits='32' id='type-id-6'/>
+    <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-7'>
+      <subrange length='10' type-id='type-id-8' id='type-id-9'/>
+    </array-type-def>
+    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-10'/>
+    <type-decl name='short int' size-in-bits='16' alignment-in-bits='16' id='type-id-11'/>
+    <type-decl name='signed char' size-in-bits='8' alignment-in-bits='8' id='type-id-12'/>
+    <type-decl name='unsigned char' size-in-bits='8' alignment-in-bits='8' id='type-id-13'/>
+    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='type-id-14'/>
+    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
+    <type-decl name='unsigned short int' size-in-bits='16' alignment-in-bits='16' id='type-id-15'/>
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' alignment-in-bits='64' id='type-id-16'/>
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-17'/>
+    <qualified-type-def type-id='type-id-3' const='yes' id='type-id-18'/>
+    <pointer-type-def type-id='type-id-10' size-in-bits='64' alignment-in-bits='64' id='type-id-19'/>
+    <qualified-type-def type-id='type-id-19' restrict='yes' id='type-id-20'/>
+    <qualified-type-def type-id='type-id-11' volatile='yes' id='type-id-21'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test0.c b/tests/data/test-read-ctf/test0.c
new file mode 100644
index 00000000..eb702312
--- /dev/null
+++ b/tests/data/test-read-ctf/test0.c
@@ -0,0 +1,32 @@ 
+
+#include <stdio.h>
+
+char* test_pointer = NULL;
+int test_array[10] = {0};
+volatile short test_volatile = 1;
+float test_float = 0.0;
+
+struct {
+  unsigned int status0 : 1;
+  unsigned int status1 : 1;
+} status;
+
+
+struct S
+{
+  int m0;
+};
+
+const struct S test_const;
+long* restrict test_restrict;
+
+int
+foo_1(struct S* s)
+{
+  return s->m0;
+}
+
+int main()
+{
+
+}
diff --git a/tests/data/test-read-ctf/test0.hash.abi b/tests/data/test-read-ctf/test0.hash.abi
new file mode 100644
index 00000000..b58520ab
--- /dev/null
+++ b/tests/data/test-read-ctf/test0.hash.abi
@@ -0,0 +1,54 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test0'>
+  <elf-function-symbols>
+    <elf-symbol name='__libc_csu_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='__libc_csu_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='_start' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='foo_1' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='main' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </elf-function-symbols>
+  <elf-variable-symbols>
+    <elf-symbol name='_IO_stdin_used' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='status' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='test_array' size='40' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='test_const' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='test_float' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='test_pointer' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='test_restrict' size='8' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <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'/>
+    <class-decl name='S' size-in-bits='32' alignment-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='e7f43f72'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='status0' type-id='811c9dc5' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1'>
+        <var-decl name='status1' type-id='811c9dc5' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <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'>
+      <subrange length='10' type-id='7359adad' id='487da03a'/>
+    </array-type-def>
+    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='bd54fe1a'/>
+    <type-decl name='short int' size-in-bits='16' alignment-in-bits='16' id='a2185560'/>
+    <type-decl name='signed char' size-in-bits='8' alignment-in-bits='8' id='28577a57'/>
+    <type-decl name='unsigned char' size-in-bits='8' alignment-in-bits='8' id='002ac4a6'/>
+    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='f0981eeb'/>
+    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='7359adad'/>
+    <type-decl name='unsigned short int' size-in-bits='16' alignment-in-bits='16' id='8efea9e5'/>
+    <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'/>
+    <pointer-type-def type-id='bd54fe1a' size-in-bits='64' alignment-in-bits='64' id='3ccc2590'/>
+    <qualified-type-def type-id='3ccc2590' restrict='yes' id='af4b1b38'/>
+    <qualified-type-def type-id='a2185560' volatile='yes' id='ec67e496'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test1.c b/tests/data/test-read-ctf/test1.c
new file mode 100644
index 00000000..3a5bac49
--- /dev/null
+++ b/tests/data/test-read-ctf/test1.c
@@ -0,0 +1,25 @@ 
+enum opaque_enum;
+struct opaque_struct;
+
+typedef enum opaque_enum opaque_enum;
+typedef struct opaque_struct opaque_struct;
+
+void
+fn(opaque_struct *, opaque_enum *e);
+
+enum opaque_enum
+{
+  e0,
+  e1
+};
+
+struct opaque_struct
+{
+  opaque_enum m0;
+};
+
+void
+fn(opaque_struct * s, opaque_enum *e)
+{
+  s->m0 = *e;
+}
diff --git a/tests/data/test-read-ctf/test1.so b/tests/data/test-read-ctf/test1.so
new file mode 100755
index 0000000000000000000000000000000000000000..df5ef8d38fa53081007cab96424e3d60b512751f
GIT binary patch
literal 15592
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
I@1C^(7v)NDpa1{>

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test1.so.abi b/tests/data/test-read-ctf/test1.so.abi
new file mode 100644
index 00000000..5b3caf63
--- /dev/null
+++ b/tests/data/test-read-ctf/test1.so.abi
@@ -0,0 +1,23 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test1.so'>
+  <elf-function-symbols>
+    <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'/>
+    <class-decl name='opaque_struct' size-in-bits='32' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-2'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='m0' type-id='type-id-3' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <enum-decl name='opaque_enum' linkage-name='opaque_enum' id='type-id-4'>
+      <underlying-type type-id='type-id-1'/>
+      <enumerator name='e0' value='0'/>
+      <enumerator name='e1' value='1'/>
+    </enum-decl>
+    <typedef-decl name='opaque_enum' type-id='type-id-4' id='type-id-3'/>
+    <typedef-decl name='opaque_struct' type-id='type-id-2' id='type-id-5'/>
+    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='type-id-6'/>
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
+    <pointer-type-def type-id='type-id-5' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test1.so.hash.abi b/tests/data/test-read-ctf/test1.so.hash.abi
new file mode 100644
index 00000000..8019cb54
--- /dev/null
+++ b/tests/data/test-read-ctf/test1.so.hash.abi
@@ -0,0 +1,23 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test1.so'>
+  <elf-function-symbols>
+    <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'/>
+    <class-decl name='opaque_struct' size-in-bits='32' alignment-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>
+    </class-decl>
+    <enum-decl name='opaque_enum' linkage-name='opaque_enum' id='55763a91'>
+      <underlying-type type-id='811c9dc5'/>
+      <enumerator name='e0' value='0'/>
+      <enumerator name='e1' value='1'/>
+    </enum-decl>
+    <typedef-decl name='opaque_enum' type-id='55763a91' id='99fcd3a5'/>
+    <typedef-decl name='opaque_struct' type-id='6cde5052' id='dae69ca1'/>
+    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='f0981eeb'/>
+    <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'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test2.c b/tests/data/test-read-ctf/test2.c
new file mode 100644
index 00000000..b04490a8
--- /dev/null
+++ b/tests/data/test-read-ctf/test2.c
@@ -0,0 +1,19 @@ 
+struct S0
+{
+  void* m0;
+};
+
+typedef const void* POINTER;
+
+struct S1
+{
+  POINTER m0;
+};
+
+void foo(struct S0* a __attribute__((unused)))
+{
+}
+
+void bar(struct S1* a __attribute__((unused)))
+{
+}
diff --git a/tests/data/test-read-ctf/test2.so b/tests/data/test-read-ctf/test2.so
new file mode 100755
index 0000000000000000000000000000000000000000..d9c07517527553d99951c2129da2f2ae6c1bce03
GIT binary patch
literal 15616
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
U6x%k4_vJZDAzn&WN_;y0Q+>X1e*gdg

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test2.so.abi b/tests/data/test-read-ctf/test2.so.abi
new file mode 100644
index 00000000..eb6aff3e
--- /dev/null
+++ b/tests/data/test-read-ctf/test2.so.abi
@@ -0,0 +1,25 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test2.so'>
+  <elf-function-symbols>
+    <elf-symbol name='bar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <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'>
+      <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'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='m0' type-id='type-id-4' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <typedef-decl name='POINTER' type-id='type-id-5' id='type-id-4'/>
+    <pointer-type-def type-id='type-id-1' size-in-bits='64' alignment-in-bits='64' id='type-id-6'/>
+    <pointer-type-def type-id='type-id-3' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
+    <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'/>
+    <type-decl name='void' id='type-id-8'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test2.so.hash.abi b/tests/data/test-read-ctf/test2.so.hash.abi
new file mode 100644
index 00000000..6e57333b
--- /dev/null
+++ b/tests/data/test-read-ctf/test2.so.hash.abi
@@ -0,0 +1,25 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test2.so'>
+  <elf-function-symbols>
+    <elf-symbol name='bar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <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'>
+      <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'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='m0' type-id='8a34a235' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <typedef-decl name='POINTER' type-id='6e97a70c' id='8a34a235'/>
+    <pointer-type-def type-id='109cd6fe' size-in-bits='64' alignment-in-bits='64' id='842ea234'/>
+    <pointer-type-def type-id='119cd891' size-in-bits='64' alignment-in-bits='64' id='5e30a4f9'/>
+    <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'/>
+    <type-decl name='void' id='48b5725f'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test3.so.abi b/tests/data/test-read-ctf/test3.so.abi
new file mode 100644
index 00000000..9d55fec5
--- /dev/null
+++ b/tests/data/test-read-ctf/test3.so.abi
@@ -0,0 +1,12 @@ 
+<abi-corpus version='2.1' path='data/test-read-common/test3.so'>
+  <elf-function-symbols>
+    <elf-symbol name='__foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='__foo__' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='foo' type='func-type' binding='weak-binding' visibility='default-visibility' alias='foo__,__foo__,__foo' is-defined='yes'/>
+    <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'>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test3.so.hash.abi b/tests/data/test-read-ctf/test3.so.hash.abi
new file mode 100644
index 00000000..9d55fec5
--- /dev/null
+++ b/tests/data/test-read-ctf/test3.so.hash.abi
@@ -0,0 +1,12 @@ 
+<abi-corpus version='2.1' path='data/test-read-common/test3.so'>
+  <elf-function-symbols>
+    <elf-symbol name='__foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='__foo__' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='foo' type='func-type' binding='weak-binding' visibility='default-visibility' alias='foo__,__foo__,__foo' is-defined='yes'/>
+    <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'>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test4.so.abi b/tests/data/test-read-ctf/test4.so.abi
new file mode 100644
index 00000000..b8e0ead3
--- /dev/null
+++ b/tests/data/test-read-ctf/test4.so.abi
@@ -0,0 +1,14 @@ 
+<abi-corpus version='2.1' path='data/test-read-common/test4.so'>
+  <elf-function-symbols>
+    <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'/>
+    <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'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test4.so.hash.abi b/tests/data/test-read-ctf/test4.so.hash.abi
new file mode 100644
index 00000000..dbe34d9c
--- /dev/null
+++ b/tests/data/test-read-ctf/test4.so.hash.abi
@@ -0,0 +1,14 @@ 
+<abi-corpus version='2.1' path='data/test-read-common/test4.so'>
+  <elf-function-symbols>
+    <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'/>
+    <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'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test5.c b/tests/data/test-read-ctf/test5.c
new file mode 100644
index 00000000..24ee3cab
--- /dev/null
+++ b/tests/data/test-read-ctf/test5.c
@@ -0,0 +1,41 @@ 
+// test function declaration passing const volatile modifier.
+long
+foo(char* c, const volatile long l);
+
+long
+foo(char* c, const volatile long l)
+{return *c + l;}
+
+// test function declaration passing variable arguments.
+void
+bar(const int c, ...)
+{}
+
+void
+baz(int c)
+{c = 0;}
+
+// test function declaration passing an enum type argument.
+enum E {e0, e1};
+
+void
+bar2(enum E e)
+{int c = e; ++c;}
+
+// test function declaration passing a typedef argument.
+typedef long long long_long;
+
+long_long
+baz2(int c)
+{c = 0; return c;}
+
+typedef const volatile unsigned long long useless_long_long;
+
+static useless_long_long
+this_should_not_be_seen_by_bidw()
+{
+  int i = 0;
+  bar(0);
+  baz2(i);
+  return 0;
+}
diff --git a/tests/data/test-read-ctf/test5.o b/tests/data/test-read-ctf/test5.o
new file mode 100644
index 0000000000000000000000000000000000000000..8af51bed7cf40123daadf2f7a60dc137fc8021ab
GIT binary patch
literal 2720
zcmbtWO^72!6t12fv#ah*kE;#?>!B5qjhfC6tcOK3GQ`bcbVV6h&?VcQ^d!;zjOmUh
z%MK2#3e7MO1VKb$j~+!(Joq!P$nJuNIf)lh55gYiFnXFpVEn#HRnqnZ1by)8z53pJ
zRj*&Ys^p!*%JVaZAv77{88Mk@R0!+%M9)h#FXqLZSS^Ns6vK^!V%Xg;ZWRv9uSC)O
zZWro)(b&CoL)x$H6~k{=4i68D;g=Vs`0%n6+ck)l@V#{@wtEoo?gW;ZENq&|7Y1f>
z^}3n7^tqYzcFbgR*GzVQGm{(pgWGc5aASD0Fk~`=(MI9M-d15REDWy|hQ=7vPFsax
z@uP7@3o7(`#(&M>4hJ}eH>D=A+c*CDb#{gZ(g!0k9+#kzGm2}d+%M4Y1)JbGZ~}Z1
zd^gw!hv2K=0=NgRgIREF^2jXYF))d7#2E)l&}M-b!Jxzm40*Ub%9#+4GtQRk*e3S?
zw0IW=PubKuT$+^QxvCr%Y18N2qIHx8rNP`0w0O@*5|jCBOvmxt@Ga7hIg&QzIL^yp
z4d^ouc^~+G@HQBfU}A{VWtd-(upDyqS7e`}QV?E7cv;bH`Sohct623`AR6sf)slmr
zl{kyw|8Ng#b-(1-+TBK_)M^JM*DLv+*DAUFl3TC5Ex3s5T*-;I+Vu*wPL5M5qZMgi
zYqv$Y1|(f;H@&pmcl+sf$0;|wwBISG8+F%l>s6=TNOjl!pyN5sbl~}cpRPE8Bh?hZ
zN~#>J$=O-EEX4Wc<#X1V^DnL@t!&QD*cmIA$z`)(>x|c1_d4~a*9x3Ql9f=$DtOcg
zL3xcGV)~p7HCOE<9$*m2xbm_vdJD$slgCdC;QSCUGRflb-2B4(Gs|;{SK)vuZBG*i
zUF4wcGp|So+Fv6M;?a)nE0g%E#6dC#9e-hB|72tq4^nFTOB4Gy%ASteUmw|(>4;z*
zX2qX}M+^XtjjJ@VvQDU>_(DN)FX$}xsffR&>?wuoxvUMatipNKNwOx8XTe-2BnZ;y
zaSl51PbDfwHK5LZVO#uLyRsG8o2o};v*v{OQLV?GV2=#()RKOR;5=WATMEZD<y9S1
zUTGS))ckS`*WbGt!}a%GkKy`zcVf7%zp(v&GjLqUpfi#+t#!PHV+UR@5H|0VuwCC5
zHtrIJc9WMx*tprAjf;`;1E>6knpaz0d%e@fRSNpTmdkjx(ptx9s@GB_^FM@zSoR*D
z^C;!j<o75DoxV{zjS0^z9|fV`;UR+f(?jA<4rBF`yF?K57?`+zPl=Hpj&C%AkL>>>
zaIX1Z<Jteyw$l6eqs=wN_bG+x@5EHn$10&GG@zv3OUq}0Ydz}vL;Qnc@!IzS6#lfu
z(iFE;d^|5*e;r?i!u{j%2P*z&?Wklt-UUAG{FhWi4OAS@pKq3q*XKWNZ-(r0QIOuB
je^Cg<<GJRvQhlcSkM)gGyw-g0rpBxM-;4%BkH`NFTJliI

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test5.o.abi b/tests/data/test-read-ctf/test5.o.abi
new file mode 100644
index 00000000..eb30cf6a
--- /dev/null
+++ b/tests/data/test-read-ctf/test5.o.abi
@@ -0,0 +1,50 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test5.o'>
+  <elf-function-symbols>
+    <elf-symbol name='bar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='bar2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='baz' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <elf-symbol name='baz2' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+    <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' alignment-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='long long unsigned int' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
+    <typedef-decl name='long_long' type-id='type-id-6' id='type-id-8'/>
+    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='type-id-9'/>
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-10'/>
+    <qualified-type-def type-id='type-id-4' const='yes' id='type-id-11'/>
+    <qualified-type-def type-id='type-id-5' const='yes' id='type-id-12'/>
+    <qualified-type-def type-id='type-id-12' volatile='yes' id='type-id-13'/>
+    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8'>
+      <parameter type-id='type-id-10'/>
+      <parameter type-id='type-id-13'/>
+      <return type-id='type-id-5'/>
+    </function-decl>
+    <function-decl name='baz2' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8'>
+      <parameter type-id='type-id-4'/>
+      <return type-id='type-id-8'/>
+    </function-decl>
+    <function-decl name='bar' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8'>
+      <parameter is-variadic='yes'/>
+      <return type-id='type-id-14'/>
+    </function-decl>
+    <function-decl name='bar2' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8'>
+      <parameter type-id='type-id-3'/>
+      <return type-id='type-id-14'/>
+    </function-decl>
+    <function-decl name='baz' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8'>
+      <parameter type-id='type-id-4'/>
+      <return type-id='type-id-14'/>
+    </function-decl>
+    <type-decl name='void' id='type-id-14'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test6.c b/tests/data/test-read-ctf/test6.c
new file mode 100644
index 00000000..706c34c0
--- /dev/null
+++ b/tests/data/test-read-ctf/test6.c
@@ -0,0 +1,35 @@ 
+struct b0
+{
+  long long m0;
+  char m1;
+};
+
+struct b1
+{
+  double m0;
+  char m1;
+};
+
+struct s0;
+
+typedef int integer;
+typedef unsigned char byte;
+typedef integer (*mem_fun)(struct s0 *);
+
+struct s0
+{
+
+  struct b0 b0;
+  struct b1 b1;
+
+  integer m0;
+  byte m1;
+  mem_fun f;
+};
+
+integer
+fun(struct s0 *s0)
+{
+  s0->f = fun;
+  return s0->m0 + s0->m1;
+}
diff --git a/tests/data/test-read-ctf/test6.o.abi b/tests/data/test-read-ctf/test6.o.abi
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/data/test-read-ctf/test7.c b/tests/data/test-read-ctf/test7.c
new file mode 100644
index 00000000..b9097987
--- /dev/null
+++ b/tests/data/test-read-ctf/test7.c
@@ -0,0 +1,8 @@ 
+#include "test7.h"
+
+void first_type_constructor(struct first_type *ft)
+{
+  ft->member0 = 0;
+  ft->member1 = 0;
+  ft->ctor = first_type_constructor;
+}
diff --git a/tests/data/test-read-ctf/test7.h b/tests/data/test-read-ctf/test7.h
new file mode 100644
index 00000000..1995736d
--- /dev/null
+++ b/tests/data/test-read-ctf/test7.h
@@ -0,0 +1,24 @@ 
+#include <stdlib.h>
+
+typedef int integer;
+typedef unsigned char character;
+struct first_type;
+
+void
+first_type_constructor(struct first_type *ft);
+
+typedef void (*constructor)();
+
+struct first_type
+{
+  integer member0;
+  character member1;
+  constructor ctor;
+};
+
+struct second_type
+{
+  integer member0;
+  character member1;
+  constructor ctor;
+};
diff --git a/tests/data/test-read-ctf/test7.o b/tests/data/test-read-ctf/test7.o
new file mode 100644
index 0000000000000000000000000000000000000000..43694a8678e8d156bab63889dc1209ee64462c4c
GIT binary patch
literal 2152
zcmbtV&ubG=5S~qA+F~1P6&34Y5s|hwo1}t@g07U>2%;bqd#Kdi&1<rl-Hp31+6dxJ
zEQ0jp*^7UGcMpY%y?F62@FeuAr`~jCGcVb!5kUuL-}lYWmziDieDT(ejHZDS4X#3u
zDJ#HUwuj9anvjQaSgve-t86~oue@5^-;M2rKABmdv$AWBka6q&&X2FzOzg+Uo&tPQ
zZBmLQUBw%mM?Hf03o2hIM?Mpk>?k?P(b0XJSdYUQ<{YmTQv3>Ys*5q1o6PBg6R4}q
z**{e8_iJIw|Ae`^-|G&arFw4|=kR>n!30U-pM{TO`3_G$^M{bV>sV&#PVZ5N08SGA
z(6Pf9o*z+l)N$0$s3z)RRGwR0`zZ2+<R^(V0>7rW{K&2OqN=;T1kyf3975I@bXhmX
zsaqjL^&ph}g}7$IO+{kbtJJN+twl|Qag60iM2`cv3QpihGHf|A2w~j~Be^EqO#z<p
zY!R0DEJMn_mP{+w15Xs~w%slUq2)A0F$$ex!?i8jtyylP&}w1}VR=O<A{iB{mb7A6
zKx4Jw$n}_AG#r4Xg@w!d^wRC+8NEDjl#G%-Uz#tMQT1uD(G;QU313=`na=C1<CG7e
zVgh79+oso5iN-vB2hgZiq&>Y0+Qx)7H8wo5h0asxBPGGI0N3*qFER_`xhe(_|ASE7
zEPVet$UUS!sDyJA@npgt_aZ+{g?@Z*{C(p+%{30<iLYl@bVl?Ekaoq0+Mcv*FmURf
zv#wAm8kQl&h6IDQ0EQh!VBiMu5qLCOF#JFY0|#1&q~$zhUh`W<GYoJ6vJFODM%35V
zL(3E0zW)hy%%_>EZ&#Hw8Fc5xT<ulGO(CHDo65ka$uGqT<}^pjRl8O8vusb!m{MGN
z43KpHIgFv2|C(RM+;mN9tNQQsE&2D@3!Gn~q=d}zh0Y~x1XV9}UQ5`Lq4&~1h@C1=
z#oj?MjGDS8tZ;t%UTXd-zlMNnrt@EN{v{R2XFA_T`=I@=4A}oD#;Sa^|3ST})i(Ek
mKm>*U63CR!r<xp!s3$u2*L$WIrRPU~DTDHxod4)A`M&@kYUQl}

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test7.o.abi b/tests/data/test-read-ctf/test7.o.abi
new file mode 100644
index 00000000..b744fac5
--- /dev/null
+++ b/tests/data/test-read-ctf/test7.o.abi
@@ -0,0 +1,42 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test7.o'>
+  <elf-function-symbols>
+    <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='char' size-in-bits='8' alignment-in-bits='8' 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'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='member0' type-id='type-id-3' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='32'>
+        <var-decl name='member1' type-id='type-id-4' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='64'>
+        <var-decl name='ctor' type-id='type-id-5' visibility='default'/>
+      </data-member>
+    </class-decl>
+    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-6'/>
+    <type-decl name='long int' size-in-bits='64' alignment-in-bits='64' id='type-id-7'/>
+    <type-decl name='long long int' size-in-bits='64' alignment-in-bits='64' id='type-id-8'/>
+    <type-decl name='long long unsigned int' size-in-bits='64' alignment-in-bits='64' id='type-id-9'/>
+    <type-decl name='short int' size-in-bits='16' alignment-in-bits='16' id='type-id-10'/>
+    <type-decl name='signed char' size-in-bits='8' alignment-in-bits='8' id='type-id-11'/>
+    <typedef-decl name='character' type-id='type-id-12' id='type-id-4'/>
+    <typedef-decl name='constructor' type-id='type-id-13' id='type-id-5'/>
+    <typedef-decl name='integer' type-id='type-id-6' id='type-id-3'/>
+    <type-decl name='unsigned char' size-in-bits='8' alignment-in-bits='8' id='type-id-12'/>
+    <type-decl name='unsigned int' size-in-bits='32' alignment-in-bits='32' id='type-id-14'/>
+    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-15'/>
+    <type-decl name='unsigned short int' size-in-bits='16' alignment-in-bits='16' id='type-id-16'/>
+    <pointer-type-def type-id='type-id-2' size-in-bits='64' alignment-in-bits='64' id='type-id-17'/>
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' alignment-in-bits='64' id='type-id-13'/>
+    <function-decl name='first_type_constructor' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8'>
+      <parameter type-id='type-id-17'/>
+      <return type-id='type-id-19'/>
+    </function-decl>
+    <function-type size-in-bits='64' alignment-in-bits='8' id='type-id-18'>
+      <return type-id='type-id-19'/>
+    </function-type>
+    <type-decl name='void' id='type-id-19'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test8.c b/tests/data/test-read-ctf/test8.c
new file mode 100644
index 00000000..67580f9a
--- /dev/null
+++ b/tests/data/test-read-ctf/test8.c
@@ -0,0 +1,7 @@ 
+// Test generic pointer type passed as argument in function.
+// Compile this by doing gcc -gctf -Wall -c test8.cc
+
+void
+bar(void*)
+{
+}
diff --git a/tests/data/test-read-ctf/test8.o b/tests/data/test-read-ctf/test8.o
new file mode 100644
index 0000000000000000000000000000000000000000..216142ed764b244f2172460e379934a835987470
GIT binary patch
literal 1496
zcmbtU!EVz)5S>j!TOg@Ig%DCXm=mcW>m(PV9#Bw3TLI#Llw$>JXWLk{<H+7t2@>Ll
z)LV}n`4kWz!if)n6E~P~cAaGvE-=!pXWq=4@y@RO?#c803S(e|!6R6D1_k&~S=#-=
z>_Z)DFg(2Yc6jmj=jG9tA786w(zRuFVO4P@-PGE{=Ma?$>!`XVnIueOw+LS=pmNzN
za?jIf1cAuFAE$}*gLyFb(@cc1^z$tA<0ue8bRwd-bvDgaCPm^anXB9%2_*`%h2W?a
zs^h}z@etr(Fxc~&2QP-ZUZ>03yzO<{-A)J9Ys%SFW>F$1O2oU1&3O1uS5T3F8)2Vl
zgGQM4%`9)~0DJQi*sQ^JY8#uE7`%fxDamzO9&a_?R|fU<eM}(#FG6*z@cq}S@R}K?
z6}*b}wuKkHC{9zM&C@JVJX%obV9L`Zfami>i2$D}TRg|cQgWt%(_n!Ic@7+hic6Z%
zw17`iB{|Nhl`9dRYX4+%#-~||GgWionT!RO<5$O-NF;UpZ`r{LG$V7POu@c3%KdAf
za&5Vb4q?vagJ*V<WxM=)7^Cz1SN;R!x;3et>HnD=OWfQJ#t3U$Ib_y!;(Z4<eDmDH
zxUucjhpWI9xla+>K>gzmq2JSd_r2V^9_X4bf2{fR1F^;BA7PNb$G)9}c0(7ut#SHM
z5!dhyPHo)YMER)uza|HT?h&1_%ct+nJ$r=8qV>XAF1l<9+(2s;zo}m;E;AQ~%l{23
CoNjCY

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test8.o.abi b/tests/data/test-read-ctf/test8.o.abi
new file mode 100644
index 00000000..68b3af06
--- /dev/null
+++ b/tests/data/test-read-ctf/test8.o.abi
@@ -0,0 +1,13 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test8.o'>
+  <elf-function-symbols>
+    <elf-symbol name='bar' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
+  </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'>
+      <parameter type-id='type-id-2'/>
+      <return type-id='type-id-1'/>
+    </function-decl>
+    <type-decl name='void' id='type-id-1'/>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-ctf/test9.c b/tests/data/test-read-ctf/test9.c
new file mode 100644
index 00000000..eb318b37
--- /dev/null
+++ b/tests/data/test-read-ctf/test9.c
@@ -0,0 +1,13 @@ 
+// test arrays type definitions
+struct S
+{
+  int a[5];
+  char *b[7];
+  double c[5][3];
+  int *(*d[10])[4];
+  char e[1];
+};
+
+int foo(struct S*)
+{
+}
diff --git a/tests/data/test-read-ctf/test9.o b/tests/data/test-read-ctf/test9.o
new file mode 100644
index 0000000000000000000000000000000000000000..fc3a358103c0708acc1e2868612e665ae04c1c15
GIT binary patch
literal 1864
zcmbtU&2G~`5FWQB4gCqBLI@}a!-ZBQc2X|T0}6_0D?l7TJyu{l+a$uVBYPt?h@YO2
zdh3w~;J{;4;w89o;sM~q4d&bIlC3Ec5}!2Q`TJ(PvtGZw|7df{amc`-yEL(km#925
z(VI$b(jqO;&i3Kg?ZekUj&?tN|1vXWl5QDAuV6#UT3&IFH>_7#d=|7kLv+Pu<udC4
z@?Dl=mRXinmILlE$LktPvqV(kwZ?MHh0pOi&B7>Yt^*!y^ld^LV+jjh7Wv$lmRT4j
zya(s%GE_lKLvgsJ3Zm}yabQl@Mma#`!DnhKulAqSe$#->iXpPDxbr#(d(fyX7)|Fa
zvW*&;g@)qdec{JG^jt5Z{&^M)6~yT&^%6;OnsnS@lJ`1^XuI$P6m^4)LTabOFcuV1
zn*{BpDf!*BFZ^&6j{GzWqFDHO7Wr{648mR~=*6|+AeWg4`o0vo%>8yC1Etp3*{(%$
zPg!@oh-j<T+HhC49`CHWjdic?)!p^_dZWSOu894C$a;N|$RNhCPd)~0kU4yK&apKh
z-tgE~8{?b{ATgYmPsrJ?I?D^Q<s%MWWgi5<py^(v`fjSVSlZ+S*na`)&d|4?r-i50
zxKBoK&`XwI^+E~;gZ*Qi3>Oau4$1luh`fB%mqEy@%*JciXj1G;@-SQS!aOIB=gN<?
zkAabwq*8c1qgpP5=!LdB$<P~QDUVf-$jd|=c%u7kFAMrY_5a@oE)Zsf3u2?Gjo<s%
zHgauTV*@_xVyN&#JIT_E{2LrIm(EI~f92m~Qn4oL7`}JnaQ@6~Xnq|e3nR^2vwToZ
zFSBk~K0Eb8p|6P<p0OXWf}c_`{iAji->dkohs;IIBLA~?+~$~#B7c{IxQ|UciS+}0
zpqI2CKP+$!-}q1K4N6t>pTl6xv%pp4n;$E3Yz#CXKTI3N`QZntQ|&Z*ubuG;@8tZ9
F`xjz3gGK-V

literal 0
HcmV?d00001

diff --git a/tests/data/test-read-ctf/test9.o.abi b/tests/data/test-read-ctf/test9.o.abi
new file mode 100644
index 00000000..746dd77b
--- /dev/null
+++ b/tests/data/test-read-ctf/test9.o.abi
@@ -0,0 +1,57 @@ 
+<abi-corpus version='2.1' path='data/test-read-ctf/test9.o'>
+  <elf-function-symbols>
+    <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'/>
+    <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'>
+      <subrange length='infinite' type-id='type-id-4' id='type-id-7'/>
+    </array-type-def>
+    <class-decl name='S' size-in-bits='2304' alignment-in-bits='32' is-struct='yes' visibility='default' id='type-id-8'>
+      <data-member access='public' layout-offset-in-bits='0'>
+        <var-decl name='a' type-id='type-id-9' 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-10' visibility='default'/>
+      </data-member>
+      <data-member access='public' layout-offset-in-bits='1600'>
+        <var-decl name='d' type-id='type-id-11' 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='double' size-in-bits='64' alignment-in-bits='64' id='type-id-12'/>
+    <array-type-def dimensions='1' type-id='type-id-12' size-in-bits='320' alignment-in-bits='64' id='type-id-13'>
+      <subrange length='5' type-id='type-id-4' id='type-id-14'/>
+    </array-type-def>
+    <array-type-def dimensions='1' type-id='type-id-13' size-in-bits='960' alignment-in-bits='64' id='type-id-10'>
+      <subrange length='3' type-id='type-id-4' id='type-id-15'/>
+    </array-type-def>
+    <type-decl name='int' size-in-bits='32' alignment-in-bits='32' id='type-id-16'/>
+    <array-type-def dimensions='1' type-id='type-id-17' size-in-bits='256' alignment-in-bits='64' id='type-id-18'>
+      <subrange length='4' type-id='type-id-4' id='type-id-19'/>
+    </array-type-def>
+    <array-type-def dimensions='1' type-id='type-id-20' size-in-bits='640' alignment-in-bits='64' id='type-id-11'>
+      <subrange length='10' type-id='type-id-4' id='type-id-21'/>
+    </array-type-def>
+    <array-type-def dimensions='1' type-id='type-id-16' size-in-bits='160' alignment-in-bits='32' id='type-id-9'>
+      <subrange length='5' type-id='type-id-4' id='type-id-14'/>
+    </array-type-def>
+    <type-decl name='unsigned long int' size-in-bits='64' alignment-in-bits='64' id='type-id-4'/>
+    <pointer-type-def type-id='type-id-8' 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-16' size-in-bits='64' alignment-in-bits='64' id='type-id-17'/>
+    <pointer-type-def type-id='type-id-18' size-in-bits='64' alignment-in-bits='64' id='type-id-20'/>
+    <function-decl name='foo' visibility='default' binding='global' size-in-bits='64' alignment-in-bits='8'>
+      <parameter type-id='type-id-22'/>
+      <return type-id='type-id-16'/>
+    </function-decl>
+  </abi-instr>
+</abi-corpus>
diff --git a/tests/data/test-read-dwarf/PR26261/PR26261-exe b/tests/data/test-read-dwarf/PR26261/PR26261-exe
deleted file mode 100755
index 564a4247643942bbfd91c0e75653dffe80ce5851..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 10976
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

diff --git a/tests/data/test-read-dwarf/PR26261/PR26261-exe.abi b/tests/data/test-read-dwarf/PR26261/PR26261-exe.abi
index a24f3a44..d393317a 100644
--- a/tests/data/test-read-dwarf/PR26261/PR26261-exe.abi
+++ b/tests/data/test-read-dwarf/PR26261/PR26261-exe.abi
@@ -1,12 +1,10 @@ 
-<abi-corpus version='2.1' path='data/test-read-dwarf/PR26261/PR26261-exe'>
+<abi-corpus version='2.1' path='data/test-read-common/PR26261/PR26261-exe'>
   <elf-needed>
     <dependency name='libc.so.6'/>
   </elf-needed>
   <elf-function-symbols>
     <elf-symbol name='__libc_csu_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='__libc_csu_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='_fini' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
-    <elf-symbol name='_init' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='_start' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='fun_obja' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='fun_objb' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
@@ -16,18 +14,18 @@ 
   <elf-variable-symbols>
     <elf-symbol name='_IO_stdin_used' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-variable-symbols>
-  <abi-instr address-size='64' path='PR26261-main.c' comp-dir-path='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261' language='LANG_C89'>
+  <abi-instr address-size='64' path='PR26261-main.c' comp-dir-path='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261' language='LANG_C11'>
     <pointer-type-def type-id='type-id-1' size-in-bits='64' id='type-id-2'/>
     <pointer-type-def type-id='type-id-2' size-in-bits='64' id='type-id-3'/>
-    <function-decl name='wrapped_call' mangled-name='wrapped_call' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-main.c' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='wrapped_call'>
-      <parameter type-id='type-id-4' name='fun' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-main.c' line='18' column='1'/>
-      <parameter type-id='type-id-5' name='a' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-main.c' line='19' column='1'/>
-      <parameter type-id='type-id-5' name='b' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-main.c' line='20' column='1'/>
+    <function-decl name='wrapped_call' mangled-name='wrapped_call' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-main.c' line='18' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='wrapped_call'>
+      <parameter type-id='type-id-4' name='fun' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-main.c' line='18' column='1'/>
+      <parameter type-id='type-id-5' name='a' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-main.c' line='19' column='1'/>
+      <parameter type-id='type-id-5' name='b' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-main.c' line='20' column='1'/>
       <return type-id='type-id-6'/>
     </function-decl>
-    <function-decl name='main' mangled-name='main' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-main.c' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='main'>
-      <parameter type-id='type-id-5' name='argc' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-main.c' line='27' column='1'/>
-      <parameter type-id='type-id-3' name='argv' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-main.c' line='27' column='1'/>
+    <function-decl name='main' mangled-name='main' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-main.c' line='27' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='main'>
+      <parameter type-id='type-id-5' name='argc' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-main.c' line='27' column='1'/>
+      <parameter type-id='type-id-3' name='argv' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-main.c' line='27' column='1'/>
       <return type-id='type-id-5'/>
     </function-decl>
     <function-type size-in-bits='64' id='type-id-7'>
@@ -36,44 +34,44 @@ 
       <return type-id='type-id-6'/>
     </function-type>
   </abi-instr>
-  <abi-instr address-size='64' path='PR26261-obja.c' comp-dir-path='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261' language='LANG_C89'>
+  <abi-instr address-size='64' path='PR26261-obja.c' comp-dir-path='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261' language='LANG_C11'>
     <type-decl name='int' size-in-bits='32' id='type-id-5'/>
-    <typedef-decl name='fn_ptr_type_a_t' type-id='type-id-4' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-obja.h' line='1' column='1' id='type-id-8'/>
-    <typedef-decl name='fn_ptr_type_a2_t' type-id='type-id-4' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-obja.h' line='3' column='1' id='type-id-9'/>
-    <class-decl name='SA' size-in-bits='192' is-struct='yes' visibility='default' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-obja.h' line='5' column='1' id='type-id-10'>
+    <typedef-decl name='fn_ptr_type_a_t' type-id='type-id-4' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-obja.h' line='1' column='1' id='type-id-8'/>
+    <typedef-decl name='fn_ptr_type_a2_t' type-id='type-id-4' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-obja.h' line='3' column='1' id='type-id-9'/>
+    <class-decl name='SA' size-in-bits='192' is-struct='yes' visibility='default' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-obja.h' line='5' column='1' id='type-id-10'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='m1' type-id='type-id-5' visibility='default' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-obja.h' line='7' column='1'/>
+        <var-decl name='m1' type-id='type-id-5' visibility='default' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-obja.h' line='7' column='1'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='64'>
-        <var-decl name='m2' type-id='type-id-8' visibility='default' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-obja.h' line='8' column='1'/>
+        <var-decl name='m2' type-id='type-id-8' visibility='default' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-obja.h' line='8' column='1'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='128'>
-        <var-decl name='m3' type-id='type-id-9' visibility='default' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-obja.h' line='9' column='1'/>
+        <var-decl name='m3' type-id='type-id-9' visibility='default' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-obja.h' line='9' column='1'/>
       </data-member>
     </class-decl>
     <pointer-type-def type-id='type-id-10' size-in-bits='64' id='type-id-11'/>
     <pointer-type-def type-id='type-id-7' size-in-bits='64' id='type-id-4'/>
-    <function-decl name='fun_obja' mangled-name='fun_obja' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-obja.c' line='4' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fun_obja'>
-      <parameter type-id='type-id-11' name='s' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-obja.c' line='4' column='1'/>
+    <function-decl name='fun_obja' mangled-name='fun_obja' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-obja.c' line='4' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fun_obja'>
+      <parameter type-id='type-id-11' name='s' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-obja.c' line='4' column='1'/>
       <return type-id='type-id-6'/>
     </function-decl>
     <type-decl name='void' id='type-id-6'/>
   </abi-instr>
-  <abi-instr address-size='64' path='PR26261-objb.c' comp-dir-path='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261' language='LANG_C89'>
+  <abi-instr address-size='64' path='PR26261-objb.c' comp-dir-path='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261' language='LANG_C11'>
     <type-decl name='char' size-in-bits='8' id='type-id-1'/>
-    <typedef-decl name='fn_ptr_type_b_t' type-id='type-id-12' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-objb.h' line='1' column='1' id='type-id-13'/>
-    <class-decl name='SB' size-in-bits='128' is-struct='yes' visibility='default' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-objb.h' line='3' column='1' id='type-id-14'>
+    <typedef-decl name='fn_ptr_type_b_t' type-id='type-id-12' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-objb.h' line='1' column='1' id='type-id-13'/>
+    <class-decl name='SB' size-in-bits='128' is-struct='yes' visibility='default' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-objb.h' line='3' column='1' id='type-id-14'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='m1' type-id='type-id-5' visibility='default' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-objb.h' line='5' column='1'/>
+        <var-decl name='m1' type-id='type-id-5' visibility='default' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-objb.h' line='5' column='1'/>
       </data-member>
       <data-member access='public' layout-offset-in-bits='64'>
-        <var-decl name='m2' type-id='type-id-13' visibility='default' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-objb.h' line='6' column='1'/>
+        <var-decl name='m2' type-id='type-id-13' visibility='default' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-objb.h' line='6' column='1'/>
       </data-member>
     </class-decl>
     <pointer-type-def type-id='type-id-14' size-in-bits='64' id='type-id-15'/>
     <pointer-type-def type-id='type-id-16' size-in-bits='64' id='type-id-12'/>
-    <function-decl name='fun_objb' mangled-name='fun_objb' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-objb.c' line='4' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fun_objb'>
-      <parameter type-id='type-id-15' name='s' filepath='/home/dodji/git/libabigail/patches/tests/data/test-read-dwarf/PR26261/PR26261-objb.c' line='4' column='1'/>
+    <function-decl name='fun_objb' mangled-name='fun_objb' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-objb.c' line='4' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fun_objb'>
+      <parameter type-id='type-id-15' name='s' filepath='/home/byby/oracle/src/libabigail-upstream/tests/data/test-read-common/PR26261/PR26261-objb.c' line='4' column='1'/>
       <return type-id='type-id-6'/>
     </function-decl>
     <function-type size-in-bits='64' id='type-id-16'>
diff --git a/tests/data/test-read-dwarf/PR27700/test-PR27700.abi b/tests/data/test-read-dwarf/PR27700/test-PR27700.abi
index e593f79f..043ae0ca 100644
--- a/tests/data/test-read-dwarf/PR27700/test-PR27700.abi
+++ b/tests/data/test-read-dwarf/PR27700/test-PR27700.abi
@@ -1,15 +1,15 @@ 
-<abi-corpus version='2.1' path='data/test-read-dwarf/PR27700/test-PR27700.o'>
+<abi-corpus version='2.1' path='data/test-read-common/PR27700/test-PR27700.o'>
   <elf-function-symbols>
     <elf-symbol name='foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
-  <abi-instr address-size='64' path='test-PR27700.c' comp-dir-path='/home/dodji/git/libabigail/PR27700/tests/data/test-read-dwarf/PR27700' language='LANG_C11'>
+  <abi-instr address-size='64' path='tests/data/test-read-common/PR27700/test-PR27700.c' comp-dir-path='/home/byby/oracle/src/libabigail-upstream' language='LANG_C11'>
     <type-decl name='unnamed-enum-underlying-type-32' is-anonymous='yes' size-in-bits='32' alignment-in-bits='32' id='9cac1fee'/>
-    <enum-decl name='foo' filepath='include-dir/priv.h' line='1' column='1' id='022218d8'>
+    <enum-decl name='foo' filepath='tests/data/test-read-common/PR27700/include-dir/priv.h' line='1' column='1' id='022218d8'>
       <underlying-type type-id='9cac1fee'/>
     </enum-decl>
     <pointer-type-def type-id='022218d8' size-in-bits='64' id='8750e847'/>
-    <function-decl name='foo' mangled-name='foo' filepath='/home/dodji/git/libabigail/PR27700/tests/data/test-read-dwarf/PR27700/test-PR27700.c' line='4' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
-      <parameter type-id='8750e847' name='c' filepath='/home/dodji/git/libabigail/PR27700/tests/data/test-read-dwarf/PR27700/test-PR27700.c' line='4' column='1'/>
+    <function-decl name='foo' mangled-name='foo' filepath='tests/data/test-read-common/PR27700/test-PR27700.c' line='6' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
+      <parameter type-id='8750e847' name='c' filepath='tests/data/test-read-common/PR27700/test-PR27700.c' line='6' column='1'/>
       <return type-id='48b5725f'/>
     </function-decl>
     <type-decl name='void' id='48b5725f'/>
diff --git a/tests/data/test-read-dwarf/PR27700/test-PR27700.o b/tests/data/test-read-dwarf/PR27700/test-PR27700.o
deleted file mode 100644
index 3f084d2132f0f43a683769ea91e9733fc599700a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3248
zcmb_e&2Jl35TCbe$1dAAAFfJ6in1V}DZ*<zg{A~0xCHVczM`N=Ac3s4_t{>s*VTGc
zLJ^`85>f>cL2!d365@u0#6N(zapR7-AaUhZi37~+&T}@e8x;Yg_|433X5P%3_py2Z
zxfeDJAwZFUH8|1~3h-^=NN&Vp1I|Dh_O@>Qwsq^h+lO!b@Cm|s5Jj>YG~7=^nyi#!
zc7{VJ<X%I_5EI0bwDFh}WW=%wxm=t)PZ1(Fu1?J+zWf-YC)#M6BFXr)2Zf@85{N}G
zOXtzim=O<`%9gn>zc3?a3)A-km^on<*DTB0F0WWmSx;J`43K*WENjg&OSlwAJUwR?
z6WfJ33TvFZF-Kk#c~FM!vT+WeFoj{;Xo1J507?yUA7Y6HRqPmG;br7`^u2^!2=QlW
zk{GQKe<&;@lc8>)JY}MgB9RwxYV2|L1H;6a{b1yG1L@g*5W(h4d-i&L*{;`}np3lv
zYD;zcvln;KVatu!P^n$CD}!i1kgHu8$k1=2>W1y!>cN%EmCKLYl`dfWoAOe^Y6+_+
zYzeBp;Xqcsq4%a=?fOx*@3-8R-*x?db!T^JdAU}rMsgI5s-7FUu~-SE>s7qB-LRuv
zfLto<@3jA?N&TSR-}hw2^Fuv>mhW2VUw3){o9pW<_9Axf;y-8`@5UMC;>IqBgK05;
zx==jCEj*7n{fOc-aJ4l3p|L(Wv4IW=oH^17$iW|fWf^gkvtTg!<mpBeEm?#&D+@;N
zi4*YDBarei;Z#aH63r7%y$Pp}oKlhrc<nOCgsBV^Z!k>Wflnhco9fT_-f4SHZwZmw
zgL_a;uUgGaIIT|UvnUf0PQMLOkj^G-jI#>&u|PXEzNjca$~euTY9Q!p3a7kH);Bf0
z!}^OFK4AS74S$vO*EO6~z+)eiUZ?5_)tP4>V$^3M-T%P^9`|97^+z=P3)X8I{x$1Q
zX!!T6uW0y>tUt?Kug7MbdY|q;IHPw4k=sHZg$eH|DUt^fIP_A1(;AJy31#1PJlWds
zHvOP8L|ZJotyU<nA2Yk58+7IIkiH*C6@n?0NN_XO+rz;?;#=(m!$>;#?o>vR+kT5D
zmc3>tbO(|b@*mke##4{fzN+aOER639>*SlJ2T&nQe^H)KJEdej{sP+Qy#L$yI>zdA
zQaY9YGg4Bd`_lKBUcE-jCl>i|+Z-^1Ao;1gi68lxR&mtlB*QPU6(D4;nC`oS1|1{c
z9R}5XI4PdinN`2d8>-@|etNC-`aQ(5^50}oy&LEjlkQ9JQC9vP&VR^pl%L)&J^wYt
zXiilpiZT7ni6R9sSNRox7xAq4O}^Ye-6j5`6XMH!AggzY|D5ABH+V)r(Cnb<R{q~`
z{IRzPu`Q0jq8yp4{weq?6tepNEB9ZWQ|do`HC4RAsUAHyLU5Dw_qbsC&e7LckEcD&
eTI%mq6q5QsDADdbYgAWO{B5rPI~B-W@891PcJreE

diff --git a/tests/data/test-read-dwarf/test-PR26568-1.o b/tests/data/test-read-dwarf/test-PR26568-1.o
deleted file mode 100644
index 9249e16d4d52b4556b1cf071cc504d2a71204619..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2864
zcmbtV&2Jl35TCctADe9KIx)~j;jl<lZKUoxNfTp=Qd~lbD^L|h>IJDv*Y?_8u-Dak
z11<=0pddwnR3s!oLU4csHxLI7TtMOg{{VkN&xl(k4luL(p1pqAs8V^7-^~1GelzpF
z*6&_@<t2?Vkb}Wxm|7AAxSgBo^+>Hl8J6Hi<LG|l=$!|R53fG>J;F(A{H*75*$mfM
z<EV7=w;$1wiJW?r`&faqku#pO4C8fF`50J+6y#>Io*#myv)rp_@;kutqyS{~EQy@X
zv=C+9qG^{P{R-%ey^q?QLpIEJ4t-z?k&crr$-ev^EyF<<DcUDJSkNgKutj#ZST=ZZ
zrMSqJ@}<-0Ei=QoWISiEGPY3wu9I=CTr;rAr@=5T8(hb(gj&STPA3@o0$f9)US?dM
z=9wduGR)iT`Q<p}xn(L@Kl9lO%T&t9PD*KK02WSRDar&FsAXyvuxw(;)g_=veGz93
z&f(11Kg9yh(b?mHFbLgIXzlH9RJW=%Yu#?e+_^YC8r)#-eXW-@4OzR_Z<ssgrd_kQ
z%#F46t+ndLMf3c=+cq0c7~|H(XID*Y5FYyOcGvaYz-yuD1g+loxK_2Qo2J!;N^dxD
zEA3(XHLue3!b;z3I!&+Zc>PMp8@r<lH8rZVozRI?D{!5*)qc|nI?x~bU6by`@y2&|
zb}pIcvB}kk_ZTnpu~-0mYaiIS#8wva`aRs1ClRL~jc8M^6iXjyJB8dW42a>>8L4>X
z|Nb}4$x~k#Zm>8?mBZ1KHn@0Hs*gkBu_l}x@(F9Ia+sSM35^3@%9O#Okb+YGc;Qn9
zhsmp(c$ZLHO6<er!X7(JdbaqE1am&26C^Veo?OKuIdMq*<Jg49g_L+h*vmrFxlL|7
z>Z<~$_~d!tOyE@auCPB6Qq7a>KPzHLlun4>JOMWaPCX|31bcL65IRkiVGzrn)IxV0
zf=zD-?B-|$cHs6MyX`g)y9b`%8KN)Jon|v|-<WYbf#Y}GSxVpYT}i<bV7G>Yfs60Z
z_J^Ts<Eyhqq0@R@ByxKPoxmBmqVfMJR*+A7EB8~Ts|#gvkAzLJ$?+5#gsCs;r1n%k
zeLCqLJSu-()JHKhWc{CJ(74wmL?3+mE3GF%)W3`WU*T7Q)4d`{-dX(Dh{iU~>YB*0
zBEWB>sOhA}?x9P?DEb!xu1%?trpCUEXj=chY)q7V>Yu(=YX5D-)SSfpOMneB5<`tW
zKwnz@&qaN?PgI}YwOao+Vw6+%iE1>S5s&dJ2?#0cOZhh9Y5YG0-+l=HuHY+Sz|{*W
z0%Tno|ApYsd^-@+1-~W(g_P@;@TaJx?cWb6`$zu<k}vm_`cZ3B?z*VICmN>jH~q_~
hd^(e~rQV~aa6A!<$*iuQ@}}|s5dD8MVaAHe{|}8}$8i7v

diff --git a/tests/data/test-read-dwarf/test-PR26568-1.o.abi b/tests/data/test-read-dwarf/test-PR26568-1.o.abi
index 5c891200..1056dc9a 100644
--- a/tests/data/test-read-dwarf/test-PR26568-1.o.abi
+++ b/tests/data/test-read-dwarf/test-PR26568-1.o.abi
@@ -1,16 +1,16 @@ 
-<abi-corpus version='2.1' path='data/test-read-dwarf/test-PR26568-1.o'>
+<abi-corpus version='2.1' path='data/test-read-common/test-PR26568-1.o'>
   <elf-function-symbols>
     <elf-symbol name='fun' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
-  <abi-instr address-size='64' path='test-PR26568-1.c' comp-dir-path='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf' language='LANG_C89'>
+  <abi-instr address-size='64' path='tests/data/test-read-common/test-PR26568-1.c' comp-dir-path='/home/byby/oracle/src/libabigail-upstream' language='LANG_C11'>
     <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' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-1.c' line='1' column='1' id='type-id-3'>
+    <class-decl name='A' size-in-bits='64' is-struct='yes' visibility='default' filepath='tests/data/test-read-common/test-PR26568-1.c' line='4' column='1' 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>
-    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-1.c' line='2' column='1' id='type-id-4'>
+    <union-decl name='__anonymous_union__' size-in-bits='64' is-anonymous='yes' visibility='default' filepath='tests/data/test-read-common/test-PR26568-1.c' line='5' column='1' id='type-id-4'>
       <data-member access='public'>
         <var-decl name='' type-id='type-id-5' visibility='default'/>
       </data-member>
@@ -18,19 +18,19 @@ 
         <var-decl name='' type-id='type-id-6' visibility='default'/>
       </data-member>
     </union-decl>
-    <class-decl name='__anonymous_struct__' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-1.c' line='3' column='1' id='type-id-5'>
+    <class-decl name='__anonymous_struct__' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='tests/data/test-read-common/test-PR26568-1.c' line='6' column='1' id='type-id-5'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='x' type-id='type-id-1' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-1.c' line='4' column='1'/>
+        <var-decl name='x' type-id='type-id-1' visibility='default' filepath='tests/data/test-read-common/test-PR26568-1.c' line='7' column='1'/>
       </data-member>
     </class-decl>
-    <class-decl name='__anonymous_struct__1' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-1.c' line='6' column='1' id='type-id-6'>
+    <class-decl name='__anonymous_struct__1' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='tests/data/test-read-common/test-PR26568-1.c' line='9' column='1' id='type-id-6'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='y' type-id='type-id-2' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-1.c' line='7' column='1'/>
+        <var-decl name='y' type-id='type-id-2' visibility='default' filepath='tests/data/test-read-common/test-PR26568-1.c' line='10' column='1'/>
       </data-member>
     </class-decl>
     <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-7'/>
-    <function-decl name='fun' mangled-name='fun' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-1.c' line='12' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fun'>
-      <parameter type-id='type-id-7' name='a' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-1.c' line='12' column='1'/>
+    <function-decl name='fun' mangled-name='fun' filepath='tests/data/test-read-common/test-PR26568-1.c' line='15' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fun'>
+      <parameter type-id='type-id-7' name='a' filepath='tests/data/test-read-common/test-PR26568-1.c' line='15' column='1'/>
       <return type-id='type-id-8'/>
     </function-decl>
     <type-decl name='void' id='type-id-8'/>
diff --git a/tests/data/test-read-dwarf/test-PR26568-2.o b/tests/data/test-read-dwarf/test-PR26568-2.o
deleted file mode 100644
index cc94708c9cb10e2f0f5e51aed7e7a713767caaf8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 2824
zcmbtVQHvW@6h3!mlT3CtF`KB}WqlaI(k^r++wE?Mm9433-4sh%7W$x2)=6@cj3$#Z
znXRc(6clk0L_rZnw9p4%efCN4q2P}YU-|=lEBK)2%-owy?oKJ_fw}kG@0{<PbMM?U
z^TCyCuW5{d6b6@Iwvs47Gdt58k=lR?l;KA6_+j(-?xW^sR~|ixaMGH;7`bd_LDyLG
zxODTk`)F8*j7AjuM1s?iF&?x9rZrI2C%|-4kh_ra{17yQW!}W4eg{~V6o8D8p(%SA
z490Gwma}QtBhcs``M?%QC6PJU_xEs>chN+O_GKRy4Hq?F%j|TqV(P`U;xa4eN~h3T
zVWxS}e92@L%v%86pvBcn-NdS10Moo=>IRk})FPI0is{CTlPkbgq#6!;c{L`VS*75O
zm2X~IrJ(uDG^n-$u=o@PB?g?M;;1aZ1PPJ*NI;SLDvlbQ!I81Qiv=8`*NSJ&AmroF
z-apu^ZP)7drqhnO`8Yf-^gR3MN28)?$U5P>cm0O7Yi&7oXWQD`IKRD7+q__%J>VUy
z>4q_GUwCodvWMZ3&v$y<=YiM8r5m*SJCl0Nu5DR%532pqkXJjS&f8wK=Y`dQ*K%84
z&-Dh?t~cT1DrFv5J8tMksvU5*V|U(lgDwn4e$S#i0DHT;7p=2c)B2N3!ks-GZxz^k
z2f!vJwziZrzQ8ki4sm)&q7%JbEPbNw7P4=lLky>mNX4uC*FR}SJ+*W2bj5pAIXYU>
zL>JAX+H^=XVZx|GF0q=aI^<`Igr)=D-W1WHkb+YEc&}4Lhouu}8If}09HzJR#I>UC
z#C8!8s7<9#kc><??P8fg6gf*gMgg7?ip1X#>s2w+dz)T&)Yk=0{>k@!Gl5gyuf_VV
znAJG4W{Q&$J~WktuKI612Db!GH74r>XMATEx-Fc;AfEeD3;84jhx!Ga)_4p~zz43=
z;jN?Iq33r;Xp3~W)e89SIkOwMevi*n2A<C)1yg|29u0>ad(QDkA$PFl>~ZL}-w}a$
z|F9dlLoN#cpVJ!h>8#{=%5V*#Oz)9clW$U<#|2?(M?J1Ql~3PIx(EN2e_rIrX-;JR
zpXSiG)+9t<d-_E-k|63I#{W(DRp4~52$FXee;JYN;Hd723`+w1Jo1_is_#CURE)g8
z6X3>-8fmKU>xib+-^j#7$*211Yo*rTK}?NF%-;prq(wqh-$S&e<-aBJ%X6aq)YoeM
zTZmCiStqKIltnZCAOSJU{BnLD@ihL=g6}+m|FPgJZt%z4$6#iac_s3#;H&O`3ZO0>
z#Vq$P;jd6hJHJm;&X4{Ek}uDd>QQr3>=n^a`=Vg_e$!t@<<mP+dk-P#Q&A|-#?y3E
T_fK)t`1eHp_ovKQQThJ@<ln>C

diff --git a/tests/data/test-read-dwarf/test-PR26568-2.o.abi b/tests/data/test-read-dwarf/test-PR26568-2.o.abi
index cdb0243a..b67b4386 100644
--- a/tests/data/test-read-dwarf/test-PR26568-2.o.abi
+++ b/tests/data/test-read-dwarf/test-PR26568-2.o.abi
@@ -1,11 +1,11 @@ 
-<abi-corpus version='2.1' path='data/test-read-dwarf/test-PR26568-2.o'>
+<abi-corpus version='2.1' path='data/test-read-common/test-PR26568-2.o'>
   <elf-function-symbols>
     <elf-symbol name='fun' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
-  <abi-instr address-size='64' path='test-PR26568-2.c' comp-dir-path='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf' language='LANG_C89'>
+  <abi-instr address-size='64' path='tests/data/test-read-common/test-PR26568-2.c' comp-dir-path='/home/byby/oracle/src/libabigail-upstream' language='LANG_C11'>
     <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'/>
-    <union-decl name='A' size-in-bits='64' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-2.c' line='1' column='1' id='type-id-3'>
+    <union-decl name='A' size-in-bits='64' visibility='default' filepath='tests/data/test-read-common/test-PR26568-2.c' line='4' column='1' id='type-id-3'>
       <data-member access='public'>
         <var-decl name='' type-id='type-id-4' visibility='default'/>
       </data-member>
@@ -13,19 +13,19 @@ 
         <var-decl name='' type-id='type-id-5' visibility='default'/>
       </data-member>
     </union-decl>
-    <class-decl name='__anonymous_struct__' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-2.c' line='2' column='1' id='type-id-4'>
+    <class-decl name='__anonymous_struct__' size-in-bits='32' is-struct='yes' is-anonymous='yes' visibility='default' filepath='tests/data/test-read-common/test-PR26568-2.c' line='5' column='1' id='type-id-4'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='x' type-id='type-id-1' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-2.c' line='3' column='1'/>
+        <var-decl name='x' type-id='type-id-1' visibility='default' filepath='tests/data/test-read-common/test-PR26568-2.c' line='6' column='1'/>
       </data-member>
     </class-decl>
-    <class-decl name='__anonymous_struct__1' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-2.c' line='5' column='1' id='type-id-5'>
+    <class-decl name='__anonymous_struct__1' size-in-bits='64' is-struct='yes' is-anonymous='yes' visibility='default' filepath='tests/data/test-read-common/test-PR26568-2.c' line='8' column='1' id='type-id-5'>
       <data-member access='public' layout-offset-in-bits='0'>
-        <var-decl name='y' type-id='type-id-2' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-2.c' line='6' column='1'/>
+        <var-decl name='y' type-id='type-id-2' visibility='default' filepath='tests/data/test-read-common/test-PR26568-2.c' line='9' column='1'/>
       </data-member>
     </class-decl>
     <pointer-type-def type-id='type-id-3' size-in-bits='64' id='type-id-6'/>
-    <function-decl name='fun' mangled-name='fun' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-2.c' line='10' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fun'>
-      <parameter type-id='type-id-6' name='a' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/test-PR26568-2.c' line='10' column='1'/>
+    <function-decl name='fun' mangled-name='fun' filepath='tests/data/test-read-common/test-PR26568-2.c' line='13' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='fun'>
+      <parameter type-id='type-id-6' name='a' filepath='tests/data/test-read-common/test-PR26568-2.c' line='13' column='1'/>
       <return type-id='type-id-7'/>
     </function-decl>
     <type-decl name='void' id='type-id-7'/>
diff --git a/tests/data/test-read-dwarf/test3-alias-1.so.hash.abi b/tests/data/test-read-dwarf/test3-alias-1.so.hash.abi
index 02795ad0..b3a4801a 100644
--- a/tests/data/test-read-dwarf/test3-alias-1.so.hash.abi
+++ b/tests/data/test-read-dwarf/test3-alias-1.so.hash.abi
@@ -1,12 +1,12 @@ 
-<abi-corpus version='2.1' path='data/test-read-dwarf/test3.so' soname='test3.so.1'>
+<abi-corpus version='2.1' path='data/test-read-common/test3.so' soname='test3.so.1'>
   <elf-needed>
     <dependency name='libc.so.6'/>
   </elf-needed>
   <elf-function-symbols>
     <elf-symbol name='__foo' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
-  <abi-instr address-size='64' path='test3.c' comp-dir-path='/home/skumari/Tasks/source_repo/dodji/libabigail/tests/data/test-read-dwarf' language='LANG_C89'>
-    <function-decl name='__foo' mangled-name='__foo' filepath='/home/skumari/Tasks/source_repo/dodji/libabigail/tests/data/test-read-dwarf/test3.c' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__foo'>
+  <abi-instr address-size='64' path='test3.c' comp-dir-path='/home/byby/oracle/src/libabigail/tests/data/test-read-common' language='LANG_C89'>
+    <function-decl name='__foo' mangled-name='__foo' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test3.c' line='23' column='1' 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-dwarf/test3-alias-2.so.hash.abi b/tests/data/test-read-dwarf/test3-alias-2.so.hash.abi
index 775a9a97..07a7f2c4 100644
--- a/tests/data/test-read-dwarf/test3-alias-2.so.hash.abi
+++ b/tests/data/test-read-dwarf/test3-alias-2.so.hash.abi
@@ -1,4 +1,4 @@ 
-<abi-corpus version='2.1' path='data/test-read-dwarf/test3.so' soname='test3.so.1'>
+<abi-corpus version='2.1' path='data/test-read-common/test3.so' soname='test3.so.1'>
   <elf-needed>
     <dependency name='libc.so.6'/>
   </elf-needed>
@@ -9,8 +9,8 @@ 
     <elf-symbol name='foo' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='foo__' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
-  <abi-instr address-size='64' path='test3.c' comp-dir-path='/home/skumari/Tasks/source_repo/dodji/libabigail/tests/data/test-read-dwarf' language='LANG_C89'>
-    <function-decl name='__foo' mangled-name='__foo' filepath='/home/skumari/Tasks/source_repo/dodji/libabigail/tests/data/test-read-dwarf/test3.c' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
+  <abi-instr address-size='64' path='test3.c' comp-dir-path='/home/byby/oracle/src/libabigail/tests/data/test-read-common' language='LANG_C89'>
+    <function-decl name='__foo' mangled-name='__foo' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test3.c' line='23' column='1' 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-dwarf/test3-alias-3.so.hash.abi b/tests/data/test-read-dwarf/test3-alias-3.so.hash.abi
index 6c604948..7908bdb8 100644
--- a/tests/data/test-read-dwarf/test3-alias-3.so.hash.abi
+++ b/tests/data/test-read-dwarf/test3-alias-3.so.hash.abi
@@ -1,12 +1,12 @@ 
-<abi-corpus version='2.1' path='data/test-read-dwarf/test3.so' soname='test3.so.1'>
+<abi-corpus version='2.1' path='data/test-read-common/test3.so' soname='test3.so.1'>
   <elf-needed>
     <dependency name='libc.so.6'/>
   </elf-needed>
   <elf-function-symbols>
     <elf-symbol name='foo' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
-  <abi-instr address-size='64' path='test3.c' comp-dir-path='/home/skumari/Tasks/source_repo/dodji/libabigail/tests/data/test-read-dwarf' language='LANG_C89'>
-    <function-decl name='__foo' mangled-name='__foo' filepath='/home/skumari/Tasks/source_repo/dodji/libabigail/tests/data/test-read-dwarf/test3.c' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='foo'>
+  <abi-instr address-size='64' path='test3.c' comp-dir-path='/home/byby/oracle/src/libabigail/tests/data/test-read-common' language='LANG_C89'>
+    <function-decl name='__foo' mangled-name='__foo' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test3.c' line='23' column='1' 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-dwarf/test3-alias-4.so.hash.abi b/tests/data/test-read-dwarf/test3-alias-4.so.hash.abi
index 912c710c..22a56fa5 100644
--- a/tests/data/test-read-dwarf/test3-alias-4.so.hash.abi
+++ b/tests/data/test-read-dwarf/test3-alias-4.so.hash.abi
@@ -1,4 +1,4 @@ 
-<abi-corpus version='2.1' path='data/test-read-dwarf/test3.so' soname='test3.so.1'>
+<abi-corpus version='2.1' path='data/test-read-common/test3.so' soname='test3.so.1'>
   <elf-needed>
     <dependency name='libc.so.6'/>
   </elf-needed>
diff --git a/tests/data/test-read-dwarf/test3.c b/tests/data/test-read-dwarf/test3.c
deleted file mode 100644
index 2808db4b..00000000
--- a/tests/data/test-read-dwarf/test3.c
+++ /dev/null
@@ -1,11 +0,0 @@ 
-// Test file for creating multiple alias for a symbol
-
-void __foo(void);
-void foo(void) __attribute__((weak, alias("__foo")));
-void foo__(void) __attribute__((weak, alias("__foo")));
-void __foo__(void) __attribute__((alias("__foo")));
-
-void __foo(void)
-{
-
-}
diff --git a/tests/data/test-read-dwarf/test3.so b/tests/data/test-read-dwarf/test3.so
deleted file mode 100755
index 4c426fc3c202d2f2dd027ffd8825ccfea36b2a09..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8851
zcmeHMeQX>@6`#Aa<8$qt9j6VB(~?z48YjZ*k0i!QWMb!H`x5N5xHbh*YqfW~XJ30C
zW_K^PO8`p_At|z`5E4P+kAj3i2%#V$l=2~5j4C7$GKET^e??TKc8G-2isFi@=Dpc@
z=iRxz773|;c}}};<~Q$S_RZd#nSEax7#<9VLX1j;eVp;u4j1VY9nHImgRwr=!)oBJ
zu!lHr^;TC|?NW^k5oI8S1#O^-)t%Tvs`zMMm^WEMP?EzY%0**te>A4>3egolc*clE
zT{cz)6tCZjewiK=d_<8K%cHM32G-vZ{*dW|oQpA{B=<>>6C#4+y-B0!9u@W~`K4L-
zgQ$2M{%rSyjtE>s7slCNjaRO$z4^@A^Tx=YOB>H^y!}vh3!1=woD%Z?k6uzD^HqJd
zh}{PlPRE&nm+xM+uh#wI)vsSlU$Gl*eeTl_KEHS`R<-=YxjTRUXYBjy{}A2>=717m
zwd@DdOM(7T0(fy8LAYK4@2P-~0)7B4xhw+E$R1#=jf$^p23iML9a|NXM052V;Eik#
z>yY@rP=Ws&f?w8;^Vt;OhtG4o-0mKZ*RypR2(+;j;c5yPC)2daTp_R7j&3=c#<Wa6
z<1j4^glXr-Ml{2;%*l-HnAX@xJX^?{V|p@cx_!YtT548D1$s8~G%%jOsErB@@vLs!
zrVTdJg@Strli5r%rP>9xn`x$@J34eEZQC6YKzV~XrtKU<mQFS_eC|wK>r%Va6a2a8
z7KS%b{$U?t3qa|AQEbW7G8SexgdoKW`hVXLep?rDgz#zdC&dXN&qVuHgTfJHD}@@U
z-}d16pP{nq!Rfz_ed`|F`|59aa2g8oH;eZR|94*fiU;@dCl>BT6JM=vyH8<>FE2UO
zs~-Wu#KLc*%cyOuY@X->md!)Q;oh*n4{F$+LWZ^5n@|oN#Ww!!)>fdISgdXZAhFon
z0%SaKWFv9ywZy_kY$iOh3<iH%>l%DxV)HiY1O9smE%x34Li{gmL=xA2lX&6I=|pHH
z@u!U<7k=PtT=*sDjfupy7dQWg^7Fkv0gx3BCl-2Vur?0%oO;k_)hKLr0*16Y1-FS8
ztFJ<L=*{Ic7PVpjWf(GpNAB$dM&>*WgFDRiFF7saAb%8K(6zZTvGzD9XxKlG{A-`!
zb#7*2IsGj6qi|bjU*uFX@Zh}v<=xHA<3R5M`x8JhmSPD#J<39}jiG(@HPL6mYX<?t
zSau!wJCGsPI2da_-%vLbooA<8P8~gVkcT1UISbcS(8uSoKh}699N)R49~7b7cG>p8
zwg<L7u<e0u4}1U~p#4#4KSVagJ_t7iSQcEuVuF58(0V~>UoVbrrTyw&(NFubeWFck
z9Y1^kM*A~dAF)vXzuw&}V0&E*g!WK3#pZ~wq0rwWHfeZP!SYL&zz*3hxSnGXVz7Z!
zc$@Zie9Z=g)^~9{Wgp^PjLizegx?gKJR0Yc;DgO5FJuq41AP3~1wSnNyiI;x7i~xM
zzb)FOaSDAOG@)~|Z1?ZN4{r%N6px=&TH$1QL^-bZs9j1|N9VE5uFfu{b<{MJgzmU_
z+sBTukAgDS->%o>GnQ;C4uI>HD0f%r2>=YZf&{~O0tiLruF$txXjkY^Y<FEGwlB6T
z)Kt?5QyNy;>AjKI$+}Z@hxa1b*Zj>h_^Nip6=oksRiXdHcEX*10|E0PacW6HAC%fK
zS!x*$!(k-^E>Pm{>jR}NJ#CrORv~4=$;nXKa!xUC_D-64)5@fvsavV3-r1h+w(jFf
z+a$0*dM;kF+&)#vneFydMPSRckLmVPcDr3DS}9WlrG<8*U_6;=hx3=7%uMQ;Y&#yb
z>~=ha@oJl8>PDL}qg!clW@D;7mvi(aP{(rV6xH$t$5bctMKxK>WR13r!FX#*x2KqD
z%;iDSrH<wHTr@2^Q^@-o8uVFaR!0F*o6b5+<;POhF=wI952va*rKK%BXKGUh$WY7W
z)O5?z=Uh&zKbZnHd^FUrS_M89J(o#={Q_u(o61eW;ghMULM~_K0XEEJaT0Xs`AImr
zie@ICMtQd@nY7G{)XHY^Ce^_)?&SX;cZ`1+Ln!W4`rbq)L|C9EQ=#@2#0Zk7xJWc1
zI4OQmd?E$-odjbd$y3}UIxhkf+C?6cr+C%}80sc@io--H?g9%h6z8ao<HHz8@)Y-o
zDuR*5Pkcnjp&w%^wJEL=C3ze_+NSYCl@|;j^lS)F94ESjAQZAs^7Q<9=<~|cx<HiH
z5tPTZNS2=k497+57Ok5^X*~oMUeK1e*wFCGuZTEIl<bpCqo@%5q9k7$h#1g12}*JV
zUzX(8Nls8&|A=26|1(0K=C9Is(@OH!CHZEtAQLr6P*Cze!QX`n?qO(tX<tI$Rb_s;
z{bP`A@W|7?WnFB1WPZ8*bCAXPBl{cTyVS=2DF16op1xPn#!R*+xBme0I8|hy)_MAF
zzJh~;Li0xQ^!~gIectiYcd}dP6ez7ODcwn)=qu3Um8X3eeb9S9`By<6b<z0g`)aEg
zAlab-&~s3G6)I@Ig8)HE9``8TBHY1c5Wfc(VP3v5VPDo;#tT3h28u2V`5~{;09*AH
z<bN;ZD~+Gjwp5V+w~#+cjDpHzeOSoL&)K=l75G^NdD4SyG<ROs*M)p1F^W#9$$dw$
z!z<q`4i+~>JlqeR?QqfiK=B*nQ;_`?1v;QCO9rK;%T(bWfzi==?q!L<YDw#}ACHvI
zEq=U;(R%8~s~N46etZX`_0Nyjl-4&t9xa_`{CIhO2KythlF|C&=ZBqyi2HuLJYV7J
z*;&e$`T1jv;<q1fDCPhBcw_0j=*M?4il=_O34*@jg?K%}c0;}}2*00ET=NP=AYW99
zSDuat<b@~>d0_AxogTd?`jg&98K={-jLW+Mw?D$@G%fSfDS8XX_qdAP+uTCjT0M{u
zEB70YB#b*nX?}74iFk*E_X}M9j_^3wzvUnLKczWdK987}L;W`-{omsJ<?q8yz=NKv
z((^8HJux;*2YF~?`6FCGe!#vU{q8ze{$9P#^_0I?>l`o7H@+iq`Mqj_2MEgVVf<D=
zMlRie2jw$+xt{X>W4wZ%QNV-ppP%CT%k!U~t-!Afe))fq13c)tY`_)yp`iVh3ix*b
zKM=tGE5L*Dt1M+Xwo`<RQ3{T}=i{T=@VUpvAX~YW57nHUmcopv%_tG-fi%r1Xp`AO
zQqO9JQ?P7JFU~SJR!(P4$28RLW8Eh}a{v=hzPhJY$bLH39COdPMlqM0!*e)4_3{?a
z*7{i8R4I;maI}A9KpVJl7PGqi38-$^1#L>t8<@sD`<V;<Bk;*U(;&S|+(W~UoarCd
z9vK{bY+y_q>pwF*fI1*)i@M$`D=ZSYZu;1tS>`EU%;pL;-XyP^4-U!{qcQTXKLPDa
NGxzm*6T@y2`@a>G9{B(O

diff --git a/tests/data/test-read-dwarf/test3.so.abi b/tests/data/test-read-dwarf/test3.so.abi
index 04032c74..a9bf781f 100644
--- a/tests/data/test-read-dwarf/test3.so.abi
+++ b/tests/data/test-read-dwarf/test3.so.abi
@@ -1,4 +1,4 @@ 
-<abi-corpus version='2.1' path='data/test-read-dwarf/test3.so' soname='test3.so.1'>
+<abi-corpus version='2.1' path='data/test-read-common/test3.so' soname='test3.so.1'>
   <elf-needed>
     <dependency name='libc.so.6'/>
   </elf-needed>
@@ -10,8 +10,8 @@ 
     <elf-symbol name='foo' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='foo__' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
-  <abi-instr address-size='64' path='test3.c' comp-dir-path='/home/skumari/Tasks/source_repo/dodji/libabigail/tests/data/test-read-dwarf' language='LANG_C89'>
-    <function-decl name='__foo' mangled-name='__foo' filepath='/home/skumari/Tasks/source_repo/dodji/libabigail/tests/data/test-read-dwarf/test3.c' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__foo'>
+  <abi-instr address-size='64' path='test3.c' comp-dir-path='/home/byby/oracle/src/libabigail/tests/data/test-read-common' language='LANG_C89'>
+    <function-decl name='__foo' mangled-name='__foo' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test3.c' line='23' column='1' 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-dwarf/test3.so.hash.abi b/tests/data/test-read-dwarf/test3.so.hash.abi
index ea9ddc02..f429b22f 100644
--- a/tests/data/test-read-dwarf/test3.so.hash.abi
+++ b/tests/data/test-read-dwarf/test3.so.hash.abi
@@ -1,4 +1,4 @@ 
-<abi-corpus version='2.1' path='data/test-read-dwarf/test3.so' soname='test3.so.1'>
+<abi-corpus version='2.1' path='data/test-read-common/test3.so' soname='test3.so.1'>
   <elf-needed>
     <dependency name='libc.so.6'/>
   </elf-needed>
@@ -10,8 +10,8 @@ 
     <elf-symbol name='foo' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
     <elf-symbol name='foo__' type='func-type' binding='weak-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
-  <abi-instr address-size='64' path='test3.c' comp-dir-path='/home/skumari/Tasks/source_repo/dodji/libabigail/tests/data/test-read-dwarf' language='LANG_C89'>
-    <function-decl name='__foo' mangled-name='__foo' filepath='/home/skumari/Tasks/source_repo/dodji/libabigail/tests/data/test-read-dwarf/test3.c' line='8' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__foo'>
+  <abi-instr address-size='64' path='test3.c' comp-dir-path='/home/byby/oracle/src/libabigail/tests/data/test-read-common' language='LANG_C89'>
+    <function-decl name='__foo' mangled-name='__foo' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test3.c' line='23' column='1' 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-dwarf/test4.c b/tests/data/test-read-dwarf/test4.c
deleted file mode 100644
index 7f0abaa1..00000000
--- a/tests/data/test-read-dwarf/test4.c
+++ /dev/null
@@ -1,14 +0,0 @@ 
-// Test file for restrict (needs to be compiled by a GCC that actually emits
-// DW_TAG_restrict_type. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59051
-//
-// gcc -gdwarf-3 -std=c99 -shared -nostartfiles -o test4.so test4.c
-
-char *
-cpy (char * restrict s1, const char * restrict s2, unsigned int n)
-{
-  char *t1 = s1;
-  const char *t2 = s2;
-  while(n-- > 0)
-    *t1++ = *t2++;
-  return s1;
-}
diff --git a/tests/data/test-read-dwarf/test4.so b/tests/data/test-read-dwarf/test4.so
deleted file mode 100755
index 3be3f0d644190425cbb2a08ed7b4f1d164c13ef1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3364
zcmcImPiP!v6n`_b|JqG9o1{u1Dx+wdh?yj9NYj?oP0~#_x@}TzARc6#-JR?%W+!20
zViQq%s7hlABqHiTu!08#!HX0H4*_pIdGgf5UIIcd@mBN@-<$c~c6PF>i1@*L?|r}b
zdvCsZ-}k-wZe;T_vLpdF1ug)MGO~|kgkd`-6cia4hbZ>lkn*_EN2WtsUBqDtpn4p7
z2Zdz3F8eskU9?f#^?K@5Por@E#xLP{0nG2Yr3mUDi}{4*F~MU=TxwU*FYxI;_&0r8
z*c6oHN0MT-%aNE4GTJu<BV<BE%3n_azbf3jP^KXccNA41zIdh${&*W4imMy2TrCte
zXGI$W-7Fcd0lHpr9NlpZ+eOGK0W9P;_i~%>{+8QZt8Xsc&)v?Vnth0}j&lFOlc+t+
zZOu!$%>_gk_H$b=p?-P4>u%4j^zH2Zt@#7=dw+NBSMq)RXPl4Jr<|ue(l>s4aB%Pf
zN?sS~?N>lrPfL9r@x(R~o<JKt>&WwRFquk!AWwJ3<UBI`7-(+fpVxJff(P*9BEP)W
zw}kzuPlJ;}CWSmM<o_)$O;4Xw`!8Kt7*I#Gkzs9EJvBTsIy^QquJ)VjtEOG8nU-rT
z4*+G!{|JB2^N!)25uWJ}2+-~XNJz9hr0d=Q8e45gq=aBuqWvJr(nmPp$V`wv_h7{t
zLB<!v-dR+fQ#km_8_X*f>fd{MKH?%PLSf{cO2kE0^c!#R21FB|p%#;3H&Dch5+_qM
z@g4TQEfRkWb&$HH=Tf~%CDoVemU^T#u9~b#FLo%2bIJ3`lO40Y1ZR$ZI@KZd;%7#|
zx6Jm+xS)~IreU-TlF3=5#hyjw0!GCbp8-M=Cp-ZY_)Zy~qBl!_raH0rN+#|R30%{0
zN3|kN3*d;%$vL)n^X5?E$9pf!GSY`CD>ZYdX4r2IId*Y~d>mM_oNC!JOKR0}0hd^v
z{)aVI2W#${Wloe$3m3kKL&GjsCf3Kt2FFI#!E))kVJ{7yRtFuoG*LWzwlTM2#jpW1
zXQSpC1(dGs%L;21!>NE)+OUw~OV<X?HP>Cx%!<Bb8#Pm}ln~>Q$1-ZwB51{x8f`*E
z%)(k(H*CWyn+^}F*3t^=MxkJvZ}DikYMHF#MEnf?$G#8!sn+t|<#W!GP6;)(^Z$YC
z!qaG@GtPFd11z`685^A(;;=v0gMokzRp7e9lIsZBsEIP;53nB*7}ueUm<Y@8Y36xz
zfHT6M=ilx>$NaE=Hst@c2*h%n9fjoYXLt@3{_hdS|MR+tvr8a0zw$iFAOANO(MCBL
zCQ_i?5f0A>Fj6^xER6sbq}~($;kfL_+|@Sze+d7dm?&h}|D87ecSWKpez1l8KSW~~
zBmN0-ftU<Bx8Qyvu<&=5h5vhP{P~^TXy>&FQXdHaFM}ZJ?8h*TdG9es@)z+VO$%ch
zu^xPQ|M2-af>^8f*E`UF?V>Llefa$iLkmU0*>W8SniZTepYLW|X`J6?{P2B@><U&M
zK5xzZ81VUN#^a6i(TsCef+)qO>>O?ih~$P$idV@(APyA}$qbnk=nNtL`bOaQgF^-c
zTH!Q93GbhES#5HmwI)2=`VnY#kEJ@@>K=Q#4Ni5b6~FNd)GxkvW%BauH0YP|b5oOf
ceQsvv)$BF>+T>I|t9#d7zU0!yHh9zh3+<yQu>b%7

diff --git a/tests/data/test-read-dwarf/test4.so.abi b/tests/data/test-read-dwarf/test4.so.abi
index 71f64da3..c38fff66 100644
--- a/tests/data/test-read-dwarf/test4.so.abi
+++ b/tests/data/test-read-dwarf/test4.so.abi
@@ -1,11 +1,11 @@ 
-<abi-corpus version='2.1' path='data/test-read-dwarf/test4.so'>
+<abi-corpus version='2.1' path='data/test-read-common/test4.so'>
   <elf-needed>
     <dependency name='libc.so.6'/>
   </elf-needed>
   <elf-function-symbols>
     <elf-symbol name='cpy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
-  <abi-instr address-size='64' path='test4.c' comp-dir-path='/home/mark/src/tests' language='LANG_C89'>
+  <abi-instr address-size='64' path='test4.c' comp-dir-path='/home/byby/oracle/src/libabigail/tests/data/test-read-common' language='LANG_C99'>
     <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' id='type-id-3'/>
@@ -13,10 +13,10 @@ 
     <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' id='type-id-6'/>
     <qualified-type-def type-id='type-id-6' restrict='yes' id='type-id-7'/>
-    <function-decl name='cpy' mangled-name='cpy' filepath='/home/mark/src/tests/test4.c' line='2' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpy'>
-      <parameter type-id='type-id-4' name='s1' filepath='/home/mark/src/tests/test4.c' line='2' column='1'/>
-      <parameter type-id='type-id-7' name='s2' filepath='/home/mark/src/tests/test4.c' line='2' column='1'/>
-      <parameter type-id='type-id-2' name='n' filepath='/home/mark/src/tests/test4.c' line='2' column='1'/>
+    <function-decl name='cpy' mangled-name='cpy' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test4.c' line='4' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpy'>
+      <parameter type-id='type-id-4' name='s1' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test4.c' line='4' column='1'/>
+      <parameter type-id='type-id-7' name='s2' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test4.c' line='4' column='1'/>
+      <parameter type-id='type-id-2' name='n' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test4.c' line='4' column='1'/>
       <return type-id='type-id-3'/>
     </function-decl>
   </abi-instr>
diff --git a/tests/data/test-read-dwarf/test4.so.hash.abi b/tests/data/test-read-dwarf/test4.so.hash.abi
index 471ff895..7223f5eb 100644
--- a/tests/data/test-read-dwarf/test4.so.hash.abi
+++ b/tests/data/test-read-dwarf/test4.so.hash.abi
@@ -1,11 +1,11 @@ 
-<abi-corpus version='2.1' path='data/test-read-dwarf/test4.so'>
+<abi-corpus version='2.1' path='data/test-read-common/test4.so'>
   <elf-needed>
     <dependency name='libc.so.6'/>
   </elf-needed>
   <elf-function-symbols>
     <elf-symbol name='cpy' type='func-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
   </elf-function-symbols>
-  <abi-instr address-size='64' path='test4.c' comp-dir-path='/home/mark/src/tests' language='LANG_C89'>
+  <abi-instr address-size='64' path='test4.c' comp-dir-path='/home/byby/oracle/src/libabigail/tests/data/test-read-common' language='LANG_C99'>
     <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' id='26a90f95'/>
@@ -13,10 +13,10 @@ 
     <qualified-type-def type-id='a84c031d' const='yes' id='9b45d938'/>
     <pointer-type-def type-id='9b45d938' size-in-bits='64' id='80f4b756'/>
     <qualified-type-def type-id='80f4b756' restrict='yes' id='9d26089a'/>
-    <function-decl name='cpy' mangled-name='cpy' filepath='/home/mark/src/tests/test4.c' line='2' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpy'>
-      <parameter type-id='266fe297' name='s1' filepath='/home/mark/src/tests/test4.c' line='2' column='1'/>
-      <parameter type-id='9d26089a' name='s2' filepath='/home/mark/src/tests/test4.c' line='2' column='1'/>
-      <parameter type-id='f0981eeb' name='n' filepath='/home/mark/src/tests/test4.c' line='2' column='1'/>
+    <function-decl name='cpy' mangled-name='cpy' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test4.c' line='4' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cpy'>
+      <parameter type-id='266fe297' name='s1' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test4.c' line='4' column='1'/>
+      <parameter type-id='9d26089a' name='s2' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test4.c' line='4' column='1'/>
+      <parameter type-id='f0981eeb' name='n' filepath='/home/byby/oracle/src/libabigail/tests/data/test-read-common/test4.c' line='4' column='1'/>
       <return type-id='26a90f95'/>
     </function-decl>
   </abi-instr>
diff --git a/tests/test-annotate.cc b/tests/test-annotate.cc
index bc4ce852..174de483 100644
--- a/tests/test-annotate.cc
+++ b/tests/test-annotate.cc
@@ -42,12 +42,12 @@  InOutSpec in_out_specs[] =
     "output/test-annotate/test2.so.abi"
   },
   {
-    "data/test-read-dwarf/test3.so",
+    "data/test-read-common/test3.so",
     "data/test-annotate/test3.so.abi",
     "output/test-annotate/test3.so.abi"
   },
   {
-    "data/test-read-dwarf/test4.so",
+    "data/test-read-common/test4.so",
     "data/test-annotate/test4.so.abi",
     "output/test-annotate/test4.so.abi"
   },
diff --git a/tests/test-read-common.cc b/tests/test-read-common.cc
new file mode 100644
index 00000000..9681ac27
--- /dev/null
+++ b/tests/test-read-common.cc
@@ -0,0 +1,264 @@ 
+// -*- Mode: C++ -*-
+//
+
+/// @file
+///
+/// This file implements the common functionality for the tests in
+/// CTF and DWARF readers, it does the abstraction in the `act` test
+/// stage.
+
+#include <fstream>
+#include <cstring>
+#include "test-read-common.h"
+
+using std::ofstream;
+using std::cerr;
+using std::dynamic_pointer_cast;
+
+using abigail::tools_utils::emit_prefix;
+using abigail::tests::get_build_dir;
+using abigail::xml_writer::write_context_sptr;
+using abigail::xml_writer::create_write_context;
+using abigail::xml_writer::write_corpus;
+
+namespace abigail
+{
+namespace tests
+{
+namespace read_common
+{
+
+/// Constructor.
+///
+/// Task to be executed for each test entry in @ref
+/// abigail::tests::read_common::InOutSpec.
+///
+/// @param InOutSpec the set of tests.
+///
+/// @param a_out_abi_base the output base directory for abixml files.
+///
+/// @param a_in_elf_base the input base directory for object files.
+///
+/// @param a_in_elf_base the input base directory for expected
+/// abixml files.
+test_task::test_task(const InOutSpec &s,
+                     string& a_out_abi_base,
+                     string& a_in_elf_base,
+                     string& a_in_abi_base)
+    : is_ok(true),
+      spec(s),
+      out_abi_base(a_out_abi_base),
+      in_elf_base(a_in_elf_base),
+      in_abi_base(a_in_abi_base)
+  {}
+
+/// Serialize the abixml @p out_abi_path file.
+///
+/// @param out_abi_path the abixml path file.
+///
+/// @param corp the ABI @ref abigail::ir::corpus.
+///
+/// @return true if abixml file was serialized successfully. Otherwise
+/// `error_message` is set with @p out_abi_path and false is returned.
+bool
+test_task::serialize_corpus(const string& out_abi_path,
+                            corpus_sptr corp)
+{
+  ofstream of(out_abi_path.c_str(), std::ios_base::trunc);
+  if (!of.is_open())
+    {
+       error_message = string("failed to read ") + out_abi_path + "\n";
+       return false;
+    }
+
+  write_context_sptr write_ctxt
+      = create_write_context(corp->get_environment(), of);
+  set_type_id_style(*write_ctxt, spec.type_id_style);
+  is_ok = write_corpus(*write_ctxt, corp, /*indent=*/0);
+  of.close();
+
+  return is_ok;
+}
+
+/// Spawn `abidw --abidiff` tool appending @p extargs argument.
+///
+/// Thew input file object used by `abidw` will be specified by
+/// `in_elf_path'.
+///
+/// @param extargs the extra argument(s) passed to `abidw` tool.
+///
+/// @return true if `abidw` tool was executed correctly. Otherwise
+/// `error_message` shows the full path of the input file object and
+/// the full output path for the abixml file.
+bool
+test_task::run_abidw(const string& extargs)
+{
+  string abidw = string(get_build_dir()) + "/tools/abidw";
+  string drop_private_types;
+  if (!in_public_headers_path.empty())
+    drop_private_types += "--headers-dir " + in_public_headers_path +
+      " --drop-private-types";
+  string cmd = abidw + " " + drop_private_types + " --abidiff " + extargs +
+   in_elf_path;
+  if (system(cmd.c_str()))
+    {
+      error_message = string("ABIs differ:\n")
+        + in_elf_path
+        + "\nand:\n"
+        + out_abi_path
+        + "\n";
+
+      return false;
+    }
+
+  return true;
+}
+
+/// Spawn external `diff` command.
+///
+/// The files to be compared are: abixml generated by the input
+/// object file and the expected abixml file stored in `in_abi_path`.
+///
+/// @return true if `diff` command didn't find defences. Otherwise
+/// `error_message` shows the full path of the input file object and
+/// the full output path for the abixml file.
+bool
+test_task::run_diff()
+{
+  set_in_abi_path();
+  string cmd = "diff -u " + in_abi_path + " " + out_abi_path;
+  if (system(cmd.c_str()))
+    {
+      error_message = string("ABIs differ:\n")
+        + in_abi_path
+        + "\nand:\n"
+        + out_abi_path
+        + "\n";
+
+      return false;
+    }
+
+  return true;
+}
+
+/// Write the usage message to @p out stream object.
+///
+/// @param prog_name the program name.
+///
+/// @param out the stream object to which want to write.
+void
+display_usage(const string& prog_name, ostream& out)
+{
+  emit_prefix(prog_name, out)
+    << "usage: " << prog_name << " [options]\n"
+    << " where options can be: \n"
+    << "  --help|-h  display this message\n"
+    << "  --no-parallel execute testsuite is a sigle thread\n"
+  ;
+}
+
+/// Parse and process test options.
+///
+/// @param argc the arguments number.
+///
+/// @param argv the pointer to the arguments.
+///
+/// @param opts the valid @ref options to be processed/parsed.
+///
+/// @return true if options was processed/parsed successfully. It returns
+/// false when help is requested or an invalid option is supplied.
+bool
+parse_command_line(int argc, char* argv[], options& opts)
+{
+  for (int i = 1; i < argc; ++i)
+    {
+      if (!strcmp(argv[i], "--no-parallel"))
+        opts.parallel = false;
+      else if (!strcmp(argv[i], "--help")
+               || !strcmp(argv[i], "--h"))
+        return false;
+      else
+        {
+          if (strlen(argv[i]) >= 2 && argv[i][0] == '-' && argv[i][1] == '-')
+            opts.wrong_option = argv[i];
+          return false;
+        }
+    }
+
+  return true;
+}
+
+/// The main entry point to execute the testsuite.
+///
+/// @param num_tests the number of tests to be executed.
+///
+/// @param specs the @ref abigail::tests::read_common::InOutSpec
+/// tests container.
+///
+/// @param opts the test execution @ref abigail::tests::read_common::options.
+///
+/// @param new_test the @ref create_new_test callback function to create
+/// a new test task object.
+///
+/// @return true if `all` tests were performed successfully. Otherwise
+/// false is returned.
+bool
+run_tests(const size_t num_tests, const InOutSpec* specs,
+          const options& opts, create_new_test new_test)
+{
+  size_t num_workers = (opts.parallel
+                        ? std::min(abigail::workers::get_number_of_threads(),
+                                   num_tests)
+                        : 1);
+
+  // Create a task queue.  The max number of worker threads of the
+  // queue is the number of the concurrent threads supported by the
+  // processor of the machine this code runs on.  But if
+  // --no-parallel was provided then the number of worker threads
+  // equals 1.
+  abigail::workers::queue task_queue(num_workers);
+  bool is_ok = true;
+
+  string out_abi_base = string(get_build_dir()) + "/tests/";
+  string in_elf_base  = string(abigail::tests::get_src_dir()) + "/tests/";
+  string in_abi_base = in_elf_base;
+
+  for (const InOutSpec *s = specs; s->in_elf_path; ++s)
+    {
+      test_task_sptr t(new_test(s, out_abi_base,
+                                in_elf_base,
+                                in_abi_base));
+      ABG_ASSERT(task_queue.schedule_task(t));
+    }
+
+  // Wait for all worker threads to finish their job, and wind down.
+  task_queue.wait_for_workers_to_complete();
+
+  // Now walk the results and print whatever error messages need to be
+  // printed.
+
+  const vector<abigail::workers::task_sptr>& completed_tasks =
+    task_queue.get_completed_tasks();
+
+  ABG_ASSERT(completed_tasks.size() == num_tests);
+
+  for (vector<abigail::workers::task_sptr>::const_iterator ti =
+         completed_tasks.begin();
+       ti != completed_tasks.end();
+       ++ti)
+    {
+      test_task_sptr t = dynamic_pointer_cast<test_task>(*ti);
+      if (!t->is_ok)
+        {
+          is_ok = false;
+          if (!t->error_message.empty())
+            cerr << t->error_message << '\n';
+        }
+    }
+
+  return !is_ok;
+}
+
+}//end namespace read_common
+}//end namespace tests
+}//end namespace abigail
diff --git a/tests/test-read-common.h b/tests/test-read-common.h
new file mode 100644
index 00000000..00d4d1d1
--- /dev/null
+++ b/tests/test-read-common.h
@@ -0,0 +1,179 @@ 
+// -*- Mode: C++ -*-
+//
+
+/// @file
+///
+/// This file declares the common functionality for tests in
+/// CTF and DWARF readers, it declares abstractions for `act` test
+/// stage.
+
+#ifndef __TEST_READ_COMMON_H__
+#define __TEST_READ_COMMON_H__
+
+#include <string>
+#include "abg-ir.h"
+#include "abg-corpus.h"
+#include "abg-workers.h"
+#include "abg-writer.h"
+#include "test-utils.h"
+#include "abg-tools-utils.h"
+
+using std::string;
+
+using abigail::xml_writer::type_id_style_kind;
+using abigail::ir::corpus_sptr;
+
+namespace abigail
+{
+namespace tests
+{
+namespace read_common
+{
+
+/// This is an aggregate that specifies where a test shall get its
+/// input from, and where it shall write its output to.
+struct InOutSpec
+{
+  const char* in_elf_path;
+  const char* in_suppr_spec_path;
+  const char* in_public_headers_path;
+  type_id_style_kind type_id_style;
+  const char* in_abi_path;
+  const char* out_abi_path;
+};// end struct InOutSpec
+
+/// The task that performs the tests.
+struct test_task : public abigail::workers::task
+{
+  bool is_ok;
+  InOutSpec spec;
+  string error_message;
+  string out_abi_base;
+  string in_elf_base;
+  string in_abi_base;
+
+  string in_elf_path;
+  string in_abi_path;
+  string in_suppr_spec_path;
+  string in_public_headers_path;
+  string out_abi_path;
+
+
+  /// A setter for `in_elf_path` field.
+  /// The `in_elf_path` is the full path for input object
+  /// in the tests container @ref
+  /// abigail::tests::read_common::InOutSpec.
+  void
+  set_in_elf_path()
+  {
+    in_elf_path = in_elf_base + spec.in_elf_path;
+  }
+
+  /// A setter for `in_suppr_spec_path` field.
+  /// The `in_suppr_spec_path` is the full path for suppression
+  /// entry in the tests container @ref
+  /// abigail::tests::read_common::InOutSpec.
+  void
+  set_in_suppr_spec_path()
+  {
+    if (spec.in_suppr_spec_path)
+      in_suppr_spec_path = in_elf_base + spec.in_suppr_spec_path;
+    else
+      in_suppr_spec_path.clear();
+  }
+
+  /// A setter for `in_public_headers_path` field.
+  /// The `in_public_headers_path` is the full path for headers
+  /// entry in the tests container @ref
+  /// abigail::tests::read_common::InOutSpec.
+  void
+  set_in_public_headers_path()
+  {
+    if (spec.in_public_headers_path)
+      in_public_headers_path = spec.in_public_headers_path;
+    if (!in_public_headers_path.empty())
+      in_public_headers_path = in_elf_base + spec.in_public_headers_path;
+  }
+
+  /// A setter for `out_abi_path` field.
+  /// The `out_abi_path` is the full path for output of abixml file.
+  /// @return true if `out_abi_path` is a valid directory.
+  bool
+  set_out_abi_path()
+  {
+    out_abi_path = out_abi_base + spec.out_abi_path;
+    if (!abigail::tools_utils::ensure_parent_dir_created(out_abi_path))
+      {
+          error_message =
+            string("Could not create parent directory for ") + out_abi_path;
+          return false;
+      }
+    return true;
+  }
+
+  /// A setter for `in_abi_path` field.
+  /// The `in_abi_path` is the full path for the expected abixml file.
+  void
+  set_in_abi_path()
+  {
+    in_abi_path = in_abi_base + spec.in_abi_path;
+  }
+
+  test_task(const InOutSpec &s,
+            string& a_out_abi_base,
+            string& a_in_elf_base,
+            string& a_in_abi_base);
+  bool
+  serialize_corpus(const string& out_abi_path,
+                   corpus_sptr corp);
+  bool
+  run_abidw(const string& extargs = "");
+
+  bool
+  run_diff();
+
+  virtual
+  ~test_task()
+  {}
+}; // end struct test_task
+
+typedef shared_ptr<test_task> test_task_sptr;
+
+/// An abstraction for valid test options.
+struct options
+{
+  // saves a wrong option string passed to test-harness.
+  string        wrong_option;
+  // parallel test execution.
+  bool          parallel;
+
+  options()
+    : parallel(true)
+  {}
+
+  ~options()
+  {
+  }
+}; // end struct options
+
+void
+display_usage(const string& prog_name, ostream& out);
+
+bool
+parse_command_line(int argc, char* argv[], options& opts);
+
+/// A convenience typedef for a callback to create_new_test
+/// instances.
+typedef test_task* (*create_new_test)(const InOutSpec* s,
+                                      string& a_out_abi_base,
+                                      string& a_in_elf_base,
+                                      string& a_in_abi_base);
+bool
+run_tests(const size_t num_test, const InOutSpec* specs,
+          const options& opts, create_new_test new_test);
+
+}//end namespace read_common
+}//end namespace tests
+}//end namespace abigail
+
+#endif //__TEST_READ_COMMON_H__
diff --git a/tests/test-read-ctf.cc b/tests/test-read-ctf.cc
new file mode 100644
index 00000000..b448ddc5
--- /dev/null
+++ b/tests/test-read-ctf.cc
@@ -0,0 +1,353 @@ 
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+// -*- Mode: C++ -*-
+//
+// Copyright (C) 2021 Oracle, Inc.
+//
+// Author: Guillermo E. Martinez
+
+/// @file
+///
+/// This file implement the CTF testsuite. It reads ELF binaries
+/// containing CTF, save them in XML corpus files and diff the
+/// corpus files against reference XML corpus files.
+
+#include <cstdlib>
+#include <fstream>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <vector>
+#include "abg-ctf-reader.h"
+#include "test-read-common.h"
+
+using std::string;
+using std::cerr;
+
+using abigail::tests::read_common::InOutSpec;
+using abigail::tests::read_common::test_task;
+using abigail::tests::read_common::display_usage;
+using abigail::tests::read_common::options;
+
+using abigail::ctf_reader::read_context_sptr;
+using abigail::ctf_reader::create_read_context;
+using abigail::xml_writer::SEQUENCE_TYPE_ID_STYLE;
+using abigail::xml_writer::HASH_TYPE_ID_STYLE;
+using abigail::tools_utils::emit_prefix;
+
+static InOutSpec in_out_specs[] =
+{
+  {
+    "data/test-read-ctf/test0",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test0.abi",
+    "output/test-read-ctf/test0.abi"
+  },
+  {
+    "data/test-read-ctf/test0",
+    "",
+    "",
+    HASH_TYPE_ID_STYLE,
+    "data/test-read-ctf/test0.hash.abi",
+    "output/test-read-ctf/test0.hash.abi"
+  },
+  {
+    "data/test-read-ctf/test1.so",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test1.so.abi",
+    "output/test-read-ctf/test1.so.abi"
+  },
+  {
+    "data/test-read-ctf/test1.so",
+    "",
+    "",
+    HASH_TYPE_ID_STYLE,
+    "data/test-read-ctf/test1.so.hash.abi",
+    "output/test-read-ctf/test1.so.hash.abi"
+  },
+  {
+    "data/test-read-ctf/test2.so",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test2.so.abi",
+    "output/test-read-ctf/test2.so.abi"
+  },
+  {
+    "data/test-read-ctf/test2.so",
+    "",
+    "",
+    HASH_TYPE_ID_STYLE,
+    "data/test-read-ctf/test2.so.hash.abi",
+    "output/test-read-ctf/test2.so.hash.abi"
+  },
+  {
+    "data/test-read-common/test3.so",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test3.so.abi",
+    "output/test-read-ctf/test3.so.abi"
+  },
+  {
+    "data/test-read-common/test3.so",
+    "",
+    "",
+    HASH_TYPE_ID_STYLE,
+    "data/test-read-ctf/test3.so.hash.abi",
+    "output/test-read-ctf/test3.so.hash.abi"
+  },
+  {
+    "data/test-read-ctf/test-enum-many.o",
+    "",
+    "",
+    HASH_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-enum-many.o.hash.abi",
+    "output/test-read-ctf/test-enum-many.o.hash.abi"
+  },
+  {
+    "data/test-read-ctf/test-ambiguous-struct-A.o",
+    "",
+    "",
+    HASH_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-ambiguous-struct-A.o.hash.abi",
+    "output/test-read-ctf/test-ambiguous-struct-A.o.hash.abi"
+  },
+  {
+    "data/test-read-ctf/test-ambiguous-struct-B.o",
+    "",
+    "",
+    HASH_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-ambiguous-struct-B.o.hash.abi",
+    "output/test-read-ctf/test-ambiguous-struct-B.o.hash.abi"
+  },
+  {
+    "data/test-read-ctf/test-conflicting-type-syms-a.o",
+    "",
+    "",
+    HASH_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi",
+    "output/test-read-ctf/test-conflicting-type-syms-a.o.hash.abi"
+  },
+  {
+    "data/test-read-ctf/test-conflicting-type-syms-b.o",
+    "",
+    "",
+    HASH_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi",
+    "output/test-read-ctf/test-conflicting-type-syms-b.o.hash.abi"
+  },
+  {
+    "data/test-read-common/test4.so",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test4.so.abi",
+    "output/test-read-ctf/test4.so.abi"
+  },
+  {
+    "data/test-read-common/test4.so",
+    "",
+    "",
+    HASH_TYPE_ID_STYLE,
+    "data/test-read-ctf/test4.so.hash.abi",
+    "output/test-read-ctf/test4.so.hash.abi"
+  },
+  {
+    "data/test-read-ctf/test5.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test5.o.abi",
+    "output/test-read-ctf/test5.o.abi"
+  },
+  {
+    "data/test-read-ctf/test7.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test7.o.abi",
+    "output/test-read-ctf/test7.o.abi"
+  },
+  {
+    "data/test-read-ctf/test8.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test8.o.abi",
+    "output/test-read-ctf/test8.o.abi"
+  },
+  {
+    "data/test-read-ctf/test9.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test9.o.abi",
+    "output/test-read-ctf/test9.o.abi"
+  },
+  {
+    "data/test-read-ctf/test-enum.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-enum.o.abi",
+    "output/test-read-ctf/test-enum.o.abi"
+  },
+  {
+    "data/test-read-ctf/test-enum-symbol.o",
+    "",
+    "",
+    HASH_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-enum-symbol.o.hash.abi",
+    "output/test-read-ctf/test-enum-symbol.o.hash.abi"
+  },
+  {
+    "data/test-read-ctf/test-dynamic-array.o",
+    "",
+    "",
+    SEQUENCE_TYPE_ID_STYLE,
+    "data/test-read-ctf/test-dynamic-array.o.abi",
+    "output/test-read-ctf/test-dynamic-array.o.abi"
+  },
+  {
+    "data/test-read-common/PR27700/test-PR27700.o",
+    "",
+    "data/test-read-common/PR27700/pub-incdir",
+    HASH_TYPE_ID_STYLE,
+    "data/test-read-ctf/PR27700/test-PR27700.abi",
+    "output/test-read-ctf/PR27700/test-PR27700.abi",
+  },
+  // This should be the last entry.
+  {NULL, NULL, NULL, SEQUENCE_TYPE_ID_STYLE, NULL, NULL}
+};
+
+/// Task specialization to perform CTF tests.
+struct test_task_ctf : public test_task
+{
+  test_task_ctf(const InOutSpec &s,
+                string& a_out_abi_base,
+                string& a_in_elf_base,
+                string& a_in_abi_base);
+  virtual void
+  perform();
+
+  virtual
+  ~test_task_ctf()
+  {}
+}; // end struct test_task_ctf
+
+/// Constructor.
+///
+/// Task to be executed for each CTF test entry in @ref
+/// abigail::tests::read_common::InOutSpec.
+/// @param InOutSpec the array containing set of tests.
+///
+/// @param a_out_abi_base the output base directory for abixml files.
+///
+/// @param a_in_elf_base the input base directory for object files.
+///
+/// @param a_in_elf_base the input base directory for expected
+/// abixml files.
+test_task_ctf::test_task_ctf(const InOutSpec &s,
+                             string& a_out_abi_base,
+                             string& a_in_elf_base,
+                             string& a_in_abi_base)
+        : test_task(s, a_out_abi_base, a_in_elf_base, a_in_abi_base)
+  {}
+
+/// The thread function to execute each CTF test entry in @ref
+/// abigail::tests::read_common::InOutSpec.
+///
+/// This reads the corpus into memory, saves it to disk, loads it
+/// again and compares the new in-memory representation against the
+void
+test_task_ctf::perform()
+{
+  abigail::ir::environment_sptr env;
+
+  set_in_elf_path();
+  set_in_suppr_spec_path();
+
+  env.reset(new abigail::ir::environment);
+  abigail::elf_reader::status status =
+    abigail::elf_reader::STATUS_UNKNOWN;
+  ABG_ASSERT(abigail::tools_utils::file_exists(in_elf_path));
+
+  read_context_sptr ctxt = create_read_context(in_elf_path,
+                                               env.get());
+  ABG_ASSERT(ctxt);
+
+  corpus_sptr corp = read_corpus(ctxt.get(), status);
+  // if there is no output and no input, assume that we do not care about the
+  // actual read result, just that it succeeded.
+  if (!spec.in_abi_path && !spec.out_abi_path)
+    {
+        // Phew! we made it here and we did not crash! yay!
+        return;
+    }
+  if (!corp)
+    {
+        error_message = string("failed to read ") + in_elf_path  + "\n";
+        is_ok = false;
+        return;
+    }
+  corp->set_path(spec.in_elf_path);
+  // Do not take architecture names in comparison so that these
+  // test input binaries can come from whatever arch the
+  // programmer likes.
+  corp->set_architecture_name("");
+
+  if (!(is_ok = set_out_abi_path()))
+      return;
+
+  if (!(is_ok = serialize_corpus(out_abi_path, corp)))
+       return;
+
+  if (!(is_ok = run_abidw("--ctf ")))
+    return;
+
+  if (!(is_ok = run_diff()))
+      return;
+}
+
+/// Create a new CTF instance for task to be execute by the testsuite.
+///
+/// @param s the @ref abigail::tests::read_common::InOutSpec
+/// tests container.
+///
+/// @param a_out_abi_base the output base directory for abixml files.
+///
+/// @param a_in_elf_base the input base directory for object files.
+///
+/// @param a_in_abi_base the input base directory for abixml files.
+///
+/// @return abigail::tests::read_common::test_task instance.
+static test_task*
+new_task(const InOutSpec* s, string& a_out_abi_base,
+         string& a_in_elf_base, string& a_in_abi_base)
+{
+  return new test_task_ctf(*s, a_out_abi_base,
+                           a_in_elf_base, a_in_abi_base);
+}
+
+int
+main(int argc, char *argv[])
+{
+  options opts;
+  if (!parse_command_line(argc, argv, opts))
+    {
+      if (!opts.wrong_option.empty())
+        emit_prefix(argv[0], cerr)
+          << "unrecognized option: " << opts.wrong_option << "\n";
+        display_usage(argv[0], cerr);
+      return 1;
+    }
+
+  // compute number of tests to be executed.
+  const size_t num_tests = sizeof(in_out_specs) / sizeof(InOutSpec) - 1;
+
+  return run_tests(num_tests, in_out_specs, opts, new_task);
+}
diff --git a/tests/test-read-dwarf.cc b/tests/test-read-dwarf.cc
index 585aca5e..79fdc3d3 100644
--- a/tests/test-read-dwarf.cc
+++ b/tests/test-read-dwarf.cc
@@ -15,45 +15,27 @@ 
 #include <memory>
 #include <string>
 #include <vector>
-#include "abg-ir.h"
+#include "test-read-common.h"
 #include "abg-dwarf-reader.h"
-#include "abg-workers.h"
-#include "abg-writer.h"
-#include "abg-tools-utils.h"
-#include "test-utils.h"
 
 using std::vector;
 using std::string;
-using std::ofstream;
 using std::cerr;
-using std::dynamic_pointer_cast;
-using abigail::tests::get_build_dir;
+
+using abigail::tests::read_common::InOutSpec;
+using abigail::tests::read_common::test_task;
+using abigail::tests::read_common::display_usage;
+using abigail::tests::read_common::options;
+
 using abigail::dwarf_reader::read_corpus_from_elf;
 using abigail::dwarf_reader::read_context;
 using abigail::dwarf_reader::read_context_sptr;
 using abigail::dwarf_reader::create_read_context;
 using abigail::xml_writer::SEQUENCE_TYPE_ID_STYLE;
 using abigail::xml_writer::HASH_TYPE_ID_STYLE;
-using abigail::xml_writer::create_write_context;
-using abigail::xml_writer::set_type_id_style;
-using abigail::xml_writer::type_id_style_kind;
-using abigail::xml_writer::write_context_sptr;
-using abigail::xml_writer::write_corpus;
-
-/// This is an aggregate that specifies where a test shall get its
-/// input from, and where it shall write its ouput to.
-struct InOutSpec
-{
-  const char* in_elf_path;
-  const char* in_suppr_spec_path;
-  const char* in_public_headers_path;
-  type_id_style_kind type_id_style;
-  const char* in_abi_path;
-  const char* out_abi_path;
-};// end struct InOutSpec
-
+using abigail::tools_utils::emit_prefix;
 
-InOutSpec in_out_specs[] =
+static InOutSpec in_out_specs[] =
 {
   {
     "data/test-read-dwarf/test0",
@@ -104,7 +86,7 @@  InOutSpec in_out_specs[] =
     "output/test-read-dwarf/test2.so.hash.abi"
   },
   {
-    "data/test-read-dwarf/test3.so",
+    "data/test-read-common/test3.so",
     "",
     "",
     SEQUENCE_TYPE_ID_STYLE,
@@ -112,7 +94,7 @@  InOutSpec in_out_specs[] =
     "output/test-read-dwarf/test3.so.abi"
   },
   {
-    "data/test-read-dwarf/test3.so",
+    "data/test-read-common/test3.so",
     "",
     "",
     HASH_TYPE_ID_STYLE,
@@ -121,8 +103,8 @@  InOutSpec in_out_specs[] =
   },
   // suppress all except the main symbol of a group of aliases
   {
-    "data/test-read-dwarf/test3.so",
-    "data/test-read-dwarf/test3-alias-1.suppr",
+    "data/test-read-common/test3.so",
+    "data/test-read-common/test3-alias-1.suppr",
     "",
     HASH_TYPE_ID_STYLE,
     "data/test-read-dwarf/test3-alias-1.so.hash.abi",
@@ -130,8 +112,8 @@  InOutSpec in_out_specs[] =
   },
   // suppress the main symbol of a group of aliases
   {
-    "data/test-read-dwarf/test3.so",
-    "data/test-read-dwarf/test3-alias-2.suppr",
+    "data/test-read-common/test3.so",
+    "data/test-read-common/test3-alias-2.suppr",
     "",
     HASH_TYPE_ID_STYLE,
     "data/test-read-dwarf/test3-alias-2.so.hash.abi",
@@ -139,8 +121,8 @@  InOutSpec in_out_specs[] =
   },
   // suppress all except one non main symbol of a group of aliases
   {
-    "data/test-read-dwarf/test3.so",
-    "data/test-read-dwarf/test3-alias-3.suppr",
+    "data/test-read-common/test3.so",
+    "data/test-read-common/test3-alias-3.suppr",
     "",
     HASH_TYPE_ID_STYLE,
     "data/test-read-dwarf/test3-alias-3.so.hash.abi",
@@ -148,8 +130,8 @@  InOutSpec in_out_specs[] =
   },
   // suppress all symbols of a group of aliases
   {
-    "data/test-read-dwarf/test3.so",
-    "data/test-read-dwarf/test3-alias-4.suppr",
+    "data/test-read-common/test3.so",
+    "data/test-read-common/test3-alias-4.suppr",
     "",
     HASH_TYPE_ID_STYLE,
     "data/test-read-dwarf/test3-alias-4.so.hash.abi",
@@ -165,7 +147,7 @@  InOutSpec in_out_specs[] =
     "output/test-read-dwarf/test-suppressed-alias.o.abi",
   },
   {
-    "data/test-read-dwarf/test4.so",
+    "data/test-read-common/test4.so",
     "",
     "",
     SEQUENCE_TYPE_ID_STYLE,
@@ -173,7 +155,7 @@  InOutSpec in_out_specs[] =
     "output/test-read-dwarf/test4.so.abi"
   },
   {
-    "data/test-read-dwarf/test4.so",
+    "data/test-read-common/test4.so",
     "",
     "",
     HASH_TYPE_ID_STYLE,
@@ -449,7 +431,7 @@  InOutSpec in_out_specs[] =
     NULL,
   },
   {
-    "data/test-read-dwarf/PR26261/PR26261-exe",
+    "data/test-read-common/PR26261/PR26261-exe",
     "",
     "",
     SEQUENCE_TYPE_ID_STYLE,
@@ -457,7 +439,7 @@  InOutSpec in_out_specs[] =
     "output/test-read-dwarf/PR26261/PR26261-exe.abi",
   },
   {
-    "data/test-read-dwarf/test-PR26568-1.o",
+    "data/test-read-common/test-PR26568-1.o",
     "",
     "",
     SEQUENCE_TYPE_ID_STYLE,
@@ -465,7 +447,7 @@  InOutSpec in_out_specs[] =
     "output/test-read-dwarf/test-PR26568-1.o.abi",
   },
   {
-    "data/test-read-dwarf/test-PR26568-2.o",
+    "data/test-read-common/test-PR26568-2.o",
     "",
     "",
     SEQUENCE_TYPE_ID_STYLE,
@@ -481,9 +463,9 @@  InOutSpec in_out_specs[] =
     "output/test-read-dwarf/test-libandroid.so.abi",
   },
   {
-    "data/test-read-dwarf/PR27700/test-PR27700.o",
+    "data/test-read-common/PR27700/test-PR27700.o",
     "",
-    "data/test-read-dwarf/PR27700/pub-incdir",
+    "data/test-read-common/PR27700/pub-incdir",
     HASH_TYPE_ID_STYLE,
     "data/test-read-dwarf/PR27700/test-PR27700.abi",
     "output/test-read-dwarf/PR27700/test-PR27700.abi",
@@ -552,198 +534,138 @@  set_suppressions_from_headers(read_context& read_ctxt, const string& path)
     }
 }
 
-/// The task that peforms the tests.
-struct test_task : public abigail::workers::task
+/// Task specialization to perform DWARF tests.
+struct test_task_dwarf : public test_task
 {
-  bool is_ok;
-  InOutSpec spec;
-  string error_message;
-  string out_abi_base;
-  string in_elf_base;
-  string in_abi_base;
+  test_task_dwarf(const InOutSpec &s,
+                string& a_out_abi_base,
+                string& a_in_elf_base,
+                string& a_in_abi_base);
+  virtual void
+  perform();
 
-  test_task(const InOutSpec &s,
-	    string& a_out_abi_base,
-	    string& a_in_elf_base,
-	    string& a_in_abi_base)
-    : is_ok(true),
-      spec(s),
-      out_abi_base(a_out_abi_base),
-      in_elf_base(a_in_elf_base),
-      in_abi_base(a_in_abi_base)
+  virtual
+  ~test_task_dwarf()
   {}
+}; // end struct test_task_dwarf
 
-  /// The actual test.
-  ///
-  /// This reads the corpus into memory, saves it to disk, loads it
-  /// again and compares the new in-memory representation against the
-  /// saved one.
-  virtual void
-  perform()
-  {
-    string in_elf_path, in_abi_path, in_suppr_spec_path, in_public_headers_path,
-      out_abi_path;
-    abigail::ir::environment_sptr env;
+/// Constructor.
+///
+/// Task to be executed for each DWARF test entry in @ref
+/// abigail::tests::read_common::InOutSpec.
+///
+/// @param InOutSpec the array containing set of tests.
+///
+/// @param a_out_abi_base the output base directory for abixml files.
+///
+/// @param a_in_elf_base the input base directory for object files.
+///
+/// @param a_in_elf_base the input base directory for expected
+/// abixml files.
+test_task_dwarf::test_task_dwarf(const InOutSpec &s,
+                             string& a_out_abi_base,
+                             string& a_in_elf_base,
+                             string& a_in_abi_base)
+        : test_task(s, a_out_abi_base, a_in_elf_base, a_in_abi_base)
+  {}
 
-    in_elf_path = in_elf_base + spec.in_elf_path;
-    if (spec.in_suppr_spec_path)
-      in_suppr_spec_path = in_elf_base + spec.in_suppr_spec_path;
-    else
-      in_suppr_spec_path.clear();
+/// The thread function to execute each DWARF test entry in @ref
+/// abigail::tests::read_common::InOutSpec.
+///
+/// This reads the corpus into memory, saves it to disk, loads it
+/// again and compares the new in-memory representation against the
+void
+test_task_dwarf::perform()
+{
+  abigail::ir::environment_sptr env;
 
-    if (spec.in_public_headers_path)
-      in_public_headers_path = spec.in_public_headers_path;
-    if (!in_public_headers_path.empty())
-      in_public_headers_path = in_elf_base + spec.in_public_headers_path;
+  set_in_elf_path();
+  set_in_suppr_spec_path();
+  set_in_public_headers_path();
 
-    env.reset(new abigail::ir::environment);
-    abigail::elf_reader::status status =
+  env.reset(new abigail::ir::environment);
+  abigail::elf_reader::status status =
     abigail::elf_reader::STATUS_UNKNOWN;
-    vector<char**> di_roots;
-    ABG_ASSERT(abigail::tools_utils::file_exists(in_elf_path));
-    read_context_sptr ctxt = create_read_context(in_elf_path,
-						 di_roots,
-						 env.get());
-    ABG_ASSERT(ctxt);
-    if (!in_suppr_spec_path.empty())
-      set_suppressions(*ctxt, in_suppr_spec_path);
-
-    if (!in_public_headers_path.empty())
-      set_suppressions_from_headers(*ctxt, in_public_headers_path);
-
-    abigail::corpus_sptr corp = read_corpus_from_elf(*ctxt, status);
-    // if there is no output and no input, assume that we do not care about the
-    // actual read result, just that it succeeded.
-    if (!spec.in_abi_path && !spec.out_abi_path)
-      {
-	// Phew! we made it here and we did not crash! yay!
-	return;
-      }
-    if (!corp)
-      {
-	error_message = string("failed to read ") + in_elf_path  + "\n";
-	is_ok = false;
-	return;
-      }
-    corp->set_path(spec.in_elf_path);
-    // Do not take architecture names in comparison so that these
-    // test input binaries can come from whatever arch the
-    // programmer likes.
-    corp->set_architecture_name("");
+  vector<char**> di_roots;
+  ABG_ASSERT(abigail::tools_utils::file_exists(in_elf_path));
+  read_context_sptr ctxt = create_read_context(in_elf_path,
+                                               di_roots,
+                                               env.get());
+  ABG_ASSERT(ctxt);
+  if (!in_suppr_spec_path.empty())
+    set_suppressions(*ctxt, in_suppr_spec_path);
+
+  if (!in_public_headers_path.empty())
+    set_suppressions_from_headers(*ctxt, in_public_headers_path);
+
+  abigail::corpus_sptr corp = read_corpus_from_elf(*ctxt, status);
+  // if there is no output and no input, assume that we do not care about the
+  // actual read result, just that it succeeded.
+  if (!spec.in_abi_path && !spec.out_abi_path)
+    {
+      // Phew! we made it here and we did not crash! yay!
+      return;
+    }
+  if (!corp)
+    {
+      error_message = string("failed to read ") + in_elf_path  + "\n";
+      is_ok = false;
+      return;
+    }
+  corp->set_path(spec.in_elf_path);
+  // Do not take architecture names in comparison so that these
+  // test input binaries can come from whatever arch the
+  // programmer likes.
+  corp->set_architecture_name("");
 
-    out_abi_path = out_abi_base + spec.out_abi_path;
-    if (!abigail::tools_utils::ensure_parent_dir_created(out_abi_path))
-      {
-	error_message =
-	  string("Could not create parent directory for ") + out_abi_path;
-	is_ok = false;
-	return;
-      }
+  if (!(is_ok = set_out_abi_path()))
+      return;
 
-    ofstream of(out_abi_path.c_str(), std::ios_base::trunc);
-    if (!of.is_open())
-      {
-	error_message = string("failed to read ") + out_abi_path + "\n";
-	is_ok = false;
-	return;
-      }
-    write_context_sptr write_ctxt
-	= create_write_context(corp->get_environment(), of);
-    set_type_id_style(*write_ctxt, spec.type_id_style);
-    is_ok = write_corpus(*write_ctxt, corp, /*indent=*/0);
-    of.close();
+  if (!(is_ok = serialize_corpus(out_abi_path, corp)))
+       return;
 
-    string abidw = string(get_build_dir()) + "/tools/abidw";
-    string drop_private_types;
-    if (!in_public_headers_path.empty())
-      drop_private_types += "--headers-dir " + in_public_headers_path +
-	" --drop-private-types";
-    string cmd = abidw + " " + drop_private_types + " --abidiff " + in_elf_path;
-    if (system(cmd.c_str()))
-      {
-	error_message = string("ABIs differ:\n")
-	  + in_elf_path
-	  + "\nand:\n"
-	  + out_abi_path
-	  + "\n";
-	is_ok = false;
-      }
+  if (!(is_ok = run_abidw()))
+    return;
 
-    in_abi_path = in_abi_base + spec.in_abi_path;
-    cmd = "diff -u " + in_abi_path + " " + out_abi_path;
-    if (system(cmd.c_str()))
-      is_ok = false;
-  }
-}; // end struct test_task
+  if (!(is_ok = run_diff()))
+      return;
+}
 
-typedef shared_ptr<test_task> test_task_sptr;
+/// Create a new DWARF instance for task to be execute by the testsuite.
+///
+/// @param s the @ref abigail::tests::read_common::InOutSpec
+/// tests container.
+///
+/// @param a_out_abi_base the output base directory for abixml files.
+///
+/// @param a_in_elf_base the input base directory for object files.
+///
+/// @param a_in_abi_base the input base directory for abixml files.
+///
+/// @return abigail::tests::read_common::test_task instance.
+static test_task*
+new_task(const InOutSpec* s, string& a_out_abi_base,
+         string& a_in_elf_base, string& a_in_abi_base)
+{
+  return new test_task_dwarf(*s, a_out_abi_base,
+                             a_in_elf_base, a_in_abi_base);
+}
 
 int
 main(int argc, char *argv[])
 {
-  bool no_parallel = false;
-
-  if (argc == 2)
+  options opts;
+  if (!parse_command_line(argc, argv, opts))
     {
-      if (argv[1] == string("--no-parallel"))
-	no_parallel = true;
-      else
-	{
-	  cerr << "unrecognized option\n";
-	  cerr << "usage: " << argv[0] << " [--no-parallel]\n" ;
-	  return 1;
-	}
+      if (!opts.wrong_option.empty())
+        emit_prefix(argv[0], cerr)
+          << "unrecognized option: " << opts.wrong_option << "\n";
+        display_usage(argv[0], cerr);
+      return 1;
     }
 
-  /// Create a task queue.  The max number of worker threads of the
-  /// queue is the number of the concurrent threads supported by the
-  /// processor of the machine this code runs on.  But if
-  /// --no-parallel was provided then the number of worker threads
-  /// equals 1.
-  const size_t num_tests = sizeof(in_out_specs) / sizeof (InOutSpec) - 1;
-  size_t num_workers = (no_parallel
-			? 1
-			: std::min(abigail::workers::get_number_of_threads(),
-				   num_tests));
-  abigail::workers::queue task_queue(num_workers);
-  bool is_ok = true;
-
-  string out_abi_base = string(get_build_dir()) + "/tests/";
-  string in_elf_base  = string(abigail::tests::get_src_dir()) + "/tests/";
-  string in_abi_base = in_elf_base;
-
-  for (InOutSpec *s = in_out_specs; s->in_elf_path; ++s)
-    {
-      test_task_sptr t(new test_task(*s, out_abi_base,
-				     in_elf_base,
-				     in_abi_base));
-      ABG_ASSERT(task_queue.schedule_task(t));
-    }
-
-  /// Wait for all worker threads to finish their job, and wind down.
-  task_queue.wait_for_workers_to_complete();
-
-  // Now walk the results and print whatever error messages need to be
-  // printed.
-
-  const vector<abigail::workers::task_sptr>& completed_tasks =
-    task_queue.get_completed_tasks();
-
-  ABG_ASSERT(completed_tasks.size() == num_tests);
-
-  for (vector<abigail::workers::task_sptr>::const_iterator ti =
-	 completed_tasks.begin();
-       ti != completed_tasks.end();
-       ++ti)
-    {
-      test_task_sptr t = dynamic_pointer_cast<test_task>(*ti);
-      if (!t->is_ok)
-	{
-	  is_ok = false;
-	  if (!t->error_message.empty())
-	    cerr << t->error_message << '\n';
-	}
-    }
+  // compute number of tests to be executed.
+  const size_t num_tests = sizeof(in_out_specs) / sizeof(InOutSpec) - 1;
 
-  return !is_ok;
+  return run_tests(num_tests, in_out_specs, opts, new_task);
 }