]> sourceware.org Git - libabigail.git/commitdiff
[dwarf-reader] Better use of linkage name for fn decl de-duplication
authorDodji Seketeli <dodji@redhat.com>
Thu, 13 Jun 2019 15:56:10 +0000 (17:56 +0200)
committerDodji Seketeli <dodji@redhat.com>
Thu, 13 Jun 2019 16:28:12 +0000 (18:28 +0200)
When looking at a C program, during function decl DIE de-duplication
at we can rely on linkage names of function declarations to quickly
determine if two function decls are equal, in a given binary.

This patch uses that observation to speed up function decl DIE
de-duplication.  abidw --noout vmlinux goes from 8 to 5 minutes with
this.

* src/abg-dwarf-reader.cc (read_context::{die_is_in_c,
die_is_in_c_or_cplusplus}): Define new member functions.
(fn_die_equal_by_linkage_name): Define new static function.
(compare_dies): In the case for for DW_TAG_subprogram, use the new
fn_die_equal_by_linkage_name.
* tests/data/test-annotate/test15-pr18892.so.abi: Adjust.
* tests/data/test-annotate/test21-pr19092.so.abi: Adjust.
* tests/data/test-read-dwarf/test15-pr18892.so.abi: Adjust.
* tests/data/test-read-dwarf/test21-pr19092.so.abi: Adjust.

Signed-off-by: Dodji Seketeli <dodji@redhat.com>
src/abg-dwarf-reader.cc
tests/data/test-annotate/test15-pr18892.so.abi
tests/data/test-annotate/test21-pr19092.so.abi
tests/data/test-read-dwarf/test15-pr18892.so.abi
tests/data/test-read-dwarf/test21-pr19092.so.abi

index e6979a864f779459879a17a8caaa1b9eba78fcf3..6995397614c11cdea749c27edeb437c0b3615106 100644 (file)
@@ -4708,6 +4708,38 @@ public:
     return true;
   }
 
+  /// Test if a given DIE originates from a program written in the C
+  /// language.
+  ///
+  /// @param die the DIE to consider.
+  ///
+  /// @return true iff @p die originates from a program in the C
+  /// language.
+  bool
+  die_is_in_c(const Dwarf_Die *die) const
+  {
+    translation_unit::language l = translation_unit::LANG_UNKNOWN;
+    if (!get_die_language(die, l))
+      return false;
+    return is_c_language(l);
+  }
+
+  /// Test if a given DIE originates from a program written either in
+  /// C or C++.
+  ///
+  /// @param die the DIE to consider.
+  ///
+  /// @return true iff @p die originates from a program written either in
+  /// C or C++.
+  bool
+  die_is_in_c_or_cplusplus(const Dwarf_Die *die) const
+  {
+    translation_unit::language l = translation_unit::LANG_UNKNOWN;
+    if (!get_die_language(die, l))
+      return false;
+    return (is_cplus_plus_language(l) || is_c_language(l));
+  }
+
   /// Check if we can assume the One Definition Rule[1] to be relevant
   /// for the current translation unit.
   ///
@@ -12158,6 +12190,59 @@ compare_as_type_dies(const Dwarf_Die *l, const Dwarf_Die *r)
   return l_size == r_size;
 }
 
+/// Test if two DIEs representing function declarations have the same
+/// linkage name, and thus are considered equal if they are C or C++,
+/// because the two DIEs represent functions in the same binary.
+///
+/// If the DIEs don't have a linkage name, the function compares their
+/// name.  But in that case, the caller of the function must know that
+/// in C++ for instance, that doesn't imply that the two functions are
+/// equal.
+///
+/// @param ctxt the @ref read_context to consider.
+///
+/// @param l the first function DIE to consider.
+///
+/// @param r the second function DIE to consider.
+///
+/// @return true iff the function represented by @p l have the same
+/// linkage name as the function represented by @p r.
+static bool
+fn_die_equal_by_linkage_name(const read_context &ctxt,
+                            const Dwarf_Die *l,
+                            const Dwarf_Die *r)
+{
+  if (!!l != !!r)
+    return false;
+
+  if (!l)
+    return false;
+
+  int tag = dwarf_tag(const_cast<Dwarf_Die*>(l));
+  ABG_ASSERT(tag == DW_TAG_subprogram);
+  tag = dwarf_tag(const_cast<Dwarf_Die*>(r));
+  ABG_ASSERT(tag == DW_TAG_subprogram);
+
+  string lname = die_name(l), rname = die_name(r);
+  string llinkage_name = die_linkage_name(l),
+    rlinkage_name = die_linkage_name(r);
+
+  if (ctxt.die_is_in_c_or_cplusplus(l)
+      && ctxt.die_is_in_c_or_cplusplus(r))
+    {
+      if (!llinkage_name.empty() && !rlinkage_name.empty())
+       return llinkage_name == rlinkage_name;
+      else if (!!llinkage_name.empty() != !!rlinkage_name.empty())
+       return false;
+      else
+       return lname == rname;
+    }
+
+  return (!llinkage_name.empty()
+         && !rlinkage_name.empty()
+         && llinkage_name == rlinkage_name);
+}
+
 /// Compare two DIEs emitted by a C compiler.
 ///
 /// @param ctxt the read context used to load the DWARF information.
@@ -12468,56 +12553,66 @@ compare_dies(const read_context& ctxt,
              && from_the_same_tu)
            result = true;
        }
-       else
-         {
-           aggregates_being_compared.insert(ln);
-           aggregates_being_compared.insert(rn);
-
-           Dwarf_Die l_return_type, r_return_type;
-           bool l_return_type_is_void = !die_die_attribute(l, DW_AT_type,
-                                                           l_return_type);
-           bool r_return_type_is_void = !die_die_attribute(r, DW_AT_type,
-                                                           r_return_type);
-           if (l_return_type_is_void != r_return_type_is_void
-               || (!l_return_type_is_void
-                   && !compare_dies(ctxt,
-                                    &l_return_type, &r_return_type,
-                                    aggregates_being_compared,
-                                    update_canonical_dies_on_the_fly)))
+      else
+       {
+         if (!fn_die_equal_by_linkage_name(ctxt, l, r))
+           {
              result = false;
-           else
-             {
-               Dwarf_Die l_child, r_child;
-               bool found_l_child, found_r_child;
-               for (found_l_child = dwarf_child(const_cast<Dwarf_Die*>(l),
-                                                &l_child) == 0,
-                      found_r_child = dwarf_child(const_cast<Dwarf_Die*>(r),
-                                                  &r_child) == 0;
-                    found_l_child && found_r_child;
-                    found_l_child = dwarf_siblingof(&l_child,
-                                                    &l_child) == 0,
-                      found_r_child = dwarf_siblingof(&r_child,
-                                                      &r_child)==0)
-                 {
-                   int l_child_tag = dwarf_tag(&l_child);
-                   int r_child_tag = dwarf_tag(&r_child);
-                   if (l_child_tag != r_child_tag
-                       || (l_child_tag == DW_TAG_formal_parameter
-                           && !compare_dies(ctxt, &l_child, &r_child,
-                                            aggregates_being_compared,
-                                            update_canonical_dies_on_the_fly)))
-                     {
-                       result = false;
-                       break;
-                     }
-                 }
-               if (found_l_child != found_r_child)
-                 result = false;
-             }
+             break;
+           }
 
-           aggregates_being_compared.erase(ln);
-           aggregates_being_compared.erase(rn);
-         }
+         if (!ctxt.die_is_in_c(l) && !ctxt.die_is_in_c(r))
+           {
+             // In C, we cannot have two different functions with the
+             // same linkage name in a given binary.  But here we are
+             // looking at DIEs that don't originate from C.  So we
+             // need to compare return types and parameter types.
+             Dwarf_Die l_return_type, r_return_type;
+             bool l_return_type_is_void = !die_die_attribute(l, DW_AT_type,
+                                                             l_return_type);
+             bool r_return_type_is_void = !die_die_attribute(r, DW_AT_type,
+                                                             r_return_type);
+             if (l_return_type_is_void != r_return_type_is_void
+                 || (!l_return_type_is_void
+                     && !compare_dies(ctxt,
+                                      &l_return_type, &r_return_type,
+                                      aggregates_being_compared,
+                                      update_canonical_dies_on_the_fly)))
+               result = false;
+             else
+               {
+                 Dwarf_Die l_child, r_child;
+                 bool found_l_child, found_r_child;
+                 for (found_l_child = dwarf_child(const_cast<Dwarf_Die*>(l),
+                                                  &l_child) == 0,
+                        found_r_child = dwarf_child(const_cast<Dwarf_Die*>(r),
+                                                    &r_child) == 0;
+                      found_l_child && found_r_child;
+                      found_l_child = dwarf_siblingof(&l_child,
+                                                      &l_child) == 0,
+                        found_r_child = dwarf_siblingof(&r_child,
+                                                        &r_child)==0)
+                   {
+                     int l_child_tag = dwarf_tag(&l_child);
+                     int r_child_tag = dwarf_tag(&r_child);
+                     if (l_child_tag != r_child_tag
+                         || (l_child_tag == DW_TAG_formal_parameter
+                             && !compare_dies(ctxt, &l_child, &r_child,
+                                              aggregates_being_compared,
+                                              update_canonical_dies_on_the_fly)))
+                       {
+                         result = false;
+                         break;
+                       }
+                   }
+                 if (found_l_child != found_r_child)
+                   result = false;
+               }
+           }
+
+         aggregates_being_compared.erase(ln);
+         aggregates_being_compared.erase(rn);
+       }
       }
       break;
 
index ba5d05158fd16f355da6b86ad857465eebb0453a..608855a731ddbeba5360afcb0682d805c1bb22e6 100644 (file)
     <!-- backtrace_vector* -->
     <pointer-type-def type-id='type-id-1727' size-in-bits='64' id='type-id-1728'/>
     <!-- void* __asan_backtrace_vector_grow(backtrace_state*, size_t, backtrace_error_callback, void*, backtrace_vector*) -->
-    <function-decl name='__asan_backtrace_vector_grow' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='235' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_vector_grow' mangled-name='__asan_backtrace_vector_grow' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='235' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_vector_grow'>
       <!-- parameter of type 'backtrace_state*' -->
       <parameter type-id='type-id-1718'/>
       <!-- parameter of type 'typedef size_t' -->
       <return type-id='type-id-13'/>
     </function-decl>
     <!-- void __asan_backtrace_free(backtrace_state*, void*, size_t, backtrace_error_callback, void*) -->
-    <function-decl name='__asan_backtrace_free' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='212' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_free' mangled-name='__asan_backtrace_free' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='212' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_free'>
       <!-- parameter of type 'backtrace_state*' -->
       <parameter type-id='type-id-1718'/>
       <!-- parameter of type 'void*' -->
       <return type-id='type-id-13'/>
     </function-decl>
     <!-- void* __asan_backtrace_alloc(backtrace_state*, size_t, backtrace_error_callback, void*) -->
-    <function-decl name='__asan_backtrace_alloc' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='206' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_alloc' mangled-name='__asan_backtrace_alloc' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='206' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_alloc'>
       <!-- parameter of type 'backtrace_state*' -->
       <parameter type-id='type-id-1718'/>
       <!-- parameter of type 'typedef size_t' -->
       <return type-id='type-id-3'/>
     </function-decl>
     <!-- void __asan_backtrace_qsort(void*, size_t, size_t, int (void*, void*)*) -->
-    <function-decl name='__asan_backtrace_qsort' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='201' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_qsort' mangled-name='__asan_backtrace_qsort' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='201' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_qsort'>
       <!-- parameter of type 'void*' -->
       <parameter type-id='type-id-3'/>
       <!-- parameter of type 'typedef size_t' -->
       <return type-id='type-id-6'/>
     </function-decl>
     <!-- int __asan_backtrace_vector_release(backtrace_state*, backtrace_vector*, backtrace_error_callback, void*) -->
-    <function-decl name='__asan_backtrace_vector_release' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='253' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_vector_release' mangled-name='__asan_backtrace_vector_release' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='253' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_vector_release'>
       <!-- parameter of type 'backtrace_state*' -->
       <parameter type-id='type-id-1718'/>
       <!-- parameter of type 'backtrace_vector*' -->
   </abi-instr>
   <abi-instr version='1.0' address-size='64' path='../../.././libsanitizer/libbacktrace/../../libbacktrace/fileline.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-ImG4Cf/gcc-4.9.2/x86_64-unknown-linux-gnu/libsanitizer/libbacktrace' language='LANG_C89'>
     <!-- int __asan_backtrace_open(const char*, backtrace_error_callback, void*, int*) -->
-    <function-decl name='__asan_backtrace_open' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_open' mangled-name='__asan_backtrace_open' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_open'>
       <!-- parameter of type 'const char*' -->
       <parameter type-id='type-id-32'/>
       <!-- parameter of type 'typedef backtrace_error_callback' -->
       <return type-id='type-id-13'/>
     </function-decl>
     <!-- int __asan_backtrace_initialize(backtrace_state*, int, backtrace_error_callback, void*, fileline*) -->
-    <function-decl name='__asan_backtrace_initialize' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='268' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_initialize' mangled-name='__asan_backtrace_initialize' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='268' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_initialize'>
       <!-- parameter of type 'backtrace_state*' -->
       <parameter type-id='type-id-1718'/>
       <!-- parameter of type 'int' -->
       <return type-id='type-id-13'/>
     </function-decl>
   </abi-instr>
-  <abi-instr version='1.0' address-size='64' path='../../.././libsanitizer/libbacktrace/../../libbacktrace/sort.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-ImG4Cf/gcc-4.9.2/x86_64-unknown-linux-gnu/libsanitizer/libbacktrace' language='LANG_C89'>
-  </abi-instr>
   <abi-instr version='1.0' address-size='64' path='../../.././libsanitizer/libbacktrace/../../libbacktrace/state.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-ImG4Cf/gcc-4.9.2/x86_64-unknown-linux-gnu/libsanitizer/libbacktrace' language='LANG_C89'>
   </abi-instr>
   <abi-instr version='1.0' address-size='64' path='../../.././libsanitizer/libbacktrace/../../libiberty/cp-demangle.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-ImG4Cf/gcc-4.9.2/x86_64-unknown-linux-gnu/libsanitizer/libbacktrace' language='LANG_C89'>
index da1904bccbbeb39c127435daee9ac43f714c4e21..dfd1c861ca008596501cbc83b4e8935f7f5c60ad 100644 (file)
       <return type-id='type-id-3'/>
     </function-decl>
     <!-- char* cplus_demangle_v3(const char*, int) -->
-    <function-decl name='cplus_demangle_v3' filepath='../.././libiberty/../include/demangle.h' line='160' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='cplus_demangle_v3' mangled-name='cplus_demangle_v3' filepath='../.././libiberty/../include/demangle.h' line='160' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cplus_demangle_v3'>
       <!-- parameter of type 'const char*' -->
       <parameter type-id='type-id-8'/>
       <!-- parameter of type 'int' -->
       <return type-id='type-id-9'/>
     </function-decl>
     <!-- char* java_demangle_v3(const char*) -->
-    <function-decl name='java_demangle_v3' filepath='../.././libiberty/../include/demangle.h' line='167' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='java_demangle_v3' mangled-name='java_demangle_v3' filepath='../.././libiberty/../include/demangle.h' line='167' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='java_demangle_v3'>
       <!-- parameter of type 'const char*' -->
       <parameter type-id='type-id-8'/>
       <!-- char* -->
       <!-- char* -->
       <return type-id='type-id-9'/>
     </function-decl>
+    <!-- char* __builtin_strcpy(char*, const char*) -->
+    <function-decl name='__builtin_strcpy' mangled-name='strcpy' visibility='default' binding='global' size-in-bits='64'>
+      <!-- parameter of type 'char*' -->
+      <parameter type-id='type-id-9'/>
+      <!-- parameter of type 'const char*' -->
+      <parameter type-id='type-id-8'/>
+      <!-- char* -->
+      <return type-id='type-id-9'/>
+    </function-decl>
     <!-- unsigned long int __builtin_strlen(const char*) -->
     <function-decl name='__builtin_strlen' mangled-name='strlen' visibility='default' binding='global' size-in-bits='64'>
       <!-- parameter of type 'const char*' -->
       <return type-id='type-id-21'/>
     </function-decl>
     <!-- void xexit(int) -->
-    <function-decl name='xexit' filepath='../.././libiberty/../include/libiberty.h' line='288' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='xexit' mangled-name='xexit' filepath='../.././libiberty/../include/libiberty.h' line='288' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xexit'>
       <!-- parameter of type 'int' -->
       <parameter type-id='type-id-3'/>
       <!-- void -->
   </abi-instr>
   <abi-instr version='1.0' address-size='64' path='../.././libiberty/xmemdup.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/host-x86_64-unknown-linux-gnu/libiberty' language='LANG_C89'>
   </abi-instr>
-  <abi-instr version='1.0' address-size='64' path='../.././libiberty/xstrdup.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/host-x86_64-unknown-linux-gnu/libiberty' language='LANG_C89'>
-  </abi-instr>
-  <abi-instr version='1.0' address-size='64' path='../.././libiberty/xstrerror.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/host-x86_64-unknown-linux-gnu/libiberty' language='LANG_C89'>
-  </abi-instr>
 </abi-corpus>
index 265e97c55adb12f85bb94cdcaa9dbf6393ccf0bb..3a24d2212fa93ecc9de30fc629f342d841d2d06a 100644 (file)
       </data-member>
     </class-decl>
     <pointer-type-def type-id='type-id-1727' size-in-bits='64' id='type-id-1728'/>
-    <function-decl name='__asan_backtrace_vector_grow' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='235' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_vector_grow' mangled-name='__asan_backtrace_vector_grow' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='235' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_vector_grow'>
       <parameter type-id='type-id-1718'/>
       <parameter type-id='type-id-1541'/>
       <parameter type-id='type-id-1706'/>
       <parameter is-variadic='yes'/>
       <return type-id='type-id-13'/>
     </function-decl>
-    <function-decl name='__asan_backtrace_free' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='212' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_free' mangled-name='__asan_backtrace_free' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='212' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_free'>
       <parameter type-id='type-id-1718'/>
       <parameter type-id='type-id-3'/>
       <parameter type-id='type-id-1541'/>
       <parameter type-id='type-id-32'/>
       <return type-id='type-id-13'/>
     </function-decl>
-    <function-decl name='__asan_backtrace_alloc' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='206' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_alloc' mangled-name='__asan_backtrace_alloc' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='206' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_alloc'>
       <parameter type-id='type-id-1718'/>
       <parameter type-id='type-id-1541'/>
       <parameter type-id='type-id-1706'/>
       <parameter type-id='type-id-3'/>
       <return type-id='type-id-3'/>
     </function-decl>
-    <function-decl name='__asan_backtrace_qsort' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='201' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_qsort' mangled-name='__asan_backtrace_qsort' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='201' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_qsort'>
       <parameter type-id='type-id-3'/>
       <parameter type-id='type-id-1541'/>
       <parameter type-id='type-id-1541'/>
       <parameter type-id='type-id-1091'/>
       <return type-id='type-id-6'/>
     </function-decl>
-    <function-decl name='__asan_backtrace_vector_release' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='253' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_vector_release' mangled-name='__asan_backtrace_vector_release' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='253' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_vector_release'>
       <parameter type-id='type-id-1718'/>
       <parameter type-id='type-id-1728'/>
       <parameter type-id='type-id-1706'/>
     </function-type>
   </abi-instr>
   <abi-instr version='1.0' address-size='64' path='../../.././libsanitizer/libbacktrace/../../libbacktrace/fileline.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-ImG4Cf/gcc-4.9.2/x86_64-unknown-linux-gnu/libsanitizer/libbacktrace' language='LANG_C89'>
-    <function-decl name='__asan_backtrace_open' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_open' mangled-name='__asan_backtrace_open' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='159' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_open'>
       <parameter type-id='type-id-32'/>
       <parameter type-id='type-id-1706'/>
       <parameter type-id='type-id-3'/>
       <parameter type-id='type-id-471'/>
       <return type-id='type-id-13'/>
     </function-decl>
-    <function-decl name='__asan_backtrace_initialize' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='268' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='__asan_backtrace_initialize' mangled-name='__asan_backtrace_initialize' filepath='../../.././libsanitizer/libbacktrace/../../libbacktrace/internal.h' line='268' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_backtrace_initialize'>
       <parameter type-id='type-id-1718'/>
       <parameter type-id='type-id-13'/>
       <parameter type-id='type-id-1706'/>
       <return type-id='type-id-13'/>
     </function-decl>
   </abi-instr>
-  <abi-instr version='1.0' address-size='64' path='../../.././libsanitizer/libbacktrace/../../libbacktrace/sort.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-ImG4Cf/gcc-4.9.2/x86_64-unknown-linux-gnu/libsanitizer/libbacktrace' language='LANG_C89'>
-  </abi-instr>
   <abi-instr version='1.0' address-size='64' path='../../.././libsanitizer/libbacktrace/../../libbacktrace/state.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-ImG4Cf/gcc-4.9.2/x86_64-unknown-linux-gnu/libsanitizer/libbacktrace' language='LANG_C89'>
   </abi-instr>
   <abi-instr version='1.0' address-size='64' path='../../.././libsanitizer/libbacktrace/../../libiberty/cp-demangle.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-ImG4Cf/gcc-4.9.2/x86_64-unknown-linux-gnu/libsanitizer/libbacktrace' language='LANG_C89'>
index 8c7272331162ecd1189da6a87158fce8acc1257b..ecf9bea7bd7d7b9961ea43b9e3faea385bf0cbf4 100644 (file)
       <parameter type-id='type-id-8'/>
       <return type-id='type-id-3'/>
     </function-decl>
-    <function-decl name='cplus_demangle_v3' filepath='../.././libiberty/../include/demangle.h' line='160' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='cplus_demangle_v3' mangled-name='cplus_demangle_v3' filepath='../.././libiberty/../include/demangle.h' line='160' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='cplus_demangle_v3'>
       <parameter type-id='type-id-8'/>
       <parameter type-id='type-id-3'/>
       <return type-id='type-id-9'/>
     </function-decl>
-    <function-decl name='java_demangle_v3' filepath='../.././libiberty/../include/demangle.h' line='167' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='java_demangle_v3' mangled-name='java_demangle_v3' filepath='../.././libiberty/../include/demangle.h' line='167' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='java_demangle_v3'>
       <parameter type-id='type-id-8'/>
       <return type-id='type-id-9'/>
     </function-decl>
       <parameter type-id='type-id-8'/>
       <return type-id='type-id-9'/>
     </function-decl>
+    <function-decl name='__builtin_strcpy' mangled-name='strcpy' visibility='default' binding='global' size-in-bits='64'>
+      <parameter type-id='type-id-9'/>
+      <parameter type-id='type-id-8'/>
+      <return type-id='type-id-9'/>
+    </function-decl>
     <function-decl name='__builtin_strlen' mangled-name='strlen' visibility='default' binding='global' size-in-bits='64'>
       <parameter type-id='type-id-8'/>
       <return type-id='type-id-4'/>
       <parameter type-id='type-id-27'/>
       <return type-id='type-id-21'/>
     </function-decl>
-    <function-decl name='xexit' filepath='../.././libiberty/../include/libiberty.h' line='288' column='1' visibility='default' binding='global' size-in-bits='64'>
+    <function-decl name='xexit' mangled-name='xexit' filepath='../.././libiberty/../include/libiberty.h' line='288' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='xexit'>
       <parameter type-id='type-id-3'/>
       <return type-id='type-id-1'/>
     </function-decl>
   </abi-instr>
   <abi-instr version='1.0' address-size='64' path='../.././libiberty/xmemdup.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/host-x86_64-unknown-linux-gnu/libiberty' language='LANG_C89'>
   </abi-instr>
-  <abi-instr version='1.0' address-size='64' path='../.././libiberty/xstrdup.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/host-x86_64-unknown-linux-gnu/libiberty' language='LANG_C89'>
-  </abi-instr>
-  <abi-instr version='1.0' address-size='64' path='../.././libiberty/xstrerror.c' comp-dir-path='/tmp/legendre/spack-stage/spack-stage-wfh0ig/gcc-4.7.4/host-x86_64-unknown-linux-gnu/libiberty' language='LANG_C89'>
-  </abi-instr>
 </abi-corpus>
This page took 0.482536 seconds and 5 git commands to generate.