X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FLinker.c;h=402721f1c74dbb6e4dd407793a3edb440a4130f6;hb=1bca92d715d8b358ee83ff5ee0bc085bec063e59;hp=8acf818b2f544811b1fa0986560dfd271f0b2fd0;hpb=16a9e2dc8e5a75f55a375b3dd6e9cf47dfc38985;p=ghc-hetmet.git diff --git a/rts/Linker.c b/rts/Linker.c index 8acf818..402721f 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 \ @@ -609,6 +604,7 @@ typedef struct _RtsSymbolVal { SymI_HasProto(barf) \ SymI_HasProto(debugBelch) \ SymI_HasProto(errorBelch) \ + SymI_HasProto(sysErrorBelch) \ SymI_HasProto(asyncExceptionsBlockedzh_fast) \ SymI_HasProto(blockAsyncExceptionszh_fast) \ SymI_HasProto(catchzh_fast) \ @@ -622,7 +618,6 @@ typedef struct _RtsSymbolVal { 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) \ @@ -3543,17 +3538,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;