public inbox for libabigail@sourceware.org
 help / color / mirror / Atom feed
* 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization
@ 2022-01-28 22:39 Thomas Schwinge
  2022-01-31 14:38 ` Thomas Schwinge
  2022-06-20 16:12 ` Dodji Seketeli
  0 siblings, 2 replies; 12+ messages in thread
From: Thomas Schwinge @ 2022-01-28 22:39 UTC (permalink / raw)
  To: libabigail; +Cc: Dodji Seketeli, Mark Wielaard

Hi!

It's late on a Friday evening, and very well this may just be me not
understanding libabigail/DWARF ;-) -- in context of
<https://sourceware.org/bugzilla/show_bug.cgi?id=21023#c10> or
<https://sourceware.org/bugzilla/show_bug.cgi?id=25042#c4>, I did a
simple experiment to disable the
'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value'
optimization:

    --- src/abg-dwarf-reader.cc
    +++ src/abg-dwarf-reader.cc
    [...]
     /// This function is a fast routine (optimization) to compare the
     /// values of two string attributes of two DIEs.
     ///
     /// @param l the first DIE to consider.
     ///
     /// @param r the second DIE to consider.
     ///
     /// @param attr_name the name of the attribute to compare, on the two
     /// DIEs above.
     ///
     /// @param result out parameter.  This is set to the result of the
     /// comparison.  If the value of attribute @p attr_name on DIE @p l
     /// equals the value of attribute @p attr_name on DIE @p r, then the
     /// the argument of this parameter is set to true.  Otherwise, it's
     /// set to false.  Note that the argument of this parameter is set iff
     /// the function returned true.
     ///
     /// @return true iff the comparison could be performed.  There are
     /// cases in which the comparison cannot be performed.  For instance,
     /// if one of the DIEs does not have the attribute @p attr_name.  In
     /// any case, if this function returns true, then the parameter @p
     /// result is set to the result of the comparison.
     static bool
     compare_dies_string_attribute_value(const Dwarf_Die *l, const Dwarf_Die *r,
                                    unsigned attr_name,
                                    bool &result)
     {
       Dwarf_Attribute l_attr, r_attr;
       if (!dwarf_attr_integrate(const_cast<Dwarf_Die*>(l), attr_name, &l_attr)
           || !dwarf_attr_integrate(const_cast<Dwarf_Die*>(r), attr_name, &r_attr))
         return false;

       ABG_ASSERT(l_attr.form == DW_FORM_strp
             || l_attr.form == DW_FORM_string
             || l_attr.form == DW_FORM_GNU_strp_alt
             || form_is_DW_FORM_strx(l_attr.form)
             || form_is_DW_FORM_line_strp(l_attr.form));

       ABG_ASSERT(r_attr.form == DW_FORM_strp
             || r_attr.form == DW_FORM_string
             || r_attr.form == DW_FORM_GNU_strp_alt
             || form_is_DW_FORM_strx(r_attr.form)
             || form_is_DW_FORM_line_strp(r_attr.form));

    +#if 0
       if ((l_attr.form == DW_FORM_strp
            && r_attr.form == DW_FORM_strp)
           || (l_attr.form == DW_FORM_GNU_strp_alt
          && r_attr.form == DW_FORM_GNU_strp_alt)
           || (form_is_DW_FORM_strx(l_attr.form)
          && form_is_DW_FORM_strx(r_attr.form))
           || (form_is_DW_FORM_line_strp(l_attr.form)
          && form_is_DW_FORM_line_strp(r_attr.form)))
         {
           // So these string attributes are actually pointers into a
           // string table.  The string table is most likely de-duplicated
           // so comparing the *values* of the pointers should be enough.
           //
           // This is the fast path.
           if (l_attr.valp == r_attr.valp)
          result = true;
           else if (l_attr.valp && r_attr.valp)
        result = *l_attr.valp == *r_attr.valp;
           else
        result = false;
           return true;
         }
    +#endif

       // If we reached this point it means we couldn't use the fast path
       // because the string atttributes are strings that are "inline" in
       // the debug info section.  Let's just compare them the slow and
       // obvious way.
       string l_str = die_string_attribute(l, attr_name),
         r_str = die_string_attribute(r, attr_name);
       result = l_str == r_str;

       return true;
     }

My assumption was that this shouldn't change anything other than possibly
regress performance.  However:

    [-PASS:-]{+FAIL:+} runtestreaddwarf

    --- build-libabigail/tests/runtestreaddwarf.log
    +++ build-libabigail/tests/runtestreaddwarf.log
    [...]
    -PASS runtestreaddwarf (exit status: 0)
    +--- [...]/source-libabigail/tests/data/test-read-dwarf/PR25007-sdhci.ko.abi        2022-01-28 22:48:07.049805043 +0100
    ++++ [...]/build-libabigail/tests/output/test-read-dwarf/PR25007-sdhci.ko.abi       2022-01-28 23:15:30.261483063 +0100
    +@@ -10107,10 +10107,19 @@
    +       <parameter type-id='type-id-1183'/>
    +       <return type-id='type-id-165'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1112'>
    ++      <parameter type-id='type-id-614'/>
    ++      <parameter type-id='type-id-279'/>
    ++      <return type-id='type-id-165'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1114'>
    +       <parameter type-id='type-id-125'/>
    +       <return type-id='type-id-165'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1153'>
    ++      <parameter type-id='type-id-279'/>
    ++      <return type-id='type-id-282'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1184'>
    +       <parameter type-id='type-id-238'/>
    +       <parameter type-id='type-id-1138'/>
    +@@ -10138,6 +10147,10 @@
    +       <parameter type-id='type-id-51'/>
    +       <return type-id='type-id-1195'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1198'>
    ++      <parameter type-id='type-id-538'/>
    ++      <return type-id='type-id-530'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1199'>
    +       <parameter type-id='type-id-1357'/>
    +       <return type-id='type-id-635'/>
    +@@ -10181,6 +10194,16 @@
    +       <parameter type-id='type-id-1553'/>
    +       <return type-id='type-id-53'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1224'>
    ++      <parameter type-id='type-id-24'/>
    ++      <parameter type-id='type-id-1143'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1225'>
    ++      <parameter type-id='type-id-165'/>
    ++      <parameter type-id='type-id-1143'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1226'>
    +       <parameter type-id='type-id-1118'/>
    +       <return type-id='type-id-53'/>
    +@@ -10370,6 +10393,13 @@
    +       <parameter type-id='type-id-411'/>
    +       <return type-id='type-id-53'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1256'>
    ++      <parameter type-id='type-id-335'/>
    ++      <parameter type-id='type-id-279'/>
    ++      <parameter type-id='type-id-1093'/>
    ++      <parameter type-id='type-id-125'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1257'>
    +       <parameter type-id='type-id-335'/>
    +       <parameter type-id='type-id-67'/>
    +@@ -10519,6 +10549,31 @@
    +       <parameter type-id='type-id-53'/>
    +       <return type-id='type-id-53'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1283'>
    ++      <parameter type-id='type-id-559'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1284'>
    ++      <parameter type-id='type-id-559'/>
    ++      <parameter type-id='type-id-165'/>
    ++      <parameter type-id='type-id-332'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1285'>
    ++      <parameter type-id='type-id-559'/>
    ++      <parameter type-id='type-id-559'/>
    ++      <parameter type-id='type-id-165'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1286'>
    ++      <parameter type-id='type-id-1343'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1287'>
    ++      <parameter type-id='type-id-1343'/>
    ++      <parameter type-id='type-id-125'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1288'>
    +       <parameter type-id='type-id-225'/>
    +       <parameter type-id='type-id-1151'/>
    +@@ -10531,6 +10586,17 @@
    +       <parameter type-id='type-id-172'/>
    +       <return type-id='type-id-53'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1290'>
    ++      <parameter type-id='type-id-614'/>
    ++      <parameter type-id='type-id-279'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1292'>
    ++      <parameter type-id='type-id-614'/>
    ++      <parameter type-id='type-id-279'/>
    ++      <parameter type-id='type-id-1350'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1294'>
    +       <parameter type-id='type-id-1357'/>
    +       <return type-id='type-id-53'/>
    +@@ -10591,6 +10657,10 @@
    +       <parameter type-id='type-id-100'/>
    +       <return type-id='type-id-53'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1305'>
    ++      <parameter type-id='type-id-274'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1306'>
    +       <parameter type-id='type-id-826'/>
    +       <parameter type-id='type-id-114'/>
    +@@ -10631,6 +10701,22 @@
    +       <parameter type-id='type-id-238'/>
    +       <return type-id='type-id-53'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1314'>
    ++      <parameter type-id='type-id-577'/>
    ++      <parameter type-id='type-id-559'/>
    ++      <parameter type-id='type-id-557'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1315'>
    ++      <parameter type-id='type-id-577'/>
    ++      <parameter type-id='type-id-557'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1316'>
    ++      <parameter type-id='type-id-577'/>
    ++      <parameter type-id='type-id-127'/>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1317'>
    +       <parameter type-id='type-id-241'/>
    +       <return type-id='type-id-53'/>
    +@@ -10746,6 +10832,10 @@
    +       <parameter type-id='type-id-114'/>
    +       <return type-id='type-id-67'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1363'>
    ++      <parameter type-id='type-id-1398'/>
    ++      <return type-id='type-id-67'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1364'>
    +       <parameter type-id='type-id-241'/>
    +       <parameter type-id='type-id-1409'/>
    +@@ -10770,6 +10860,14 @@
    +       <parameter type-id='type-id-1384'/>
    +       <return type-id='type-id-1085'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1427'>
    ++      <parameter type-id='type-id-1343'/>
    ++      <parameter type-id='type-id-1384'/>
    ++      <return type-id='type-id-1085'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1428'>
    ++      <return type-id='type-id-172'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1429'>
    +       <parameter type-id='type-id-515'/>
    +       <return type-id='type-id-172'/>
    +@@ -10815,6 +10913,9 @@
    +       <parameter type-id='type-id-399'/>
    +       <return type-id='type-id-399'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1437'>
    ++      <return type-id='type-id-533'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1438'>
    +       <parameter type-id='type-id-335'/>
    +       <parameter type-id='type-id-333'/>
    +@@ -10859,6 +10960,15 @@
    +       <parameter type-id='type-id-1360'/>
    +       <return type-id='type-id-1027'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1445'>
    ++      <parameter type-id='type-id-335'/>
    ++      <parameter type-id='type-id-279'/>
    ++      <parameter type-id='type-id-1093'/>
    ++      <parameter type-id='type-id-24'/>
    ++      <parameter type-id='type-id-333'/>
    ++      <parameter type-id='type-id-176'/>
    ++      <return type-id='type-id-1027'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1446'>
    +       <parameter type-id='type-id-335'/>
    +       <parameter type-id='type-id-1360'/>
    +@@ -10885,11 +10995,44 @@
    +       <parameter type-id='type-id-113'/>
    +       <return type-id='type-id-1027'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1449'>
    ++      <parameter type-id='type-id-1343'/>
    ++      <parameter type-id='type-id-24'/>
    ++      <parameter type-id='type-id-176'/>
    ++      <parameter type-id='type-id-333'/>
    ++      <return type-id='type-id-1027'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1450'>
    +       <parameter type-id='type-id-1347'/>
    +       <parameter type-id='type-id-1339'/>
    +       <return type-id='type-id-1027'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1451'>
    ++      <parameter type-id='type-id-279'/>
    ++      <parameter type-id='type-id-1088'/>
    ++      <parameter type-id='type-id-24'/>
    ++      <return type-id='type-id-1027'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1452'>
    ++      <parameter type-id='type-id-279'/>
    ++      <parameter type-id='type-id-1088'/>
    ++      <parameter type-id='type-id-165'/>
    ++      <parameter type-id='type-id-176'/>
    ++      <return type-id='type-id-1027'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1453'>
    ++      <parameter type-id='type-id-790'/>
    ++      <parameter type-id='type-id-1369'/>
    ++      <parameter type-id='type-id-24'/>
    ++      <return type-id='type-id-1027'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1454'>
    ++      <parameter type-id='type-id-790'/>
    ++      <parameter type-id='type-id-1369'/>
    ++      <parameter type-id='type-id-165'/>
    ++      <parameter type-id='type-id-176'/>
    ++      <return type-id='type-id-1027'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1455'>
    +       <parameter type-id='type-id-387'/>
    +       <parameter type-id='type-id-335'/>
    +@@ -10923,6 +11066,18 @@
    +       <parameter type-id='type-id-261'/>
    +       <return type-id='type-id-104'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1460'>
    ++      <parameter type-id='type-id-279'/>
    ++      <parameter type-id='type-id-1088'/>
    ++      <parameter type-id='type-id-53'/>
    ++      <return type-id='type-id-332'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1461'>
    ++      <parameter type-id='type-id-279'/>
    ++      <parameter type-id='type-id-1093'/>
    ++      <parameter type-id='type-id-53'/>
    ++      <return type-id='type-id-332'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1462'>
    +       <parameter type-id='type-id-1476'/>
    +       <return type-id='type-id-718'/>
    +@@ -10936,6 +11091,14 @@
    +       <parameter type-id='type-id-1402'/>
    +       <return type-id='type-id-113'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1468'>
    ++      <parameter type-id='type-id-335'/>
    ++      <parameter type-id='type-id-114'/>
    ++      <parameter type-id='type-id-114'/>
    ++      <parameter type-id='type-id-114'/>
    ++      <parameter type-id='type-id-114'/>
    ++      <return type-id='type-id-114'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1469'>
    +       <parameter type-id='type-id-1410'/>
    +       <parameter type-id='type-id-1409'/>
    +@@ -10949,6 +11112,10 @@
    +       <parameter type-id='type-id-1379'/>
    +       <return type-id='type-id-841'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1477'>
    ++      <parameter type-id='type-id-899'/>
    ++      <return type-id='type-id-1538'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1478'>
    +       <parameter type-id='type-id-308'/>
    +       <return type-id='type-id-1538'/>
    +@@ -11075,12 +11242,26 @@
    +       <parameter type-id='type-id-53'/>
    +       <return type-id='type-id-1538'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1501'>
    ++      <parameter type-id='type-id-1343'/>
    ++      <return type-id='type-id-1538'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1502'>
    +       <parameter type-id='type-id-1347'/>
    +       <parameter type-id='type-id-67'/>
    +       <parameter type-id='type-id-67'/>
    +       <return type-id='type-id-1538'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1503'>
    ++      <parameter type-id='type-id-279'/>
    ++      <return type-id='type-id-1538'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1504'>
    ++      <parameter type-id='type-id-279'/>
    ++      <parameter type-id='type-id-1356'/>
    ++      <parameter type-id='type-id-1346'/>
    ++      <return type-id='type-id-1538'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1505'>
    +       <parameter type-id='type-id-1357'/>
    +       <return type-id='type-id-1538'/>
    +@@ -11124,6 +11305,15 @@
    +       <parameter type-id='type-id-75'/>
    +       <return type-id='type-id-1538'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1514'>
    ++      <parameter type-id='type-id-274'/>
    ++      <return type-id='type-id-1538'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1515'>
    ++      <parameter type-id='type-id-274'/>
    ++      <parameter type-id='type-id-165'/>
    ++      <return type-id='type-id-1538'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1516'>
    +       <parameter type-id='type-id-139'/>
    +       <return type-id='type-id-1538'/>
    +@@ -11192,10 +11382,19 @@
    +       <parameter type-id='type-id-335'/>
    +       <return type-id='type-id-1538'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1528'>
    ++      <parameter type-id='type-id-577'/>
    ++      <parameter type-id='type-id-127'/>
    ++      <return type-id='type-id-1538'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1529'>
    +       <parameter type-id='type-id-241'/>
    +       <return type-id='type-id-1538'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1530'>
    ++      <parameter type-id='type-id-1418'/>
    ++      <return type-id='type-id-1538'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1531'>
    +       <parameter type-id='type-id-399'/>
    +       <return type-id='type-id-1538'/>
    +@@ -11210,6 +11409,10 @@
    +       <parameter type-id='type-id-114'/>
    +       <return type-id='type-id-1538'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1534'>
    ++      <parameter type-id='type-id-127'/>
    ++      <return type-id='type-id-1538'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1535'>
    +       <parameter type-id='type-id-127'/>
    +       <parameter type-id='type-id-1204'/>
    +@@ -11224,6 +11427,9 @@
    +       <parameter type-id='type-id-1550'/>
    +       <return type-id='type-id-1538'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1539'>
    ++      <return type-id='type-id-127'/>
    ++    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1540'>
    +       <parameter type-id='type-id-515'/>
    +       <parameter type-id='type-id-1123'/>
    +@@ -11241,223 +11447,6 @@
    +       <parameter type-id='type-id-114'/>
    +       <return type-id='type-id-127'/>
    +     </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1547'>
    +-      <parameter type-id='type-id-127'/>
    +-      <return type-id='type-id-127'/>
    +-    </function-type>
    +-    <type-decl name='void' id='type-id-1538'/>
    +-    <function-type size-in-bits='64' id='type-id-1112'>
    +-      <parameter type-id='type-id-614'/>
    +-      <parameter type-id='type-id-279'/>
    +-      <return type-id='type-id-165'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1153'>
    +-      <parameter type-id='type-id-279'/>
    +-      <return type-id='type-id-282'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1198'>
    +-      <parameter type-id='type-id-538'/>
    +-      <return type-id='type-id-530'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1220'>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1224'>
    +-      <parameter type-id='type-id-24'/>
    +-      <parameter type-id='type-id-1143'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1225'>
    +-      <parameter type-id='type-id-165'/>
    +-      <parameter type-id='type-id-1143'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1256'>
    +-      <parameter type-id='type-id-335'/>
    +-      <parameter type-id='type-id-279'/>
    +-      <parameter type-id='type-id-1093'/>
    +-      <parameter type-id='type-id-125'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1283'>
    +-      <parameter type-id='type-id-559'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1284'>
    +-      <parameter type-id='type-id-559'/>
    +-      <parameter type-id='type-id-165'/>
    +-      <parameter type-id='type-id-332'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1285'>
    +-      <parameter type-id='type-id-559'/>
    +-      <parameter type-id='type-id-559'/>
    +-      <parameter type-id='type-id-165'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1286'>
    +-      <parameter type-id='type-id-1343'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1287'>
    +-      <parameter type-id='type-id-1343'/>
    +-      <parameter type-id='type-id-125'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1290'>
    +-      <parameter type-id='type-id-614'/>
    +-      <parameter type-id='type-id-279'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1292'>
    +-      <parameter type-id='type-id-614'/>
    +-      <parameter type-id='type-id-279'/>
    +-      <parameter type-id='type-id-1350'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1305'>
    +-      <parameter type-id='type-id-274'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1314'>
    +-      <parameter type-id='type-id-577'/>
    +-      <parameter type-id='type-id-559'/>
    +-      <parameter type-id='type-id-557'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1315'>
    +-      <parameter type-id='type-id-577'/>
    +-      <parameter type-id='type-id-557'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1316'>
    +-      <parameter type-id='type-id-577'/>
    +-      <parameter type-id='type-id-127'/>
    +-      <return type-id='type-id-53'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1363'>
    +-      <parameter type-id='type-id-1398'/>
    +-      <return type-id='type-id-67'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1427'>
    +-      <parameter type-id='type-id-1343'/>
    +-      <parameter type-id='type-id-1384'/>
    +-      <return type-id='type-id-1085'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1428'>
    +-      <return type-id='type-id-172'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1437'>
    +-      <return type-id='type-id-533'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1445'>
    +-      <parameter type-id='type-id-335'/>
    +-      <parameter type-id='type-id-279'/>
    +-      <parameter type-id='type-id-1093'/>
    +-      <parameter type-id='type-id-24'/>
    +-      <parameter type-id='type-id-333'/>
    +-      <parameter type-id='type-id-176'/>
    +-      <return type-id='type-id-1027'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1449'>
    +-      <parameter type-id='type-id-1343'/>
    +-      <parameter type-id='type-id-24'/>
    +-      <parameter type-id='type-id-176'/>
    +-      <parameter type-id='type-id-333'/>
    +-      <return type-id='type-id-1027'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1451'>
    +-      <parameter type-id='type-id-279'/>
    +-      <parameter type-id='type-id-1088'/>
    +-      <parameter type-id='type-id-24'/>
    +-      <return type-id='type-id-1027'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1452'>
    +-      <parameter type-id='type-id-279'/>
    +-      <parameter type-id='type-id-1088'/>
    +-      <parameter type-id='type-id-165'/>
    +-      <parameter type-id='type-id-176'/>
    +-      <return type-id='type-id-1027'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1453'>
    +-      <parameter type-id='type-id-790'/>
    +-      <parameter type-id='type-id-1369'/>
    +-      <parameter type-id='type-id-24'/>
    +-      <return type-id='type-id-1027'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1454'>
    +-      <parameter type-id='type-id-790'/>
    +-      <parameter type-id='type-id-1369'/>
    +-      <parameter type-id='type-id-165'/>
    +-      <parameter type-id='type-id-176'/>
    +-      <return type-id='type-id-1027'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1460'>
    +-      <parameter type-id='type-id-279'/>
    +-      <parameter type-id='type-id-1088'/>
    +-      <parameter type-id='type-id-53'/>
    +-      <return type-id='type-id-332'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1461'>
    +-      <parameter type-id='type-id-279'/>
    +-      <parameter type-id='type-id-1093'/>
    +-      <parameter type-id='type-id-53'/>
    +-      <return type-id='type-id-332'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1468'>
    +-      <parameter type-id='type-id-335'/>
    +-      <parameter type-id='type-id-114'/>
    +-      <parameter type-id='type-id-114'/>
    +-      <parameter type-id='type-id-114'/>
    +-      <parameter type-id='type-id-114'/>
    +-      <return type-id='type-id-114'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1073'>
    +-      <return type-id='type-id-1538'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1477'>
    +-      <parameter type-id='type-id-899'/>
    +-      <return type-id='type-id-1538'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1501'>
    +-      <parameter type-id='type-id-1343'/>
    +-      <return type-id='type-id-1538'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1503'>
    +-      <parameter type-id='type-id-279'/>
    +-      <return type-id='type-id-1538'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1504'>
    +-      <parameter type-id='type-id-279'/>
    +-      <parameter type-id='type-id-1356'/>
    +-      <parameter type-id='type-id-1346'/>
    +-      <return type-id='type-id-1538'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1514'>
    +-      <parameter type-id='type-id-274'/>
    +-      <return type-id='type-id-1538'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1515'>
    +-      <parameter type-id='type-id-274'/>
    +-      <parameter type-id='type-id-165'/>
    +-      <return type-id='type-id-1538'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1528'>
    +-      <parameter type-id='type-id-577'/>
    +-      <parameter type-id='type-id-127'/>
    +-      <return type-id='type-id-1538'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1530'>
    +-      <parameter type-id='type-id-1418'/>
    +-      <return type-id='type-id-1538'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1534'>
    +-      <parameter type-id='type-id-127'/>
    +-      <return type-id='type-id-1538'/>
    +-    </function-type>
    +-    <function-type size-in-bits='64' id='type-id-1539'>
    +-      <return type-id='type-id-127'/>
    +-    </function-type>
    +     <function-type size-in-bits='64' id='type-id-1543'>
    +       <parameter type-id='type-id-279'/>
    +       <return type-id='type-id-127'/>
    +@@ -11477,48 +11466,19 @@
    +       <parameter type-id='type-id-1412'/>
    +       <return type-id='type-id-127'/>
    +     </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1547'>
    ++      <parameter type-id='type-id-127'/>
    ++      <return type-id='type-id-127'/>
    ++    </function-type>
    ++    <type-decl name='void' id='type-id-1538'/>
    ++    <function-type size-in-bits='64' id='type-id-1220'>
    ++      <return type-id='type-id-53'/>
    ++    </function-type>
    ++    <function-type size-in-bits='64' id='type-id-1073'>
    ++      <return type-id='type-id-1538'/>
    ++    </function-type>
    +   </abi-instr>
    +   <abi-instr address-size='64' path='drivers/mmc/host/sdhci.mod.c' comp-dir-path='/ws/android/kernel/aosp/common-mainline/out/android-mainline/common' language='LANG_C89'>
    +-    <class-decl name='anon_vma' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1555'/>
    +-    <class-decl name='audit_context' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1556'/>
    +-    <class-decl name='backing_dev_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1557'/>
    +-    <class-decl name='bio_list' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1558'/>
    +-    <class-decl name='blk_plug' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1559'/>
    +-    <class-decl name='capture_control' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1560'/>
    +-    <class-decl name='cfs_rq' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1561'/>
    +-    <class-decl name='files_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1562'/>
    +-    <class-decl name='fs_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1563'/>
    +-    <class-decl name='ftrace_ret_stack' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1564'/>
    +-    <class-decl name='kernfs_iattrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1565'/>
    +-    <class-decl name='kernfs_open_node' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1566'/>
    +-    <class-decl name='kioctx_table' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1567'/>
    +-    <class-decl name='kmem_cache' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1568'/>
    +-    <class-decl name='linux_binfmt' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1569'/>
    +-    <class-decl name='mem_cgroup' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1570'/>
    +-    <class-decl name='module_notes_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1571'/>
    +-    <class-decl name='module_param_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1572'/>
    +-    <class-decl name='module_sect_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1573'/>
    +-    <class-decl name='nameidata' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1574'/>
    +-    <class-decl name='perf_event' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1575'/>
    +-    <class-decl name='pipe_inode_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1576'/>
    +-    <class-decl name='poll_table_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1577'/>
    +-    <class-decl name='pollfd' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1578'/>
    +-    <class-decl name='rcu_node' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1579'/>
    +-    <class-decl name='reclaim_state' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1580'/>
    +-    <class-decl name='request_queue' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1581'/>
    +-    <class-decl name='rt_mutex_waiter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1582'/>
    +-    <class-decl name='rt_rq' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1583'/>
    +-    <class-decl name='sched_class' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1584'/>
    +-    <class-decl name='seccomp_filter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1585'/>
    +-    <class-decl name='seq_file' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1586'/>
    +-    <class-decl name='sock' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1587'/>
    +-    <class-decl name='task_group' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1588'/>
    +-    <class-decl name='trace_eval_map' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1589'/>
    +-    <class-decl name='trace_event_call' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1590'/>
    +-    <class-decl name='uprobe' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1591'/>
    +-    <class-decl name='user_namespace' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1592'/>
    +-    <class-decl name='workqueue_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1593'/>
    +-    <class-decl name='xol_area' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1594'/>
    +     <var-decl name='__this_module' type-id='type-id-789' mangled-name='__this_module' visibility='default' filepath='/ws/android/kernel/aosp/common-mainline/out/android-mainline/common/drivers/mmc/host/sdhci.mod.c' line='11' column='1' elf-symbol-id='__this_module'/>
    +   </abi-instr>
    + </abi-corpus>
    +ABIs differ:
    +[...]/source-libabigail/tests/data/test-read-dwarf/PR25007-sdhci.ko.abi
    +and:
    +[...]/build-libabigail/tests/output/test-read-dwarf/PR25007-sdhci.ko.abi
    +
    +FAIL runtestreaddwarf (exit status: 1)

Only that one test case.

The reordered 'function-type's -- but I've not yet verified whether
they're really just reordered -- may hint towards a sorting stability
issue, but there are also the disappearing 'class-decl's.

Unless somebody points out any misunderstanding on my side, I suppose I
shall try to figure out what's going wrong.


Grüße
 Thomas
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization
  2022-01-28 22:39 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization Thomas Schwinge
@ 2022-01-31 14:38 ` Thomas Schwinge
  2022-01-31 15:56   ` Giuliano Procida
  2022-06-20 16:12 ` Dodji Seketeli
  1 sibling, 1 reply; 12+ messages in thread
From: Thomas Schwinge @ 2022-01-31 14:38 UTC (permalink / raw)
  To: libabigail; +Cc: Dodji Seketeli, Mark Wielaard, Giuliano Procida

Hi!

On 2022-01-28T23:39:49+0100, I wrote:
> It's late on a Friday evening, and very well this may just be me not
> understanding libabigail/DWARF ;-) -- in context of
> <https://sourceware.org/bugzilla/show_bug.cgi?id=21023#c10> or
> <https://sourceware.org/bugzilla/show_bug.cgi?id=25042#c4>, I did a
> simple experiment to disable the
> 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value'
> optimization:

OK, something doesn't seem right here:

>     --- src/abg-dwarf-reader.cc
>     +++ src/abg-dwarf-reader.cc
>     [...]
>      /// This function is a fast routine (optimization) to compare the
>      /// values of two string attributes of two DIEs.
>      ///
>      /// @param l the first DIE to consider.
>      ///
>      /// @param r the second DIE to consider.
>      ///
>      /// @param attr_name the name of the attribute to compare, on the two
>      /// DIEs above.
>      ///
>      /// @param result out parameter.  This is set to the result of the
>      /// comparison.  If the value of attribute @p attr_name on DIE @p l
>      /// equals the value of attribute @p attr_name on DIE @p r, then the
>      /// the argument of this parameter is set to true.  Otherwise, it's
>      /// set to false.  Note that the argument of this parameter is set iff
>      /// the function returned true.
>      ///
>      /// @return true iff the comparison could be performed.  There are
>      /// cases in which the comparison cannot be performed.  For instance,
>      /// if one of the DIEs does not have the attribute @p attr_name.  In
>      /// any case, if this function returns true, then the parameter @p
>      /// result is set to the result of the comparison.
>      static bool
>      compare_dies_string_attribute_value(const Dwarf_Die *l, const Dwarf_Die *r,
>                                   unsigned attr_name,
>                                   bool &result)
>      {
>        Dwarf_Attribute l_attr, r_attr;
>        if (!dwarf_attr_integrate(const_cast<Dwarf_Die*>(l), attr_name, &l_attr)
>            || !dwarf_attr_integrate(const_cast<Dwarf_Die*>(r), attr_name, &r_attr))
>          return false;
>
>        ABG_ASSERT(l_attr.form == DW_FORM_strp
>            || l_attr.form == DW_FORM_string
>            || l_attr.form == DW_FORM_GNU_strp_alt
>            || form_is_DW_FORM_strx(l_attr.form)
>            || form_is_DW_FORM_line_strp(l_attr.form));
>
>        ABG_ASSERT(r_attr.form == DW_FORM_strp
>            || r_attr.form == DW_FORM_string
>            || r_attr.form == DW_FORM_GNU_strp_alt
>            || form_is_DW_FORM_strx(r_attr.form)
>            || form_is_DW_FORM_line_strp(r_attr.form));
>
>     +#if 0
>        if ((l_attr.form == DW_FORM_strp
>             && r_attr.form == DW_FORM_strp)
>            || (l_attr.form == DW_FORM_GNU_strp_alt
>         && r_attr.form == DW_FORM_GNU_strp_alt)
>            || (form_is_DW_FORM_strx(l_attr.form)
>         && form_is_DW_FORM_strx(r_attr.form))
>            || (form_is_DW_FORM_line_strp(l_attr.form)
>         && form_is_DW_FORM_line_strp(r_attr.form)))
>          {
>            // So these string attributes are actually pointers into a
>            // string table.  The string table is most likely de-duplicated
>            // so comparing the *values* of the pointers should be enough.
>            //
>            // This is the fast path.
>            if (l_attr.valp == r_attr.valp)
>         result = true;
>            else if (l_attr.valp && r_attr.valp)
>       result = *l_attr.valp == *r_attr.valp;
>            else
>       result = false;
>            return true;
>          }
>     +#endif
>
>        // If we reached this point it means we couldn't use the fast path
>        // because the string atttributes are strings that are "inline" in
>        // the debug info section.  Let's just compare them the slow and
>        // obvious way.
>        string l_str = die_string_attribute(l, attr_name),
>          r_str = die_string_attribute(r, attr_name);
>        result = l_str == r_str;
>
>        return true;
>      }

I re-enabled the "optimized" code, but added a simple 'assert' to verify
that its 'result' does match the "slow" 'result'.  (This indeed does
cause a number of more testsuite failures than the single one that I'd
mentioned before!)  Here's one case where the 'result's don't match.

First, the "slow" code:

    (gdb) call die_string_attribute(l, attr_name)
    $20 = "dwarf_getarangeinfo.c"
    (gdb) call die_string_attribute(r, attr_name)
    $21 = "dwarf_onearange.c"

Clearly not identical; thus ought to 'return false;'.  However, the
"optimized" code:

    (gdb) ptype l_attr
    type = struct Dwarf_Attribute {
        unsigned int code;
        unsigned int form;
        unsigned char *valp;
        Dwarf_CU *cu;
    }
    (gdb) print l_attr
    $5 = {code = 3, form = 14, valp = 0x7ffff45c97d9 "\351\024", cu = 0x7fffe8614670}
    (gdb) print r_attr
    $6 = {code = 3, form = 14, valp = 0x7ffff45c970d "\351\r", cu = 0x7fffe8614550}

So these are both 'DW_FORM_strp', eligible for "optimized" comparison:

    (gdb) print l_attr.valp == r_attr.valp
    $7 = false

OK.  Then:

    (gdb) print l_attr.valp && r_attr.valp
    $8 = true
    (gdb) print *l_attr.valp == *r_attr.valp
    $9 = true

This now does 'return true;'!

Given 'unsigned char *valp', what this only checks is that one byte at
'l_attr.valp' equals one byte at 'r_attr.valp' -- which evidently isn't
sufficient to demonstrate that 'l_attr' and 'r_attr' do match.  Therefore
it seems that this optimization is not correct?

I understand the purpose here is that for the supported and matching
'DW_FORM_*', not to call 'dwarf_formstring' (via the "slow" code's
'die_string_attribute'), because we don't actually need the strings, but
just identifiers (like, table indices) to compare.  But how to do this
properly?


Grüße
 Thomas


> My assumption was that this shouldn't change anything other than possibly
> regress performance.  However:
>
>     [-PASS:-]{+FAIL:+} runtestreaddwarf
>
>     --- build-libabigail/tests/runtestreaddwarf.log
>     +++ build-libabigail/tests/runtestreaddwarf.log
>     [...]
>     -PASS runtestreaddwarf (exit status: 0)
>     +--- [...]/source-libabigail/tests/data/test-read-dwarf/PR25007-sdhci.ko.abi      2022-01-28 22:48:07.049805043 +0100
>     ++++ [...]/build-libabigail/tests/output/test-read-dwarf/PR25007-sdhci.ko.abi     2022-01-28 23:15:30.261483063 +0100
>     +@@ -10107,10 +10107,19 @@
>     +       <parameter type-id='type-id-1183'/>
>     +       <return type-id='type-id-165'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1112'>
>     ++      <parameter type-id='type-id-614'/>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <return type-id='type-id-165'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1114'>
>     +       <parameter type-id='type-id-125'/>
>     +       <return type-id='type-id-165'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1153'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <return type-id='type-id-282'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1184'>
>     +       <parameter type-id='type-id-238'/>
>     +       <parameter type-id='type-id-1138'/>
>     +@@ -10138,6 +10147,10 @@
>     +       <parameter type-id='type-id-51'/>
>     +       <return type-id='type-id-1195'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1198'>
>     ++      <parameter type-id='type-id-538'/>
>     ++      <return type-id='type-id-530'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1199'>
>     +       <parameter type-id='type-id-1357'/>
>     +       <return type-id='type-id-635'/>
>     +@@ -10181,6 +10194,16 @@
>     +       <parameter type-id='type-id-1553'/>
>     +       <return type-id='type-id-53'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1224'>
>     ++      <parameter type-id='type-id-24'/>
>     ++      <parameter type-id='type-id-1143'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1225'>
>     ++      <parameter type-id='type-id-165'/>
>     ++      <parameter type-id='type-id-1143'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1226'>
>     +       <parameter type-id='type-id-1118'/>
>     +       <return type-id='type-id-53'/>
>     +@@ -10370,6 +10393,13 @@
>     +       <parameter type-id='type-id-411'/>
>     +       <return type-id='type-id-53'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1256'>
>     ++      <parameter type-id='type-id-335'/>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1093'/>
>     ++      <parameter type-id='type-id-125'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1257'>
>     +       <parameter type-id='type-id-335'/>
>     +       <parameter type-id='type-id-67'/>
>     +@@ -10519,6 +10549,31 @@
>     +       <parameter type-id='type-id-53'/>
>     +       <return type-id='type-id-53'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1283'>
>     ++      <parameter type-id='type-id-559'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1284'>
>     ++      <parameter type-id='type-id-559'/>
>     ++      <parameter type-id='type-id-165'/>
>     ++      <parameter type-id='type-id-332'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1285'>
>     ++      <parameter type-id='type-id-559'/>
>     ++      <parameter type-id='type-id-559'/>
>     ++      <parameter type-id='type-id-165'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1286'>
>     ++      <parameter type-id='type-id-1343'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1287'>
>     ++      <parameter type-id='type-id-1343'/>
>     ++      <parameter type-id='type-id-125'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1288'>
>     +       <parameter type-id='type-id-225'/>
>     +       <parameter type-id='type-id-1151'/>
>     +@@ -10531,6 +10586,17 @@
>     +       <parameter type-id='type-id-172'/>
>     +       <return type-id='type-id-53'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1290'>
>     ++      <parameter type-id='type-id-614'/>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1292'>
>     ++      <parameter type-id='type-id-614'/>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1350'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1294'>
>     +       <parameter type-id='type-id-1357'/>
>     +       <return type-id='type-id-53'/>
>     +@@ -10591,6 +10657,10 @@
>     +       <parameter type-id='type-id-100'/>
>     +       <return type-id='type-id-53'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1305'>
>     ++      <parameter type-id='type-id-274'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1306'>
>     +       <parameter type-id='type-id-826'/>
>     +       <parameter type-id='type-id-114'/>
>     +@@ -10631,6 +10701,22 @@
>     +       <parameter type-id='type-id-238'/>
>     +       <return type-id='type-id-53'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1314'>
>     ++      <parameter type-id='type-id-577'/>
>     ++      <parameter type-id='type-id-559'/>
>     ++      <parameter type-id='type-id-557'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1315'>
>     ++      <parameter type-id='type-id-577'/>
>     ++      <parameter type-id='type-id-557'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1316'>
>     ++      <parameter type-id='type-id-577'/>
>     ++      <parameter type-id='type-id-127'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1317'>
>     +       <parameter type-id='type-id-241'/>
>     +       <return type-id='type-id-53'/>
>     +@@ -10746,6 +10832,10 @@
>     +       <parameter type-id='type-id-114'/>
>     +       <return type-id='type-id-67'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1363'>
>     ++      <parameter type-id='type-id-1398'/>
>     ++      <return type-id='type-id-67'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1364'>
>     +       <parameter type-id='type-id-241'/>
>     +       <parameter type-id='type-id-1409'/>
>     +@@ -10770,6 +10860,14 @@
>     +       <parameter type-id='type-id-1384'/>
>     +       <return type-id='type-id-1085'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1427'>
>     ++      <parameter type-id='type-id-1343'/>
>     ++      <parameter type-id='type-id-1384'/>
>     ++      <return type-id='type-id-1085'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1428'>
>     ++      <return type-id='type-id-172'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1429'>
>     +       <parameter type-id='type-id-515'/>
>     +       <return type-id='type-id-172'/>
>     +@@ -10815,6 +10913,9 @@
>     +       <parameter type-id='type-id-399'/>
>     +       <return type-id='type-id-399'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1437'>
>     ++      <return type-id='type-id-533'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1438'>
>     +       <parameter type-id='type-id-335'/>
>     +       <parameter type-id='type-id-333'/>
>     +@@ -10859,6 +10960,15 @@
>     +       <parameter type-id='type-id-1360'/>
>     +       <return type-id='type-id-1027'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1445'>
>     ++      <parameter type-id='type-id-335'/>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1093'/>
>     ++      <parameter type-id='type-id-24'/>
>     ++      <parameter type-id='type-id-333'/>
>     ++      <parameter type-id='type-id-176'/>
>     ++      <return type-id='type-id-1027'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1446'>
>     +       <parameter type-id='type-id-335'/>
>     +       <parameter type-id='type-id-1360'/>
>     +@@ -10885,11 +10995,44 @@
>     +       <parameter type-id='type-id-113'/>
>     +       <return type-id='type-id-1027'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1449'>
>     ++      <parameter type-id='type-id-1343'/>
>     ++      <parameter type-id='type-id-24'/>
>     ++      <parameter type-id='type-id-176'/>
>     ++      <parameter type-id='type-id-333'/>
>     ++      <return type-id='type-id-1027'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1450'>
>     +       <parameter type-id='type-id-1347'/>
>     +       <parameter type-id='type-id-1339'/>
>     +       <return type-id='type-id-1027'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1451'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1088'/>
>     ++      <parameter type-id='type-id-24'/>
>     ++      <return type-id='type-id-1027'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1452'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1088'/>
>     ++      <parameter type-id='type-id-165'/>
>     ++      <parameter type-id='type-id-176'/>
>     ++      <return type-id='type-id-1027'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1453'>
>     ++      <parameter type-id='type-id-790'/>
>     ++      <parameter type-id='type-id-1369'/>
>     ++      <parameter type-id='type-id-24'/>
>     ++      <return type-id='type-id-1027'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1454'>
>     ++      <parameter type-id='type-id-790'/>
>     ++      <parameter type-id='type-id-1369'/>
>     ++      <parameter type-id='type-id-165'/>
>     ++      <parameter type-id='type-id-176'/>
>     ++      <return type-id='type-id-1027'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1455'>
>     +       <parameter type-id='type-id-387'/>
>     +       <parameter type-id='type-id-335'/>
>     +@@ -10923,6 +11066,18 @@
>     +       <parameter type-id='type-id-261'/>
>     +       <return type-id='type-id-104'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1460'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1088'/>
>     ++      <parameter type-id='type-id-53'/>
>     ++      <return type-id='type-id-332'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1461'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1093'/>
>     ++      <parameter type-id='type-id-53'/>
>     ++      <return type-id='type-id-332'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1462'>
>     +       <parameter type-id='type-id-1476'/>
>     +       <return type-id='type-id-718'/>
>     +@@ -10936,6 +11091,14 @@
>     +       <parameter type-id='type-id-1402'/>
>     +       <return type-id='type-id-113'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1468'>
>     ++      <parameter type-id='type-id-335'/>
>     ++      <parameter type-id='type-id-114'/>
>     ++      <parameter type-id='type-id-114'/>
>     ++      <parameter type-id='type-id-114'/>
>     ++      <parameter type-id='type-id-114'/>
>     ++      <return type-id='type-id-114'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1469'>
>     +       <parameter type-id='type-id-1410'/>
>     +       <parameter type-id='type-id-1409'/>
>     +@@ -10949,6 +11112,10 @@
>     +       <parameter type-id='type-id-1379'/>
>     +       <return type-id='type-id-841'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1477'>
>     ++      <parameter type-id='type-id-899'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1478'>
>     +       <parameter type-id='type-id-308'/>
>     +       <return type-id='type-id-1538'/>
>     +@@ -11075,12 +11242,26 @@
>     +       <parameter type-id='type-id-53'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1501'>
>     ++      <parameter type-id='type-id-1343'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1502'>
>     +       <parameter type-id='type-id-1347'/>
>     +       <parameter type-id='type-id-67'/>
>     +       <parameter type-id='type-id-67'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1503'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1504'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1356'/>
>     ++      <parameter type-id='type-id-1346'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1505'>
>     +       <parameter type-id='type-id-1357'/>
>     +       <return type-id='type-id-1538'/>
>     +@@ -11124,6 +11305,15 @@
>     +       <parameter type-id='type-id-75'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1514'>
>     ++      <parameter type-id='type-id-274'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1515'>
>     ++      <parameter type-id='type-id-274'/>
>     ++      <parameter type-id='type-id-165'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1516'>
>     +       <parameter type-id='type-id-139'/>
>     +       <return type-id='type-id-1538'/>
>     +@@ -11192,10 +11382,19 @@
>     +       <parameter type-id='type-id-335'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1528'>
>     ++      <parameter type-id='type-id-577'/>
>     ++      <parameter type-id='type-id-127'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1529'>
>     +       <parameter type-id='type-id-241'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1530'>
>     ++      <parameter type-id='type-id-1418'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1531'>
>     +       <parameter type-id='type-id-399'/>
>     +       <return type-id='type-id-1538'/>
>     +@@ -11210,6 +11409,10 @@
>     +       <parameter type-id='type-id-114'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1534'>
>     ++      <parameter type-id='type-id-127'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1535'>
>     +       <parameter type-id='type-id-127'/>
>     +       <parameter type-id='type-id-1204'/>
>     +@@ -11224,6 +11427,9 @@
>     +       <parameter type-id='type-id-1550'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1539'>
>     ++      <return type-id='type-id-127'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1540'>
>     +       <parameter type-id='type-id-515'/>
>     +       <parameter type-id='type-id-1123'/>
>     +@@ -11241,223 +11447,6 @@
>     +       <parameter type-id='type-id-114'/>
>     +       <return type-id='type-id-127'/>
>     +     </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1547'>
>     +-      <parameter type-id='type-id-127'/>
>     +-      <return type-id='type-id-127'/>
>     +-    </function-type>
>     +-    <type-decl name='void' id='type-id-1538'/>
>     +-    <function-type size-in-bits='64' id='type-id-1112'>
>     +-      <parameter type-id='type-id-614'/>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <return type-id='type-id-165'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1153'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <return type-id='type-id-282'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1198'>
>     +-      <parameter type-id='type-id-538'/>
>     +-      <return type-id='type-id-530'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1220'>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1224'>
>     +-      <parameter type-id='type-id-24'/>
>     +-      <parameter type-id='type-id-1143'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1225'>
>     +-      <parameter type-id='type-id-165'/>
>     +-      <parameter type-id='type-id-1143'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1256'>
>     +-      <parameter type-id='type-id-335'/>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1093'/>
>     +-      <parameter type-id='type-id-125'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1283'>
>     +-      <parameter type-id='type-id-559'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1284'>
>     +-      <parameter type-id='type-id-559'/>
>     +-      <parameter type-id='type-id-165'/>
>     +-      <parameter type-id='type-id-332'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1285'>
>     +-      <parameter type-id='type-id-559'/>
>     +-      <parameter type-id='type-id-559'/>
>     +-      <parameter type-id='type-id-165'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1286'>
>     +-      <parameter type-id='type-id-1343'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1287'>
>     +-      <parameter type-id='type-id-1343'/>
>     +-      <parameter type-id='type-id-125'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1290'>
>     +-      <parameter type-id='type-id-614'/>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1292'>
>     +-      <parameter type-id='type-id-614'/>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1350'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1305'>
>     +-      <parameter type-id='type-id-274'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1314'>
>     +-      <parameter type-id='type-id-577'/>
>     +-      <parameter type-id='type-id-559'/>
>     +-      <parameter type-id='type-id-557'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1315'>
>     +-      <parameter type-id='type-id-577'/>
>     +-      <parameter type-id='type-id-557'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1316'>
>     +-      <parameter type-id='type-id-577'/>
>     +-      <parameter type-id='type-id-127'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1363'>
>     +-      <parameter type-id='type-id-1398'/>
>     +-      <return type-id='type-id-67'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1427'>
>     +-      <parameter type-id='type-id-1343'/>
>     +-      <parameter type-id='type-id-1384'/>
>     +-      <return type-id='type-id-1085'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1428'>
>     +-      <return type-id='type-id-172'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1437'>
>     +-      <return type-id='type-id-533'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1445'>
>     +-      <parameter type-id='type-id-335'/>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1093'/>
>     +-      <parameter type-id='type-id-24'/>
>     +-      <parameter type-id='type-id-333'/>
>     +-      <parameter type-id='type-id-176'/>
>     +-      <return type-id='type-id-1027'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1449'>
>     +-      <parameter type-id='type-id-1343'/>
>     +-      <parameter type-id='type-id-24'/>
>     +-      <parameter type-id='type-id-176'/>
>     +-      <parameter type-id='type-id-333'/>
>     +-      <return type-id='type-id-1027'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1451'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1088'/>
>     +-      <parameter type-id='type-id-24'/>
>     +-      <return type-id='type-id-1027'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1452'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1088'/>
>     +-      <parameter type-id='type-id-165'/>
>     +-      <parameter type-id='type-id-176'/>
>     +-      <return type-id='type-id-1027'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1453'>
>     +-      <parameter type-id='type-id-790'/>
>     +-      <parameter type-id='type-id-1369'/>
>     +-      <parameter type-id='type-id-24'/>
>     +-      <return type-id='type-id-1027'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1454'>
>     +-      <parameter type-id='type-id-790'/>
>     +-      <parameter type-id='type-id-1369'/>
>     +-      <parameter type-id='type-id-165'/>
>     +-      <parameter type-id='type-id-176'/>
>     +-      <return type-id='type-id-1027'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1460'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1088'/>
>     +-      <parameter type-id='type-id-53'/>
>     +-      <return type-id='type-id-332'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1461'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1093'/>
>     +-      <parameter type-id='type-id-53'/>
>     +-      <return type-id='type-id-332'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1468'>
>     +-      <parameter type-id='type-id-335'/>
>     +-      <parameter type-id='type-id-114'/>
>     +-      <parameter type-id='type-id-114'/>
>     +-      <parameter type-id='type-id-114'/>
>     +-      <parameter type-id='type-id-114'/>
>     +-      <return type-id='type-id-114'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1073'>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1477'>
>     +-      <parameter type-id='type-id-899'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1501'>
>     +-      <parameter type-id='type-id-1343'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1503'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1504'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1356'/>
>     +-      <parameter type-id='type-id-1346'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1514'>
>     +-      <parameter type-id='type-id-274'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1515'>
>     +-      <parameter type-id='type-id-274'/>
>     +-      <parameter type-id='type-id-165'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1528'>
>     +-      <parameter type-id='type-id-577'/>
>     +-      <parameter type-id='type-id-127'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1530'>
>     +-      <parameter type-id='type-id-1418'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1534'>
>     +-      <parameter type-id='type-id-127'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1539'>
>     +-      <return type-id='type-id-127'/>
>     +-    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1543'>
>     +       <parameter type-id='type-id-279'/>
>     +       <return type-id='type-id-127'/>
>     +@@ -11477,48 +11466,19 @@
>     +       <parameter type-id='type-id-1412'/>
>     +       <return type-id='type-id-127'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1547'>
>     ++      <parameter type-id='type-id-127'/>
>     ++      <return type-id='type-id-127'/>
>     ++    </function-type>
>     ++    <type-decl name='void' id='type-id-1538'/>
>     ++    <function-type size-in-bits='64' id='type-id-1220'>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1073'>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +   </abi-instr>
>     +   <abi-instr address-size='64' path='drivers/mmc/host/sdhci.mod.c' comp-dir-path='/ws/android/kernel/aosp/common-mainline/out/android-mainline/common' language='LANG_C89'>
>     +-    <class-decl name='anon_vma' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1555'/>
>     +-    <class-decl name='audit_context' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1556'/>
>     +-    <class-decl name='backing_dev_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1557'/>
>     +-    <class-decl name='bio_list' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1558'/>
>     +-    <class-decl name='blk_plug' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1559'/>
>     +-    <class-decl name='capture_control' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1560'/>
>     +-    <class-decl name='cfs_rq' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1561'/>
>     +-    <class-decl name='files_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1562'/>
>     +-    <class-decl name='fs_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1563'/>
>     +-    <class-decl name='ftrace_ret_stack' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1564'/>
>     +-    <class-decl name='kernfs_iattrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1565'/>
>     +-    <class-decl name='kernfs_open_node' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1566'/>
>     +-    <class-decl name='kioctx_table' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1567'/>
>     +-    <class-decl name='kmem_cache' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1568'/>
>     +-    <class-decl name='linux_binfmt' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1569'/>
>     +-    <class-decl name='mem_cgroup' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1570'/>
>     +-    <class-decl name='module_notes_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1571'/>
>     +-    <class-decl name='module_param_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1572'/>
>     +-    <class-decl name='module_sect_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1573'/>
>     +-    <class-decl name='nameidata' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1574'/>
>     +-    <class-decl name='perf_event' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1575'/>
>     +-    <class-decl name='pipe_inode_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1576'/>
>     +-    <class-decl name='poll_table_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1577'/>
>     +-    <class-decl name='pollfd' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1578'/>
>     +-    <class-decl name='rcu_node' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1579'/>
>     +-    <class-decl name='reclaim_state' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1580'/>
>     +-    <class-decl name='request_queue' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1581'/>
>     +-    <class-decl name='rt_mutex_waiter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1582'/>
>     +-    <class-decl name='rt_rq' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1583'/>
>     +-    <class-decl name='sched_class' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1584'/>
>     +-    <class-decl name='seccomp_filter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1585'/>
>     +-    <class-decl name='seq_file' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1586'/>
>     +-    <class-decl name='sock' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1587'/>
>     +-    <class-decl name='task_group' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1588'/>
>     +-    <class-decl name='trace_eval_map' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1589'/>
>     +-    <class-decl name='trace_event_call' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1590'/>
>     +-    <class-decl name='uprobe' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1591'/>
>     +-    <class-decl name='user_namespace' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1592'/>
>     +-    <class-decl name='workqueue_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1593'/>
>     +-    <class-decl name='xol_area' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1594'/>
>     +     <var-decl name='__this_module' type-id='type-id-789' mangled-name='__this_module' visibility='default' filepath='/ws/android/kernel/aosp/common-mainline/out/android-mainline/common/drivers/mmc/host/sdhci.mod.c' line='11' column='1' elf-symbol-id='__this_module'/>
>     +   </abi-instr>
>     + </abi-corpus>
>     +ABIs differ:
>     +[...]/source-libabigail/tests/data/test-read-dwarf/PR25007-sdhci.ko.abi
>     +and:
>     +[...]/build-libabigail/tests/output/test-read-dwarf/PR25007-sdhci.ko.abi
>     +
>     +FAIL runtestreaddwarf (exit status: 1)
>
> Only that one test case.
>
> The reordered 'function-type's -- but I've not yet verified whether
> they're really just reordered -- may hint towards a sorting stability
> issue, but there are also the disappearing 'class-decl's.
>
> Unless somebody points out any misunderstanding on my side, I suppose I
> shall try to figure out what's going wrong.
>
>
> Grüße
>  Thomas
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization
  2022-01-31 14:38 ` Thomas Schwinge
@ 2022-01-31 15:56   ` Giuliano Procida
  2022-04-11 15:18     ` Dodji Seketeli
  0 siblings, 1 reply; 12+ messages in thread
From: Giuliano Procida @ 2022-01-31 15:56 UTC (permalink / raw)
  To: Thomas Schwinge; +Cc: libabigail, Dodji Seketeli, Mark Wielaard

Hi.

On Mon, 31 Jan 2022 at 14:38, Thomas Schwinge <thomas@codesourcery.com>
wrote:

> Hi!
>
> On 2022-01-28T23:39:49+0100, I wrote:
> > It's late on a Friday evening, and very well this may just be me not
> > understanding libabigail/DWARF ;-) -- in context of
> > <https://sourceware.org/bugzilla/show_bug.cgi?id=21023#c10> or
> > <https://sourceware.org/bugzilla/show_bug.cgi?id=25042#c4>, I did a
> > simple experiment to disable the
> > 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value'
> > optimization:
>
> OK, something doesn't seem right here:
>
> >     --- src/abg-dwarf-reader.cc
> >     +++ src/abg-dwarf-reader.cc
> >     [...]
> >      /// This function is a fast routine (optimization) to compare the
> >      /// values of two string attributes of two DIEs.
> >      ///
> >      /// @param l the first DIE to consider.
> >      ///
> >      /// @param r the second DIE to consider.
> >      ///
> >      /// @param attr_name the name of the attribute to compare, on the
> two
> >      /// DIEs above.
> >      ///
> >      /// @param result out parameter.  This is set to the result of the
> >      /// comparison.  If the value of attribute @p attr_name on DIE @p l
> >      /// equals the value of attribute @p attr_name on DIE @p r, then the
> >      /// the argument of this parameter is set to true.  Otherwise, it's
> >      /// set to false.  Note that the argument of this parameter is set
> iff
> >      /// the function returned true.
> >      ///
> >      /// @return true iff the comparison could be performed.  There are
> >      /// cases in which the comparison cannot be performed.  For
> instance,
> >      /// if one of the DIEs does not have the attribute @p attr_name.  In
> >      /// any case, if this function returns true, then the parameter @p
> >      /// result is set to the result of the comparison.
> >      static bool
> >      compare_dies_string_attribute_value(const Dwarf_Die *l, const
> Dwarf_Die *r,
> >                                   unsigned attr_name,
> >                                   bool &result)
> >      {
> >        Dwarf_Attribute l_attr, r_attr;
> >        if (!dwarf_attr_integrate(const_cast<Dwarf_Die*>(l), attr_name,
> &l_attr)
> >            || !dwarf_attr_integrate(const_cast<Dwarf_Die*>(r),
> attr_name, &r_attr))
> >          return false;
> >
> >        ABG_ASSERT(l_attr.form == DW_FORM_strp
> >            || l_attr.form == DW_FORM_string
> >            || l_attr.form == DW_FORM_GNU_strp_alt
> >            || form_is_DW_FORM_strx(l_attr.form)
> >            || form_is_DW_FORM_line_strp(l_attr.form));
> >
> >        ABG_ASSERT(r_attr.form == DW_FORM_strp
> >            || r_attr.form == DW_FORM_string
> >            || r_attr.form == DW_FORM_GNU_strp_alt
> >            || form_is_DW_FORM_strx(r_attr.form)
> >            || form_is_DW_FORM_line_strp(r_attr.form));
> >
> >     +#if 0
> >        if ((l_attr.form == DW_FORM_strp
> >             && r_attr.form == DW_FORM_strp)
> >            || (l_attr.form == DW_FORM_GNU_strp_alt
> >         && r_attr.form == DW_FORM_GNU_strp_alt)
> >            || (form_is_DW_FORM_strx(l_attr.form)
> >         && form_is_DW_FORM_strx(r_attr.form))
> >            || (form_is_DW_FORM_line_strp(l_attr.form)
> >         && form_is_DW_FORM_line_strp(r_attr.form)))
> >          {
> >            // So these string attributes are actually pointers into a
> >            // string table.  The string table is most likely
> de-duplicated
> >            // so comparing the *values* of the pointers should be enough.
> >            //
> >            // This is the fast path.
> >            if (l_attr.valp == r_attr.valp)
> >         result = true;
> >            else if (l_attr.valp && r_attr.valp)
> >       result = *l_attr.valp == *r_attr.valp;
> >            else
> >       result = false;
> >            return true;
> >          }
> >     +#endif
> >
> >        // If we reached this point it means we couldn't use the fast path
> >        // because the string atttributes are strings that are "inline" in
> >        // the debug info section.  Let's just compare them the slow and
> >        // obvious way.
> >        string l_str = die_string_attribute(l, attr_name),
> >          r_str = die_string_attribute(r, attr_name);
> >        result = l_str == r_str;
> >
> >        return true;
> >      }
>
> I re-enabled the "optimized" code, but added a simple 'assert' to verify
> that its 'result' does match the "slow" 'result'.  (This indeed does
> cause a number of more testsuite failures than the single one that I'd
> mentioned before!)  Here's one case where the 'result's don't match.
>
> First, the "slow" code:
>
>     (gdb) call die_string_attribute(l, attr_name)
>     $20 = "dwarf_getarangeinfo.c"
>     (gdb) call die_string_attribute(r, attr_name)
>     $21 = "dwarf_onearange.c"
>
> Clearly not identical; thus ought to 'return false;'.  However, the
> "optimized" code:
>
>     (gdb) ptype l_attr
>     type = struct Dwarf_Attribute {
>         unsigned int code;
>         unsigned int form;
>         unsigned char *valp;
>         Dwarf_CU *cu;
>     }
>     (gdb) print l_attr
>     $5 = {code = 3, form = 14, valp = 0x7ffff45c97d9 "\351\024", cu =
> 0x7fffe8614670}
>     (gdb) print r_attr
>     $6 = {code = 3, form = 14, valp = 0x7ffff45c970d "\351\r", cu =
> 0x7fffe8614550}
>
> So these are both 'DW_FORM_strp', eligible for "optimized" comparison:
>
>     (gdb) print l_attr.valp == r_attr.valp
>     $7 = false
>
> OK.  Then:
>
>     (gdb) print l_attr.valp && r_attr.valp
>     $8 = true
>     (gdb) print *l_attr.valp == *r_attr.valp
>     $9 = true
>
> This now does 'return true;'!
>
> Given 'unsigned char *valp', what this only checks is that one byte at
> 'l_attr.valp' equals one byte at 'r_attr.valp' -- which evidently isn't
> sufficient to demonstrate that 'l_attr' and 'r_attr' do match.  Therefore
> it seems that this optimization is not correct?
>
>
Looks like you've found one bug. It has compared addresses and moved on to
test data.

It could do strcmp at this point, assuming these things are null-terminated
strings, which is the case for DW_FORM_strp but is not for other things.

But there is another bug. I've instrumented the code and found cases (in
the test suite) where the fast path returns false, but the slow path
returns true. Both sides are DW_FORM_strx1. The data are not strings but
indexes and that the same string appears at different indexes.


> I understand the purpose here is that for the supported and matching
> 'DW_FORM_*', not to call 'dwarf_formstring' (via the "slow" code's
> 'die_string_attribute'), because we don't actually need the strings, but
> just identifiers (like, table indices) to compare.  But how to do this
> properly?
>
>
The optimisation could be restricted to check pointers and indexes only and
also no longer assume distinct references mean distinct data.

Giuliano.


>
> Grüße
>  Thomas
>
>
> > My assumption was that this shouldn't change anything other than possibly
> > regress performance.  However:
> >
> >     [-PASS:-]{+FAIL:+} runtestreaddwarf
> >
> >     --- build-libabigail/tests/runtestreaddwarf.log
> >     +++ build-libabigail/tests/runtestreaddwarf.log
> >     [...]
> >     -PASS runtestreaddwarf (exit status: 0)
> >     +---
> [...]/source-libabigail/tests/data/test-read-dwarf/PR25007-sdhci.ko.abi
>   2022-01-28 22:48:07.049805043 +0100
> >     ++++
> [...]/build-libabigail/tests/output/test-read-dwarf/PR25007-sdhci.ko.abi
>  2022-01-28 23:15:30.261483063 +0100
> >     +@@ -10107,10 +10107,19 @@
> >     +       <parameter type-id='type-id-1183'/>
> >     +       <return type-id='type-id-165'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1112'>
> >     ++      <parameter type-id='type-id-614'/>
> >     ++      <parameter type-id='type-id-279'/>
> >     ++      <return type-id='type-id-165'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1114'>
> >     +       <parameter type-id='type-id-125'/>
> >     +       <return type-id='type-id-165'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1153'>
> >     ++      <parameter type-id='type-id-279'/>
> >     ++      <return type-id='type-id-282'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1184'>
> >     +       <parameter type-id='type-id-238'/>
> >     +       <parameter type-id='type-id-1138'/>
> >     +@@ -10138,6 +10147,10 @@
> >     +       <parameter type-id='type-id-51'/>
> >     +       <return type-id='type-id-1195'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1198'>
> >     ++      <parameter type-id='type-id-538'/>
> >     ++      <return type-id='type-id-530'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1199'>
> >     +       <parameter type-id='type-id-1357'/>
> >     +       <return type-id='type-id-635'/>
> >     +@@ -10181,6 +10194,16 @@
> >     +       <parameter type-id='type-id-1553'/>
> >     +       <return type-id='type-id-53'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1224'>
> >     ++      <parameter type-id='type-id-24'/>
> >     ++      <parameter type-id='type-id-1143'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1225'>
> >     ++      <parameter type-id='type-id-165'/>
> >     ++      <parameter type-id='type-id-1143'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1226'>
> >     +       <parameter type-id='type-id-1118'/>
> >     +       <return type-id='type-id-53'/>
> >     +@@ -10370,6 +10393,13 @@
> >     +       <parameter type-id='type-id-411'/>
> >     +       <return type-id='type-id-53'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1256'>
> >     ++      <parameter type-id='type-id-335'/>
> >     ++      <parameter type-id='type-id-279'/>
> >     ++      <parameter type-id='type-id-1093'/>
> >     ++      <parameter type-id='type-id-125'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1257'>
> >     +       <parameter type-id='type-id-335'/>
> >     +       <parameter type-id='type-id-67'/>
> >     +@@ -10519,6 +10549,31 @@
> >     +       <parameter type-id='type-id-53'/>
> >     +       <return type-id='type-id-53'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1283'>
> >     ++      <parameter type-id='type-id-559'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1284'>
> >     ++      <parameter type-id='type-id-559'/>
> >     ++      <parameter type-id='type-id-165'/>
> >     ++      <parameter type-id='type-id-332'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1285'>
> >     ++      <parameter type-id='type-id-559'/>
> >     ++      <parameter type-id='type-id-559'/>
> >     ++      <parameter type-id='type-id-165'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1286'>
> >     ++      <parameter type-id='type-id-1343'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1287'>
> >     ++      <parameter type-id='type-id-1343'/>
> >     ++      <parameter type-id='type-id-125'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1288'>
> >     +       <parameter type-id='type-id-225'/>
> >     +       <parameter type-id='type-id-1151'/>
> >     +@@ -10531,6 +10586,17 @@
> >     +       <parameter type-id='type-id-172'/>
> >     +       <return type-id='type-id-53'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1290'>
> >     ++      <parameter type-id='type-id-614'/>
> >     ++      <parameter type-id='type-id-279'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1292'>
> >     ++      <parameter type-id='type-id-614'/>
> >     ++      <parameter type-id='type-id-279'/>
> >     ++      <parameter type-id='type-id-1350'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1294'>
> >     +       <parameter type-id='type-id-1357'/>
> >     +       <return type-id='type-id-53'/>
> >     +@@ -10591,6 +10657,10 @@
> >     +       <parameter type-id='type-id-100'/>
> >     +       <return type-id='type-id-53'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1305'>
> >     ++      <parameter type-id='type-id-274'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1306'>
> >     +       <parameter type-id='type-id-826'/>
> >     +       <parameter type-id='type-id-114'/>
> >     +@@ -10631,6 +10701,22 @@
> >     +       <parameter type-id='type-id-238'/>
> >     +       <return type-id='type-id-53'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1314'>
> >     ++      <parameter type-id='type-id-577'/>
> >     ++      <parameter type-id='type-id-559'/>
> >     ++      <parameter type-id='type-id-557'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1315'>
> >     ++      <parameter type-id='type-id-577'/>
> >     ++      <parameter type-id='type-id-557'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1316'>
> >     ++      <parameter type-id='type-id-577'/>
> >     ++      <parameter type-id='type-id-127'/>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1317'>
> >     +       <parameter type-id='type-id-241'/>
> >     +       <return type-id='type-id-53'/>
> >     +@@ -10746,6 +10832,10 @@
> >     +       <parameter type-id='type-id-114'/>
> >     +       <return type-id='type-id-67'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1363'>
> >     ++      <parameter type-id='type-id-1398'/>
> >     ++      <return type-id='type-id-67'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1364'>
> >     +       <parameter type-id='type-id-241'/>
> >     +       <parameter type-id='type-id-1409'/>
> >     +@@ -10770,6 +10860,14 @@
> >     +       <parameter type-id='type-id-1384'/>
> >     +       <return type-id='type-id-1085'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1427'>
> >     ++      <parameter type-id='type-id-1343'/>
> >     ++      <parameter type-id='type-id-1384'/>
> >     ++      <return type-id='type-id-1085'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1428'>
> >     ++      <return type-id='type-id-172'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1429'>
> >     +       <parameter type-id='type-id-515'/>
> >     +       <return type-id='type-id-172'/>
> >     +@@ -10815,6 +10913,9 @@
> >     +       <parameter type-id='type-id-399'/>
> >     +       <return type-id='type-id-399'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1437'>
> >     ++      <return type-id='type-id-533'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1438'>
> >     +       <parameter type-id='type-id-335'/>
> >     +       <parameter type-id='type-id-333'/>
> >     +@@ -10859,6 +10960,15 @@
> >     +       <parameter type-id='type-id-1360'/>
> >     +       <return type-id='type-id-1027'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1445'>
> >     ++      <parameter type-id='type-id-335'/>
> >     ++      <parameter type-id='type-id-279'/>
> >     ++      <parameter type-id='type-id-1093'/>
> >     ++      <parameter type-id='type-id-24'/>
> >     ++      <parameter type-id='type-id-333'/>
> >     ++      <parameter type-id='type-id-176'/>
> >     ++      <return type-id='type-id-1027'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1446'>
> >     +       <parameter type-id='type-id-335'/>
> >     +       <parameter type-id='type-id-1360'/>
> >     +@@ -10885,11 +10995,44 @@
> >     +       <parameter type-id='type-id-113'/>
> >     +       <return type-id='type-id-1027'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1449'>
> >     ++      <parameter type-id='type-id-1343'/>
> >     ++      <parameter type-id='type-id-24'/>
> >     ++      <parameter type-id='type-id-176'/>
> >     ++      <parameter type-id='type-id-333'/>
> >     ++      <return type-id='type-id-1027'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1450'>
> >     +       <parameter type-id='type-id-1347'/>
> >     +       <parameter type-id='type-id-1339'/>
> >     +       <return type-id='type-id-1027'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1451'>
> >     ++      <parameter type-id='type-id-279'/>
> >     ++      <parameter type-id='type-id-1088'/>
> >     ++      <parameter type-id='type-id-24'/>
> >     ++      <return type-id='type-id-1027'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1452'>
> >     ++      <parameter type-id='type-id-279'/>
> >     ++      <parameter type-id='type-id-1088'/>
> >     ++      <parameter type-id='type-id-165'/>
> >     ++      <parameter type-id='type-id-176'/>
> >     ++      <return type-id='type-id-1027'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1453'>
> >     ++      <parameter type-id='type-id-790'/>
> >     ++      <parameter type-id='type-id-1369'/>
> >     ++      <parameter type-id='type-id-24'/>
> >     ++      <return type-id='type-id-1027'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1454'>
> >     ++      <parameter type-id='type-id-790'/>
> >     ++      <parameter type-id='type-id-1369'/>
> >     ++      <parameter type-id='type-id-165'/>
> >     ++      <parameter type-id='type-id-176'/>
> >     ++      <return type-id='type-id-1027'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1455'>
> >     +       <parameter type-id='type-id-387'/>
> >     +       <parameter type-id='type-id-335'/>
> >     +@@ -10923,6 +11066,18 @@
> >     +       <parameter type-id='type-id-261'/>
> >     +       <return type-id='type-id-104'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1460'>
> >     ++      <parameter type-id='type-id-279'/>
> >     ++      <parameter type-id='type-id-1088'/>
> >     ++      <parameter type-id='type-id-53'/>
> >     ++      <return type-id='type-id-332'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1461'>
> >     ++      <parameter type-id='type-id-279'/>
> >     ++      <parameter type-id='type-id-1093'/>
> >     ++      <parameter type-id='type-id-53'/>
> >     ++      <return type-id='type-id-332'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1462'>
> >     +       <parameter type-id='type-id-1476'/>
> >     +       <return type-id='type-id-718'/>
> >     +@@ -10936,6 +11091,14 @@
> >     +       <parameter type-id='type-id-1402'/>
> >     +       <return type-id='type-id-113'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1468'>
> >     ++      <parameter type-id='type-id-335'/>
> >     ++      <parameter type-id='type-id-114'/>
> >     ++      <parameter type-id='type-id-114'/>
> >     ++      <parameter type-id='type-id-114'/>
> >     ++      <parameter type-id='type-id-114'/>
> >     ++      <return type-id='type-id-114'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1469'>
> >     +       <parameter type-id='type-id-1410'/>
> >     +       <parameter type-id='type-id-1409'/>
> >     +@@ -10949,6 +11112,10 @@
> >     +       <parameter type-id='type-id-1379'/>
> >     +       <return type-id='type-id-841'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1477'>
> >     ++      <parameter type-id='type-id-899'/>
> >     ++      <return type-id='type-id-1538'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1478'>
> >     +       <parameter type-id='type-id-308'/>
> >     +       <return type-id='type-id-1538'/>
> >     +@@ -11075,12 +11242,26 @@
> >     +       <parameter type-id='type-id-53'/>
> >     +       <return type-id='type-id-1538'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1501'>
> >     ++      <parameter type-id='type-id-1343'/>
> >     ++      <return type-id='type-id-1538'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1502'>
> >     +       <parameter type-id='type-id-1347'/>
> >     +       <parameter type-id='type-id-67'/>
> >     +       <parameter type-id='type-id-67'/>
> >     +       <return type-id='type-id-1538'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1503'>
> >     ++      <parameter type-id='type-id-279'/>
> >     ++      <return type-id='type-id-1538'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1504'>
> >     ++      <parameter type-id='type-id-279'/>
> >     ++      <parameter type-id='type-id-1356'/>
> >     ++      <parameter type-id='type-id-1346'/>
> >     ++      <return type-id='type-id-1538'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1505'>
> >     +       <parameter type-id='type-id-1357'/>
> >     +       <return type-id='type-id-1538'/>
> >     +@@ -11124,6 +11305,15 @@
> >     +       <parameter type-id='type-id-75'/>
> >     +       <return type-id='type-id-1538'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1514'>
> >     ++      <parameter type-id='type-id-274'/>
> >     ++      <return type-id='type-id-1538'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1515'>
> >     ++      <parameter type-id='type-id-274'/>
> >     ++      <parameter type-id='type-id-165'/>
> >     ++      <return type-id='type-id-1538'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1516'>
> >     +       <parameter type-id='type-id-139'/>
> >     +       <return type-id='type-id-1538'/>
> >     +@@ -11192,10 +11382,19 @@
> >     +       <parameter type-id='type-id-335'/>
> >     +       <return type-id='type-id-1538'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1528'>
> >     ++      <parameter type-id='type-id-577'/>
> >     ++      <parameter type-id='type-id-127'/>
> >     ++      <return type-id='type-id-1538'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1529'>
> >     +       <parameter type-id='type-id-241'/>
> >     +       <return type-id='type-id-1538'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1530'>
> >     ++      <parameter type-id='type-id-1418'/>
> >     ++      <return type-id='type-id-1538'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1531'>
> >     +       <parameter type-id='type-id-399'/>
> >     +       <return type-id='type-id-1538'/>
> >     +@@ -11210,6 +11409,10 @@
> >     +       <parameter type-id='type-id-114'/>
> >     +       <return type-id='type-id-1538'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1534'>
> >     ++      <parameter type-id='type-id-127'/>
> >     ++      <return type-id='type-id-1538'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1535'>
> >     +       <parameter type-id='type-id-127'/>
> >     +       <parameter type-id='type-id-1204'/>
> >     +@@ -11224,6 +11427,9 @@
> >     +       <parameter type-id='type-id-1550'/>
> >     +       <return type-id='type-id-1538'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1539'>
> >     ++      <return type-id='type-id-127'/>
> >     ++    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1540'>
> >     +       <parameter type-id='type-id-515'/>
> >     +       <parameter type-id='type-id-1123'/>
> >     +@@ -11241,223 +11447,6 @@
> >     +       <parameter type-id='type-id-114'/>
> >     +       <return type-id='type-id-127'/>
> >     +     </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1547'>
> >     +-      <parameter type-id='type-id-127'/>
> >     +-      <return type-id='type-id-127'/>
> >     +-    </function-type>
> >     +-    <type-decl name='void' id='type-id-1538'/>
> >     +-    <function-type size-in-bits='64' id='type-id-1112'>
> >     +-      <parameter type-id='type-id-614'/>
> >     +-      <parameter type-id='type-id-279'/>
> >     +-      <return type-id='type-id-165'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1153'>
> >     +-      <parameter type-id='type-id-279'/>
> >     +-      <return type-id='type-id-282'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1198'>
> >     +-      <parameter type-id='type-id-538'/>
> >     +-      <return type-id='type-id-530'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1220'>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1224'>
> >     +-      <parameter type-id='type-id-24'/>
> >     +-      <parameter type-id='type-id-1143'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1225'>
> >     +-      <parameter type-id='type-id-165'/>
> >     +-      <parameter type-id='type-id-1143'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1256'>
> >     +-      <parameter type-id='type-id-335'/>
> >     +-      <parameter type-id='type-id-279'/>
> >     +-      <parameter type-id='type-id-1093'/>
> >     +-      <parameter type-id='type-id-125'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1283'>
> >     +-      <parameter type-id='type-id-559'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1284'>
> >     +-      <parameter type-id='type-id-559'/>
> >     +-      <parameter type-id='type-id-165'/>
> >     +-      <parameter type-id='type-id-332'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1285'>
> >     +-      <parameter type-id='type-id-559'/>
> >     +-      <parameter type-id='type-id-559'/>
> >     +-      <parameter type-id='type-id-165'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1286'>
> >     +-      <parameter type-id='type-id-1343'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1287'>
> >     +-      <parameter type-id='type-id-1343'/>
> >     +-      <parameter type-id='type-id-125'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1290'>
> >     +-      <parameter type-id='type-id-614'/>
> >     +-      <parameter type-id='type-id-279'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1292'>
> >     +-      <parameter type-id='type-id-614'/>
> >     +-      <parameter type-id='type-id-279'/>
> >     +-      <parameter type-id='type-id-1350'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1305'>
> >     +-      <parameter type-id='type-id-274'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1314'>
> >     +-      <parameter type-id='type-id-577'/>
> >     +-      <parameter type-id='type-id-559'/>
> >     +-      <parameter type-id='type-id-557'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1315'>
> >     +-      <parameter type-id='type-id-577'/>
> >     +-      <parameter type-id='type-id-557'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1316'>
> >     +-      <parameter type-id='type-id-577'/>
> >     +-      <parameter type-id='type-id-127'/>
> >     +-      <return type-id='type-id-53'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1363'>
> >     +-      <parameter type-id='type-id-1398'/>
> >     +-      <return type-id='type-id-67'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1427'>
> >     +-      <parameter type-id='type-id-1343'/>
> >     +-      <parameter type-id='type-id-1384'/>
> >     +-      <return type-id='type-id-1085'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1428'>
> >     +-      <return type-id='type-id-172'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1437'>
> >     +-      <return type-id='type-id-533'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1445'>
> >     +-      <parameter type-id='type-id-335'/>
> >     +-      <parameter type-id='type-id-279'/>
> >     +-      <parameter type-id='type-id-1093'/>
> >     +-      <parameter type-id='type-id-24'/>
> >     +-      <parameter type-id='type-id-333'/>
> >     +-      <parameter type-id='type-id-176'/>
> >     +-      <return type-id='type-id-1027'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1449'>
> >     +-      <parameter type-id='type-id-1343'/>
> >     +-      <parameter type-id='type-id-24'/>
> >     +-      <parameter type-id='type-id-176'/>
> >     +-      <parameter type-id='type-id-333'/>
> >     +-      <return type-id='type-id-1027'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1451'>
> >     +-      <parameter type-id='type-id-279'/>
> >     +-      <parameter type-id='type-id-1088'/>
> >     +-      <parameter type-id='type-id-24'/>
> >     +-      <return type-id='type-id-1027'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1452'>
> >     +-      <parameter type-id='type-id-279'/>
> >     +-      <parameter type-id='type-id-1088'/>
> >     +-      <parameter type-id='type-id-165'/>
> >     +-      <parameter type-id='type-id-176'/>
> >     +-      <return type-id='type-id-1027'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1453'>
> >     +-      <parameter type-id='type-id-790'/>
> >     +-      <parameter type-id='type-id-1369'/>
> >     +-      <parameter type-id='type-id-24'/>
> >     +-      <return type-id='type-id-1027'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1454'>
> >     +-      <parameter type-id='type-id-790'/>
> >     +-      <parameter type-id='type-id-1369'/>
> >     +-      <parameter type-id='type-id-165'/>
> >     +-      <parameter type-id='type-id-176'/>
> >     +-      <return type-id='type-id-1027'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1460'>
> >     +-      <parameter type-id='type-id-279'/>
> >     +-      <parameter type-id='type-id-1088'/>
> >     +-      <parameter type-id='type-id-53'/>
> >     +-      <return type-id='type-id-332'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1461'>
> >     +-      <parameter type-id='type-id-279'/>
> >     +-      <parameter type-id='type-id-1093'/>
> >     +-      <parameter type-id='type-id-53'/>
> >     +-      <return type-id='type-id-332'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1468'>
> >     +-      <parameter type-id='type-id-335'/>
> >     +-      <parameter type-id='type-id-114'/>
> >     +-      <parameter type-id='type-id-114'/>
> >     +-      <parameter type-id='type-id-114'/>
> >     +-      <parameter type-id='type-id-114'/>
> >     +-      <return type-id='type-id-114'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1073'>
> >     +-      <return type-id='type-id-1538'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1477'>
> >     +-      <parameter type-id='type-id-899'/>
> >     +-      <return type-id='type-id-1538'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1501'>
> >     +-      <parameter type-id='type-id-1343'/>
> >     +-      <return type-id='type-id-1538'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1503'>
> >     +-      <parameter type-id='type-id-279'/>
> >     +-      <return type-id='type-id-1538'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1504'>
> >     +-      <parameter type-id='type-id-279'/>
> >     +-      <parameter type-id='type-id-1356'/>
> >     +-      <parameter type-id='type-id-1346'/>
> >     +-      <return type-id='type-id-1538'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1514'>
> >     +-      <parameter type-id='type-id-274'/>
> >     +-      <return type-id='type-id-1538'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1515'>
> >     +-      <parameter type-id='type-id-274'/>
> >     +-      <parameter type-id='type-id-165'/>
> >     +-      <return type-id='type-id-1538'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1528'>
> >     +-      <parameter type-id='type-id-577'/>
> >     +-      <parameter type-id='type-id-127'/>
> >     +-      <return type-id='type-id-1538'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1530'>
> >     +-      <parameter type-id='type-id-1418'/>
> >     +-      <return type-id='type-id-1538'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1534'>
> >     +-      <parameter type-id='type-id-127'/>
> >     +-      <return type-id='type-id-1538'/>
> >     +-    </function-type>
> >     +-    <function-type size-in-bits='64' id='type-id-1539'>
> >     +-      <return type-id='type-id-127'/>
> >     +-    </function-type>
> >     +     <function-type size-in-bits='64' id='type-id-1543'>
> >     +       <parameter type-id='type-id-279'/>
> >     +       <return type-id='type-id-127'/>
> >     +@@ -11477,48 +11466,19 @@
> >     +       <parameter type-id='type-id-1412'/>
> >     +       <return type-id='type-id-127'/>
> >     +     </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1547'>
> >     ++      <parameter type-id='type-id-127'/>
> >     ++      <return type-id='type-id-127'/>
> >     ++    </function-type>
> >     ++    <type-decl name='void' id='type-id-1538'/>
> >     ++    <function-type size-in-bits='64' id='type-id-1220'>
> >     ++      <return type-id='type-id-53'/>
> >     ++    </function-type>
> >     ++    <function-type size-in-bits='64' id='type-id-1073'>
> >     ++      <return type-id='type-id-1538'/>
> >     ++    </function-type>
> >     +   </abi-instr>
> >     +   <abi-instr address-size='64' path='drivers/mmc/host/sdhci.mod.c'
> comp-dir-path='/ws/android/kernel/aosp/common-mainline/out/android-mainline/common'
> language='LANG_C89'>
> >     +-    <class-decl name='anon_vma' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1555'/>
> >     +-    <class-decl name='audit_context' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1556'/>
> >     +-    <class-decl name='backing_dev_info' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1557'/>
> >     +-    <class-decl name='bio_list' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1558'/>
> >     +-    <class-decl name='blk_plug' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1559'/>
> >     +-    <class-decl name='capture_control' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1560'/>
> >     +-    <class-decl name='cfs_rq' is-struct='yes' visibility='default'
> is-declaration-only='yes' id='type-id-1561'/>
> >     +-    <class-decl name='files_struct' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1562'/>
> >     +-    <class-decl name='fs_struct' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1563'/>
> >     +-    <class-decl name='ftrace_ret_stack' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1564'/>
> >     +-    <class-decl name='kernfs_iattrs' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1565'/>
> >     +-    <class-decl name='kernfs_open_node' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1566'/>
> >     +-    <class-decl name='kioctx_table' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1567'/>
> >     +-    <class-decl name='kmem_cache' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1568'/>
> >     +-    <class-decl name='linux_binfmt' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1569'/>
> >     +-    <class-decl name='mem_cgroup' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1570'/>
> >     +-    <class-decl name='module_notes_attrs' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1571'/>
> >     +-    <class-decl name='module_param_attrs' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1572'/>
> >     +-    <class-decl name='module_sect_attrs' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1573'/>
> >     +-    <class-decl name='nameidata' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1574'/>
> >     +-    <class-decl name='perf_event' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1575'/>
> >     +-    <class-decl name='pipe_inode_info' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1576'/>
> >     +-    <class-decl name='poll_table_struct' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1577'/>
> >     +-    <class-decl name='pollfd' is-struct='yes' visibility='default'
> is-declaration-only='yes' id='type-id-1578'/>
> >     +-    <class-decl name='rcu_node' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1579'/>
> >     +-    <class-decl name='reclaim_state' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1580'/>
> >     +-    <class-decl name='request_queue' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1581'/>
> >     +-    <class-decl name='rt_mutex_waiter' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1582'/>
> >     +-    <class-decl name='rt_rq' is-struct='yes' visibility='default'
> is-declaration-only='yes' id='type-id-1583'/>
> >     +-    <class-decl name='sched_class' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1584'/>
> >     +-    <class-decl name='seccomp_filter' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1585'/>
> >     +-    <class-decl name='seq_file' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1586'/>
> >     +-    <class-decl name='sock' is-struct='yes' visibility='default'
> is-declaration-only='yes' id='type-id-1587'/>
> >     +-    <class-decl name='task_group' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1588'/>
> >     +-    <class-decl name='trace_eval_map' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1589'/>
> >     +-    <class-decl name='trace_event_call' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1590'/>
> >     +-    <class-decl name='uprobe' is-struct='yes' visibility='default'
> is-declaration-only='yes' id='type-id-1591'/>
> >     +-    <class-decl name='user_namespace' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1592'/>
> >     +-    <class-decl name='workqueue_struct' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1593'/>
> >     +-    <class-decl name='xol_area' is-struct='yes'
> visibility='default' is-declaration-only='yes' id='type-id-1594'/>
> >     +     <var-decl name='__this_module' type-id='type-id-789'
> mangled-name='__this_module' visibility='default'
> filepath='/ws/android/kernel/aosp/common-mainline/out/android-mainline/common/drivers/mmc/host/sdhci.mod.c'
> line='11' column='1' elf-symbol-id='__this_module'/>
> >     +   </abi-instr>
> >     + </abi-corpus>
> >     +ABIs differ:
> >
>  +[...]/source-libabigail/tests/data/test-read-dwarf/PR25007-sdhci.ko.abi
> >     +and:
> >
>  +[...]/build-libabigail/tests/output/test-read-dwarf/PR25007-sdhci.ko.abi
> >     +
> >     +FAIL runtestreaddwarf (exit status: 1)
> >
> > Only that one test case.
> >
> > The reordered 'function-type's -- but I've not yet verified whether
> > they're really just reordered -- may hint towards a sorting stability
> > issue, but there are also the disappearing 'class-decl's.
> >
> > Unless somebody points out any misunderstanding on my side, I suppose I
> > shall try to figure out what's going wrong.
> >
> >
> > Grüße
> >  Thomas
> -----------------
> Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201,
> 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer:
> Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München;
> Registergericht München, HRB 106955
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization
  2022-01-31 15:56   ` Giuliano Procida
@ 2022-04-11 15:18     ` Dodji Seketeli
  2022-04-12 15:20       ` Giuliano Procida
  0 siblings, 1 reply; 12+ messages in thread
From: Dodji Seketeli @ 2022-04-11 15:18 UTC (permalink / raw)
  To: Giuliano Procida; +Cc: Thomas Schwinge, libabigail, Mark Wielaard

Hello Thomas and Giuliano,

[...]


Thomas Schwinge <thomas@codesourcery.com> a écrit:

[...]

>> OK.  Then:
>>
>>     (gdb) print l_attr.valp && r_attr.valp
>>     $8 = true
>>     (gdb) print *l_attr.valp == *r_attr.valp
>>     $9 = true
>>
>> This now does 'return true;'!
>>
>> Given 'unsigned char *valp', what this only checks is that one byte at
>> 'l_attr.valp' equals one byte at 'r_attr.valp' -- which evidently isn't
>> sufficient to demonstrate that 'l_attr' and 'r_attr' do match.  Therefore
>> it seems that this optimization is not correct?
>>

Giuliano Procida <gprocida@google.com> a écrit:

> Looks like you've found one bug. It has compared addresses and moved on to
> test data.
>
> It could do strcmp at this point, assuming these things are null-terminated
> strings, which is the case for DW_FORM_strp but is not for other things.
>
> But there is another bug. I've instrumented the code and found cases (in
> the test suite) where the fast path returns false, but the slow path
> returns true. Both sides are DW_FORM_strx1. The data are not strings but
> indexes and that the same string appears at different indexes.

I agree.  This is a bug.

I tried to fix and indeed, hell did break lose as I realized there were
several other issues across the pipeline (including several issues that
I have long wanted to address) that needed so that this one fits in
correctly.

I came up with a patch set that lies in the branch 'fix-dwarf-str-cmp',
at
https://sourceware.org/git/?p=libabigail.git;a=shortlog;h=refs/heads/fix-dwarf-str-cmp.

The tip of that patch set addresses this issue specifically:
https://sourceware.org/git/?p=libabigail.git;a=commit;h=3d277a9cc05873cf4aeb97273d585e0b07af917d.

But for that fix to be applied, we need the whole patch set that fixes
several other issues left and right.

Giuliano & Thomas, could you please test that branch on your specific
environments?  If it works OK, then I can consider posting the patch-set
properly to the list.  If it doesn't, at least I'd wouldn't have broken
the world without notice ;-)

Thanks.

-- 
		Dodji

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization
  2022-04-11 15:18     ` Dodji Seketeli
@ 2022-04-12 15:20       ` Giuliano Procida
  2022-04-12 16:16         ` Dodji Seketeli
  0 siblings, 1 reply; 12+ messages in thread
From: Giuliano Procida @ 2022-04-12 15:20 UTC (permalink / raw)
  To: Dodji Seketeli
  Cc: Thomas Schwinge, Giuliano Procida via Libabigail, Mark Wielaard

I started looking at this today but I've run out of time. I'll be able to
take another look in about a week.

Checks fail (various types are renumbered in XML output) starting at
commit 57b1c714.

I haven't tried this on kernel or framework libraries yet, but I know there
are plenty of typedefs in both.

Regards,
Giuliano

On Mon, 11 Apr 2022 at 16:18, Dodji Seketeli <dodji@seketeli.org> wrote:

> Hello Thomas and Giuliano,
>
> [...]
>
>
> Thomas Schwinge <thomas@codesourcery.com> a écrit:
>
> [...]
>
> >> OK.  Then:
> >>
> >>     (gdb) print l_attr.valp && r_attr.valp
> >>     $8 = true
> >>     (gdb) print *l_attr.valp == *r_attr.valp
> >>     $9 = true
> >>
> >> This now does 'return true;'!
> >>
> >> Given 'unsigned char *valp', what this only checks is that one byte at
> >> 'l_attr.valp' equals one byte at 'r_attr.valp' -- which evidently isn't
> >> sufficient to demonstrate that 'l_attr' and 'r_attr' do match.
> Therefore
> >> it seems that this optimization is not correct?
> >>
>
> Giuliano Procida <gprocida@google.com> a écrit:
>
> > Looks like you've found one bug. It has compared addresses and moved on
> to
> > test data.
> >
> > It could do strcmp at this point, assuming these things are
> null-terminated
> > strings, which is the case for DW_FORM_strp but is not for other things.
> >
> > But there is another bug. I've instrumented the code and found cases (in
> > the test suite) where the fast path returns false, but the slow path
> > returns true. Both sides are DW_FORM_strx1. The data are not strings but
> > indexes and that the same string appears at different indexes.
>
> I agree.  This is a bug.
>
> I tried to fix and indeed, hell did break lose as I realized there were
> several other issues across the pipeline (including several issues that
> I have long wanted to address) that needed so that this one fits in
> correctly.
>
> I came up with a patch set that lies in the branch 'fix-dwarf-str-cmp',
> at
>
> https://sourceware.org/git/?p=libabigail.git;a=shortlog;h=refs/heads/fix-dwarf-str-cmp
> .
>
> The tip of that patch set addresses this issue specifically:
>
> https://sourceware.org/git/?p=libabigail.git;a=commit;h=3d277a9cc05873cf4aeb97273d585e0b07af917d
> .
>
> But for that fix to be applied, we need the whole patch set that fixes
> several other issues left and right.
>
> Giuliano & Thomas, could you please test that branch on your specific
> environments?  If it works OK, then I can consider posting the patch-set
> properly to the list.  If it doesn't, at least I'd wouldn't have broken
> the world without notice ;-)
>
> Thanks.
>
> --
>                 Dodji
>

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization
  2022-04-12 15:20       ` Giuliano Procida
@ 2022-04-12 16:16         ` Dodji Seketeli
  2022-04-13  2:19           ` Ben Woodard
  0 siblings, 1 reply; 12+ messages in thread
From: Dodji Seketeli @ 2022-04-12 16:16 UTC (permalink / raw)
  To: Giuliano Procida
  Cc: Thomas Schwinge, Giuliano Procida via Libabigail, Mark Wielaard

Giuliano Procida <gprocida@google.com> a écrit:

> I started looking at this today but I've run out of time. I'll be able to
> take another look in about a week.

Thanks a lot.

> Checks fail (various types are renumbered in XML output) starting at
> commit 57b1c714.

Yeah, that is unfortunately expected because ...

> I haven't tried this on kernel or framework libraries yet, but I know there
> are plenty of typedefs in both.

... of this exactly.

This typedef change has been on my radar for a long time.  The fact that
a type Foo would use a typedef T in one version and a typedef T' in
another once, where T and T' have the same underlying type would result
in the two instances of Foo to be different can wreak havoc on the self
check tests, where in reality the two types are not different from an
ABI standpoint.

I am hoping that this is one of those changes that will get us closer
to having more stable abixml output.

Please note however that you need the entire stack of changes to have
everything working "as expected", as far as I can tell.

Thank you for looking into this.

-- 
		Dodji

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization
  2022-04-12 16:16         ` Dodji Seketeli
@ 2022-04-13  2:19           ` Ben Woodard
  2022-04-13 18:00             ` Ben Woodard
  2022-04-14  9:14             ` Dodji Seketeli
  0 siblings, 2 replies; 12+ messages in thread
From: Ben Woodard @ 2022-04-13  2:19 UTC (permalink / raw)
  To: Dodji Seketeli; +Cc: Giuliano Procida via Libabigail

So I ran my standard test on this branch as of 3d277a9cc05873cf4aeb97273d585e0b07af917d

    37 Consistency mismatches
    /lib64/libabigail.so.0.0.0 from libabigail-2.0-2.fc36.x86_64
    /lib64/libadwaitaqtpriv.so.1.4.1 from libadwaita-qt5-1.4.1-3.fc36.x86_64
    /lib64/libaspell.so.15.3.1 from aspell-0.60.8-9.fc36.x86_64
    /lib64/libboost_log.so.1.76.0 from boost-log-1.76.0-9.fc36.x86_64
    /lib64/libclucene-core.so.2.3.3.4 from clucene-core-2.3.3.4-42.20130812.e8e3d20git.fc36.x86_64
    /lib64/libdap.so.27.0.5 from libdap-3.20.9-2.fc36.x86_64
    /lib64/libdcerpc-samr.so.0.0.1 from samba-libs-4.16.0-6.fc36.x86_64
    /lib64/libdjvulibre.so.21.7.0 from djvulibre-libs-3.5.28-2.fc36.x86_64
    /lib64/dovecot/libdovecot-storage.so.0.0.0 from dovecot-2.3.18-1.fc36.x86_64
    /lib64/libexiv2.so.0.27.5 from exiv2-libs-0.27.5-2.fc36.x86_64
    /lib64/libgdal.so.30.0.2 from gdal-libs-3.4.2-1.fc36.x86_64
    /lib64/libgeos.so.3.10.2 from geos-3.10.2-4.fc36.x86_64
    /lib64/libglibmm-2.4.so.1.3.0 from glibmm24-2.66.2-2.fc36.x86_64
    /lib64/mozilla/plugins/gmp-gmpopenh264/system-installed/libgmpopenh264.so.2.1.1 from mozilla-openh264-2.1.1-3.fc36.x86_64
    /lib64/libhdf5_cpp.so.200.1.0 from hdf5-1.12.1-5.fc36.x86_64
    /lib64/libicui18n.so.67.1 from libicu67-67.1-2.fc35.x86_64
    /lib64/libicui18n.so.69.1 from libicu-69.1-5.fc36.x86_64
    /lib64/libicuuc.so.67.1 from libicu67-67.1-2.fc35.x86_64
    /lib64/libicuuc.so.69.1 from libicu-69.1-5.fc36.x86_64
    /lib64/dyninst/libinstructionAPI.so.12.0.1 from dyninst-12.0.1-3.fc36.x86_64
    /lib64/libjavascriptcoregtk-4.0.so.18.20.4 from webkit2gtk3-jsc-2.36.0-1.fc36.x86_64
    /lib64/libjxl.so.0.6.1 from libjxl-0.6.1-9.fc36.x86_64
    /lib64/libkmldom.so.1.3.0 from libkml-1.3.0-37.fc36.x86_64
    /lib64/libmusicbrainz5.so.1.0.0 from libmusicbrainz5-5.1.0-19.fc36.x86_64
    /lib64/libOpenEXRUtil-3_1.so.30.4.1 from openexr-libs-3.1.4-1.fc36.x86_64
    /lib64/libopenh264.so.2.1.1 from openh264-2.1.1-3.fc36.x86_64
    /lib64/libOSMesa.so.8.0.0 from mesa-libOSMesa-22.0.1-1.fc36.x86_64
    /lib64/libproj.so.22.2.1 from proj-8.2.1-6.fc36.x86_64
    /lib64/libQt5WaylandClient.so.5.15.3 from qt5-qtwayland-5.15.3-1.fc36.x86_64
    /lib64/libQt5WaylandCompositor.so.5.15.3 from qt5-qtwayland-5.15.3-1.fc36.x86_64
    /lib64/libQt5XmlPatterns.so.5.15.3 from qt5-qtxmlpatterns-5.15.3-1.fc36.x86_64
    /lib64/libSDL2_image-2.0.so.0.2.3 from SDL2_image-2.0.5-8.fc36.x86_64
    /lib64/libstdc++.so.6.0.30 from libstdc++-12.0.1-0.14.fc36.x86_64
    /lib64/libtag.so.1.18.0 from taglib-1.12-6.fc36.x86_64
    /lib64/libreoffice/program/libuno_cppuhelpergcc3.so.3 from libreoffice-ure-7.3.2.2-1.fc36.x86_64
    /lib64/libvtkRenderingCore.so.9.1.0 from vtk-9.1.0-6.fc36.x86_64
    /lib64/libwebrtc_audio_processing.so.1.0.0 from webrtc-audio-processing-0.3.1-8.fc36.x86_64

There also appears to be some sort of performance regression. I know that these are your problem children but 
/lib64/libmozjs-68.so.0.0.0 
/lib64/libwebkit2gtk-4.0.so.37.56.4 
/lib64/libgs.so.9.55 
/lib64/libperl.so.5.34.1 
have been running solidly for more than 3 hours. I’ll let them continue all night and see if they complete or if they are in some sort of infinite loop.

The asserts that I mentioned to you privately a few days ago have been cleared up. Thank you.

One of the most common problems in that set of consistency mismatches above seems to be with C++ destructors. Here are a couple of examples:
$ abidw --abidiff /lib64/libabigail.so.0.0.0
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Functions changes summary: 0 Removed, 2 Changed, 0 Added functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

2 functions with some indirect sub-type change:

  [C] 'method virtual abigail::comparison::diff_node_visitor::~diff_node_visitor()' at abg-comparison.cc:11192:1 has some indirect sub-type changes:
    parameter 0 of type 'abigail::comparison::diff_node_visitor* const' was removed

  [C] 'method virtual abigail::ir::ir_node_visitor::~ir_node_visitor()' at abg-ir.cc:25400:1 has some indirect sub-type changes:
    parameter 0 of type 'abigail::ir::ir_node_visitor* const' was removed

abidw --abidiff /lib64/libaspell.so.15.3.1
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".
Functions changes summary: 0 Removed, 2 Changed, 0 Added functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

2 functions with some indirect sub-type change:

  [C] 'method virtual acommon::CanHaveError::~CanHaveError()' at can_have_error.cpp:16:1 has some indirect sub-type changes:
    parameter 0 of type 'acommon::CanHaveError* const' was removed

  [C] 'method virtual aspeller::Dictionary::~Dictionary()' at data.cpp:80:1 has some indirect sub-type changes:
    parameter 0 of type 'aspeller::Dictionary* const' was removed


That accounts for 28 of the 37 consistency mismatches. So that is probably your highest value target to fix before moving on.
There really isn’t a pattern that I can see in the remaining failing cases. Three that you should really focus on are:
abidw --abidiff /lib64/libmozjs-78.so.0.0.0 which is an assert()
#5  0x00007ffff7550596 in __GI___assert_fail (assertion=0x7ffff7f2d1a3 "__abg_cond__", file=0x7ffff7f2d5c0 "../../../libabigail/src/abg-ir.cc", line=25414, function=0x7ffff7f34b08 "size_t abigail::ir::hash_as_canonical_type_or_constant(const type_base*)") at assert.c:101

and 

abidw --abidiff /lib64/libOSMesa.so.8.0.0 which really goes off the rails somewhere.  The indenting goes right off the right side of my jumbo terminal window. That just ain’t right.

Then there is the perpetual problem child libstdc++

So keep working on this patch set, let’s get these cleared up and get this puppy committed.

-ben



> On Apr 12, 2022, at 9:16 AM, Dodji Seketeli <dodji@seketeli.org> wrote:
> 
> Giuliano Procida <gprocida@google.com> a écrit:
> 
>> I started looking at this today but I've run out of time. I'll be able to
>> take another look in about a week.
> 
> Thanks a lot.
> 
>> Checks fail (various types are renumbered in XML output) starting at
>> commit 57b1c714.
> 
> Yeah, that is unfortunately expected because ...
> 
>> I haven't tried this on kernel or framework libraries yet, but I know there
>> are plenty of typedefs in both.
> 
> ... of this exactly.
> 
> This typedef change has been on my radar for a long time.  The fact that
> a type Foo would use a typedef T in one version and a typedef T' in
> another once, where T and T' have the same underlying type would result
> in the two instances of Foo to be different can wreak havoc on the self
> check tests, where in reality the two types are not different from an
> ABI standpoint.
> 
> I am hoping that this is one of those changes that will get us closer
> to having more stable abixml output.
> 
> Please note however that you need the entire stack of changes to have
> everything working "as expected", as far as I can tell.
> 
> Thank you for looking into this.
> 
> -- 
> 		Dodji
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization
  2022-04-13  2:19           ` Ben Woodard
@ 2022-04-13 18:00             ` Ben Woodard
  2022-04-14  9:14             ` Dodji Seketeli
  1 sibling, 0 replies; 12+ messages in thread
From: Ben Woodard @ 2022-04-13 18:00 UTC (permalink / raw)
  To: Dodji Seketeli; +Cc: Ben Woodard via Libabigail

Just a FYI these all completed successfully with no issues. It just took a long time. I don’t know exactly how long they took but the last time I looked they were about 400min of runtime each. 

> On Apr 12, 2022, at 7:19 PM, Ben Woodard <woodard@redhat.com> wrote:
> 
> There also appears to be some sort of performance regression. I know that these are your problem children but 
> /lib64/libmozjs-68.so.0.0.0 
> /lib64/libwebkit2gtk-4.0.so.37.56.4 
> /lib64/libgs.so.9.55 
> /lib64/libperl.so.5.34.1 
> have been running solidly for more than 3 hours. I’ll let them continue all night and see if they complete or if they are in some sort of infinite loop.

We have been doing lots of work here to really carefully understand as many ABI issues as we can and I know that this release is taking much longer than you anticipated with all the fall out from this bug and the typedef collapsing. However, we have been accumulating an ever increasing list of ABI relevant artifacts that libabigail is not detecting. It would be really nice if these could also be added to the 2.1 release:

These two should be fairly easy to add:
1) abicompat - Weak symbol replacement by a library. If a library replaces a weak symbol in the application with a strong symbol in the library, the symbols must have the same ABI signature. This is a very localized piece of code that just needs to be repeated. Right now abicompat only looks for undefined symbols in the ELF. It just needs a new ELF helper function which finds the weak symbols provided by the application and adds those to the list of functions and variables that need to be inspected in the library.
2) abicompat - Underlinked symbols in a library. Basically the same thing but instead of weak symbols or undefined symbols consider symbols who are NOTYPE.

Other things that we have uncovered which would be nice to have but are probably harder to implement:
1) RTTI - any type defined in the LSDA for exceptions must be included in the ABI analysis. If a type is thrown from a library and caught by a the application, then their types must match. These types do not necessarily appear in the list of undefined symbols in the application and so they are not considered when comparing library compatibility. Therefore, libabigail needs to go through the LSDA to find the types in the application to ensure that they are added to to the types being compared in the library.
2) Inline functions - Obviously we can’t compare that inline functions are semantically the same but we can at least make sure that the functions and the types involved with them are the same. Once again, these are not considered by abicompat because they do not appear as UNDEF symbols in the ELF. To be able to pick up these inline functions, you need to go through the DWARF callsites of both the application and the library and make sure that the function prototypes and their types which exist in both the library and the applicatoin are the same.
3) The type of TLS Thread Local Storage that a library uses must match the application. This is the difference between TLS and TLSDESC, This needs to be considered an ABI artifact. It is a little bit weird, you can probably consider it at the library level the same way that you look at SONAMEs but the type of TLS is defined at a symbol level. I have never seen someone mix objects with different kinds of TLS in one library. So I don’t know how you want to handle this. Maybe put a flag has_tls and then enumerate the flavor in the library and if the library and the application don’t have the same flavor of TLS or if two libraries have different flavors of TLS announce it. Or maybe store it in the variable where it lives in the ELF.
4) Library dependencies - When examining libraries for ABI compatibility it isn’t just the symbols used by the application itself that must be inspected, all of the other libraries that this application depends on must be considered. 
5) bidirectional compatibility - It isn’t just the undefined, weak, underlinked symbols in the application which must be compared in the libraries, it is also the symbols that are undefined in the library which are defined in the application which must be considered.

This is all just deeper processing of the ELF. I have sourceware bugs open on most of these and reproducers for several of them. I think it is very important that self-compares work and the fundamentals of type comparison are correct but we also need to not give people false notions about compatibility by ignoring things which we already know about which have ABI implications.

-ben


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization
  2022-04-13  2:19           ` Ben Woodard
  2022-04-13 18:00             ` Ben Woodard
@ 2022-04-14  9:14             ` Dodji Seketeli
  2022-04-18 16:42               ` Ben Woodard
  1 sibling, 1 reply; 12+ messages in thread
From: Dodji Seketeli @ 2022-04-14  9:14 UTC (permalink / raw)
  To: Ben Woodard; +Cc: gprocida, libabigail

Hey Ben!

Man, thanks a LOT for doing this.

Please see my comments below.

Ben Woodard <woodard@redhat.com> a écrit:

> So I ran my standard test on this branch as of 3d277a9cc05873cf4aeb97273d585e0b07af917d
>
>     37 Consistency mismatches
>     /lib64/libabigail.so.0.0.0 from libabigail-2.0-2.fc36.x86_64
>     /lib64/libadwaitaqtpriv.so.1.4.1 from libadwaita-qt5-1.4.1-3.fc36.x86_64
>     /lib64/libaspell.so.15.3.1 from aspell-0.60.8-9.fc36.x86_64
>     /lib64/libboost_log.so.1.76.0 from boost-log-1.76.0-9.fc36.x86_64
>     /lib64/libclucene-core.so.2.3.3.4 from clucene-core-2.3.3.4-42.20130812.e8e3d20git.fc36.x86_64
>     /lib64/libdap.so.27.0.5 from libdap-3.20.9-2.fc36.x86_64
>     /lib64/libdcerpc-samr.so.0.0.1 from samba-libs-4.16.0-6.fc36.x86_64
>     /lib64/libdjvulibre.so.21.7.0 from djvulibre-libs-3.5.28-2.fc36.x86_64
>     /lib64/dovecot/libdovecot-storage.so.0.0.0 from dovecot-2.3.18-1.fc36.x86_64
>     /lib64/libexiv2.so.0.27.5 from exiv2-libs-0.27.5-2.fc36.x86_64
>     /lib64/libgdal.so.30.0.2 from gdal-libs-3.4.2-1.fc36.x86_64
>     /lib64/libgeos.so.3.10.2 from geos-3.10.2-4.fc36.x86_64
>     /lib64/libglibmm-2.4.so.1.3.0 from glibmm24-2.66.2-2.fc36.x86_64
>     /lib64/mozilla/plugins/gmp-gmpopenh264/system-installed/libgmpopenh264.so.2.1.1 from mozilla-openh264-2.1.1-3.fc36.x86_64
>     /lib64/libhdf5_cpp.so.200.1.0 from hdf5-1.12.1-5.fc36.x86_64
>     /lib64/libicui18n.so.67.1 from libicu67-67.1-2.fc35.x86_64
>     /lib64/libicui18n.so.69.1 from libicu-69.1-5.fc36.x86_64
>     /lib64/libicuuc.so.67.1 from libicu67-67.1-2.fc35.x86_64
>     /lib64/libicuuc.so.69.1 from libicu-69.1-5.fc36.x86_64
>     /lib64/dyninst/libinstructionAPI.so.12.0.1 from dyninst-12.0.1-3.fc36.x86_64
>     /lib64/libjavascriptcoregtk-4.0.so.18.20.4 from webkit2gtk3-jsc-2.36.0-1.fc36.x86_64
>     /lib64/libjxl.so.0.6.1 from libjxl-0.6.1-9.fc36.x86_64
>     /lib64/libkmldom.so.1.3.0 from libkml-1.3.0-37.fc36.x86_64
>     /lib64/libmusicbrainz5.so.1.0.0 from libmusicbrainz5-5.1.0-19.fc36.x86_64
>     /lib64/libOpenEXRUtil-3_1.so.30.4.1 from openexr-libs-3.1.4-1.fc36.x86_64
>     /lib64/libopenh264.so.2.1.1 from openh264-2.1.1-3.fc36.x86_64
>     /lib64/libOSMesa.so.8.0.0 from mesa-libOSMesa-22.0.1-1.fc36.x86_64
>     /lib64/libproj.so.22.2.1 from proj-8.2.1-6.fc36.x86_64
>     /lib64/libQt5WaylandClient.so.5.15.3 from qt5-qtwayland-5.15.3-1.fc36.x86_64
>     /lib64/libQt5WaylandCompositor.so.5.15.3 from qt5-qtwayland-5.15.3-1.fc36.x86_64
>     /lib64/libQt5XmlPatterns.so.5.15.3 from qt5-qtxmlpatterns-5.15.3-1.fc36.x86_64
>     /lib64/libSDL2_image-2.0.so.0.2.3 from SDL2_image-2.0.5-8.fc36.x86_64
>     /lib64/libstdc++.so.6.0.30 from libstdc++-12.0.1-0.14.fc36.x86_64
>     /lib64/libtag.so.1.18.0 from taglib-1.12-6.fc36.x86_64
>     /lib64/libreoffice/program/libuno_cppuhelpergcc3.so.3 from libreoffice-ure-7.3.2.2-1.fc36.x86_64
>     /lib64/libvtkRenderingCore.so.9.1.0 from vtk-9.1.0-6.fc36.x86_64
>     /lib64/libwebrtc_audio_processing.so.1.0.0 from webrtc-audio-processing-0.3.1-8.fc36.x86_64

Pfff :-(

> There also appears to be some sort of performance regression. I know that these are your problem children but 
> /lib64/libmozjs-68.so.0.0.0 
> /lib64/libwebkit2gtk-4.0.so.37.56.4 
> /lib64/libgs.so.9.55 
> /lib64/libperl.so.5.34.1 
> have been running solidly for more than 3 hours. I’ll let them continue all night and see if they complete or if they are in some sort of infinite loop.

I see.

> The asserts that I mentioned to you privately a few days ago have been cleared up. Thank you.
>
> One of the most common problems in that set of consistency mismatches above seems to be with C++ destructors. Here are a couple of examples:
> $ abidw --abidiff /lib64/libabigail.so.0.0.0
> [Thread debugging using libthread_db enabled]
> Using host libthread_db library "/lib64/libthread_db.so.1".
> Functions changes summary: 0 Removed, 2 Changed, 0 Added functions
> Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
>
> 2 functions with some indirect sub-type change:
>
>   [C] 'method virtual abigail::comparison::diff_node_visitor::~diff_node_visitor()' at abg-comparison.cc:11192:1 has some indirect sub-type changes:
>     parameter 0 of type 'abigail::comparison::diff_node_visitor* const' was removed
>
>   [C] 'method virtual abigail::ir::ir_node_visitor::~ir_node_visitor()' at abg-ir.cc:25400:1 has some indirect sub-type changes:
>     parameter 0 of type 'abigail::ir::ir_node_visitor* const' was removed
>
> abidw --abidiff /lib64/libaspell.so.15.3.1
> [Thread debugging using libthread_db enabled]
> Using host libthread_db library "/lib64/libthread_db.so.1".
> Functions changes summary: 0 Removed, 2 Changed, 0 Added functions
> Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
>
> 2 functions with some indirect sub-type change:
>
>   [C] 'method virtual acommon::CanHaveError::~CanHaveError()' at can_have_error.cpp:16:1 has some indirect sub-type changes:
>     parameter 0 of type 'acommon::CanHaveError* const' was removed
>
>   [C] 'method virtual aspeller::Dictionary::~Dictionary()' at data.cpp:80:1 has some indirect sub-type changes:
>     parameter 0 of type 'aspeller::Dictionary* const' was removed
>
>
> That accounts for 28 of the 37 consistency mismatches. So that is probably your highest value target to fix before moving on.

OK, following your advice, I tracked this down first and indeed this
seems related to formal parameters DIEs comparison.  I have refreshed
the 'fix-dwarf-str-cmp' branch at
https://sourceware.org/git/?p=libabigail.git;a=shortlog;h=refs/heads/fix-dwarf-str-cmp
by adding this patch to the set:
https://sourceware.org/git/?p=libabigail.git;a=commit;h=6fa52b7f12b29f9b92dd0f16b84f70d82cc7c098

I hope this fix will improve things.

> There really isn’t a pattern that I can see in the remaining failing cases. Three that you should really focus on are:
> abidw --abidiff /lib64/libmozjs-78.so.0.0.0 which is an assert()
> #5  0x00007ffff7550596 in __GI___assert_fail (assertion=0x7ffff7f2d1a3 "__abg_cond__", file=0x7ffff7f2d5c0 "../../../libabigail/src/abg-ir.cc", line=25414, function=0x7ffff7f34b08 "size_t abigail::ir::hash_as_canonical_type_or_constant(const type_base*)") at assert.c:101
>
> and 
>
> abidw --abidiff /lib64/libOSMesa.so.8.0.0 which really goes off the rails somewhere.  The indenting goes right off the right side of my jumbo terminal window. That just ain’t right.

I'll be looking at those, thanks.

[...]

Cheers,

-- 
		Dodji

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization
  2022-04-14  9:14             ` Dodji Seketeli
@ 2022-04-18 16:42               ` Ben Woodard
  0 siblings, 0 replies; 12+ messages in thread
From: Ben Woodard @ 2022-04-18 16:42 UTC (permalink / raw)
  To: Dodji Seketeli; +Cc: Ben Woodard via Libabigail



> On Apr 14, 2022, at 2:14 AM, Dodji Seketeli <dodji@seketeli.org> wrote:
> 
> Hey Ben!
> 
> Man, thanks a LOT for doing this.
> 
> Please see my comments below.
> 
> Ben Woodard <woodard@redhat.com <mailto:woodard@redhat.com>> a écrit:
> 
>> So I ran my standard test on this branch as of 3d277a9cc05873cf4aeb97273d585e0b07af917d
>> 
>>    37 Consistency mismatches
>>    /lib64/libabigail.so.0.0.0 from libabigail-2.0-2.fc36.x86_64
>>    /lib64/libadwaitaqtpriv.so.1.4.1 from libadwaita-qt5-1.4.1-3.fc36.x86_64
>>    /lib64/libaspell.so.15.3.1 from aspell-0.60.8-9.fc36.x86_64
>>    /lib64/libboost_log.so.1.76.0 from boost-log-1.76.0-9.fc36.x86_64
>>    /lib64/libclucene-core.so.2.3.3.4 from clucene-core-2.3.3.4-42.20130812.e8e3d20git.fc36.x86_64
>>    /lib64/libdap.so.27.0.5 from libdap-3.20.9-2.fc36.x86_64
>>    /lib64/libdcerpc-samr.so.0.0.1 from samba-libs-4.16.0-6.fc36.x86_64
>>    /lib64/libdjvulibre.so.21.7.0 from djvulibre-libs-3.5.28-2.fc36.x86_64
>>    /lib64/dovecot/libdovecot-storage.so.0.0.0 from dovecot-2.3.18-1.fc36.x86_64
>>    /lib64/libexiv2.so.0.27.5 from exiv2-libs-0.27.5-2.fc36.x86_64
>>    /lib64/libgdal.so.30.0.2 from gdal-libs-3.4.2-1.fc36.x86_64
>>    /lib64/libgeos.so.3.10.2 from geos-3.10.2-4.fc36.x86_64
>>    /lib64/libglibmm-2.4.so.1.3.0 from glibmm24-2.66.2-2.fc36.x86_64
>>    /lib64/mozilla/plugins/gmp-gmpopenh264/system-installed/libgmpopenh264.so.2.1.1 from mozilla-openh264-2.1.1-3.fc36.x86_64
>>    /lib64/libhdf5_cpp.so.200.1.0 from hdf5-1.12.1-5.fc36.x86_64
>>    /lib64/libicui18n.so.67.1 from libicu67-67.1-2.fc35.x86_64
>>    /lib64/libicui18n.so.69.1 from libicu-69.1-5.fc36.x86_64
>>    /lib64/libicuuc.so.67.1 from libicu67-67.1-2.fc35.x86_64
>>    /lib64/libicuuc.so.69.1 from libicu-69.1-5.fc36.x86_64
>>    /lib64/dyninst/libinstructionAPI.so.12.0.1 from dyninst-12.0.1-3.fc36.x86_64
>>    /lib64/libjavascriptcoregtk-4.0.so.18.20.4 from webkit2gtk3-jsc-2.36.0-1.fc36.x86_64
>>    /lib64/libjxl.so.0.6.1 from libjxl-0.6.1-9.fc36.x86_64
>>    /lib64/libkmldom.so.1.3.0 from libkml-1.3.0-37.fc36.x86_64
>>    /lib64/libmusicbrainz5.so.1.0.0 from libmusicbrainz5-5.1.0-19.fc36.x86_64
>>    /lib64/libOpenEXRUtil-3_1.so.30.4.1 from openexr-libs-3.1.4-1.fc36.x86_64
>>    /lib64/libopenh264.so.2.1.1 from openh264-2.1.1-3.fc36.x86_64
>>    /lib64/libOSMesa.so.8.0.0 from mesa-libOSMesa-22.0.1-1.fc36.x86_64
>>    /lib64/libproj.so.22.2.1 from proj-8.2.1-6.fc36.x86_64
>>    /lib64/libQt5WaylandClient.so.5.15.3 from qt5-qtwayland-5.15.3-1.fc36.x86_64
>>    /lib64/libQt5WaylandCompositor.so.5.15.3 from qt5-qtwayland-5.15.3-1.fc36.x86_64
>>    /lib64/libQt5XmlPatterns.so.5.15.3 from qt5-qtxmlpatterns-5.15.3-1.fc36.x86_64
>>    /lib64/libSDL2_image-2.0.so.0.2.3 from SDL2_image-2.0.5-8.fc36.x86_64
>>    /lib64/libstdc++.so.6.0.30 from libstdc++-12.0.1-0.14.fc36.x86_64
>>    /lib64/libtag.so.1.18.0 from taglib-1.12-6.fc36.x86_64
>>    /lib64/libreoffice/program/libuno_cppuhelpergcc3.so.3 from libreoffice-ure-7.3.2.2-1.fc36.x86_64
>>    /lib64/libvtkRenderingCore.so.9.1.0 from vtk-9.1.0-6.fc36.x86_64
>>    /lib64/libwebrtc_audio_processing.so.1.0.0 from webrtc-audio-processing-0.3.1-8.fc36.x86_64
> 
> Pfff :-(
> 
>> There also appears to be some sort of performance regression. I know that these are your problem children but 
>> /lib64/libmozjs-68.so.0.0.0 
>> /lib64/libwebkit2gtk-4.0.so.37.56.4 
>> /lib64/libgs.so.9.55 
>> /lib64/libperl.so.5.34.1 
>> have been running solidly for more than 3 hours. I’ll let them continue all night and see if they complete or if they are in some sort of infinite loop.
> 
> I see.
> 
>> The asserts that I mentioned to you privately a few days ago have been cleared up. Thank you.
>> 
>> One of the most common problems in that set of consistency mismatches above seems to be with C++ destructors. Here are a couple of examples:
>> $ abidw --abidiff /lib64/libabigail.so.0.0.0
>> [Thread debugging using libthread_db enabled]
>> Using host libthread_db library "/lib64/libthread_db.so.1".
>> Functions changes summary: 0 Removed, 2 Changed, 0 Added functions
>> Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
>> 
>> 2 functions with some indirect sub-type change:
>> 
>>  [C] 'method virtual abigail::comparison::diff_node_visitor::~diff_node_visitor()' at abg-comparison.cc:11192:1 has some indirect sub-type changes:
>>    parameter 0 of type 'abigail::comparison::diff_node_visitor* const' was removed
>> 
>>  [C] 'method virtual abigail::ir::ir_node_visitor::~ir_node_visitor()' at abg-ir.cc:25400:1 has some indirect sub-type changes:
>>    parameter 0 of type 'abigail::ir::ir_node_visitor* const' was removed
>> 
>> abidw --abidiff /lib64/libaspell.so.15.3.1
>> [Thread debugging using libthread_db enabled]
>> Using host libthread_db library "/lib64/libthread_db.so.1".
>> Functions changes summary: 0 Removed, 2 Changed, 0 Added functions
>> Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
>> 
>> 2 functions with some indirect sub-type change:
>> 
>>  [C] 'method virtual acommon::CanHaveError::~CanHaveError()' at can_have_error.cpp:16:1 has some indirect sub-type changes:
>>    parameter 0 of type 'acommon::CanHaveError* const' was removed
>> 
>>  [C] 'method virtual aspeller::Dictionary::~Dictionary()' at data.cpp:80:1 has some indirect sub-type changes:
>>    parameter 0 of type 'aspeller::Dictionary* const' was removed
>> 
>> 
>> That accounts for 28 of the 37 consistency mismatches. So that is probably your highest value target to fix before moving on.
> 
> OK, following your advice, I tracked this down first and indeed this
> seems related to formal parameters DIEs comparison.  I have refreshed
> the 'fix-dwarf-str-cmp' branch at
> https://sourceware.org/git/?p=libabigail.git;a=shortlog;h=refs/heads/fix-dwarf-str-cmp <https://sourceware.org/git/?p=libabigail.git;a=shortlog;h=refs/heads/fix-dwarf-str-cmp>
> by adding this patch to the set:
> https://sourceware.org/git/?p=libabigail.git;a=commit;h=6fa52b7f12b29f9b92dd0f16b84f70d82cc7c098 <https://sourceware.org/git/?p=libabigail.git;a=commit;h=6fa52b7f12b29f9b92dd0f16b84f70d82cc7c098>
> 
> I hope this fix will improve things.

I’m not sure that it worked. For example:
$ cat libabigail.so.0.0.0.out 
Functions changes summary: 0 Removed, 2 Changed, 0 Added functions
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

2 functions with some indirect sub-type change:

  [C] 'method virtual abigail::comparison::diff_node_visitor::~diff_node_visitor()' at abg-comparison.cc:11192:1 has some indirect sub-type changes:
    parameter 0 of type 'abigail::comparison::diff_node_visitor* const' was removed

  [C] 'method virtual abigail::ir::ir_node_visitor::~ir_node_visitor()' at abg-ir.cc:25400:1 has some indirect sub-type changes:
    parameter 0 of type 'abigail::ir::ir_node_visitor* const' was removed

$ cat libadwaitaqtpriv.so.1.4.1.out
Functions changes summary: 0 Removed, 1 Changed, 0 Added function
Variables changes summary: 0 Removed, 0 Changed, 0 Added variable

1 function with some indirect sub-type change:

  [C] 'method virtual Adwaita::TransitionData::~TransitionData()' at adwaitatransitiondata.h:48:1 has some indirect sub-type changes:
    implicit parameter 0 of type 'Adwaita::TransitionData* const' changed:
      entity changed from 'Adwaita::TransitionData* const' to 'Adwaita::TransitionData*'
      type size hasn't changed
    parameter 1 of type 'int' was added

I still have 36 consistency mismatches. All of them see to include virtual destructors.

> 
>> There really isn’t a pattern that I can see in the remaining failing cases. Three that you should really focus on are:
>> abidw --abidiff /lib64/libmozjs-78.so.0.0.0 which is an assert()
>> #5  0x00007ffff7550596 in __GI___assert_fail (assertion=0x7ffff7f2d1a3 "__abg_cond__", file=0x7ffff7f2d5c0 "../../../libabigail/src/abg-ir.cc <http://abg-ir.cc/>", line=25414, function=0x7ffff7f34b08 "size_t abigail::ir::hash_as_canonical_type_or_constant(const type_base*)") at assert.c:101
>> 
>> and 
>> 
>> abidw --abidiff /lib64/libOSMesa.so.8.0.0 which really goes off the rails somewhere.  The indenting goes right off the right side of my jumbo terminal window. That just ain’t right.
> 
> I'll be looking at those, thanks.
> 
> [...]
> 
> Cheers,
> 
> -- 
> 		Dodji


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization
  2022-01-28 22:39 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization Thomas Schwinge
  2022-01-31 14:38 ` Thomas Schwinge
@ 2022-06-20 16:12 ` Dodji Seketeli
  2022-06-22  8:09   ` Ben Woodard
  1 sibling, 1 reply; 12+ messages in thread
From: Dodji Seketeli @ 2022-06-20 16:12 UTC (permalink / raw)
  To: Thomas Schwinge; +Cc: libabigail, Mark Wielaard

Hello Thomas et al.,

I have finally applied a fix for this issue that you reported.

It can be read at https://sourceware.org/git/?p=libabigail.git;a=commit;h=0529e3b9ee09c29137952b3a5d4a7cc10484649a.

Thanks for reporting this and sorry for the inconvenience.

Cheers,

Thomas Schwinge <thomas@codesourcery.com> a écrit:

> Hi!
>
> It's late on a Friday evening, and very well this may just be me not
> understanding libabigail/DWARF ;-) -- in context of
> <https://sourceware.org/bugzilla/show_bug.cgi?id=21023#c10> or
> <https://sourceware.org/bugzilla/show_bug.cgi?id=25042#c4>, I did a
> simple experiment to disable the
> 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value'
> optimization:
>
>     --- src/abg-dwarf-reader.cc
>     +++ src/abg-dwarf-reader.cc
>     [...]
>      /// This function is a fast routine (optimization) to compare the
>      /// values of two string attributes of two DIEs.
>      ///
>      /// @param l the first DIE to consider.
>      ///
>      /// @param r the second DIE to consider.
>      ///
>      /// @param attr_name the name of the attribute to compare, on the two
>      /// DIEs above.
>      ///
>      /// @param result out parameter.  This is set to the result of the
>      /// comparison.  If the value of attribute @p attr_name on DIE @p l
>      /// equals the value of attribute @p attr_name on DIE @p r, then the
>      /// the argument of this parameter is set to true.  Otherwise, it's
>      /// set to false.  Note that the argument of this parameter is set iff
>      /// the function returned true.
>      ///
>      /// @return true iff the comparison could be performed.  There are
>      /// cases in which the comparison cannot be performed.  For instance,
>      /// if one of the DIEs does not have the attribute @p attr_name.  In
>      /// any case, if this function returns true, then the parameter @p
>      /// result is set to the result of the comparison.
>      static bool
>      compare_dies_string_attribute_value(const Dwarf_Die *l, const Dwarf_Die *r,
>                                     unsigned attr_name,
>                                     bool &result)
>      {
>        Dwarf_Attribute l_attr, r_attr;
>        if (!dwarf_attr_integrate(const_cast<Dwarf_Die*>(l), attr_name, &l_attr)
>            || !dwarf_attr_integrate(const_cast<Dwarf_Die*>(r), attr_name, &r_attr))
>          return false;
>
>        ABG_ASSERT(l_attr.form == DW_FORM_strp
>              || l_attr.form == DW_FORM_string
>              || l_attr.form == DW_FORM_GNU_strp_alt
>              || form_is_DW_FORM_strx(l_attr.form)
>              || form_is_DW_FORM_line_strp(l_attr.form));
>
>        ABG_ASSERT(r_attr.form == DW_FORM_strp
>              || r_attr.form == DW_FORM_string
>              || r_attr.form == DW_FORM_GNU_strp_alt
>              || form_is_DW_FORM_strx(r_attr.form)
>              || form_is_DW_FORM_line_strp(r_attr.form));
>
>     +#if 0
>        if ((l_attr.form == DW_FORM_strp
>             && r_attr.form == DW_FORM_strp)
>            || (l_attr.form == DW_FORM_GNU_strp_alt
>           && r_attr.form == DW_FORM_GNU_strp_alt)
>            || (form_is_DW_FORM_strx(l_attr.form)
>           && form_is_DW_FORM_strx(r_attr.form))
>            || (form_is_DW_FORM_line_strp(l_attr.form)
>           && form_is_DW_FORM_line_strp(r_attr.form)))
>          {
>            // So these string attributes are actually pointers into a
>            // string table.  The string table is most likely de-duplicated
>            // so comparing the *values* of the pointers should be enough.
>            //
>            // This is the fast path.
>            if (l_attr.valp == r_attr.valp)
>           result = true;
>            else if (l_attr.valp && r_attr.valp)
>         result = *l_attr.valp == *r_attr.valp;
>            else
>         result = false;
>            return true;
>          }
>     +#endif
>
>        // If we reached this point it means we couldn't use the fast path
>        // because the string atttributes are strings that are "inline" in
>        // the debug info section.  Let's just compare them the slow and
>        // obvious way.
>        string l_str = die_string_attribute(l, attr_name),
>          r_str = die_string_attribute(r, attr_name);
>        result = l_str == r_str;
>
>        return true;
>      }
>
> My assumption was that this shouldn't change anything other than possibly
> regress performance.  However:
>
>     [-PASS:-]{+FAIL:+} runtestreaddwarf
>
>     --- build-libabigail/tests/runtestreaddwarf.log
>     +++ build-libabigail/tests/runtestreaddwarf.log
>     [...]
>     -PASS runtestreaddwarf (exit status: 0)
>     +--- [...]/source-libabigail/tests/data/test-read-dwarf/PR25007-sdhci.ko.abi        2022-01-28 22:48:07.049805043 +0100
>     ++++ [...]/build-libabigail/tests/output/test-read-dwarf/PR25007-sdhci.ko.abi       2022-01-28 23:15:30.261483063 +0100
>     +@@ -10107,10 +10107,19 @@
>     +       <parameter type-id='type-id-1183'/>
>     +       <return type-id='type-id-165'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1112'>
>     ++      <parameter type-id='type-id-614'/>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <return type-id='type-id-165'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1114'>
>     +       <parameter type-id='type-id-125'/>
>     +       <return type-id='type-id-165'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1153'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <return type-id='type-id-282'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1184'>
>     +       <parameter type-id='type-id-238'/>
>     +       <parameter type-id='type-id-1138'/>
>     +@@ -10138,6 +10147,10 @@
>     +       <parameter type-id='type-id-51'/>
>     +       <return type-id='type-id-1195'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1198'>
>     ++      <parameter type-id='type-id-538'/>
>     ++      <return type-id='type-id-530'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1199'>
>     +       <parameter type-id='type-id-1357'/>
>     +       <return type-id='type-id-635'/>
>     +@@ -10181,6 +10194,16 @@
>     +       <parameter type-id='type-id-1553'/>
>     +       <return type-id='type-id-53'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1224'>
>     ++      <parameter type-id='type-id-24'/>
>     ++      <parameter type-id='type-id-1143'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1225'>
>     ++      <parameter type-id='type-id-165'/>
>     ++      <parameter type-id='type-id-1143'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1226'>
>     +       <parameter type-id='type-id-1118'/>
>     +       <return type-id='type-id-53'/>
>     +@@ -10370,6 +10393,13 @@
>     +       <parameter type-id='type-id-411'/>
>     +       <return type-id='type-id-53'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1256'>
>     ++      <parameter type-id='type-id-335'/>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1093'/>
>     ++      <parameter type-id='type-id-125'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1257'>
>     +       <parameter type-id='type-id-335'/>
>     +       <parameter type-id='type-id-67'/>
>     +@@ -10519,6 +10549,31 @@
>     +       <parameter type-id='type-id-53'/>
>     +       <return type-id='type-id-53'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1283'>
>     ++      <parameter type-id='type-id-559'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1284'>
>     ++      <parameter type-id='type-id-559'/>
>     ++      <parameter type-id='type-id-165'/>
>     ++      <parameter type-id='type-id-332'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1285'>
>     ++      <parameter type-id='type-id-559'/>
>     ++      <parameter type-id='type-id-559'/>
>     ++      <parameter type-id='type-id-165'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1286'>
>     ++      <parameter type-id='type-id-1343'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1287'>
>     ++      <parameter type-id='type-id-1343'/>
>     ++      <parameter type-id='type-id-125'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1288'>
>     +       <parameter type-id='type-id-225'/>
>     +       <parameter type-id='type-id-1151'/>
>     +@@ -10531,6 +10586,17 @@
>     +       <parameter type-id='type-id-172'/>
>     +       <return type-id='type-id-53'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1290'>
>     ++      <parameter type-id='type-id-614'/>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1292'>
>     ++      <parameter type-id='type-id-614'/>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1350'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1294'>
>     +       <parameter type-id='type-id-1357'/>
>     +       <return type-id='type-id-53'/>
>     +@@ -10591,6 +10657,10 @@
>     +       <parameter type-id='type-id-100'/>
>     +       <return type-id='type-id-53'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1305'>
>     ++      <parameter type-id='type-id-274'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1306'>
>     +       <parameter type-id='type-id-826'/>
>     +       <parameter type-id='type-id-114'/>
>     +@@ -10631,6 +10701,22 @@
>     +       <parameter type-id='type-id-238'/>
>     +       <return type-id='type-id-53'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1314'>
>     ++      <parameter type-id='type-id-577'/>
>     ++      <parameter type-id='type-id-559'/>
>     ++      <parameter type-id='type-id-557'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1315'>
>     ++      <parameter type-id='type-id-577'/>
>     ++      <parameter type-id='type-id-557'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1316'>
>     ++      <parameter type-id='type-id-577'/>
>     ++      <parameter type-id='type-id-127'/>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1317'>
>     +       <parameter type-id='type-id-241'/>
>     +       <return type-id='type-id-53'/>
>     +@@ -10746,6 +10832,10 @@
>     +       <parameter type-id='type-id-114'/>
>     +       <return type-id='type-id-67'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1363'>
>     ++      <parameter type-id='type-id-1398'/>
>     ++      <return type-id='type-id-67'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1364'>
>     +       <parameter type-id='type-id-241'/>
>     +       <parameter type-id='type-id-1409'/>
>     +@@ -10770,6 +10860,14 @@
>     +       <parameter type-id='type-id-1384'/>
>     +       <return type-id='type-id-1085'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1427'>
>     ++      <parameter type-id='type-id-1343'/>
>     ++      <parameter type-id='type-id-1384'/>
>     ++      <return type-id='type-id-1085'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1428'>
>     ++      <return type-id='type-id-172'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1429'>
>     +       <parameter type-id='type-id-515'/>
>     +       <return type-id='type-id-172'/>
>     +@@ -10815,6 +10913,9 @@
>     +       <parameter type-id='type-id-399'/>
>     +       <return type-id='type-id-399'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1437'>
>     ++      <return type-id='type-id-533'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1438'>
>     +       <parameter type-id='type-id-335'/>
>     +       <parameter type-id='type-id-333'/>
>     +@@ -10859,6 +10960,15 @@
>     +       <parameter type-id='type-id-1360'/>
>     +       <return type-id='type-id-1027'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1445'>
>     ++      <parameter type-id='type-id-335'/>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1093'/>
>     ++      <parameter type-id='type-id-24'/>
>     ++      <parameter type-id='type-id-333'/>
>     ++      <parameter type-id='type-id-176'/>
>     ++      <return type-id='type-id-1027'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1446'>
>     +       <parameter type-id='type-id-335'/>
>     +       <parameter type-id='type-id-1360'/>
>     +@@ -10885,11 +10995,44 @@
>     +       <parameter type-id='type-id-113'/>
>     +       <return type-id='type-id-1027'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1449'>
>     ++      <parameter type-id='type-id-1343'/>
>     ++      <parameter type-id='type-id-24'/>
>     ++      <parameter type-id='type-id-176'/>
>     ++      <parameter type-id='type-id-333'/>
>     ++      <return type-id='type-id-1027'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1450'>
>     +       <parameter type-id='type-id-1347'/>
>     +       <parameter type-id='type-id-1339'/>
>     +       <return type-id='type-id-1027'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1451'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1088'/>
>     ++      <parameter type-id='type-id-24'/>
>     ++      <return type-id='type-id-1027'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1452'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1088'/>
>     ++      <parameter type-id='type-id-165'/>
>     ++      <parameter type-id='type-id-176'/>
>     ++      <return type-id='type-id-1027'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1453'>
>     ++      <parameter type-id='type-id-790'/>
>     ++      <parameter type-id='type-id-1369'/>
>     ++      <parameter type-id='type-id-24'/>
>     ++      <return type-id='type-id-1027'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1454'>
>     ++      <parameter type-id='type-id-790'/>
>     ++      <parameter type-id='type-id-1369'/>
>     ++      <parameter type-id='type-id-165'/>
>     ++      <parameter type-id='type-id-176'/>
>     ++      <return type-id='type-id-1027'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1455'>
>     +       <parameter type-id='type-id-387'/>
>     +       <parameter type-id='type-id-335'/>
>     +@@ -10923,6 +11066,18 @@
>     +       <parameter type-id='type-id-261'/>
>     +       <return type-id='type-id-104'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1460'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1088'/>
>     ++      <parameter type-id='type-id-53'/>
>     ++      <return type-id='type-id-332'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1461'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1093'/>
>     ++      <parameter type-id='type-id-53'/>
>     ++      <return type-id='type-id-332'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1462'>
>     +       <parameter type-id='type-id-1476'/>
>     +       <return type-id='type-id-718'/>
>     +@@ -10936,6 +11091,14 @@
>     +       <parameter type-id='type-id-1402'/>
>     +       <return type-id='type-id-113'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1468'>
>     ++      <parameter type-id='type-id-335'/>
>     ++      <parameter type-id='type-id-114'/>
>     ++      <parameter type-id='type-id-114'/>
>     ++      <parameter type-id='type-id-114'/>
>     ++      <parameter type-id='type-id-114'/>
>     ++      <return type-id='type-id-114'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1469'>
>     +       <parameter type-id='type-id-1410'/>
>     +       <parameter type-id='type-id-1409'/>
>     +@@ -10949,6 +11112,10 @@
>     +       <parameter type-id='type-id-1379'/>
>     +       <return type-id='type-id-841'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1477'>
>     ++      <parameter type-id='type-id-899'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1478'>
>     +       <parameter type-id='type-id-308'/>
>     +       <return type-id='type-id-1538'/>
>     +@@ -11075,12 +11242,26 @@
>     +       <parameter type-id='type-id-53'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1501'>
>     ++      <parameter type-id='type-id-1343'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1502'>
>     +       <parameter type-id='type-id-1347'/>
>     +       <parameter type-id='type-id-67'/>
>     +       <parameter type-id='type-id-67'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1503'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1504'>
>     ++      <parameter type-id='type-id-279'/>
>     ++      <parameter type-id='type-id-1356'/>
>     ++      <parameter type-id='type-id-1346'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1505'>
>     +       <parameter type-id='type-id-1357'/>
>     +       <return type-id='type-id-1538'/>
>     +@@ -11124,6 +11305,15 @@
>     +       <parameter type-id='type-id-75'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1514'>
>     ++      <parameter type-id='type-id-274'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1515'>
>     ++      <parameter type-id='type-id-274'/>
>     ++      <parameter type-id='type-id-165'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1516'>
>     +       <parameter type-id='type-id-139'/>
>     +       <return type-id='type-id-1538'/>
>     +@@ -11192,10 +11382,19 @@
>     +       <parameter type-id='type-id-335'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1528'>
>     ++      <parameter type-id='type-id-577'/>
>     ++      <parameter type-id='type-id-127'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1529'>
>     +       <parameter type-id='type-id-241'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1530'>
>     ++      <parameter type-id='type-id-1418'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1531'>
>     +       <parameter type-id='type-id-399'/>
>     +       <return type-id='type-id-1538'/>
>     +@@ -11210,6 +11409,10 @@
>     +       <parameter type-id='type-id-114'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1534'>
>     ++      <parameter type-id='type-id-127'/>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1535'>
>     +       <parameter type-id='type-id-127'/>
>     +       <parameter type-id='type-id-1204'/>
>     +@@ -11224,6 +11427,9 @@
>     +       <parameter type-id='type-id-1550'/>
>     +       <return type-id='type-id-1538'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1539'>
>     ++      <return type-id='type-id-127'/>
>     ++    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1540'>
>     +       <parameter type-id='type-id-515'/>
>     +       <parameter type-id='type-id-1123'/>
>     +@@ -11241,223 +11447,6 @@
>     +       <parameter type-id='type-id-114'/>
>     +       <return type-id='type-id-127'/>
>     +     </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1547'>
>     +-      <parameter type-id='type-id-127'/>
>     +-      <return type-id='type-id-127'/>
>     +-    </function-type>
>     +-    <type-decl name='void' id='type-id-1538'/>
>     +-    <function-type size-in-bits='64' id='type-id-1112'>
>     +-      <parameter type-id='type-id-614'/>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <return type-id='type-id-165'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1153'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <return type-id='type-id-282'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1198'>
>     +-      <parameter type-id='type-id-538'/>
>     +-      <return type-id='type-id-530'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1220'>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1224'>
>     +-      <parameter type-id='type-id-24'/>
>     +-      <parameter type-id='type-id-1143'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1225'>
>     +-      <parameter type-id='type-id-165'/>
>     +-      <parameter type-id='type-id-1143'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1256'>
>     +-      <parameter type-id='type-id-335'/>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1093'/>
>     +-      <parameter type-id='type-id-125'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1283'>
>     +-      <parameter type-id='type-id-559'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1284'>
>     +-      <parameter type-id='type-id-559'/>
>     +-      <parameter type-id='type-id-165'/>
>     +-      <parameter type-id='type-id-332'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1285'>
>     +-      <parameter type-id='type-id-559'/>
>     +-      <parameter type-id='type-id-559'/>
>     +-      <parameter type-id='type-id-165'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1286'>
>     +-      <parameter type-id='type-id-1343'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1287'>
>     +-      <parameter type-id='type-id-1343'/>
>     +-      <parameter type-id='type-id-125'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1290'>
>     +-      <parameter type-id='type-id-614'/>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1292'>
>     +-      <parameter type-id='type-id-614'/>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1350'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1305'>
>     +-      <parameter type-id='type-id-274'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1314'>
>     +-      <parameter type-id='type-id-577'/>
>     +-      <parameter type-id='type-id-559'/>
>     +-      <parameter type-id='type-id-557'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1315'>
>     +-      <parameter type-id='type-id-577'/>
>     +-      <parameter type-id='type-id-557'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1316'>
>     +-      <parameter type-id='type-id-577'/>
>     +-      <parameter type-id='type-id-127'/>
>     +-      <return type-id='type-id-53'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1363'>
>     +-      <parameter type-id='type-id-1398'/>
>     +-      <return type-id='type-id-67'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1427'>
>     +-      <parameter type-id='type-id-1343'/>
>     +-      <parameter type-id='type-id-1384'/>
>     +-      <return type-id='type-id-1085'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1428'>
>     +-      <return type-id='type-id-172'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1437'>
>     +-      <return type-id='type-id-533'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1445'>
>     +-      <parameter type-id='type-id-335'/>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1093'/>
>     +-      <parameter type-id='type-id-24'/>
>     +-      <parameter type-id='type-id-333'/>
>     +-      <parameter type-id='type-id-176'/>
>     +-      <return type-id='type-id-1027'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1449'>
>     +-      <parameter type-id='type-id-1343'/>
>     +-      <parameter type-id='type-id-24'/>
>     +-      <parameter type-id='type-id-176'/>
>     +-      <parameter type-id='type-id-333'/>
>     +-      <return type-id='type-id-1027'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1451'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1088'/>
>     +-      <parameter type-id='type-id-24'/>
>     +-      <return type-id='type-id-1027'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1452'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1088'/>
>     +-      <parameter type-id='type-id-165'/>
>     +-      <parameter type-id='type-id-176'/>
>     +-      <return type-id='type-id-1027'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1453'>
>     +-      <parameter type-id='type-id-790'/>
>     +-      <parameter type-id='type-id-1369'/>
>     +-      <parameter type-id='type-id-24'/>
>     +-      <return type-id='type-id-1027'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1454'>
>     +-      <parameter type-id='type-id-790'/>
>     +-      <parameter type-id='type-id-1369'/>
>     +-      <parameter type-id='type-id-165'/>
>     +-      <parameter type-id='type-id-176'/>
>     +-      <return type-id='type-id-1027'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1460'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1088'/>
>     +-      <parameter type-id='type-id-53'/>
>     +-      <return type-id='type-id-332'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1461'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1093'/>
>     +-      <parameter type-id='type-id-53'/>
>     +-      <return type-id='type-id-332'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1468'>
>     +-      <parameter type-id='type-id-335'/>
>     +-      <parameter type-id='type-id-114'/>
>     +-      <parameter type-id='type-id-114'/>
>     +-      <parameter type-id='type-id-114'/>
>     +-      <parameter type-id='type-id-114'/>
>     +-      <return type-id='type-id-114'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1073'>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1477'>
>     +-      <parameter type-id='type-id-899'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1501'>
>     +-      <parameter type-id='type-id-1343'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1503'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1504'>
>     +-      <parameter type-id='type-id-279'/>
>     +-      <parameter type-id='type-id-1356'/>
>     +-      <parameter type-id='type-id-1346'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1514'>
>     +-      <parameter type-id='type-id-274'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1515'>
>     +-      <parameter type-id='type-id-274'/>
>     +-      <parameter type-id='type-id-165'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1528'>
>     +-      <parameter type-id='type-id-577'/>
>     +-      <parameter type-id='type-id-127'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1530'>
>     +-      <parameter type-id='type-id-1418'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1534'>
>     +-      <parameter type-id='type-id-127'/>
>     +-      <return type-id='type-id-1538'/>
>     +-    </function-type>
>     +-    <function-type size-in-bits='64' id='type-id-1539'>
>     +-      <return type-id='type-id-127'/>
>     +-    </function-type>
>     +     <function-type size-in-bits='64' id='type-id-1543'>
>     +       <parameter type-id='type-id-279'/>
>     +       <return type-id='type-id-127'/>
>     +@@ -11477,48 +11466,19 @@
>     +       <parameter type-id='type-id-1412'/>
>     +       <return type-id='type-id-127'/>
>     +     </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1547'>
>     ++      <parameter type-id='type-id-127'/>
>     ++      <return type-id='type-id-127'/>
>     ++    </function-type>
>     ++    <type-decl name='void' id='type-id-1538'/>
>     ++    <function-type size-in-bits='64' id='type-id-1220'>
>     ++      <return type-id='type-id-53'/>
>     ++    </function-type>
>     ++    <function-type size-in-bits='64' id='type-id-1073'>
>     ++      <return type-id='type-id-1538'/>
>     ++    </function-type>
>     +   </abi-instr>
>     +   <abi-instr address-size='64' path='drivers/mmc/host/sdhci.mod.c' comp-dir-path='/ws/android/kernel/aosp/common-mainline/out/android-mainline/common' language='LANG_C89'>
>     +-    <class-decl name='anon_vma' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1555'/>
>     +-    <class-decl name='audit_context' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1556'/>
>     +-    <class-decl name='backing_dev_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1557'/>
>     +-    <class-decl name='bio_list' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1558'/>
>     +-    <class-decl name='blk_plug' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1559'/>
>     +-    <class-decl name='capture_control' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1560'/>
>     +-    <class-decl name='cfs_rq' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1561'/>
>     +-    <class-decl name='files_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1562'/>
>     +-    <class-decl name='fs_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1563'/>
>     +-    <class-decl name='ftrace_ret_stack' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1564'/>
>     +-    <class-decl name='kernfs_iattrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1565'/>
>     +-    <class-decl name='kernfs_open_node' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1566'/>
>     +-    <class-decl name='kioctx_table' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1567'/>
>     +-    <class-decl name='kmem_cache' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1568'/>
>     +-    <class-decl name='linux_binfmt' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1569'/>
>     +-    <class-decl name='mem_cgroup' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1570'/>
>     +-    <class-decl name='module_notes_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1571'/>
>     +-    <class-decl name='module_param_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1572'/>
>     +-    <class-decl name='module_sect_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1573'/>
>     +-    <class-decl name='nameidata' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1574'/>
>     +-    <class-decl name='perf_event' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1575'/>
>     +-    <class-decl name='pipe_inode_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1576'/>
>     +-    <class-decl name='poll_table_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1577'/>
>     +-    <class-decl name='pollfd' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1578'/>
>     +-    <class-decl name='rcu_node' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1579'/>
>     +-    <class-decl name='reclaim_state' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1580'/>
>     +-    <class-decl name='request_queue' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1581'/>
>     +-    <class-decl name='rt_mutex_waiter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1582'/>
>     +-    <class-decl name='rt_rq' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1583'/>
>     +-    <class-decl name='sched_class' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1584'/>
>     +-    <class-decl name='seccomp_filter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1585'/>
>     +-    <class-decl name='seq_file' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1586'/>
>     +-    <class-decl name='sock' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1587'/>
>     +-    <class-decl name='task_group' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1588'/>
>     +-    <class-decl name='trace_eval_map' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1589'/>
>     +-    <class-decl name='trace_event_call' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1590'/>
>     +-    <class-decl name='uprobe' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1591'/>
>     +-    <class-decl name='user_namespace' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1592'/>
>     +-    <class-decl name='workqueue_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1593'/>
>     +-    <class-decl name='xol_area' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1594'/>
>     +     <var-decl name='__this_module' type-id='type-id-789' mangled-name='__this_module' visibility='default' filepath='/ws/android/kernel/aosp/common-mainline/out/android-mainline/common/drivers/mmc/host/sdhci.mod.c' line='11' column='1' elf-symbol-id='__this_module'/>
>     +   </abi-instr>
>     + </abi-corpus>
>     +ABIs differ:
>     +[...]/source-libabigail/tests/data/test-read-dwarf/PR25007-sdhci.ko.abi
>     +and:
>     +[...]/build-libabigail/tests/output/test-read-dwarf/PR25007-sdhci.ko.abi
>     +
>     +FAIL runtestreaddwarf (exit status: 1)
>
> Only that one test case.
>
> The reordered 'function-type's -- but I've not yet verified whether
> they're really just reordered -- may hint towards a sorting stability
> issue, but there are also the disappearing 'class-decl's.
>
> Unless somebody points out any misunderstanding on my side, I suppose I
> shall try to figure out what's going wrong.
>
>
> Grüße
>  Thomas
> -----------------
> Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955

-- 
		Dodji

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization
  2022-06-20 16:12 ` Dodji Seketeli
@ 2022-06-22  8:09   ` Ben Woodard
  0 siblings, 0 replies; 12+ messages in thread
From: Ben Woodard @ 2022-06-22  8:09 UTC (permalink / raw)
  To: Dodji Seketeli; +Cc: libabigail

I think you have an infinite loop in there somewhere. Abidw has been running for more than 15 hours on one library and still hasn’t completed.

    312 pts/4    R+   924:34 abidw --abidiff /lib64/dyninst/libdyninstAPI.so.12.0.1

This was with the libdyninstAPI.so from dyninst-12.0.1-3.fc36.x86_64

The backtrace is too long to post about 500 levels deep but here are the top 20 frames. It looks to be deep in comparison.
I’ve never seen these RTTI warnings before.

3916      get_size_in_bits() const;
(gdb) bt
#0  0x00007fd7746fe74b in virtual thunk to abigail::ir::class_or_union::get_size_in_bits() const () at /home/ben/Work/libabigail/build/../include/abg-ir.h:3916
#1  0x00007fd7746dc91d in abigail::ir::equals (l=warning: RTTI symbol not found for class 'abigail::ir::union_decl [clone .localalias]'
..., r=warning: RTTI symbol not found for class 'abigail::ir::union_decl [clone .localalias]'
..., k=0x0) at ../../src/abg-ir.cc:14240
#2  0x00007fd7747011b9 in abigail::ir::equals (l=warning: RTTI symbol not found for class 'abigail::ir::union_decl [clone .localalias]'
..., r=warning: RTTI symbol not found for class 'abigail::ir::union_decl [clone .localalias]'
..., k=0x0) at ../../src/abg-ir.cc:21565
#3  0x00007fd7746f04bf in abigail::ir::type_base::operator!= (other=..., this=0xf39bf50) at ../../src/abg-ir.cc:14263
#4  abigail::ir::equals (l=warning: RTTI symbol not found for class 'abigail::ir::var_decl [clone .localalias]'
..., r=warning: RTTI symbol not found for class 'abigail::ir::var_decl [clone .localalias]'
..., k=0x0) at ../../src/abg-ir.cc:18413
#5  0x00007fd7746ba48e in abigail::ir::decl_base::operator!= (this=<optimized out>, other=...) at ../../src/abg-ir.cc:5221
#6  0x00007fd7747012d6 in abigail::ir::equals (l=warning: RTTI symbol not found for class 'abigail::ir::class_decl [clone .localalias]'
..., r=warning: RTTI symbol not found for class 'abigail::ir::class_decl [clone .localalias]'
..., k=0x0) at /usr/include/c++/12/bits/shared_ptr_base.h:1349
#7  0x00007fd77470a724 in abigail::ir::equals (l=warning: RTTI symbol not found for class 'abigail::ir::class_decl [clone .localalias]'
..., r=warning: RTTI symbol not found for class 'abigail::ir::class_decl [clone .localalias]'
..., k=0x0) at ../../src/abg-ir.cc:23108
#8  0x00007fd7746ee4d4 in abigail::ir::type_base::operator!= (other=..., this=0xf391868) at ../../src/abg-ir.cc:14263
#9  abigail::ir::equals (l=..., r=warning: RTTI symbol not found for class 'abigail::ir::typedef_decl [clone .localalias]'
..., k=0x0) at ../../src/abg-ir.cc:18108
#10 0x00007fd7746f04bf in abigail::ir::type_base::operator!= (other=..., this=0xf527130) at ../../src/abg-ir.cc:14263
#11 abigail::ir::equals (l=warning: RTTI symbol not found for class 'abigail::ir::var_decl [clone .localalias]'
..., r=warning: RTTI symbol not found for class 'abigail::ir::var_decl [clone .localalias]'
..., k=0x0) at ../../src/abg-ir.cc:18413
#12 0x00007fd7746ba48e in abigail::ir::decl_base::operator!= (this=<optimized out>, other=...) at ../../src/abg-ir.cc:5221
#13 0x00007fd7747012d6 in abigail::ir::equals (l=warning: RTTI symbol not found for class 'abigail::ir::class_decl [clone .localalias]'
..., r=warning: RTTI symbol not found for class 'abigail::ir::class_decl [clone .localalias]'
..., k=0x0) at /usr/include/c++/12/bits/shared_ptr_base.h:1349
#14 0x00007fd77470a724 in abigail::ir::equals (l=warning: RTTI symbol not found for class 'abigail::ir::class_decl [clone .localalias]'
..., r=warning: RTTI symbol not found for class 'abigail::ir::class_decl [clone .localalias]'
..., k=0x0) at ../../src/abg-ir.cc:23108
#15 0x00007fd7746f04bf in abigail::ir::type_base::operator!= (other=..., this=0x18d32928) at ../../src/abg-ir.cc:14263
#16 abigail::ir::equals (l=warning: RTTI symbol not found for class 'abigail::ir::var_decl [clone .localalias]'
..., r=warning: RTTI symbol not found for class 'abigail::ir::var_decl [clone .localalias]'
..., k=0x0) at ../../src/abg-ir.cc:18413
#17 0x00007fd7746ba48e in abigail::ir::decl_base::operator!= (this=<optimized out>, other=...) at ../../src/abg-ir.cc:5221
#18 0x00007fd7747012d6 in abigail::ir::equals (l=warning: RTTI symbol not found for class 'abigail::ir::class_decl [clone .localalias]'
..., r=warning: RTTI symbol not found for class 'abigail::ir::class_decl [clone .localalias]'
..., k=0x0) at /usr/include/c++/12/bits/shared_ptr_base.h:1349
#19 0x00007fd77470a724 in abigail::ir::equals (l=warning: RTTI symbol not found for class 'abigail::ir::class_decl [clone .localalias]'
..., r=warning: RTTI symbol not found for class 'abigail::ir::class_decl [clone .localalias]'
..., k=0x0) at ../../src/abg-ir.cc:23108

-ben

> On Jun 20, 2022, at 9:12 AM, Dodji Seketeli <dodji@seketeli.org> wrote:
> 
> Hello Thomas et al.,
> 
> I have finally applied a fix for this issue that you reported.
> 
> It can be read at https://sourceware.org/git/?p=libabigail.git;a=commit;h=0529e3b9ee09c29137952b3a5d4a7cc10484649a.
> 
> Thanks for reporting this and sorry for the inconvenience.
> 
> Cheers,
> 
> Thomas Schwinge <thomas@codesourcery.com> a écrit:
> 
>> Hi!
>> 
>> It's late on a Friday evening, and very well this may just be me not
>> understanding libabigail/DWARF ;-) -- in context of
>> <https://sourceware.org/bugzilla/show_bug.cgi?id=21023#c10> or
>> <https://sourceware.org/bugzilla/show_bug.cgi?id=25042#c4>, I did a
>> simple experiment to disable the
>> 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value'
>> optimization:
>> 
>>    --- src/abg-dwarf-reader.cc
>>    +++ src/abg-dwarf-reader.cc
>>    [...]
>>     /// This function is a fast routine (optimization) to compare the
>>     /// values of two string attributes of two DIEs.
>>     ///
>>     /// @param l the first DIE to consider.
>>     ///
>>     /// @param r the second DIE to consider.
>>     ///
>>     /// @param attr_name the name of the attribute to compare, on the two
>>     /// DIEs above.
>>     ///
>>     /// @param result out parameter.  This is set to the result of the
>>     /// comparison.  If the value of attribute @p attr_name on DIE @p l
>>     /// equals the value of attribute @p attr_name on DIE @p r, then the
>>     /// the argument of this parameter is set to true.  Otherwise, it's
>>     /// set to false.  Note that the argument of this parameter is set iff
>>     /// the function returned true.
>>     ///
>>     /// @return true iff the comparison could be performed.  There are
>>     /// cases in which the comparison cannot be performed.  For instance,
>>     /// if one of the DIEs does not have the attribute @p attr_name.  In
>>     /// any case, if this function returns true, then the parameter @p
>>     /// result is set to the result of the comparison.
>>     static bool
>>     compare_dies_string_attribute_value(const Dwarf_Die *l, const Dwarf_Die *r,
>>                                    unsigned attr_name,
>>                                    bool &result)
>>     {
>>       Dwarf_Attribute l_attr, r_attr;
>>       if (!dwarf_attr_integrate(const_cast<Dwarf_Die*>(l), attr_name, &l_attr)
>>           || !dwarf_attr_integrate(const_cast<Dwarf_Die*>(r), attr_name, &r_attr))
>>         return false;
>> 
>>       ABG_ASSERT(l_attr.form == DW_FORM_strp
>>             || l_attr.form == DW_FORM_string
>>             || l_attr.form == DW_FORM_GNU_strp_alt
>>             || form_is_DW_FORM_strx(l_attr.form)
>>             || form_is_DW_FORM_line_strp(l_attr.form));
>> 
>>       ABG_ASSERT(r_attr.form == DW_FORM_strp
>>             || r_attr.form == DW_FORM_string
>>             || r_attr.form == DW_FORM_GNU_strp_alt
>>             || form_is_DW_FORM_strx(r_attr.form)
>>             || form_is_DW_FORM_line_strp(r_attr.form));
>> 
>>    +#if 0
>>       if ((l_attr.form == DW_FORM_strp
>>            && r_attr.form == DW_FORM_strp)
>>           || (l_attr.form == DW_FORM_GNU_strp_alt
>>          && r_attr.form == DW_FORM_GNU_strp_alt)
>>           || (form_is_DW_FORM_strx(l_attr.form)
>>          && form_is_DW_FORM_strx(r_attr.form))
>>           || (form_is_DW_FORM_line_strp(l_attr.form)
>>          && form_is_DW_FORM_line_strp(r_attr.form)))
>>         {
>>           // So these string attributes are actually pointers into a
>>           // string table.  The string table is most likely de-duplicated
>>           // so comparing the *values* of the pointers should be enough.
>>           //
>>           // This is the fast path.
>>           if (l_attr.valp == r_attr.valp)
>>          result = true;
>>           else if (l_attr.valp && r_attr.valp)
>>        result = *l_attr.valp == *r_attr.valp;
>>           else
>>        result = false;
>>           return true;
>>         }
>>    +#endif
>> 
>>       // If we reached this point it means we couldn't use the fast path
>>       // because the string atttributes are strings that are "inline" in
>>       // the debug info section.  Let's just compare them the slow and
>>       // obvious way.
>>       string l_str = die_string_attribute(l, attr_name),
>>         r_str = die_string_attribute(r, attr_name);
>>       result = l_str == r_str;
>> 
>>       return true;
>>     }
>> 
>> My assumption was that this shouldn't change anything other than possibly
>> regress performance.  However:
>> 
>>    [-PASS:-]{+FAIL:+} runtestreaddwarf
>> 
>>    --- build-libabigail/tests/runtestreaddwarf.log
>>    +++ build-libabigail/tests/runtestreaddwarf.log
>>    [...]
>>    -PASS runtestreaddwarf (exit status: 0)
>>    +--- [...]/source-libabigail/tests/data/test-read-dwarf/PR25007-sdhci.ko.abi        2022-01-28 22:48:07.049805043 +0100
>>    ++++ [...]/build-libabigail/tests/output/test-read-dwarf/PR25007-sdhci.ko.abi       2022-01-28 23:15:30.261483063 +0100
>>    +@@ -10107,10 +10107,19 @@
>>    +       <parameter type-id='type-id-1183'/>
>>    +       <return type-id='type-id-165'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1112'>
>>    ++      <parameter type-id='type-id-614'/>
>>    ++      <parameter type-id='type-id-279'/>
>>    ++      <return type-id='type-id-165'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1114'>
>>    +       <parameter type-id='type-id-125'/>
>>    +       <return type-id='type-id-165'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1153'>
>>    ++      <parameter type-id='type-id-279'/>
>>    ++      <return type-id='type-id-282'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1184'>
>>    +       <parameter type-id='type-id-238'/>
>>    +       <parameter type-id='type-id-1138'/>
>>    +@@ -10138,6 +10147,10 @@
>>    +       <parameter type-id='type-id-51'/>
>>    +       <return type-id='type-id-1195'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1198'>
>>    ++      <parameter type-id='type-id-538'/>
>>    ++      <return type-id='type-id-530'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1199'>
>>    +       <parameter type-id='type-id-1357'/>
>>    +       <return type-id='type-id-635'/>
>>    +@@ -10181,6 +10194,16 @@
>>    +       <parameter type-id='type-id-1553'/>
>>    +       <return type-id='type-id-53'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1224'>
>>    ++      <parameter type-id='type-id-24'/>
>>    ++      <parameter type-id='type-id-1143'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1225'>
>>    ++      <parameter type-id='type-id-165'/>
>>    ++      <parameter type-id='type-id-1143'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1226'>
>>    +       <parameter type-id='type-id-1118'/>
>>    +       <return type-id='type-id-53'/>
>>    +@@ -10370,6 +10393,13 @@
>>    +       <parameter type-id='type-id-411'/>
>>    +       <return type-id='type-id-53'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1256'>
>>    ++      <parameter type-id='type-id-335'/>
>>    ++      <parameter type-id='type-id-279'/>
>>    ++      <parameter type-id='type-id-1093'/>
>>    ++      <parameter type-id='type-id-125'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1257'>
>>    +       <parameter type-id='type-id-335'/>
>>    +       <parameter type-id='type-id-67'/>
>>    +@@ -10519,6 +10549,31 @@
>>    +       <parameter type-id='type-id-53'/>
>>    +       <return type-id='type-id-53'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1283'>
>>    ++      <parameter type-id='type-id-559'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1284'>
>>    ++      <parameter type-id='type-id-559'/>
>>    ++      <parameter type-id='type-id-165'/>
>>    ++      <parameter type-id='type-id-332'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1285'>
>>    ++      <parameter type-id='type-id-559'/>
>>    ++      <parameter type-id='type-id-559'/>
>>    ++      <parameter type-id='type-id-165'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1286'>
>>    ++      <parameter type-id='type-id-1343'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1287'>
>>    ++      <parameter type-id='type-id-1343'/>
>>    ++      <parameter type-id='type-id-125'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1288'>
>>    +       <parameter type-id='type-id-225'/>
>>    +       <parameter type-id='type-id-1151'/>
>>    +@@ -10531,6 +10586,17 @@
>>    +       <parameter type-id='type-id-172'/>
>>    +       <return type-id='type-id-53'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1290'>
>>    ++      <parameter type-id='type-id-614'/>
>>    ++      <parameter type-id='type-id-279'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1292'>
>>    ++      <parameter type-id='type-id-614'/>
>>    ++      <parameter type-id='type-id-279'/>
>>    ++      <parameter type-id='type-id-1350'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1294'>
>>    +       <parameter type-id='type-id-1357'/>
>>    +       <return type-id='type-id-53'/>
>>    +@@ -10591,6 +10657,10 @@
>>    +       <parameter type-id='type-id-100'/>
>>    +       <return type-id='type-id-53'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1305'>
>>    ++      <parameter type-id='type-id-274'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1306'>
>>    +       <parameter type-id='type-id-826'/>
>>    +       <parameter type-id='type-id-114'/>
>>    +@@ -10631,6 +10701,22 @@
>>    +       <parameter type-id='type-id-238'/>
>>    +       <return type-id='type-id-53'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1314'>
>>    ++      <parameter type-id='type-id-577'/>
>>    ++      <parameter type-id='type-id-559'/>
>>    ++      <parameter type-id='type-id-557'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1315'>
>>    ++      <parameter type-id='type-id-577'/>
>>    ++      <parameter type-id='type-id-557'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1316'>
>>    ++      <parameter type-id='type-id-577'/>
>>    ++      <parameter type-id='type-id-127'/>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1317'>
>>    +       <parameter type-id='type-id-241'/>
>>    +       <return type-id='type-id-53'/>
>>    +@@ -10746,6 +10832,10 @@
>>    +       <parameter type-id='type-id-114'/>
>>    +       <return type-id='type-id-67'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1363'>
>>    ++      <parameter type-id='type-id-1398'/>
>>    ++      <return type-id='type-id-67'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1364'>
>>    +       <parameter type-id='type-id-241'/>
>>    +       <parameter type-id='type-id-1409'/>
>>    +@@ -10770,6 +10860,14 @@
>>    +       <parameter type-id='type-id-1384'/>
>>    +       <return type-id='type-id-1085'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1427'>
>>    ++      <parameter type-id='type-id-1343'/>
>>    ++      <parameter type-id='type-id-1384'/>
>>    ++      <return type-id='type-id-1085'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1428'>
>>    ++      <return type-id='type-id-172'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1429'>
>>    +       <parameter type-id='type-id-515'/>
>>    +       <return type-id='type-id-172'/>
>>    +@@ -10815,6 +10913,9 @@
>>    +       <parameter type-id='type-id-399'/>
>>    +       <return type-id='type-id-399'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1437'>
>>    ++      <return type-id='type-id-533'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1438'>
>>    +       <parameter type-id='type-id-335'/>
>>    +       <parameter type-id='type-id-333'/>
>>    +@@ -10859,6 +10960,15 @@
>>    +       <parameter type-id='type-id-1360'/>
>>    +       <return type-id='type-id-1027'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1445'>
>>    ++      <parameter type-id='type-id-335'/>
>>    ++      <parameter type-id='type-id-279'/>
>>    ++      <parameter type-id='type-id-1093'/>
>>    ++      <parameter type-id='type-id-24'/>
>>    ++      <parameter type-id='type-id-333'/>
>>    ++      <parameter type-id='type-id-176'/>
>>    ++      <return type-id='type-id-1027'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1446'>
>>    +       <parameter type-id='type-id-335'/>
>>    +       <parameter type-id='type-id-1360'/>
>>    +@@ -10885,11 +10995,44 @@
>>    +       <parameter type-id='type-id-113'/>
>>    +       <return type-id='type-id-1027'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1449'>
>>    ++      <parameter type-id='type-id-1343'/>
>>    ++      <parameter type-id='type-id-24'/>
>>    ++      <parameter type-id='type-id-176'/>
>>    ++      <parameter type-id='type-id-333'/>
>>    ++      <return type-id='type-id-1027'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1450'>
>>    +       <parameter type-id='type-id-1347'/>
>>    +       <parameter type-id='type-id-1339'/>
>>    +       <return type-id='type-id-1027'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1451'>
>>    ++      <parameter type-id='type-id-279'/>
>>    ++      <parameter type-id='type-id-1088'/>
>>    ++      <parameter type-id='type-id-24'/>
>>    ++      <return type-id='type-id-1027'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1452'>
>>    ++      <parameter type-id='type-id-279'/>
>>    ++      <parameter type-id='type-id-1088'/>
>>    ++      <parameter type-id='type-id-165'/>
>>    ++      <parameter type-id='type-id-176'/>
>>    ++      <return type-id='type-id-1027'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1453'>
>>    ++      <parameter type-id='type-id-790'/>
>>    ++      <parameter type-id='type-id-1369'/>
>>    ++      <parameter type-id='type-id-24'/>
>>    ++      <return type-id='type-id-1027'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1454'>
>>    ++      <parameter type-id='type-id-790'/>
>>    ++      <parameter type-id='type-id-1369'/>
>>    ++      <parameter type-id='type-id-165'/>
>>    ++      <parameter type-id='type-id-176'/>
>>    ++      <return type-id='type-id-1027'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1455'>
>>    +       <parameter type-id='type-id-387'/>
>>    +       <parameter type-id='type-id-335'/>
>>    +@@ -10923,6 +11066,18 @@
>>    +       <parameter type-id='type-id-261'/>
>>    +       <return type-id='type-id-104'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1460'>
>>    ++      <parameter type-id='type-id-279'/>
>>    ++      <parameter type-id='type-id-1088'/>
>>    ++      <parameter type-id='type-id-53'/>
>>    ++      <return type-id='type-id-332'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1461'>
>>    ++      <parameter type-id='type-id-279'/>
>>    ++      <parameter type-id='type-id-1093'/>
>>    ++      <parameter type-id='type-id-53'/>
>>    ++      <return type-id='type-id-332'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1462'>
>>    +       <parameter type-id='type-id-1476'/>
>>    +       <return type-id='type-id-718'/>
>>    +@@ -10936,6 +11091,14 @@
>>    +       <parameter type-id='type-id-1402'/>
>>    +       <return type-id='type-id-113'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1468'>
>>    ++      <parameter type-id='type-id-335'/>
>>    ++      <parameter type-id='type-id-114'/>
>>    ++      <parameter type-id='type-id-114'/>
>>    ++      <parameter type-id='type-id-114'/>
>>    ++      <parameter type-id='type-id-114'/>
>>    ++      <return type-id='type-id-114'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1469'>
>>    +       <parameter type-id='type-id-1410'/>
>>    +       <parameter type-id='type-id-1409'/>
>>    +@@ -10949,6 +11112,10 @@
>>    +       <parameter type-id='type-id-1379'/>
>>    +       <return type-id='type-id-841'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1477'>
>>    ++      <parameter type-id='type-id-899'/>
>>    ++      <return type-id='type-id-1538'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1478'>
>>    +       <parameter type-id='type-id-308'/>
>>    +       <return type-id='type-id-1538'/>
>>    +@@ -11075,12 +11242,26 @@
>>    +       <parameter type-id='type-id-53'/>
>>    +       <return type-id='type-id-1538'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1501'>
>>    ++      <parameter type-id='type-id-1343'/>
>>    ++      <return type-id='type-id-1538'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1502'>
>>    +       <parameter type-id='type-id-1347'/>
>>    +       <parameter type-id='type-id-67'/>
>>    +       <parameter type-id='type-id-67'/>
>>    +       <return type-id='type-id-1538'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1503'>
>>    ++      <parameter type-id='type-id-279'/>
>>    ++      <return type-id='type-id-1538'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1504'>
>>    ++      <parameter type-id='type-id-279'/>
>>    ++      <parameter type-id='type-id-1356'/>
>>    ++      <parameter type-id='type-id-1346'/>
>>    ++      <return type-id='type-id-1538'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1505'>
>>    +       <parameter type-id='type-id-1357'/>
>>    +       <return type-id='type-id-1538'/>
>>    +@@ -11124,6 +11305,15 @@
>>    +       <parameter type-id='type-id-75'/>
>>    +       <return type-id='type-id-1538'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1514'>
>>    ++      <parameter type-id='type-id-274'/>
>>    ++      <return type-id='type-id-1538'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1515'>
>>    ++      <parameter type-id='type-id-274'/>
>>    ++      <parameter type-id='type-id-165'/>
>>    ++      <return type-id='type-id-1538'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1516'>
>>    +       <parameter type-id='type-id-139'/>
>>    +       <return type-id='type-id-1538'/>
>>    +@@ -11192,10 +11382,19 @@
>>    +       <parameter type-id='type-id-335'/>
>>    +       <return type-id='type-id-1538'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1528'>
>>    ++      <parameter type-id='type-id-577'/>
>>    ++      <parameter type-id='type-id-127'/>
>>    ++      <return type-id='type-id-1538'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1529'>
>>    +       <parameter type-id='type-id-241'/>
>>    +       <return type-id='type-id-1538'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1530'>
>>    ++      <parameter type-id='type-id-1418'/>
>>    ++      <return type-id='type-id-1538'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1531'>
>>    +       <parameter type-id='type-id-399'/>
>>    +       <return type-id='type-id-1538'/>
>>    +@@ -11210,6 +11409,10 @@
>>    +       <parameter type-id='type-id-114'/>
>>    +       <return type-id='type-id-1538'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1534'>
>>    ++      <parameter type-id='type-id-127'/>
>>    ++      <return type-id='type-id-1538'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1535'>
>>    +       <parameter type-id='type-id-127'/>
>>    +       <parameter type-id='type-id-1204'/>
>>    +@@ -11224,6 +11427,9 @@
>>    +       <parameter type-id='type-id-1550'/>
>>    +       <return type-id='type-id-1538'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1539'>
>>    ++      <return type-id='type-id-127'/>
>>    ++    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1540'>
>>    +       <parameter type-id='type-id-515'/>
>>    +       <parameter type-id='type-id-1123'/>
>>    +@@ -11241,223 +11447,6 @@
>>    +       <parameter type-id='type-id-114'/>
>>    +       <return type-id='type-id-127'/>
>>    +     </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1547'>
>>    +-      <parameter type-id='type-id-127'/>
>>    +-      <return type-id='type-id-127'/>
>>    +-    </function-type>
>>    +-    <type-decl name='void' id='type-id-1538'/>
>>    +-    <function-type size-in-bits='64' id='type-id-1112'>
>>    +-      <parameter type-id='type-id-614'/>
>>    +-      <parameter type-id='type-id-279'/>
>>    +-      <return type-id='type-id-165'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1153'>
>>    +-      <parameter type-id='type-id-279'/>
>>    +-      <return type-id='type-id-282'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1198'>
>>    +-      <parameter type-id='type-id-538'/>
>>    +-      <return type-id='type-id-530'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1220'>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1224'>
>>    +-      <parameter type-id='type-id-24'/>
>>    +-      <parameter type-id='type-id-1143'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1225'>
>>    +-      <parameter type-id='type-id-165'/>
>>    +-      <parameter type-id='type-id-1143'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1256'>
>>    +-      <parameter type-id='type-id-335'/>
>>    +-      <parameter type-id='type-id-279'/>
>>    +-      <parameter type-id='type-id-1093'/>
>>    +-      <parameter type-id='type-id-125'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1283'>
>>    +-      <parameter type-id='type-id-559'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1284'>
>>    +-      <parameter type-id='type-id-559'/>
>>    +-      <parameter type-id='type-id-165'/>
>>    +-      <parameter type-id='type-id-332'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1285'>
>>    +-      <parameter type-id='type-id-559'/>
>>    +-      <parameter type-id='type-id-559'/>
>>    +-      <parameter type-id='type-id-165'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1286'>
>>    +-      <parameter type-id='type-id-1343'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1287'>
>>    +-      <parameter type-id='type-id-1343'/>
>>    +-      <parameter type-id='type-id-125'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1290'>
>>    +-      <parameter type-id='type-id-614'/>
>>    +-      <parameter type-id='type-id-279'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1292'>
>>    +-      <parameter type-id='type-id-614'/>
>>    +-      <parameter type-id='type-id-279'/>
>>    +-      <parameter type-id='type-id-1350'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1305'>
>>    +-      <parameter type-id='type-id-274'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1314'>
>>    +-      <parameter type-id='type-id-577'/>
>>    +-      <parameter type-id='type-id-559'/>
>>    +-      <parameter type-id='type-id-557'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1315'>
>>    +-      <parameter type-id='type-id-577'/>
>>    +-      <parameter type-id='type-id-557'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1316'>
>>    +-      <parameter type-id='type-id-577'/>
>>    +-      <parameter type-id='type-id-127'/>
>>    +-      <return type-id='type-id-53'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1363'>
>>    +-      <parameter type-id='type-id-1398'/>
>>    +-      <return type-id='type-id-67'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1427'>
>>    +-      <parameter type-id='type-id-1343'/>
>>    +-      <parameter type-id='type-id-1384'/>
>>    +-      <return type-id='type-id-1085'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1428'>
>>    +-      <return type-id='type-id-172'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1437'>
>>    +-      <return type-id='type-id-533'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1445'>
>>    +-      <parameter type-id='type-id-335'/>
>>    +-      <parameter type-id='type-id-279'/>
>>    +-      <parameter type-id='type-id-1093'/>
>>    +-      <parameter type-id='type-id-24'/>
>>    +-      <parameter type-id='type-id-333'/>
>>    +-      <parameter type-id='type-id-176'/>
>>    +-      <return type-id='type-id-1027'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1449'>
>>    +-      <parameter type-id='type-id-1343'/>
>>    +-      <parameter type-id='type-id-24'/>
>>    +-      <parameter type-id='type-id-176'/>
>>    +-      <parameter type-id='type-id-333'/>
>>    +-      <return type-id='type-id-1027'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1451'>
>>    +-      <parameter type-id='type-id-279'/>
>>    +-      <parameter type-id='type-id-1088'/>
>>    +-      <parameter type-id='type-id-24'/>
>>    +-      <return type-id='type-id-1027'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1452'>
>>    +-      <parameter type-id='type-id-279'/>
>>    +-      <parameter type-id='type-id-1088'/>
>>    +-      <parameter type-id='type-id-165'/>
>>    +-      <parameter type-id='type-id-176'/>
>>    +-      <return type-id='type-id-1027'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1453'>
>>    +-      <parameter type-id='type-id-790'/>
>>    +-      <parameter type-id='type-id-1369'/>
>>    +-      <parameter type-id='type-id-24'/>
>>    +-      <return type-id='type-id-1027'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1454'>
>>    +-      <parameter type-id='type-id-790'/>
>>    +-      <parameter type-id='type-id-1369'/>
>>    +-      <parameter type-id='type-id-165'/>
>>    +-      <parameter type-id='type-id-176'/>
>>    +-      <return type-id='type-id-1027'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1460'>
>>    +-      <parameter type-id='type-id-279'/>
>>    +-      <parameter type-id='type-id-1088'/>
>>    +-      <parameter type-id='type-id-53'/>
>>    +-      <return type-id='type-id-332'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1461'>
>>    +-      <parameter type-id='type-id-279'/>
>>    +-      <parameter type-id='type-id-1093'/>
>>    +-      <parameter type-id='type-id-53'/>
>>    +-      <return type-id='type-id-332'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1468'>
>>    +-      <parameter type-id='type-id-335'/>
>>    +-      <parameter type-id='type-id-114'/>
>>    +-      <parameter type-id='type-id-114'/>
>>    +-      <parameter type-id='type-id-114'/>
>>    +-      <parameter type-id='type-id-114'/>
>>    +-      <return type-id='type-id-114'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1073'>
>>    +-      <return type-id='type-id-1538'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1477'>
>>    +-      <parameter type-id='type-id-899'/>
>>    +-      <return type-id='type-id-1538'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1501'>
>>    +-      <parameter type-id='type-id-1343'/>
>>    +-      <return type-id='type-id-1538'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1503'>
>>    +-      <parameter type-id='type-id-279'/>
>>    +-      <return type-id='type-id-1538'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1504'>
>>    +-      <parameter type-id='type-id-279'/>
>>    +-      <parameter type-id='type-id-1356'/>
>>    +-      <parameter type-id='type-id-1346'/>
>>    +-      <return type-id='type-id-1538'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1514'>
>>    +-      <parameter type-id='type-id-274'/>
>>    +-      <return type-id='type-id-1538'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1515'>
>>    +-      <parameter type-id='type-id-274'/>
>>    +-      <parameter type-id='type-id-165'/>
>>    +-      <return type-id='type-id-1538'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1528'>
>>    +-      <parameter type-id='type-id-577'/>
>>    +-      <parameter type-id='type-id-127'/>
>>    +-      <return type-id='type-id-1538'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1530'>
>>    +-      <parameter type-id='type-id-1418'/>
>>    +-      <return type-id='type-id-1538'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1534'>
>>    +-      <parameter type-id='type-id-127'/>
>>    +-      <return type-id='type-id-1538'/>
>>    +-    </function-type>
>>    +-    <function-type size-in-bits='64' id='type-id-1539'>
>>    +-      <return type-id='type-id-127'/>
>>    +-    </function-type>
>>    +     <function-type size-in-bits='64' id='type-id-1543'>
>>    +       <parameter type-id='type-id-279'/>
>>    +       <return type-id='type-id-127'/>
>>    +@@ -11477,48 +11466,19 @@
>>    +       <parameter type-id='type-id-1412'/>
>>    +       <return type-id='type-id-127'/>
>>    +     </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1547'>
>>    ++      <parameter type-id='type-id-127'/>
>>    ++      <return type-id='type-id-127'/>
>>    ++    </function-type>
>>    ++    <type-decl name='void' id='type-id-1538'/>
>>    ++    <function-type size-in-bits='64' id='type-id-1220'>
>>    ++      <return type-id='type-id-53'/>
>>    ++    </function-type>
>>    ++    <function-type size-in-bits='64' id='type-id-1073'>
>>    ++      <return type-id='type-id-1538'/>
>>    ++    </function-type>
>>    +   </abi-instr>
>>    +   <abi-instr address-size='64' path='drivers/mmc/host/sdhci.mod.c' comp-dir-path='/ws/android/kernel/aosp/common-mainline/out/android-mainline/common' language='LANG_C89'>
>>    +-    <class-decl name='anon_vma' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1555'/>
>>    +-    <class-decl name='audit_context' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1556'/>
>>    +-    <class-decl name='backing_dev_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1557'/>
>>    +-    <class-decl name='bio_list' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1558'/>
>>    +-    <class-decl name='blk_plug' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1559'/>
>>    +-    <class-decl name='capture_control' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1560'/>
>>    +-    <class-decl name='cfs_rq' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1561'/>
>>    +-    <class-decl name='files_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1562'/>
>>    +-    <class-decl name='fs_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1563'/>
>>    +-    <class-decl name='ftrace_ret_stack' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1564'/>
>>    +-    <class-decl name='kernfs_iattrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1565'/>
>>    +-    <class-decl name='kernfs_open_node' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1566'/>
>>    +-    <class-decl name='kioctx_table' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1567'/>
>>    +-    <class-decl name='kmem_cache' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1568'/>
>>    +-    <class-decl name='linux_binfmt' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1569'/>
>>    +-    <class-decl name='mem_cgroup' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1570'/>
>>    +-    <class-decl name='module_notes_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1571'/>
>>    +-    <class-decl name='module_param_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1572'/>
>>    +-    <class-decl name='module_sect_attrs' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1573'/>
>>    +-    <class-decl name='nameidata' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1574'/>
>>    +-    <class-decl name='perf_event' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1575'/>
>>    +-    <class-decl name='pipe_inode_info' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1576'/>
>>    +-    <class-decl name='poll_table_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1577'/>
>>    +-    <class-decl name='pollfd' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1578'/>
>>    +-    <class-decl name='rcu_node' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1579'/>
>>    +-    <class-decl name='reclaim_state' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1580'/>
>>    +-    <class-decl name='request_queue' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1581'/>
>>    +-    <class-decl name='rt_mutex_waiter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1582'/>
>>    +-    <class-decl name='rt_rq' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1583'/>
>>    +-    <class-decl name='sched_class' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1584'/>
>>    +-    <class-decl name='seccomp_filter' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1585'/>
>>    +-    <class-decl name='seq_file' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1586'/>
>>    +-    <class-decl name='sock' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1587'/>
>>    +-    <class-decl name='task_group' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1588'/>
>>    +-    <class-decl name='trace_eval_map' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1589'/>
>>    +-    <class-decl name='trace_event_call' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1590'/>
>>    +-    <class-decl name='uprobe' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1591'/>
>>    +-    <class-decl name='user_namespace' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1592'/>
>>    +-    <class-decl name='workqueue_struct' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1593'/>
>>    +-    <class-decl name='xol_area' is-struct='yes' visibility='default' is-declaration-only='yes' id='type-id-1594'/>
>>    +     <var-decl name='__this_module' type-id='type-id-789' mangled-name='__this_module' visibility='default' filepath='/ws/android/kernel/aosp/common-mainline/out/android-mainline/common/drivers/mmc/host/sdhci.mod.c' line='11' column='1' elf-symbol-id='__this_module'/>
>>    +   </abi-instr>
>>    + </abi-corpus>
>>    +ABIs differ:
>>    +[...]/source-libabigail/tests/data/test-read-dwarf/PR25007-sdhci.ko.abi
>>    +and:
>>    +[...]/build-libabigail/tests/output/test-read-dwarf/PR25007-sdhci.ko.abi
>>    +
>>    +FAIL runtestreaddwarf (exit status: 1)
>> 
>> Only that one test case.
>> 
>> The reordered 'function-type's -- but I've not yet verified whether
>> they're really just reordered -- may hint towards a sorting stability
>> issue, but there are also the disappearing 'class-decl's.
>> 
>> Unless somebody points out any misunderstanding on my side, I suppose I
>> shall try to figure out what's going wrong.
>> 
>> 
>> Grüße
>> Thomas
>> -----------------
>> Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht München, HRB 106955
> 
> -- 
>        Dodji
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2022-06-22 13:54 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-28 22:39 'src/abg-dwarf-reader.cc:compare_dies_string_attribute_value' optimization Thomas Schwinge
2022-01-31 14:38 ` Thomas Schwinge
2022-01-31 15:56   ` Giuliano Procida
2022-04-11 15:18     ` Dodji Seketeli
2022-04-12 15:20       ` Giuliano Procida
2022-04-12 16:16         ` Dodji Seketeli
2022-04-13  2:19           ` Ben Woodard
2022-04-13 18:00             ` Ben Woodard
2022-04-14  9:14             ` Dodji Seketeli
2022-04-18 16:42               ` Ben Woodard
2022-06-20 16:12 ` Dodji Seketeli
2022-06-22  8:09   ` Ben Woodard

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).