diff options
author | Tamar Christina <tamar@zhox.com> | 2016-06-03 21:42:16 +0200 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2016-06-03 21:42:32 +0200 |
commit | 37473722960a1066c3b45c94377ba08769b1375b (patch) | |
tree | cdaebe9089fc39d1077c765cfe152f4176f2afb4 /rts/LinkerInternals.h | |
parent | 1dadd9a91454bb098e9c47d6c034b07e2e1e2529 (diff) | |
download | haskell-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.h | 23 |
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) \ |