diff options
author | Herbert Valerio Riedel <hvr@gnu.org> | 2016-03-24 20:35:42 +0100 |
---|---|---|
committer | Herbert Valerio Riedel <hvr@gnu.org> | 2016-03-24 20:43:59 +0100 |
commit | 343349df1f19f21899818d647bf570e489d0cf8f (patch) | |
tree | 28e2c1b134cc2c9e3519d55be9966166e9eae45d | |
parent | cb08f8da37ff5fb99e1d02b8afdcb802d23e9a8d (diff) | |
download | haskell-343349df1f19f21899818d647bf570e489d0cf8f.tar.gz |
Avoid local label syntax for assembler on AIX
Unfortunately (for inline `__asm__()` uses), IBM's `as` doesn't seem to support
local labels[1] like GNU `as` does so we need to workaround this when on AIX.
[1]: https://sourceware.org/binutils/docs/as/Symbol-Names.html#Symbol-Names
Turns out this also addresses the long-standing bug #485
Reviewed By: bgamari, trommler
Differential Revision: https://phabricator.haskell.org/D2029
-rw-r--r-- | includes/stg/SMP.h | 20 | ||||
-rw-r--r-- | rts/AdjustorAsm.S | 14 |
2 files changed, 29 insertions, 5 deletions
diff --git a/includes/stg/SMP.h b/includes/stg/SMP.h index 756f0401ab..21f05edad3 100644 --- a/includes/stg/SMP.h +++ b/includes/stg/SMP.h @@ -121,9 +121,18 @@ xchg(StgPtr p, StgWord w) ); #elif powerpc_HOST_ARCH __asm__ __volatile__ ( +# if aix_HOST_OS + /* IBM's assembler doesn't seem to support local labels so we use + * explicit relative numeric offsets to workaround this limitation + */ + " lwarx %0, 0, %2\n" + " stwcx. %1, 0, %2\n" + " bne- $-8" +# else // aix_HOST_OS "1: lwarx %0, 0, %2\n" " stwcx. %1, 0, %2\n" " bne- 1b" +# endif :"=&r" (result) :"r" (w), "r" (p) ); @@ -205,12 +214,23 @@ cas(StgVolatilePtr p, StgWord o, StgWord n) #elif powerpc_HOST_ARCH StgWord result; __asm__ __volatile__ ( +# if aix_HOST_OS + /* IBM's assembler doesn't seem to support local labels so we use + * explicit relative numeric offsets to workaround this limitation + */ + " lwarx %0, 0, %3\n" + " cmpw %0, %1\n" + " bne $+12\n" + " stwcx. %2, 0, %3\n" + " bne- $-16\n" +# else // aix_HOST_OS "1: lwarx %0, 0, %3\n" " cmpw %0, %1\n" " bne 2f\n" " stwcx. %2, 0, %3\n" " bne- 1b\n" "2:" +# endif // !aix_HOST_OS :"=&r" (result) :"r" (o), "r" (n), "r" (p) :"cc", "memory" diff --git a/rts/AdjustorAsm.S b/rts/AdjustorAsm.S index ca7ae36573..1713acb315 100644 --- a/rts/AdjustorAsm.S +++ b/rts/AdjustorAsm.S @@ -63,8 +63,12 @@ #define r31 31 #endif - +#if defined(aix_HOST_OS) +/* IBM's assembler needs a different pseudo-op to declare a .text section */ +.csect .text[PR] +#else .text +#endif #if LEADING_UNDERSCORE .globl _adjustorCode _adjustorCode: @@ -101,14 +105,14 @@ adjustorCode: LOAD r12, EXTRA_WORDS_OFF(r2) mtctr r12 - b 2f -1: + b L2 +L1: LOAD r0, LINKAGE_AREA_SIZE + 8*WS(r30) STORE r0, LINKAGE_AREA_SIZE + 10*WS(r31) addi r30, r30, WS addi r31, r31, WS -2: - bdnz 1b +L2: + bdnz L1 /* Restore r30 and r31 now. */ |