summaryrefslogtreecommitdiff
path: root/rts
diff options
context:
space:
mode:
authorSimon Marlow <marlowsd@gmail.com>2008-08-04 11:18:01 +0000
committerSimon Marlow <marlowsd@gmail.com>2008-08-04 11:18:01 +0000
commit8a0ecec80d684468a4080f5852521b3ef0a60958 (patch)
treeedfbc92796a3f7091f1567b83ab81e9e722ee0ab /rts
parentc79f08fa35772ea6294bacecbe2bd14ee50c6a94 (diff)
downloadhaskell-8a0ecec80d684468a4080f5852521b3ef0a60958.tar.gz
UNDO: FIX #2375: remove oc->lochash completely, it apparently isn't used
Diffstat (limited to 'rts')
-rw-r--r--rts/Linker.c35
-rw-r--r--rts/LinkerInternals.h3
2 files changed, 38 insertions, 0 deletions
diff --git a/rts/Linker.c b/rts/Linker.c
index 6c1446ad4d..0d56912bf8 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 561a224a09..f081e62894 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;