#include <libunwind.h>
-#include "mc_object_info.h"
-#include "mc_process.h"
-#include "mc_unw.h"
+#include "src/mc/Process.hpp"
+#include "src/mc/mc_unw.h"
+#include "src/mc/Frame.hpp"
+
+using simgrid::mc::remote;
extern "C" {
/** Read from the target address space memory (libunwind method)
*
- * Delegates to the `mc_process_t`.
+ * Delegates to the `simgrid::mc::Process*`.
*/
static int access_mem(unw_addr_space_t as,
unw_word_t addr, unw_word_t *valp,
mc_unw_context_t context = (mc_unw_context_t) arg;
if (write)
return - UNW_EREADONLYREG;
- MC_address_space_read(context->address_space,
- MC_ADDRESS_SPACE_READ_FLAGS_NONE, valp, (void*) addr, sizeof(unw_word_t), MC_PROCESS_INDEX_ANY);
- // We don't handle failure gracefully.
+ context->address_space->read_bytes(valp, sizeof(unw_word_t), remote(addr));
return 0;
}
case UNW_X86_64_R14: return &mcontext->gregs[REG_R14];
case UNW_X86_64_R15: return &mcontext->gregs[REG_R15];
case UNW_X86_64_RIP: return &mcontext->gregs[REG_RIP];
- default: return NULL;
+ default: return nullptr;
}
#else
- return NULL;
+ return nullptr;
#endif
}
void* arg)
{
mc_unw_context_t context = (mc_unw_context_t) arg;
- dw_frame_t frame = MC_process_find_function(context->process, (void*) addr);
+ simgrid::mc::Frame* frame = context->process->find_function(remote(addr));
if (!frame)
return - UNW_ENOINFO;
- *offp = (unw_word_t) frame->low_pc - addr;
+ *offp = (unw_word_t) frame->range.begin() - addr;
- strncpy(bufp, frame->name, buf_len);
+ strncpy(bufp, frame->name.c_str(), buf_len);
if (bufp[buf_len - 1]) {
bufp[buf_len - 1] = 0;
return -UNW_ENOMEM;
unw_accessors_t mc_unw_accessors =
{
- .find_proc_info = &find_proc_info,
- .put_unwind_info = &put_unwind_info,
- .get_dyn_info_list_addr = &get_dyn_info_list_addr,
- .access_mem = &access_mem,
- .access_reg = &access_reg,
- .access_fpreg = &access_fpreg,
- .resume = &resume,
- .get_proc_name = &get_proc_name
+ &find_proc_info,
+ &put_unwind_info,
+ &get_dyn_info_list_addr,
+ &access_mem,
+ &access_reg,
+ &access_fpreg,
+ &resume,
+ &get_proc_name
};
// ***** Context management
int mc_unw_init_context(
- mc_unw_context_t context, mc_process_t process, unw_context_t* c)
+ mc_unw_context_t context, simgrid::mc::Process* process, unw_context_t* c)
{
- context->address_space = (mc_address_space_t) process;
+ context->address_space = process;
context->process = process;
// Take a copy of the context for our own purpose:
return 0;
}
-int mc_unw_destroy_context(mc_unw_context_t context)
-{
- context->address_space = NULL;
- context->process = NULL;
- return 0;
-}
-
// ***** Cursor management
int mc_unw_init_cursor(unw_cursor_t *cursor, mc_unw_context_t context)
{
if (!context->process || !context->address_space)
return -UNW_EUNSPEC;
- mc_address_space_t as = context->address_space;
-
- // Use local unwinding for current process:
- if (MC_is_process(as) && MC_process_is_self((mc_process_t) as))
- return unw_init_local(cursor, &context->context);
-
return unw_init_remote(cursor, context->process->unw_addr_space, context);
}