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 <dodji@redhat.com>
This commit is contained in:
Dodji Seketeli 2021-02-02 12:35:54 +01:00
parent 23046152e0
commit 271e3afaf6
5 changed files with 6 additions and 1 deletions

View File

@ -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();

View File

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

Binary file not shown.

View File

@ -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
};