Bug PR29443 - Global variables not emitted to abixml in some cases

When a global variable named V has the same name as member variable
that appears in an anonymous scope and if the the abixml writer emits
the member variable V first, it gets confused when comes the time to
emit the global V as it wrongly thinks it's been already emitted.

This is because when emitting the "internal" pretty representation of
the member variable, libabigail fails to consider printing a qualified
name.  So the two 'V' wrongly have names that can't be told apart.

For instance consider the testcase example:

struct A {
  struct {
    int xx; // #0
  };
};

The qualified name of xx, for internal purposes (to name things
internally for the purpose of book keeping) would be:
    'A::__anonymous_struct__::xx'.

Libabigail wrongly names it 'xx', hence the confusion with the global variable.

Fixed thus.

	* src/abg-ir.cc (var_decl::get_pretty_representation): Always use
	qualified name of vars in an anonymous scope for internal
	purposes.
	* tests/data/test-annotate/PR29443-missing-xx.o.annotated.abi: New
	reference test output.
	* tests/test-annotate.cc (in_out_specs): Add the above to the test
	harness.
	* tests/data/test-read-dwarf/PR29443-missing-xx.cc: New source
	code for the test.
	* tests/data/test-read-dwarf/PR29443-missing-xx.o: New test input
	binary.
	* tests/data/test-read-dwarf/PR29443-missing-xx.o.abi: New test
	reference output.
	* tests/data/Makefile.am: Add the new test material to source
	distribution.
	* tests/test-read-dwarf.cc (in_out_specs): Add the above to the
	test harness.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
This commit is contained in:
Dodji Seketeli 2022-09-19 16:52:26 +02:00
parent ad47854627
commit 6de60eb70e
8 changed files with 84 additions and 2 deletions

View File

@ -19115,7 +19115,8 @@ var_decl::get_pretty_representation(bool internal, bool qualified_name) const
(is_class_or_union_type(get_type()),
"", /*one_line=*/true, internal);
result += " ";
if (member_of_anonymous_class || !qualified_name)
if (!internal
&& (member_of_anonymous_class || !qualified_name))
// It doesn't make sense to name the member of an
// anonymous class or union like:
// "__anonymous__::data_member_name". So let's just use
@ -19130,7 +19131,8 @@ var_decl::get_pretty_representation(bool internal, bool qualified_name) const
get_type_declaration(get_type())->get_qualified_name(internal)
+ " ";
if (member_of_anonymous_class || !qualified_name)
if (!internal
&& (member_of_anonymous_class || !qualified_name))
// It doesn't make sense to name the member of an
// anonymous class or union like:
// "__anonymous__::data_member_name". So let's just use

View File

@ -599,6 +599,9 @@ 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 \
tests/data/test-read-dwarf/PR29443-missing-xx.cc \
tests/data/test-read-dwarf/PR29443-missing-xx.o \
tests/data/test-read-dwarf/PR29443-missing-xx.o.abi \
\
test-read-ctf/test0 \
test-read-ctf/test0.abi \
@ -714,6 +717,7 @@ test-annotate/libtest24-drop-fns.so.abi \
test-annotate/test-anonymous-members-0.cc \
test-annotate/test-anonymous-members-0.o \
test-annotate/test-anonymous-members-0.o.abi \
tests/data/test-annotate/PR29443-missing-xx.o.annotated.abi \
\
test-types-stability/pr19434-elf0 \
test-types-stability/pr19139-DomainNeighborMapInst.o \

View File

@ -0,0 +1,32 @@
<abi-corpus version='2.1' architecture='elf-amd-x86_64'>
<elf-variable-symbols>
<!-- signed char -->
<elf-symbol name='a' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<!-- xx -->
<elf-symbol name='xx' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
<abi-instr address-size='64' path='PR29443-missing-xx.cc' comp-dir-path='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf' language='LANG_C_plus_plus_14'>
<!-- int -->
<type-decl name='int' size-in-bits='32' id='type-id-1'/>
<!-- struct A -->
<class-decl name='A' size-in-bits='32' is-struct='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/PR29443-missing-xx.cc' line='1' column='1' id='type-id-2'>
<member-type access='public'>
<!-- struct {int xx;} -->
<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/PR29443-missing-xx.cc' line='2' column='1' id='type-id-3'>
<data-member access='public' layout-offset-in-bits='0'>
<!-- int xx -->
<var-decl name='xx' type-id='type-id-1' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/PR29443-missing-xx.cc' line='3' column='1'/>
</data-member>
</class-decl>
</member-type>
<data-member access='public' layout-offset-in-bits='0'>
<!-- struct {int xx;} -->
<var-decl name='' type-id='type-id-3' visibility='default'/>
</data-member>
</class-decl>
<!-- A a -->
<var-decl name='a' type-id='type-id-2' mangled-name='a' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/PR29443-missing-xx.cc' line='7' column='1' elf-symbol-id='a'/>
<!-- int xx -->
<var-decl name='xx' type-id='type-id-1' mangled-name='xx' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/PR29443-missing-xx.cc' line='13' column='1' elf-symbol-id='xx'/>
</abi-instr>
</abi-corpus>

View File

@ -0,0 +1,8 @@
struct A {
struct {
int xx;
};
};
struct A a;
int xx;

Binary file not shown.

View File

@ -0,0 +1,23 @@
<abi-corpus version='2.1'>
<elf-variable-symbols>
<elf-symbol name='a' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
<elf-symbol name='xx' size='4' type='object-type' binding='global-binding' visibility='default-visibility' is-defined='yes'/>
</elf-variable-symbols>
<abi-instr address-size='64' path='PR29443-missing-xx.cc' comp-dir-path='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf' language='LANG_C_plus_plus_14'>
<type-decl name='int' size-in-bits='32' id='type-id-1'/>
<class-decl name='A' size-in-bits='32' is-struct='yes' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/PR29443-missing-xx.cc' line='1' column='1' id='type-id-2'>
<member-type access='public'>
<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/PR29443-missing-xx.cc' line='2' column='1' id='type-id-3'>
<data-member access='public' layout-offset-in-bits='0'>
<var-decl name='xx' type-id='type-id-1' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/PR29443-missing-xx.cc' line='3' column='1'/>
</data-member>
</class-decl>
</member-type>
<data-member access='public' layout-offset-in-bits='0'>
<var-decl name='' type-id='type-id-3' visibility='default'/>
</data-member>
</class-decl>
<var-decl name='a' type-id='type-id-2' mangled-name='a' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/PR29443-missing-xx.cc' line='7' column='1' elf-symbol-id='a'/>
<var-decl name='xx' type-id='type-id-1' mangled-name='xx' visibility='default' filepath='/home/dodji/git/libabigail/fixes/tests/data/test-read-dwarf/PR29443-missing-xx.cc' line='13' column='1' elf-symbol-id='xx'/>
</abi-instr>
</abi-corpus>

View File

@ -131,6 +131,11 @@ InOutSpec in_out_specs[] =
"data/test-annotate/test-anonymous-members-0.o.abi",
"output/test-annotate/test-anonymous-members-0.o.abi",
},
{
"data/test-read-dwarf/PR29443-missing-xx.o",
"data/test-annotate/PR29443-missing-xx.o.annotated.abi",
"output/test-annotate/PR29443-missing-xx.o.annotated.abi",
},
// This should be the last entry.
{NULL, NULL, NULL}
};

View File

@ -488,6 +488,14 @@ static InOutSpec in_out_specs[] =
"data/test-read-dwarf/PR28584/PR28584-smv.clang.o.abi",
"output/test-read-dwarf/PR28584/PR28584-smv.clang.o.abi",
},
{
"data/test-read-dwarf/PR29443-missing-xx.o",
"",
"",
SEQUENCE_TYPE_ID_STYLE,
"data/test-read-dwarf/PR29443-missing-xx.o.abi",
"output/test-read-dwarf/PR29443-missing-xx.o.abi",
},
// This should be the last entry.
{NULL, NULL, NULL, SEQUENCE_TYPE_ID_STYLE, NULL, NULL}
};