1*d688a01eSAndrew GeisslerFrom 3690dc5f567906c45f057509305fbaa021b33adb Mon Sep 17 00:00:00 2001 2*d688a01eSAndrew GeisslerFrom: Yichao Yu <yyc1992@gmail.com> 3*d688a01eSAndrew GeisslerDate: Tue, 15 Sep 2020 12:35:46 -0700 4*d688a01eSAndrew GeisslerSubject: [PATCH] Fix compilation with -fno-common. 5*d688a01eSAndrew Geissler 6*d688a01eSAndrew GeisslerMaking all other archs consistent with IA64 which should not have this problem. 7*d688a01eSAndrew GeisslerAlso move the FIXME to the correct place. 8*d688a01eSAndrew Geissler 9*d688a01eSAndrew GeisslerAlso add some minimum comments about this... 10*d688a01eSAndrew Geissler 11*d688a01eSAndrew GeisslerUpstream-Status: Backport [https://github.com/libunwind/libunwind/pull/166/commits/29e17d8d2ccbca07c423e3089a6d5ae8a1c9cb6e] 12*d688a01eSAndrew GeisslerSigned-off-by: Khem Raj <raj.khem@gmail.com> 13*d688a01eSAndrew Geissler--- 14*d688a01eSAndrew Geissler src/third_party/unwind/dist/src/aarch64/Ginit.c | 15 +++++++-------- 15*d688a01eSAndrew Geissler src/third_party/unwind/dist/src/arm/Ginit.c | 15 +++++++-------- 16*d688a01eSAndrew Geissler .../src/coredump/_UPT_get_dyn_info_list_addr.c | 5 +++++ 17*d688a01eSAndrew Geissler src/third_party/unwind/dist/src/hppa/Ginit.c | 15 +++++++-------- 18*d688a01eSAndrew Geissler src/third_party/unwind/dist/src/ia64/Ginit.c | 1 + 19*d688a01eSAndrew Geissler .../unwind/dist/src/mi/Gfind_dynamic_proc_info.c | 1 + 20*d688a01eSAndrew Geissler src/third_party/unwind/dist/src/mips/Ginit.c | 15 +++++++-------- 21*d688a01eSAndrew Geissler src/third_party/unwind/dist/src/ppc32/Ginit.c | 11 +++++++---- 22*d688a01eSAndrew Geissler src/third_party/unwind/dist/src/ppc64/Ginit.c | 11 +++++++---- 23*d688a01eSAndrew Geissler .../dist/src/ptrace/_UPT_get_dyn_info_list_addr.c | 5 +++++ 24*d688a01eSAndrew Geissler src/third_party/unwind/dist/src/s390x/Ginit.c | 15 +++++++-------- 25*d688a01eSAndrew Geissler src/third_party/unwind/dist/src/sh/Ginit.c | 15 +++++++-------- 26*d688a01eSAndrew Geissler src/third_party/unwind/dist/src/tilegx/Ginit.c | 15 +++++++-------- 27*d688a01eSAndrew Geissler src/third_party/unwind/dist/src/x86/Ginit.c | 15 +++++++-------- 28*d688a01eSAndrew Geissler src/third_party/unwind/dist/src/x86_64/Ginit.c | 15 +++++++-------- 29*d688a01eSAndrew Geissler 15 files changed, 89 insertions(+), 80 deletions(-) 30*d688a01eSAndrew Geissler 31*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/aarch64/Ginit.c b/src/third_party/unwind/dist/src/aarch64/Ginit.c 32*d688a01eSAndrew Geisslerindex dec235c829..35389762f2 100644 33*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/aarch64/Ginit.c 34*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/aarch64/Ginit.c 35*d688a01eSAndrew Geissler@@ -61,13 +61,6 @@ tdep_uc_addr (unw_tdep_context_t *uc, int reg) 36*d688a01eSAndrew Geissler 37*d688a01eSAndrew Geissler # endif /* UNW_LOCAL_ONLY */ 38*d688a01eSAndrew Geissler 39*d688a01eSAndrew Geissler-HIDDEN unw_dyn_info_list_t _U_dyn_info_list; 40*d688a01eSAndrew Geissler- 41*d688a01eSAndrew Geissler-/* XXX fix me: there is currently no way to locate the dyn-info list 42*d688a01eSAndrew Geissler- by a remote unwinder. On ia64, this is done via a special 43*d688a01eSAndrew Geissler- unwind-table entry. Perhaps something similar can be done with 44*d688a01eSAndrew Geissler- DWARF2 unwind info. */ 45*d688a01eSAndrew Geissler- 46*d688a01eSAndrew Geissler static void 47*d688a01eSAndrew Geissler put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg) 48*d688a01eSAndrew Geissler { 49*d688a01eSAndrew Geissler@@ -78,7 +71,13 @@ static int 50*d688a01eSAndrew Geissler get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr, 51*d688a01eSAndrew Geissler void *arg) 52*d688a01eSAndrew Geissler { 53*d688a01eSAndrew Geissler- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list; 54*d688a01eSAndrew Geissler+#ifndef UNW_LOCAL_ONLY 55*d688a01eSAndrew Geissler+# pragma weak _U_dyn_info_list_addr 56*d688a01eSAndrew Geissler+ if (!_U_dyn_info_list_addr) 57*d688a01eSAndrew Geissler+ return -UNW_ENOINFO; 58*d688a01eSAndrew Geissler+#endif 59*d688a01eSAndrew Geissler+ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so. 60*d688a01eSAndrew Geissler+ *dyn_info_list_addr = _U_dyn_info_list_addr (); 61*d688a01eSAndrew Geissler return 0; 62*d688a01eSAndrew Geissler } 63*d688a01eSAndrew Geissler 64*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/arm/Ginit.c b/src/third_party/unwind/dist/src/arm/Ginit.c 65*d688a01eSAndrew Geisslerindex 2720d063a2..0bac0d72da 100644 66*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/arm/Ginit.c 67*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/arm/Ginit.c 68*d688a01eSAndrew Geissler@@ -57,18 +57,17 @@ tdep_uc_addr (unw_tdep_context_t *uc, int reg) 69*d688a01eSAndrew Geissler 70*d688a01eSAndrew Geissler # endif /* UNW_LOCAL_ONLY */ 71*d688a01eSAndrew Geissler 72*d688a01eSAndrew Geissler-HIDDEN unw_dyn_info_list_t _U_dyn_info_list; 73*d688a01eSAndrew Geissler- 74*d688a01eSAndrew Geissler-/* XXX fix me: there is currently no way to locate the dyn-info list 75*d688a01eSAndrew Geissler- by a remote unwinder. On ia64, this is done via a special 76*d688a01eSAndrew Geissler- unwind-table entry. Perhaps something similar can be done with 77*d688a01eSAndrew Geissler- DWARF2 unwind info. */ 78*d688a01eSAndrew Geissler- 79*d688a01eSAndrew Geissler static int 80*d688a01eSAndrew Geissler get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr, 81*d688a01eSAndrew Geissler void *arg) 82*d688a01eSAndrew Geissler { 83*d688a01eSAndrew Geissler- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list; 84*d688a01eSAndrew Geissler+#ifndef UNW_LOCAL_ONLY 85*d688a01eSAndrew Geissler+# pragma weak _U_dyn_info_list_addr 86*d688a01eSAndrew Geissler+ if (!_U_dyn_info_list_addr) 87*d688a01eSAndrew Geissler+ return -UNW_ENOINFO; 88*d688a01eSAndrew Geissler+#endif 89*d688a01eSAndrew Geissler+ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so. 90*d688a01eSAndrew Geissler+ *dyn_info_list_addr = _U_dyn_info_list_addr (); 91*d688a01eSAndrew Geissler return 0; 92*d688a01eSAndrew Geissler } 93*d688a01eSAndrew Geissler 94*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/coredump/_UPT_get_dyn_info_list_addr.c b/src/third_party/unwind/dist/src/coredump/_UPT_get_dyn_info_list_addr.c 95*d688a01eSAndrew Geisslerindex 0d11905566..739ed0569b 100644 96*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/coredump/_UPT_get_dyn_info_list_addr.c 97*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/coredump/_UPT_get_dyn_info_list_addr.c 98*d688a01eSAndrew Geissler@@ -74,6 +74,11 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg, 99*d688a01eSAndrew Geissler 100*d688a01eSAndrew Geissler #else 101*d688a01eSAndrew Geissler 102*d688a01eSAndrew Geissler+/* XXX fix me: there is currently no way to locate the dyn-info list 103*d688a01eSAndrew Geissler+ by a remote unwinder. On ia64, this is done via a special 104*d688a01eSAndrew Geissler+ unwind-table entry. Perhaps something similar can be done with 105*d688a01eSAndrew Geissler+ DWARF2 unwind info. */ 106*d688a01eSAndrew Geissler+ 107*d688a01eSAndrew Geissler static inline int 108*d688a01eSAndrew Geissler get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg, 109*d688a01eSAndrew Geissler int *countp) 110*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/hppa/Ginit.c b/src/third_party/unwind/dist/src/hppa/Ginit.c 111*d688a01eSAndrew Geisslerindex 461e4b93da..265455a68c 100644 112*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/hppa/Ginit.c 113*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/hppa/Ginit.c 114*d688a01eSAndrew Geissler@@ -64,13 +64,6 @@ _Uhppa_uc_addr (ucontext_t *uc, int reg) 115*d688a01eSAndrew Geissler 116*d688a01eSAndrew Geissler # endif /* UNW_LOCAL_ONLY */ 117*d688a01eSAndrew Geissler 118*d688a01eSAndrew Geissler-HIDDEN unw_dyn_info_list_t _U_dyn_info_list; 119*d688a01eSAndrew Geissler- 120*d688a01eSAndrew Geissler-/* XXX fix me: there is currently no way to locate the dyn-info list 121*d688a01eSAndrew Geissler- by a remote unwinder. On ia64, this is done via a special 122*d688a01eSAndrew Geissler- unwind-table entry. Perhaps something similar can be done with 123*d688a01eSAndrew Geissler- DWARF2 unwind info. */ 124*d688a01eSAndrew Geissler- 125*d688a01eSAndrew Geissler static void 126*d688a01eSAndrew Geissler put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg) 127*d688a01eSAndrew Geissler { 128*d688a01eSAndrew Geissler@@ -81,7 +74,13 @@ static int 129*d688a01eSAndrew Geissler get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr, 130*d688a01eSAndrew Geissler void *arg) 131*d688a01eSAndrew Geissler { 132*d688a01eSAndrew Geissler- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list; 133*d688a01eSAndrew Geissler+#ifndef UNW_LOCAL_ONLY 134*d688a01eSAndrew Geissler+# pragma weak _U_dyn_info_list_addr 135*d688a01eSAndrew Geissler+ if (!_U_dyn_info_list_addr) 136*d688a01eSAndrew Geissler+ return -UNW_ENOINFO; 137*d688a01eSAndrew Geissler+#endif 138*d688a01eSAndrew Geissler+ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so. 139*d688a01eSAndrew Geissler+ *dyn_info_list_addr = _U_dyn_info_list_addr (); 140*d688a01eSAndrew Geissler return 0; 141*d688a01eSAndrew Geissler } 142*d688a01eSAndrew Geissler 143*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/ia64/Ginit.c b/src/third_party/unwind/dist/src/ia64/Ginit.c 144*d688a01eSAndrew Geisslerindex b09a2ad57c..8601bb3ca8 100644 145*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/ia64/Ginit.c 146*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/ia64/Ginit.c 147*d688a01eSAndrew Geissler@@ -68,6 +68,7 @@ get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr, 148*d688a01eSAndrew Geissler if (!_U_dyn_info_list_addr) 149*d688a01eSAndrew Geissler return -UNW_ENOINFO; 150*d688a01eSAndrew Geissler #endif 151*d688a01eSAndrew Geissler+ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so. 152*d688a01eSAndrew Geissler *dyn_info_list_addr = _U_dyn_info_list_addr (); 153*d688a01eSAndrew Geissler return 0; 154*d688a01eSAndrew Geissler } 155*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/mi/Gfind_dynamic_proc_info.c b/src/third_party/unwind/dist/src/mi/Gfind_dynamic_proc_info.c 156*d688a01eSAndrew Geisslerindex 98d3501286..2e7c62e5e8 100644 157*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/mi/Gfind_dynamic_proc_info.c 158*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/mi/Gfind_dynamic_proc_info.c 159*d688a01eSAndrew Geissler@@ -49,6 +49,7 @@ local_find_proc_info (unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi, 160*d688a01eSAndrew Geissler return -UNW_ENOINFO; 161*d688a01eSAndrew Geissler #endif 162*d688a01eSAndrew Geissler 163*d688a01eSAndrew Geissler+ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so. 164*d688a01eSAndrew Geissler list = (unw_dyn_info_list_t *) (uintptr_t) _U_dyn_info_list_addr (); 165*d688a01eSAndrew Geissler for (di = list->first; di; di = di->next) 166*d688a01eSAndrew Geissler if (ip >= di->start_ip && ip < di->end_ip) 167*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/mips/Ginit.c b/src/third_party/unwind/dist/src/mips/Ginit.c 168*d688a01eSAndrew Geisslerindex 3df170c754..bf7a8f5a8f 100644 169*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/mips/Ginit.c 170*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/mips/Ginit.c 171*d688a01eSAndrew Geissler@@ -69,13 +69,6 @@ tdep_uc_addr (ucontext_t *uc, int reg) 172*d688a01eSAndrew Geissler 173*d688a01eSAndrew Geissler # endif /* UNW_LOCAL_ONLY */ 174*d688a01eSAndrew Geissler 175*d688a01eSAndrew Geissler-HIDDEN unw_dyn_info_list_t _U_dyn_info_list; 176*d688a01eSAndrew Geissler- 177*d688a01eSAndrew Geissler-/* XXX fix me: there is currently no way to locate the dyn-info list 178*d688a01eSAndrew Geissler- by a remote unwinder. On ia64, this is done via a special 179*d688a01eSAndrew Geissler- unwind-table entry. Perhaps something similar can be done with 180*d688a01eSAndrew Geissler- DWARF2 unwind info. */ 181*d688a01eSAndrew Geissler- 182*d688a01eSAndrew Geissler static void 183*d688a01eSAndrew Geissler put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg) 184*d688a01eSAndrew Geissler { 185*d688a01eSAndrew Geissler@@ -86,7 +79,13 @@ static int 186*d688a01eSAndrew Geissler get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr, 187*d688a01eSAndrew Geissler void *arg) 188*d688a01eSAndrew Geissler { 189*d688a01eSAndrew Geissler- *dyn_info_list_addr = (unw_word_t) (intptr_t) &_U_dyn_info_list; 190*d688a01eSAndrew Geissler+#ifndef UNW_LOCAL_ONLY 191*d688a01eSAndrew Geissler+# pragma weak _U_dyn_info_list_addr 192*d688a01eSAndrew Geissler+ if (!_U_dyn_info_list_addr) 193*d688a01eSAndrew Geissler+ return -UNW_ENOINFO; 194*d688a01eSAndrew Geissler+#endif 195*d688a01eSAndrew Geissler+ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so. 196*d688a01eSAndrew Geissler+ *dyn_info_list_addr = _U_dyn_info_list_addr (); 197*d688a01eSAndrew Geissler return 0; 198*d688a01eSAndrew Geissler } 199*d688a01eSAndrew Geissler 200*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/ppc32/Ginit.c b/src/third_party/unwind/dist/src/ppc32/Ginit.c 201*d688a01eSAndrew Geisslerindex ba302448a3..7b45455807 100644 202*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/ppc32/Ginit.c 203*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/ppc32/Ginit.c 204*d688a01eSAndrew Geissler@@ -91,9 +91,6 @@ tdep_uc_addr (ucontext_t *uc, int reg) 205*d688a01eSAndrew Geissler 206*d688a01eSAndrew Geissler # endif /* UNW_LOCAL_ONLY */ 207*d688a01eSAndrew Geissler 208*d688a01eSAndrew Geissler-HIDDEN unw_dyn_info_list_t _U_dyn_info_list; 209*d688a01eSAndrew Geissler- 210*d688a01eSAndrew Geissler- 211*d688a01eSAndrew Geissler static void 212*d688a01eSAndrew Geissler put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg) 213*d688a01eSAndrew Geissler { 214*d688a01eSAndrew Geissler@@ -104,7 +101,13 @@ static int 215*d688a01eSAndrew Geissler get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr, 216*d688a01eSAndrew Geissler void *arg) 217*d688a01eSAndrew Geissler { 218*d688a01eSAndrew Geissler- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list; 219*d688a01eSAndrew Geissler+#ifndef UNW_LOCAL_ONLY 220*d688a01eSAndrew Geissler+# pragma weak _U_dyn_info_list_addr 221*d688a01eSAndrew Geissler+ if (!_U_dyn_info_list_addr) 222*d688a01eSAndrew Geissler+ return -UNW_ENOINFO; 223*d688a01eSAndrew Geissler+#endif 224*d688a01eSAndrew Geissler+ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so. 225*d688a01eSAndrew Geissler+ *dyn_info_list_addr = _U_dyn_info_list_addr (); 226*d688a01eSAndrew Geissler return 0; 227*d688a01eSAndrew Geissler } 228*d688a01eSAndrew Geissler 229*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/ppc64/Ginit.c b/src/third_party/unwind/dist/src/ppc64/Ginit.c 230*d688a01eSAndrew Geisslerindex 4c88cd6e77..7bfb395a79 100644 231*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/ppc64/Ginit.c 232*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/ppc64/Ginit.c 233*d688a01eSAndrew Geissler@@ -95,9 +95,6 @@ tdep_uc_addr (ucontext_t *uc, int reg) 234*d688a01eSAndrew Geissler 235*d688a01eSAndrew Geissler # endif /* UNW_LOCAL_ONLY */ 236*d688a01eSAndrew Geissler 237*d688a01eSAndrew Geissler-HIDDEN unw_dyn_info_list_t _U_dyn_info_list; 238*d688a01eSAndrew Geissler- 239*d688a01eSAndrew Geissler- 240*d688a01eSAndrew Geissler static void 241*d688a01eSAndrew Geissler put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg) 242*d688a01eSAndrew Geissler { 243*d688a01eSAndrew Geissler@@ -108,7 +105,13 @@ static int 244*d688a01eSAndrew Geissler get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr, 245*d688a01eSAndrew Geissler void *arg) 246*d688a01eSAndrew Geissler { 247*d688a01eSAndrew Geissler- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list; 248*d688a01eSAndrew Geissler+#ifndef UNW_LOCAL_ONLY 249*d688a01eSAndrew Geissler+# pragma weak _U_dyn_info_list_addr 250*d688a01eSAndrew Geissler+ if (!_U_dyn_info_list_addr) 251*d688a01eSAndrew Geissler+ return -UNW_ENOINFO; 252*d688a01eSAndrew Geissler+#endif 253*d688a01eSAndrew Geissler+ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so. 254*d688a01eSAndrew Geissler+ *dyn_info_list_addr = _U_dyn_info_list_addr (); 255*d688a01eSAndrew Geissler return 0; 256*d688a01eSAndrew Geissler } 257*d688a01eSAndrew Geissler 258*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/ptrace/_UPT_get_dyn_info_list_addr.c b/src/third_party/unwind/dist/src/ptrace/_UPT_get_dyn_info_list_addr.c 259*d688a01eSAndrew Geisslerindex cc5ed04418..16671d453e 100644 260*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/ptrace/_UPT_get_dyn_info_list_addr.c 261*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/ptrace/_UPT_get_dyn_info_list_addr.c 262*d688a01eSAndrew Geissler@@ -71,6 +71,11 @@ get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg, 263*d688a01eSAndrew Geissler 264*d688a01eSAndrew Geissler #else 265*d688a01eSAndrew Geissler 266*d688a01eSAndrew Geissler+/* XXX fix me: there is currently no way to locate the dyn-info list 267*d688a01eSAndrew Geissler+ by a remote unwinder. On ia64, this is done via a special 268*d688a01eSAndrew Geissler+ unwind-table entry. Perhaps something similar can be done with 269*d688a01eSAndrew Geissler+ DWARF2 unwind info. */ 270*d688a01eSAndrew Geissler+ 271*d688a01eSAndrew Geissler static inline int 272*d688a01eSAndrew Geissler get_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg, 273*d688a01eSAndrew Geissler int *countp) 274*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/s390x/Ginit.c b/src/third_party/unwind/dist/src/s390x/Ginit.c 275*d688a01eSAndrew Geisslerindex f0886ac933..db01743c06 100644 276*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/s390x/Ginit.c 277*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/s390x/Ginit.c 278*d688a01eSAndrew Geissler@@ -50,8 +50,6 @@ static struct unw_addr_space local_addr_space; 279*d688a01eSAndrew Geissler 280*d688a01eSAndrew Geissler unw_addr_space_t unw_local_addr_space = &local_addr_space; 281*d688a01eSAndrew Geissler 282*d688a01eSAndrew Geissler-HIDDEN unw_dyn_info_list_t _U_dyn_info_list; 283*d688a01eSAndrew Geissler- 284*d688a01eSAndrew Geissler static inline void * 285*d688a01eSAndrew Geissler uc_addr (ucontext_t *uc, int reg) 286*d688a01eSAndrew Geissler { 287*d688a01eSAndrew Geissler@@ -75,11 +73,6 @@ tdep_uc_addr (ucontext_t *uc, int reg) 288*d688a01eSAndrew Geissler 289*d688a01eSAndrew Geissler # endif /* UNW_LOCAL_ONLY */ 290*d688a01eSAndrew Geissler 291*d688a01eSAndrew Geissler-/* XXX fix me: there is currently no way to locate the dyn-info list 292*d688a01eSAndrew Geissler- by a remote unwinder. On ia64, this is done via a special 293*d688a01eSAndrew Geissler- unwind-table entry. Perhaps something similar can be done with 294*d688a01eSAndrew Geissler- DWARF2 unwind info. */ 295*d688a01eSAndrew Geissler- 296*d688a01eSAndrew Geissler static void 297*d688a01eSAndrew Geissler put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg) 298*d688a01eSAndrew Geissler { 299*d688a01eSAndrew Geissler@@ -90,7 +83,13 @@ static int 300*d688a01eSAndrew Geissler get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr, 301*d688a01eSAndrew Geissler void *arg) 302*d688a01eSAndrew Geissler { 303*d688a01eSAndrew Geissler- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list; 304*d688a01eSAndrew Geissler+#ifndef UNW_LOCAL_ONLY 305*d688a01eSAndrew Geissler+# pragma weak _U_dyn_info_list_addr 306*d688a01eSAndrew Geissler+ if (!_U_dyn_info_list_addr) 307*d688a01eSAndrew Geissler+ return -UNW_ENOINFO; 308*d688a01eSAndrew Geissler+#endif 309*d688a01eSAndrew Geissler+ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so. 310*d688a01eSAndrew Geissler+ *dyn_info_list_addr = _U_dyn_info_list_addr (); 311*d688a01eSAndrew Geissler return 0; 312*d688a01eSAndrew Geissler } 313*d688a01eSAndrew Geissler 314*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/sh/Ginit.c b/src/third_party/unwind/dist/src/sh/Ginit.c 315*d688a01eSAndrew Geisslerindex 52988a721e..9fe96d2bd4 100644 316*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/sh/Ginit.c 317*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/sh/Ginit.c 318*d688a01eSAndrew Geissler@@ -58,13 +58,6 @@ tdep_uc_addr (ucontext_t *uc, int reg) 319*d688a01eSAndrew Geissler 320*d688a01eSAndrew Geissler # endif /* UNW_LOCAL_ONLY */ 321*d688a01eSAndrew Geissler 322*d688a01eSAndrew Geissler-HIDDEN unw_dyn_info_list_t _U_dyn_info_list; 323*d688a01eSAndrew Geissler- 324*d688a01eSAndrew Geissler-/* XXX fix me: there is currently no way to locate the dyn-info list 325*d688a01eSAndrew Geissler- by a remote unwinder. On ia64, this is done via a special 326*d688a01eSAndrew Geissler- unwind-table entry. Perhaps something similar can be done with 327*d688a01eSAndrew Geissler- DWARF2 unwind info. */ 328*d688a01eSAndrew Geissler- 329*d688a01eSAndrew Geissler static void 330*d688a01eSAndrew Geissler put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg) 331*d688a01eSAndrew Geissler { 332*d688a01eSAndrew Geissler@@ -75,7 +68,13 @@ static int 333*d688a01eSAndrew Geissler get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr, 334*d688a01eSAndrew Geissler void *arg) 335*d688a01eSAndrew Geissler { 336*d688a01eSAndrew Geissler- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list; 337*d688a01eSAndrew Geissler+#ifndef UNW_LOCAL_ONLY 338*d688a01eSAndrew Geissler+# pragma weak _U_dyn_info_list_addr 339*d688a01eSAndrew Geissler+ if (!_U_dyn_info_list_addr) 340*d688a01eSAndrew Geissler+ return -UNW_ENOINFO; 341*d688a01eSAndrew Geissler+#endif 342*d688a01eSAndrew Geissler+ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so. 343*d688a01eSAndrew Geissler+ *dyn_info_list_addr = _U_dyn_info_list_addr (); 344*d688a01eSAndrew Geissler return 0; 345*d688a01eSAndrew Geissler } 346*d688a01eSAndrew Geissler 347*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/tilegx/Ginit.c b/src/third_party/unwind/dist/src/tilegx/Ginit.c 348*d688a01eSAndrew Geisslerindex 7564a558be..925e641324 100644 349*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/tilegx/Ginit.c 350*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/tilegx/Ginit.c 351*d688a01eSAndrew Geissler@@ -64,13 +64,6 @@ tdep_uc_addr (ucontext_t *uc, int reg) 352*d688a01eSAndrew Geissler 353*d688a01eSAndrew Geissler # endif /* UNW_LOCAL_ONLY */ 354*d688a01eSAndrew Geissler 355*d688a01eSAndrew Geissler-HIDDEN unw_dyn_info_list_t _U_dyn_info_list; 356*d688a01eSAndrew Geissler- 357*d688a01eSAndrew Geissler-/* XXX fix me: there is currently no way to locate the dyn-info list 358*d688a01eSAndrew Geissler- by a remote unwinder. On ia64, this is done via a special 359*d688a01eSAndrew Geissler- unwind-table entry. Perhaps something similar can be done with 360*d688a01eSAndrew Geissler- DWARF2 unwind info. */ 361*d688a01eSAndrew Geissler- 362*d688a01eSAndrew Geissler static void 363*d688a01eSAndrew Geissler put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg) 364*d688a01eSAndrew Geissler { 365*d688a01eSAndrew Geissler@@ -81,7 +74,13 @@ static int 366*d688a01eSAndrew Geissler get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr, 367*d688a01eSAndrew Geissler void *arg) 368*d688a01eSAndrew Geissler { 369*d688a01eSAndrew Geissler- *dyn_info_list_addr = (unw_word_t) (intptr_t) &_U_dyn_info_list; 370*d688a01eSAndrew Geissler+#ifndef UNW_LOCAL_ONLY 371*d688a01eSAndrew Geissler+# pragma weak _U_dyn_info_list_addr 372*d688a01eSAndrew Geissler+ if (!_U_dyn_info_list_addr) 373*d688a01eSAndrew Geissler+ return -UNW_ENOINFO; 374*d688a01eSAndrew Geissler+#endif 375*d688a01eSAndrew Geissler+ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so. 376*d688a01eSAndrew Geissler+ *dyn_info_list_addr = _U_dyn_info_list_addr (); 377*d688a01eSAndrew Geissler return 0; 378*d688a01eSAndrew Geissler } 379*d688a01eSAndrew Geissler 380*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/x86/Ginit.c b/src/third_party/unwind/dist/src/x86/Ginit.c 381*d688a01eSAndrew Geisslerindex f6b8dc27d4..3cec74a216 100644 382*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/x86/Ginit.c 383*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/x86/Ginit.c 384*d688a01eSAndrew Geissler@@ -54,13 +54,6 @@ tdep_uc_addr (ucontext_t *uc, int reg) 385*d688a01eSAndrew Geissler 386*d688a01eSAndrew Geissler # endif /* UNW_LOCAL_ONLY */ 387*d688a01eSAndrew Geissler 388*d688a01eSAndrew Geissler-HIDDEN unw_dyn_info_list_t _U_dyn_info_list; 389*d688a01eSAndrew Geissler- 390*d688a01eSAndrew Geissler-/* XXX fix me: there is currently no way to locate the dyn-info list 391*d688a01eSAndrew Geissler- by a remote unwinder. On ia64, this is done via a special 392*d688a01eSAndrew Geissler- unwind-table entry. Perhaps something similar can be done with 393*d688a01eSAndrew Geissler- DWARF2 unwind info. */ 394*d688a01eSAndrew Geissler- 395*d688a01eSAndrew Geissler static void 396*d688a01eSAndrew Geissler put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg) 397*d688a01eSAndrew Geissler { 398*d688a01eSAndrew Geissler@@ -71,7 +64,13 @@ static int 399*d688a01eSAndrew Geissler get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr, 400*d688a01eSAndrew Geissler void *arg) 401*d688a01eSAndrew Geissler { 402*d688a01eSAndrew Geissler- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list; 403*d688a01eSAndrew Geissler+#ifndef UNW_LOCAL_ONLY 404*d688a01eSAndrew Geissler+# pragma weak _U_dyn_info_list_addr 405*d688a01eSAndrew Geissler+ if (!_U_dyn_info_list_addr) 406*d688a01eSAndrew Geissler+ return -UNW_ENOINFO; 407*d688a01eSAndrew Geissler+#endif 408*d688a01eSAndrew Geissler+ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so. 409*d688a01eSAndrew Geissler+ *dyn_info_list_addr = _U_dyn_info_list_addr (); 410*d688a01eSAndrew Geissler return 0; 411*d688a01eSAndrew Geissler } 412*d688a01eSAndrew Geissler 413*d688a01eSAndrew Geisslerdiff --git a/src/third_party/unwind/dist/src/x86_64/Ginit.c b/src/third_party/unwind/dist/src/x86_64/Ginit.c 414*d688a01eSAndrew Geisslerindex 6161da6401..5c4e4269a6 100644 415*d688a01eSAndrew Geissler--- a/src/third_party/unwind/dist/src/x86_64/Ginit.c 416*d688a01eSAndrew Geissler+++ b/src/third_party/unwind/dist/src/x86_64/Ginit.c 417*d688a01eSAndrew Geissler@@ -49,13 +49,6 @@ static struct unw_addr_space local_addr_space; 418*d688a01eSAndrew Geissler 419*d688a01eSAndrew Geissler unw_addr_space_t unw_local_addr_space = &local_addr_space; 420*d688a01eSAndrew Geissler 421*d688a01eSAndrew Geissler-HIDDEN unw_dyn_info_list_t _U_dyn_info_list; 422*d688a01eSAndrew Geissler- 423*d688a01eSAndrew Geissler-/* XXX fix me: there is currently no way to locate the dyn-info list 424*d688a01eSAndrew Geissler- by a remote unwinder. On ia64, this is done via a special 425*d688a01eSAndrew Geissler- unwind-table entry. Perhaps something similar can be done with 426*d688a01eSAndrew Geissler- DWARF2 unwind info. */ 427*d688a01eSAndrew Geissler- 428*d688a01eSAndrew Geissler static void 429*d688a01eSAndrew Geissler put_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg) 430*d688a01eSAndrew Geissler { 431*d688a01eSAndrew Geissler@@ -66,7 +59,13 @@ static int 432*d688a01eSAndrew Geissler get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr, 433*d688a01eSAndrew Geissler void *arg) 434*d688a01eSAndrew Geissler { 435*d688a01eSAndrew Geissler- *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list; 436*d688a01eSAndrew Geissler+#ifndef UNW_LOCAL_ONLY 437*d688a01eSAndrew Geissler+# pragma weak _U_dyn_info_list_addr 438*d688a01eSAndrew Geissler+ if (!_U_dyn_info_list_addr) 439*d688a01eSAndrew Geissler+ return -UNW_ENOINFO; 440*d688a01eSAndrew Geissler+#endif 441*d688a01eSAndrew Geissler+ // Access the `_U_dyn_info_list` from `LOCAL_ONLY` library, i.e. libunwind.so. 442*d688a01eSAndrew Geissler+ *dyn_info_list_addr = _U_dyn_info_list_addr (); 443*d688a01eSAndrew Geissler return 0; 444*d688a01eSAndrew Geissler } 445*d688a01eSAndrew Geissler 446*d688a01eSAndrew Geissler-- 447*d688a01eSAndrew Geissler2.28.0 448*d688a01eSAndrew Geissler 449