public inbox for libabigail@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v3] Add regression tests for ctf reading
       [not found] <0211122213353.2456208-1-guillermo.e.martinez@oracle.com>
@ 2021-12-01  3:06 ` Guillermo E. Martinez
  2021-12-09  4:44   ` Guillermo Martinez
                     ` (2 more replies)
  0 siblings, 3 replies; 6+ messages in thread
From: Guillermo E. Martinez @ 2021-12-01  3:06 UTC (permalink / raw)
  To: libabigail

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

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

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);
 }
-- 
2.33.0


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

* Re: [PATCH v3] Add regression tests for ctf reading
  2021-12-01  3:06 ` [PATCH v3] Add regression tests for ctf reading Guillermo E. Martinez
@ 2021-12-09  4:44   ` Guillermo Martinez
  2021-12-13 16:11   ` Dodji Seketeli
  2021-12-14  6:25   ` [PATCH v4] " Guillermo E. Martinez
  2 siblings, 0 replies; 6+ messages in thread
From: Guillermo Martinez @ 2021-12-09  4:44 UTC (permalink / raw)
  To: libabigail

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

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

* Re: [PATCH v3] Add regression tests for ctf reading
  2021-12-01  3:06 ` [PATCH v3] Add regression tests for ctf reading Guillermo E. Martinez
  2021-12-09  4:44   ` Guillermo Martinez
@ 2021-12-13 16:11   ` Dodji Seketeli
  2021-12-14  4:24     ` Guillermo Martinez
  2021-12-14  6:25   ` [PATCH v4] " Guillermo E. Martinez
  2 siblings, 1 reply; 6+ messages in thread
From: Dodji Seketeli @ 2021-12-13 16:11 UTC (permalink / raw)
  To: Guillermo E. Martinez via Libabigail

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,

-- 
		Dodji

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

* Re: [PATCH v3] Add regression tests for ctf reading
  2021-12-13 16:11   ` Dodji Seketeli
@ 2021-12-14  4:24     ` Guillermo Martinez
  0 siblings, 0 replies; 6+ messages in thread
From: Guillermo Martinez @ 2021-12-14  4:24 UTC (permalink / raw)
  To: Guillermo E. Martinez via Libabigail, Dodji Seketeli

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

 


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

* [PATCH v4] Add regression tests for ctf reading
  2021-12-01  3:06 ` [PATCH v3] Add regression tests for ctf reading Guillermo E. Martinez
  2021-12-09  4:44   ` Guillermo Martinez
  2021-12-13 16:11   ` Dodji Seketeli
@ 2021-12-14  6:25   ` Guillermo E. Martinez
  2021-12-14 15:47     ` Dodji Seketeli
  2 siblings, 1 reply; 6+ messages in thread
From: Guillermo E. Martinez @ 2021-12-14  6:25 UTC (permalink / raw)
  To: libabigail

Hello libabigail team,

This patch includes regression tests v4 for CTF.

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

Dependencies/limitations:

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

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

Comments will be appreciated.

Thanks in advanced!,
Guillermo

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

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

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

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

literal 0
HcmV?d00001

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

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

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

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

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

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

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

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

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

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

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

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

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


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

* Re: [PATCH v4] Add regression tests for ctf reading
  2021-12-14  6:25   ` [PATCH v4] " Guillermo E. Martinez
@ 2021-12-14 15:47     ` Dodji Seketeli
  0 siblings, 0 replies; 6+ messages in thread
From: Dodji Seketeli @ 2021-12-14 15:47 UTC (permalink / raw)
  To: Guillermo E. Martinez via Libabigail

Hello Guillermo,

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

[...]

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

Applied to master, thanks!

[...]

Cheers,

-- 
		Dodji

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

end of thread, other threads:[~2021-12-14 15:47 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <0211122213353.2456208-1-guillermo.e.martinez@oracle.com>
2021-12-01  3:06 ` [PATCH v3] Add regression tests for ctf reading Guillermo E. Martinez
2021-12-09  4:44   ` Guillermo Martinez
2021-12-13 16:11   ` Dodji Seketeli
2021-12-14  4:24     ` Guillermo Martinez
2021-12-14  6:25   ` [PATCH v4] " Guillermo E. Martinez
2021-12-14 15:47     ` Dodji Seketeli

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