From 6de60eb70ef2fdfee87f386410ffc8e67c436018 Mon Sep 17 00:00:00 2001 From: Dodji Seketeli Date: Mon, 19 Sep 2022 16:52:26 +0200 Subject: [PATCH] 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 --- src/abg-ir.cc | 6 ++-- tests/data/Makefile.am | 4 +++ .../PR29443-missing-xx.o.annotated.abi | 32 ++++++++++++++++++ .../test-read-dwarf/PR29443-missing-xx.cc | 8 +++++ .../data/test-read-dwarf/PR29443-missing-xx.o | Bin 0 -> 2648 bytes .../test-read-dwarf/PR29443-missing-xx.o.abi | 23 +++++++++++++ tests/test-annotate.cc | 5 +++ tests/test-read-dwarf.cc | 8 +++++ 8 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 tests/data/test-annotate/PR29443-missing-xx.o.annotated.abi create mode 100644 tests/data/test-read-dwarf/PR29443-missing-xx.cc create mode 100644 tests/data/test-read-dwarf/PR29443-missing-xx.o create mode 100644 tests/data/test-read-dwarf/PR29443-missing-xx.o.abi diff --git a/src/abg-ir.cc b/src/abg-ir.cc index 91c8e99b..b3bec8fa 100644 --- a/src/abg-ir.cc +++ b/src/abg-ir.cc @@ -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 diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am index 782dd7f3..94f3c7bc 100644 --- a/tests/data/Makefile.am +++ b/tests/data/Makefile.am @@ -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 \ diff --git a/tests/data/test-annotate/PR29443-missing-xx.o.annotated.abi b/tests/data/test-annotate/PR29443-missing-xx.o.annotated.abi new file mode 100644 index 00000000..dde6a745 --- /dev/null +++ b/tests/data/test-annotate/PR29443-missing-xx.o.annotated.abi @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/data/test-read-dwarf/PR29443-missing-xx.cc b/tests/data/test-read-dwarf/PR29443-missing-xx.cc new file mode 100644 index 00000000..e9e53583 --- /dev/null +++ b/tests/data/test-read-dwarf/PR29443-missing-xx.cc @@ -0,0 +1,8 @@ +struct A { + struct { + int xx; + }; +}; + +struct A a; +int xx; diff --git a/tests/data/test-read-dwarf/PR29443-missing-xx.o b/tests/data/test-read-dwarf/PR29443-missing-xx.o new file mode 100644 index 0000000000000000000000000000000000000000..681c958f6a15a6cd3910bd7d0322ac1e217d1cd4 GIT binary patch literal 2648 zcmcIm%}*0S6o1og`C5x$6BRMA7>%OtmevLl1!{U`wn z0_H+@-v}bThJbNl=$*}w^BxAQ1V+#F7`tv>GjHeShEgZ7_#ivipEHfo;n9H;07i}( zJ*GKrk`K#a{Tz#{nJlFc*4w!$6FbR5N9aBara5aGw58MdiCux%AZq)mh-wCH7m+i@ ze)eaH(fsg3VN{GV#YR&{J84At;{Au#{H05Ut5%`t6r6%poG2D2rV10*g=Jo|mfT1h z?9#YpH=_-o&(yik1Fwpz8&ub3+EbJEWXZDYkY8&xdA`=FJ@)c-FUmK(id*sOuGh$~ zdTk!&BOXR!zUD@*5bc1wHM{oQ4OZd7a`9TJbj5CZVd(jFyWMuG)&Gz&xehGO&re$y za2n%(F$gg^JVxXeesmo%5>JPHBTNyKx){6y6FAw^@Z(p42@Fx?pv8c$gCHUX^d5ra zy-FYhjvPSo%EBOKQl$1YBypuHe#qImfbWG!-Pb;p_p$8g_S#|OR-Z_{?r%8jL2I1{(WYwt-}x|x(yY~d zRi?5MG)}&88bgJ!_}w9UnU)07voZss5I%za(R+KK=UX_16)joD=xPDUyZm z#X*!+eZ^l$OppIA9lrh{{`Dd8FH)Vr{2$`q%6QEUKFD|-SA8q|9SU?Vy8A~7==)Oh wQ}L8fk0slV1h=K*Ao8U1r!&#t9)*07ApK_(C%u2ln-sqz&;N5g7-c>FH#uS1YXATM literal 0 HcmV?d00001 diff --git a/tests/data/test-read-dwarf/PR29443-missing-xx.o.abi b/tests/data/test-read-dwarf/PR29443-missing-xx.o.abi new file mode 100644 index 00000000..5c5e4f96 --- /dev/null +++ b/tests/data/test-read-dwarf/PR29443-missing-xx.o.abi @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test-annotate.cc b/tests/test-annotate.cc index 750f5e88..b8a1ee75 100644 --- a/tests/test-annotate.cc +++ b/tests/test-annotate.cc @@ -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} }; diff --git a/tests/test-read-dwarf.cc b/tests/test-read-dwarf.cc index 0de4bdd1..0227c89b 100644 --- a/tests/test-read-dwarf.cc +++ b/tests/test-read-dwarf.cc @@ -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} }; -- 2.43.5