From 8a0ecec80d684468a4080f5852521b3ef0a60958 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Mon, 4 Aug 2008 11:18:01 +0000 Subject: [PATCH] UNDO: FIX #2375: remove oc->lochash completely, it apparently isn't used --- rts/Linker.c | 35 +++++++++++++++++++++++++++++++++++ rts/LinkerInternals.h | 3 +++ 2 files changed, 38 insertions(+) diff --git a/rts/Linker.c b/rts/Linker.c index 6c1446a..0d56912 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -1178,6 +1178,23 @@ lookupSymbol( char *lbl ) } } +static +__attribute((unused)) +void * +lookupLocalSymbol( ObjectCode* oc, char *lbl ) +{ + void *val; + initLinker() ; + val = lookupStrHashTable(oc->lochash, lbl); + + if (val == NULL) { + return NULL; + } else { + return val; + } +} + + /* ----------------------------------------------------------------------------- * Debugging aid: look in GHCi's object symbol tables for symbols * within DELTA bytes of the specified address, and show their names. @@ -1199,7 +1216,11 @@ void ghci_enquire ( char* addr ) for (i = 0; i < oc->n_symbols; i++) { sym = oc->symbols[i]; if (sym == NULL) continue; + // debugBelch("enquire %p %p\n", sym, oc->lochash); a = NULL; + if (oc->lochash != NULL) { + a = lookupStrHashTable(oc->lochash, sym); + } if (a == NULL) { a = lookupStrHashTable(symhash, sym); } @@ -1284,6 +1305,7 @@ loadObj( char *path ) oc->fileSize = st.st_size; oc->symbols = NULL; oc->sections = NULL; + oc->lochash = allocStrHashTable(); oc->proddables = NULL; /* chain it onto the list of objects */ @@ -1492,6 +1514,9 @@ unloadObj( char *path ) stgFree(oc->fileName); stgFree(oc->symbols); stgFree(oc->sections); + /* The local hash table should have been freed at the end + of the ocResolve_ call on it. */ + ASSERT(oc->lochash == NULL); stgFree(oc); return 1; } @@ -3605,6 +3630,10 @@ ocResolve_ELF ( ObjectCode* oc ) } } + /* Free the local symbol table; we won't need it again. */ + freeHashTable(oc->lochash, NULL); + oc->lochash = NULL; + #if defined(powerpc_HOST_ARCH) ocFlushInstructionCache( oc ); #endif @@ -3883,6 +3912,8 @@ static int resolveImports( if((symbol->n_type & N_TYPE) == N_UNDF && (symbol->n_type & N_EXT) && (symbol->n_value != 0)) addr = (void*) (symbol->n_value); + else if((addr = lookupLocalSymbol(oc,nm)) != NULL) + ; else addr = lookupSymbol(nm); if(!addr) @@ -4529,6 +4560,10 @@ static int ocResolve_MachO(ObjectCode* oc) return 0; } + /* Free the local symbol table; we won't need it again. */ + freeHashTable(oc->lochash, NULL); + oc->lochash = NULL; + #if defined (powerpc_HOST_ARCH) ocFlushInstructionCache( oc ); #endif diff --git a/rts/LinkerInternals.h b/rts/LinkerInternals.h index 561a224..f081e62 100644 --- a/rts/LinkerInternals.h +++ b/rts/LinkerInternals.h @@ -85,6 +85,9 @@ typedef struct _ObjectCode { list. */ Section* sections; + /* A private hash table for local symbols. */ + HashTable* lochash; + /* Allow a chain of these things */ struct _ObjectCode * next; -- 1.7.10.4