X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FLinkerInternals.h;h=f1e2677851861488c7bfb3f3be069add9b303da2;hb=153b9cb9b11e05c4edb1b6bc0a7b972660e41f70;hp=d124979fb9e3e28b201b4ee874fd91ee5c9cbb09;hpb=6d35596c37601a9bf608e32034c390d516454c29;p=ghc-hetmet.git diff --git a/ghc/rts/LinkerInternals.h b/ghc/rts/LinkerInternals.h index d124979..f1e2677 100644 --- a/ghc/rts/LinkerInternals.h +++ b/ghc/rts/LinkerInternals.h @@ -1,5 +1,4 @@ /* ----------------------------------------------------------------------------- - * $Id: LinkerInternals.h,v 1.1 2001/02/11 17:51:07 simonmar Exp $ * * (c) The GHC Team, 2000 * @@ -7,52 +6,94 @@ * * ---------------------------------------------------------------------------*/ -/* A bucket in the symbol hash-table. Primarily, maps symbol names to - * absolute addresses. All symbols from a given module are linked - * together, so they can be freed at the same time. There's also a - * bucket link field for the hash table. - */ -typedef struct _SymbolVal { - char *lbl; - void *addr; -} SymbolVal; - typedef enum { OBJECT_LOADED, OBJECT_RESOLVED } OStatus; /* Indication of section kinds for loaded objects. Needed by the GC for deciding whether or not a pointer on the stack is a code pointer. */ -typedef enum { SECTIONKIND_CODE_OR_RODATA, - SECTIONKIND_RWDATA, - SECTIONKIND_OTHER, - SECTIONKIND_NOINFOAVAIL } +typedef + enum { SECTIONKIND_CODE_OR_RODATA, + SECTIONKIND_RWDATA, + SECTIONKIND_OTHER, + SECTIONKIND_NOINFOAVAIL } SectionKind; -typedef struct { void* start; void* end; SectionKind kind; } +typedef + struct _Section { + void* start; + void* end; + SectionKind kind; + struct _Section* next; + } Section; +typedef + struct _ProddableBlock { + void* start; + int size; + struct _ProddableBlock* next; + } + ProddableBlock; + +/* Jump Islands are sniplets of machine code required for relative + * address relocations on the PowerPC. + */ +#ifdef powerpc_HOST_ARCH +typedef struct { + short lis_r12, hi_addr; + short ori_r12_r12, lo_addr; + long mtctr_r12; + long bctr; +} ppcJumpIsland; +#endif + /* Top-level structure for an object module. One of these is allocated * for each object file in use. */ typedef struct _ObjectCode { - OStatus status; - char* fileName; - int fileSize; - char* formatName; /* eg "ELF32", "DLL", "COFF", etc. */ + OStatus status; + char* fileName; + int fileSize; + char* formatName; /* eg "ELF32", "DLL", "COFF", etc. */ - SymbolVal *symbols; - int n_symbols; + /* An array containing ptrs to all the symbol names copied from + 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. */ + char** symbols; + int n_symbols; /* ptr to malloc'd lump of memory holding the obj file */ - void* image; + void* image; - /* The section-kind entries for this object module. Dynamically expands. */ - Section* sections; - int n_sections; + /* The section-kind entries for this object module. Linked + list. */ + Section* sections; + + /* A private hash table for local symbols. */ + HashTable* lochash; /* Allow a chain of these things */ struct _ObjectCode * next; + + /* SANITY CHECK ONLY: a list of the only memory regions which may + safely be prodded during relocation. Any attempt to prod + outside one of these is an error in the linker. */ + ProddableBlock* proddables; + +#ifdef ia64_HOST_ARCH + /* Procedure Linkage Table for this object */ + void *plt; + unsigned int pltIndex; +#endif + +#ifdef powerpc_HOST_ARCH + ppcJumpIsland *jump_islands; + unsigned long island_start_symbol; + unsigned long n_islands; +#endif + } ObjectCode; extern ObjectCode *objects;