diff options
| author | Yip Coekjan <69834864+Coekjan@users.noreply.github.com> | 2024-09-06 20:35:32 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-06 14:35:32 +0200 |
| commit | 7dc59ac342d315dbb352becbeabc4e7057992de0 (patch) | |
| tree | a1b24c29de316422205a0f6a86f6268e3bee91dd /src/librarian | |
| parent | 16f156be3f9b2089af807f012a960034dddb00ac (diff) | |
| download | box64-7dc59ac342d315dbb352becbeabc4e7057992de0.tar.gz box64-7dc59ac342d315dbb352becbeabc4e7057992de0.zip | |
Eliminate duplicate hash calculations for `getSymbolInSymbolMaps` (#1801)
Diffstat (limited to 'src/librarian')
| -rw-r--r-- | src/librarian/library.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/src/librarian/library.c b/src/librarian/library.c index e21e648c..34bb0b79 100644 --- a/src/librarian/library.c +++ b/src/librarian/library.c @@ -836,9 +836,10 @@ static int getSymbolInDataMaps(library_t*lib, const char* name, int noweak, uint } static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, uintptr_t *addr, uintptr_t *size, int* weak) { + const khint_t hash = kh_hash(symbolmap, name); void* symbol; // check in mysymbolmap - khint_t k = kh_get(symbolmap, lib->w.mysymbolmap, name); + khint_t k = kh_get_with_hash(symbolmap, lib->w.mysymbolmap, name, hash); if (k!=kh_end(lib->w.mysymbolmap)) { symbol1_t *s = &kh_value(lib->w.mysymbolmap, k); if(!s->resolved) { @@ -866,7 +867,7 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui return 1; } // check in stsymbolmap (return struct...) - k = kh_get(symbolmap, lib->w.stsymbolmap, name); + k = kh_get_with_hash(symbolmap, lib->w.stsymbolmap, name, hash); if (k!=kh_end(lib->w.stsymbolmap)) { symbol1_t *s = &kh_value(lib->w.stsymbolmap, k); if(!s->resolved) { @@ -894,7 +895,7 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui return 1; } // check in symbolmap - k = kh_get(symbolmap, lib->w.symbolmap, name); + k = kh_get_with_hash(symbolmap, lib->w.symbolmap, name, hash); if (k!=kh_end(lib->w.symbolmap)) { symbol1_t *s = &kh_value(lib->w.symbolmap, k); if(!s->resolved) { @@ -931,7 +932,7 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui } if(!noweak) { // check in wmysymbolmap - khint_t k = kh_get(symbolmap, lib->w.wmysymbolmap, name); + khint_t k = kh_get_with_hash(symbolmap, lib->w.wmysymbolmap, name, hash); if (k!=kh_end(lib->w.wmysymbolmap)) { symbol1_t *s = &kh_value(lib->w.wmysymbolmap, k); if(!s->resolved) { @@ -958,7 +959,7 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui *weak = 1; return 1; } - k = kh_get(symbolmap, lib->w.wsymbolmap, name); + k = kh_get_with_hash(symbolmap, lib->w.wsymbolmap, name, hash); if (k!=kh_end(lib->w.wsymbolmap)) { symbol1_t *s = &kh_value(lib->w.wsymbolmap, k); if(!s->resolved) { @@ -995,7 +996,9 @@ static int getSymbolInSymbolMaps(library_t*lib, const char* name, int noweak, ui } } // check in symbol2map - k = kh_get(symbol2map, lib->w.symbol2map, name); + // + // NOTE: symbol2map & symbolmap share the same hash function, so we can use the same hash + k = kh_get_with_hash(symbol2map, lib->w.symbol2map, name, hash); if (k!=kh_end(lib->w.symbol2map)) { symbol2_t *s = &kh_value(lib->w.symbol2map, k); if(!noweak || !s->weak) |