diff options
author | Piotr Kubaj <pkubaj@FreeBSD.org> | 2019-12-16 12:56:06 +0000 |
---|---|---|
committer | Piotr Kubaj <pkubaj@FreeBSD.org> | 2019-12-16 12:56:06 +0000 |
commit | b17864ac265843f9a6b308a1b9047b573b930046 (patch) | |
tree | 3a83d9b48e1670c461cabb856043409802348ead /lang/ocaml | |
parent | a78a32ab3d81573549afc4078a6e3b7f2b120585 (diff) | |
download | freebsd-ports-b17864ac265843f9a6b308a1b9047b573b930046.zip |
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)
Diffstat (limited to 'lang/ocaml')
-rw-r--r-- | lang/ocaml/Makefile | 5 | ||||
-rw-r--r-- | lang/ocaml/files/extra-patch-asmcomp_power_arch.ml | 11 | ||||
-rw-r--r-- | lang/ocaml/files/patch-asmrun_power.S | 99 | ||||
-rw-r--r-- | lang/ocaml/files/patch-byterun_caml_stack.h | 15 | ||||
-rw-r--r-- | lang/ocaml/files/patch-testsuite_tests_asmcomp_power.S | 62 |
5 files changed, 192 insertions, 0 deletions
diff --git a/lang/ocaml/Makefile b/lang/ocaml/Makefile index 7104cb0f1b05..c7d25fac1172 100644 --- a/lang/ocaml/Makefile +++ b/lang/ocaml/Makefile @@ -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} && \ diff --git a/lang/ocaml/files/extra-patch-asmcomp_power_arch.ml b/lang/ocaml/files/extra-patch-asmcomp_power_arch.ml new file mode 100644 index 000000000000..47d5a54f4a11 --- /dev/null +++ b/lang/ocaml/files/extra-patch-asmcomp_power_arch.ml @@ -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 + diff --git a/lang/ocaml/files/patch-asmrun_power.S b/lang/ocaml/files/patch-asmrun_power.S new file mode 100644 index 000000000000..dfaa21dd0b61 --- /dev/null +++ b/lang/ocaml/files/patch-asmrun_power.S @@ -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" diff --git a/lang/ocaml/files/patch-byterun_caml_stack.h b/lang/ocaml/files/patch-byterun_caml_stack.h new file mode 100644 index 000000000000..49f429aecf7d --- /dev/null +++ b/lang/ocaml/files/patch-byterun_caml_stack.h @@ -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 diff --git a/lang/ocaml/files/patch-testsuite_tests_asmcomp_power.S b/lang/ocaml/files/patch-testsuite_tests_asmcomp_power.S new file mode 100644 index 000000000000..daf05feb85fb --- /dev/null +++ b/lang/ocaml/files/patch-testsuite_tests_asmcomp_power.S @@ -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 |