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>
{
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();
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 \
"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
};