Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Fix DW_OP_call_frame_cfa
authorGabriel Corona <gabriel.corona@loria.fr>
Tue, 25 Mar 2014 09:10:43 +0000 (10:10 +0100)
committerGabriel Corona <gabriel.corona@loria.fr>
Tue, 25 Mar 2014 09:12:02 +0000 (10:12 +0100)
UNW_X86_64_CFA does not work as expected

src/mc/mc_dwarf_expression.c

index 09e4143..92570ca 100644 (file)
@@ -43,27 +43,22 @@ int mc_dwarf_execute_expression(
         break;
       }
 
-    // Push the CFA (Call Frame Addresse):
+    // Push the CFA (Canonical Frame Addresse):
     case DW_OP_call_frame_cfa:
     {
-      unw_word_t res;
-
-      int register_id =
-#if defined(UNW_TARGET_X86_64)
-          UNW_X86_64_CFA
-#elif defined(UNW_TARGET_X86)
-          UNW_X86_CFA
-#else
-          -1;
-#endif
-        ;
-      if(register_id<0)
-        xbt_die("Support for CFA not implemented for this achitecture.");
+      // UNW_X86_64_CFA does not return the CFA DWARF expects
+      // (it is a synonym for UNW_X86_64_RSP) so copy the cursor,
+      // unwind it once in order to find the parent SP:
 
       if(!state->cursor)
         return MC_EXPRESSION_E_MISSING_STACK_CONTEXT;
 
-      unw_get_reg(state->cursor, register_id, &res);
+      // Get frame:
+      unw_cursor_t cursor = *(state->cursor);
+      unw_step(&cursor);
+
+      unw_word_t res;
+      unw_get_reg(&cursor, UNW_TDEP_SP, &res);
       error = mc_dwarf_push_value(state, res);
       break;
     }