lang/ocaml: fix build on powerpc64 elfv2

LLVM miscompiles ocaml on powerpc64 elfv2:
ld: error: bytecomp/printlambda.ml:23:(.text+0x16): relocation R_PPC64_TOC16_DS out of range: 73024 is not in [-32768, 32767]

Use GCC instead on powerpc64.

Add a conditional patch enabled only on powerpc64 elfv2 to use elfv2 abi instead of elfv1.

Add a bunch of other patches to correctly check for abi instead of relying on endianness.

PR:		242389
Approved by:	michipili@gmail.com (maintainer)
This commit is contained in:
Piotr Kubaj 2019-12-16 12:56:06 +00:00
parent a78a32ab3d
commit b17864ac26
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=520254
5 changed files with 192 additions and 0 deletions

View File

@ -101,6 +101,11 @@ PLIST_SUB+= PROF="@comment "
PLIST_SUB+= PROF=""
.endif
.if defined(PPC_ABI) && ${PPC_ABI} == ELFv2
EXTRA_PATCHES= ${PATCHDIR}/extra-patch-asmcomp_power_arch.ml
USE_GCC= yes
.endif
post-extract:
.if ${PORT_OPTIONS:MDOCS}
@if ! (cd ${WRKDIR} && \

View File

@ -0,0 +1,11 @@
--- asmcomp/power/arch.ml.orig 2019-12-02 10:44:34 UTC
+++ asmcomp/power/arch.ml
@@ -28,7 +28,7 @@ type abi = ELF32 | ELF64v1 | ELF64v2
let abi =
match Config.model with
| "ppc" -> ELF32
- | "ppc64" -> ELF64v1
+ | "ppc64" -> ELF64v2
| "ppc64le" -> ELF64v2
| _ -> assert false

View File

@ -0,0 +1,99 @@
--- asmrun/power.S.orig 2019-12-02 12:34:04 UTC
+++ asmrun/power.S
@@ -13,7 +13,7 @@
/* */
/**************************************************************************/
-#if defined(MODEL_ppc64le)
+#if _CALL_ELF == 2
.abiversion 2
#endif
@@ -42,7 +42,7 @@
#define CALLBACK_LINK_SIZE 16
#define CALLBACK_LINK_OFFSET 0
#endif
-#if defined(MODEL_ppc64)
+#if _CALL_ELF == 1
#define RESERVED_STACK 48
#define PARAM_SAVE_AREA (8*8)
#define LR_SAVE 16
@@ -54,7 +54,7 @@
#define CALLBACK_LINK_SIZE 32
#define CALLBACK_LINK_OFFSET 48
#endif
-#if defined(MODEL_ppc64le)
+#if _CALL_ELF == 2
#define RESERVED_STACK 32
#define PARAM_SAVE_AREA 0
#define LR_SAVE 16
@@ -82,7 +82,7 @@
#endif
-#if defined(MODEL_ppc64)
+#if _CALL_ELF == 1
#define FUNCTION(name) \
.section ".opd","aw"; \
.align 3; \
@@ -98,7 +98,7 @@
#endif
-#if defined(MODEL_ppc64le)
+#if _CALL_ELF == 2
#define FUNCTION(name) \
.section ".text"; \
.globl name; \
@@ -157,7 +157,7 @@
#endif
-#if defined(MODEL_ppc64)
+#if _CALL_ELF == 1
.section ".opd","aw"
#else
.section ".text"
@@ -338,14 +338,14 @@ FUNCTION(caml_c_call)
#if defined(MODEL_ppc)
mtctr 28
bctrl
-#elif defined(MODEL_ppc64)
+#elif _CALL_ELF == 1
ld 0, 0(28)
mr 26, 2 /* save current TOC in a callee-save register */
mtctr 0
ld 2, 8(28)
bctrl
mr 2, 26 /* restore current TOC */
-#elif defined(MODEL_ppc64le)
+#elif _CALL_ELF == 2
mtctr 28
mr 12, 28
mr 26, 2 /* save current TOC in a callee-save register */
@@ -514,14 +514,14 @@ FUNCTION(caml_start_program)
#if defined(MODEL_ppc)
mtctr 12
.L105: bctrl
-#elif defined(MODEL_ppc64)
+#elif _CALL_ELF == 1
ld 0, 0(12)
mtctr 0
std 2, TOC_SAVE(1)
ld 2, 8(12)
.L105: bctrl
ld 2, TOC_SAVE(1)
-#elif defined(MODEL_ppc64le)
+#elif _CALL_ELF == 2
mtctr 12
std 2, TOC_SAVE(1)
.L105: bctrl
@@ -634,7 +634,7 @@ FUNCTION(caml_callback3_exn)
b .L102
ENDFUNCTION(caml_callback3_exn)
-#if defined(MODEL_ppc64)
+#if _CALL_ELF == 1
.section ".opd","aw"
#else
.section ".text"

View File

@ -0,0 +1,15 @@
--- byterun/caml/stack.h.orig 2017-07-13 08:56:44 UTC
+++ byterun/caml/stack.h
@@ -40,10 +40,10 @@
#if defined(MODEL_ppc)
#define Saved_return_address(sp) *((intnat *)((sp) - 4))
#define Callback_link(sp) ((struct caml_context *)((sp) + 16))
-#elif defined(MODEL_ppc64)
+#elif _CALL_ELF == 1
#define Saved_return_address(sp) *((intnat *)((sp) + 16))
#define Callback_link(sp) ((struct caml_context *)((sp) + (48 + 32)))
-#elif defined(MODEL_ppc64le)
+#elif _CALL_ELF == 2
#define Saved_return_address(sp) *((intnat *)((sp) + 16))
#define Callback_link(sp) ((struct caml_context *)((sp) + (32 + 32)))
#else

View File

@ -0,0 +1,62 @@
--- testsuite/tests/asmcomp/power.S.orig 2019-12-02 12:36:28 UTC
+++ testsuite/tests/asmcomp/power.S
@@ -26,11 +26,11 @@
#define RESERVED_STACK 16
#define LR_SAVE_AREA 4
#endif
-#if defined(MODEL_ppc64)
+#if _CALL_ELF == 1
#define RESERVED_STACK 48
#define LR_SAVE_AREA 16
#endif
-#if defined(MODEL_ppc64le)
+#if _CALL_ELF == 2
#define RESERVED_STACK 32
#define LR_SAVE_AREA 16
#endif
@@ -46,7 +46,7 @@
name:
#endif
-#if defined(MODEL_ppc64)
+#if _CALL_ELF == 1
#define FUNCTION(name) \
.section ".opd","aw"; \
.align 3; \
@@ -58,7 +58,7 @@
.L.name:
#endif
-#if defined(MODEL_ppc64le)
+#if _CALL_ELF == 2
#define FUNCTION(name) \
.section ".text"; \
.globl name; \
@@ -118,11 +118,11 @@ FUNCTION(call_gen_code)
/* Get function pointer in CTR */
#if defined(MODEL_ppc)
mtctr 3
-#elif defined(MODEL_ppc64)
+#elif _CALL_ELF == 1
ld 0, 0(3)
mtctr 0
ld 2, 8(3)
-#elif defined(MODEL_ppc64le)
+#elif _CALL_ELF == 2
mtctr 3
mr 12, 3
#else
@@ -184,11 +184,11 @@ FUNCTION(caml_c_call)
/* Jump to C function (address in r28) */
#if defined(MODEL_ppc)
mtctr 28
-#elif defined(MODEL_ppc64)
+#elif _CALL_ELF == 1
ld 0, 0(28)
mtctr 0
ld 2, 8(28)
-#elif defined(MODEL_ppc64le)
+#elif _CALL_ELF == 2
mtctr 28
mr 12, 28
#else