X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FLinker.c;h=1576e49b4bc19cef538cc739b1aee3a29195e0bc;hb=0b2de03568d3acf8143ff7f6dde103099bf8ff1a;hp=1d955a378f00d4570b00ff3e6ea7847f1dc0054f;hpb=3501ac6af749ada0afcaf84f112ab2e4bf9120b9;p=ghc-hetmet.git diff --git a/rts/Linker.c b/rts/Linker.c index 1d955a3..1576e49 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -957,37 +957,6 @@ typedef struct _RtsSymbolVal { #define RTS_LIBGCC_SYMBOLS #endif -/* NOTE [io-manager-ghci] - - When GHCi loads the base package, it gets another copy of the CAFs - in GHC.Conc that record the IO manager's ThreadId, and the blocking - queues, so we get another IO manager. This is bad enough, but what - is worse is that GHCi by default reverts all CAFs on every :load, - so we'll get *another* IO manager thread (and an associated pipe) - every time the user does :load. Miraculously, this actually - manages to just about work in GHC 6.10 and earlier, but broke when - I tried to fix #1185 (restarting the IO manager after a fork()). - - To work around it and ensure that we only have a single IO manager, - we map the CAFs in the dynamically-loaded GHC.Conc to the - statically-linked GHC.Conc. This is an ugly hack, but it's the - least ugly hack that I could think of (SDM 3/11/2009) -*/ - -#define RTS_GHC_CONC_SYMBOLS \ - SymI_NeedsProto(base_GHCziConc_pendingDelays_closure) \ - SymI_NeedsProto(base_GHCziConc_pendingEvents_closure) \ - SymI_NeedsProto(base_GHCziConc_ioManagerThread_closure) - -#ifdef mingw32_HOST_OS -#define RTS_GHC_CONC_OS_SYMBOLS /* empty */ -#else -#define RTS_GHC_CONC_OS_SYMBOLS \ - SymI_NeedsProto(base_GHCziConc_prodding_closure) \ - SymI_NeedsProto(base_GHCziConc_sync_closure) \ - SymI_NeedsProto(base_GHCziConc_stick_closure) -#endif - #if defined(darwin_HOST_OS) && defined(powerpc_HOST_ARCH) // Symbols that don't have a leading underscore // on Mac OS X. They have to receive special treatment, @@ -1016,8 +985,6 @@ RTS_CYGWIN_ONLY_SYMBOLS RTS_DARWIN_ONLY_SYMBOLS RTS_LIBGCC_SYMBOLS RTS_LIBFFI_SYMBOLS -RTS_GHC_CONC_SYMBOLS -RTS_GHC_CONC_OS_SYMBOLS #undef SymI_NeedsProto #undef SymI_HasProto #undef SymI_HasProto_redirect @@ -1053,8 +1020,6 @@ static RtsSymbolVal rtsSyms[] = { RTS_DARWIN_ONLY_SYMBOLS RTS_LIBGCC_SYMBOLS RTS_LIBFFI_SYMBOLS - RTS_GHC_CONC_SYMBOLS - RTS_GHC_CONC_OS_SYMBOLS #if defined(darwin_HOST_OS) && defined(i386_HOST_ARCH) // dyld stub code contains references to this, // but it should never be called because we treat @@ -1076,18 +1041,12 @@ static void ghciInsertStrHashTable ( char* obj_name, void *data ) { -#define GHC_CONC "base_GHCziConc" - - if (lookupHashTable(table, (StgWord)key) == NULL) - { + if (lookupHashTable(table, (StgWord)key) == NULL) + { insertStrHashTable(table, (StgWord)key, data); return; - } - if (strncmp(key, GHC_CONC, strlen(GHC_CONC)) == 0) { - /* see NOTE [io-manager-ghci] */ - return; - } - debugBelch( + } + debugBelch( "\n\n" "GHCi runtime linker: fatal error: I found a duplicate definition for symbol\n" " %s\n" @@ -1102,8 +1061,8 @@ static void ghciInsertStrHashTable ( char* obj_name, "\n", (char*)key, obj_name - ); - exit(1); + ); + exit(1); } /* ----------------------------------------------------------------------------- * initialize the object linker @@ -4214,9 +4173,16 @@ static int relocateSection( i++; } #endif - else - continue; // ignore the others - + else + { + barf ("Don't know how to handle this Mach-O " + "scattered relocation entry: " + "object file %s; entry type %ld; " + "address %#lx\n", + oc->fileName, scat->r_type, scat->r_address); + return 0; + } + #ifdef powerpc_HOST_ARCH if(scat->r_type == GENERIC_RELOC_VANILLA || scat->r_type == PPC_RELOC_SECTDIFF) @@ -4244,11 +4210,28 @@ static int relocateSection( } #endif } + else + { + barf("Can't handle Mach-O scattered relocation entry " + "with this r_length tag: " + "object file %s; entry type %ld; " + "r_length tag %ld; address %#lx\n", + oc->fileName, scat->r_type, scat->r_length, + scat->r_address); + return 0; + } } - - continue; // FIXME: I hope it's OK to ignore all the others. + else /* scat->r_pcrel */ + { + barf("Don't know how to handle *PC-relative* Mach-O " + "scattered relocation entry: " + "object file %s; entry type %ld; address %#lx\n", + oc->fileName, scat->r_type, scat->r_address); + return 0; + } + } - else + else /* !(relocs[i].r_address & R_SCATTERED) */ { struct relocation_info *reloc = &relocs[i]; if(reloc->r_pcrel && !reloc->r_extern) @@ -4293,6 +4276,14 @@ static int relocateSection( word = (word & 0x03FFFFFC) | ((word & 0x02000000) ? 0xFC000000 : 0); } #endif + else + { + barf("Can't handle this Mach-O relocation entry " + "(not scattered): " + "object file %s; entry type %ld; address %#lx\n", + oc->fileName, reloc->r_type, reloc->r_address); + return 0; + } if(!reloc->r_extern) { @@ -4384,8 +4375,16 @@ static int relocateSection( } #endif } - barf("\nunknown relocation %d",reloc->r_type); - return 0; + else + { + barf("Can't handle Mach-O relocation entry (not scattered) " + "with this r_length tag: " + "object file %s; entry type %ld; " + "r_length tag %ld; address %#lx\n", + oc->fileName, reloc->r_type, reloc->r_length, + reloc->r_address); + return 0; + } } #endif }