X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Frts%2FLinkerInternals.h;h=f1e2677851861488c7bfb3f3be069add9b303da2;hb=153b9cb9b11e05c4edb1b6bc0a7b972660e41f70;hp=7ec9f35d0b93c5ec0c4fcf46ab7226f836f74fd5;hpb=af3063d68a312e4cf7d284ea19cba017c1d9e6ad;p=ghc-hetmet.git diff --git a/ghc/rts/LinkerInternals.h b/ghc/rts/LinkerInternals.h index 7ec9f35..f1e2677 100644 --- a/ghc/rts/LinkerInternals.h +++ b/ghc/rts/LinkerInternals.h @@ -1,5 +1,4 @@ /* ----------------------------------------------------------------------------- - * $Id: LinkerInternals.h,v 1.3 2001/02/28 10:03:42 sewardj Exp $ * * (c) The GHC Team, 2000 * @@ -13,15 +12,42 @@ typedef enum { OBJECT_LOADED, OBJECT_RESOLVED } OStatus; 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. */ @@ -41,15 +67,33 @@ typedef struct _ObjectCode { /* ptr to malloc'd lump of memory holding the obj file */ 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;