-/* Copyright (c) 2015-2019. The SimGrid Team.
- * All rights reserved. */
+/* Copyright (c) 2015-2019. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
// We need this for the register indices:
// #define _GNU_SOURCE
+#include "src/mc/inspect/mc_unw.hpp"
+#include "src/mc/inspect/Frame.hpp"
+#include "src/mc/remote/RemoteClient.hpp"
+
#include <cstring>
// On x86_64, libunwind unw_context_t has the same layout as ucontext_t:
#include <libunwind.h>
-#include "src/mc/Frame.hpp"
-#include "src/mc/mc_unw.hpp"
-#include "src/mc/remote/RemoteClient.hpp"
-
using simgrid::mc::remote;
namespace simgrid {
simgrid::mc::UnwindContext* context = (simgrid::mc::UnwindContext*)arg;
if (write)
return -UNW_EREADONLYREG;
- context->addressSpace_->read_bytes(valp, sizeof(unw_word_t), remote(addr));
+ context->address_space_->read_bytes(valp, sizeof(unw_word_t), remote(addr));
return 0;
}
void* arg) noexcept
{
simgrid::mc::UnwindContext* as_context = (simgrid::mc::UnwindContext*)arg;
- unw_context_t* context = &as_context->unwindContext_;
+ unw_context_t* context = &as_context->unwind_context_;
if (write)
return -UNW_EREADONLYREG;
greg_t* preg = (greg_t*)get_reg(context, regnum);
return 0;
}
-/** Read a floating-point register (libunwind method)
- *
- * FP registers are caller-saved. The values saved by functions such as
- * `getcontext()` is not relevant for the caller. It is not really necessary
- * to save and handle them.
- */
-int UnwindContext::access_fpreg(unw_addr_space_t /*as*/, unw_regnum_t /*regnum*/, unw_fpreg_t* /*fpvalp*/,
- int /*write*/, void* /*arg*/) noexcept
-{
- return -UNW_EBADREG;
-}
-
-/** Resume the execution of the context (libunwind method)
- *
- * We don't use this.
- */
-int UnwindContext::resume(unw_addr_space_t /*as*/, unw_cursor_t* /*cp*/, void* /*arg*/) noexcept
-{
- return -UNW_EUNSPEC;
-}
-
/** Find informations about a function (libunwind method)
*/
int UnwindContext::get_proc_name(unw_addr_space_t /*as*/, unw_word_t addr, char* bufp, size_t buf_len, unw_word_t* offp,
* Stack unwinding on a `simgrid::mc::Process*` (for memory, unwinding information)
* and `ucontext_t` (for processor registers).
*
- * It works with the `simgrid::mc::UnwindContext` context.
+ * It works with the `simgrid::mc::UnwindContext` context.
+ *
+ * Use nullptr as access_fpreg and resume, as we don't need them.
*/
unw_accessors_t UnwindContext::accessors = {&find_proc_info, &put_unwind_info, &get_dyn_info_list_addr,
- &access_mem, &access_reg, &access_fpreg,
- &resume, &get_proc_name};
+ &access_mem, &access_reg, nullptr,
+ nullptr, &get_proc_name};
unw_addr_space_t UnwindContext::createUnwindAddressSpace()
{
void UnwindContext::initialize(simgrid::mc::RemoteClient* process, unw_context_t* c)
{
- this->addressSpace_ = process;
+ this->address_space_ = process;
this->process_ = process;
// Take a copy of the context for our own purpose:
- this->unwindContext_ = *c;
+ this->unwind_context_ = *c;
#if SIMGRID_PROCESSOR_x86_64 || SIMGRID_PROCESSOR_i686
#ifdef __linux__
// On x86_64, ucontext_t contains a pointer to itself for FP registers.
// and probably never use those fields as libunwind-x86_64 does not read
// FP registers from the unw_context_t
// Let's ignore this and see what happens:
- this->unwindContext_.uc_mcontext.fpregs = nullptr;
+ this->unwind_context_.uc_mcontext.fpregs = nullptr;
#endif
#else
// Do we need to do any fixup like this?
unw_cursor_t UnwindContext::cursor()
{
unw_cursor_t cursor;
- if (process_ == nullptr || addressSpace_ == nullptr || unw_init_remote(&cursor, process_->unw_addr_space, this) != 0)
- xbt_die("UnwindContext not initialized");
+ xbt_assert(process_ != nullptr && address_space_ != nullptr &&
+ unw_init_remote(&cursor, process_->unw_addr_space, this) == 0,
+ "UnwindContext not initialized");
return cursor;
}