[project @ 2005-01-28 12:55:17 by simonmar]
[ghc-hetmet.git] / ghc / rts / LinkerInternals.h
index 7ec9f35..f1e2677 100644 (file)
@@ -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;