1. Apr 07, 2022
    • Nico Weber's avatar
      [dsymutil] Fix a few TODOs about reporting errors to the user · d0141ef2
      Nico Weber authored
      I saw the TODOs while reading this file and figured I'd do them.
      I haven't seen these happen in practice.
      
      No expected behavior change.
      
      Differential Revision: https://reviews.llvm.org/D123215
      d0141ef2
    • Nico Weber's avatar
      [dsymutil] Fix O(n^2) behavior when running on ld64.lld's current ICF output · c9bea517
      Nico Weber authored
      STABS information consists of a list of records in the linked binary
      that look like this:
      
        OSO: path/to/some.o
        SO: path/to/some.c
        FUN: sym1
        FUN: sym2
        ...
      
      The linked binary has one such set of records for every .o file linked
      into it.
      
      When dsymutil processes the binary's STABS information, it:
      
      1. Reads the .o file mentioned in the OSO line
      2. For each FUN entry after it in the main executable's STABS info:
        a) it looks up that symbol in the symbol of that .o file
        b) if it doesn't find it there, it goes through all symbols in the
           main binary at the same address and sees if any of those match
      
      With ICF, ld64.lld's STABS output claims that all identical functions
      that were folded are in the .o file of the one that's deemed the
      canonical one. Many small functions might be folded into a single
      function, so there are .o OSO entries that end up with many FUN lines,
      but almost none of them exist in the .o file's symbol table.
      
      Previously, dsymutil would do a full scan of all symbols in the main
      executable _for every of these entries_.
      
      This patch instead scans all aliases once and remembers them per name.
      This reduces the alias resolution complexity from
      O(number_of_aliases_in_o_file * number_of_symbols_in_main_executable) to
      O(number_of_aliases_in_o_file * log(number_of_aliases_in_o_file)).
      
      In practice, it reduces the time spent to run dsymutil on
      Chromium Framework from 26 min (after https://reviews.llvm.org/D89444)
      or 12 min (before https://reviews.llvm.org/D89444) to ~8m30s.
      
      We probably want to change how ld64.lld writes STABS entries when ICF
      is enabled, but making dsymutil not have pathological performance for
      this input seems like a good change as well.
      
      No expected behavior change (other than it's faster). I verified that
      for Chromium Framework, the generated .dSYM is identical with and
      without this patch.
      
      Differential Revision: https://reviews.llvm.org/D123218
      c9bea517
    • Paul Walker's avatar
      7d3af9ef
  2. Apr 06, 2022