git: ee491a6c691b - main - devel/libunwind: Update to 1.7.2

From: Po-Chuan Hsieh <sunpoet_at_FreeBSD.org>
Date: Wed, 01 Nov 2023 05:30:36 UTC
The branch main has been updated by sunpoet:

URL: https://cgit.FreeBSD.org/ports/commit/?id=ee491a6c691b15e6a3313fe8d73cfb2b2ed06e83

commit ee491a6c691b15e6a3313fe8d73cfb2b2ed06e83
Author:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
AuthorDate: 2023-11-01 05:30:07 +0000
Commit:     Po-Chuan Hsieh <sunpoet@FreeBSD.org>
CommitDate: 2023-11-01 05:30:07 +0000

    devel/libunwind: Update to 1.7.2
    
    - Change MASTER_SITES
    - Update WWW
    - Sort PLIST
    
    Changes:        https://github.com/libunwind/libunwind/releases
    PR:             274523
    Exp-run by:     antoine
---
 devel/libunwind/Makefile               |  16 +-
 devel/libunwind/distinfo               |   8 +-
 devel/libunwind/files/patch-aarch64    |  64 -------
 devel/libunwind/files/patch-bug-269875 | 310 ---------------------------------
 devel/libunwind/files/patch-i386       |  13 ++
 devel/libunwind/pkg-plist              |  12 +-
 6 files changed, 30 insertions(+), 393 deletions(-)

diff --git a/devel/libunwind/Makefile b/devel/libunwind/Makefile
index 77af7ab31c2e..72927e2d1d9f 100644
--- a/devel/libunwind/Makefile
+++ b/devel/libunwind/Makefile
@@ -1,17 +1,13 @@
 PORTNAME=	libunwind
-PORTVERSION=	20211201	# This is the release date on https://download.savannah.gnu.org/releases/libunwind/
-PORTREVISION=	2
+PORTVERSION=	20230730	# This is the release date on https://github.com/libunwind/libunwind/releases
 CATEGORIES=	devel
-MASTER_SITES=	SAVANNAH \
-		https://github.com/libunwind/libunwind/releases/download/v${PORTVERSION}/
-DISTNAME=	${PORTNAME}-1.6.2
-
-PATCH_SITES=	https://github.com/libunwind/libunwind/commit/
-PATCHFILES=	ce7e1002888a03fde0eea631748489b12ff56490.patch:-p1
+MASTER_SITES=	https://github.com/libunwind/libunwind/releases/download/v${LIBUNWIND_VERSION}/
+DISTNAME=	${PORTNAME}-${LIBUNWIND_VERSION}
 
 MAINTAINER=	sunpoet@FreeBSD.org
 COMMENT=	Generic stack unwinding library
-WWW=		https://www.nongnu.org/libunwind/
+WWW=		https://github.com/libunwind/libunwind \
+		https://www.nongnu.org/libunwind/
 
 LICENSE=	MIT
 LICENSE_FILE=	${WRKSRC}/COPYING
@@ -31,6 +27,8 @@ PLIST_SUB=	ARCH=${ARCH:S|amd64|x86_64|:C|armv.|arm|:S|i386|x86|:C|powerpc64.*|pp
 
 CPE_VENDOR=	libunwind_project
 
+LIBUNWIND_VERSION=	1.7.2
+
 .include <bsd.port.options.mk>
 
 .if ${ARCH:Mpowerpc*}
diff --git a/devel/libunwind/distinfo b/devel/libunwind/distinfo
index 5d98b5400168..03fe9071a429 100644
--- a/devel/libunwind/distinfo
+++ b/devel/libunwind/distinfo
@@ -1,5 +1,3 @@
-TIMESTAMP = 1682376479
-SHA256 (libunwind-1.6.2.tar.gz) = 4a6aec666991fb45d0889c44aede8ad6eb108071c3554fcdff671f9c94794976
-SIZE (libunwind-1.6.2.tar.gz) = 901392
-SHA256 (ce7e1002888a03fde0eea631748489b12ff56490.patch) = 1bc9c6c2c3a73893fdd54e67c154633a1c6f756b1f71bc99353edc417cb24ee0
-SIZE (ce7e1002888a03fde0eea631748489b12ff56490.patch) = 18260
+TIMESTAMP = 1697307744
+SHA256 (libunwind-1.7.2.tar.gz) = a18a6a24307443a8ace7a8acc2ce79fbbe6826cd0edf98d6326d0225d6a5d6e6
+SIZE (libunwind-1.7.2.tar.gz) = 912590
diff --git a/devel/libunwind/files/patch-aarch64 b/devel/libunwind/files/patch-aarch64
deleted file mode 100644
index 5df59a1815ae..000000000000
--- a/devel/libunwind/files/patch-aarch64
+++ /dev/null
@@ -1,64 +0,0 @@
-Reference:	https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=262447
-		https://github.com/libunwind/libunwind/pull/344
-
---- include/libunwind-aarch64.h.orig	2021-12-01 00:46:39 UTC
-+++ include/libunwind-aarch64.h
-@@ -226,15 +226,24 @@ typedef struct
- #else
- /* On AArch64, we can directly use ucontext_t as the unwind context.  */
- typedef ucontext_t unw_tdep_context_t;
-+#if defined(__FreeBSD__)
-+typedef ucontext_t unw_fpsimd_context_t;
- #endif
-+#endif
- 
- 
- #include "libunwind-common.h"
- #include "libunwind-dynamic.h"
- 
-+#if defined(__FreeBSD__)
-+#define UNW_BASE register uint64_t unw_base __asm__ ("x0") = (uint64_t) unw_ctx->uc_mcontext.mc_gpregs.gp_x[0];
-+#else
-+#define UNW_BASE register uint64_t unw_base __asm__ ("x0") = (uint64_t) unw_ctx->uc_mcontext.regs;
-+#endif
-+
- #define unw_tdep_getcontext(uc) ({					\
-   unw_tdep_context_t *unw_ctx = (uc);					\
--  register uint64_t unw_base __asm__ ("x0") = (uint64_t) unw_ctx->uc_mcontext.regs; \
-+  UNW_BASE \
-   __asm__ __volatile__ (					        \
-      "stp x0, x1, [%[base], #0]\n" \
-      "stp x2, x3, [%[base], #16]\n" \
---- src/aarch64/Ginit.c.orig	2021-11-30 17:12:31 UTC
-+++ src/aarch64/Ginit.c
-@@ -47,9 +47,17 @@ static inline void *
- uc_addr (unw_tdep_context_t *uc, int reg)
- {
-   if (reg >= UNW_AARCH64_X0 && reg < UNW_AARCH64_V0)
-+#if defined(__FreeBSD__)
-+    return &uc->uc_mcontext.mc_gpregs.gp_x[reg];
-+#else
-     return &uc->uc_mcontext.regs[reg];
-+#endif
-   else if (reg >= UNW_AARCH64_V0 && reg <= UNW_AARCH64_V31)
-+#if defined(__FreeBSD__)
-+    return &GET_FPCTX(uc)->uc_mcontext.mc_fpregs.fp_q[reg - UNW_AARCH64_V0];
-+#else
-     return &GET_FPCTX(uc)->vregs[reg - UNW_AARCH64_V0];
-+#endif
-   else
-     return NULL;
- }
---- src/aarch64/unwind_i.h.orig	2020-04-28 15:49:14 UTC
-+++ src/aarch64/unwind_i.h
-@@ -59,6 +59,10 @@ extern int aarch64_local_resume (unw_addr_space_t as, 
-   } while (0)
- #endif
- 
-+#if defined(__FreeBSD__)
-+#define GET_FPCTX(uc) ((unw_tdep_context_t *)(&uc->uc_mcontext.mc_spare))
-+#else
- #define GET_FPCTX(uc) ((unw_fpsimd_context_t *)(&uc->uc_mcontext.__reserved))
-+#endif
- 
- #endif /* unwind_i_h */
diff --git a/devel/libunwind/files/patch-bug-269875 b/devel/libunwind/files/patch-bug-269875
deleted file mode 100644
index 6655731e6c4b..000000000000
--- a/devel/libunwind/files/patch-bug-269875
+++ /dev/null
@@ -1,310 +0,0 @@
-Obtained from:	https://github.com/libunwind/libunwind/commit/400b3f819ad44ff4e15487b163cc3613389cb4c8
-
---- include/dwarf.h.orig	2021-12-01 00:46:39 UTC
-+++ include/dwarf.h
-@@ -231,6 +231,7 @@ typedef enum
-     DWARF_WHERE_REG,            /* register saved in another register */
-     DWARF_WHERE_EXPR,           /* register saved */
-     DWARF_WHERE_VAL_EXPR,       /* register has computed value */
-+    DWARF_WHERE_CFA,            /* register is set to the computed cfa value */
-   }
- dwarf_where_t;
- 
-@@ -313,7 +314,7 @@ typedef struct dwarf_cursor
-     void *as_arg;               /* argument to address-space callbacks */
-     unw_addr_space_t as;        /* reference to per-address-space info */
- 
--    unw_word_t cfa;     /* canonical frame address; aka frame-/stack-pointer */
-+    unw_word_t cfa;     /* canonical frame address; aka frame-pointer */
-     unw_word_t ip;              /* instruction pointer */
-     unw_word_t args_size;       /* size of arguments */
-     unw_word_t eh_args[UNW_TDEP_NUM_EH_REGS];
---- include/libunwind_i.h.orig	2021-12-01 00:46:39 UTC
-+++ include/libunwind_i.h
-@@ -346,6 +346,10 @@ static inline void invalidate_edi (struct elf_dyn_info
- 
- #include "tdep/libunwind_i.h"
- 
-+#ifndef TDEP_DWARF_SP
-+#define TDEP_DWARF_SP UNW_TDEP_SP
-+#endif
-+
- #ifndef tdep_get_func_addr
- # define tdep_get_func_addr(as,addr,v)          (*(v) = addr, 0)
- #endif
---- include/tdep-x86/dwarf-config.h.orig	2021-12-01 00:46:39 UTC
-+++ include/tdep-x86/dwarf-config.h
-@@ -43,9 +43,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
- typedef struct dwarf_loc
-   {
-     unw_word_t val;
--#ifndef UNW_LOCAL_ONLY
-     unw_word_t type;            /* see X86_LOC_TYPE_* macros.  */
--#endif
-   }
- dwarf_loc_t;
- 
---- include/tdep-x86/libunwind_i.h.orig	2021-12-01 00:46:39 UTC
-+++ include/tdep-x86/libunwind_i.h
-@@ -84,15 +84,26 @@ dwarf_get_uc(const struct dwarf_cursor *cursor)
- }
- 
- #define DWARF_GET_LOC(l)        ((l).val)
-+# define DWARF_LOC_TYPE_MEM     (0 << 0)
-+# define DWARF_LOC_TYPE_FP      (1 << 0)
-+# define DWARF_LOC_TYPE_REG     (1 << 1)
-+# define DWARF_LOC_TYPE_VAL     (1 << 2)
- 
--#ifdef UNW_LOCAL_ONLY
-+# define DWARF_IS_REG_LOC(l)    (((l).type & DWARF_LOC_TYPE_REG) != 0)
-+# define DWARF_IS_FP_LOC(l)     (((l).type & DWARF_LOC_TYPE_FP) != 0)
-+# define DWARF_IS_MEM_LOC(l)    ((l).type == DWARF_LOC_TYPE_MEM)
-+# define DWARF_IS_VAL_LOC(l)    (((l).type & DWARF_LOC_TYPE_VAL) != 0)
-+
-+# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r), .type = (t) })
- # define DWARF_NULL_LOC         DWARF_LOC (0, 0)
--# define DWARF_IS_NULL_LOC(l)   (DWARF_GET_LOC (l) == 0)
--# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r) })
--# define DWARF_IS_REG_LOC(l)    0
-+# define DWARF_IS_NULL_LOC(l)                                           \
-+                ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
-+# define DWARF_VAL_LOC(c,v)     DWARF_LOC ((v), DWARF_LOC_TYPE_VAL)
-+# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), DWARF_LOC_TYPE_MEM)
-+
-+#ifdef UNW_LOCAL_ONLY
- # define DWARF_REG_LOC(c,r)     (DWARF_LOC((unw_word_t)                      \
-                                  tdep_uc_addr(dwarf_get_uc(c), (r)), 0))
--# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
- # define DWARF_FPREG_LOC(c,r)   (DWARF_LOC((unw_word_t)                      \
-                                  tdep_uc_addr(dwarf_get_uc(c), (r)), 0))
- 
-@@ -114,35 +125,8 @@ dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, 
-   return 0;
- }
- 
--static inline int
--dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
--{
--  if (!DWARF_GET_LOC (loc))
--    return -1;
--  return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
--                                   0, c->as_arg);
--}
--
--static inline int
--dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
--{
--  if (!DWARF_GET_LOC (loc))
--    return -1;
--  return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
--                                   1, c->as_arg);
--}
--
- #else /* !UNW_LOCAL_ONLY */
--# define DWARF_LOC_TYPE_FP      (1 << 0)
--# define DWARF_LOC_TYPE_REG     (1 << 1)
--# define DWARF_NULL_LOC         DWARF_LOC (0, 0)
--# define DWARF_IS_NULL_LOC(l)                                           \
--                ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
--# define DWARF_LOC(r, t)        ((dwarf_loc_t) { .val = (r), .type = (t) })
--# define DWARF_IS_REG_LOC(l)    (((l).type & DWARF_LOC_TYPE_REG) != 0)
--# define DWARF_IS_FP_LOC(l)     (((l).type & DWARF_LOC_TYPE_FP) != 0)
- # define DWARF_REG_LOC(c,r)     DWARF_LOC((r), DWARF_LOC_TYPE_REG)
--# define DWARF_MEM_LOC(c,m)     DWARF_LOC ((m), 0)
- # define DWARF_FPREG_LOC(c,r)   DWARF_LOC((r), (DWARF_LOC_TYPE_REG      \
-                                                 | DWARF_LOC_TYPE_FP))
- 
-@@ -192,38 +176,33 @@ dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, 
-                                    1, c->as_arg);
- }
- 
-+#endif /* !UNW_LOCAL_ONLY */
-+
- static inline int
- dwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
- {
-   if (DWARF_IS_NULL_LOC (loc))
-     return -UNW_EBADREG;
- 
--  /* If a code-generator were to save a value of type unw_word_t in a
--     floating-point register, we would have to support this case.  I
--     suppose it could happen with MMX registers, but does it really
--     happen?  */
--  assert (!DWARF_IS_FP_LOC (loc));
--
-   if (DWARF_IS_REG_LOC (loc))
-     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
-                                      0, c->as_arg);
--  else
-+  if (DWARF_IS_MEM_LOC (loc))
-     return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
-                                      0, c->as_arg);
-+  assert(DWARF_IS_VAL_LOC (loc));
-+  *val = DWARF_GET_LOC (loc);
-+  return 0;
- }
- 
- static inline int
- dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
- {
-+  assert(!DWARF_IS_VAL_LOC (loc));
-+
-   if (DWARF_IS_NULL_LOC (loc))
-     return -UNW_EBADREG;
- 
--  /* If a code-generator were to save a value of type unw_word_t in a
--     floating-point register, we would have to support this case.  I
--     suppose it could happen with MMX registers, but does it really
--     happen?  */
--  assert (!DWARF_IS_FP_LOC (loc));
--
-   if (DWARF_IS_REG_LOC (loc))
-     return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
-                                      1, c->as_arg);
-@@ -232,7 +211,9 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, un
-                                      1, c->as_arg);
- }
- 
--#endif /* !UNW_LOCAL_ONLY */
-+// For historical reasons, the DWARF numbering does not match the libunwind
-+// numbering, necessitating this override
-+#define TDEP_DWARF_SP 4
- 
- #define tdep_getcontext_trace           unw_getcontext
- #define tdep_init_done                  UNW_OBJ(init_done)
---- src/dwarf/Gparser.c.orig	2021-12-01 00:46:39 UTC
-+++ src/dwarf/Gparser.c
-@@ -508,6 +508,9 @@ setup_fde (struct dwarf_cursor *c, dwarf_state_record_
-   for (i = 0; i < DWARF_NUM_PRESERVED_REGS + 2; ++i)
-     set_reg (sr, i, DWARF_WHERE_SAME, 0);
- 
-+  // SP defaults to CFA (but is overridable)
-+  set_reg (sr, TDEP_DWARF_SP, DWARF_WHERE_CFA, 0);
-+
-   struct dwarf_cie_info *dci = c->pi.unwind_info;
-   sr->rs_current.ret_addr_column  = dci->ret_addr_column;
-   unw_word_t addr = dci->cie_instr_start;
-@@ -792,14 +795,14 @@ apply_reg_state (struct dwarf_cursor *c, struct dwarf_
-       /* As a special-case, if the stack-pointer is the CFA and the
-          stack-pointer wasn't saved, popping the CFA implicitly pops
-          the stack-pointer as well.  */
--      if ((rs->reg.val[DWARF_CFA_REG_COLUMN] == UNW_TDEP_SP)
--          && (UNW_TDEP_SP < ARRAY_SIZE(rs->reg.val))
--          && (rs->reg.where[UNW_TDEP_SP] == DWARF_WHERE_SAME))
-+      if ((rs->reg.val[DWARF_CFA_REG_COLUMN] == TDEP_DWARF_SP)
-+          && (TDEP_DWARF_SP < ARRAY_SIZE(rs->reg.val))
-+          && (DWARF_IS_NULL_LOC(c->loc[TDEP_DWARF_SP])))
-           cfa = c->cfa;
-       else
-         {
-           regnum = dwarf_to_unw_regnum (rs->reg.val[DWARF_CFA_REG_COLUMN]);
--          if ((ret = unw_get_reg ((unw_cursor_t *) c, regnum, &cfa)) < 0)
-+          if ((ret = unw_get_reg (dwarf_to_cursor(c), regnum, &cfa)) < 0)
-             return ret;
-         }
-       cfa += rs->reg.val[DWARF_CFA_OFF_COLUMN];
-@@ -834,6 +837,10 @@ apply_reg_state (struct dwarf_cursor *c, struct dwarf_
-           break;
- 
-         case DWARF_WHERE_SAME:
-+          break;
-+
-+        case DWARF_WHERE_CFA:
-+          new_loc[i] = DWARF_VAL_LOC (c, cfa);
-           break;
- 
-         case DWARF_WHERE_CFAREL:
---- src/x86/Gos-freebsd.c.orig	2021-12-01 00:46:39 UTC
-+++ src/x86/Gos-freebsd.c
-@@ -138,6 +138,7 @@ x86_handle_signal_frame (unw_cursor_t *cursor)
-     c->dwarf.loc[ST0] = DWARF_NULL_LOC;
-   } else if (c->sigcontext_format == X86_SCF_FREEBSD_SYSCALL) {
-     c->dwarf.loc[EIP] = DWARF_LOC (c->dwarf.cfa, 0);
-+    c->dwarf.loc[ESP] = DWARF_VAL_LOC (c, c->dwarf.cfa + 4);
-     c->dwarf.loc[EAX] = DWARF_NULL_LOC;
-     c->dwarf.cfa += 4;
-     c->dwarf.use_prev_instr = 1;
---- src/x86/Gregs.c.orig	2021-12-01 00:46:39 UTC
-+++ src/x86/Gregs.c
-@@ -53,7 +53,6 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, u
-       break;
- 
-     case UNW_X86_CFA:
--    case UNW_X86_ESP:
-       if (write)
-         return -UNW_EREADONLYREG;
-       *valp = c->dwarf.cfa;
-@@ -81,6 +80,7 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, u
-     case UNW_X86_ECX: loc = c->dwarf.loc[ECX]; break;
-     case UNW_X86_EBX: loc = c->dwarf.loc[EBX]; break;
- 
-+    case UNW_X86_ESP: loc = c->dwarf.loc[ESP]; break;
-     case UNW_X86_EBP: loc = c->dwarf.loc[EBP]; break;
-     case UNW_X86_ESI: loc = c->dwarf.loc[ESI]; break;
-     case UNW_X86_EDI: loc = c->dwarf.loc[EDI]; break;
---- src/x86/Gstep.c.orig	2021-12-01 00:46:39 UTC
-+++ src/x86/Gstep.c
-@@ -47,7 +47,7 @@ unw_step (unw_cursor_t *cursor)
-     {
-       /* DWARF failed, let's see if we can follow the frame-chain
-          or skip over the signal trampoline.  */
--      struct dwarf_loc ebp_loc, eip_loc;
-+      struct dwarf_loc ebp_loc, eip_loc, esp_loc;
- 
-       /* We could get here because of missing/bad unwind information.
-          Validate all addresses before dereferencing. */
-@@ -77,6 +77,7 @@ unw_step (unw_cursor_t *cursor)
-                  c->dwarf.cfa);
- 
-           ebp_loc = DWARF_LOC (c->dwarf.cfa, 0);
-+          esp_loc = DWARF_VAL_LOC (c, c->dwarf.cfa + 8);
-           eip_loc = DWARF_LOC (c->dwarf.cfa + 4, 0);
-           c->dwarf.cfa += 8;
- 
-@@ -87,6 +88,7 @@ unw_step (unw_cursor_t *cursor)
-             c->dwarf.loc[i] = DWARF_NULL_LOC;
- 
-           c->dwarf.loc[EBP] = ebp_loc;
-+          c->dwarf.loc[ESP] = esp_loc;
-           c->dwarf.loc[EIP] = eip_loc;
-           c->dwarf.use_prev_instr = 1;
-         }
---- src/x86_64/Gos-freebsd.c.orig	2021-12-01 00:46:39 UTC
-+++ src/x86_64/Gos-freebsd.c
-@@ -133,6 +133,7 @@ x86_64_handle_signal_frame (unw_cursor_t *cursor)
-     c->dwarf.loc[RCX] = c->dwarf.loc[R10];
-     /*  rsp_loc = DWARF_LOC(c->dwarf.cfa - 8, 0);       */
-     /*  rbp_loc = c->dwarf.loc[RBP];                    */
-+    c->dwarf.loc[RSP] = DWARF_VAL_LOC (c, c->dwarf.cfa + 8);
-     c->dwarf.loc[RIP] = DWARF_LOC (c->dwarf.cfa, 0);
-     ret = dwarf_get (&c->dwarf, c->dwarf.loc[RIP], &c->dwarf.ip);
-     Debug (1, "Frame Chain [RIP=0x%Lx] = 0x%Lx\n",
---- src/x86_64/Gregs.c.orig	2021-12-01 00:46:39 UTC
-+++ src/x86_64/Gregs.c
-@@ -79,7 +79,6 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, u
-       break;
- 
-     case UNW_X86_64_CFA:
--    case UNW_X86_64_RSP:
-       if (write)
-         return -UNW_EREADONLYREG;
-       *valp = c->dwarf.cfa;
-@@ -107,6 +106,7 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, u
-     case UNW_X86_64_RCX: loc = c->dwarf.loc[RCX]; break;
-     case UNW_X86_64_RBX: loc = c->dwarf.loc[RBX]; break;
- 
-+    case UNW_X86_64_RSP: loc = c->dwarf.loc[RSP]; break;
-     case UNW_X86_64_RBP: loc = c->dwarf.loc[RBP]; break;
-     case UNW_X86_64_RSI: loc = c->dwarf.loc[RSI]; break;
-     case UNW_X86_64_RDI: loc = c->dwarf.loc[RDI]; break;
---- src/x86_64/Gstep.c.orig	2021-12-01 00:46:39 UTC
-+++ src/x86_64/Gstep.c
-@@ -223,7 +223,7 @@ unw_step (unw_cursor_t *cursor)
-                   Debug (2, "RIP fixup didn't work, falling back\n");
-                   unw_word_t rbp1 = 0;
-                   rbp_loc = DWARF_LOC(rbp, 0);
--                  rsp_loc = DWARF_NULL_LOC;
-+                  rsp_loc = DWARF_VAL_LOC(c, rbp + 16);
-                   rip_loc = DWARF_LOC (rbp + 8, 0);
-                   ret = dwarf_get (&c->dwarf, rbp_loc, &rbp1);
-                   Debug (1, "[RBP=0x%lx] = 0x%lx (cfa = 0x%lx) -> 0x%lx\n",
diff --git a/devel/libunwind/files/patch-i386 b/devel/libunwind/files/patch-i386
new file mode 100644
index 000000000000..86f24c8417ab
--- /dev/null
+++ b/devel/libunwind/files/patch-i386
@@ -0,0 +1,13 @@
+Reference:	https://github.com/libunwind/libunwind/pull/645
+		https://github.com/libunwind/libunwind/commit/24dc3b0880695137a48c2ad0244900f9bb8416eb
+
+--- src/x86/Gos-freebsd.c.orig	2023-07-30 11:32:29 UTC
++++ src/x86/Gos-freebsd.c
+@@ -111,6 +111,7 @@ x86_handle_signal_frame (unw_cursor_t *cursor)
+     struct sigframe *sf;
+     uintptr_t uc_addr;
+     struct dwarf_loc esp_loc;
++    int i;
+ 
+     sf = (struct sigframe *)c->dwarf.cfa;
+     uc_addr = (uintptr_t)&(sf->sf_uc);
diff --git a/devel/libunwind/pkg-plist b/devel/libunwind/pkg-plist
index 73e648228c4a..f2e8304ce292 100644
--- a/devel/libunwind/pkg-plist
+++ b/devel/libunwind/pkg-plist
@@ -1,9 +1,13 @@
+include/libunwind-%%ARCH%%.h
 include/libunwind-common.h
 %%COREDUMP%%include/libunwind-coredump.h
 include/libunwind-dynamic.h
 include/libunwind-ptrace.h
-include/libunwind-%%ARCH%%.h
 include/libunwind.h
+lib/libunwind-%%ARCH%%.a
+lib/libunwind-%%ARCH%%.so
+lib/libunwind-%%ARCH%%.so.8
+lib/libunwind-%%ARCH%%.so.8.0.1
 %%COREDUMP%%lib/libunwind-coredump.a
 %%COREDUMP%%lib/libunwind-coredump.so
 %%COREDUMP%%lib/libunwind-coredump.so.0
@@ -18,10 +22,6 @@ lib/libunwind-setjmp.a
 lib/libunwind-setjmp.so
 lib/libunwind-setjmp.so.0
 lib/libunwind-setjmp.so.0.0.0
-lib/libunwind-%%ARCH%%.a
-lib/libunwind-%%ARCH%%.so
-lib/libunwind-%%ARCH%%.so.8
-lib/libunwind-%%ARCH%%.so.8.0.1
 lib/libunwind.a
 lib/libunwind.so
 lib/libunwind.so.8
@@ -47,7 +47,9 @@ man/man3/unw_get_accessors.3.gz
 man/man3/unw_get_fpreg.3.gz
 man/man3/unw_get_proc_info.3.gz
 man/man3/unw_get_proc_info_by_ip.3.gz
+man/man3/unw_get_proc_info_in_range.3.gz
 man/man3/unw_get_proc_name.3.gz
+man/man3/unw_get_proc_name_by_ip.3.gz
 man/man3/unw_get_reg.3.gz
 man/man3/unw_getcontext.3.gz
 man/man3/unw_init_local.3.gz