Consider file path when sorting virtual member functions
authorDodji Seketeli <dodji@redhat.com>
Fri, 3 Mar 2017 13:06:34 +0000 (14:06 +0100)
committerDodji Seketeli <dodji@redhat.com>
Fri, 3 Mar 2017 13:06:34 +0000 (14:06 +0100)
When two virtual member functions have the same index, same ELF
symbol, same pretty representation and only differ from their source
file paths, then this patch takes the source path into account in the
sorting.

Otherwise, this breaks the runtestreaddwarf test on EL6.

* src/abg-ir.cc (virtual_member_function_less_than::operator()):
Take the file path into account in the sorting.
* tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi:
Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
src/abg-ir.cc
tests/data/test-read-dwarf/test22-pr19097-libstdc++.so.6.0.17.so.abi

index 35d9b794d489aad36041a4a70c6fcf35a5478418..a5ce2eae78c63ff894640dc71a4c436d416fcf8c 100644 (file)
@@ -16327,6 +16327,22 @@ struct virtual_member_function_less_than
                sn = s.get_pretty_representation();
              }
          }
+
+       /// If it's just the file paths that are different then sort
+       /// them too.
+       if (fn == sn)
+         {
+           string fn_filepath, sn_filepath;
+           unsigned line = 0, column = 0;
+           location fn_loc = f.get_location(), sn_loc = s.get_location();
+           if (fn_loc)
+             fn_loc.expand(fn_filepath, line, column);
+           if (sn_loc)
+             sn_loc.expand(sn_filepath, line, column);
+
+           if (!fn_filepath.empty() && !sn_filepath.empty())
+             return fn_filepath < sn_filepath;
+         }
        return fn < sn;
       }
 
index cc0c84f9c9a5fe88eae4a67deea32c35d9ea662b..a036ab7b3e5b915ef3a91b7210fcedb064cd0ce6 100644 (file)
             <return type-id='type-id-249'/>
           </function-decl>
         </member-function>
+        <member-function access='protected' const='yes' vtable-offset='4'>
+          <function-decl name='do_scan_is' mangled-name='_ZNKSt5ctypeIwE10do_scan_isEtPKwS2_' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets.h' line='1282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE10do_scan_isEtPKwS2_@@GLIBCXX_3.4'>
+            <parameter type-id='type-id-648' is-artificial='yes'/>
+            <parameter type-id='type-id-636'/>
+            <parameter type-id='type-id-649'/>
+            <parameter type-id='type-id-649'/>
+            <return type-id='type-id-649'/>
+          </function-decl>
+        </member-function>
         <member-function access='protected' const='yes' vtable-offset='4'>
           <function-decl name='do_scan_is' mangled-name='_ZNKSt5ctypeIwE10do_scan_isEtPKwS2_' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/c++98/ctype_members.cc' line='185' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE10do_scan_isEtPKwS2_@@GLIBCXX_3.4'>
             <parameter type-id='type-id-648' is-artificial='yes'/>
             <return type-id='type-id-249'/>
           </function-decl>
         </member-function>
-        <member-function access='protected' const='yes' vtable-offset='4'>
-          <function-decl name='do_scan_is' mangled-name='_ZNKSt5ctypeIwE10do_scan_isEtPKwS2_' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets.h' line='1282' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE10do_scan_isEtPKwS2_@@GLIBCXX_3.4'>
+        <member-function access='protected' const='yes' vtable-offset='5'>
+          <function-decl name='do_scan_not' mangled-name='_ZNKSt5ctypeIwE11do_scan_notEtPKwS2_' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets.h' line='1300' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE11do_scan_notEtPKwS2_@@GLIBCXX_3.4'>
             <parameter type-id='type-id-648' is-artificial='yes'/>
             <parameter type-id='type-id-636'/>
             <parameter type-id='type-id-649'/>
             <return type-id='type-id-249'/>
           </function-decl>
         </member-function>
-        <member-function access='protected' const='yes' vtable-offset='5'>
-          <function-decl name='do_scan_not' mangled-name='_ZNKSt5ctypeIwE11do_scan_notEtPKwS2_' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets.h' line='1300' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE11do_scan_notEtPKwS2_@@GLIBCXX_3.4'>
-            <parameter type-id='type-id-648' is-artificial='yes'/>
-            <parameter type-id='type-id-636'/>
-            <parameter type-id='type-id-649'/>
-            <parameter type-id='type-id-649'/>
-            <return type-id='type-id-649'/>
-          </function-decl>
-        </member-function>
         <member-function access='protected' const='yes' vtable-offset='6'>
           <function-decl name='do_toupper' mangled-name='_ZNKSt5ctypeIwE10do_toupperEw' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets.h' line='1317' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE10do_toupperEw@@GLIBCXX_3.4'>
             <parameter type-id='type-id-648' is-artificial='yes'/>
           </function-decl>
         </member-function>
         <member-function access='protected' const='yes' vtable-offset='11'>
-          <function-decl name='do_widen' mangled-name='_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/c++98/ctype_members.cc' line='208' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw@@GLIBCXX_3.4'>
+          <function-decl name='do_widen' mangled-name='_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets.h' line='1409' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw@@GLIBCXX_3.4'>
             <parameter type-id='type-id-648' is-artificial='yes'/>
             <parameter type-id='type-id-11'/>
             <parameter type-id='type-id-11'/>
-            <parameter type-id='type-id-219'/>
+            <parameter type-id='type-id-650'/>
             <return type-id='type-id-11'/>
           </function-decl>
         </member-function>
         <member-function access='protected' const='yes' vtable-offset='11'>
-          <function-decl name='do_widen' mangled-name='_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets.h' line='1409' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw@@GLIBCXX_3.4'>
+          <function-decl name='do_widen' mangled-name='_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/c++98/ctype_members.cc' line='208' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE8do_widenEPKcS2_Pw@@GLIBCXX_3.4'>
             <parameter type-id='type-id-648' is-artificial='yes'/>
             <parameter type-id='type-id-11'/>
             <parameter type-id='type-id-11'/>
-            <parameter type-id='type-id-650'/>
+            <parameter type-id='type-id-219'/>
             <return type-id='type-id-11'/>
           </function-decl>
         </member-function>
         <member-function access='protected' const='yes' vtable-offset='12'>
-          <function-decl name='do_narrow' mangled-name='_ZNKSt5ctypeIwE9do_narrowEwc' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/c++98/ctype_members.cc' line='221' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE9do_narrowEwc@@GLIBCXX_3.4'>
+          <function-decl name='do_narrow' mangled-name='_ZNKSt5ctypeIwE9do_narrowEwc' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets.h' line='1432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE9do_narrowEwc@@GLIBCXX_3.4'>
             <parameter type-id='type-id-648' is-artificial='yes'/>
-            <parameter type-id='type-id-105'/>
+            <parameter type-id='type-id-641'/>
             <parameter type-id='type-id-15'/>
             <return type-id='type-id-15'/>
           </function-decl>
         </member-function>
         <member-function access='protected' const='yes' vtable-offset='12'>
-          <function-decl name='do_narrow' mangled-name='_ZNKSt5ctypeIwE9do_narrowEwc' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/include/bits/locale_facets.h' line='1432' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE9do_narrowEwc@@GLIBCXX_3.4'>
+          <function-decl name='do_narrow' mangled-name='_ZNKSt5ctypeIwE9do_narrowEwc' filepath='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/x86_64-unknown-linux-gnu/libstdc++-v3/src/c++98/ctype_members.cc' line='221' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='_ZNKSt5ctypeIwE9do_narrowEwc@@GLIBCXX_3.4'>
             <parameter type-id='type-id-648' is-artificial='yes'/>
-            <parameter type-id='type-id-641'/>
+            <parameter type-id='type-id-105'/>
             <parameter type-id='type-id-15'/>
             <return type-id='type-id-15'/>
           </function-decl>