From e6712ff1b5f9f440889f298b326a12325d919680 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Wed, 8 Aug 2012 19:48:19 +0000 Subject: [PATCH] * gdb_string.h: Moved to ... * common/gdb_string.h: ... here. * common/vec.h: Remove #ifndef GDBSERVER conditional inclusion of gdb_string.h and gdb_assert.h. gdbserver/ * configure.ac: Add check for strstr. * config.in: Regenerate. * configure: Regenerate. * linux-thread-db.c: #include "gdb_vecs.h". (try_thread_db_load_from_pdir_1): New arg "subdir". All callers updated. (try_thread_db_load_from_pdir): New arg "subdir". All callers updated. (thread_db_load_search): Use a vector to iterate over path elements. Handle text appearing after "$pdir". gdbserver/ * Makefile.in (SFILES): Add gdb_vecs.c. (OBS): Add gdb_vecs.o. (gdb_vecs_h, host_defs_h): New variables. (thread-db.o): Add $(gdb_vecs_h) dependency. (gdb_vecs.o): New rule. * thread-db.c: #include "gdb_vecs.h". (thread_db_load_search): Use a vector to iterate over path elements. Handle text appearing after "$pdir". --- gdb/ChangeLog | 14 +++++++ gdb/{ => common}/gdb_string.h | 0 gdb/common/vec.h | 2 - gdb/gdbserver/ChangeLog | 15 +++++++ gdb/gdbserver/Makefile.in | 11 +++-- gdb/gdbserver/config.in | 4 ++ gdb/gdbserver/configure | 10 +++++ gdb/gdbserver/configure.ac | 2 +- gdb/gdbserver/thread-db.c | 34 +++++++--------- gdb/linux-thread-db.c | 77 +++++++++++++++++++++-------------- 10 files changed, 112 insertions(+), 57 deletions(-) rename gdb/{ => common}/gdb_string.h (100%) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0fcf9692837..a48a7f3f437 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,17 @@ +2012-08-08 Doug Evans + + * linux-thread-db.c: #include "gdb_vecs.h". + (try_thread_db_load_from_pdir_1): New arg "subdir". All callers + updated. + (try_thread_db_load_from_pdir): New arg "subdir". All callers updated. + (thread_db_load_search): Use a vector to iterate over path elements. + Handle text appearing after "$pdir". + + * gdb_string.h: Moved to ... + * common/gdb_string.h: ... here. + * common/vec.h: Remove #ifndef GDBSERVER conditional inclusion of + gdb_string.h and gdb_assert.h. + 2012-08-08 Yao Qi * tic6x-tdep.c (tic6x_register_to_value): Remove. diff --git a/gdb/gdb_string.h b/gdb/common/gdb_string.h similarity index 100% rename from gdb/gdb_string.h rename to gdb/common/gdb_string.h diff --git a/gdb/common/vec.h b/gdb/common/vec.h index fa15370dd9b..49116e1f166 100644 --- a/gdb/common/vec.h +++ b/gdb/common/vec.h @@ -22,10 +22,8 @@ #include -#ifndef GDBSERVER #include "gdb_string.h" #include "gdb_assert.h" -#endif /* The macros here implement a set of templated vector types and associated interfaces. These templates are implemented with diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index d446361fa7e..5707850d86b 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,18 @@ +2012-08-08 Doug Evans + + * Makefile.in (SFILES): Add gdb_vecs.c. + (OBS): Add gdb_vecs.o. + (gdb_vecs_h, host_defs_h): New variables. + (thread-db.o): Add $(gdb_vecs_h) dependency. + (gdb_vecs.o): New rule. + * thread-db.c: #include "gdb_vecs.h". + (thread_db_load_search): Use a vector to iterate over path elements. + Handle text appearing after "$pdir". + + * configure.ac: Add check for strstr. + * config.in: Regenerate. + * configure: Regenerate. + 2012-08-02 Ulrich Weigand * hostio.c (handle_pread): If pread fails, fall back to attempting diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index 446ea047fa8..f62799e1255 100644 --- a/gdb/gdbserver/Makefile.in +++ b/gdb/gdbserver/Makefile.in @@ -140,7 +140,7 @@ SFILES= $(srcdir)/gdbreplay.c $(srcdir)/inferiors.c $(srcdir)/dll.c \ $(srcdir)/win32-arm-low.c $(srcdir)/win32-i386-low.c \ $(srcdir)/win32-low.c $(srcdir)/wincecompat.c \ $(srcdir)/hostio.c $(srcdir)/hostio-errno.c \ - $(srcdir)/common/vec.c \ + $(srcdir)/common/vec.c $(srcdir)/common/gdb_vecs.c \ $(srcdir)/common/common-utils.c $(srcdir)/common/xml-utils.c \ $(srcdir)/common/linux-osdata.c $(srcdir)/common/ptid.c \ $(srcdir)/common/buffer.c @@ -153,7 +153,7 @@ SOURCES = $(SFILES) TAGFILES = $(SOURCES) ${HFILES} ${ALLPARAM} ${POSSLIBS} OBS = agent.o ax.o inferiors.o regcache.o remote-utils.o server.o signals.o target.o \ - utils.o version.o vec.o \ + utils.o version.o vec.o gdb_vecs.o \ mem-break.o hostio.o event-loop.o tracepoint.o \ xml-utils.o common-utils.o ptid.o buffer.o format.o \ dll.o \ @@ -414,6 +414,8 @@ ax_h = $(srcdir)/ax.h agent_h = $(srcdir)/../common/agent.h linux_osdata_h = $(srcdir)/../common/linux-osdata.h vec_h = $(srcdir)/../common/vec.h +gdb_vecs_h = $(srcdir)/../common/gdb_vecs.h +host_defs_h = $(srcdir)/../common/host-defs.h # Since everything must include server.h, we make that depend on # generated files. server_h = $(srcdir)/server.h $(regcache_h) $(srcdir)/target.h \ @@ -485,7 +487,7 @@ remote-utils.o: remote-utils.c terminal.h $(server_h) $(gdbthread_h) server.o: server.c $(server_h) $(agent_h) $(gdbthread_h) target.o: target.c $(server_h) thread-db.o: thread-db.c $(server_h) $(linux_low_h) $(gdb_proc_service_h) \ - $(gdb_thread_db_h) + $(gdb_thread_db_h) $(gdb_vecs_h) tracepoint.o: tracepoint.c $(server_h) $(ax_h) $(agent_h) $(gdbthread_h) utils.o: utils.c $(server_h) gdbreplay.o: gdbreplay.c config.h @@ -506,6 +508,9 @@ common-utils.o: ../common/common-utils.c $(server_h) vec.o: ../common/vec.c $(vec_h) $(CC) -c $(CPPFLAGS) $(INTERNAL_CFLAGS) $< -DGDBSERVER +gdb_vecs.o: ../common/gdb_vecs.c $(vec_h) $(gdb_vecs_h) $(host_defs_h) + $(CC) -c $(CPPFLAGS) $(INTERNAL_CFLAGS) $< -DGDBSERVER + xml-utils.o: ../common/xml-utils.c $(server_h) $(CC) -c $(CPPFLAGS) $(INTERNAL_CFLAGS) $< -DGDBSERVER diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in index 26742ac12bd..bacf005e2f0 100644 --- a/gdb/gdbserver/config.in +++ b/gdb/gdbserver/config.in @@ -30,6 +30,10 @@ don't. */ #undef HAVE_DECL_STRERROR +/* Define to 1 if you have the declaration of `strstr', and to 0 if you don't. + */ +#undef HAVE_DECL_STRSTR + /* Define to 1 if you have the declaration of `vasprintf', and to 0 if you don't. */ #undef HAVE_DECL_VASPRINTF diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure index 63e25c239ea..69953c25c57 100755 --- a/gdb/gdbserver/configure +++ b/gdb/gdbserver/configure @@ -4688,6 +4688,16 @@ fi cat >>confdefs.h <<_ACEOF #define HAVE_DECL_STRERROR $ac_have_decl _ACEOF +ac_fn_c_check_decl "$LINENO" "strstr" "ac_cv_have_decl_strstr" "$ac_includes_default" +if test "x$ac_cv_have_decl_strstr" = x""yes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRSTR $ac_have_decl +_ACEOF ac_fn_c_check_decl "$LINENO" "perror" "ac_cv_have_decl_perror" "$ac_includes_default" if test "x$ac_cv_have_decl_perror" = x""yes; then : ac_have_decl=1 diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac index 7013a21248b..dc3c3cdd707 100644 --- a/gdb/gdbserver/configure.ac +++ b/gdb/gdbserver/configure.ac @@ -174,7 +174,7 @@ AC_TRY_LINK([ [AC_MSG_RESULT(no)]) fi -AC_CHECK_DECLS([strerror, perror, vasprintf, vsnprintf]) +AC_CHECK_DECLS([strerror, strstr, perror, vasprintf, vsnprintf]) AC_CHECK_TYPES(socklen_t, [], [], [#include diff --git a/gdb/gdbserver/thread-db.c b/gdb/gdbserver/thread-db.c index 795f9267ddb..4a59df613c1 100644 --- a/gdb/gdbserver/thread-db.c +++ b/gdb/gdbserver/thread-db.c @@ -28,6 +28,7 @@ static int thread_db_use_events; #include "gdb_proc_service.h" #include "gdb_thread_db.h" +#include "gdb_vecs.h" #ifndef USE_LIBTHREAD_DB_DIRECTLY #include @@ -741,39 +742,31 @@ try_thread_db_load_from_dir (const char *dir, size_t dir_len) static int thread_db_load_search (void) { - const char *search_path; - int rc = 0; + VEC (char_ptr) *dir_vec; + char *this_dir; + int i, rc = 0; if (libthread_db_search_path == NULL) libthread_db_search_path = xstrdup (LIBTHREAD_DB_SEARCH_PATH); - search_path = libthread_db_search_path; - while (*search_path) + dir_vec = dirnames_to_char_ptr_vec (libthread_db_search_path); + + for (i = 0; VEC_iterate (char_ptr, dir_vec, i, this_dir); ++i) { - const char *end = strchr (search_path, ':'); - const char *this_dir = search_path; + const int pdir_len = sizeof ("$pdir") - 1; size_t this_dir_len; - if (end) - { - this_dir_len = end - search_path; - search_path += this_dir_len + 1; - } - else - { - this_dir_len = strlen (this_dir); - search_path += this_dir_len; - } + this_dir_len = strlen (this_dir); - if (this_dir_len == sizeof ("$pdir") - 1 - && strncmp (this_dir, "$pdir", this_dir_len) == 0) + if (strncmp (this_dir, "$pdir", pdir_len) == 0 + && (this_dir[pdir_len] == '\0' + || this_dir[pdir_len] == '/')) { /* We don't maintain a list of loaded libraries so we don't know where libpthread lives. We *could* fetch the info, but we don't do that yet. Ignore it. */ } - else if (this_dir_len == sizeof ("$sdir") - 1 - && strncmp (this_dir, "$sdir", this_dir_len) == 0) + else if (strcmp (this_dir, "$sdir") == 0) { if (try_thread_db_load_from_sdir ()) { @@ -791,6 +784,7 @@ thread_db_load_search (void) } } + free_char_ptr_vec (dir_vec); if (debug_threads) fprintf (stderr, "thread_db_load_search returning %d\n", rc); return rc; diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index 2c16e02d827..bd905274301 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -23,7 +23,7 @@ #include #include "gdb_proc_service.h" #include "gdb_thread_db.h" - +#include "gdb_vecs.h" #include "bfd.h" #include "command.h" #include "exceptions.h" @@ -881,11 +881,12 @@ try_thread_db_load (const char *library) } /* Subroutine of try_thread_db_load_from_pdir to simplify it. - Try loading libthread_db from the same directory as OBJ. + Try loading libthread_db in directory(OBJ)/SUBDIR. + SUBDIR may be NULL. It may also be something like "../lib64". The result is true for success. */ static int -try_thread_db_load_from_pdir_1 (struct objfile *obj) +try_thread_db_load_from_pdir_1 (struct objfile *obj, const char *subdir) { struct cleanup *cleanup; char *path, *cp; @@ -898,14 +899,21 @@ try_thread_db_load_from_pdir_1 (struct objfile *obj) return 0; } - path = xmalloc (strlen (obj->name) + 1 + strlen (LIBTHREAD_DB_SO) + 1); + path = xmalloc (strlen (obj->name) + (subdir ? strlen (subdir) + 1 : 0) + + 1 + strlen (LIBTHREAD_DB_SO) + 1); cleanup = make_cleanup (xfree, path); strcpy (path, obj->name); cp = strrchr (path, '/'); /* This should at minimum hit the first character. */ gdb_assert (cp != NULL); - strcpy (cp + 1, LIBTHREAD_DB_SO); + cp[1] = '\0'; + if (subdir != NULL) + { + strcat (cp, subdir); + strcat (cp, "/"); + } + strcat (cp, LIBTHREAD_DB_SO); if (!file_is_auto_load_safe (path, _("auto-load: Loading libthread-db " "library \"%s\" from $pdir.\n"), @@ -919,11 +927,12 @@ try_thread_db_load_from_pdir_1 (struct objfile *obj) } /* Handle $pdir in libthread-db-search-path. - Look for libthread_db in the directory of libpthread. + Look for libthread_db in directory(libpthread)/SUBDIR. + SUBDIR may be NULL. It may also be something like "../lib64". The result is true for success. */ static int -try_thread_db_load_from_pdir (void) +try_thread_db_load_from_pdir (const char *subdir) { struct objfile *obj; @@ -933,14 +942,15 @@ try_thread_db_load_from_pdir (void) ALL_OBJFILES (obj) if (libpthread_name_p (obj->name)) { - if (try_thread_db_load_from_pdir_1 (obj)) + if (try_thread_db_load_from_pdir_1 (obj, subdir)) return 1; /* We may have found the separate-debug-info version of libpthread, and it may live in a directory without a matching libthread_db. */ if (obj->separate_debug_objfile_backlink != NULL) - return try_thread_db_load_from_pdir_1 (obj->separate_debug_objfile_backlink); + return try_thread_db_load_from_pdir_1 (obj->separate_debug_objfile_backlink, + subdir); return 0; } @@ -998,37 +1008,41 @@ try_thread_db_load_from_dir (const char *dir, size_t dir_len) static int thread_db_load_search (void) { - const char *search_path = libthread_db_search_path; - int rc = 0; + VEC (char_ptr) *dir_vec; + struct cleanup *cleanups; + char *this_dir; + int i, rc = 0; - while (*search_path) + dir_vec = dirnames_to_char_ptr_vec (libthread_db_search_path); + cleanups = make_cleanup_free_char_ptr_vec (dir_vec); + + for (i = 0; VEC_iterate (char_ptr, dir_vec, i, this_dir); ++i) { - const char *end = strchr (search_path, ':'); - const char *this_dir = search_path; + const int pdir_len = sizeof ("$pdir") - 1; size_t this_dir_len; - if (end) - { - this_dir_len = end - search_path; - search_path += this_dir_len + 1; - } - else - { - this_dir_len = strlen (this_dir); - search_path += this_dir_len; - } + this_dir_len = strlen (this_dir); - if (this_dir_len == sizeof ("$pdir") - 1 - && strncmp (this_dir, "$pdir", this_dir_len) == 0) + if (strncmp (this_dir, "$pdir", pdir_len) == 0 + && (this_dir[pdir_len] == '\0' + || this_dir[pdir_len] == '/')) { - if (try_thread_db_load_from_pdir ()) + char *subdir = NULL; + struct cleanup *free_subdir_cleanup = NULL; + + if (this_dir[pdir_len] == '/') { - rc = 1; - break; + subdir = xmalloc (strlen (this_dir)); + free_subdir_cleanup = make_cleanup (xfree, subdir); + strcpy (subdir, this_dir + pdir_len + 1); } + rc = try_thread_db_load_from_pdir (subdir); + if (free_subdir_cleanup != NULL) + do_cleanups (free_subdir_cleanup); + if (rc) + break; } - else if (this_dir_len == sizeof ("$sdir") - 1 - && strncmp (this_dir, "$sdir", this_dir_len) == 0) + else if (strcmp (this_dir, "$sdir") == 0) { if (try_thread_db_load_from_sdir ()) { @@ -1046,6 +1060,7 @@ thread_db_load_search (void) } } + do_cleanups (cleanups); if (libthread_db_debug) printf_unfiltered (_("thread_db_load_search returning %d\n"), rc); return rc; -- 2.30.2