X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FLinker.c;h=71d2a8e02052eaab2da57ca0a613522cf48dd305;hb=0f0a1585e442089357656b87144cd22abf478dda;hp=8acf818b2f544811b1fa0986560dfd271f0b2fd0;hpb=16a9e2dc8e5a75f55a375b3dd6e9cf47dfc38985;p=ghc-hetmet.git diff --git a/rts/Linker.c b/rts/Linker.c index 8acf818..71d2a8e 100644 --- a/rts/Linker.c +++ b/rts/Linker.c @@ -222,15 +222,10 @@ typedef struct _RtsSymbolVal { void *addr; } RtsSymbolVal; -#if !defined(PAR) #define Maybe_Stable_Names SymI_HasProto(mkWeakzh_fast) \ SymI_HasProto(mkWeakForeignEnvzh_fast) \ SymI_HasProto(makeStableNamezh_fast) \ SymI_HasProto(finalizzeWeakzh_fast) -#else -/* These are not available in GUM!!! -- HWL */ -#define Maybe_Stable_Names -#endif #if !defined (mingw32_HOST_OS) #define RTS_POSIX_ONLY_SYMBOLS \ @@ -386,6 +381,8 @@ typedef struct _RtsSymbolVal { SymI_NeedsProto(iscntrl) \ SymI_NeedsProto(isalpha) \ SymI_NeedsProto(isalnum) \ + SymI_NeedsProto(isascii) \ + SymI_HasProto(__mingw_vfprintf) \ SymI_HasProto(strcmp) \ SymI_HasProto(memmove) \ SymI_HasProto(realloc) \ @@ -542,23 +539,6 @@ typedef struct _RtsSymbolVal { SymI_HasProto(stg_ap_pppppp_ret) #endif -/* On Windows, we link libgmp.a statically into libHSrts.dll */ -#ifdef mingw32_HOST_OS -#define GMP_SYMS \ - SymI_HasProto(__gmpz_cmp) \ - SymI_HasProto(__gmpz_cmp_si) \ - SymI_HasProto(__gmpz_cmp_ui) \ - SymI_HasProto(__gmpz_get_si) \ - SymI_HasProto(__gmpz_get_ui) -#else -#define GMP_SYMS \ - SymE_HasProto(__gmpz_cmp) \ - SymE_HasProto(__gmpz_cmp_si) \ - SymE_HasProto(__gmpz_cmp_ui) \ - SymE_HasProto(__gmpz_get_si) \ - SymE_HasProto(__gmpz_get_ui) -#endif - #define RTS_SYMBOLS \ Maybe_Stable_Names \ SymI_HasProto(StgReturn) \ @@ -595,20 +575,17 @@ typedef struct _RtsSymbolVal { SymI_HasProto(OnExitHook) \ SymI_HasProto(OutOfHeapHook) \ SymI_HasProto(StackOverflowHook) \ - SymI_HasProto(__encodeDouble) \ - SymI_HasProto(__encodeFloat) \ SymI_HasProto(addDLL) \ - GMP_SYMS \ SymI_HasProto(__int_encodeDouble) \ SymI_HasProto(__word_encodeDouble) \ SymI_HasProto(__2Int_encodeDouble) \ SymI_HasProto(__int_encodeFloat) \ SymI_HasProto(__word_encodeFloat) \ - SymI_HasProto(andIntegerzh_fast) \ SymI_HasProto(atomicallyzh_fast) \ SymI_HasProto(barf) \ SymI_HasProto(debugBelch) \ SymI_HasProto(errorBelch) \ + SymI_HasProto(sysErrorBelch) \ SymI_HasProto(asyncExceptionsBlockedzh_fast) \ SymI_HasProto(blockAsyncExceptionszh_fast) \ SymI_HasProto(catchzh_fast) \ @@ -617,12 +594,7 @@ typedef struct _RtsSymbolVal { SymI_HasProto(checkzh_fast) \ SymI_HasProto(closure_flags) \ SymI_HasProto(cmp_thread) \ - SymI_HasProto(cmpIntegerzh_fast) \ - SymI_HasProto(cmpIntegerIntzh_fast) \ - SymI_HasProto(complementIntegerzh_fast) \ SymI_HasProto(createAdjustor) \ - SymI_HasProto(decodeDoublezh_fast) \ - SymI_HasProto(decodeFloatzh_fast) \ SymI_HasProto(decodeDoublezu2Intzh_fast) \ SymI_HasProto(decodeFloatzuIntzh_fast) \ SymI_HasProto(defaultsHook) \ @@ -630,8 +602,6 @@ typedef struct _RtsSymbolVal { SymI_HasProto(deRefWeakzh_fast) \ SymI_HasProto(deRefStablePtrzh_fast) \ SymI_HasProto(dirty_MUT_VAR) \ - SymI_HasProto(divExactIntegerzh_fast) \ - SymI_HasProto(divModIntegerzh_fast) \ SymI_HasProto(forkzh_fast) \ SymI_HasProto(forkOnzh_fast) \ SymI_HasProto(forkProcess) \ @@ -640,9 +610,6 @@ typedef struct _RtsSymbolVal { SymI_HasProto(freeStablePtr) \ SymI_HasProto(getOrSetTypeableStore) \ SymI_HasProto(getOrSetSignalHandlerStore) \ - SymI_HasProto(gcdIntegerzh_fast) \ - SymI_HasProto(gcdIntegerIntzh_fast) \ - SymI_HasProto(gcdIntzh_fast) \ SymI_HasProto(genSymZh) \ SymI_HasProto(genericRaise) \ SymI_HasProto(getProgArgv) \ @@ -661,9 +628,6 @@ typedef struct _RtsSymbolVal { SymI_HasProto(unpackClosurezh_fast) \ SymI_HasProto(getApStackValzh_fast) \ SymI_HasProto(getSparkzh_fast) \ - SymI_HasProto(int2Integerzh_fast) \ - SymI_HasProto(integer2Intzh_fast) \ - SymI_HasProto(integer2Wordzh_fast) \ SymI_HasProto(isCurrentThreadBoundzh_fast) \ SymI_HasProto(isDoubleDenormalized) \ SymI_HasProto(isDoubleInfinite) \ @@ -680,7 +644,6 @@ typedef struct _RtsSymbolVal { SymI_HasProto(insertSymbol) \ SymI_HasProto(lookupSymbol) \ SymI_HasProto(makeStablePtrzh_fast) \ - SymI_HasProto(minusIntegerzh_fast) \ SymI_HasProto(mkApUpd0zh_fast) \ SymI_HasProto(myThreadIdzh_fast) \ SymI_HasProto(labelThreadzh_fast) \ @@ -696,20 +659,15 @@ typedef struct _RtsSymbolVal { SymI_HasProto(newPinnedByteArrayzh_fast) \ SymI_HasProto(newAlignedPinnedByteArrayzh_fast) \ SymI_HasProto(newSpark) \ - SymI_HasProto(orIntegerzh_fast) \ SymI_HasProto(performGC) \ SymI_HasProto(performMajorGC) \ - SymI_HasProto(plusIntegerzh_fast) \ SymI_HasProto(prog_argc) \ SymI_HasProto(prog_argv) \ SymI_HasProto(putMVarzh_fast) \ - SymI_HasProto(quotIntegerzh_fast) \ - SymI_HasProto(quotRemIntegerzh_fast) \ SymI_HasProto(raisezh_fast) \ SymI_HasProto(raiseIOzh_fast) \ SymI_HasProto(readTVarzh_fast) \ SymI_HasProto(readTVarIOzh_fast) \ - SymI_HasProto(remIntegerzh_fast) \ SymI_HasProto(resetNonBlockingFd) \ SymI_HasProto(resumeThread) \ SymI_HasProto(resolveObjs) \ @@ -759,6 +717,7 @@ typedef struct _RtsSymbolVal { SymI_HasProto(rts_mkWord32) \ SymI_HasProto(rts_mkWord64) \ SymI_HasProto(rts_unlock) \ + SymI_HasProto(rts_unsafeGetMyCapability) \ SymI_HasProto(rtsSupportsBoundThreads) \ SymI_HasProto(__hscore_get_saved_termios) \ SymI_HasProto(__hscore_set_saved_termios) \ @@ -777,6 +736,7 @@ typedef struct _RtsSymbolVal { SymI_HasProto(stg_MVAR_DIRTY_info) \ SymI_HasProto(stg_IND_STATIC_info) \ SymI_HasProto(stg_INTLIKE_closure) \ + SymI_HasProto(stg_ARR_WORDS_info) \ SymI_HasProto(stg_MUT_ARR_PTRS_DIRTY_info) \ SymI_HasProto(stg_MUT_ARR_PTRS_FROZEN_info) \ SymI_HasProto(stg_MUT_ARR_PTRS_FROZEN0_info) \ @@ -838,7 +798,6 @@ typedef struct _RtsSymbolVal { SymI_HasProto(suspendThread) \ SymI_HasProto(takeMVarzh_fast) \ SymI_HasProto(threadStatuszh_fast) \ - SymI_HasProto(timesIntegerzh_fast) \ SymI_HasProto(tryPutMVarzh_fast) \ SymI_HasProto(tryTakeMVarzh_fast) \ SymI_HasProto(unblockAsyncExceptionszh_fast) \ @@ -846,11 +805,12 @@ typedef struct _RtsSymbolVal { SymI_HasProto(unsafeThawArrayzh_fast) \ SymI_HasProto(waitReadzh_fast) \ SymI_HasProto(waitWritezh_fast) \ - SymI_HasProto(word2Integerzh_fast) \ SymI_HasProto(writeTVarzh_fast) \ - SymI_HasProto(xorIntegerzh_fast) \ SymI_HasProto(yieldzh_fast) \ SymI_NeedsProto(stg_interp_constr_entry) \ + SymI_HasProto(alloc_blocks) \ + SymI_HasProto(alloc_blocks_lim) \ + SymI_HasProto(allocateLocal) \ SymI_HasProto(allocateExec) \ SymI_HasProto(freeExec) \ SymI_HasProto(getAllocations) \ @@ -864,13 +824,6 @@ typedef struct _RtsSymbolVal { SymI_HasProto(traceCcszh_fast) \ RTS_USER_SIGNALS_SYMBOLS -#ifdef SUPPORT_LONG_LONGS -#define RTS_LONG_LONG_SYMS \ - SymI_HasProto(int64ToIntegerzh_fast) \ - SymI_HasProto(word64ToIntegerzh_fast) -#else -#define RTS_LONG_LONG_SYMS /* nothing */ -#endif // 64-bit support functions in libgcc.a #if defined(__GNUC__) && SIZEOF_VOID_P <= 4 @@ -918,7 +871,6 @@ typedef struct _RtsSymbolVal { #define SymI_HasProto_redirect(vvv,xxx) /**/ RTS_SYMBOLS RTS_RET_SYMBOLS -RTS_LONG_LONG_SYMS RTS_POSIX_ONLY_SYMBOLS RTS_MINGW_ONLY_SYMBOLS RTS_CYGWIN_ONLY_SYMBOLS @@ -954,7 +906,6 @@ RTS_LIBFFI_SYMBOLS static RtsSymbolVal rtsSyms[] = { RTS_SYMBOLS RTS_RET_SYMBOLS - RTS_LONG_LONG_SYMS RTS_POSIX_ONLY_SYMBOLS RTS_MINGW_ONLY_SYMBOLS RTS_CYGWIN_ONLY_SYMBOLS @@ -3543,17 +3494,26 @@ do_Elf_Rela_relocations ( ObjectCode* oc, char* ehdrC, w1 |= w2; *pP = w1; break; + /* According to the Sun documentation: R_SPARC_UA32 This relocation type resembles R_SPARC_32, except it refers to an unaligned word. That is, the word to be relocated must be treated as four separate bytes with arbitrary alignment, not as a word aligned according to the architecture requirements. - - (JRS: which means that freeloading on the R_SPARC_32 case - is probably wrong, but hey ...) */ case R_SPARC_UA32: + w2 = (Elf_Word)value; + + // SPARC doesn't do misaligned writes of 32 bit words, + // so we have to do this one byte-at-a-time. + char *pPc = (char*)pP; + pPc[0] = (char) ((Elf_Word)(w2 & 0xff000000) >> 24); + pPc[1] = (char) ((Elf_Word)(w2 & 0x00ff0000) >> 16); + pPc[2] = (char) ((Elf_Word)(w2 & 0x0000ff00) >> 8); + pPc[3] = (char) ((Elf_Word)(w2 & 0x000000ff)); + break; + case R_SPARC_32: w2 = (Elf_Word)value; *pP = w2;