pkgsrc-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[pkgsrc/trunk]: pkgsrc/lang/perl5 perl5: backport upstream commits to remove ...



details:   https://anonhg.NetBSD.org/pkgsrc/rev/dc76a5623350
branches:  trunk
changeset: 341964:dc76a5623350
user:      maya <maya%pkgsrc.org@localhost>
date:      Thu Oct 10 17:59:57 2019 +0000

description:
perl5: backport upstream commits to remove a codepath that assumes
unaligned accesses are OK.
Remove relevant hacks.mk entry to disable optimizations.

PR pkg/53568

diffstat:

 lang/perl5/Makefile                  |    4 +-
 lang/perl5/distinfo                  |    4 +-
 lang/perl5/hacks.mk                  |   12 +-
 lang/perl5/patches/patch-alignment_1 |  273 +++++++++++++++++++++++++++++++++++
 lang/perl5/patches/patch-alignment_2 |  187 +++++++++++++++++++++++
 5 files changed, 467 insertions(+), 13 deletions(-)

diffs (truncated from 527 to 300 lines):

diff -r d4921bf78886 -r dc76a5623350 lang/perl5/Makefile
--- a/lang/perl5/Makefile       Thu Oct 10 15:43:44 2019 +0000
+++ b/lang/perl5/Makefile       Thu Oct 10 17:59:57 2019 +0000
@@ -1,8 +1,10 @@
-# $NetBSD: Makefile,v 1.255 2019/08/11 10:14:17 adam Exp $
+# $NetBSD: Makefile,v 1.256 2019/10/10 17:59:57 maya Exp $
 
 .include "license.mk"
 .include "Makefile.common"
 
+PKGREVISION=   1
+
 COMMENT=       Practical Extraction and Report Language
 
 CONFLICTS+=    perl-base-[0-9]* perl-thread-[0-9]*
diff -r d4921bf78886 -r dc76a5623350 lang/perl5/distinfo
--- a/lang/perl5/distinfo       Thu Oct 10 15:43:44 2019 +0000
+++ b/lang/perl5/distinfo       Thu Oct 10 17:59:57 2019 +0000
@@ -1,4 +1,4 @@
-$NetBSD: distinfo,v 1.158 2019/08/11 10:14:17 adam Exp $
+$NetBSD: distinfo,v 1.159 2019/10/10 17:59:57 maya Exp $
 
 SHA1 (perl-5.30.0.tar.xz) = cc8d1e08ffe4624c197a44d02855632725d39f8e
 RMD160 (perl-5.30.0.tar.xz) = 64ff4c65823122c337e18278585d71def1de9c5d
@@ -6,6 +6,8 @@
 Size (perl-5.30.0.tar.xz) = 12419868 bytes
 SHA1 (patch-Configure) = 6000aafeb993fd096c9b1327302b510aa0d386bb
 SHA1 (patch-Makefile.SH) = 93cae9736ef94cdd9e5748f7e0a0183332c2f3b3
+SHA1 (patch-alignment_1) = b68c0916b271523922caa7f89edb165284e7b5f4
+SHA1 (patch-alignment_2) = cae8495c4a092e31da422bf5684481091ee2adf3
 SHA1 (patch-caretx.c) = b76b4175a58123fa4dfd2adf36b2207dcb6cf65a
 SHA1 (patch-cflags.SH) = 7ad64e5a17b876bff4bbe238abc4a57354acf4fe
 SHA1 (patch-cpan_ExtUtils-MakeMaker_lib_ExtUtils_MM__Unix.pm) = 3a2b39c9eb903e68ef7d03ae448c51c147c19aa1
diff -r d4921bf78886 -r dc76a5623350 lang/perl5/hacks.mk
--- a/lang/perl5/hacks.mk       Thu Oct 10 15:43:44 2019 +0000
+++ b/lang/perl5/hacks.mk       Thu Oct 10 17:59:57 2019 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: hacks.mk,v 1.23 2019/04/23 09:27:46 adam Exp $
+# $NetBSD: hacks.mk,v 1.24 2019/10/10 17:59:57 maya Exp $
 
 .if !defined(PERL5_HACKS_MK)
 PERL5_HACKS_MK=        defined
@@ -22,16 +22,6 @@
 BUILDLINK_TRANSFORM+=  opt:-O[0-9]*:-Os
 .endif
 
-### [ Wed Nov 21 11:35:48 IST 2018 : maya ]
-### Alignment fault on perl 5.28.0
-### Might be specific to GCC 4.9
-### https://rt.perl.org/Public/Bug/Display.html?id=133495
-### See PR pkg/53568
-.if ${OPSYS} == "SunOS" && !empty(MACHINE_ARCH:Msparc*)
-PKG_HACKS+=            sun-sparc-alignment-fault
-BUILDLINK_TRANSFORM+=  opt:-O3:-O2
-.endif
-
 ### [Fri Jan 31 11:09:04 CST 2014 : schnoebe]
 ### [Fri Oct 28 11:53:57 EDT 2016 : dholland - extended to gcc5]
 ### gcc-[45].*.* in NetBSD/alpha causes unaligned access exception in perl.
diff -r d4921bf78886 -r dc76a5623350 lang/perl5/patches/patch-alignment_1
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lang/perl5/patches/patch-alignment_1      Thu Oct 10 17:59:57 2019 +0000
@@ -0,0 +1,273 @@
+$NetBSD: patch-alignment_1,v 1.1 2019/10/10 17:59:57 maya Exp $
+
+Apply upstream commit (not needed in perl >= 5.32.x)
+
+From ee9ac1cd8eb988fea70841eae211b11355711416 Mon Sep 17 00:00:00 2001
+From: Matt Turner <mattst88%gmail.com@localhost>
+Date: Wed, 4 Sep 2019 21:04:47 -0700
+Subject: [PATCH] Digest-MD5: Consolidate byte-swapping paths
+
+The code guarded by #ifndef U32_ALIGNMENT_REQUIRED attempts to optimize
+byte-swapping by doing unaligned loads, but accessing data through
+unaligned pointers is undefined behavior in C. Moreover, compilers are
+more than capable of recognizing these open-coded byte-swap patterns and
+emitting a bswap instruction, or an unaligned load instruction, or a
+combined load, etc. There's no need for multiple paths to attain the
+desired result.
+
+See https://rt.perl.org/Ticket/Display.html?id=133495
+---
+ cpan/Digest-MD5/MD5.xs      |  44 +----------------
+ cpan/Digest-MD5/Makefile.PL | 114 --------------------------------------------
+ cpan/Digest-MD5/t/files.t   |   2 +-
+ 3 files changed, 3 insertions(+), 157 deletions(-)
+
+diff --git a/cpan/Digest-MD5/MD5.xs b/cpan/Digest-MD5/MD5.xs
+index a48d951056..964d37fb0e 100644
+--- cpan/Digest-MD5/MD5.xs.orig
++++ cpan/Digest-MD5/MD5.xs
+@@ -106,20 +106,6 @@ static MAGIC *THX_sv_magicext(pTHX_ SV *sv, SV *obj, int type,
+  * values.  The following macros (and functions) allow us to convert
+  * between native integers and such values.
+  */
+-#undef BYTESWAP
+-#ifndef U32_ALIGNMENT_REQUIRED
+- #if BYTEORDER == 0x1234      /* 32-bit little endian */
+-  #define BYTESWAP(x) (x)     /* no-op */
+-
+- #elif BYTEORDER == 0x4321    /* 32-bit big endian */
+-  #define BYTESWAP(x)         ((((x)&0xFF)<<24)       \
+-                      |(((x)>>24)&0xFF)       \
+-                      |(((x)&0x0000FF00)<<8)  \
+-                      |(((x)&0x00FF0000)>>8)  )
+- #endif
+-#endif
+-
+-#ifndef BYTESWAP
+ static void u2s(U32 u, U8* s)
+ {
+     *s++ = (U8)(u         & 0xFF);
+@@ -132,7 +118,6 @@ static void u2s(U32 u, U8* s)
+                         ((U32)(*(s+1)) << 8)  |  \
+                         ((U32)(*(s+2)) << 16) |  \
+                         ((U32)(*(s+3)) << 24))
+-#endif
+ 
+ /* This structure keeps the current state of algorithm.
+  */
+@@ -279,29 +264,16 @@ MD5Transform(MD5_CTX* ctx, const U8* buf, STRLEN blocks)
+     U32 C = ctx->C;
+     U32 D = ctx->D;
+ 
+-#ifndef U32_ALIGNMENT_REQUIRED
+-    const U32 *x = (U32*)buf;  /* really just type casting */
+-#endif
+-
+     do {
+       U32 a = A;
+       U32 b = B;
+       U32 c = C;
+       U32 d = D;
+ 
+-#if BYTEORDER == 0x1234 && !defined(U32_ALIGNMENT_REQUIRED)
+-      const U32 *X = x;
+-        #define NEXTx  (*x++)
+-#else
+-      U32 X[16];      /* converted values, used in round 2-4 */
++      U32 X[16];      /* little-endian values, used in round 2-4 */
+       U32 *uptr = X;
+       U32 tmp;
+- #ifdef BYTESWAP
+-        #define NEXTx  (tmp=*x++, *uptr++ = BYTESWAP(tmp))
+- #else
+         #define NEXTx  (s2u(buf,tmp), buf += 4, *uptr++ = tmp)
+- #endif
+-#endif
+ 
+ #ifdef MD5_DEBUG
+       if (buf == ctx->buffer)
+@@ -313,7 +285,7 @@ MD5Transform(MD5_CTX* ctx, const U8* buf, STRLEN blocks)
+           int i;
+           fprintf(stderr,"[");
+           for (i = 0; i < 16; i++) {
+-              fprintf(stderr,"%x,", x[i]);
++              fprintf(stderr,"%x,", x[i]); /* FIXME */
+           }
+           fprintf(stderr,"]\n");
+       }
+@@ -468,30 +440,18 @@ MD5Final(U8* digest, MD5_CTX *ctx)
+ 
+     bits_low = ctx->bytes_low << 3;
+     bits_high = (ctx->bytes_high << 3) | (ctx->bytes_low  >> 29);
+-#ifdef BYTESWAP
+-    *(U32*)(ctx->buffer + fill) = BYTESWAP(bits_low);    fill += 4;
+-    *(U32*)(ctx->buffer + fill) = BYTESWAP(bits_high);   fill += 4;
+-#else
+     u2s(bits_low,  ctx->buffer + fill);   fill += 4;
+     u2s(bits_high, ctx->buffer + fill);   fill += 4;
+-#endif
+ 
+     MD5Transform(ctx, ctx->buffer, fill >> 6);
+ #ifdef MD5_DEBUG
+     fprintf(stderr,"       Result: %s\n", ctx_dump(ctx));
+ #endif
+ 
+-#ifdef BYTESWAP
+-    *(U32*)digest = BYTESWAP(ctx->A);  digest += 4;
+-    *(U32*)digest = BYTESWAP(ctx->B);  digest += 4;
+-    *(U32*)digest = BYTESWAP(ctx->C);  digest += 4;
+-    *(U32*)digest = BYTESWAP(ctx->D);
+-#else
+     u2s(ctx->A, digest);
+     u2s(ctx->B, digest+4);
+     u2s(ctx->C, digest+8);
+     u2s(ctx->D, digest+12);
+-#endif
+ }
+ 
+ #ifndef INT2PTR
+diff --git a/cpan/Digest-MD5/Makefile.PL b/cpan/Digest-MD5/Makefile.PL
+index 1015058bac..76906d1046 100644
+--- cpan/Digest-MD5/Makefile.PL.orig
++++ cpan/Digest-MD5/Makefile.PL
+@@ -5,7 +5,6 @@ use Config qw(%Config);
+ use ExtUtils::MakeMaker;
+ 
+ my @extra;
+-push(@extra, DEFINE => "-DU32_ALIGNMENT_REQUIRED") unless free_u32_alignment();
+ push(@extra, INSTALLDIRS => 'perl') if $] >= 5.008 && $] < 5.012;
+ 
+ if ($^O eq 'VMS') {
+@@ -39,119 +38,6 @@ WriteMakefile(
+ 
+ 
+ 
+-sub free_u32_alignment
+-{
+-    $|=1;
+-    if (exists $Config{d_u32align}) {
+-       print "Perl's config says that U32 access must ";
+-       print "not " unless $Config{d_u32align};
+-       print "be aligned.\n";
+-       return !$Config{d_u32align};
+-    }
+-    
+-    if ($^O eq 'VMS' || $^O eq 'MSWin32') {
+-       print "Assumes that $^O implies free alignment for U32 access.\n";
+-       return 1;
+-    }
+-    
+-    if ($^O eq 'hpux' && $Config{osvers} < 11.0) {
+-       print "Will not test for free alignment on older HP-UX.\n";
+-       return 0;
+-    }
+-    
+-    print "Testing alignment requirements for U32... ";
+-    open(ALIGN_TEST, ">u32align.c") or die "$!";
+-    print ALIGN_TEST <<'EOT'; close(ALIGN_TEST);
+-/*--------------------------------------------------------------*/
+-/*  This program allocates a buffer of U8 (char) and then tries */
+-/*  to access it through a U32 pointer at every offset.  The    */
+-/*  program  is expected to die with a bus error/seg fault for  */
+-/*  machines that do not support unaligned integer read/write   */
+-/*--------------------------------------------------------------*/
+-
+-#include <stdio.h>
+-#include "EXTERN.h"
+-#include "perl.h"
+-
+-#ifdef printf
+- #undef printf
+-#endif
+-
+-int main(int argc, char** argv, char** env)
+-{
+-#if BYTEORDER == 0x1234 || BYTEORDER == 0x4321
+-    volatile U8 buf[] = "\0\0\0\1\0\0\0\0";
+-    volatile U32 *up;
+-    int i;
+-
+-    if (sizeof(U32) != 4) {
+-      printf("sizeof(U32) is not 4, but %d\n", sizeof(U32));
+-      exit(1);
+-    }
+-
+-    fflush(stdout);
+-
+-    for (i = 0; i < 4; i++) {
+-      up = (U32*)(buf + i);
+-      if (! ((*up == 1 << (8*i)) ||   /* big-endian */
+-             (*up == 1 << (8*(3-i)))  /* little-endian */
+-            )
+-         )
+-      {
+-          printf("read failed (%x)\n", *up);
+-          exit(2);
+-      }
+-    }
+-
+-    /* write test */
+-    for (i = 0; i < 4; i++) {
+-      up = (U32*)(buf + i);
+-      *up = 0xBeef;
+-      if (*up != 0xBeef) {
+-          printf("write failed (%x)\n", *up);
+-          exit(3);
+-      }
+-    }
+-
+-    printf("no restrictions\n");
+-    exit(0);
+-#else
+-    printf("unusual byteorder, playing safe\n");
+-    exit(1);
+-#endif
+-    return 0;
+-}
+-/*--------------------------------------------------------------*/
+-EOT
+-
+-    my $cc_cmd = "$Config{cc} $Config{ccflags} -I$Config{archlibexp}/CORE";
+-    my $exe = "u32align$Config{exe_ext}";
+-    $cc_cmd .= " -o $exe";
+-    my $rc;
+-    $rc = system("$cc_cmd $Config{ldflags} u32align.c $Config{libs}");
+-    if ($rc) {
+-      print "Can't compile test program.  Will ensure alignment to play safe.\n\n";
+-      unlink("u32align.c", $exe, "u32align$Config{obj_ext}");



Home | Main Index | Thread Index | Old Index