• Masahiro Yamada's avatar
    kbuild: implement CONFIG_TRIM_UNUSED_KSYMS without recursion · 5e9e95cc
    Masahiro Yamada authored
    When CONFIG_TRIM_UNUSED_KSYMS is enabled, Kbuild recursively traverses
    the directory tree to determine which EXPORT_SYMBOL to trim. If an
    EXPORT_SYMBOL turns out to be unused by anyone, Kbuild begins the
    second traverse, where some source files are recompiled with their
    EXPORT_SYMBOL() tuned into a no-op.
    
    Linus stated negative opinions about this slowness in commits:
    
     - 5cf0fd59 ("Kbuild: disable TRIM_UNUSED_KSYMS option")
     - a555bdd0 ("Kbuild: enable TRIM_UNUSED_KSYMS again, with some guarding")
    
    We can do this better now. The final data structures of EXPORT_SYMBOL
    are generated by the modpost stage, so modpost can selectively emit
    KSYMTAB entries that are really used by modules.
    
    Commit f73edc89 ("kbuild: unify two modpost invocations") is another
    ground-work to do this in a one-pass algorithm. With the list of modules,
    modpost sets sym->used if it is used by a module. modpost emits KSYMTAB
    only for symbols with sym->used==true.
    
    BTW, Nicolas explained why the trimming was implemented with recursion:
    
      https://lore.kernel.org/all/2o2rpn97-79nq-p7s2-nq5-8p83391473r@syhkavp.arg/
    
    Actually, we never achieved that level of optimization where the chain
    reaction of trimming comes into play because:
    
     - CONFIG_LTO_CLANG cannot remove any unused symbols
     - CONFIG_LD_DEAD_CODE_DATA_ELIMINATION is enabled only for vmlinux,
       but not modules
    
    If deeper trimming is required, we need to revisit this, but I guess
    that is unlikely to happen.
    Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
    5e9e95cc
fixdep.c 10.7 KB