/* Hash table mapping symbol names to StgStablePtr */
static /*Str*/HashTable *stablehash;
+#if defined(DEBUGGER)
+/* Hash table mapping info table ptrs to DataCon names */
+static HashTable *dchash;
+#endif
+
/* List of currently loaded objects */
ObjectCode *objects = NULL; /* initially empty */
SymX(hs_free_stable_ptr) \
SymX(hs_free_fun_ptr) \
SymX(initLinker) \
+ SymX(infoPtrzh_fast) \
+ SymX(closurePayloadzh_fast) \
SymX(int2Integerzh_fast) \
SymX(integer2Intzh_fast) \
SymX(integer2Wordzh_fast) \
SymX(insertStableSymbol) \
SymX(insertSymbol) \
SymX(lookupSymbol) \
+ SymX(lookupDataCon) \
SymX(makeStablePtrzh_fast) \
SymX(minusIntegerzh_fast) \
SymX(mkApUpd0zh_fast) \
-
/* -----------------------------------------------------------------------------
* Insert symbols into hash tables, checking for duplicates.
*/
+int isSuffixOf(char* x, char* suffix);
+
static void ghciInsertStrHashTable ( char* obj_name,
HashTable *table,
char* key,
if (lookupHashTable(table, (StgWord)key) == NULL)
{
insertStrHashTable(table, (StgWord)key, data);
+#if defined(DEBUGGER)
+ // Insert the reverse pair in the datacon hash if it is a closure
+ {
+ if(isSuffixOf(key, "static_info") || isSuffixOf(key, "con_info")) {
+ insertHashTable(dchash, (StgWord)data, key);
+ // debugBelch("DChash addSymbol: %s (%p)\n", key, data);
+ }
+ }
+#endif
return;
}
debugBelch(
);
exit(1);
}
-
-
/* -----------------------------------------------------------------------------
* initialize the object linker
*/
stablehash = allocStrHashTable();
symhash = allocStrHashTable();
+#if defined(DEBUGGER)
+ dchash = allocHashTable();
+#endif
/* populate the symbol table with stuff from the RTS */
for (sym = rtsSyms; sym->lbl != NULL; sym++) {
}
}
+#if defined(DEBUGGER)
+char *
+lookupDataCon( StgWord addr )
+{
+ void *val;
+ initLinker() ;
+ ASSERT(dchash != NULL);
+ val = lookupHashTable(dchash, addr);
+
+ return val;
+}
+#else
+char* lookupDataCon( StgWord addr )
+{
+ return NULL;
+}
+#endif
+
static
__attribute((unused))
void *
// reading the file, and then we misalign oc->image on purpose so
// that the actual sections end up aligned again.
oc->misalignment = machoGetMisalignment(f);
- oc->image = stgMallocBytes(oc->fileSize + misalignment, "loadObj(image)");
+ oc->image = stgMallocBytes(oc->fileSize + oc->misalignment, "loadObj(image)");
# else
oc->image = stgMallocBytes(oc->fileSize, "loadObj(image)");
# endif
}
#endif
+
+int isSuffixOf(char* x, char* suffix) {
+ int suffix_len = strlen (suffix);
+ int x_len = strlen (x);
+
+ if (x_len == 0)
+ return 0;
+ if (suffix_len > x_len)
+ return 0;
+ if (suffix_len == 0)
+ return 1;
+
+ char* x_suffix = &x[strlen(x)-strlen(suffix)];
+ return strcmp(x_suffix, suffix) == 0;
+ }