aboutsummaryrefslogtreecommitdiff
path: root/devel/gdb/files/commit-2526815
diff options
context:
space:
mode:
Diffstat (limited to 'devel/gdb/files/commit-2526815')
-rw-r--r--devel/gdb/files/commit-2526815186
1 files changed, 186 insertions, 0 deletions
diff --git a/devel/gdb/files/commit-2526815 b/devel/gdb/files/commit-2526815
new file mode 100644
index 000000000000..72a46ed83466
--- /dev/null
+++ b/devel/gdb/files/commit-2526815
@@ -0,0 +1,186 @@
+diff --git gdb/config.in gdb/config.in
+index 3ccac37..8a27df0 100644
+--- gdb/config.in
++++ gdb/config.in
+@@ -213,6 +213,9 @@
+ /* Define to 1 if you have the <inttypes.h> header file. */
+ #undef HAVE_INTTYPES_H
+
++/* Define to 1 if your system has the kinfo_getvmmap function. */
++#undef HAVE_KINFO_GETVMMAP
++
+ /* Define if you have <langinfo.h> and nl_langinfo(CODESET). */
+ #undef HAVE_LANGINFO_CODESET
+
+diff --git gdb/configure gdb/configure
+index cca0aeb..78d206b 100755
+--- gdb/configure
++++ gdb/configure
+@@ -7159,6 +7159,66 @@ if test "$ac_res" != no; then :
+ fi
+
+
++# On FreeBSD we may need libutil for kinfo_getvmmap (used by fbsd-nat.c).
++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing kinfo_getvmmap" >&5
++$as_echo_n "checking for library containing kinfo_getvmmap... " >&6; }
++if test "${ac_cv_search_kinfo_getvmmap+set}" = set; then :
++ $as_echo_n "(cached) " >&6
++else
++ ac_func_search_save_LIBS=$LIBS
++cat confdefs.h - <<_ACEOF >conftest.$ac_ext
++/* end confdefs.h. */
++
++/* Override any GCC internal prototype to avoid an error.
++ Use char because int might match the return type of a GCC
++ builtin and then its argument prototype would still apply. */
++#ifdef __cplusplus
++extern "C"
++#endif
++char kinfo_getvmmap ();
++int
++main ()
++{
++return kinfo_getvmmap ();
++ ;
++ return 0;
++}
++_ACEOF
++for ac_lib in '' util; do
++ if test -z "$ac_lib"; then
++ ac_res="none required"
++ else
++ ac_res=-l$ac_lib
++ LIBS="-l$ac_lib $ac_func_search_save_LIBS"
++ fi
++ if ac_fn_c_try_link "$LINENO"; then :
++ ac_cv_search_kinfo_getvmmap=$ac_res
++fi
++rm -f core conftest.err conftest.$ac_objext \
++ conftest$ac_exeext
++ if test "${ac_cv_search_kinfo_getvmmap+set}" = set; then :
++ break
++fi
++done
++if test "${ac_cv_search_kinfo_getvmmap+set}" = set; then :
++
++else
++ ac_cv_search_kinfo_getvmmap=no
++fi
++rm conftest.$ac_ext
++LIBS=$ac_func_search_save_LIBS
++fi
++{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_kinfo_getvmmap" >&5
++$as_echo "$ac_cv_search_kinfo_getvmmap" >&6; }
++ac_res=$ac_cv_search_kinfo_getvmmap
++if test "$ac_res" != no; then :
++ test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
++
++$as_echo "#define HAVE_KINFO_GETVMMAP 1" >>confdefs.h
++
++fi
++
++
+
+
+
+diff --git gdb/configure.ac gdb/configure.ac
+index 4a0b6a3..38747e8 100644
+--- gdb/configure.ac
++++ gdb/configure.ac
+@@ -537,6 +537,11 @@ AM_ZLIB
+ # On HP/UX we may need libxpdl for dlgetmodinfo (used by solib-pa64.c).
+ AC_SEARCH_LIBS(dlgetmodinfo, [dl xpdl])
+
++# On FreeBSD we may need libutil for kinfo_getvmmap (used by fbsd-nat.c).
++AC_SEARCH_LIBS(kinfo_getvmmap, util,
++ [AC_DEFINE(HAVE_KINFO_GETVMMAP, 1,
++ [Define to 1 if your system has the kinfo_getvmmap function. ])])
++
+ AM_ICONV
+
+ # GDB may fork/exec the iconv program to get the list of supported character
+diff --git gdb/fbsd-nat.c gdb/fbsd-nat.c
+index 062eede..1ce197d 100644
+--- gdb/fbsd-nat.c
++++ gdb/fbsd-nat.c
+@@ -26,6 +26,10 @@
+ #include <sys/types.h>
+ #include <sys/procfs.h>
+ #include <sys/sysctl.h>
++#ifdef HAVE_KINFO_GETVMMAP
++#include <sys/user.h>
++#include <libutil.h>
++#endif
+
+ #include "elf-bfd.h"
+ #include "fbsd-nat.h"
+@@ -62,6 +66,64 @@ fbsd_pid_to_exec_file (struct target_ops *self, int pid)
+ return NULL;
+ }
+
++#ifdef HAVE_KINFO_GETVMMAP
++/* Iterate over all the memory regions in the current inferior,
++ calling FUNC for each memory region. OBFD is passed as the last
++ argument to FUNC. */
++
++int
++fbsd_find_memory_regions (struct target_ops *self,
++ find_memory_region_ftype func, void *obfd)
++{
++ pid_t pid = ptid_get_pid (inferior_ptid);
++ struct kinfo_vmentry *vmentl, *kve;
++ uint64_t size;
++ struct cleanup *cleanup;
++ int i, nitems;
++
++ vmentl = kinfo_getvmmap (pid, &nitems);
++ if (vmentl == NULL)
++ perror_with_name (_("Couldn't fetch VM map entries."));
++ cleanup = make_cleanup (free, vmentl);
++
++ for (i = 0; i < nitems; i++)
++ {
++ kve = &vmentl[i];
++
++ /* Skip unreadable segments and those where MAP_NOCORE has been set. */
++ if (!(kve->kve_protection & KVME_PROT_READ)
++ || kve->kve_flags & KVME_FLAG_NOCOREDUMP)
++ continue;
++
++ /* Skip segments with an invalid type. */
++ if (kve->kve_type != KVME_TYPE_DEFAULT
++ && kve->kve_type != KVME_TYPE_VNODE
++ && kve->kve_type != KVME_TYPE_SWAP
++ && kve->kve_type != KVME_TYPE_PHYS)
++ continue;
++
++ size = kve->kve_end - kve->kve_start;
++ if (info_verbose)
++ {
++ fprintf_filtered (gdb_stdout,
++ "Save segment, %ld bytes at %s (%c%c%c)\n",
++ (long) size,
++ paddress (target_gdbarch (), kve->kve_start),
++ kve->kve_protection & KVME_PROT_READ ? 'r' : '-',
++ kve->kve_protection & KVME_PROT_WRITE ? 'w' : '-',
++ kve->kve_protection & KVME_PROT_EXEC ? 'x' : '-');
++ }
++
++ /* Invoke the callback function to create the corefile segment.
++ Pass MODIFIED as true, we do not know the real modification state. */
++ func (kve->kve_start, size, kve->kve_protection & KVME_PROT_READ,
++ kve->kve_protection & KVME_PROT_WRITE,
++ kve->kve_protection & KVME_PROT_EXEC, 1, obfd);
++ }
++ do_cleanups (cleanup);
++ return 0;
++}
++#else
+ static int
+ fbsd_read_mapping (FILE *mapfile, unsigned long *start, unsigned long *end,
+ char *protection)
+@@ -137,3 +199,4 @@ fbsd_find_memory_regions (struct target_ops *self,
+ do_cleanups (cleanup);
+ return 0;
+ }
++#endif