aboutsummaryrefslogtreecommitdiffstats
path: root/lang
diff options
context:
space:
mode:
authorgerald <gerald@FreeBSD.org>2017-11-20 05:50:50 +0800
committergerald <gerald@FreeBSD.org>2017-11-20 05:50:50 +0800
commitcd3a103791f474155fc07666eef0eab6b797ed2a (patch)
tree18e5fb0c64bab17668445c167024a661fce99bbd /lang
parent4b324baff8355a0f980e2899b37219e16501ead0 (diff)
downloadfreebsd-ports-gnome-cd3a103791f474155fc07666eef0eab6b797ed2a.tar.gz
freebsd-ports-gnome-cd3a103791f474155fc07666eef0eab6b797ed2a.tar.zst
freebsd-ports-gnome-cd3a103791f474155fc07666eef0eab6b797ed2a.zip
Backport two fixes from lang/gcc6:
[1] Make sure what we install is stripped (i.e., debug info is removed). (For more background see revisions 454177 and 454422.) [2] Add a patch that we pulled into gcc6-devel via upstream a week ago that addresses a real-world issue around threading and unwinding as files/patch-freebsd-unwind.h . Bump PORTREVISION since [2] is a functional change and [1] changes the package. Reported by: Ports QA Framework, miwi, sobomax [1] Discussed with: tijl, miwi [1] Tested by: sobomax [1] Differential Revision: https://reviews.freebsd.org/D10357 [1]
Diffstat (limited to 'lang')
-rw-r--r--lang/gcc5/Makefile5
-rw-r--r--lang/gcc5/files/patch-freebsd-unwind.h90
2 files changed, 95 insertions, 0 deletions
diff --git a/lang/gcc5/Makefile b/lang/gcc5/Makefile
index f76ef672f2d2..28f7d52e084e 100644
--- a/lang/gcc5/Makefile
+++ b/lang/gcc5/Makefile
@@ -3,6 +3,7 @@
PORTNAME= gcc
PORTVERSION= 5.5.0
+PORTREVISION= 1
CATEGORIES= lang
MASTER_SITES= GCC/releases/gcc-${DISTVERSION}
PKGNAMESUFFIX= ${SUFFIX}
@@ -83,6 +84,10 @@ INSTALL_TARGET= install-strip
.if ${UID} != 0
BINMODE= 755
.endif
+INSTALL_TARGET= install-strip
+.if ${UID} != 0
+BINMODE= 755
+.endif
CONFIGURE_ARGS+=--disable-nls \
--disable-libgcj \
--enable-gnu-indirect-function \
diff --git a/lang/gcc5/files/patch-freebsd-unwind.h b/lang/gcc5/files/patch-freebsd-unwind.h
new file mode 100644
index 000000000000..dfc68fc0191c
--- /dev/null
+++ b/lang/gcc5/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. */