along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "defs.h"
-
-/* Standard C includes. */
-#include <arpa/inet.h>
-#include <sys/socket.h>
-
-/* Local non-gdb includes. */
#include "auxv.h"
-#include "elf-bfd.h"
-#include "fbsd-tdep.h"
#include "gdbcore.h"
-#include "gdbthread.h"
#include "inferior.h"
-#include "objfiles.h"
#include "regcache.h"
#include "regset.h"
+#include "gdbthread.h"
+#include "objfiles.h"
#include "xml-syscall.h"
+#include <sys/socket.h>
+#include <arpa/inet.h>
+
+#include "elf-bfd.h"
+#include "fbsd-tdep.h"
/* This enum is derived from FreeBSD's <sys/signal.h>. */
gdbarch_data (gdbarch, fbsd_gdbarch_data_handle));
}
-/* Per-program-space data for FreeBSD architectures. */
-static const struct program_space_data *fbsd_pspace_data_handle;
-
struct fbsd_pspace_data
{
/* Offsets in the runtime linker's 'Obj_Entry' structure. */
- LONGEST off_linkmap;
- LONGEST off_tlsindex;
- bool rtld_offsets_valid;
+ LONGEST off_linkmap = 0;
+ LONGEST off_tlsindex = 0;
+ bool rtld_offsets_valid = false;
};
+/* Per-program-space data for FreeBSD architectures. */
+static const struct program_space_key<fbsd_pspace_data>
+ fbsd_pspace_data_handle;
+
static struct fbsd_pspace_data *
get_fbsd_pspace_data (struct program_space *pspace)
{
struct fbsd_pspace_data *data;
- data = ((struct fbsd_pspace_data *)
- program_space_data (pspace, fbsd_pspace_data_handle));
+ data = fbsd_pspace_data_handle.get (pspace);
if (data == NULL)
- {
- data = XCNEW (struct fbsd_pspace_data);
- set_program_space_data (pspace, fbsd_pspace_data_handle, data);
- }
+ data = fbsd_pspace_data_handle.emplace (pspace);
return data;
}
-/* The cleanup callback for FreeBSD architecture per-program-space data. */
-
-static void
-fbsd_pspace_data_cleanup (struct program_space *pspace, void *data)
-{
- xfree (data);
-}
-
/* This is how we want PTIDs from core files to be printed. */
static std::string
}
/* Thread register information. */
- TRY
+ try
{
update_thread_list ();
}
- CATCH (e, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &e)
{
exception_print (gdb_stderr, e);
}
- END_CATCH
/* Like the kernel, prefer dumping the signalled thread first.
"First thread" is what tools use to infer the signalled thread.
&& bfd_get_signed_32 (core_bfd, descdata + KF_FD) == fd)
{
char *path = (char *) descdata + KF_PATH;
- return gdb::unique_xmalloc_ptr<char> (xstrdup (path));
+ return make_unique_xstrdup (path);
}
descdata += structsize;
static void
fbsd_fetch_rtld_offsets (struct gdbarch *gdbarch, struct fbsd_pspace_data *data)
{
- TRY
+ try
{
/* Fetch offsets from debug symbols in rtld. */
struct symbol *obj_entry_sym
data->rtld_offsets_valid = true;
return;
}
- CATCH (e, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &e)
{
data->off_linkmap = -1;
}
- END_CATCH
- TRY
+ try
{
/* Fetch offsets from global variables in libthr. Note that
this does not work for single-threaded processes that are not
data->rtld_offsets_valid = true;
return;
}
- CATCH (e, RETURN_MASK_ERROR)
+ catch (const gdb_exception_error &e)
{
data->off_linkmap = -1;
}
- END_CATCH
}
/* Helper function to read the TLS index of an object file associated
{
fbsd_gdbarch_data_handle =
gdbarch_data_register_post_init (init_fbsd_gdbarch_data);
- fbsd_pspace_data_handle
- = register_program_space_data_with_cleanup (NULL, fbsd_pspace_data_cleanup);
}