[PATCH 1/2] Speedup part #1

Eric Botcazou ebotcazou@adacore.com
Tue Mar 13 17:57:00 GMT 2018


The first patch deals with the auto-import feature.  There are 2 versions of 
this feature: the original one, which was piggybacked on the OS loader with an 
optional help from the runtime (--enable-auto-import --enable-runtime-pseudo-
reloc-v1) and is still the one mostly documented in the sources and manual; 
the enhanced one by Kai Tietz, which is entirely piggybacked on the runtime 
(--enable-auto-import --enable-runtime-pseudo-reloc-v2) and is the default for 
Mingw and Cygwin nowadays.

The implementation is quite inefficient because of pe[p]_find_data_imports: 
for every undefined symbol, the function walks the entire set of relocations 
for all the input files and does a direct name comparison for each of them.

This is easily fixable by using a hash-based map for v1 and a simple hash 
table for v2.  The attached patch leaves v1 alone and thus only changes v2.
It also factors out pe[p]_find_data_imports into a common function, removes 
old cruft left and right, and attempts to better separate the implementations 
of v1 and v2 in the code.


2018-03-13  Eric Botcazou  <ebotcazou@adacore.com>

ld/
        * emultempl/pe.em (U_SIZE): Delete.
        (pe_data_import_dll): Likewise.
        (make_import_fixup): Return void, take 4th parameter and pass it down
        in call to pe_create_import_fixup.
        (pe_find_data_imports): Move to...
        (gld_${EMULATION_NAME}_after_open): Run the stdcall fixup pass after
        the auto-import pass and add a guard before running the latter.
        * emultempl/pep.em (U_SIZE): Delete.
        (pep_data_import_dll): Likewise.
        (make_import_fixup): Return void, take 4th parameter and pass it down
        in call to pe_create_import_fixup.
        (pep_find_data_imports): Move to...
        (gld_${EMULATION_NAME}_after_open): Run the stdcall fixup pass after
        the auto-import pass and add a guard before running the latter.
        * pe-dll.c (runtime_pseudp_reloc_v2_init): Change type to bfd_boolean.
        (pe_walk_relocs_of_symbol): Rename into...
        (pe_walk_relocs): ...this.  Add 2 more parameters,4th parameter to the
        callback prototype and pass 4th parameter in calls to the callback.
        If the import hash table is present, invoke the callback on the reloc
        if the symbol name is in the table.
        (pe_find_data_imports): ...here.  Take 2 parameters.  Build an import
        hash table for the pseudo-relocation support version 2.  When it is
        built, walk the relocations only once at the end; when it is not, do
        not build a fixup when the symbol isn't part of an import table.
        Issue the associated warning only after a first fixup is built.
        (tmp_seq2): Delete.
        (make_singleton_name_imp): Likewise.
        (make_import_fixup_mark): Return const char * and a stable string.
        (make_import_fixup_entry): Do not deal with the pseudo-relocation
        support version 2.
        (make_runtime_pseudo_reloc): Factor out code and fix formatting.
        (pe_create_import_fixup): Add 5th parameter.  Clearly separate the
        pseudo-relocation support version 2 from the rest.  Fix formatting.
        * pe-dll.h (pe_walk_relocs_of_symbol): Delete.
        (pe_find_data_imports): Declare.
        (pe_create_import_fixup): Add 5th parameter.
        * pep-dll.c (pe_data_import_dll): Delete.
        (pe_find_data_imports): Define.
        (pe_walk_relocs_of_symbol): Delete.
        * pep-dll.h (pep_walk_relocs_of_symbol): Delete.
        (pep_find_data_imports): Declare.
        (pep_create_import_fixup): Add 5th parameter.
        * ld.texinfo (--enable-auto-import): Adjust to new implementation.


---
 ld/emultempl/pe.em  | 143 ++--------------------
 ld/emultempl/pep.em | 121 ++-----------------
 ld/ld.texinfo       |  19 +--
 ld/pe-dll.c         | 339 ++++++++++++++++++++++++++++++++-------------------
 ld/pe-dll.h         |   6 +-
 ld/pep-dll.c        |   5 +-
 ld/pep-dll.h        |   7 +-
 7 files changed, 252 insertions(+), 388 deletions(-)

-- 
Eric Botcazou
-------------- next part --------------
A non-text attachment was scrubbed...
Name: p1.diff
Type: text/x-patch
Size: 31632 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20180313/a4790dd1/attachment.bin>


More information about the Binutils mailing list