Fix Darwin/x86 stack alignment
[ghc-hetmet.git] / ghc / rts / LinkerInternals.h
index 804b92b..07d6334 100644 (file)
@@ -1,5 +1,4 @@
 /* -----------------------------------------------------------------------------
- * $Id: LinkerInternals.h,v 1.7 2003/10/08 09:42:35 wolfgang Exp $
  *
  * (c) The GHC Team, 2000
  *
@@ -7,6 +6,9 @@
  *
  * ---------------------------------------------------------------------------*/
 
+#ifndef LINKERINTERNALS_H
+#define LINKERINTERNALS_H
+
 typedef enum { OBJECT_LOADED, OBJECT_RESOLVED } OStatus;
 
 /* Indication of section kinds for loaded objects.  Needed by
@@ -37,6 +39,18 @@ typedef
    }
    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.
  */
@@ -54,7 +68,13 @@ typedef struct _ObjectCode {
     int        n_symbols;
 
     /* ptr to malloc'd lump of memory holding the obj file */
-    void*      image;
+    char*      image;
+
+#ifdef darwin_HOST_OS
+    /* record by how much image has been deliberately misaligned
+       after allocation, so that we can use realloc */
+    int        misalignment;
+#endif
 
     /* The section-kind entries for this object module.  Linked
        list. */
@@ -71,14 +91,14 @@ typedef struct _ObjectCode {
        outside one of these is an error in the linker. */
     ProddableBlock* proddables;
 
-#ifdef ia64_TARGET_ARCH
+#ifdef ia64_HOST_ARCH
     /* Procedure Linkage Table for this object */
     void *plt;
     unsigned int pltIndex;
 #endif
 
-#ifdef darwin_TARGET_OS
-    char*           jump_islands;
+#ifdef powerpc_HOST_ARCH
+    ppcJumpIsland   *jump_islands;
     unsigned long   island_start_symbol;
     unsigned long   n_islands;
 #endif
@@ -86,3 +106,5 @@ typedef struct _ObjectCode {
 } ObjectCode;
 
 extern ObjectCode *objects;
+
+#endif /* LINKERINTERNALS_H */