As pointed out by Daniel, gprolog can now work on sparc64 if we help it
a little.  Detection of sigaction/siginfo_t fails for a dubious reason
(the system returns the address of the page of the faulty access,
instead of the faulty address).  The diff below attempts to fix it in
a portable way.

Testing on sparc64 proved successful even though '-fno-pie -nopie'
wasn't used in CFLAGS.  Using those seems needed only on i386, and maybe
powerpc (can't test those archs).  We want to use PIE when possible, so
the diff below restricts the use of '-fno-pie -nopie' to i386 and
powerpc.

Finally, this switches from Doug Lea malloc shipped with the source to
system malloc(3).  Doug Lea malloc is only used on *BSD systems, no
rationale is given.  I think we also want to use our malloc(3) when
possible.

Make test passes on amd64 and sparc64.  Tests and feedback welcome.


Index: Makefile
===================================================================
RCS file: /cvs/ports/lang/gprolog/Makefile,v
retrieving revision 1.22
diff -u -p -r1.22 Makefile
--- Makefile    16 Nov 2018 22:19:45 -0000      1.22
+++ Makefile    17 Nov 2018 11:34:18 -0000
@@ -1,10 +1,12 @@
 # $OpenBSD: Makefile,v 1.22 2018/11/16 22:19:45 jca Exp $
 
-ONLY_FOR_ARCHS=                amd64 i386 powerpc
+ONLY_FOR_ARCHS=                amd64 i386 powerpc sparc64
 
 COMMENT=               Prolog compiler
 
 DISTNAME=              gprolog-1.4.5
+REVISION=              0
+
 CATEGORIES=            lang
 
 HOMEPAGE=              http://www.gprolog.org/
Index: patches/patch-EnginePl_dl_malloc_c
===================================================================
RCS file: patches/patch-EnginePl_dl_malloc_c
diff -N patches/patch-EnginePl_dl_malloc_c
--- patches/patch-EnginePl_dl_malloc_c  12 Nov 2018 19:15:40 -0000      1.1
+++ /dev/null   1 Jan 1970 00:00:00 -0000
@@ -1,20 +0,0 @@
-$OpenBSD: patch-EnginePl_dl_malloc_c,v 1.1 2018/11/12 19:15:40 daniel Exp $
-
-Index: EnginePl/dl_malloc.c
---- EnginePl/dl_malloc.c.orig
-+++ EnginePl/dl_malloc.c
-@@ -572,6 +572,14 @@ MAX_RELEASE_CHECK_RATE   default: 4095 unless not HAVE
- #endif  /* HAVE_MORECORE */
- #endif  /* DARWIN */
- 
-+#if defined(__OpenBSD__)
-+/* Avoid sbrk on OpenBSD; use mmap instead */
-+#ifndef HAVE_MORECORE
-+#define HAVE_MORECORE 0
-+#define HAVE_MMAP 1
-+#endif
-+#endif
-+
- #ifndef LACKS_SYS_TYPES_H
- #include <sys/types.h>  /* For size_t */
- #endif  /* LACKS_SYS_TYPES_H */
Index: patches/patch-EnginePl_machine_h
===================================================================
RCS file: /cvs/ports/lang/gprolog/patches/patch-EnginePl_machine_h,v
retrieving revision 1.2
diff -u -p -r1.2 patch-EnginePl_machine_h
--- patches/patch-EnginePl_machine_h    8 Jun 2017 15:25:57 -0000       1.2
+++ patches/patch-EnginePl_machine_h    17 Nov 2018 11:34:18 -0000
@@ -1,5 +1,6 @@
 $OpenBSD: patch-EnginePl_machine_h,v 1.2 2017/06/08 15:25:57 espie Exp $
 
+Hunk 1:
 XXX not quite sure why this is needed as it's built without PIE anyway, but
 this fixes a segfault on i386 during build following the switch to PIE by
 default.
@@ -13,6 +14,9 @@ compilation failed
 *** Error 1 in /tmp_ports/gprolog-1.3.1/gprolog-1.3.1/src (Makefile:47 'all')
 ===
 
+Hunk 2:
+use system malloc(3), not Doug Lea malloc backed by sbrk(2)
+
 Index: EnginePl/machine.h
 --- EnginePl/machine.h.orig
 +++ EnginePl/machine.h
@@ -25,3 +29,12 @@ Index: EnginePl/machine.h
  
  #ifdef NO_USE_EBP
  #    define M_USED_REGS            {"ebx", 0}
+@@ -196,7 +196,7 @@ void M_Check_Magic_Words(void); /* not compiled if not
+  *---------------------------------*/
+ 
+ #if defined(__OpenBSD__) || defined(M_bsd)
+-#define USE_DL_MALLOC
++//#define USE_DL_MALLOC
+ #endif
+ 
+ 
Index: patches/patch-EnginePl_try_sigaction_c
===================================================================
RCS file: patches/patch-EnginePl_try_sigaction_c
diff -N patches/patch-EnginePl_try_sigaction_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-EnginePl_try_sigaction_c      17 Nov 2018 11:34:18 -0000
@@ -0,0 +1,49 @@
+$OpenBSD$
+
+Relax siginfo_t si_addr check, sparc64 only provides page granularity.
+
+Index: EnginePl/try_sigaction.c
+--- EnginePl/try_sigaction.c.orig
++++ EnginePl/try_sigaction.c
+@@ -51,6 +51,7 @@
+  * si_addr is wrong for SIGBUS :-(
+  */
+ #define BAD_ADDR  ((int *) 0x2EA4F0)
++int *bad_addr;
+ 
+ void
+ SIGSEGV_Handler(int sig, siginfo_t * sip)
+@@ -59,7 +60,7 @@ SIGSEGV_Handler(int sig, siginfo_t * sip)
+ #if 0
+   printf("bad addr: %p\n", addr);
+ #endif
+-  _exit(addr != BAD_ADDR);
++  _exit(addr != bad_addr);
+ }
+ 
+ 
+@@ -68,6 +69,7 @@ int
+ main(int argc, char *argv[])
+ {
+   struct sigaction act;
++  long page_size;
+ 
+   act.sa_handler = NULL;
+   act.sa_sigaction = (void (*)()) SIGSEGV_Handler;
+@@ -79,7 +81,15 @@ main(int argc, char *argv[])
+   sigaction(SIGBUS, &act, NULL);
+ #endif
+ 
+-  *BAD_ADDR = 128;
++  bad_addr = BAD_ADDR;
++  /*
++   * some architectures can't provide more then page-level
++   * granularity.
++   */
++  if ((page_size = sysconf(_SC_PAGESIZE)) != -1L)
++    bad_addr = (int *)((long)BAD_ADDR & ~(page_size - 1));
++
++  *bad_addr = 128;
+ 
+   return 1;
+ }
Index: patches/patch-configure_in
===================================================================
RCS file: /cvs/ports/lang/gprolog/patches/patch-configure_in,v
retrieving revision 1.5
diff -u -p -r1.5 patch-configure_in
--- patches/patch-configure_in  12 Nov 2018 19:15:40 -0000      1.5
+++ patches/patch-configure_in  17 Nov 2018 11:39:15 -0000
@@ -3,11 +3,12 @@ $OpenBSD: patch-configure_in,v 1.5 2018/
 Index: configure.in
 --- configure.in.orig
 +++ configure.in
-@@ -483,6 +483,7 @@ dnl -fomit-frame-pointer does not work on MinGW (teste
+@@ -483,6 +483,8 @@ dnl -fomit-frame-pointer does not work on MinGW (teste
          powerpc*darwin*)   CFLAGS_MACHINE='-mpowerpc -no-cpp-precomp';;
          x86_64*solaris*)   CFLAGS_MACHINE='-m64';;
          x86_64*darwin*)    CFLAGS_MACHINE='-march=x86-64 -m64';;
-+      *openbsd*)         CFLAGS_MACHINE='-fno-pie -nopie';;
++        i386*openbsd*)     CFLAGS_MACHINE='-fno-pie -nopie';;
++        powerpc*openbsd*)  CFLAGS_MACHINE='-fno-pie -nopie';;
      esac
  
      case "$host" in

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to