summaryrefslogtreecommitdiff
path: root/rts/LinkerInternals.h
diff options
context:
space:
mode:
authorTamar Christina <tamar@zhox.com>2016-06-03 21:42:16 +0200
committerBen Gamari <ben@smart-cactus.org>2016-06-03 21:42:32 +0200
commit37473722960a1066c3b45c94377ba08769b1375b (patch)
treecdaebe9089fc39d1077c765cfe152f4176f2afb4 /rts/LinkerInternals.h
parent1dadd9a91454bb098e9c47d6c034b07e2e1e2529 (diff)
downloadhaskell-37473722960a1066c3b45c94377ba08769b1375b.tar.gz
Refactored SymbolInfo to lower memory usage in RTS
Previously as part of #11223 a new struct `SymbolInfo` was introduced to keep track it the weak symbol status of a symbol. This structure also kept a copy of the calculated address of the symbol which turns out was useful in ignoring non-weak zero-valued symbols. The information was kept in an array so it means for every symbol two extra bytes were kept even though the vast majority of symbols are non-weak and non-zero valued. This changes the array into a sparse map keeping this information only for the symbols that are weak or zero-valued. This allows for a reduction in the amount of information needed to be kept while giving up a small (negligable) hit in performance as this information now has to be looked up in hashmaps. Test Plan: ./validate on all platforms that use the runtime linker. For unix platforms please ensure `DYNAMIC_GHC_PROGRAMS=NO` is added to your validate file. Reviewers: simonmar, austin, erikd, bgamari Reviewed By: simonmar, bgamari Subscribers: thomie, #ghc_windows_task_force Differential Revision: https://phabricator.haskell.org/D2184 GHC Trac Issues: #11816
Diffstat (limited to 'rts/LinkerInternals.h')
-rw-r--r--rts/LinkerInternals.h23
1 files changed, 7 insertions, 16 deletions
diff --git a/rts/LinkerInternals.h b/rts/LinkerInternals.h
index b311a8f341..815180c757 100644
--- a/rts/LinkerInternals.h
+++ b/rts/LinkerInternals.h
@@ -10,6 +10,7 @@
#define LINKERINTERNALS_H
#include "Rts.h"
+#include "Hash.h"
/* See Linker.c Note [runtime-linker-phases] */
typedef enum {
@@ -99,20 +100,6 @@ typedef struct {
} SymbolExtra;
-/* Top-level structure for an symbols in object module. One of these is allocated
-* for each symbol in an object in use.
-*/
-typedef struct _SymbolInfo {
- /* The name of the symbol. */
- char* name;
-
- /* The address of the symbol. */
- void* addr;
-
- /* Indicates if the symbol is weak */
- HsBool isWeak;
-} SymbolInfo;
-
/* Top-level structure for an object module. One of these is allocated
* for each object file in use.
*/
@@ -131,8 +118,8 @@ typedef struct _ObjectCode {
this object into the global symbol hash table. This is so that
we know which parts of the latter mapping to nuke when this
object is removed from the system. */
- SymbolInfo* symbols;
- int n_symbols;
+ char** symbols;
+ int n_symbols;
/* ptr to mem containing the object file image */
char* image;
@@ -178,6 +165,10 @@ typedef struct _ObjectCode {
execute code from it. */
HsBool isImportLib;
+ /* Holds the list of symbols in the .o file which
+ require extra information.*/
+ HashTable *extraInfos;
+
} ObjectCode;
#define OC_INFORMATIVE_FILENAME(OC) \