Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 149211 Details for
Bug 229424
FEAT: libunwind-using-elfutils for symbols resolving
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
Implementation (v2).
libunwind-using-elfutils-2.patch (text/plain), 55.74 KB, created by
Jan Kratochvil
on 2007-03-04 15:43:09 UTC
(
hide
)
Description:
Implementation (v2).
Filename:
MIME Type:
Creator:
Jan Kratochvil
Created:
2007-03-04 15:43:09 UTC
Size:
55.74 KB
patch
obsolete
>Index: configure.ac >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/configure.ac,v >retrieving revision 1.5 >diff -u -p -r1.5 configure.ac >--- configure.ac 16 Sep 2006 05:36:01 -0000 1.5 >+++ configure.ac 4 Mar 2007 15:38:23 -0000 >@@ -59,6 +59,13 @@ AC_TYPE_SIGNAL > AC_CHECK_FUNCS(dl_iterate_phdr dl_phdr_removals_counter dlmodinfo getunwind \ > ttrace) > >+AC_CHECK_HEADER([elfutils/libdwfl.h], [ >+ AC_CHECK_LIB(dw, dwfl_begin, [ >+ AC_DEFINE(HAVE_LIBDW, 1, [Define to 1 if you have the elfutils 'dw' library (-ldw).]) >+ LIBDW="-ldw -lebl -lelf -ldl" >+ ],,[-lebl -lelf -dl]) >+]) >+ > get_arch() { > case "$1" in > i?86) echo x86;; >@@ -123,6 +130,7 @@ AC_SUBST(arch) > AC_SUBST(ARCH) > AC_SUBST(LDFLAGS_STATIC_LIBCXA) > AC_SUBST(LIBCRTS) >+AC_SUBST(LIBDW) > AC_SUBST(PACKAGE) > AC_SUBST(PKG_MAJOR) > AC_SUBST(PKG_MINOR) >Index: include/dwarf.h >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/include/dwarf.h,v >retrieving revision 1.2 >diff -u -p -r1.2 dwarf.h >--- include/dwarf.h 24 Nov 2006 21:04:11 -0000 1.2 >+++ include/dwarf.h 4 Mar 2007 15:38:24 -0000 >@@ -323,7 +323,9 @@ struct dwarf_rs_cache > /* Convenience macros: */ > #define dwarf_init UNW_ARCH_OBJ (dwarf_init) > #define dwarf_find_proc_info UNW_OBJ (dwarf_find_proc_info) >+#define dwarf_get_proc_name UNW_OBJ (dwarf_get_proc_name) > #define dwarf_search_unwind_table UNW_OBJ (dwarf_search_unwind_table) >+#define dwarf_destroy_addr_space UNW_OBJ (dwarf_destroy_addr_space) > #define dwarf_put_unwind_info UNW_OBJ (dwarf_put_unwind_info) > #define dwarf_put_unwind_info UNW_OBJ (dwarf_put_unwind_info) > #define dwarf_eval_expr UNW_OBJ (dwarf_eval_expr) >@@ -339,7 +341,11 @@ extern int dwarf_init (void); > extern int dwarf_find_proc_info (unw_addr_space_t as, unw_word_t ip, > unw_proc_info_t *pi, > int need_unwind_info, void *arg); >+extern int dwarf_get_proc_name (unw_addr_space_t as, pid_t pid, unw_word_t ip, >+ char *buf, size_t buf_len, unw_word_t *offp, >+ void *arg); > extern int dwarf_search_unwind_table (unw_addr_space_t as, >+ pid_t pid, > unw_word_t ip, > unw_dyn_info_t *di, > unw_proc_info_t *pi, >Index: include/libunwind-common.h.in >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/include/libunwind-common.h.in,v >retrieving revision 1.1 >diff -u -p -r1.1 libunwind-common.h.in >--- include/libunwind-common.h.in 31 May 2006 18:22:15 -0000 1.1 >+++ include/libunwind-common.h.in 4 Mar 2007 15:38:24 -0000 >@@ -178,6 +178,11 @@ typedef struct unw_accessors > NULL. */ > int (*get_proc_name) (unw_addr_space_t, unw_word_t, char *, size_t, > unw_word_t *, void *); >+ >+ int (*search_unwind_table) (unw_addr_space_t, unw_word_t, unw_dyn_info_t *, >+ unw_proc_info_t *, int need_unwind_info, >+ void *); >+ > int validate; > } > unw_accessors_t; >@@ -248,6 +253,9 @@ extern int unw_set_fpreg (unw_cursor_t * > extern int unw_get_save_loc (unw_cursor_t *, int, unw_save_loc_t *); > extern int unw_is_signal_frame (unw_cursor_t *); > extern int unw_get_proc_name (unw_cursor_t *, char *, size_t, unw_word_t *); >+extern int unw_search_unwind_table (unw_addr_space_t, unw_word_t, >+ unw_dyn_info_t *, unw_proc_info_t *, int, >+ void *); > extern const char *unw_strerror (int); > > extern unw_addr_space_t unw_local_addr_space; >Index: include/libunwind-ia64.h >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/include/libunwind-ia64.h,v >retrieving revision 1.1 >diff -u -p -r1.1 libunwind-ia64.h >--- include/libunwind-ia64.h 31 May 2006 18:22:15 -0000 1.1 >+++ include/libunwind-ia64.h 4 Mar 2007 15:38:24 -0000 >@@ -172,7 +172,7 @@ typedef ucontext_t unw_tdep_context_t; > callback. This routine is signal-safe for the local-address-space > case ONLY. */ > #define unw_search_ia64_unwind_table UNW_OBJ(search_unwind_table) >-extern int unw_search_ia64_unwind_table (unw_addr_space_t, unw_word_t, >+extern int unw_search_ia64_unwind_table (unw_addr_space_t, pid_t, unw_word_t, > unw_dyn_info_t *, unw_proc_info_t *, > int, void *); > >Index: include/libunwind-ptrace.h >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/include/libunwind-ptrace.h,v >retrieving revision 1.1 >diff -u -p -r1.1 libunwind-ptrace.h >--- include/libunwind-ptrace.h 31 May 2006 18:22:15 -0000 1.1 >+++ include/libunwind-ptrace.h 4 Mar 2007 15:38:24 -0000 >@@ -52,6 +52,9 @@ extern int _UPT_access_fpreg (unw_addr_s > int, void *); > extern int _UPT_get_proc_name (unw_addr_space_t, unw_word_t, char *, size_t, > unw_word_t *, void *); >+extern int _UPT_search_unwind_table (unw_addr_space_t, unw_word_t, >+ unw_dyn_info_t *, unw_proc_info_t *, int, >+ void *); > extern int _UPT_resume (unw_addr_space_t, unw_cursor_t *, void *); > extern unw_accessors_t _UPT_accessors; > >Index: include/libunwind_i.h >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/include/libunwind_i.h,v >retrieving revision 1.1 >diff -u -p -r1.1 libunwind_i.h >--- include/libunwind_i.h 31 May 2006 18:22:15 -0000 1.1 >+++ include/libunwind_i.h 4 Mar 2007 15:38:24 -0000 >@@ -111,12 +111,15 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE > > #pragma weak pthread_mutex_init > #pragma weak pthread_mutex_lock >+#pragma weak pthread_mutex_trylock > #pragma weak pthread_mutex_unlock > > #define mutex_init(l) \ > (pthread_mutex_init != 0 ? pthread_mutex_init ((l), 0) : 0) > #define mutex_lock(l) \ > (pthread_mutex_lock != 0 ? pthread_mutex_lock (l) : 0) >+#define mutex_trylock(l) \ >+ (pthread_mutex_trylock != 0 ? pthread_mutex_trylock (l) : 0) > #define mutex_unlock(l) \ > (pthread_mutex_unlock != 0 ? pthread_mutex_unlock (l) : 0) > >Index: include/tdep-hppa/libunwind_i.h >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/include/tdep-hppa/libunwind_i.h,v >retrieving revision 1.3 >diff -u -p -r1.3 libunwind_i.h >--- include/tdep-hppa/libunwind_i.h 10 Dec 2006 15:02:40 -0000 1.3 >+++ include/tdep-hppa/libunwind_i.h 4 Mar 2007 15:38:24 -0000 >@@ -46,7 +46,9 @@ struct unw_addr_space > #endif > unw_word_t dyn_generation; /* see dyn-common.h */ > unw_word_t dyn_info_list_addr; /* (cached) dyn_info_list_addr */ >- }; >+ Dwfl *dwfl; >+ pthread_mutex_t dwfl_lock; >+ }; > > struct cursor > { >@@ -218,7 +220,9 @@ dwarf_put (struct dwarf_cursor *c, dwarf > #define tdep_init UNW_OBJ(init) > /* Platforms that support UNW_INFO_FORMAT_TABLE need to define > tdep_search_unwind_table. */ >+#define tdep_get_proc_name dwarf_get_proc_name > #define tdep_search_unwind_table dwarf_search_unwind_table >+#define tdep_destroy_addr_space dwarf_destroy_addr_space > #define tdep_uc_addr UNW_ARCH_OBJ(uc_addr) > #define tdep_get_elf_image UNW_ARCH_OBJ(get_elf_image) > #define tdep_access_reg UNW_OBJ(access_reg) >@@ -247,9 +251,14 @@ dwarf_put (struct dwarf_cursor *c, dwarf > extern int tdep_needs_initialization; > > extern void tdep_init (void); >-extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip, >- unw_dyn_info_t *di, unw_proc_info_t *pi, >- int need_unwind_info, void *arg); >+extern int tdep_get_proc_name (unw_addr_space_t as, pid_t pid, unw_word_t ip, >+ char *buf, size_t buf_len, unw_word_t *offp, >+ void *arg); >+extern int tdep_search_unwind_table (unw_addr_space_t as, pid_t pid, >+ unw_word_t ip, unw_dyn_info_t *di, >+ unw_proc_info_t *pi, int need_unwind_info, >+ void *arg); >+extern void tdep_destroy_addr_space (unw_addr_space_t as); > extern void *tdep_uc_addr (ucontext_t *uc, int reg); > extern int tdep_get_elf_image (unw_addr_space_t as, struct elf_image *ei, > pid_t pid, unw_word_t ip, >Index: include/tdep-ia64/libunwind_i.h >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/include/tdep-ia64/libunwind_i.h,v >retrieving revision 1.3 >diff -u -p -r1.3 libunwind_i.h >--- include/tdep-ia64/libunwind_i.h 10 Dec 2006 15:02:40 -0000 1.3 >+++ include/tdep-ia64/libunwind_i.h 4 Mar 2007 15:38:24 -0000 >@@ -214,7 +214,9 @@ struct ia64_global_unwind_state > #define tdep_init UNW_OBJ(init) > /* Platforms that support UNW_INFO_FORMAT_TABLE need to define > tdep_search_unwind_table. */ >+#define tdep_get_proc_name unw_get_ia64_proc_name > #define tdep_search_unwind_table unw_search_ia64_unwind_table >+#define tdep_destroy_addr_space(as) do { } while (0) > #define tdep_find_proc_info UNW_OBJ(find_proc_info) > #define tdep_uc_addr UNW_OBJ(uc_addr) > #define tdep_get_elf_image UNW_ARCH_OBJ(get_elf_image) >Index: include/tdep-ppc64/libunwind_i.h >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/include/tdep-ppc64/libunwind_i.h,v >retrieving revision 1.3 >diff -u -p -r1.3 libunwind_i.h >--- include/tdep-ppc64/libunwind_i.h 10 Dec 2006 15:02:40 -0000 1.3 >+++ include/tdep-ppc64/libunwind_i.h 4 Mar 2007 15:38:24 -0000 >@@ -51,7 +51,9 @@ struct unw_addr_space > unw_word_t dyn_generation; /* see dyn-common.h */ > unw_word_t dyn_info_list_addr; /* (cached) dyn_info_list_addr */ > struct dwarf_rs_cache global_cache; >- }; >+ Dwfl *dwfl; >+ pthread_mutex_t dwfl_lock; >+ }; > > struct cursor > { >@@ -157,7 +159,9 @@ dwarf_put (struct dwarf_cursor *c, dwarf > #define tdep_init UNW_OBJ(init) > /* Platforms that support UNW_INFO_FORMAT_TABLE need to define > tdep_search_unwind_table. */ >+#define tdep_get_proc_name dwarf_get_proc_name > #define tdep_search_unwind_table dwarf_search_unwind_table >+#define tdep_destroy_addr_space dwarf_destroy_addr_space > #define tdep_uc_addr UNW_ARCH_OBJ(uc_addr) > #define tdep_get_elf_image UNW_ARCH_OBJ(get_elf_image) > #define tdep_access_reg UNW_OBJ(access_reg) >@@ -186,9 +190,14 @@ dwarf_put (struct dwarf_cursor *c, dwarf > extern int tdep_needs_initialization; > > extern void tdep_init (void); >-extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip, >- unw_dyn_info_t *di, unw_proc_info_t *pi, >- int need_unwind_info, void *arg); >+extern int tdep_get_proc_name (unw_addr_space_t as, pid_t pid, unw_word_t ip, >+ char *buf, size_t buf_len, unw_word_t *offp, >+ void *arg); >+extern int tdep_search_unwind_table (unw_addr_space_t as, pid_t pid, >+ unw_word_t ip, unw_dyn_info_t *di, >+ unw_proc_info_t *pi, int need_unwind_info, >+ void *arg); >+extern void tdep_destroy_addr_space (unw_addr_space_t as); > extern void *tdep_uc_addr (ucontext_t *uc, int reg); > extern int tdep_get_elf_image (unw_addr_space_t as, struct elf_image *ei, > pid_t pid, unw_word_t ip, >Index: include/tdep-x86/libunwind_i.h >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/include/tdep-x86/libunwind_i.h,v >retrieving revision 1.4 >diff -u -p -r1.4 libunwind_i.h >--- include/tdep-x86/libunwind_i.h 11 Dec 2006 00:29:01 -0000 1.4 >+++ include/tdep-x86/libunwind_i.h 4 Mar 2007 15:38:24 -0000 >@@ -30,6 +30,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE > to be shared with target-independent code. */ > > #include <stdlib.h> >+#include <elfutils/libdwfl.h> > #include <libunwind.h> > > #include "elf32.h" >@@ -47,7 +48,9 @@ struct unw_addr_space > unw_word_t dyn_generation; /* see dyn-common.h */ > unw_word_t dyn_info_list_addr; /* (cached) dyn_info_list_addr */ > struct dwarf_rs_cache global_cache; >- }; >+ Dwfl *dwfl; >+ pthread_mutex_t dwfl_lock; >+ }; > > struct cursor > { >@@ -220,7 +223,9 @@ dwarf_put (struct dwarf_cursor *c, dwarf > #define tdep_init UNW_OBJ(init) > /* Platforms that support UNW_INFO_FORMAT_TABLE need to define > tdep_search_unwind_table. */ >+#define tdep_get_proc_name dwarf_get_proc_name > #define tdep_search_unwind_table dwarf_search_unwind_table >+#define tdep_destroy_addr_space dwarf_destroy_addr_space > #define tdep_uc_addr UNW_ARCH_OBJ(uc_addr) > #define tdep_get_elf_image UNW_ARCH_OBJ(get_elf_image) > #define tdep_access_reg UNW_OBJ(access_reg) >@@ -250,9 +255,14 @@ extern int tdep_fetch_proc_info_post (st > extern int tdep_needs_initialization; > > extern void tdep_init (void); >-extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip, >- unw_dyn_info_t *di, unw_proc_info_t *pi, >- int need_unwind_info, void *arg); >+extern int tdep_get_proc_name (unw_addr_space_t as, pid_t pid, unw_word_t ip, >+ char *buf, size_t buf_len, unw_word_t *offp, >+ void *arg); >+extern int tdep_search_unwind_table (unw_addr_space_t as, pid_t pid, >+ unw_word_t ip, unw_dyn_info_t *di, >+ unw_proc_info_t *pi, int need_unwind_info, >+ void *arg); >+extern void tdep_destroy_addr_space (unw_addr_space_t as); > extern void *tdep_uc_addr (ucontext_t *uc, int reg); > extern int tdep_get_elf_image (unw_addr_space_t as, struct elf_image *ei, > pid_t pid, unw_word_t ip, >Index: include/tdep-x86_64/libunwind_i.h >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/include/tdep-x86_64/libunwind_i.h,v >retrieving revision 1.3 >diff -u -p -r1.3 libunwind_i.h >--- include/tdep-x86_64/libunwind_i.h 10 Dec 2006 15:02:40 -0000 1.3 >+++ include/tdep-x86_64/libunwind_i.h 4 Mar 2007 15:38:24 -0000 >@@ -49,7 +49,9 @@ struct unw_addr_space > unw_word_t dyn_generation; /* see dyn-common.h */ > unw_word_t dyn_info_list_addr; /* (cached) dyn_info_list_addr */ > struct dwarf_rs_cache global_cache; >- }; >+ Dwfl *dwfl; >+ pthread_mutex_t dwfl_lock; >+ }; > > struct cursor > { >@@ -155,7 +157,9 @@ dwarf_put (struct dwarf_cursor *c, dwarf > #define tdep_init UNW_OBJ(init) > /* Platforms that support UNW_INFO_FORMAT_TABLE need to define > tdep_search_unwind_table. */ >+#define tdep_get_proc_name dwarf_get_proc_name > #define tdep_search_unwind_table dwarf_search_unwind_table >+#define tdep_destroy_addr_space dwarf_destroy_addr_space > #define tdep_uc_addr UNW_ARCH_OBJ(uc_addr) > #define tdep_get_elf_image UNW_ARCH_OBJ(get_elf_image) > #define tdep_access_reg UNW_OBJ(access_reg) >@@ -185,9 +189,14 @@ extern int tdep_fetch_proc_info_post (st > extern int tdep_needs_initialization; > > extern void tdep_init (void); >-extern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip, >- unw_dyn_info_t *di, unw_proc_info_t *pi, >- int need_unwind_info, void *arg); >+extern int tdep_get_proc_name (unw_addr_space_t as, pid_t pid, unw_word_t ip, >+ char *buf, size_t buf_len, unw_word_t *offp, >+ void *arg); >+extern int tdep_search_unwind_table (unw_addr_space_t as, pid_t pid, >+ unw_word_t ip, unw_dyn_info_t *di, >+ unw_proc_info_t *pi, int need_unwind_info, >+ void *arg); >+extern void tdep_destroy_addr_space (unw_addr_space_t as); > extern void *tdep_uc_addr (ucontext_t *uc, int reg); > extern int tdep_get_elf_image (unw_addr_space_t as, struct elf_image *ei, > pid_t pid, unw_word_t ip, >Index: src/Makefile.in >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/Makefile.in,v >retrieving revision 1.2 >diff -u -p -r1.2 Makefile.in >--- src/Makefile.in 24 Nov 2006 21:31:29 -0000 1.2 >+++ src/Makefile.in 4 Mar 2007 15:38:24 -0000 >@@ -61,7 +61,6 @@ libunwind-setjmp.so_minor = 0 > # These are simply the common files; arch specific are added in the include. > > libunwind_ptrace_OBJS = \ >- ptrace/_UPT_elf.o \ > ptrace/_UPT_accessors.o \ > ptrace/_UPT_access_fpreg.o \ > ptrace/_UPT_access_mem.o \ >@@ -72,6 +71,7 @@ libunwind_ptrace_OBJS = \ > ptrace/_UPT_get_dyn_info_list_addr.o \ > ptrace/_UPT_put_unwind_info.o \ > ptrace/_UPT_get_proc_name.o \ >+ ptrace/_UPT_search_unwind_table.o \ > ptrace/_UPT_reg_offset.o \ > ptrace/_UPT_resume.o > >@@ -80,7 +80,6 @@ libunwind_setjmp_OBJS = \ > setjmp/siglongjmp.o > > libunwind_OBJS_common = \ >- elf$(ELFW).o \ > mi/init.o \ > mi/flush_cache.o \ > mi/mempool.o \ >@@ -93,6 +92,7 @@ libunwind_OBJS_dual = \ > mi/Gget_accessors.o \ > mi/Gget_proc_info_by_ip.o \ > mi/Gget_proc_name.o \ >+ mi/Gsearch_unwind_table.o \ > mi/Gput_dynamic_unwind_info.o \ > mi/Gdestroy_addr_space.o \ > mi/Gget_reg.o \ >Index: src/elf32.c >=================================================================== >RCS file: src/elf32.c >diff -N src/elf32.c >--- src/elf32.c 31 May 2006 18:22:16 -0000 1.1 >+++ /dev/null 1 Jan 1970 00:00:00 -0000 >@@ -1,4 +0,0 @@ >-#ifndef UNW_REMOTE_ONLY >-# include "elf32.h" >-# include "elfxx.c" >-#endif >Index: src/elf64.c >=================================================================== >RCS file: src/elf64.c >diff -N src/elf64.c >--- src/elf64.c 31 May 2006 18:22:16 -0000 1.1 >+++ /dev/null 1 Jan 1970 00:00:00 -0000 >@@ -1,4 +0,0 @@ >-#ifndef UNW_REMOTE_ONLY >-# include "elf64.h" >-# include "elfxx.c" >-#endif >Index: src/elfxx.c >=================================================================== >RCS file: src/elfxx.c >diff -N src/elfxx.c >--- src/elfxx.c 2 Mar 2007 20:48:37 -0000 1.9 >+++ /dev/null 1 Jan 1970 00:00:00 -0000 >@@ -1,218 +0,0 @@ >-/* libunwind - a platform-independent unwind library >- Copyright (C) 2003-2005 Hewlett-Packard Co >- Contributed by David Mosberger-Tang <davidm@hpl.hp.com> >- >-This file is part of libunwind. >- >-Permission is hereby granted, free of charge, to any person obtaining >-a copy of this software and associated documentation files (the >-"Software"), to deal in the Software without restriction, including >-without limitation the rights to use, copy, modify, merge, publish, >-distribute, sublicense, and/or sell copies of the Software, and to >-permit persons to whom the Software is furnished to do so, subject to >-the following conditions: >- >-The above copyright notice and this permission notice shall be >-included in all copies or substantial portions of the Software. >- >-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, >-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF >-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND >-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE >-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION >-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION >-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ >- >-#include <stdio.h> >- >-#include "libunwind_i.h" >- >-HIDDEN int >-elf_w (valid_object) (struct elf_image *ei) >-{ >- if (ei->size <= EI_CLASS) >- return 0; >- >- return (memcmp (ei->image, ELFMAG, SELFMAG) == 0 >- && ((uint8_t *) ei->image)[EI_CLASS] == ELF_CLASS); >-} >- >- >-static int >-elf_w (lookup_symbol) (unw_word_t ip, struct elf_image *ei, >- Elf_W (Addr) load_offset, >- char *buf, size_t buf_len, unw_word_t *offp) >-{ >- size_t syment_size; >- Elf_W (Ehdr) *ehdr = ei->image; >- Elf_W (Sym) *sym, *symtab, *symtab_end; >- Elf_W (Off) soff, str_soff; >- Elf_W (Shdr) *shdr, *str_shdr; >- Elf_W (Addr) val, min_dist = ~(Elf_W (Addr))0; >- Elf_W (Addr) val_max_below = 0; >- int i, ret = 0; >- char *strtab; >- >- if (!elf_w (valid_object) (ei)) >- return -UNW_ENOINFO; >- >- buf_len--; /* Terminating 0. */ >- >- soff = ehdr->e_shoff; >- if (soff + ehdr->e_shnum * ehdr->e_shentsize > ei->size) >- { >- Debug (1, "section table outside of image? (%lu > %lu)\n", >- (unsigned long) (soff + ehdr->e_shnum * ehdr->e_shentsize), >- (unsigned long) ei->size); >- return -UNW_ENOINFO; >- } >- >- shdr = (Elf_W (Shdr) *) ((char *) ei->image + soff); >- >- for (i = 0; i < ehdr->e_shnum; ++i) >- { >- switch (shdr->sh_type) >- { >- case SHT_SYMTAB: >- case SHT_DYNSYM: >- symtab = (Elf_W (Sym) *) ((char *) ei->image + shdr->sh_offset); >- symtab_end = (Elf_W (Sym) *) ((char *) symtab + shdr->sh_size); >- syment_size = shdr->sh_entsize; >- >- str_soff = soff + (shdr->sh_link * ehdr->e_shentsize); >- if (str_soff + ehdr->e_shentsize >= ei->size) >- { >- Debug (1, "string table outside of image? (%lu >= %lu)\n", >- (unsigned long) (str_soff + ehdr->e_shentsize), >- (unsigned long) ei->size); >- break; >- } >- str_shdr = (Elf_W (Shdr) *) ((char *) ei->image + str_soff); >- strtab = (char *) ei->image + str_shdr->sh_offset; >- >- Debug (16, "symtab=0x%lx[%d], strtab=0x%lx\n", >- (long) shdr->sh_offset, shdr->sh_type, >- (long) str_shdr->sh_offset); >- >- for (sym = symtab; >- sym < symtab_end; >- sym = (Elf_W (Sym) *) ((char *) sym + syment_size)) >- { >- if (ELF_W (ST_TYPE) (sym->st_info) == STT_FUNC >- && sym->st_shndx != SHN_UNDEF) >- { >- Elf_W (Shdr) *shdr2; >- int i2; >- >- val = sym->st_value; >- if (sym->st_shndx != SHN_ABS) >- val += load_offset; >- >- if (ip < val) >- continue; >- if (val + sym->st_size < val_max_below) >- continue; >- val_max_below = val + sym->st_size; >- if (sym->st_size && ip >= val + sym->st_size) >- continue; >- >- if ((Elf_W (Addr)) (ip - val) >= min_dist) >- continue; >- >- /* Check both the address and the symbol belong to the same >- section. */ >- shdr2 = (Elf_W (Shdr) *) ((char *) ei->image + soff); >- for (i2 = 0; i2 < ehdr->e_shnum; ++i2, >- shdr2 = (Elf_W (Shdr) *) (((char *) shdr2) + ehdr->e_shentsize)) >- { >- unw_word_t addr_start; >- >- if (shdr2->sh_type != SHT_PROGBITS) >- continue; >- /* `load_offset' is no absolute address. >- `shdr2->sh_addr' is address where the library was prelink(8)ed to. >- `load_offset + shdr2->sh_addr' will give the loaded address. >- `shdr2->sh_addr == 0' is for sections not in the memory image. >- prelink(8) at offset 0x0: >- load_offset=0x360000,segbase=0x360000,p_vaddr=0x0,p_paddr=0x0 >- segbase=0x360000,load_offset=0x360000,shdr2->sh_addr=0x1b4,shdr2->sh_offset=0x1b4,ip=0x3601c5 >- prelink(8) at offset 0x8048000: >- load_offset=0xf80c9000,segbase=0x111000,p_vaddr=0x8048000,p_paddr=0x8048000 >- segbase=0x111000,load_offset=0xf80c9000,shdr2->sh_addr=0x80481b4,shdr2->sh_offset=0x1b4,ip=0x1111c5 >- */ >- if (shdr2->sh_addr == 0) >- continue; >- addr_start = load_offset + shdr2->sh_addr; >- if (ip >= addr_start >- && ip < addr_start + shdr2->sh_size >- && val >= addr_start >- && val < addr_start + shdr2->sh_size) >- break; >- } >- if (i2 >= ehdr->e_shnum) >- continue; >- >- Debug (16, "0x%016lx info=0x%02x %s\n", >- (long) val, sym->st_info, strtab + sym->st_name); >- >- min_dist = (Elf_W (Addr)) (ip - val); >- if (buf) >- { >- strncpy (buf, strtab + sym->st_name, buf_len); >- buf[buf_len] = '\0'; >- } >- if (strlen (strtab + sym->st_name) > buf_len) >- ret = -UNW_ENOMEM; >- } >- } >- break; >- >- default: >- break; >- } >- shdr = (Elf_W (Shdr) *) (((char *) shdr) + ehdr->e_shentsize); >- } >- if (min_dist >= ei->size) >- return -UNW_ENOINFO; /* not found */ >- if (offp) >- *offp = min_dist; >- return ret; >-} >- >-/* Find the ELF image that contains IP and return the "closest" >- procedure name, if there is one. With some caching, this could be >- sped up greatly, but until an application materializes that's >- sensitive to the performance of this routine, why bother... */ >- >-HIDDEN int >-elf_w (get_proc_name) (unw_addr_space_t as, pid_t pid, unw_word_t ip, >- char *buf, size_t buf_len, unw_word_t *offp, void *arg) >-{ >- unsigned long segbase, mapoff; >- Elf_W (Addr) load_offset = 0; >- struct elf_image ei; >- Elf_W (Ehdr) *ehdr; >- Elf_W (Phdr) *phdr; >- int i, ret; >- >- ret = tdep_get_elf_image (as, &ei, pid, ip, &segbase, &mapoff, arg); >- if (ret < 0) >- return ret; >- >- ehdr = ei.image; >- phdr = (Elf_W (Phdr) *) ((char *) ei.image + ehdr->e_phoff); >- >- for (i = 0; i < ehdr->e_phnum; ++i) >- if (phdr[i].p_type == PT_LOAD && phdr[i].p_offset == mapoff) >- { >- load_offset = segbase - phdr[i].p_vaddr; >- break; >- } >- >- ret = elf_w (lookup_symbol) (ip, &ei, load_offset, buf, buf_len, offp); >- >- munmap (ei.image, ei.size); >- ei.image = NULL; >- >- return ret; >-} >Index: src/elfxx.h >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/elfxx.h,v >retrieving revision 1.2 >diff -u -p -r1.2 elfxx.h >--- src/elfxx.h 20 Sep 2006 03:49:38 -0000 1.2 >+++ src/elfxx.h 4 Mar 2007 15:38:24 -0000 >@@ -24,13 +24,6 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING > WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ > > #include <elf.h> >-#include <fcntl.h> >-#include <unistd.h> >- >-#include <sys/mman.h> >-#include <sys/stat.h> >- >-#include "libunwind_i.h" > > #if ELF_CLASS == ELFCLASS32 > # define ELF_W(x) ELF32_##x >@@ -41,34 +34,3 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE > # define Elf_W(x) Elf64_##x > # define elf_w(x) _Uelf64_##x > #endif >- >-static inline int >-elf_map_image (struct elf_image *ei, const char *path) >-{ >- struct stat stat; >- int fd; >- >- fd = open (path, O_RDONLY); >- if (fd < 0) >- return -1; >- >- if (fstat (fd, &stat) < 0) >- { >- close (fd); >- return -1; >- } >- >- ei->size = stat.st_size; >- ei->image = mmap (NULL, ei->size, PROT_READ, MAP_PRIVATE, fd, 0); >- close (fd); >- if (ei->image == MAP_FAILED) >- return -1; >- >- return 0; >-} >- >-extern int elf_w (valid_object) (struct elf_image *ei); >-extern int elf_w (get_proc_name) (unw_addr_space_t as, >- pid_t pid, unw_word_t ip, >- char *buf, size_t len, >- unw_word_t *offp, void *arg); >Index: src/os-linux.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/os-linux.c,v >retrieving revision 1.4 >diff -u -p -r1.4 os-linux.c >--- src/os-linux.c 20 Sep 2006 03:49:38 -0000 1.4 >+++ src/os-linux.c 4 Mar 2007 15:38:24 -0000 >@@ -35,6 +35,31 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE > # define MAX_VDSO_SIZE ((size_t) sysconf (_SC_PAGESIZE)) > #endif > >+static inline int >+elf_map_image (struct elf_image *ei, const char *path) >+{ >+ struct stat stat; >+ int fd; >+ >+ fd = open (path, O_RDONLY); >+ if (fd < 0) >+ return -1; >+ >+ if (fstat (fd, &stat) < 0) >+ { >+ close (fd); >+ return -1; >+ } >+ >+ ei->size = stat.st_size; >+ ei->image = mmap (NULL, ei->size, PROT_READ, MAP_PRIVATE, fd, 0); >+ close (fd); >+ if (ei->image == MAP_FAILED) >+ return -1; >+ >+ return 0; >+} >+ > PROTECTED int > tdep_get_elf_image (unw_addr_space_t as, struct elf_image *ei, > pid_t pid, unw_word_t ip, >Index: src/os-linux.h >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/os-linux.h,v >retrieving revision 1.2 >diff -u -p -r1.2 os-linux.h >--- src/os-linux.h 20 Sep 2006 03:49:38 -0000 1.2 >+++ src/os-linux.h 4 Mar 2007 15:38:24 -0000 >@@ -26,6 +26,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE > #ifndef os_linux_h > #define os_linux_h > >+#include <fcntl.h> >+#include <sys/mman.h> >+ > struct map_iterator > { > off_t offset; >Index: src/dwarf/Gfde.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/dwarf/Gfde.c,v >retrieving revision 1.2 >diff -u -p -r1.2 Gfde.c >--- src/dwarf/Gfde.c 24 Nov 2006 21:04:11 -0000 1.2 >+++ src/dwarf/Gfde.c 4 Mar 2007 15:38:24 -0000 >@@ -228,7 +228,7 @@ dwarf_extract_proc_info_from_fde (unw_ad > > if (u32val != 0xffffffff) > { >- uint32_t cie_offset; >+ int32_t cie_offset; > > /* In some configurations, an FDE with a 0 length indicates the > end of the FDE-table. */ >@@ -255,7 +255,7 @@ dwarf_extract_proc_info_from_fde (unw_ad > } > else > { >- uint64_t cie_offset; >+ int64_t cie_offset; > > /* the FDE is in the 64-bit DWARF format */ > >Index: src/dwarf/Gfind_proc_info-lsb.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/dwarf/Gfind_proc_info-lsb.c,v >retrieving revision 1.1 >diff -u -p -r1.1 Gfind_proc_info-lsb.c >--- src/dwarf/Gfind_proc_info-lsb.c 31 May 2006 18:22:16 -0000 1.1 >+++ src/dwarf/Gfind_proc_info-lsb.c 4 Mar 2007 15:38:24 -0000 >@@ -28,6 +28,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE > > #include <link.h> > #include <stddef.h> >+#include <elf.h> >+ >+#include <elfutils/libdwfl.h> > > #include "dwarf_i.h" > #include "dwarf-eh.h" >@@ -278,8 +281,8 @@ dwarf_find_proc_info (unw_addr_space_t a > return 0; > else > /* search the table: */ >- return dwarf_search_unwind_table (as, ip, &cb_data.di, >- pi, need_unwind_info, arg); >+ return unw_search_unwind_table (as, ip, &cb_data.di, pi, need_unwind_info, >+ arg); > } > > static inline const struct table_entry * >@@ -348,8 +351,126 @@ remote_lookup (unw_addr_space_t as, > > #endif /* !UNW_LOCAL_ONLY */ > >+/* FUNCDIE_RETURN may be NULL. >+ FUNCNAME_RETURN may be NULL. >+ Function may return either just FUNCNAME or just FUNCDIE or both. */ >+ >+static int >+elfutils_open (unw_addr_space_t as, pid_t pid, unw_word_t ip, >+ Dwfl **dwfl_return, Dwarf_Die **funcdie_return, >+ const char **funcname_return) >+{ >+ Dwfl **dwfl_pointer; >+ >+ *dwfl_return = NULL; >+ /* FIXME: If AS cannot be use by more threads simultaneously a simple >+ non-atomic use counter for `as->dwfl' would be enough. */ >+ if (mutex_trylock (&as->dwfl_lock) == 0) >+ dwfl_pointer = &as->dwfl; >+ else >+ dwfl_pointer = dwfl_return; >+ >+ if (*dwfl_pointer == NULL) >+ { >+ static char *debuginfo_path; >+ >+ static const Dwfl_Callbacks proc_callbacks = >+ { >+ .find_debuginfo = dwfl_standard_find_debuginfo, >+ .debuginfo_path = &debuginfo_path, >+ >+ .find_elf = dwfl_linux_proc_find_elf, >+ }; >+ >+ *dwfl_pointer = dwfl_begin (&proc_callbacks); >+ if (*dwfl_pointer == NULL) >+ goto fail_unlock_dwfl; >+ >+ if (dwfl_linux_proc_report (*dwfl_pointer, pid) != 0 >+ || dwfl_report_end (*dwfl_pointer, NULL, NULL) != 0) >+ { >+ dwfl_end (*dwfl_pointer); >+ *dwfl_pointer = NULL; >+ goto fail_unlock_dwfl; >+ } >+ } >+ >+ Dwfl_Module *mod = dwfl_addrmodule (*dwfl_pointer, ip); >+ if (mod == NULL) >+ goto fail_unlock_dwfl; >+ >+ /* If the DIE based search fails try at least dwfl_module_addrname(). */ >+ >+ Dwarf_Addr bias = 0; >+ Dwarf_Die *cudie = dwfl_module_addrdie (mod, ip, &bias); >+ if (cudie != NULL) >+ { >+ Dwarf_Die *scopes; >+ int nscopes = dwarf_getscopes (cudie, ip - bias, &scopes); >+ if (nscopes > 0) >+ { >+/* FIXME: elfutils <dwarf.h> conflicts with "libunwind/include/dwarf.h". */ >+#define DW_TAG_subprogram 0x2e >+ >+ Dwarf_Die *funcdie = NULL; >+ int i; >+ for (i = 0; i < nscopes; ++i) >+ if (dwarf_tag (&scopes[i]) == DW_TAG_subprogram) >+ { >+ funcdie = &scopes[i]; >+ break; >+ } >+ if (funcdie != NULL) >+ { >+ if (funcdie_return != NULL) >+ *funcdie_return = funcdie; >+ if (funcname_return != NULL) >+ { >+ *funcname_return = dwarf_diename (funcdie); >+ if (*funcname_return == NULL) >+ *funcname_return = dwfl_module_addrname (mod, ip); >+ } >+ >+ return 0; >+ } >+ } >+ } >+ >+ if (funcname_return != NULL) >+ { >+ *funcname_return = dwfl_module_addrname (mod, ip); >+ if (*funcname_return != NULL) >+ { >+ if (funcdie_return != NULL) >+ *funcdie_return = NULL; >+ return 0; >+ } >+ } >+ >+fail_unlock_dwfl: >+ if (dwfl_pointer == &as->dwfl) >+ mutex_unlock (&as->dwfl_lock); >+ return -UNW_ENOINFO; >+} >+ >+static void >+elfutils_close (unw_addr_space_t as, Dwfl *dwfl) >+{ >+ if (dwfl != NULL) >+ dwfl_end (dwfl); >+ else >+ mutex_unlock (&as->dwfl_lock); >+} >+ >+HIDDEN void >+dwarf_destroy_addr_space (unw_addr_space_t as) >+{ >+ if (as->dwfl != NULL) >+ dwfl_end (as->dwfl); >+} >+ > PROTECTED int >-dwarf_search_unwind_table (unw_addr_space_t as, unw_word_t ip, >+dwarf_search_unwind_table (unw_addr_space_t as, pid_t pid, unw_word_t ip, > unw_dyn_info_t *di, unw_proc_info_t *pi, > int need_unwind_info, void *arg) > { >@@ -401,8 +522,38 @@ dwarf_search_unwind_table (unw_addr_spac > need_unwind_info, arg)) < 0) > return ret; > >- if (ip < pi->start_ip || ip >= pi->end_ip) >- return -UNW_ENOINFO; >+ /* elfutils is used here only as a sanity check. */ >+ >+ Dwarf_Die *funcdie; >+ Dwfl *dwfl; >+ if (elfutils_open (as, pid, ip, &dwfl, &funcdie, NULL) != 0) >+ { >+ /* At least for "vdso" we have `.eh_frame' but no debug info. >+ So far elfutils fail without any debug info missing, >+ it even cannot handle `.eh_frame'. */ >+ Debug (15, "We can pass but note elfutils init failed for IP 0x%lx\n", >+ (unsigned long) ip); >+ return 0; >+ } >+ >+ Dwarf_Addr dwarf_addr; >+ if (dwarf_lowpc (funcdie, &dwarf_addr) != 0) >+ Debug (15, "elfutils dwarf_lowpc() failed for IP 0x%lx\n", >+ (unsigned long) ip); >+ else if (dwarf_addr != pi->start_ip) >+ Debug (15, "elfutils start_ip 0x%lx != libunwind 0x%lx for IP 0x%lx\n", >+ (unsigned long) dwarf_addr, (unsigned long) pi->start_ip, >+ (unsigned long) ip); >+ >+ if (dwarf_highpc (funcdie, &dwarf_addr) != 0) >+ Debug (15, "elfutils dwarf_lowpc() failed for IP 0x%lx\n", >+ (unsigned long) ip); >+ else if (dwarf_addr != pi->end_ip) >+ Debug (15, "elfutils end_ip 0x%lx != libunwind 0x%lx for IP 0x%lx\n", >+ (unsigned long) dwarf_addr, (unsigned long) pi->end_ip, >+ (unsigned long) ip); >+ >+ elfutils_close (as, dwfl); > > return 0; > } >@@ -412,3 +563,47 @@ dwarf_put_unwind_info (unw_addr_space_t > { > return; /* always a nop */ > } >+ >+PROTECTED int >+dwarf_get_proc_name (unw_addr_space_t as, pid_t pid, unw_word_t ip, char *buf, >+ size_t buf_len, unw_word_t *offp, void *arg) >+{ >+ Dwarf_Die *funcdie; >+ Dwfl *dwfl; >+ int retval = 0; >+ const char *funcname; >+ >+ if (elfutils_open (as, pid, ip, &dwfl, (offp == NULL ? NULL : &funcdie), >+ (buf == NULL ? NULL : &funcname)) != 0) >+ { >+ Debug (15, "elfutils init failed for IP 0x%lx\n", (unsigned long) ip); >+ return -UNW_ENOINFO; >+ } >+ >+ if (buf != NULL) >+ { >+ if (funcname == NULL) >+ retval = -UNW_ENOINFO; >+ else if (strlen (funcname) + 1 > buf_len) >+ retval = -UNW_ENOMEM; >+ else >+ strcpy (buf, funcname); >+ } >+ >+ if (offp != NULL) >+ { >+ Dwarf_Addr dwarf_addr; >+ >+ if (funcdie == NULL || dwarf_lowpc (funcdie, &dwarf_addr) != 0) >+ { >+ /* FIXME: elfutils does not return `lowpc' for `.dynsym' symbols. */ >+ *offp = 0; >+ } >+ else >+ *offp = ip - dwarf_addr; >+ } >+ >+ elfutils_close (as, dwfl); >+ >+ return retval; >+} >Index: src/dwarf/Gstep.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/dwarf/Gstep.c,v >retrieving revision 1.1 >diff -u -p -r1.1 Gstep.c >--- src/dwarf/Gstep.c 31 May 2006 18:22:16 -0000 1.1 >+++ src/dwarf/Gstep.c 4 Mar 2007 15:38:24 -0000 >@@ -29,7 +29,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE > HIDDEN int > dwarf_step (struct dwarf_cursor *c) > { >- unw_word_t prev_cfa = c->cfa; > int ret; > > if ((ret = dwarf_find_save_locs (c)) >= 0) { >Index: src/hppa/Ginit.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/hppa/Ginit.c,v >retrieving revision 1.2 >diff -u -p -r1.2 Ginit.c >--- src/hppa/Ginit.c 20 Sep 2006 03:49:39 -0000 1.2 >+++ src/hppa/Ginit.c 4 Mar 2007 15:38:25 -0000 >@@ -174,6 +174,15 @@ get_static_proc_name (unw_addr_space_t a > return _Uelf32_get_proc_name (as, getpid (), ip, buf, buf_len, offp, arg); > } > >+static int >+search_static_unwind_table (unw_addr_space_t as, unw_word_t ip, >+ unw_dyn_info_t *di, unw_proc_info_t *pi, >+ int need_unwind_info, void *arg) >+{ >+ return tdep_search_unwind_table (as, getpid (), ip, di, pi, need_unwind_info, >+ arg); >+} >+ > HIDDEN void > hppa_local_addr_space_init (void) > { >@@ -187,6 +196,7 @@ hppa_local_addr_space_init (void) > local_addr_space.acc.access_fpreg = access_fpreg; > local_addr_space.acc.resume = hppa_local_resume; > local_addr_space.acc.get_proc_name = get_static_proc_name; >+ local_addr_space.acc.search_unwind_table = search_static_unwind_table; > unw_flush_cache (&local_addr_space, 0, 0); > } > >Index: src/hppa/tables.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/hppa/tables.c,v >retrieving revision 1.1 >diff -u -p -r1.1 tables.c >--- src/hppa/tables.c 31 May 2006 19:04:20 -0000 1.1 >+++ src/hppa/tables.c 4 Mar 2007 15:38:25 -0000 >@@ -21,7 +21,7 @@ tdep_find_proc_info (unw_addr_space_t as > } > > HIDDEN int >-tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip, >+tdep_search_unwind_table (unw_addr_space_t as, pid_t pid, unw_word_t ip, > unw_dyn_info_t *di, > unw_proc_info_t *pi, int need_unwind_info, void *arg) > { >Index: src/ia64/Gcreate_addr_space.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/ia64/Gcreate_addr_space.c,v >retrieving revision 1.1 >diff -u -p -r1.1 Gcreate_addr_space.c >--- src/ia64/Gcreate_addr_space.c 31 May 2006 19:04:20 -0000 1.1 >+++ src/ia64/Gcreate_addr_space.c 4 Mar 2007 15:38:25 -0000 >@@ -41,6 +41,7 @@ unw_create_addr_space (unw_accessors_t * > memset (as, 0, sizeof (*as)); > > as->acc = *a; >+ mutex_init (&as->dwfl_lock); > > /* > * IA-64 supports only big or little-endian, not weird stuff like >Index: src/ia64/Ginit.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/ia64/Ginit.c,v >retrieving revision 1.2 >diff -u -p -r1.2 Ginit.c >--- src/ia64/Ginit.c 20 Sep 2006 03:49:39 -0000 1.2 >+++ src/ia64/Ginit.c 4 Mar 2007 15:38:25 -0000 >@@ -355,6 +355,15 @@ get_static_proc_name (unw_addr_space_t a > return _Uelf64_get_proc_name (as, getpid (), ip, buf, buf_len, offp, arg); > } > >+static int >+search_static_unwind_table (unw_addr_space_t as, unw_word_t ip, >+ unw_dyn_info_t *di, unw_proc_info_t *pi, >+ int need_unwind_info, void *arg) >+{ >+ return tdep_search_unwind_table (as, getpid (), ip, di, pi, need_unwind_info, >+ arg); >+} >+ > HIDDEN void > ia64_local_addr_space_init (void) > { >@@ -374,6 +383,7 @@ ia64_local_addr_space_init (void) > local_addr_space.acc.access_fpreg = access_fpreg; > local_addr_space.acc.resume = ia64_local_resume; > local_addr_space.acc.get_proc_name = get_static_proc_name; >+ local_addr_space.acc.search_unwind_table = search_static_unwind_table; > unw_flush_cache (&local_addr_space, 0, 0); > } > >Index: src/ia64/Gtables.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/ia64/Gtables.c,v >retrieving revision 1.1 >diff -u -p -r1.1 Gtables.c >--- src/ia64/Gtables.c 31 May 2006 19:04:20 -0000 1.1 >+++ src/ia64/Gtables.c 4 Mar 2007 15:38:25 -0000 >@@ -248,7 +248,7 @@ lookup (struct ia64_table_entry *table, > } > > PROTECTED int >-unw_search_ia64_unwind_table (unw_addr_space_t as, unw_word_t ip, >+unw_search_ia64_unwind_table (unw_addr_space_t as, pid_t pid, unw_word_t ip, > unw_dyn_info_t *di, unw_proc_info_t *pi, > int need_unwind_info, void *arg) > { >@@ -715,7 +715,7 @@ tdep_find_proc_info (unw_addr_space_t as > # endif > > /* now search the table: */ >- return tdep_search_unwind_table (as, ip, dip, pi, need_unwind_info, arg); >+ return unw_search_unwind_table (as, ip, dip, pi, need_unwind_info, arg); > } > > /* Returns 1 if the cache is up-to-date or -1 if the cache contained >Index: src/mi/Gdestroy_addr_space.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/mi/Gdestroy_addr_space.c,v >retrieving revision 1.1 >diff -u -p -r1.1 Gdestroy_addr_space.c >--- src/mi/Gdestroy_addr_space.c 31 May 2006 19:04:20 -0000 1.1 >+++ src/mi/Gdestroy_addr_space.c 4 Mar 2007 15:38:25 -0000 >@@ -28,6 +28,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE > PROTECTED void > unw_destroy_addr_space (unw_addr_space_t as) > { >+ tdep_destroy_addr_space (as); > #ifndef UNW_LOCAL_ONLY > # if UNW_DEBUG > memset (as, 0, sizeof (*as)); >Index: src/mi/Gdyn-extract.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/mi/Gdyn-extract.c,v >retrieving revision 1.1 >diff -u -p -r1.1 Gdyn-extract.c >--- src/mi/Gdyn-extract.c 31 May 2006 19:04:20 -0000 1.1 >+++ src/mi/Gdyn-extract.c 4 Mar 2007 15:38:25 -0000 >@@ -49,12 +49,9 @@ unwi_extract_dynamic_proc_info (unw_addr > > case UNW_INFO_FORMAT_TABLE: > case UNW_INFO_FORMAT_REMOTE_TABLE: >-#ifdef tdep_search_unwind_table > /* call platform-specific search routine: */ >- return tdep_search_unwind_table (as, ip, di, pi, need_unwind_info, arg); >-#else >- /* fall through */ >-#endif >+ return unw_search_unwind_table (as, ip, di, pi, need_unwind_info, arg); >+ > default: > break; > } >Index: src/mi/Gsearch_unwind_table.c >=================================================================== >RCS file: src/mi/Gsearch_unwind_table.c >diff -N src/mi/Gsearch_unwind_table.c >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/mi/Gsearch_unwind_table.c 4 Mar 2007 15:38:25 -0000 >@@ -0,0 +1,38 @@ >+/* libunwind - a platform-independent unwind library >+ Copyright (C) 2007 Red Hat >+ Contributed by Jan Kratochvil <jan.kratochvil@redhat.com> >+ >+This file is part of libunwind. >+ >+Permission is hereby granted, free of charge, to any person obtaining >+a copy of this software and associated documentation files (the >+"Software"), to deal in the Software without restriction, including >+without limitation the rights to use, copy, modify, merge, publish, >+distribute, sublicense, and/or sell copies of the Software, and to >+permit persons to whom the Software is furnished to do so, subject to >+the following conditions: >+ >+The above copyright notice and this permission notice shall be >+included in all copies or substantial portions of the Software. >+ >+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, >+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF >+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND >+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE >+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION >+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION >+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ >+ >+#include "libunwind_i.h" >+ >+PROTECTED int >+unw_search_unwind_table (unw_addr_space_t as, unw_word_t ip, unw_dyn_info_t *di, >+ unw_proc_info_t *pi, int need_unwind_info, void *arg) >+{ >+ unw_accessors_t *a = unw_get_accessors (as); >+ >+ if (a->search_unwind_table) >+ return (*a->search_unwind_table) (as, ip, di, pi, need_unwind_info, arg); >+ >+ return -UNW_ENOINFO; >+} >Index: src/mi/mempool.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/mi/mempool.c,v >retrieving revision 1.1 >diff -u -p -r1.1 mempool.c >--- src/mi/mempool.c 31 May 2006 19:04:20 -0000 1.1 >+++ src/mi/mempool.c 4 Mar 2007 15:38:25 -0000 >@@ -23,6 +23,8 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER L > OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION > WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ > >+#include <sys/mman.h> >+ > #include "libunwind_i.h" > #include "mempool.h" > >Index: src/ppc64/Gcreate_addr_space.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/ppc64/Gcreate_addr_space.c,v >retrieving revision 1.1 >diff -u -p -r1.1 Gcreate_addr_space.c >--- src/ppc64/Gcreate_addr_space.c 29 Aug 2006 07:48:10 -0000 1.1 >+++ src/ppc64/Gcreate_addr_space.c 4 Mar 2007 15:38:25 -0000 >@@ -45,6 +45,7 @@ unw_create_addr_space (unw_accessors_t * > memset (as, 0, sizeof (*as)); > > as->acc = *a; >+ mutex_init (&as->dwfl_lock); > > /* > * Linux ppc64 supports only big-endian. >Index: src/ppc64/Ginit.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/ppc64/Ginit.c,v >retrieving revision 1.2 >diff -u -p -r1.2 Ginit.c >--- src/ppc64/Ginit.c 20 Sep 2006 03:49:39 -0000 1.2 >+++ src/ppc64/Ginit.c 4 Mar 2007 15:38:25 -0000 >@@ -129,6 +129,15 @@ get_static_proc_name (unw_addr_space_t a > return _Uelf64_get_proc_name (as, getpid (), ip, buf, buf_len, offp, arg); > } > >+static int >+search_static_unwind_table (unw_addr_space_t as, unw_word_t ip, >+ unw_dyn_info_t *di, unw_proc_info_t *pi, >+ int need_unwind_info, void *arg) >+{ >+ return tdep_search_unwind_table (as, getpid (), ip, di, pi, need_unwind_info, >+ arg); >+} >+ > HIDDEN void > ppc64_local_addr_space_init (void) > { >@@ -142,6 +151,7 @@ ppc64_local_addr_space_init (void) > local_addr_space.acc.access_fpreg = access_fpreg; > local_addr_space.acc.resume = ppc64_local_resume; > local_addr_space.acc.get_proc_name = get_static_proc_name; >+ local_addr_space.acc.search_unwind_table = search_static_unwind_table; > unw_flush_cache (&local_addr_space, 0, 0); > > local_addr_space.acc.validate = 0; >Index: src/ptrace/_UPT_accessors.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/ptrace/_UPT_accessors.c,v >retrieving revision 1.1 >diff -u -p -r1.1 _UPT_accessors.c >--- src/ptrace/_UPT_accessors.c 31 May 2006 19:04:20 -0000 1.1 >+++ src/ptrace/_UPT_accessors.c 4 Mar 2007 15:38:25 -0000 >@@ -34,5 +34,6 @@ PROTECTED unw_accessors_t _UPT_accessors > .access_reg = _UPT_access_reg, > .access_fpreg = _UPT_access_fpreg, > .resume = _UPT_resume, >- .get_proc_name = _UPT_get_proc_name >+ .get_proc_name = _UPT_get_proc_name, >+ .search_unwind_table = _UPT_search_unwind_table > }; >Index: src/ptrace/_UPT_elf.c >=================================================================== >RCS file: src/ptrace/_UPT_elf.c >diff -N src/ptrace/_UPT_elf.c >--- src/ptrace/_UPT_elf.c 31 May 2006 19:04:20 -0000 1.1 >+++ /dev/null 1 Jan 1970 00:00:00 -0000 >@@ -1,5 +0,0 @@ >-/* We need to get a separate copy of the ELF-code into >- libunwind-ptrace since it cannot (and must not) have any ELF >- dependencies on libunwind. */ >-#include "libunwind_i.h" /* get ELFCLASS defined */ >-#include "../elfxx.c" >Index: src/ptrace/_UPT_find_proc_info.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/ptrace/_UPT_find_proc_info.c,v >retrieving revision 1.3 >diff -u -p -r1.3 _UPT_find_proc_info.c >--- src/ptrace/_UPT_find_proc_info.c 20 Sep 2006 03:49:39 -0000 1.3 >+++ src/ptrace/_UPT_find_proc_info.c 4 Mar 2007 15:38:25 -0000 >@@ -103,8 +103,10 @@ _UPTi_find_unwind_table (struct UPT_info > Elf64_Ehdr *ehdr; > int i; > >+#if 0 /* FIXME */ > if (!_Uelf64_valid_object (&ui->ei)) > return NULL; >+#endif > > ehdr = ui->ei.image; > phdr = (Elf64_Phdr *) ((char *) ui->ei.image + ehdr->e_phoff); >@@ -176,8 +178,10 @@ _UPTi_find_unwind_table (struct UPT_info > > /* XXX: Much of this code is Linux/LSB-specific. */ > >+#if 0 /* FIXME */ > if (!elf_w(valid_object) (&ui->ei)) > return NULL; >+#endif > > ehdr = ui->ei.image; > phdr = (Elf_W(Phdr) *) ((char *) ui->ei.image + ehdr->e_phoff); >@@ -374,8 +378,8 @@ _UPT_find_proc_info (unw_addr_space_t as > case, we simply make a copy of the unwind-info, so > _UPT_put_unwind_info() can always free() the unwind-info > without ill effects. */ >- int ret = tdep_search_unwind_table (unw_local_addr_space, ip, di, pi, >- need_unwind_info, arg); >+ int ret = unw_search_unwind_table (unw_local_addr_space, ip, di, pi, >+ need_unwind_info, arg); > if (ret >= 0 && need_unwind_info) > { > void *mem = malloc (pi->unwind_info_size); >@@ -389,5 +393,5 @@ _UPT_find_proc_info (unw_addr_space_t as > } > else > #endif >- return tdep_search_unwind_table (as, ip, di, pi, need_unwind_info, arg); >+ return unw_search_unwind_table (as, ip, di, pi, need_unwind_info, arg); > } >Index: src/ptrace/_UPT_get_proc_name.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/ptrace/_UPT_get_proc_name.c,v >retrieving revision 1.2 >diff -u -p -r1.2 _UPT_get_proc_name.c >--- src/ptrace/_UPT_get_proc_name.c 20 Sep 2006 03:49:39 -0000 1.2 >+++ src/ptrace/_UPT_get_proc_name.c 4 Mar 2007 15:38:25 -0000 >@@ -31,11 +31,5 @@ _UPT_get_proc_name (unw_addr_space_t as, > { > struct UPT_info *ui = arg; > >-#if ELF_CLASS == ELFCLASS64 >- return _Uelf64_get_proc_name (as, ui->pid, ip, buf, buf_len, offp, arg); >-#elif ELF_CLASS == ELFCLASS32 >- return _Uelf32_get_proc_name (as, ui->pid, ip, buf, buf_len, offp, arg); >-#else >- return -UNW_ENOINFO; >-#endif >+ return tdep_get_proc_name (as, ui->pid, ip, buf, buf_len, offp, arg); > } >Index: src/ptrace/_UPT_search_unwind_table.c >=================================================================== >RCS file: src/ptrace/_UPT_search_unwind_table.c >diff -N src/ptrace/_UPT_search_unwind_table.c >--- /dev/null 1 Jan 1970 00:00:00 -0000 >+++ src/ptrace/_UPT_search_unwind_table.c 4 Mar 2007 15:38:25 -0000 >@@ -0,0 +1,37 @@ >+/* libunwind - a platform-independent unwind library >+ Copyright (C) 2007 Red Hat >+ Contributed by Jan Kratochvil <jan.kratochvil@redhat.com> >+ >+This file is part of libunwind. >+ >+Permission is hereby granted, free of charge, to any person obtaining >+a copy of this software and associated documentation files (the >+"Software"), to deal in the Software without restriction, including >+without limitation the rights to use, copy, modify, merge, publish, >+distribute, sublicense, and/or sell copies of the Software, and to >+permit persons to whom the Software is furnished to do so, subject to >+the following conditions: >+ >+The above copyright notice and this permission notice shall be >+included in all copies or substantial portions of the Software. >+ >+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, >+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF >+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND >+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE >+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION >+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION >+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ >+ >+#include "_UPT_internal.h" >+ >+int >+_UPT_search_unwind_table (unw_addr_space_t as, unw_word_t ip, >+ unw_dyn_info_t *di, unw_proc_info_t *pi, >+ int need_unwind_info, void *arg) >+{ >+ struct UPT_info *ui = arg; >+ >+ return tdep_search_unwind_table (as, ui->pid, ip, di, pi, need_unwind_info, >+ arg); >+} >Index: src/x86/Gcreate_addr_space.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/x86/Gcreate_addr_space.c,v >retrieving revision 1.1 >diff -u -p -r1.1 Gcreate_addr_space.c >--- src/x86/Gcreate_addr_space.c 31 May 2006 19:04:20 -0000 1.1 >+++ src/x86/Gcreate_addr_space.c 4 Mar 2007 15:38:25 -0000 >@@ -41,6 +41,7 @@ unw_create_addr_space (unw_accessors_t * > memset (as, 0, sizeof (*as)); > > as->acc = *a; >+ mutex_init (&as->dwfl_lock); > > /* > * x86 supports only little-endian. >Index: src/x86/Ginit.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/x86/Ginit.c,v >retrieving revision 1.2 >diff -u -p -r1.2 Ginit.c >--- src/x86/Ginit.c 20 Sep 2006 03:49:39 -0000 1.2 >+++ src/x86/Ginit.c 4 Mar 2007 15:38:25 -0000 >@@ -186,7 +186,16 @@ get_static_proc_name (unw_addr_space_t a > char *buf, size_t buf_len, unw_word_t *offp, > void *arg) > { >- return _Uelf32_get_proc_name (as, getpid (), ip, buf, buf_len, offp, arg); >+ return tdep_get_proc_name (as, getpid (), ip, buf, buf_len, offp, arg); >+} >+ >+static int >+search_static_unwind_table (unw_addr_space_t as, unw_word_t ip, >+ unw_dyn_info_t *di, unw_proc_info_t *pi, >+ int need_unwind_info, void *arg) >+{ >+ return tdep_search_unwind_table (as, getpid (), ip, di, pi, need_unwind_info, >+ arg); > } > > HIDDEN void >@@ -202,6 +211,7 @@ x86_local_addr_space_init (void) > local_addr_space.acc.access_fpreg = access_fpreg; > local_addr_space.acc.resume = x86_local_resume; > local_addr_space.acc.get_proc_name = get_static_proc_name; >+ local_addr_space.acc.search_unwind_table = search_static_unwind_table; > unw_flush_cache (&local_addr_space, 0, 0); > } > >Index: src/x86_64/Gcreate_addr_space.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/x86_64/Gcreate_addr_space.c,v >retrieving revision 1.1 >diff -u -p -r1.1 Gcreate_addr_space.c >--- src/x86_64/Gcreate_addr_space.c 31 May 2006 19:04:20 -0000 1.1 >+++ src/x86_64/Gcreate_addr_space.c 4 Mar 2007 15:38:25 -0000 >@@ -43,6 +43,7 @@ unw_create_addr_space (unw_accessors_t * > memset (as, 0, sizeof (*as)); > > as->acc = *a; >+ mutex_init (&as->dwfl_lock); > > /* > * x86_64 supports only little-endian. >Index: src/x86_64/Ginit.c >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/src/x86_64/Ginit.c,v >retrieving revision 1.2 >diff -u -p -r1.2 Ginit.c >--- src/x86_64/Ginit.c 20 Sep 2006 03:49:39 -0000 1.2 >+++ src/x86_64/Ginit.c 4 Mar 2007 15:38:25 -0000 >@@ -235,6 +235,15 @@ get_static_proc_name (unw_addr_space_t a > return _Uelf64_get_proc_name (as, getpid (), ip, buf, buf_len, offp, arg); > } > >+static int >+search_static_unwind_table (unw_addr_space_t as, unw_word_t ip, >+ unw_dyn_info_t *di, unw_proc_info_t *pi, >+ int need_unwind_info, void *arg) >+{ >+ return tdep_search_unwind_table (as, getpid (), ip, di, pi, need_unwind_info, >+ arg); >+} >+ > HIDDEN void > x86_64_local_addr_space_init (void) > { >@@ -248,6 +257,7 @@ x86_64_local_addr_space_init (void) > local_addr_space.acc.access_fpreg = access_fpreg; > local_addr_space.acc.resume = x86_64_local_resume; > local_addr_space.acc.get_proc_name = get_static_proc_name; >+ local_addr_space.acc.search_unwind_table = search_static_unwind_table; > unw_flush_cache (&local_addr_space, 0, 0); > > local_addr_space.acc.validate = 0; >Index: tests/Makefile.in >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/tests/Makefile.in,v >retrieving revision 1.6 >diff -u -p -r1.6 Makefile.in >--- tests/Makefile.in 28 Feb 2007 18:00:48 -0000 1.6 >+++ tests/Makefile.in 4 Mar 2007 15:38:25 -0000 >@@ -107,7 +107,7 @@ $(OBJS_localize): > ### > > LD = $(CC) >-LINK = $(LD) $(LDFLAGS) -o $@ $^ $(LDADD) $(LIBUNWIND) $(LIBS) >+LINK = $(LD) $(LDFLAGS) -o $@ $^ $(LDADD) $(LIBUNWIND) @LIBDW@ $(LIBS) > > LDFLAGS += -L$(top_builddir)/src -Wl,-rpath=$(top_builddir)/src > >Index: tests/check-namespace.sh.in >=================================================================== >RCS file: /cvs/frysk/frysk-imports/libunwind/tests/check-namespace.sh.in,v >retrieving revision 1.3 >diff -u -p -r1.3 check-namespace.sh.in >--- tests/check-namespace.sh.in 28 Feb 2007 17:54:03 -0000 1.3 >+++ tests/check-namespace.sh.in 4 Mar 2007 15:38:25 -0000 >@@ -101,11 +101,15 @@ function check_local_unw_abi { > match _U_dyn_info_list_addr > match _U_dyn_register > >+ # FIXME: Probably incorrectly implemented. >+ match unw_search_unwind_table >+ > match backtrace > > case ${plat} in > hppa) > match _UL${plat}_dwarf_search_unwind_table >+ match _UL${plat}_dwarf_get_proc_name > match _U${plat}_get_elf_image > match _U${plat}_setcontext > match _U${plat}_getcontext >@@ -125,15 +129,18 @@ function check_local_unw_abi { > match _U${plat}_get_elf_image > match _U${plat}_is_fpreg > match _UL${plat}_dwarf_search_unwind_table >+ match _UL${plat}_dwarf_get_proc_name > ;; > x86_64) > match _U${plat}_get_elf_image > match _U${plat}_is_fpreg > match _UL${plat}_dwarf_search_unwind_table >+ match _UL${plat}_dwarf_get_proc_name > ;; > *) > match _U${plat}_is_fpreg > match _UL${plat}_dwarf_search_unwind_table >+ match _UL${plat}_dwarf_get_proc_name > ;; > esac > } >@@ -160,10 +167,13 @@ function check_generic_unw_abi { > match _U${plat}_set_reg > match _U${plat}_step > match _U${plat}_strerror >+ # FIXME: Probably incorrectly implemented. >+ match unw_search_unwind_table > > case ${plat} in > hppa) > match _U${plat}_dwarf_search_unwind_table >+ match _U${plat}_dwarf_get_proc_name > match _U${plat}_get_elf_image > ;; > ia64) >@@ -182,15 +192,18 @@ function check_generic_unw_abi { > match _U${plat}_get_elf_image > match _U${plat}_is_fpreg > match _U${plat}_dwarf_search_unwind_table >+ match _U${plat}_dwarf_get_proc_name > ;; > x86_64) > match _U${plat}_get_elf_image > match _U${plat}_is_fpreg > match _U${plat}_dwarf_search_unwind_table >+ match _U${plat}_dwarf_get_proc_name > ;; > *) > match _U${plat}_is_fpreg > match _U${plat}_dwarf_search_unwind_table >+ match _U${plat}_dwarf_get_proc_name > ;; > esac > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 229424
:
148454
|
148455
|
149211
|
149409