diff options
author | Gerald Pfeifer <gerald@FreeBSD.org> | 2017-11-14 05:28:51 +0000 |
---|---|---|
committer | Gerald Pfeifer <gerald@FreeBSD.org> | 2017-11-14 05:28:51 +0000 |
commit | 001b2bc6a5b33f97e9302631a76071592bd167b8 (patch) | |
tree | 6506daa9ef63c6bb9b7831a61fb39f494bf7a953 /lang/gcc6 | |
parent | b666bfd0cf97b56f717c75989dd667a07c660c8f (diff) |
Notes
Diffstat (limited to 'lang/gcc6')
-rw-r--r-- | lang/gcc6/Makefile | 2 | ||||
-rw-r--r-- | lang/gcc6/files/patch-armv7-support | 2 | ||||
-rw-r--r-- | lang/gcc6/files/patch-freebsd-unwind.h | 90 |
3 files changed, 92 insertions, 2 deletions
diff --git a/lang/gcc6/Makefile b/lang/gcc6/Makefile index 06855af8a24b..72925c60705f 100644 --- a/lang/gcc6/Makefile +++ b/lang/gcc6/Makefile @@ -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} diff --git a/lang/gcc6/files/patch-armv7-support b/lang/gcc6/files/patch-armv7-support index 1e9b7dc16002..370dd1b57f01 100644 --- a/lang/gcc6/files/patch-armv7-support +++ b/lang/gcc6/files/patch-armv7-support @@ -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 @@ diff --git a/lang/gcc6/files/patch-freebsd-unwind.h b/lang/gcc6/files/patch-freebsd-unwind.h new file mode 100644 index 000000000000..dfc68fc0191c --- /dev/null +++ b/lang/gcc6/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. */ |