Skip to content

Commit

Permalink
Update libunwind to v1.5.0
Browse files Browse the repository at this point in the history
nongnu libunwind, not LLVM libunwind, so this only affects Linux and
FreeBSD
  • Loading branch information
ararslan committed Nov 6, 2021
1 parent 653cad3 commit eb4a58b
Show file tree
Hide file tree
Showing 6 changed files with 222 additions and 150 deletions.
4 changes: 2 additions & 2 deletions deps/Versions.make
Original file line number Diff line number Diff line change
Expand Up @@ -104,9 +104,9 @@ LIBSUITESPARSE_VER := 5.10.1
LIBSUITESPARSE_JLL_NAME := SuiteSparse

# unwind
UNWIND_VER := 1.3.2
UNWIND_VER := 1.5.0
UNWIND_JLL_NAME := LibUnwind
UNWIND_JLL_VER := 1.3.2+4
UNWIND_JLL_VER := 1.5.0+1

# zlib
ZLIB_VER := 1.2.11
Expand Down
52 changes: 26 additions & 26 deletions deps/checksums/unwind
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
LibUnwind.v1.3.2+4.aarch64-linux-gnu.tar.gz/md5/8f5cbf9820033211513f6d33e36194f1
LibUnwind.v1.3.2+4.aarch64-linux-gnu.tar.gz/sha512/589886c4f141064126aecc1bf63365c610a4c3dd70e386aa8e17ce562505cac873542fa92cea023850e9bf54fcef3cf475d52f035d17d830a81c01d06d0454e4
LibUnwind.v1.3.2+4.aarch64-linux-musl.tar.gz/md5/836a2d8ea7a11d87a74aee09f82582b5
LibUnwind.v1.3.2+4.aarch64-linux-musl.tar.gz/sha512/4cd3805ae59854fdceee441967ba4b812246cf1a1e9ed20367f5bbbad9a47f0093731b4f78f881c696e52c101dec83498398c7b798c81c1a441232cd4ee96b58
LibUnwind.v1.3.2+4.armv6l-linux-gnueabihf.tar.gz/md5/0047d02c4b4888050b363c77106d4ea1
LibUnwind.v1.3.2+4.armv6l-linux-gnueabihf.tar.gz/sha512/8b02fb5189ca749e421fc17d560601e8624cbcc19a4c5c45e38828323b33db30ced8a92e08ebd429c663e52358c486d3e284e7e04898229cff2839cc01c067d5
LibUnwind.v1.3.2+4.armv6l-linux-musleabihf.tar.gz/md5/1fe78c6f0ff7120b35c6745b16c6f838
LibUnwind.v1.3.2+4.armv6l-linux-musleabihf.tar.gz/sha512/9576f913fbc40d00b42573f600c038fea85eb3c9b88a4878cff0e041c4096d9d005b856dbcd0d057dc40a3cdb74deeca6e9c1cc5c213e6e062328f75633ba8e3
LibUnwind.v1.3.2+4.armv7l-linux-gnueabihf.tar.gz/md5/510db51b0364cf17207eb00e44d58974
LibUnwind.v1.3.2+4.armv7l-linux-gnueabihf.tar.gz/sha512/76f119654a65b460917f41a321008c5a0593523db53fa12ac9aa82732368ebdee05d6366fdfdcdd300ba0fe4c7239aac25d80fb3b1ad0235f79b235dab68c796
LibUnwind.v1.3.2+4.armv7l-linux-musleabihf.tar.gz/md5/4bb58bdc423312c74eafe52a781dd712
LibUnwind.v1.3.2+4.armv7l-linux-musleabihf.tar.gz/sha512/02b69ec40dfcacc447169786bab3aac39c6db6b07874e9657c49a2907654be79efe16863abf09ee1e2a647cd6a651155b65bdbbd6d810a3ceaa332fc0a3ace4b
LibUnwind.v1.3.2+4.i686-linux-gnu.tar.gz/md5/76f549ae171aad91570d7874e73f44f6
LibUnwind.v1.3.2+4.i686-linux-gnu.tar.gz/sha512/a5a654dd6233099e841d1b9c54b16cb99d736549d063e28d17d5f2014c3090d829a4a8dc4fee042d0f4a9d8a155fb30c5840cb84b9fd71758256fa072137baad
LibUnwind.v1.3.2+4.i686-linux-musl.tar.gz/md5/f8b58f061a03f24111f39f2f8cf72c61
LibUnwind.v1.3.2+4.i686-linux-musl.tar.gz/sha512/cc6dedc551ee4d5e131cdd7ea7dd4a9cc64efe930d16cddb0c21dca7b13076b6810e00e406acb949404c80b506ca9e09d1e223069d8159e9f73fa8aa022e3f41
LibUnwind.v1.3.2+4.powerpc64le-linux-gnu.tar.gz/md5/2fd4fda3c82c99ff102b630d078723f5
LibUnwind.v1.3.2+4.powerpc64le-linux-gnu.tar.gz/sha512/b1c7f16d2877e08cfc9d1aa63c5c9acf30049bd11bdad90c6b1425a09f86762c76f0c1a27817ea1b939244f6e24320854552bc860c95f297a772403eeddc053d
LibUnwind.v1.3.2+4.x86_64-linux-gnu.tar.gz/md5/cd98359922fddcbbcfda56fbc011bea4
LibUnwind.v1.3.2+4.x86_64-linux-gnu.tar.gz/sha512/7b2d78869be148db23ab8372bb6699abcf26cc58718871f050b8e67054c0c6c909f9a8c59d27c748abeef0ecb5eabc09484043c3b2232469d03c78a42a590e13
LibUnwind.v1.3.2+4.x86_64-linux-musl.tar.gz/md5/bd8ea5006d6078a1d91743f599f37732
LibUnwind.v1.3.2+4.x86_64-linux-musl.tar.gz/sha512/1c7feea46d70c60dbecfe6b945a29a086dc120e0d674ea9d488dc7943901711ba0505288694c94a2b0804bab6cd826b32e58912e407ed918724d16b6b6ec1d3d
LibUnwind.v1.3.2+4.x86_64-unknown-freebsd.tar.gz/md5/e72c36f0563a088282147275de90048b
LibUnwind.v1.3.2+4.x86_64-unknown-freebsd.tar.gz/sha512/3aaa7e5c21b3bcc30ff7826af4bc0b926865cac3a5b14dfa7f27f0c5d4344fa2a568a78c0c4ee32a18e668758cdac70c09f31f5ca55cc56c3d6a88654aa906fa
libunwind-1.3.2.tar.gz/md5/52a8be39f0d6fd4efb7409973e425fa8
libunwind-1.3.2.tar.gz/sha512/221864eae6bf0fde281d9551662af1e539ce919fbb7050947e60dbcc09efed4f5d34574dbce11792513e63151e0af72f02801b7bcd37a6a519e6d868abb8b509
LibUnwind.v1.5.0+1.aarch64-linux-gnu.tar.gz/md5/4f27fbe5a0e0897d75e3690e2f24c10b
LibUnwind.v1.5.0+1.aarch64-linux-gnu.tar.gz/sha512/fad4ac07121823859bf6af322c0d3b52b353b1e7b2a12611dc14bfc18663fc4278a4eab61653b306bf07abfff8dc92ef07d55b24117d8ccc5a8662139b5301a1
LibUnwind.v1.5.0+1.aarch64-linux-musl.tar.gz/md5/730455d3e334b61e9232f978a5ba9841
LibUnwind.v1.5.0+1.aarch64-linux-musl.tar.gz/sha512/64a04b6d362774c5dc9534a49b58ea676cb514fc10ce0747cd79d5319841e9b0695701c631a2598499d2fa888d36a89f0560f7910d01fa4c7e2fc223a2143a8d
LibUnwind.v1.5.0+1.armv6l-linux-gnueabihf.tar.gz/md5/e335c0eb5fd97e870400f472ed163722
LibUnwind.v1.5.0+1.armv6l-linux-gnueabihf.tar.gz/sha512/4211fa7a4a08631a335a327cda511272527ff590507819dc9ee89ec1db7a7603c1ce9dcfcb22950acb4246fef297493eccd5260fb76d9929c84cc9c755381849
LibUnwind.v1.5.0+1.armv6l-linux-musleabihf.tar.gz/md5/d8b094c08d496b45cf5e4f6f964caa43
LibUnwind.v1.5.0+1.armv6l-linux-musleabihf.tar.gz/sha512/0fe159785b8f35ae5b8301754ed244f687156a9565fe2d6d6c72e8b4e0c04c26183079b69093ab4fec9de4bd8b69d248a1569d8fc539ef04787ed09d36e41bdd
LibUnwind.v1.5.0+1.armv7l-linux-gnueabihf.tar.gz/md5/55289aa21e11f8fa3867dd650f863b2d
LibUnwind.v1.5.0+1.armv7l-linux-gnueabihf.tar.gz/sha512/e669616bc1be3b34552b9927279e0b43df1e5ab0e72659a9e128d894df6b46d10f7d72b30eb5ad3355f01776a5f5250195633b846747fdbaefd2ac69915157fc
LibUnwind.v1.5.0+1.armv7l-linux-musleabihf.tar.gz/md5/5a99cca618b56961b7108c618f8704c4
LibUnwind.v1.5.0+1.armv7l-linux-musleabihf.tar.gz/sha512/7465262f611ff347fa57a910019e4a243451d801edf1fd9bb19a5f2ab9e9b84885da26781af18c1405347918e74b21b4f0a308d938cd3198b6260e0df8b5bc6b
LibUnwind.v1.5.0+1.i686-linux-gnu.tar.gz/md5/bd52e05f513c8b86d8b71a9f833bde57
LibUnwind.v1.5.0+1.i686-linux-gnu.tar.gz/sha512/750a082730c35b11cc1745a05e140bd83fd7511560ac90e15b472383b60b4641285b959a1a0897e2c6cb6bbf3857497ef7164642bfc79660c9c681cda189f530
LibUnwind.v1.5.0+1.i686-linux-musl.tar.gz/md5/41482181efe7218a6aae785b76ad4d62
LibUnwind.v1.5.0+1.i686-linux-musl.tar.gz/sha512/e1212ecc9efe16fc7401b1abafd3ab55c435a868e9a5408a4d9ca0039c4c422fb635314ae8d69913d4699a52ae070dc12db9cbb95d18f6e4fa41dd5047b22049
LibUnwind.v1.5.0+1.powerpc64le-linux-gnu.tar.gz/md5/fa9dafea4ad00266188a310294b9342e
LibUnwind.v1.5.0+1.powerpc64le-linux-gnu.tar.gz/sha512/d90370601804b477f588fbeba549a197150fc080ccee112b0e93a00393d03b7908a5f8ceed1a33c6ea8860c0f88c0d1e05a676336c948897f518d6130c480f5e
LibUnwind.v1.5.0+1.x86_64-linux-gnu.tar.gz/md5/57b35a4b10407daf0e06c32acb942c0f
LibUnwind.v1.5.0+1.x86_64-linux-gnu.tar.gz/sha512/0ab66f46a0b947c29d9ac76b1b10591435a9098e1a93b99eb64444c9fabd97439764a0fd1483ee5e26c2f617ca97d3929184bcbb9f1f2778ad109a9fb07d2daa
LibUnwind.v1.5.0+1.x86_64-linux-musl.tar.gz/md5/7116a5228632a6f96bfc979d72ad530d
LibUnwind.v1.5.0+1.x86_64-linux-musl.tar.gz/sha512/20c18da77864985ba8bb0a5857c23b807730de354d2fd0504b627e53a2d8763a72c2ebb5ac8bb7615f4a66a27937c12e89619489893b4ee17c3fea8acd12c704
LibUnwind.v1.5.0+1.x86_64-unknown-freebsd.tar.gz/md5/79bb8128f52068faf1cb8e82f39272dc
LibUnwind.v1.5.0+1.x86_64-unknown-freebsd.tar.gz/sha512/c60a09be8d945d7309e219e830f7cebcb11b7924b9d98ea4b0a93730ed4c2eda846bd0f043cdb225c86cc576d5708fd4f4fbe1324c7b71e47a02ae1d42c7e47f
libunwind-1.5.0.tar.gz/md5/c6923dda0675f6a4ef21426164dc8b6a
libunwind-1.5.0.tar.gz/sha512/1df20ca7a8cee2f2e61294fa9b677e88fec52e9d5a329f88d05c2671c69fa462f6c18808c97ca9ff664ef57292537a844f00b18d142b1938c9da701ca95a4bab
163 changes: 69 additions & 94 deletions deps/patches/libunwind-cfa-rsp.patch
Original file line number Diff line number Diff line change
@@ -1,42 +1,54 @@
commit c71298423c26b2143dc6f6ce554ec910ed882f8a
Author: Keno Fischer <keno@juliacomputing.com>
Date: Sat Feb 6 18:13:16 2021 -0500
From 8c8c78e2db09c5dc66ad0188a088b1664483a13f Mon Sep 17 00:00:00 2001
From: Keno Fischer <keno@juliacomputing.com>
Date: Sun, 29 Aug 2021 11:07:54 -0700
Subject: [PATCH] x86_64: Stop aliasing RSP and CFA

x86_64: Stop aliasing RSP and CFA

RSP and CFA are different concepts. RSP refers to the physical
register, CFA is a virtual register that serves as the base
address for various other saved registers. It is true that
in many frames these are set to alias, however this is not
a requirement. For example, a function that performs a stack
switch would likely change the rsp in the middle of the function,
but would keep the CFA at the original RSP such that saved registers
may be appropriately recovered.

We are seeing incorrect unwinds in the Julia runtime when running
julia under rr. This is because injects code (with correct CFI)
that performs just such a stack switch [1]. GDB manages to unwind
this correctly, but libunwind incorrectly sets the rsp to the CFA
address, causing a misunwind.

Tested on x86_64, patches for other architectures are ported, but
not tested.

[1] https://github.com/rr-debugger/rr/blob/469c22059a4a1798d33a8a224457faf22b2c178c/src/preload/syscall_hook.S#L454
RSP and CFA are different concepts. RSP refers to the physical
register, CFA is a virtual register that serves as the base
address for various other saved registers. It is true that
in many frames these are set to alias, however this is not
a requirement. For example, a function that performs a stack
switch would likely change the rsp in the middle of the function,
but would keep the CFA at the original RSP such that saved registers
may be appropriately recovered.

We are seeing incorrect unwinds in the Julia runtime when running
julia under rr. This is because injects code (with correct CFI)
that performs just such a stack switch [1]. GDB manages to unwind
this correctly, but libunwind incorrectly sets the rsp to the CFA
address, causing a misunwind.

Tested on x86_64, patches for other architectures are ported, but
not tested.

[1] https://github.com/rr-debugger/rr/blob/469c22059a4a1798d33a8a224457faf22b2c178c/src/preload/syscall_hook.S#L454
---
include/dwarf.h | 3 +-
include/libunwind_i.h | 4 ++
include/tdep-x86/dwarf-config.h | 2 -
include/tdep-x86/libunwind_i.h | 73 ++++++++++++---------------------
src/dwarf/Gparser.c | 15 +++++--
src/x86/Gos-freebsd.c | 1 +
src/x86/Gregs.c | 2 +-
src/x86/Gstep.c | 4 +-
src/x86_64/Gos-freebsd.c | 1 +
src/x86_64/Gregs.c | 2 +-
src/x86_64/Gstep.c | 2 +-
11 files changed, 52 insertions(+), 57 deletions(-)

diff --git a/include/dwarf.h b/include/dwarf.h
index fab93c61..b845e2eb 100644
index 175c419bb..23ff4c4f6 100644
--- a/include/dwarf.h
+++ b/include/dwarf.h
@@ -227,6 +227,7 @@ typedef enum
@@ -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;

@@ -309,7 +310,7 @@ typedef struct dwarf_cursor
@@ -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 */

Expand All @@ -46,10 +58,10 @@ index fab93c61..b845e2eb 100644
unw_word_t args_size; /* size of arguments */
unw_word_t eh_args[UNW_TDEP_NUM_EH_REGS];
diff --git a/include/libunwind_i.h b/include/libunwind_i.h
index 36cf7a14..dcec1683 100644
index fea5c2607..6c7dda9a8 100644
--- a/include/libunwind_i.h
+++ b/include/libunwind_i.h
@@ -351,6 +351,10 @@ static inline void invalidate_edi (struct elf_dyn_info *edi)
@@ -346,6 +346,10 @@ static inline void invalidate_edi (struct elf_dyn_info *edi)

#include "tdep/libunwind_i.h"

Expand All @@ -61,7 +73,7 @@ index 36cf7a14..dcec1683 100644
# define tdep_get_func_addr(as,addr,v) (*(v) = addr, 0)
#endif
diff --git a/include/tdep-x86/dwarf-config.h b/include/tdep-x86/dwarf-config.h
index f76f9c1c..11398e4e 100644
index f76f9c1c4..11398e4e6 100644
--- a/include/tdep-x86/dwarf-config.h
+++ b/include/tdep-x86/dwarf-config.h
@@ -43,9 +43,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
Expand All @@ -75,21 +87,19 @@ index f76f9c1c..11398e4e 100644
dwarf_loc_t;

diff --git a/include/tdep-x86/libunwind_i.h b/include/tdep-x86/libunwind_i.h
index 5231189a..1b59fe34 100644
index d4c5ccdb1..ad4edc2f5 100644
--- a/include/tdep-x86/libunwind_i.h
+++ b/include/tdep-x86/libunwind_i.h
@@ -88,14 +88,28 @@ dwarf_get_uc(const struct dwarf_cursor *cursor)
@@ -84,15 +84,26 @@ dwarf_get_uc(const struct dwarf_cursor *cursor)
}

#define DWARF_GET_LOC(l) ((l).val)

-#ifdef UNW_LOCAL_ONLY
+
+#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)
Expand All @@ -112,7 +122,7 @@ index 5231189a..1b59fe34 100644
# define DWARF_FPREG_LOC(c,r) (DWARF_LOC((unw_word_t) \
tdep_uc_addr(dwarf_get_uc(c), (r)), 0))

@@ -117,35 +131,8 @@ dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
@@ -114,35 +125,8 @@ dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
return 0;
}

Expand Down Expand Up @@ -148,7 +158,7 @@ index 5231189a..1b59fe34 100644
# define DWARF_FPREG_LOC(c,r) DWARF_LOC((r), (DWARF_LOC_TYPE_REG \
| DWARF_LOC_TYPE_FP))

@@ -195,38 +182,33 @@ dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
@@ -192,38 +176,33 @@ dwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
1, c->as_arg);
}

Expand Down Expand Up @@ -195,7 +205,7 @@ index 5231189a..1b59fe34 100644
if (DWARF_IS_REG_LOC (loc))
return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
1, c->as_arg);
@@ -235,7 +217,9 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
@@ -232,7 +211,9 @@ dwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
1, c->as_arg);
}

Expand All @@ -207,18 +217,10 @@ index 5231189a..1b59fe34 100644
#define tdep_getcontext_trace unw_getcontext
#define tdep_init_done UNW_OBJ(init_done)
diff --git a/src/dwarf/Gparser.c b/src/dwarf/Gparser.c
index 7d255aee..b1308d3c 100644
index da170d4b3..70a62c505 100644
--- a/src/dwarf/Gparser.c
+++ b/src/dwarf/Gparser.c
@@ -28,6 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
#include <stddef.h>
#include <limits.h>

+
#define alloc_reg_state() (mempool_alloc (&dwarf_reg_state_pool))
#define free_reg_state(rs) (mempool_free (&dwarf_reg_state_pool, rs))

@@ -501,6 +502,9 @@ setup_fde (struct dwarf_cursor *c, dwarf_state_record_t *sr)
@@ -508,6 +508,9 @@ setup_fde (struct dwarf_cursor *c, dwarf_state_record_t *sr)
for (i = 0; i < DWARF_NUM_PRESERVED_REGS + 2; ++i)
set_reg (sr, i, DWARF_WHERE_SAME, 0);

Expand All @@ -228,7 +230,7 @@ index 7d255aee..b1308d3c 100644
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;
@@ -785,14 +789,14 @@ apply_reg_state (struct dwarf_cursor *c, struct dwarf_reg_state *rs)
@@ -792,14 +795,14 @@ apply_reg_state (struct dwarf_cursor *c, struct dwarf_reg_state *rs)
/* 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. */
Expand All @@ -247,7 +249,7 @@ index 7d255aee..b1308d3c 100644
return ret;
}
cfa += rs->reg.val[DWARF_CFA_OFF_COLUMN];
@@ -826,6 +830,10 @@ apply_reg_state (struct dwarf_cursor *c, struct dwarf_reg_state *rs)
@@ -836,6 +839,10 @@ apply_reg_state (struct dwarf_cursor *c, struct dwarf_reg_state *rs)
case DWARF_WHERE_SAME:
break;

Expand All @@ -259,7 +261,7 @@ index 7d255aee..b1308d3c 100644
new_loc[i] = DWARF_MEM_LOC (c, cfa + rs->reg.val[i]);
break;
diff --git a/src/x86/Gos-freebsd.c b/src/x86/Gos-freebsd.c
index 7dd01404..1b251d02 100644
index 7dd014046..1b251d027 100644
--- a/src/x86/Gos-freebsd.c
+++ b/src/x86/Gos-freebsd.c
@@ -138,6 +138,7 @@ x86_handle_signal_frame (unw_cursor_t *cursor)
Expand All @@ -271,7 +273,7 @@ index 7dd01404..1b251d02 100644
c->dwarf.cfa += 4;
c->dwarf.use_prev_instr = 1;
diff --git a/src/x86/Gregs.c b/src/x86/Gregs.c
index 4a959261..9446d6c6 100644
index 4a9592617..9446d6c62 100644
--- a/src/x86/Gregs.c
+++ b/src/x86/Gregs.c
@@ -53,7 +53,6 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
Expand All @@ -291,7 +293,7 @@ index 4a959261..9446d6c6 100644
case UNW_X86_ESI: loc = c->dwarf.loc[ESI]; break;
case UNW_X86_EDI: loc = c->dwarf.loc[EDI]; break;
diff --git a/src/x86/Gstep.c b/src/x86/Gstep.c
index 129b739a..061dcbaa 100644
index 129b739a3..061dcbaaa 100644
--- a/src/x86/Gstep.c
+++ b/src/x86/Gstep.c
@@ -47,7 +47,7 @@ unw_step (unw_cursor_t *cursor)
Expand Down Expand Up @@ -319,35 +321,8 @@ index 129b739a..061dcbaa 100644
c->dwarf.loc[EIP] = eip_loc;
c->dwarf.use_prev_instr = 1;
}
diff --git a/src/x86_64/Ginit.c b/src/x86_64/Ginit.c
index b7e8e462..64b800af 100644
--- a/src/x86_64/Ginit.c
+++ b/src/x86_64/Ginit.c
@@ -49,8 +49,6 @@ static struct unw_addr_space local_addr_space;

unw_addr_space_t unw_local_addr_space = &local_addr_space;

-HIDDEN unw_dyn_info_list_t _U_dyn_info_list;
-
/* XXX fix me: there is currently no way to locate the dyn-info list
by a remote unwinder. On ia64, this is done via a special
unwind-table entry. Perhaps something similar can be done with
@@ -66,7 +64,12 @@ static int
get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
void *arg)
{
- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
+#ifndef UNW_LOCAL_ONLY
+# pragma weak _U_dyn_info_list_addr
+ if (!_U_dyn_info_list_addr)
+ return -UNW_ENOINFO;
+#endif
+ *dyn_info_list_addr = _U_dyn_info_list_addr ();
return 0;
}

diff --git a/src/x86_64/Gos-freebsd.c b/src/x86_64/Gos-freebsd.c
index 883025c8..8bb101ea 100644
index 8f28d1d8c..0c5a17940 100644
--- a/src/x86_64/Gos-freebsd.c
+++ b/src/x86_64/Gos-freebsd.c
@@ -133,6 +133,7 @@ x86_64_handle_signal_frame (unw_cursor_t *cursor)
Expand All @@ -359,7 +334,7 @@ index 883025c8..8bb101ea 100644
ret = dwarf_get (&c->dwarf, c->dwarf.loc[RIP], &c->dwarf.ip);
Debug (1, "Frame Chain [RIP=0x%Lx] = 0x%Lx\n",
diff --git a/src/x86_64/Gregs.c b/src/x86_64/Gregs.c
index baf8a24f..dff5bcbe 100644
index baf8a24f0..dff5bcbe7 100644
--- a/src/x86_64/Gregs.c
+++ b/src/x86_64/Gregs.c
@@ -79,7 +79,6 @@ tdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
Expand All @@ -379,15 +354,15 @@ index baf8a24f..dff5bcbe 100644
case UNW_X86_64_RSI: loc = c->dwarf.loc[RSI]; break;
case UNW_X86_64_RDI: loc = c->dwarf.loc[RDI]; break;
diff --git a/src/x86_64/Gstep.c b/src/x86_64/Gstep.c
index 10498170..5425e3db 100644
index 3c5c3830f..fdad298c7 100644
--- a/src/x86_64/Gstep.c
+++ b/src/x86_64/Gstep.c
@@ -160,7 +160,7 @@ unw_step (unw_cursor_t *cursor)
{
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",
@@ -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",
Loading

0 comments on commit eb4a58b

Please sign in to comment.