]> sourceware.org Git - libabigail.git/commitdiff
Bug PR29443 - Global variables not emitted to abixml in some cases
authorDodji Seketeli <dodji@redhat.com>
Mon, 19 Sep 2022 14:52:26 +0000 (16:52 +0200)
committerDodji Seketeli <dodji@redhat.com>
Tue, 20 Sep 2022 06:55:59 +0000 (08:55 +0200)
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>
src/abg-ir.cc
tests/data/Makefile.am
tests/data/test-annotate/PR29443-missing-xx.o.annotated.abi [new file with mode: 0644]
tests/data/test-read-dwarf/PR29443-missing-xx.cc [new file with mode: 0644]
tests/data/test-read-dwarf/PR29443-missing-xx.o [new file with mode: 0644]
tests/data/test-read-dwarf/PR29443-missing-xx.o.abi [new file with mode: 0644]
tests/test-annotate.cc
tests/test-read-dwarf.cc

index 91c8e99bd58e99f2da49c55a651fdc3a91ccdd4f..b3bec8fa1305e214d178d334f3c8242d97a170d6 100644 (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
index 782dd7f3befeb485a630df0a7d6009c0ba56f5d6..94f3c7bc7b3b6123d90cf6a68f9fc10c484bb1ff 100644 (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 \
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 (file)
index 0000000..dde6a74
--- /dev/null
@@ -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>
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 (file)
index 0000000..e9e5358
--- /dev/null
@@ -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 (file)
index 0000000..681c958
Binary files /dev/null and b/tests/data/test-read-dwarf/PR29443-missing-xx.o differ
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 (file)
index 0000000..5c5e4f9
--- /dev/null
@@ -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>
index 750f5e880b5769c4a2b6955674f745fd4be260ab..b8a1ee755629202e239ec4b30a2a5192418bc7b5 100644 (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}
 };
index 0de4bdd168e17d1e48bfa83e00dafcb7621d7fdb..0227c89b2388723fabdf730c654cb66c6068d071 100644 (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}
 };
This page took 0.069178 seconds and 5 git commands to generate.