From: Dodji Seketeli Date: Tue, 2 Feb 2021 11:35:54 +0000 (+0100) Subject: Bug 27165 - Better support multi-language binaries X-Git-Tag: libabigail-1.8.2~8 X-Git-Url: https://sourceware.org/git/?a=commitdiff_plain;h=271e3afaf6f2b6f38b4f125f64f5b24a8f78459f;p=libabigail.git Bug 27165 - Better support multi-language binaries In some binaries, a DIE named I originating from a compilation unit written in the C++ language can be an implementation of a DIE named S (linked through the DW_AT_specification attribute on I) originating from a compilation unit written in, say, the C language. In that case, when are we looking at I and try to get the scope of S (which the DWARF reader considers as the logical scope of I) get_scope_for_die needs to look at the DW_AT_language attribute carried by the compilation unit DIE of S. At the moment, we wrongly look at the DW_AT_language carried by the compilation unit DIE of I and we deduce the wrong language (C++ instead of C). This patch fixes that. * src/abg-dwarf-reader.cc (get_scope_for_die): Get the language of the DIE from the compilation unit of the DIE itself. * tests/data/test-types-stability/PR27165-libzmq.so.5.2.3: New test input. * tests/data/test-types-stability/PR27165-libzmq.so.5.2.3.debug: Debug information for the new test input. * tests/data/Makefile.am: Add the test inputs above to the source distribution. * tests/test-types-stability.cc (elf_paths): Add the new test inputs to this test harness. Signed-off-by: Dodji Seketeli --- diff --git a/src/abg-dwarf-reader.cc b/src/abg-dwarf-reader.cc index 761af3ec..13f1fe61 100644 --- a/src/abg-dwarf-reader.cc +++ b/src/abg-dwarf-reader.cc @@ -12777,7 +12777,9 @@ get_scope_for_die(read_context& ctxt, { const die_source source_of_die = ctxt.get_die_source(die); - if (is_c_language(ctxt.cur_transl_unit()->get_language())) + translation_unit::language die_lang = translation_unit::LANG_UNKNOWN; + ctxt.get_die_language(die, die_lang); + if (is_c_language(die_lang)) { ABG_ASSERT(dwarf_tag(die) != DW_TAG_member); return ctxt.global_scope(); diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index e1354534..40ad0e44 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -569,6 +569,8 @@ test-types-stability/pr19433-custom0 \ test-types-stability/pr19141-get5d.o \ test-types-stability/pr19142-topo.o \ test-types-stability/pr19204-libtcmalloc.so.4.2.6-xlc \ +test-types-stability/PR27165-libzmq.so.5.2.3 \ +test-types-stability/PR27165-libzmq.so.5.2.3.debug \ \ test-diff-filter/test0-v0.cc \ test-diff-filter/test0-v1.cc \ diff --git a/tests/data/test-types-stability/PR27165-libzmq.so.5.2.3 b/tests/data/test-types-stability/PR27165-libzmq.so.5.2.3 new file mode 100755 index 00000000..9e942da6 Binary files /dev/null and b/tests/data/test-types-stability/PR27165-libzmq.so.5.2.3 differ diff --git a/tests/data/test-types-stability/PR27165-libzmq.so.5.2.3.debug b/tests/data/test-types-stability/PR27165-libzmq.so.5.2.3.debug new file mode 100755 index 00000000..d8a5f7a2 Binary files /dev/null and b/tests/data/test-types-stability/PR27165-libzmq.so.5.2.3.debug differ diff --git a/tests/test-types-stability.cc b/tests/test-types-stability.cc index 22a85e64..1d173ade 100644 --- a/tests/test-types-stability.cc +++ b/tests/test-types-stability.cc @@ -48,6 +48,7 @@ const char* elf_paths[] = "data/test-types-stability/pr19141-get5d.o", "data/test-types-stability/pr19142-topo.o", "data/test-types-stability/pr19204-libtcmalloc.so.4.2.6-xlc", + "data/test-types-stability/PR27165-libzmq.so.5.2.3", // The below should always be the last element of array. 0 };