Unbreak build with ghc-7.10.1
[ghc.git] / rts / LinkerInternals.h
index c972fa2..76497df 100644 (file)
@@ -9,10 +9,25 @@
 #ifndef LINKERINTERNALS_H
 #define LINKERINTERNALS_H
 
+#include "Rts.h"
+#include "Hash.h"
+
+#if RTS_LINKER_USE_MMAP
+#include <sys/mman.h>
+#endif
+
+#include "BeginPrivate.h"
+
+typedef void SymbolAddr;
+typedef char SymbolName;
+
+/* See Linker.c Note [runtime-linker-phases] */
 typedef enum {
     OBJECT_LOADED,
+    OBJECT_NEEDED,
     OBJECT_RESOLVED,
-    OBJECT_UNLOADED
+    OBJECT_UNLOADED,
+    OBJECT_DONT_RESOLVE
 } OStatus;
 
 /* Indication of section kinds for loaded objects.  Needed by
@@ -37,8 +52,8 @@ typedef
 
 typedef
    struct _Section {
-      void* start;                /* actual start of section in memory */
-      StgWord size;               /* actual size of section in memory */
+      void*    start;              /* actual start of section in memory */
+      StgWord  size;               /* actual size of section in memory */
       SectionKind kind;
       SectionAlloc alloc;
 
@@ -93,6 +108,7 @@ typedef struct {
 #endif
 } SymbolExtra;
 
+
 /* Top-level structure for an object module.  One of these is allocated
  * for each object file in use.
  */
@@ -111,8 +127,8 @@ typedef struct _ObjectCode {
        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;
+    char** symbols;
+    int    n_symbols;
 
     /* ptr to mem containing the object file image */
     char*      image;
@@ -153,6 +169,10 @@ typedef struct _ObjectCode {
 
     ForeignExportStablePtr *stable_ptrs;
 
+    /* Holds the list of symbols in the .o file which
+       require extra information.*/
+    HashTable *extraInfos;
+
 } ObjectCode;
 
 #define OC_INFORMATIVE_FILENAME(OC)             \
@@ -169,8 +189,133 @@ extern Mutex linker_mutex;
 extern Mutex linker_unloaded_mutex;
 #endif
 
+/* Type of the initializer */
+typedef void (*init_t) (int argc, char **argv, char **env);
+
+/* SymbolInfo tracks a symbol's address, the object code from which
+   it originated, and whether or not it's weak.
+
+   RtsSymbolInfo is used to track the state of the symbols currently
+   loaded or to be loaded by the Linker.
+
+   Where the information in the `ObjectCode` is used to track the
+   original status of the symbol inside the `ObjectCode`.
+
+   A weak symbol that has been used will still be marked as weak
+   in the `ObjectCode` but in the `RtsSymbolInfo` it won't be.
+*/
+typedef struct _RtsSymbolInfo {
+    SymbolAddr* value;
+    ObjectCode *owner;
+    HsBool weak;
+} RtsSymbolInfo;
+
 void exitLinker( void );
 
 void freeObjectCode (ObjectCode *oc);
+SymbolAddr* loadSymbol(SymbolName *lbl, RtsSymbolInfo *pinfo);
+
+void *mmapForLinker (size_t bytes, uint32_t flags, int fd, int offset);
+
+void addProddableBlock ( ObjectCode* oc, void* start, int size );
+void checkProddableBlock (ObjectCode *oc, void *addr, size_t size );
+void freeProddableBlocks (ObjectCode *oc);
+
+void addSection (Section *s, SectionKind kind, SectionAlloc alloc,
+                 void* start, StgWord size, StgWord mapped_offset,
+                 void* mapped_start, StgWord mapped_size);
+
+HsBool ghciLookupSymbolInfo(HashTable *table,
+                            const SymbolName* key, RtsSymbolInfo **result);
+
+int ghciInsertSymbolTable(
+    pathchar* obj_name,
+    HashTable *table,
+    const SymbolName* key,
+    SymbolAddr* data,
+    HsBool weak,
+    ObjectCode *owner);
+
+/* lock-free version of lookupSymbol */
+SymbolAddr* lookupSymbol_ (SymbolName* lbl);
+
+extern /*Str*/HashTable *symhash;
+
+
+/*************************************************
+ * Various bits of configuration
+ *************************************************/
+
+/* PowerPC and ARM have relative branch instructions with only 24 bit
+ * displacements and therefore need jump islands contiguous with each object
+ * code module.
+ */
+#if defined(powerpc_HOST_ARCH)
+#define SHORT_REL_BRANCH 1
+#endif
+#if defined(arm_HOST_ARCH)
+#define SHORT_REL_BRANCH 1
+#endif
+
+#if (RTS_LINKER_USE_MMAP && defined(SHORT_REL_BRANCH) && defined(linux_HOST_OS))
+#define USE_CONTIGUOUS_MMAP 1
+#else
+#define USE_CONTIGUOUS_MMAP 0
+#endif
+
+HsInt isAlreadyLoaded( pathchar *path );
+HsInt loadOc( ObjectCode* oc );
+ObjectCode* mkOc( pathchar *path, char *image, int imageSize,
+                  bool mapped, char *archiveMemberName,
+                  int misalignment
+                  );
+
+#if defined (mingw32_HOST_OS)
+/* We use myindex to calculate array addresses, rather than
+   simply doing the normal subscript thing.  That's because
+   some of the above structs have sizes which are not
+   a whole number of words.  GCC rounds their sizes up to a
+   whole number of words, which means that the address calcs
+   arising from using normal C indexing or pointer arithmetic
+   are just plain wrong.  Sigh.
+*/
+INLINE_HEADER unsigned char *
+myindex ( int scale, void* base, int index )
+{
+    return
+        ((unsigned char*)base) + scale * index;
+}
+
+// Defined in linker/PEi386.c
+char *cstring_from_section_name(
+    unsigned char* name,
+    unsigned char* strtab);
+#endif /* mingw32_HOST_OS */
+
+/* MAP_ANONYMOUS is MAP_ANON on some systems,
+   e.g. OS X (before Sierra), OpenBSD etc */
+#if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
+#define MAP_ANONYMOUS MAP_ANON
+#endif
+
+/* Which object file format are we targetting? */
+#if defined(linux_HOST_OS) || defined(solaris2_HOST_OS) || defined(freebsd_HOST_OS) || defined(kfreebsdgnu_HOST_OS) || defined(dragonfly_HOST_OS) || defined(netbsd_HOST_OS) || defined(openbsd_HOST_OS) || defined(gnu_HOST_OS)
+#  define OBJFORMAT_ELF
+#elif defined (mingw32_HOST_OS)
+#  define OBJFORMAT_PEi386
+#elif defined(darwin_HOST_OS)
+#  define OBJFORMAT_MACHO
+#endif
+
+/* In order to simplify control flow a bit, some references to mmap-related
+   definitions are blocked off by a C-level if statement rather than a CPP-level
+   #if statement. Since those are dead branches when !RTS_LINKER_USE_MMAP, we
+   just stub out the relevant symbols here
+*/
+#if !RTS_LINKER_USE_MMAP
+#define munmap(x,y) /* nothing */
+#define MAP_ANONYMOUS 0
+#endif
 
+#include "EndPrivate.h"
 #endif /* LINKERINTERNALS_H */