Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
MC: complete workaround in the error msg seen on modern systems
[simgrid.git] / src / mc / inspect / mc_unw.cpp
index c942b04..82efd56 100644 (file)
@@ -77,7 +77,7 @@ int UnwindContext::access_mem(unw_addr_space_t /*as*/, unw_word_t addr, unw_word
   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;
 }
 
@@ -173,7 +173,7 @@ int UnwindContext::access_reg(unw_addr_space_t /*as*/, unw_regnum_t regnum, unw_
                               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);
@@ -183,27 +183,6 @@ int UnwindContext::access_reg(unw_addr_space_t /*as*/, unw_regnum_t regnum, unw_
   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,
@@ -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()
 {
@@ -244,11 +225,11 @@ 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.
@@ -256,7 +237,7 @@ void UnwindContext::initialize(simgrid::mc::RemoteClient* process, unw_context_t
   // 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?
@@ -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 || 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;
 }