Skip to content
Snippets Groups Projects
Commit ead75532 authored by Peter Trommler's avatar Peter Trommler :drum: Committed by Marge Bot
Browse files

PPC: Support ELF v2 on powerpc64 big-endian

Detect ELF v2 on PowerPC 64-bit systems. Check for `_CALL_ELF`
preprocessor macro.

Fixes #21191
parent 8b2a016a
No related branches found
No related tags found
No related merge requests found
...@@ -1912,8 +1912,15 @@ genCCall' config gcp target dest_regs args ...@@ -1912,8 +1912,15 @@ genCCall' config gcp target dest_regs args
-- "Single precision floating point values -- "Single precision floating point values
-- are mapped to the second word in a single -- are mapped to the second word in a single
-- doubleword" -- doubleword"
GCP64ELF 1 -> stackOffset' + 4 GCP64ELF 1 -> stackOffset' + 4
_ -> stackOffset' -- ELF v2 ABI Revision 1.5 Section 2.2.3.3. requires
-- a single-precision floating-point value
-- to be mapped to the least-significant
-- word in a single doubleword.
GCP64ELF 2 -> case platformByteOrder platform of
BigEndian -> stackOffset' + 4
LittleEndian -> stackOffset'
_ -> stackOffset'
| otherwise = stackOffset' | otherwise = stackOffset'
stackSlot = AddrRegImm sp (ImmInt stackOffset'') stackSlot = AddrRegImm sp (ImmInt stackOffset'')
......
...@@ -126,8 +126,7 @@ stringEncodeArch = \case ...@@ -126,8 +126,7 @@ stringEncodeArch = \case
ArchX86 -> "i386" ArchX86 -> "i386"
ArchX86_64 -> "x86_64" ArchX86_64 -> "x86_64"
ArchPPC -> "powerpc" ArchPPC -> "powerpc"
ArchPPC_64 ELF_V1 -> "powerpc64" ArchPPC_64 _ -> "powerpc64"
ArchPPC_64 ELF_V2 -> "powerpc64le"
ArchS390X -> "s390x" ArchS390X -> "s390x"
ArchARM ARMv5 _ _ -> "armv5" ArchARM ARMv5 _ _ -> "armv5"
ArchARM ARMv6 _ _ -> "armv6" ArchARM ARMv6 _ _ -> "armv6"
......
...@@ -14,11 +14,9 @@ AC_DEFUN([FPTOOLS_SET_HASKELL_PLATFORM_VARS_SHELL_FUNCTIONS], ...@@ -14,11 +14,9 @@ AC_DEFUN([FPTOOLS_SET_HASKELL_PLATFORM_VARS_SHELL_FUNCTIONS],
powerpc) powerpc)
test -z "[$]2" || eval "[$]2=ArchPPC" test -z "[$]2" || eval "[$]2=ArchPPC"
;; ;;
powerpc64) powerpc64*)
test -z "[$]2" || eval "[$]2=\"ArchPPC_64 ELF_V1\"" GHC_GET_POWER_ABI()
;; test -z "[$]2" || eval "[$]2=\"ArchPPC_64 $POWER_ABI\""
powerpc64le)
test -z "[$]2" || eval "[$]2=\"ArchPPC_64 ELF_V2\""
;; ;;
s390x) s390x)
test -z "[$]2" || eval "[$]2=ArchS390X" test -z "[$]2" || eval "[$]2=ArchS390X"
......
# GHC_GET_POWER_ABI
# ----------------------------------
# Get version of the PowerPC ABI
AC_DEFUN([GHC_GET_POWER_ABI],
[
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM(
[],
[#if defined(_CALL_ELF) && _CALL_ELF == 2
return 0;
#else
not ELF v2
#endif]
)],
[POWER_ABI=ELF_V2],
[POWER_ABI=ELF_V1])
AC_SUBST(POWER_ABI)
])
...@@ -2,8 +2,7 @@ ...@@ -2,8 +2,7 @@
/* ******************************** PowerPC ******************************** */ /* ******************************** PowerPC ******************************** */
#if defined(powerpc_HOST_ARCH) || defined(powerpc64_HOST_ARCH) #if defined(powerpc_HOST_ARCH) && defined(aix_HOST_OS) || defined(powerpc64_HOST_ARCH) && defined(__ELF__) && (!defined(_CALL_ELF) || _CALL_ELF == 1)
#if !(defined(powerpc_HOST_ARCH) && defined(linux_HOST_OS))
/* The following code applies, with some differences, /* The following code applies, with some differences,
to all powerpc platforms except for powerpc32-linux, to all powerpc platforms except for powerpc32-linux,
whose calling convention is annoyingly complex. whose calling convention is annoyingly complex.
...@@ -60,12 +59,12 @@ adjustorCode: ...@@ -60,12 +59,12 @@ adjustorCode:
/* save the link */ /* save the link */
mflr 0 mflr 0
STORE 0, LINK_SLOT(1) STORE 0, LINK_SLOT(1)
/* set up stack frame */ /* set up stack frame */
LOAD 12, FRAMESIZE_OFF(2) LOAD 12, FRAMESIZE_OFF(2)
#if defined(powerpc64_HOST_ARCH) #if defined(powerpc64_HOST_ARCH)
stdux 1, 1, 12 stdux 1, 1, 12
#else #else
stwux 1, 1, 12 stwux 1, 1, 12
#endif /* defined(powerpc64_HOST_ARCH) */ #endif /* defined(powerpc64_HOST_ARCH) */
...@@ -108,7 +107,7 @@ L2: ...@@ -108,7 +107,7 @@ L2:
LOAD 12, WPTR_OFF(2) LOAD 12, WPTR_OFF(2)
LOAD 0, 0(12) LOAD 0, 0(12)
/* The function we're calling will never be a nested function, /* The function we're calling will never be a nested function,
so we don't load r11. so we don't load r11.
*/ */
mtctr 0 mtctr 0
LOAD 2, WS(12) LOAD 2, WS(12)
...@@ -118,8 +117,7 @@ L2: ...@@ -118,8 +117,7 @@ L2:
LOAD 0, LINK_SLOT(1) LOAD 0, LINK_SLOT(1)
mtlr 0 mtlr 0
blr blr
#endif /* !(defined(powerpc_HOST_ARCH) && defined(linux_HOST_OS)) */ #endif
#endif /* defined(powerpc_HOST_ARCH) || defined(powerpc64_HOST_ARCH) */
/* mark stack as nonexecutable */ /* mark stack as nonexecutable */
#if defined(__linux__) && defined(__ELF__) #if defined(__linux__) && defined(__ELF__)
......
...@@ -670,7 +670,7 @@ StgRunIsImplementedInAssembler(void) ...@@ -670,7 +670,7 @@ StgRunIsImplementedInAssembler(void)
Everything is in assembler, so we don't have to deal with GCC... Everything is in assembler, so we don't have to deal with GCC...
-------------------------------------------------------------------------- */ -------------------------------------------------------------------------- */
#if defined(powerpc64_HOST_ARCH) #if defined(powerpc64_HOST_ARCH) && (!defined _CALL_ELF || _CALL_ELF == 1)
/* 64-bit PowerPC ELF ABI 1.9 /* 64-bit PowerPC ELF ABI 1.9
* *
* Stack frame organization (see Figure 3-17, ELF ABI 1.9, p 14) * Stack frame organization (see Figure 3-17, ELF ABI 1.9, p 14)
......
...@@ -5,11 +5,11 @@ ...@@ -5,11 +5,11 @@
* then functions StgRun/StgReturn are implemented in file StgCRun.c */ * then functions StgRun/StgReturn are implemented in file StgCRun.c */
#if !defined(USE_MINIINTERPRETER) #if !defined(USE_MINIINTERPRETER)
#if defined(powerpc64le_HOST_ARCH) #if defined(powerpc64le_HOST_ARCH) || defined(powerpc64_HOST_ARCH)
# if defined(linux_HOST_OS) # if defined(_CALL_ELF) && _CALL_ELF == 2
/* 64-bit PowerPC ELF V2 ABI Revision 1.4 /* 64-bit PowerPC ELF V2 ABI Revision 1.5
* *
* Stack frame organization (see Figure 2.18, ELF V2 ABI Revision 1.4, p 31) * Stack frame organization (see Figure 2.18, ELF V2 ABI Revision 1.5, p 34)
* *
* +-> Back Chain (points to the prevoius stack frame) * +-> Back Chain (points to the prevoius stack frame)
* | Floating point register save area (f14-f31) * | Floating point register save area (f14-f31)
...@@ -66,8 +66,10 @@ StgReturn: ...@@ -66,8 +66,10 @@ StgReturn:
addi 12,1,-(8*18) addi 12,1,-(8*18)
bl _restgpr1_14 bl _restgpr1_14
b _restfpr_14 b _restfpr_14
# else // linux_HOST_OS
# error Only Linux support for power64 little endian right now. .section .note.GNU-stack,"",@progbits
# else // Not ELF v2
# error Only ELF v2 supported.
# endif # endif
#elif defined(powerpc_HOST_ARCH) #elif defined(powerpc_HOST_ARCH)
...@@ -449,7 +451,7 @@ StgReturn: ...@@ -449,7 +451,7 @@ StgReturn:
ld.d $fp,$sp,144 ld.d $fp,$sp,144
.cfi_restore 22 .cfi_restore 22
ld.d $s0,$sp,136 ld.d $s0,$sp,136
.cfi_restore 23 .cfi_restore 23
ld.d $s1,$sp,128 ld.d $s1,$sp,128
.cfi_restore 24 .cfi_restore 24
ld.d $s2,$sp,120 ld.d $s2,$sp,120
......
...@@ -29,8 +29,7 @@ __asm__("obscure_ccall_ret_code:\n\t" ...@@ -29,8 +29,7 @@ __asm__("obscure_ccall_ret_code:\n\t"
extern void obscure_ccall_ret_code(void); extern void obscure_ccall_ret_code(void);
#endif /* defined(linux_HOST_OS) */ #endif /* defined(linux_HOST_OS) */
#if defined(powerpc_HOST_ARCH) || defined(powerpc64_HOST_ARCH) #if defined(powerpc_HOST_ARCH) && defined(aix_HOST_OS) || defined(powerpc64_HOST_ARCH) && defined(__ELF__) && (!defined(_CALL_ELF) || _CALL_ELF == 1)
#if !(defined(powerpc_HOST_ARCH) && defined(linux_HOST_OS))
/* !!! !!! WARNING: !!! !!! /* !!! !!! WARNING: !!! !!!
* This structure is accessed from AdjustorAsm.s * This structure is accessed from AdjustorAsm.s
...@@ -50,8 +49,7 @@ typedef struct AdjustorStub { ...@@ -50,8 +49,7 @@ typedef struct AdjustorStub {
StgInt extrawords_plus_one; StgInt extrawords_plus_one;
} AdjustorStub; } AdjustorStub;
#endif /* !(defined(powerpc_HOST_ARCH) && defined(linux_HOST_OS)) */ #endif
#endif /* defined(powerpc_HOST_ARCH) || defined(powerpc64_HOST_ARCH) */
void initAdjustors(void) { } void initAdjustors(void) { }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment