Unbreak build with ghc-7.10.1
[ghc.git] / rts / LinkerInternals.h
index 1d5288b..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;
@@ -209,6 +213,7 @@ typedef struct _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);
 
@@ -220,122 +225,21 @@ void addSection (Section *s, SectionKind kind, SectionAlloc alloc,
                  void* start, StgWord size, StgWord mapped_offset,
                  void* mapped_start, StgWord mapped_size);
 
-#if defined(mingw32_HOST_OS)
-
-typedef unsigned char          UChar;
-typedef unsigned short         UInt16;
-typedef short                  Int16;
-typedef unsigned int           UInt32;
-typedef          int           Int32;
-typedef unsigned long long int UInt64;
-
-
-typedef
-struct {
-    UInt16 Machine;
-    UInt16 NumberOfSections;
-    UInt32 TimeDateStamp;
-    UInt32 PointerToSymbolTable;
-    UInt32 NumberOfSymbols;
-    UInt16 SizeOfOptionalHeader;
-    UInt16 Characteristics;
-}
-COFF_header;
-
-#define sizeof_COFF_header 20
-
-/* 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;
-
-#define sizeof_COFF_import_Header 20
-
-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;
-
-#define sizeof_COFF_section 40
-
+HsBool ghciLookupSymbolInfo(HashTable *table,
+                            const SymbolName* key, RtsSymbolInfo **result);
 
-typedef
-struct {
-    UChar  Name[8];
-    UInt32 Value;
-    Int16  SectionNumber;
-    UInt16 Type;
-    UChar  StorageClass;
-    UChar  NumberOfAuxSymbols;
-}
-COFF_symbol;
-
-#define sizeof_COFF_symbol 18
+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);
 
-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 */
+extern /*Str*/HashTable *symhash;
 
 
 /*************************************************
@@ -359,6 +263,59 @@ getting, here. */
 #define USE_CONTIGUOUS_MMAP 0
 #endif
 
-#include "EndPrivate.h"
+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 */