diff mbox series

[v3] Add regression tests for ctf reading

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

Commit Message

Guillermo E. Martinez Dec. 1, 2021, 3:06 a.m. UTC
Hello libabigail team,

This patch includes regression tests v3 for CTF.

The changes from v2:
	- Add some other CTF tests to testsuite.
	- Add documentation code.
	- Fix code detected in code review.

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.
	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/test-annotate/test3.so.abi         |   4 +-
 tests/data/test-annotate/test4.so.abi         |  10 +-
 .../data/test-read-common/PR26261/PR26261-exe | Bin 0 -> 19008 bytes
 .../PR26261/PR26261-main.c                    |   0
 .../PR26261/PR26261-obja.c                    |   0
 .../PR26261/PR26261-obja.h                    |   0
 .../PR26261/PR26261-objb.c                    |   0
 .../PR26261/PR26261-objb.h                    |   0
 .../PR27700/include-dir/priv.h                |   0
 .../PR27700/include-dir/pub.h                 |   0
 .../PR27700/pub-incdir/inc.h                  |   0
 .../PR27700/test-PR27700.c                    |   2 +
 tests/data/test-read-common/crti.c            |  22 ++
 .../test-PR26568-1.c                          |   3 +
 .../test-PR26568-2.c                          |   3 +
 .../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-ambiguous-struct-A.o.hash.abi        |  36 ++
 .../test-read-ctf/test-ambiguous-struct-B.c   |   5 +
 .../test-ambiguous-struct-B.o.hash.abi        |  23 ++
 .../test-conflicting-type-syms-a.c            |   5 +
 .../test-conflicting-type-syms-a.o.hash.abi   |  14 +
 .../test-conflicting-type-syms-b.c            |   5 +
 .../test-conflicting-type-syms-b.o.hash.abi   |  13 +
 tests/data/test-read-ctf/test-dynamic-array.c |  13 +
 .../test-read-ctf/test-dynamic-array.o.abi    |  30 ++
 tests/data/test-read-ctf/test-enum-many.c     |  10 +
 .../test-read-ctf/test-enum-many.o.hash.abi   |  69 ++++
 tests/data/test-read-ctf/test-enum-symbol.c   |   1 +
 .../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.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.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.abi          |  42 +++
 tests/data/test-read-ctf/test8.c              |   7 +
 tests/data/test-read-ctf/test8.o.abi          |  13 +
 tests/data/test-read-ctf/test9.c              |  14 +
 tests/data/test-read-ctf/test9.o.abi          |  57 +++
 tests/data/test-read-dwarf/PR26261/Makefile   |  21 --
 .../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  |   8 +-
 .../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 +++++++-----------
 102 files changed, 2350 insertions(+), 353 deletions(-)
 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%)
 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%)
 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%)
 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/crti.c
 rename tests/data/{test-read-dwarf => test-read-common}/test-PR26568-1.c (61%)
 rename tests/data/{test-read-dwarf => test-read-common}/test-PR26568-2.c (56%)
 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.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.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.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.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.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.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.hash.abi
 create mode 100644 tests/data/test-read-ctf/test-enum.c
 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.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.abi
 create mode 100644 tests/data/test-read-ctf/test8.c
 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.abi
 delete mode 100644 tests/data/test-read-dwarf/PR26261/Makefile
 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

Guillermo E. Martinez Dec. 9, 2021, 4:44 a.m. UTC | #1
Hello libabigail team,

Ping ...

KInd Regards
Guillermo

On Tuesday, November 30, 2021 9:06:45 PM CST Guillermo E. Martinez wrote:
> Hello libabigail team,
> 
> This patch includes regression tests v3 for CTF.
> 
> The changes from v2:
> 	- Add some other CTF tests to testsuite.
> 	- Add documentation code.
> 	- Fix code detected in code review.
> 
> 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
Dodji Seketeli Dec. 13, 2021, 4:11 p.m. UTC | #2
Hello Guillermo,

I ran the tests and found some issues on my system.  I have described
them below.

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

[...]

> 	* tests/data/test-read-ctf/test-enum-many.o.hash.abi: Likewise.

[...]

>  tests/data/test-read-ctf/test-enum-many.c     |  10 +

[...]


> +++ b/tests/test-read-ctf.cc

[...]


> +  {
> +    "data/test-read-ctf/test-enum-many.o",

This file is not present in the patch.

So running the test yields:

$ ./build/tests/runtestreadctf 
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
NOT PROCESSED TYPE 18446744073709551615
runtestreadctf: /home/dodji/git/libabigail/patches/tests/test-read-ctf.cc:277: virtual void test_task_ctf::perform(): Assertion `__abg_cond__' failed.
Abandon (core dumped)
$

The program aborts because "tests/data/test-read-ctf/test-enum-many.o"
was not found.

You can detect this kind of problems by running 'make distcheck-fast'
before submitting the patch.  It's super helpful.

Also, please be aware that all new files to the tests/data/* directory
sub-tree have to be added to the tests/data/Makefile.am so that these
files are added to the final distribution tarball.  Otherwise, "make
distcheck-fast" will fail.

[...]

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 3f084d21..00000000
Binary files a/tests/data/test-read-dwarf/PR27700/test-PR27700.o and /dev/null differ
diff --git a/tests/data/test-read-dwarf/test-PR26568-1.o b/tests/data/test-read-dwarf/test-PR26568-1.o

[...]

> +++ b/tests/test-read-dwarf.cc

[...]

>    {
> -    "data/test-read-dwarf/test-PR26568-1.o",
> +    "data/test-read-common/test-PR26568-1.o",

This file data/test-read-common/test-PR26568-1.o doesn't exist in the
patch.

As a result, running runtestreaddwarf yields:


$ build/tests/runtestreaddwarf 
runtestreaddwarf: /home/dodji/git/libabigail/patches/tests/test-read-dwarf.cc:590: virtual void test_task_dwarf::perform(): Assertion `__abg_cond__' failed.
Abandon (core dumped)
$

It aborts because at least the file
"tests/data/test-read-common/test-PR26568-1.o" is not present.  This too
can be detected by running "make distcheck-fast".

[...]

I hope this helps.  Thanks.

Cheers,
Guillermo E. Martinez Dec. 14, 2021, 4:24 a.m. UTC | #3
On Monday, December 13, 2021 10:11:54 AM CST Dodji Seketeli wrote:
> Hello Guillermo,
Hello Dodji

> I ran the tests and found some issues on my system.  I have described
> them below.
> 
> "Guillermo E. Martinez via Libabigail" <libabigail@sourceware.org> a
> écrit:
> 
> [...]
> 
> > 	* tests/data/test-read-ctf/test-enum-many.o.hash.abi: Likewise.
> 
> [...]
> 
> >  tests/data/test-read-ctf/test-enum-many.c     |  10 +
> 
> [...]
> 
> 
> > +++ b/tests/test-read-ctf.cc
> 
> [...]
> 
> 
> > +  {
> > +    "data/test-read-ctf/test-enum-many.o",
> 
> This file is not present in the patch.
> 
> So running the test yields:
> 
> $ ./build/tests/runtestreadctf 
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
> NOT PROCESSED TYPE 18446744073709551615
Those message are corner cases that i future patches will be fixed. e.g:
   https://sourceware.org/pipermail/libabigail/2021q4/003994.html

> runtestreadctf: /home/dodji/git/libabigail/patches/tests/test-read-ctf.cc:277: virtual void test_task_ctf::perform(): Assertion `__abg_cond__' failed.
> Abandon (core dumped)
> $
> 
> The program aborts because "tests/data/test-read-ctf/test-enum-many.o"
> was not found.
Upss, so sorry! 
> You can detect this kind of problems by running 'make distcheck-fast'
> before submitting the patch.  It's super helpful.
OK, thanks for the advice, I will do so
> 
> Also, please be aware that all new files to the tests/data/* directory
> sub-tree have to be added to the tests/data/Makefile.am so that these
> files are added to the final distribution tarball.  Otherwise, "make
> distcheck-fast" will fail.
Ok I'll keep an eye on this.
> [...]
> 
> 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 3f084d21..00000000
> Binary files a/tests/data/test-read-dwarf/PR27700/test-PR27700.o and /dev/null differ
> diff --git a/tests/data/test-read-dwarf/test-PR26568-1.o b/tests/data/test-read-dwarf/test-PR26568-1.o
> 
> [...]
> 
> > +++ b/tests/test-read-dwarf.cc
> 
> [...]
> 
> >    {
> > -    "data/test-read-dwarf/test-PR26568-1.o",
> > +    "data/test-read-common/test-PR26568-1.o",
> 
> This file data/test-read-common/test-PR26568-1.o doesn't exist in the
> patch.
> 
> As a result, running runtestreaddwarf yields:
Upps, sorry again.

> $ build/tests/runtestreaddwarf 
> runtestreaddwarf: /home/dodji/git/libabigail/patches/tests/test-read-dwarf.cc:590: virtual void test_task_dwarf::perform(): Assertion `__abg_cond__' failed.
> Abandon (core dumped)
> $
> 
> It aborts because at least the file
> "tests/data/test-read-common/test-PR26568-1.o" is not present.  This too
> can be detected by running "make distcheck-fast".
OK
> [...]
> 
> I hope this helps.  Thanks.
sure thing!!
> Cheers,

Thanks so much for your comments, I'll send patch v4 soon,
Guillermo
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/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-common/PR26261/PR26261-exe b/tests/data/test-read-common/PR26261/PR26261-exe
new file mode 100755
index 0000000000000000000000000000000000000000..939e8071509f568b3628fc0ca6c3434a2de62cb6
GIT binary patch
literal 19008
zcmeHPeQX@X6`$Sn+2^nGC63cH0di5PNJxGD0D=P~>^X6AZk@#BqZAcb)^}(7==sjv
z?S;5)1g%rb$qgh@Mb!^gQCp#?{iCRAX$43PO+)}yl>rGMRS1fJT2QF@l*QNe_h#q$
z?$$O$Rf{ThN7{Mw-n`$NH*aQVXZLpRw!VQKx~2(Ey4Wg+3x^CTa&i=VC97mTqEQ%P
zod}CsNNR8xvWBQrVmhij6-)z4&j(7lldArtZh#}+AR^9_d6}|@L<v_;hAKLAjtnC)
z6(NTwoS%w{7pi|u$CMvTS#Q3*FoBW6h9peyRE{yN#8GUFh@)<7b#P2)6mC{g#*rI@
z8&tSKg=2a`=`-bcQcUPLqxx}1H^32Z5D{USmnrE|8hpu4P`M^d98sf+4oFT2ri{A=
zIP&vc6Ni1TYHz8yoKpQ`%Hioqr-n9N+L2DQr&F22q4q;Po7y*B8p&rP-Ll_gpLBQb
zJ|JD9X`n(Od8%7XMshx+;yGr7S-yzw2FSvT$c1U52XQlRTRGbtvr-vBJau4`*g4SO
zyUpy5bVn|O-pE)sqx4Kz(v^RjXa&b{EUZq|Q{DNht=X#$S)wr^-#E=x$SdQ)^&a&i
z;6=cTfENKT0$v2X2zU|jBH%^f|0e>m$$tc5Q~uXFgou6Tl&zPhW0PkBr{@FE^;&=N
zi5p|Z7h;ny&JOPHKYQw?<%WozeOO3x_V#6lD7D=S_}eXOw+nIlK&<!@jD})o`{vdg
zP@U?VixqKv>#*eQ3sEym_E9s7n%UUo;aOn^iTxuXO4F}u#~x!t;RS}sV7oN^@SHDJ
z{8Q}VSFVm})3GP09c67JP&2BL8Hi`l$c(VtWSdh5AbP}U>q*(xTP+v7M~=7L?{7s{
zTJArEU=)Hg9i>v~5q}By;u`dBIL&%9CMv+o&K3{PEmEWqpr%-OyLf<{niF<t>cH$&
z-`laNU30~!i)TwulzV9u5C1t<ESx&q_q_C)y;q?++c&Mm&k$8wEIr!ye5`nOCJUcp
zNBgF!oI!c&!1UCv=h5St;$KLXgzOIlf9&*dq-E_9DvIc}14p-9{sk1i++Tb;dZ54f
zPIP~?_`!kL(f0Ka?;F_gA<dDQr#^)Bhd=b$Yr6j0vQ`Wf-yA5uzP<SOXlccBvB}d~
zZ1b~)S7`2h^@iy6(Ho*SM$OaEqnRY<Sk<hOO?#Oa0WShx1iT1%5%415MZk-I7XdE<
zUIe@de2Nj!==a4nzAIyBlYUD+Z?;rQfDV8j1HIynQt20<eV}JR2SHy1{U&G)erWsv
z^g__<-z=5Vpes;EN&EU<p&bfoYnti;$F#ao2r~Lj|Gs~gN*hT5X>ncWH%`+1Ep+*}
zOyWCn+y%cHK}9qex<lXAT)P7efTj9D91|Z?KaTnY>Tz3J#*dWo#~>a@{lUt5{T8XP
z9kTmyOr!n=s_zYk?$-N*tM2mk1;a;c`hx4f=ieUeyrVW2?3t|F88mJV_C$l7(ct>t
zV7NE93i`dlfc*V-4)7V+;l7bMFL@F0BH%^9i+~paF9Kc!ya;#^@FL(v;D0>=5&Zs3
zsa8?Gr=fRMDK$9+H+6<AH7h=`+~Gf~cz!Q>jpFH^j?!v}h}c#`mgqi@64%!_teDXa
zS$gNAQdSmx4lm#NhG10j{LXS%@eNX0h#p1dy(P-46yK&OlR8y+RN>i=P9?`nxiT^S
zqmtv#Nu`h9V5NVW(!*__<WH!2CH~Y1zgPZA4es2w?TYYvyj{H^+|?cFjC6*(JG;BO
zaD>+<4~-{tsj+0nw$d8}-Ca9x8auJss%8d9*4>h$|2V{se*Zb?--!S^`umms&)kL;
z{|G3(`3-#;bd7$J9>c+oaf76y)4jc}g*Jou0#_ri(FT$G=QB}T<4<L5q5p<7eNwY-
zUsSBp{eka86d3CgdR-mqqued@Kx;b{17nv6y?({DD2GJ7_8h2IqiJp@w4X@-8uF-Z
zBTx0?qwpk-l6U}zPuzoC^@P6Lpq_9KI27~>ygox&bx%m{FK5?-<?hsJwIK@WzFra1
zeStesQ%^nd*O5NT=t-^96Vag26Abd+-7viWJ*pa|_f)Fzej4U|;&N&P2k@&w$b0ts
zT{V!uB;2Pn4l+nSEp!4+`U3YNuhAYtULI~gu^2BIojQt+&ljN3(m4D4<#G1aw#wmG
z(ec&SYTAcniZU3dv22jTt~a4-6*}*yObu?M)&@pfqsi$;Z`DxZkRYzNqq=E>)M=o}
z<vae+ZA}r$ucA8N@%wIT&Raq|znLbBetfVwKP0pZnw?2xpq)ENEkGR#YL^glxu$XO
zxka?pGF-@@u8qzCj9&|Ewl-3e`td{yOs-JOO|Y;``+Tsq(HC43Tn1|)tgiY>;R{~T
zcxB_}#{O2c*CHBap{7l{s7Zsw?-x{2dm$>eHu`W9*R^WCKx3l=B9%Zh{A3$FSUBn<
z+SN^L_M#?g%V_vPue8_TuTa)$J^v4Rr5p^xAGd?`ZU-Aa#=*w_mV<7u7KW|d1($<Y
z$<Q@cd)?pa1oj>$uubrLek3Wd&6m0&9jwOBqwxmSf<9k^fx+od!=t?)Y(`G2m!N4V
z2KRPv>fY4Vo*lZ`ipZs|N-_#P%o|PA>%3g9oYZ|VagIiZ78o6hR2bz|Oc_0b#(bh5
z`O==!2RsXmT8_~Q->aJ8Q_Z(R^VbH}`TYgI_Lkvqekm~GuYbAV_Z@ujL4QMFt6#fL
z$3uAy7u)c*p3R?dy$!dI*@aAU%SbYVi*OvQm5YyValVfVw~xf_VdRNht=w??CE@nG
zo!AoJ+$n}L=D3|R?TPWEX_>a@7|o6)JBB8PCOWb?E1phv<a2TQ=*k*OjaaF4hn>vZ
z`HqBTTe8@mOInHccy<gQD|M(IR~zky)rwHiz#hz|5~7g#S|)pIMqrgOX~3&cLjb9Y
zp-ME3V0_fd3Hjv|n^mJ=<woKH*+Fq@&Ke(2Cd{~%PSc!OI?>##5pR^-8d#1nA@v2{
z&C$1Bi|L;axsI<PuTlG3wzpQvf8>&PD>?6%SwDt?CRPf1uaOe@M`=F}O)Q(=|4JdU
zZ{VPIdH>Dw@1me#hr#=4mdk6~BK`dx6c+2(nI+^)#o;O0Zi_gw&OoU;EoT33QYEyY
zUvEOL;mbPrzVv;i@9tMn1}ZrJ-6FTV4swltVN&sAIqg4|BW^b>H>60yQ96P`ShR^%
zF8!U5hal&1VLMUCm+MV}?_*fLo8++13l;Brua$DvD$|0}=f#0`!<4=aIkoHd=WfWu
zQlmQiDdfxaHhh+9R8{<n<f0iMN6z<44?s?S3Ka+1Z&7*;M+oz<(`Dyz($^cspqkHM
zWukpJ*$FH8MkRj%a<b!&+v`f7_Z#xJHelXTa$bu$ZXZBS{c_tmL;7@4Qthf{g^1_u
zu1FT2QDWgTZEJ)CdAl$?j1?r2%q2%sc{_=PZ_JFRvzcTbnu)AAlFklUX)|GGb9vJ$
z91>XB#?whVnTT{Qu3-+RGAYx_<*W%4cRslZF`To;l4hbXHZ}oB1!qFju2SU%OkMCQ
zSX$_qRm+=c?${gM)o1qY-fo((TxBgG%<b3hj_&H;R$U{%Gld8j5wkC*EX20&73R)?
zJ-yKZbI*<)`}+2q`=h-BePmUBof^*<WWR)&q?MkRVvFm`U#}XK->g<GyND;C&Ihc(
zRejBhx_s6gwK9oxQkeaFpp{5v%tAhiew1CH9tty&Hgm~zHg4HTvSz2^=6DJ)b10uz
z=H=C3{(51W`*&?qVS4kq8f@IoEgiyK+5^=uI_lWO%A{>kJe@OPT27F3Ay!fWR30Ql
z3i^=IwE*d2(r=PQr%d{&Uro;hqK;f*x1(&}pl1|2aomoB8%Ht7&l-T2ZPK-gl9Jbw
zUC5|u%BuXLeQ-qz()rZx2reey$Vc>HbqI7ZpRi(Z3UVOXj~1?RXt1KK;4)Q5apD*)
zS2FfdwOx)MZl7^yC9m&Q`x4qhR0&)>?H1@>9JgY)KgA8U++c`EeqzkFhCuC{Lr1v;
z?PP9TL^4@B8Hx7xx6=v{8OanPqgH-YL=qDjfE{Y*oSK8lTt1b}R52#%FgYy(h=`o8
z5j%Ov77<z&P?weGPb4|27J|_P5X?CUXGL%jT!uMoEEPvvS=d4r8Be3&7{k055!!NL
zy+OeqMn!U{FaofZ8NpJf*i>dX%Vle5D3?6Q9KM}Tav3419>;%+qvv%r4{59^ozx8?
z^Z)B`p5)3I=~kxCfuZ@#_%pfzuKYg+Vab&<nmd*0GB9-hFn&fiz~TK0CE(|9{2Y+a
zA-2;6-FNW}j`6~05L}&A<^P{>;~ga-u0(;(EyjlxJ}l2leEXmj>Aa@CbNlSqHpobo
z@uLbqs_;Fit4w60GJOdQJyT@-357qQ@VuU||E$OKE5Oq;O6E^0{7HomtH#{^E3p_s
zfzM}>J*x1JDtxC><o4bDzXkQwC-!sxdQJ-y(q|kppYyn};8qkW@w^WSD}0nYrT|LJ
zaB<j$=lxtlEn56MmjUkfCl#L8INoQ8u!C^xGtYEN;n~gd|8F?>0f)@zjAOwMQK0@a
zelTpvs==@%qK7Ig633rKKSzPqcQst|_YM629BzH)nf@ABx*jl|pVP-85F)Xj!<BiK
zKZpt%d&cv=pa1{lgz}%~2jh4g&j3p*jOYKsnC*ZNiS-<AVf&Avq7pxUztHI*_&i+-
z|D+4g`}I`{zf}8d?->-RPwYSMbJr_8_m}lu!zrFc1<8~;s|m(mJTGwyjA!~X#9Xda
zeP*k}z3-}YvEtPw@Oza*$1063qWj(=GJ?FI@Yi!-NQmTapEf~m8R>1klyV_9@`>TF
z3v^d3flqC60NpO*E>?sU-W~rR(~~YF!v$crlDb@!xaZZvKdbsr&l6VS;Q7GwlGZ0z
fh$MdcDoI4ZWt`h}YU$o^ar{$;qp{HiaIxZF5)!Lb

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-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-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-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/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-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-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.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.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.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.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.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.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.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.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.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.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.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..c4ee0f38
--- /dev/null
+++ b/tests/data/test-read-ctf/test9.c
@@ -0,0 +1,14 @@ 
+// 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.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/Makefile b/tests/data/test-read-dwarf/PR26261/Makefile
deleted file mode 100644
index f66fa38a..00000000
--- a/tests/data/test-read-dwarf/PR26261/Makefile
+++ /dev/null
@@ -1,21 +0,0 @@ 
-SRCS	= PR26261-obja.c PR26261-objb.c PR26261-main.c
-EXE	= PR26261-exe
-OBJS	= $(SRCS:.c=.o)
-CFLAGS	= -Wall -g
-
-all: $(EXE)
-
-%.o: %.c
-	$(CC) $(CFLAGS) -c $<
-
-$(EXE): $(OBJS)
-	gcc -fPIC $(OBJS) -o $@
-
-cleanobjs:
-	rm -rf $(OBJS)
-
-cleanexe:
-	rm $(EXE)
-
-clean: cleanobjs
-	rm -rf *~ 
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..cd631bf1 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/tests/data/test-read-common/PR26261' language='LANG_C89'>
     <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/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/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/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/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/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/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/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/tests/data/test-read-common/PR26261' language='LANG_C89'>
     <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/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/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/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/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/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/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/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/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/tests/data/test-read-common/PR26261' language='LANG_C89'>
     <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/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/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/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/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/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/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..fff6ff74 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='test-PR27700.c' comp-dir-path='/home/byby/oracle/src/libabigail/tests/data/test-read-common/PR27700' 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'>
       <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='/home/byby/oracle/src/libabigail/tests/data/test-read-common/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/byby/oracle/src/libabigail/tests/data/test-read-common/PR27700/test-PR27700.c' line='4' 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..046d2d45 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='test-PR26568-1.c' comp-dir-path='/home/byby/oracle/src/libabigail/tests/data/test-read-common' language='LANG_C89'>
     <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='/home/byby/oracle/src/libabigail/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='/home/byby/oracle/src/libabigail/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='/home/byby/oracle/src/libabigail/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='/home/byby/oracle/src/libabigail/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='/home/byby/oracle/src/libabigail/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='/home/byby/oracle/src/libabigail/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='/home/byby/oracle/src/libabigail/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='/home/byby/oracle/src/libabigail/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..5240cee3 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='test-PR26568-2.c' comp-dir-path='/home/byby/oracle/src/libabigail/tests/data/test-read-common' language='LANG_C89'>
     <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='/home/byby/oracle/src/libabigail/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='/home/byby/oracle/src/libabigail/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='/home/byby/oracle/src/libabigail/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='/home/byby/oracle/src/libabigail/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='/home/byby/oracle/src/libabigail/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='/home/byby/oracle/src/libabigail/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='/home/byby/oracle/src/libabigail/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
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
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);
 }