fix haddock submodule pointer
[ghc-hetmet.git] / rts / LinkerInternals.h
1 /* -----------------------------------------------------------------------------
2  *
3  * (c) The GHC Team, 2000
4  *
5  * RTS Object Linker
6  *
7  * ---------------------------------------------------------------------------*/
8
9 #ifndef LINKERINTERNALS_H
10 #define LINKERINTERNALS_H
11
12 typedef enum { OBJECT_LOADED, OBJECT_RESOLVED } OStatus;
13
14 /* Indication of section kinds for loaded objects.  Needed by
15    the GC for deciding whether or not a pointer on the stack
16    is a code pointer.
17 */
18 typedef 
19    enum { SECTIONKIND_CODE_OR_RODATA,
20           SECTIONKIND_RWDATA,
21           SECTIONKIND_OTHER,
22           SECTIONKIND_NOINFOAVAIL } 
23    SectionKind;
24
25 typedef 
26    struct _Section { 
27       void* start; 
28       void* end; 
29       SectionKind kind;
30       struct _Section* next;
31    } 
32    Section;
33
34 typedef 
35    struct _ProddableBlock {
36       void* start;
37       int   size;
38       struct _ProddableBlock* next;
39    }
40    ProddableBlock;
41
42 /* Jump Islands are sniplets of machine code required for relative
43  * address relocations on the PowerPC.
44  */
45 typedef struct {
46 #ifdef powerpc_HOST_ARCH
47     struct {
48         short lis_r12, hi_addr;
49         short ori_r12_r12, lo_addr;
50         long mtctr_r12;
51         long bctr;
52     } jumpIsland;
53 #elif x86_64_HOST_ARCH
54     uint64_t    addr;
55     uint8_t     jumpIsland[6];
56 #endif
57 } SymbolExtra;
58
59 /* Top-level structure for an object module.  One of these is allocated
60  * for each object file in use.
61  */
62 typedef struct _ObjectCode {
63     OStatus    status;
64     char*      fileName;
65     int        fileSize;
66     char*      formatName;            /* eg "ELF32", "DLL", "COFF", etc. */
67
68     /* If this object is a member of an archive, archiveMemberName is
69      * like "libarchive.a(object.o)". Otherwise it's NULL.
70      */
71     char*      archiveMemberName;
72
73     /* An array containing ptrs to all the symbol names copied from
74        this object into the global symbol hash table.  This is so that
75        we know which parts of the latter mapping to nuke when this
76        object is removed from the system. */
77     char**     symbols;
78     int        n_symbols;
79
80     /* ptr to malloc'd lump of memory holding the obj file */
81     char*      image;
82
83 #ifdef darwin_HOST_OS
84     /* record by how much image has been deliberately misaligned
85        after allocation, so that we can use realloc */
86     int        misalignment;
87 #endif
88
89     /* The section-kind entries for this object module.  Linked
90        list. */
91     Section* sections;
92
93     /* Allow a chain of these things */
94     struct _ObjectCode * next;
95
96     /* SANITY CHECK ONLY: a list of the only memory regions which may
97        safely be prodded during relocation.  Any attempt to prod
98        outside one of these is an error in the linker. */
99     ProddableBlock* proddables;
100
101 #ifdef ia64_HOST_ARCH
102     /* Procedure Linkage Table for this object */
103     void *plt;
104     unsigned int pltIndex;
105 #endif
106
107 #if powerpc_HOST_ARCH || x86_64_HOST_ARCH
108     SymbolExtra    *symbol_extras;
109     unsigned long   first_symbol_extra;
110     unsigned long   n_symbol_extras;
111 #endif
112
113 } ObjectCode;
114
115 #define OC_INFORMATIVE_FILENAME(OC)             \
116     ( (OC)->archiveMemberName ?                 \
117       (OC)->archiveMemberName :                 \
118       (OC)->fileName                            \
119     )
120
121 extern ObjectCode *objects;
122
123 void exitLinker( void );
124
125 #endif /* LINKERINTERNALS_H */