C++: dlsym casts in gdb/linux-thread-db.c and gdb/gdbserver/thread-db.c
authorPedro Alves <palves@redhat.com>
Tue, 4 Aug 2015 08:39:47 +0000 (09:39 +0100)
committerPedro Alves <palves@redhat.com>
Tue, 4 Aug 2015 08:39:47 +0000 (09:39 +0100)
Implicit void * -> function pointer conversion doesn't work in C++, so
in C++, we need to cast the result of dlsym.  This adds a few typedefs
and macros that make this easy.  GDBserver's version already had the
CHK macro, so I added it to GDB too.

Tested on x86_64 Fedora 20, native and gdbserver.

gdb/gdbserver/ChangeLog:
2015-08-04  Pedro Alves  <palves@redhat.com>

* thread-db.c (struct thread_db): Use new typedefs.
(try_thread_db_load_1): Define local TDB_DLSYM macro and use it in
CHK calls.
(disable_thread_event_reporting): Cast result of dlsym to
destination function pointer type.
(thread_db_mourn): Use td_ta_delete_ftype.

gdb/ChangeLog:
2015-08-04  Pedro Alves  <palves@redhat.com>

* nat/gdb_thread_db.h (td_init_ftype, td_ta_new_ftype)
(td_ta_map_lwp2thr_ftype, td_ta_thr_iter_ftype)
(td_ta_event_addr_ftype, td_ta_set_event_ftype)
(td_ta_clear_event_ftype, td_ta_event_getmsg_ftype)
(td_thr_validate_ftype, td_thr_get_info_ftype)
(td_thr_event_enable_ftype, td_thr_tls_get_addr_ftype)
(td_thr_tlsbase_ftype, td_symbol_list_ftype, td_ta_delete_ftype):
New typedefs.
* linux-thread-db.c (struct thread_db_info): Use new typedefs.
(try_thread_db_load_1): Define TDB_VERBOSE_DLSYM, TDB_DLSYM , CHK
local macros and use them instead of verbose_dlsym and dlsym
calls.

gdb/ChangeLog
gdb/gdbserver/ChangeLog
gdb/gdbserver/thread-db.c
gdb/linux-thread-db.c
gdb/nat/gdb_thread_db.h

index 834063405895bfc90623b33da9fcfc24dddd17bc..5c51ae124ec9e757475b41e66139f179fd2e12b9 100644 (file)
@@ -1,3 +1,18 @@
+2015-08-04  Pedro Alves  <palves@redhat.com>
+
+       * nat/gdb_thread_db.h (td_init_ftype, td_ta_new_ftype)
+       (td_ta_map_lwp2thr_ftype, td_ta_thr_iter_ftype)
+       (td_ta_event_addr_ftype, td_ta_set_event_ftype)
+       (td_ta_clear_event_ftype, td_ta_event_getmsg_ftype)
+       (td_thr_validate_ftype, td_thr_get_info_ftype)
+       (td_thr_event_enable_ftype, td_thr_tls_get_addr_ftype)
+       (td_thr_tlsbase_ftype, td_symbol_list_ftype, td_ta_delete_ftype):
+       New typedefs.
+       * linux-thread-db.c (struct thread_db_info): Use new typedefs.
+       (try_thread_db_load_1): Define TDB_VERBOSE_DLSYM, TDB_DLSYM , CHK
+       local macros and use them instead of verbose_dlsym and dlsym
+       calls.
+
 2015-08-03  Sandra Loosemore  <sandra@codesourcery.com>
 
        * nios2-tdep.h: Include opcode/nios2.h here.
index 8862a4846bc74617b8189b0e9616152817371b5d..443c25e25309acd3eedb9c803294ea4f04db0ef6 100644 (file)
@@ -1,3 +1,12 @@
+2015-08-04  Pedro Alves  <palves@redhat.com>
+
+       * thread-db.c (struct thread_db): Use new typedefs.
+       (try_thread_db_load_1): Define local TDB_DLSYM macro and use it in
+       CHK calls.
+       (disable_thread_event_reporting): Cast result of dlsym to
+       destination function pointer type.
+       (thread_db_mourn): Use td_ta_delete_ftype.
+
 2015-08-03  Sandra Loosemore  <sandra@codesourcery.com>
 
        * linux-nios2-low.c (NIOS2_BREAKPOINT): Conditionalize for
index 4288fdb9d31389e50ae1854e426521bb539d6c81..3da636e59e4d4f2739657c6e83f4cf2e3ac822cd 100644 (file)
@@ -67,30 +67,17 @@ struct thread_db
   struct breakpoint *td_create_bp;
 
   /* Addresses of libthread_db functions.  */
-  td_err_e (*td_ta_new_p) (struct ps_prochandle * ps, td_thragent_t **ta);
-  td_err_e (*td_ta_event_getmsg_p) (const td_thragent_t *ta,
-                                   td_event_msg_t *msg);
-  td_err_e (*td_ta_set_event_p) (const td_thragent_t *ta,
-                                td_thr_events_t *event);
-  td_err_e (*td_ta_event_addr_p) (const td_thragent_t *ta,
-                                 td_event_e event, td_notify_t *ptr);
-  td_err_e (*td_ta_map_lwp2thr_p) (const td_thragent_t *ta, lwpid_t lwpid,
-                                  td_thrhandle_t *th);
-  td_err_e (*td_thr_get_info_p) (const td_thrhandle_t *th,
-                                td_thrinfo_t *infop);
-  td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th, int event);
-  td_err_e (*td_ta_thr_iter_p) (const td_thragent_t *ta,
-                               td_thr_iter_f *callback, void *cbdata_p,
-                               td_thr_state_e state, int ti_pri,
-                               sigset_t *ti_sigmask_p,
-                               unsigned int ti_user_flags);
-  td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th,
-                                    psaddr_t map_address,
-                                    size_t offset, psaddr_t *address);
-  td_err_e (*td_thr_tlsbase_p) (const td_thrhandle_t *th,
-                               unsigned long int modid,
-                               psaddr_t *base);
-  const char ** (*td_symbol_list_p) (void);
+  td_ta_new_ftype *td_ta_new_p;
+  td_ta_event_getmsg_ftype * td_ta_event_getmsg_p;
+  td_ta_set_event_ftype *td_ta_set_event_p;
+  td_ta_event_addr_ftype *td_ta_event_addr_p;
+  td_ta_map_lwp2thr_ftype *td_ta_map_lwp2thr_p;
+  td_thr_get_info_ftype *td_thr_get_info_p;
+  td_thr_event_enable_ftype *td_thr_event_enable_p;
+  td_ta_thr_iter_ftype *td_ta_thr_iter_p;
+  td_thr_tls_get_addr_ftype *td_thr_tls_get_addr_p;
+  td_thr_tlsbase_ftype *td_thr_tlsbase_p;
+  td_symbol_list_ftype *td_symbol_list_p;
 };
 
 static char *libthread_db_search_path;
@@ -645,7 +632,10 @@ try_thread_db_load_1 (void *handle)
     }                                                          \
   while (0)
 
-  CHK (1, tdb->td_ta_new_p = dlsym (handle, "td_ta_new"));
+#define TDB_DLSYM(tdb, func) \
+  tdb->func ## _p = (func ## _ftype *) dlsym (tdb->handle, #func)
+
+  CHK (1, TDB_DLSYM (tdb, td_ta_new));
 
   /* Attempt to open a connection to the thread library.  */
   err = tdb->td_ta_new_p (&tdb->proc_handle, &tdb->thread_agent);
@@ -658,23 +648,23 @@ try_thread_db_load_1 (void *handle)
       return 0;
     }
 
-  CHK (1, tdb->td_ta_map_lwp2thr_p = dlsym (handle, "td_ta_map_lwp2thr"));
-  CHK (1, tdb->td_thr_get_info_p = dlsym (handle, "td_thr_get_info"));
-  CHK (1, tdb->td_ta_thr_iter_p = dlsym (handle, "td_ta_thr_iter"));
-  CHK (1, tdb->td_symbol_list_p = dlsym (handle, "td_symbol_list"));
+  CHK (1, TDB_DLSYM (tdb, td_ta_map_lwp2thr));
+  CHK (1, TDB_DLSYM (tdb, td_thr_get_info));
+  CHK (1, TDB_DLSYM (tdb, td_ta_thr_iter));
+  CHK (1, TDB_DLSYM (tdb, td_symbol_list));
 
   /* This is required only when thread_db_use_events is on.  */
-  CHK (thread_db_use_events,
-       tdb->td_thr_event_enable_p = dlsym (handle, "td_thr_event_enable"));
+  CHK (thread_db_use_events, TDB_DLSYM (tdb, td_thr_event_enable));
 
   /* These are not essential.  */
-  CHK (0, tdb->td_ta_event_addr_p = dlsym (handle, "td_ta_event_addr"));
-  CHK (0, tdb->td_ta_set_event_p = dlsym (handle, "td_ta_set_event"));
-  CHK (0, tdb->td_ta_event_getmsg_p = dlsym (handle, "td_ta_event_getmsg"));
-  CHK (0, tdb->td_thr_tls_get_addr_p = dlsym (handle, "td_thr_tls_get_addr"));
-  CHK (0, tdb->td_thr_tlsbase_p = dlsym (handle, "td_thr_tlsbase"));
+  CHK (0, TDB_DLSYM (tdb, td_ta_event_addr));
+  CHK (0, TDB_DLSYM (tdb, td_ta_set_event));
+  CHK (0, TDB_DLSYM (tdb, td_ta_event_getmsg));
+  CHK (0, TDB_DLSYM (tdb, td_thr_tls_get_addr));
+  CHK (0, TDB_DLSYM (tdb, td_thr_tlsbase));
 
 #undef CHK
+#undef TDB_DLSYM
 
   return 1;
 }
@@ -914,7 +904,9 @@ disable_thread_event_reporting (struct process_info *proc)
                                       td_thr_events_t *event);
 
 #ifndef USE_LIBTHREAD_DB_DIRECTLY
-      td_ta_clear_event_p = dlsym (thread_db->handle, "td_ta_clear_event");
+      td_ta_clear_event_p
+       = (td_ta_clear_event_ftype *) dlsym (thread_db->handle,
+                                            "td_ta_clear_event");
 #else
       td_ta_clear_event_p = &td_ta_clear_event;
 #endif
@@ -974,10 +966,10 @@ thread_db_mourn (struct process_info *proc)
   struct thread_db *thread_db = proc->priv->thread_db;
   if (thread_db)
     {
-      td_err_e (*td_ta_delete_p) (td_thragent_t *);
+      td_ta_delete_ftype *td_ta_delete_p;
 
 #ifndef USE_LIBTHREAD_DB_DIRECTLY
-      td_ta_delete_p = dlsym (thread_db->handle, "td_ta_delete");
+      td_ta_delete_p = (td_ta_delete_ftype *) dlsym (thread_db->handle, "td_ta_delete");
 #else
       td_ta_delete_p = &td_ta_delete;
 #endif
index 26350bb352db2e91e13246695ca4ddfdeb50efe2..84599d3d90987fd86e809e9b5e36cf4687ea4b2e 100644 (file)
@@ -174,37 +174,19 @@ struct thread_db_info
 
   /* Pointers to the libthread_db functions.  */
 
-  td_err_e (*td_init_p) (void);
-
-  td_err_e (*td_ta_new_p) (struct ps_prochandle * ps,
-                               td_thragent_t **ta);
-  td_err_e (*td_ta_map_lwp2thr_p) (const td_thragent_t *ta,
-                                  lwpid_t lwpid, td_thrhandle_t *th);
-  td_err_e (*td_ta_thr_iter_p) (const td_thragent_t *ta,
-                               td_thr_iter_f *callback, void *cbdata_p,
-                               td_thr_state_e state, int ti_pri,
-                               sigset_t *ti_sigmask_p,
-                               unsigned int ti_user_flags);
-  td_err_e (*td_ta_event_addr_p) (const td_thragent_t *ta,
-                                 td_event_e event, td_notify_t *ptr);
-  td_err_e (*td_ta_set_event_p) (const td_thragent_t *ta,
-                                td_thr_events_t *event);
-  td_err_e (*td_ta_clear_event_p) (const td_thragent_t *ta,
-                                  td_thr_events_t *event);
-  td_err_e (*td_ta_event_getmsg_p) (const td_thragent_t *ta,
-                                   td_event_msg_t *msg);
-
-  td_err_e (*td_thr_get_info_p) (const td_thrhandle_t *th,
-                                td_thrinfo_t *infop);
-  td_err_e (*td_thr_event_enable_p) (const td_thrhandle_t *th,
-                                    int event);
-
-  td_err_e (*td_thr_tls_get_addr_p) (const td_thrhandle_t *th,
-                                    psaddr_t map_address,
-                                    size_t offset, psaddr_t *address);
-  td_err_e (*td_thr_tlsbase_p) (const td_thrhandle_t *th,
-                               unsigned long int modid,
-                               psaddr_t *base);
+  td_init_ftype *td_init_p;
+  td_ta_new_ftype *td_ta_new_p;
+  td_ta_map_lwp2thr_ftype *td_ta_map_lwp2thr_p;
+  td_ta_thr_iter_ftype *td_ta_thr_iter_p;
+  td_ta_event_addr_ftype *td_ta_event_addr_p;
+  td_ta_set_event_ftype *td_ta_set_event_p;
+  td_ta_clear_event_ftype *td_ta_clear_event_p;
+  td_ta_event_getmsg_ftype * td_ta_event_getmsg_p;
+  td_thr_validate_ftype *td_thr_validate_p;
+  td_thr_get_info_ftype *td_thr_get_info_p;
+  td_thr_event_enable_ftype *td_thr_event_enable_p;
+  td_thr_tls_get_addr_ftype *td_thr_tls_get_addr_p;
+  td_thr_tlsbase_ftype *td_thr_tlsbase_p;
 };
 
 /* List of known processes using thread_db, and the required
@@ -677,9 +659,20 @@ try_thread_db_load_1 (struct thread_db_info *info)
   /* Initialize pointers to the dynamic library functions we will use.
      Essential functions first.  */
 
-  info->td_init_p = verbose_dlsym (info->handle, "td_init");
-  if (info->td_init_p == NULL)
-    return 0;
+#define TDB_VERBOSE_DLSYM(info, func)                  \
+  info->func ## _p = (func ## _ftype *) verbose_dlsym (info->handle, #func)
+
+#define TDB_DLSYM(info, func)                  \
+  info->func ## _p = (func ## _ftype *) dlsym (info->handle, #func)
+
+#define CHK(a)                                                         \
+  do                                                                   \
+    {                                                                  \
+      if ((a) == NULL)                                                 \
+       return 0;                                                       \
+  } while (0)
+
+  CHK (TDB_VERBOSE_DLSYM (info, td_init));
 
   err = info->td_init_p ();
   if (err != TD_OK)
@@ -689,9 +682,7 @@ try_thread_db_load_1 (struct thread_db_info *info)
       return 0;
     }
 
-  info->td_ta_new_p = verbose_dlsym (info->handle, "td_ta_new");
-  if (info->td_ta_new_p == NULL)
-    return 0;
+  CHK (TDB_VERBOSE_DLSYM (info, td_ta_new));
 
   /* Initialize the structure that identifies the child process.  */
   info->proc_handle.ptid = inferior_ptid;
@@ -720,27 +711,24 @@ try_thread_db_load_1 (struct thread_db_info *info)
       return 0;
     }
 
-  info->td_ta_map_lwp2thr_p = verbose_dlsym (info->handle,
-                                            "td_ta_map_lwp2thr");
-  if (info->td_ta_map_lwp2thr_p == NULL)
-    return 0;
-
-  info->td_ta_thr_iter_p = verbose_dlsym (info->handle, "td_ta_thr_iter");
-  if (info->td_ta_thr_iter_p == NULL)
-    return 0;
-
-  info->td_thr_get_info_p = verbose_dlsym (info->handle, "td_thr_get_info");
-  if (info->td_thr_get_info_p == NULL)
-    return 0;
+  /* These are essential.  */
+  CHK (TDB_VERBOSE_DLSYM (info, td_ta_map_lwp2thr));
+  CHK (TDB_VERBOSE_DLSYM (info, td_ta_thr_iter));
+  CHK (TDB_VERBOSE_DLSYM (info, td_thr_validate));
+  CHK (TDB_VERBOSE_DLSYM (info, td_thr_get_info));
 
   /* These are not essential.  */
-  info->td_ta_event_addr_p = dlsym (info->handle, "td_ta_event_addr");
-  info->td_ta_set_event_p = dlsym (info->handle, "td_ta_set_event");
-  info->td_ta_clear_event_p = dlsym (info->handle, "td_ta_clear_event");
-  info->td_ta_event_getmsg_p = dlsym (info->handle, "td_ta_event_getmsg");
-  info->td_thr_event_enable_p = dlsym (info->handle, "td_thr_event_enable");
-  info->td_thr_tls_get_addr_p = dlsym (info->handle, "td_thr_tls_get_addr");
-  info->td_thr_tlsbase_p = dlsym (info->handle, "td_thr_tlsbase");
+  TDB_DLSYM (info, td_ta_event_addr);
+  TDB_DLSYM (info, td_ta_set_event);
+  TDB_DLSYM (info, td_ta_clear_event);
+  TDB_DLSYM (info, td_ta_event_getmsg);
+  TDB_DLSYM (info, td_thr_event_enable);
+  TDB_DLSYM (info, td_thr_tls_get_addr);
+  TDB_DLSYM (info, td_thr_tlsbase);
+
+#undef TDB_VERBOSE_DLSYM
+#undef TDB_DLSYM
+#undef CHK
 
   /* It's best to avoid td_ta_thr_iter if possible.  That walks data
      structures in the inferior's address space that may be corrupted,
index a1d947327f2f350f86379c0bd6db5d0db4660d29..2938eaf8d7beb5e74d8da88b5cfa98e48f3635ef 100644 (file)
    libthread_db associated with whatever libpthread the app is using.  */
 #define LIBTHREAD_DB_SEARCH_PATH "$sdir:$pdir"
 #endif
+
+/* Types of the libthread_db functions.  */
+
+typedef td_err_e (td_init_ftype) (void);
+
+typedef td_err_e (td_ta_new_ftype) (struct ps_prochandle * ps,
+                                   td_thragent_t **ta);
+typedef td_err_e (td_ta_map_lwp2thr_ftype) (const td_thragent_t *ta,
+                                           lwpid_t lwpid, td_thrhandle_t *th);
+typedef td_err_e (td_ta_thr_iter_ftype) (const td_thragent_t *ta,
+                                        td_thr_iter_f *callback, void *cbdata_p,
+                                        td_thr_state_e state, int ti_pri,
+                                        sigset_t *ti_sigmask_p,
+                                        unsigned int ti_user_flags);
+typedef td_err_e (td_ta_event_addr_ftype) (const td_thragent_t *ta,
+                                          td_event_e event, td_notify_t *ptr);
+typedef td_err_e (td_ta_set_event_ftype) (const td_thragent_t *ta,
+                                         td_thr_events_t *event);
+typedef td_err_e (td_ta_clear_event_ftype) (const td_thragent_t *ta,
+                                           td_thr_events_t *event);
+typedef td_err_e (td_ta_event_getmsg_ftype) (const td_thragent_t *ta,
+                                            td_event_msg_t *msg);
+
+typedef td_err_e (td_thr_validate_ftype) (const td_thrhandle_t *th);
+typedef td_err_e (td_thr_get_info_ftype) (const td_thrhandle_t *th,
+                                         td_thrinfo_t *infop);
+typedef td_err_e (td_thr_event_enable_ftype) (const td_thrhandle_t *th,
+                                             int event);
+
+typedef td_err_e (td_thr_tls_get_addr_ftype) (const td_thrhandle_t *th,
+                                             psaddr_t map_address,
+                                             size_t offset, psaddr_t *address);
+typedef td_err_e (td_thr_tlsbase_ftype) (const td_thrhandle_t *th,
+                                        unsigned long int modid,
+                                        psaddr_t *base);
+
+typedef const char ** (td_symbol_list_ftype) (void);
+typedef td_err_e (td_ta_delete_ftype) (td_thragent_t *);