Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 14 Nov 2017 05:28:52 +0000 (UTC)
From:      Gerald Pfeifer <gerald@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r454161 - in head/lang/gcc6: . files
Message-ID:  <201711140528.vAE5Sqwk051241@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gerald
Date: Tue Nov 14 05:28:51 2017
New Revision: 454161
URL: https://svnweb.freebsd.org/changeset/ports/454161

Log:
  Add a patch that we pulled into gcc6-devel via upstream a few days ago
  that addresses a real-world issue around threading and unwinding as
  files/patch-freebsd-unwind.h .
  
  This will become obsolete with the next release of GCC 6, GCC 6.5.
  
  Bump PORTREVISION since this is a functional change.
  
  On the way fix up the format for files/patch-armv7-support . [1]
  
  Reported by:	portlint [1]

Added:
  head/lang/gcc6/files/patch-freebsd-unwind.h
     - copied unchanged from r454158, head/lang/gcc7/files/patch-freebsd-unwind.h
Modified:
  head/lang/gcc6/Makefile
  head/lang/gcc6/files/patch-armv7-support

Modified: head/lang/gcc6/Makefile
==============================================================================
--- head/lang/gcc6/Makefile	Tue Nov 14 04:31:58 2017	(r454160)
+++ head/lang/gcc6/Makefile	Tue Nov 14 05:28:51 2017	(r454161)
@@ -3,7 +3,7 @@
 
 PORTNAME=	gcc
 PORTVERSION=	6.4.0
-PORTREVISION=	2
+PORTREVISION=	3
 CATEGORIES=	lang java
 MASTER_SITES=	GCC/releases/gcc-${DISTVERSION}
 PKGNAMESUFFIX=	${SUFFIX}

Modified: head/lang/gcc6/files/patch-armv7-support
==============================================================================
--- head/lang/gcc6/files/patch-armv7-support	Tue Nov 14 04:31:58 2017	(r454160)
+++ head/lang/gcc6/files/patch-armv7-support	Tue Nov 14 05:28:51 2017	(r454161)
@@ -1,4 +1,4 @@
----UTC
+--- UTC
 --- gcc/config.gcc.orig	2017-01-09 22:01:26.582656000 +0100
 +++ gcc/config.gcc	2017-10-07 17:27:59.564810000 +0200
 @@ -1072,6 +1072,10 @@

Copied: head/lang/gcc6/files/patch-freebsd-unwind.h (from r454158, head/lang/gcc7/files/patch-freebsd-unwind.h)
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lang/gcc6/files/patch-freebsd-unwind.h	Tue Nov 14 05:28:51 2017	(r454161, copy of r454158, head/lang/gcc7/files/patch-freebsd-unwind.h)
@@ -0,0 +1,90 @@
+2017-11-05  Andreas Tobler  <andreast@gcc.gnu.org>
+
+	Backport from mainline
+	2017-11-04  Andreas Tobler  <andreast@gcc.gnu.org>
+
+	PR libgcc/82635
+	* config/i386/freebsd-unwind.h (MD_FALLBACK_FRAME_STATE_FOR): Use a
+	sysctl to determine whether we're in a trampoline.
+	Keep the pattern matching method for systems without
+	KERN_PROC_SIGTRAMP sysctl.
+
+--- UTC
+--- libgcc/config/i386/freebsd-unwind.h	2017/11/05 17:24:37	254430
++++ libgcc/config/i386/freebsd-unwind.h	2017/11/05 19:30:41	254431
+@@ -28,7 +28,10 @@
+ 
+ #include <sys/types.h>
+ #include <signal.h>
++#include <unistd.h>
++#include <sys/sysctl.h>
+ #include <sys/ucontext.h>
++#include <sys/user.h>
+ #include <machine/sigframe.h>
+ 
+ #define REG_NAME(reg)	sf_uc.uc_mcontext.mc_## reg
+@@ -36,6 +39,38 @@
+ #ifdef __x86_64__
+ #define MD_FALLBACK_FRAME_STATE_FOR x86_64_freebsd_fallback_frame_state
+ 
++#ifdef KERN_PROC_SIGTRAMP
++/* FreeBSD past 9.3 provides a kern.proc.sigtramp.<pid> sysctl that
++   returns the location of the signal trampoline. Use this to find
++   out whether we're in a trampoline.
++*/
++static int
++x86_64_outside_sigtramp_range (unsigned char *pc)
++{
++  static int sigtramp_range_determined = 0;
++  static unsigned char *sigtramp_start, *sigtramp_end;
++
++  if (sigtramp_range_determined == 0)
++    {
++      struct kinfo_sigtramp kst = {0};
++      size_t len = sizeof (kst);
++      int mib[4] = { CTL_KERN, KERN_PROC, KERN_PROC_SIGTRAMP, getpid() };
++
++      sigtramp_range_determined = 1;
++      if (sysctl (mib, 4, &kst, &len, NULL, 0) == 0)
++      {
++        sigtramp_range_determined = 2;
++        sigtramp_start = kst.ksigtramp_start;
++        sigtramp_end   = kst.ksigtramp_end;
++      }
++    }
++  if (sigtramp_range_determined < 2)  /* sysctl failed if < 2 */
++    return 1;
++
++  return (pc < sigtramp_start || pc >= sigtramp_end);
++}
++#endif
++
+ static _Unwind_Reason_Code
+ x86_64_freebsd_fallback_frame_state
+ (struct _Unwind_Context *context, _Unwind_FrameState *fs)
+@@ -43,6 +78,7 @@
+   struct sigframe *sf;
+   long new_cfa;
+ 
++#ifndef KERN_PROC_SIGTRAMP
+   /* Prior to FreeBSD 9, the signal trampoline was located immediately
+      before the ps_strings.  To support non-executable stacks on AMD64,
+      the sigtramp was moved to a shared page for FreeBSD 9.  Unfortunately
+@@ -62,12 +98,15 @@
+         && *(unsigned int *)(context->ra +  8) == 0x01a1c0c7
+         && *(unsigned int *)(context->ra + 12) == 0x050f0000 ))
+     return _URC_END_OF_STACK;
++#else
++  if (x86_64_outside_sigtramp_range(context->ra))
++    return _URC_END_OF_STACK;
++#endif
+ 
+   sf = (struct sigframe *) context->cfa;
+   new_cfa = sf->REG_NAME(rsp);
+   fs->regs.cfa_how = CFA_REG_OFFSET;
+-  /* Register 7 is rsp  */
+-  fs->regs.cfa_reg = 7;
++  fs->regs.cfa_reg =  __LIBGCC_STACK_POINTER_REGNUM__;
+   fs->regs.cfa_offset = new_cfa - (long) context->cfa;
+ 
+   /* The SVR4 register numbering macros aren't usable in libgcc.  */



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201711140528.vAE5Sqwk051241>