Unbreak build with ghc-7.10.1
[ghc.git] / rts / LinkerInternals.h
index ffbb909..76497df 100644 (file)
 #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,
@@ -180,132 +189,133 @@ extern Mutex linker_mutex;
 extern Mutex linker_unloaded_mutex;
 #endif
 
-void exitLinker( void );
+/* Type of the initializer */
+typedef void (*init_t) (int argc, char **argv, char **env);
 
-void freeObjectCode (ObjectCode *oc);
+/* SymbolInfo tracks a symbol's address, the object code from which
+   it originated, and whether or not it's weak.
 
-#if defined(mingw32_HOST_OS)
+   RtsSymbolInfo is used to track the state of the symbols currently
+   loaded or to be loaded by the Linker.
 
-typedef unsigned char          UChar;
-typedef unsigned short         UInt16;
-typedef short                  Int16;
-typedef unsigned int           UInt32;
-typedef          int           Int32;
-typedef unsigned long long int UInt64;
+   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;
 
-typedef
-struct {
-    UInt16 Machine;
-    UInt16 NumberOfSections;
-    UInt32 TimeDateStamp;
-    UInt32 PointerToSymbolTable;
-    UInt32 NumberOfSymbols;
-    UInt16 SizeOfOptionalHeader;
-    UInt16 Characteristics;
-}
-COFF_header;
+void exitLinker( void );
 
-#define sizeof_COFF_header 20
+void freeObjectCode (ObjectCode *oc);
+SymbolAddr* loadSymbol(SymbolName *lbl, RtsSymbolInfo *pinfo);
 
-/* Section 7.1 PE Specification */
-typedef
-struct {
-    UInt16 Sig1;
-    UInt16 Sig2;
-    UInt16 Version;
-    UInt16 Machine;
-    UInt32 TimeDateStamp;
-    UInt32 SizeOfData;
-    UInt16 Ordinal;
-    UInt16 Type_NameType_Reserved;
-}
-COFF_import_header;
+void *mmapForLinker (size_t bytes, uint32_t flags, int fd, int offset);
 
-#define sizeof_COFF_import_Header 20
+void addProddableBlock ( ObjectCode* oc, void* start, int size );
+void checkProddableBlock (ObjectCode *oc, void *addr, size_t size );
+void freeProddableBlocks (ObjectCode *oc);
 
-typedef
-struct {
-    UChar  Name[8];
-    UInt32 VirtualSize;
-    UInt32 VirtualAddress;
-    UInt32 SizeOfRawData;
-    UInt32 PointerToRawData;
-    UInt32 PointerToRelocations;
-    UInt32 PointerToLinenumbers;
-    UInt16 NumberOfRelocations;
-    UInt16 NumberOfLineNumbers;
-    UInt32 Characteristics;
-}
-COFF_section;
+void addSection (Section *s, SectionKind kind, SectionAlloc alloc,
+                 void* start, StgWord size, StgWord mapped_offset,
+                 void* mapped_start, StgWord mapped_size);
 
-#define sizeof_COFF_section 40
+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);
 
-typedef
-struct {
-    UChar  Name[8];
-    UInt32 Value;
-    Int16  SectionNumber;
-    UInt16 Type;
-    UChar  StorageClass;
-    UChar  NumberOfAuxSymbols;
-}
-COFF_symbol;
+/* lock-free version of lookupSymbol */
+SymbolAddr* lookupSymbol_ (SymbolName* lbl);
 
-#define sizeof_COFF_symbol 18
+extern /*Str*/HashTable *symhash;
 
 
-typedef
-struct {
-    UInt32 VirtualAddress;
-    UInt32 SymbolTableIndex;
-    UInt16 Type;
-}
-COFF_reloc;
-
-#define sizeof_COFF_reloc 10
-
-/* From PE spec doc, section 3.3.2 */
-/* Note use of MYIMAGE_* since IMAGE_* are already defined in
-windows.h -- for the same purpose, but I want to know what I'm
-getting, here. */
-#define MYIMAGE_FILE_RELOCS_STRIPPED        0x0001
-#define MYIMAGE_FILE_EXECUTABLE_IMAGE       0x0002
-#define MYIMAGE_FILE_DLL                    0x2000
-#define MYIMAGE_FILE_SYSTEM                 0x1000
-#define MYIMAGE_FILE_BYTES_REVERSED_HI      0x8000
-#define MYIMAGE_FILE_BYTES_REVERSED_LO      0x0080
-#define MYIMAGE_FILE_32BIT_MACHINE          0x0100
-
-/* From PE spec doc, section 5.4.2 and 5.4.4 */
-#define MYIMAGE_SYM_CLASS_EXTERNAL          2
-#define MYIMAGE_SYM_CLASS_STATIC            3
-#define MYIMAGE_SYM_UNDEFINED               0
-#define MYIMAGE_SYM_CLASS_SECTION           104
-#define MYIMAGE_SYM_CLASS_WEAK_EXTERNAL     105
-
-/* From PE spec doc, section 3.1 */
-#define MYIMAGE_SCN_CNT_CODE                0x00000020
-#define MYIMAGE_SCN_CNT_INITIALIZED_DATA    0x00000040
-#define MYIMAGE_SCN_CNT_UNINITIALIZED_DATA  0x00000080
-#define MYIMAGE_SCN_LNK_COMDAT              0x00001000
-#define MYIMAGE_SCN_LNK_NRELOC_OVFL         0x01000000
-#define MYIMAGE_SCN_LNK_REMOVE              0x00000800
-#define MYIMAGE_SCN_MEM_DISCARDABLE         0x02000000
-
-/* From PE spec doc, section 5.2.1 */
-#define MYIMAGE_REL_I386_DIR32              0x0006
-#define MYIMAGE_REL_I386_DIR32NB            0x0007
-#define MYIMAGE_REL_I386_REL32              0x0014
-
-#endif /* OBJFORMAT_PEi386 */
+/*************************************************
+ * 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,
-                  rtsBool mapped, char *archiveMemberName,
+                  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 */