* 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".
+2012-08-08 Doug Evans <dje@google.com>
+
+ * 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 <yao@codesourcery.com>
* tic6x-tdep.c (tic6x_register_to_value): Remove.
--- /dev/null
+/* Portable <string.h>
+
+ Copyright (C) 1995, 1998-2001, 2004, 2007-2012 Free Software
+ Foundation, Inc.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#if !defined(GDB_STRING_H)
+#define GDB_STRING_H
+
+#ifdef STDC_HEADERS
+#include <string.h>
+#ifdef HAVE_STRINGS_H
+#include <strings.h> /* strcasecmp etc.. */
+#endif
+#else
+#ifdef HAVE_STRING_H
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+
+#ifndef strchr
+extern char *strchr (const char *, int); /* X3.159-1989 4.11.5.2 */
+#endif
+
+#ifndef strrchr
+extern char *strrchr (const char *, int); /* X3.159-1989 4.11.5.5 */
+#endif
+
+#ifndef strtok
+extern char *strtok (char *, const char *); /* X3.159-1989 4.11.5.8 */
+#endif
+
+#ifdef HAVE_MEMORY_H
+#include <memory.h>
+#else
+extern void *memset ();
+extern void *memcpy ();
+extern void *memmove ();
+extern int memcmp ();
+#endif
+#endif /* STDC_HEADERS */
+
+#if !HAVE_DECL_STRERROR
+#ifndef strerror
+extern char *strerror (int); /* X3.159-1989 4.11.6.2 */
+#endif
+#endif
+
+#if !HAVE_DECL_STRSTR
+#ifndef strstr
+extern char *strstr (const char *, const char *); /* X3.159-1989 4.11.5.7 */
+#endif
+#endif
+
+#endif /* !defined(GDB_STRING_H) */
#include <stddef.h>
-#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
+++ /dev/null
-/* Portable <string.h>
-
- Copyright (C) 1995, 1998-2001, 2004, 2007-2012 Free Software
- Foundation, Inc.
-
- This file is part of GDB.
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
-
-#if !defined(GDB_STRING_H)
-#define GDB_STRING_H
-
-#ifdef STDC_HEADERS
-#include <string.h>
-#ifdef HAVE_STRINGS_H
-#include <strings.h> /* strcasecmp etc.. */
-#endif
-#else
-#ifdef HAVE_STRING_H
-#include <string.h>
-#else
-#include <strings.h>
-#endif
-
-#ifndef strchr
-extern char *strchr (const char *, int); /* X3.159-1989 4.11.5.2 */
-#endif
-
-#ifndef strrchr
-extern char *strrchr (const char *, int); /* X3.159-1989 4.11.5.5 */
-#endif
-
-#ifndef strtok
-extern char *strtok (char *, const char *); /* X3.159-1989 4.11.5.8 */
-#endif
-
-#ifdef HAVE_MEMORY_H
-#include <memory.h>
-#else
-extern void *memset ();
-extern void *memcpy ();
-extern void *memmove ();
-extern int memcmp ();
-#endif
-#endif /* STDC_HEADERS */
-
-#if !HAVE_DECL_STRERROR
-#ifndef strerror
-extern char *strerror (int); /* X3.159-1989 4.11.6.2 */
-#endif
-#endif
-
-#if !HAVE_DECL_STRSTR
-#ifndef strstr
-extern char *strstr (const char *, const char *); /* X3.159-1989 4.11.5.7 */
-#endif
-#endif
-
-#endif /* !defined(GDB_STRING_H) */
+2012-08-08 Doug Evans <dje@google.com>
+
+ * 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 <ulrich.weigand@linaro.org>
* hostio.c (handle_pread): If pread fails, fall back to attempting
$(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
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 \
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 \
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
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
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
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
[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 <sys/types.h>
#include "gdb_proc_service.h"
#include "gdb_thread_db.h"
+#include "gdb_vecs.h"
#ifndef USE_LIBTHREAD_DB_DIRECTLY
#include <dlfcn.h>
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 ())
{
}
}
+ free_char_ptr_vec (dir_vec);
if (debug_threads)
fprintf (stderr, "thread_db_load_search returning %d\n", rc);
return rc;
#include <dlfcn.h>
#include "gdb_proc_service.h"
#include "gdb_thread_db.h"
-
+#include "gdb_vecs.h"
#include "bfd.h"
#include "command.h"
#include "exceptions.h"
}
/* 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;
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"),
}
/* 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;
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;
}
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 ())
{
}
}
+ do_cleanups (cleanups);
if (libthread_db_debug)
printf_unfiltered (_("thread_db_load_search returning %d\n"), rc);
return rc;