X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/92cbaa683aa7824d7ad1b7f1702dec27e1c6eefb..84402e8e2ee2a2d0bef25fdceb0a263ed8b471f6:/src/mc/inspect/mc_unw.cpp diff --git a/src/mc/inspect/mc_unw.cpp b/src/mc/inspect/mc_unw.cpp index da2a9d7d9c..a51a8fb5ac 100644 --- a/src/mc/inspect/mc_unw.cpp +++ b/src/mc/inspect/mc_unw.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2015-2020. 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. */ @@ -39,7 +39,7 @@ namespace mc { int UnwindContext::find_proc_info(unw_addr_space_t /*as*/, unw_word_t ip, unw_proc_info_t* pip, int need_unwind_info, void* arg) noexcept { - simgrid::mc::UnwindContext* context = (simgrid::mc::UnwindContext*)arg; + const simgrid::mc::UnwindContext* context = (simgrid::mc::UnwindContext*)arg; return unw_get_accessors(context->process_->unw_underlying_addr_space) ->find_proc_info(context->process_->unw_underlying_addr_space, ip, pip, need_unwind_info, context->process_->unw_underlying_context); @@ -51,7 +51,7 @@ int UnwindContext::find_proc_info(unw_addr_space_t /*as*/, unw_word_t ip, unw_pr */ void UnwindContext::put_unwind_info(unw_addr_space_t /*as*/, unw_proc_info_t* pip, void* arg) noexcept { - simgrid::mc::UnwindContext* context = (simgrid::mc::UnwindContext*)arg; + const simgrid::mc::UnwindContext* context = (simgrid::mc::UnwindContext*)arg; return unw_get_accessors(context->process_->unw_underlying_addr_space) ->put_unwind_info(context->process_->unw_underlying_addr_space, pip, context->process_->unw_underlying_context); } @@ -62,7 +62,7 @@ void UnwindContext::put_unwind_info(unw_addr_space_t /*as*/, unw_proc_info_t* pi */ int UnwindContext::get_dyn_info_list_addr(unw_addr_space_t /*as*/, unw_word_t* dilap, void* arg) noexcept { - simgrid::mc::UnwindContext* context = (simgrid::mc::UnwindContext*)arg; + const simgrid::mc::UnwindContext* context = (simgrid::mc::UnwindContext*)arg; return unw_get_accessors(context->process_->unw_underlying_addr_space) ->get_dyn_info_list_addr(context->process_->unw_underlying_addr_space, dilap, context->process_->unw_underlying_context); @@ -74,7 +74,7 @@ int UnwindContext::get_dyn_info_list_addr(unw_addr_space_t /*as*/, unw_word_t* d */ int UnwindContext::access_mem(unw_addr_space_t /*as*/, unw_word_t addr, unw_word_t* valp, int write, void* arg) noexcept { - simgrid::mc::UnwindContext* context = (simgrid::mc::UnwindContext*)arg; + const simgrid::mc::UnwindContext* context = (simgrid::mc::UnwindContext*)arg; if (write) return -UNW_EREADONLYREG; context->address_space_->read_bytes(valp, sizeof(unw_word_t), remote(addr)); @@ -176,41 +176,20 @@ int UnwindContext::access_reg(unw_addr_space_t /*as*/, unw_regnum_t regnum, unw_ unw_context_t* context = &as_context->unwind_context_; if (write) return -UNW_EREADONLYREG; - greg_t* preg = (greg_t*)get_reg(context, regnum); + const greg_t* preg = (greg_t*)get_reg(context, regnum); if (not preg) return -UNW_EBADREG; *valp = *preg; 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, void* arg) noexcept { - simgrid::mc::UnwindContext* context = (simgrid::mc::UnwindContext*)arg; - simgrid::mc::Frame* frame = context->process_->find_function(remote(addr)); + const simgrid::mc::UnwindContext* context = (simgrid::mc::UnwindContext*)arg; + const simgrid::mc::Frame* frame = context->process_->find_function(remote(addr)); if (not frame) return -UNW_ENOINFO; *offp = (unw_word_t)frame->range.begin() - addr; @@ -231,11 +210,13 @@ int UnwindContext::get_proc_name(unw_addr_space_t /*as*/, unw_word_t addr, char* * 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() { @@ -267,8 +248,9 @@ void UnwindContext::initialize(simgrid::mc::RemoteClient* process, unw_context_t unw_cursor_t UnwindContext::cursor() { unw_cursor_t cursor; - if (process_ == nullptr || address_space_ == 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; }