Speedup DIE representation computing esp function signature in C
authorDodji Seketeli <dodji@redhat.com>
Thu, 18 May 2017 12:38:51 +0000 (14:38 +0200)
committerDodji Seketeli <dodji@redhat.com>
Mon, 3 Jul 2017 15:45:43 +0000 (17:45 +0200)
For DIE originating from C, we now compute canonical DIEs.  We then
use that to compare DIEs to see if they are equal or not.  So string
representation of DIEs are now used only to reduce the number of DIEs
comparisons that is performed during DIE canonicalization.

We can thus just use function names (rather than a full
die_function_signature) as a way to reduce the number of structural
comparisons of DIEs during canonicalization.

This patch does just that.

Note that in the future when we perform DIEs canonicalization and comparison for
C++, we can avoid computing full function DIE signatures for C++ too.

* src/abg-dwarf-reader.cc (die_function_signature): For C DIEs,
just return the (linkage) name of the function.
* 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 a872367619a867ef32edc0c702ad828afca6041a..0ed3dd8f80e38f5a928836a134cb6aec9fd422bd 100644 (file)
@@ -10429,6 +10429,38 @@ die_function_signature(const read_context& ctxt,
                       Dwarf_Die *fn_die,
                       size_t where_offset)
 {
+
+  translation_unit::language lang;
+  bool has_lang = false;
+  if ((has_lang = ctxt.get_die_language(fn_die, lang)))
+    {
+      // In a binary originating from the C language, it's OK to use
+      // the linkage name of the function as a key for the map which
+      // is meant to reduce the number of DIE comparisons involved
+      // during DIE canonicalization computation.
+      if (is_c_language(lang))
+       {
+         string fn_name = die_linkage_name(fn_die);
+         if (fn_name.empty())
+           fn_name = die_name(fn_die);
+         return fn_name;
+       }
+    }
+
+  // TODO: When we can structurally compare DIEs originating from C++
+  // as well, we can use the linkage name of functions in C++ too, to
+  // reduce the number of comparisons involved during DIE
+  // canonicalization.
+
+  string return_type_name;
+  Dwarf_Die ret_type_die;
+  if (die_die_attribute(fn_die, DW_AT_type, ret_type_die))
+    return_type_name = ctxt.get_die_qualified_type_name(&ret_type_die,
+                                                       where_offset);
+
+  if (return_type_name.empty())
+    return_type_name = "void";
+
   Dwarf_Die scope_die;
   string scope_name;
   if (get_scope_die(ctxt, fn_die, where_offset, scope_die))
@@ -10437,7 +10469,6 @@ die_function_signature(const read_context& ctxt,
   if (!scope_name.empty())
     fn_name  = scope_name + "::" + fn_name;
 
-  string return_type_name;
   string class_name;
   vector<string> parm_names;
   bool is_const = false;
index 90dd246cd64601b50a7a0bc478b64baeab2ab42a..b239c12371e5453ac6e257ab95a0e74a3ae0ed52 100644 (file)
       <return type-id='type-id-6'/>
     </function-decl>
     <!-- void* __asan_internal_memset(void*, int, size_t) -->
-    <function-decl name='__asan_internal_memset' mangled-name='__asan_internal_memset' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_memset'>
+    <function-decl name='__asan_internal_memset' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'>
       <!-- parameter of type 'void*' -->
       <parameter type-id='type-id-3'/>
       <!-- parameter of type 'int' -->
       <return type-id='type-id-3'/>
     </function-decl>
     <!-- size_t __asan_internal_strnlen(const char*, size_t) -->
-    <function-decl name='__asan_internal_strnlen' mangled-name='__asan_internal_strnlen' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_strnlen'>
+    <function-decl name='__asan_internal_strnlen' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'>
       <!-- parameter of type 'const char*' -->
       <parameter type-id='type-id-30'/>
       <!-- parameter of type 'typedef size_t' -->
       <return type-id='type-id-1512'/>
     </function-decl>
     <!-- int __asan_internal_strcmp(const char*, const char*) -->
-    <function-decl name='__asan_internal_strcmp' mangled-name='__asan_internal_strcmp' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_strcmp'>
+    <function-decl name='__asan_internal_strcmp' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64'>
       <!-- parameter of type 'const char*' -->
       <parameter type-id='type-id-30'/>
       <!-- parameter of type 'const char*' -->
       <return type-id='type-id-3'/>
     </function-decl>
     <!-- void* __asan_internal_memcpy(void*, void*, size_t) -->
-    <function-decl name='__asan_internal_memcpy' mangled-name='__asan_internal_memcpy' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_memcpy'>
+    <function-decl name='__asan_internal_memcpy' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'>
       <!-- parameter of type 'void*' -->
       <parameter type-id='type-id-3'/>
       <!-- parameter of type 'void*' -->
       <return type-id='type-id-3'/>
     </function-decl>
     <!-- size_t __asan_internal_strlen(const char*) -->
-    <function-decl name='__asan_internal_strlen' mangled-name='__asan_internal_strlen' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_strlen'>
+    <function-decl name='__asan_internal_strlen' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64'>
       <!-- parameter of type 'const char*' -->
       <parameter type-id='type-id-30'/>
       <!-- typedef size_t -->
       <return type-id='type-id-13'/>
     </function-decl>
     <!-- int __asan_internal_strncmp(const char*, const char*, size_t) -->
-    <function-decl name='__asan_internal_strncmp' mangled-name='__asan_internal_strncmp' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_strncmp'>
+    <function-decl name='__asan_internal_strncmp' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64'>
       <!-- parameter of type 'const char*' -->
       <parameter type-id='type-id-30'/>
       <!-- parameter of type 'const char*' -->
       <return type-id='type-id-13'/>
     </function-decl>
     <!-- int __asan_internal_memcmp(void*, void*, size_t) -->
-    <function-decl name='__asan_internal_memcmp' mangled-name='__asan_internal_memcmp' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_memcmp'>
+    <function-decl name='__asan_internal_memcmp' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'>
       <!-- parameter of type 'void*' -->
       <parameter type-id='type-id-3'/>
       <!-- parameter of type 'void*' -->
index 1607f307ca7212496ffb8fab97f21ffc704ceeb7..db097b457b8010a4d1ea072685f0de4c04e782cb 100644 (file)
       <return type-id='type-id-1'/>
     </function-decl>
     <!-- size_t htab_elements(htab_t) -->
-    <function-decl name='htab_elements' mangled-name='htab_elements' filepath='../.././libcpp/../include/hashtab.h' line='188' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='htab_elements'>
+    <function-decl name='htab_elements' filepath='../.././libcpp/../include/hashtab.h' line='188' column='1' visibility='default' binding='global' size-in-bits='64'>
       <!-- parameter of type 'typedef htab_t' -->
       <parameter type-id='type-id-183'/>
       <!-- typedef size_t -->
       <!-- 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*' -->
index 0715ad4314986517cbac88d4c62942a2775e4131..4b56e485e5af17e2c2adbb27dd8f1b705f761a7f 100644 (file)
       <parameter type-id='type-id-3'/>
       <return type-id='type-id-6'/>
     </function-decl>
-    <function-decl name='__asan_internal_memset' mangled-name='__asan_internal_memset' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_memset'>
+    <function-decl name='__asan_internal_memset' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='41' column='1' visibility='default' binding='global' size-in-bits='64'>
       <parameter type-id='type-id-3'/>
       <parameter type-id='type-id-13'/>
       <parameter type-id='type-id-1512'/>
       <parameter type-id='type-id-1695'/>
       <return type-id='type-id-3'/>
     </function-decl>
-    <function-decl name='__asan_internal_strnlen' mangled-name='__asan_internal_strnlen' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_strnlen'>
+    <function-decl name='__asan_internal_strnlen' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='46' column='1' visibility='default' binding='global' size-in-bits='64'>
       <parameter type-id='type-id-30'/>
       <parameter type-id='type-id-1512'/>
       <return type-id='type-id-1512'/>
     </function-decl>
-    <function-decl name='__asan_internal_strcmp' mangled-name='__asan_internal_strcmp' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_strcmp'>
+    <function-decl name='__asan_internal_strcmp' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='43' column='1' visibility='default' binding='global' size-in-bits='64'>
       <parameter type-id='type-id-30'/>
       <parameter type-id='type-id-30'/>
       <return type-id='type-id-13'/>
       <parameter type-id='type-id-1512'/>
       <return type-id='type-id-3'/>
     </function-decl>
-    <function-decl name='__asan_internal_memcpy' mangled-name='__asan_internal_memcpy' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_memcpy'>
+    <function-decl name='__asan_internal_memcpy' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='40' column='1' visibility='default' binding='global' size-in-bits='64'>
       <parameter type-id='type-id-3'/>
       <parameter type-id='type-id-3'/>
       <parameter type-id='type-id-1512'/>
       <return type-id='type-id-3'/>
     </function-decl>
-    <function-decl name='__asan_internal_strlen' mangled-name='__asan_internal_strlen' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_strlen'>
+    <function-decl name='__asan_internal_strlen' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='45' column='1' visibility='default' binding='global' size-in-bits='64'>
       <parameter type-id='type-id-30'/>
       <return type-id='type-id-1512'/>
     </function-decl>
       <parameter is-variadic='yes'/>
       <return type-id='type-id-13'/>
     </function-decl>
-    <function-decl name='__asan_internal_strncmp' mangled-name='__asan_internal_strncmp' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_strncmp'>
+    <function-decl name='__asan_internal_strncmp' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='44' column='1' visibility='default' binding='global' size-in-bits='64'>
       <parameter type-id='type-id-30'/>
       <parameter type-id='type-id-30'/>
       <parameter type-id='type-id-1512'/>
       <return type-id='type-id-13'/>
     </function-decl>
-    <function-decl name='__asan_internal_memcmp' mangled-name='__asan_internal_memcmp' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='__asan_internal_memcmp'>
+    <function-decl name='__asan_internal_memcmp' filepath='../../.././libsanitizer/libbacktrace/backtrace-rename.h' line='42' column='1' visibility='default' binding='global' size-in-bits='64'>
       <parameter type-id='type-id-3'/>
       <parameter type-id='type-id-3'/>
       <parameter type-id='type-id-1512'/>
index e3874ba7d0b4f6c2c6895c4b83ec625990b31b07..d9ae8d3dc111baa123bad3c58b61adb35ba04ee7 100644 (file)
       <parameter type-id='type-id-386'/>
       <return type-id='type-id-1'/>
     </function-decl>
-    <function-decl name='htab_elements' mangled-name='htab_elements' filepath='../.././libcpp/../include/hashtab.h' line='188' column='1' visibility='default' binding='global' size-in-bits='64' elf-symbol-id='htab_elements'>
+    <function-decl name='htab_elements' filepath='../.././libcpp/../include/hashtab.h' line='188' column='1' visibility='default' binding='global' size-in-bits='64'>
       <parameter type-id='type-id-183'/>
       <return type-id='type-id-5'/>
     </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'/>