break;
}
+ // Push the CFA (Call 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.");
+
+ if(!state->cursor)
+ return MC_EXPRESSION_E_MISSING_STACK_CONTEXT;
+
+ unw_get_reg(state->cursor, register_id, &res);
+ error = mc_dwarf_push_value(state, res + op->number);
+ break;
+ }
+
// Frame base:
case DW_OP_fbreg:
xbt_die("Could not resolve location");
}
+/** \brief Find the frame base of a given frame
+ *
+ * \param frame
+ * \param unw_cursor
+ */
+void* mc_find_frame_base(dw_frame_t frame, unw_cursor_t* unw_cursor) {
+ return (void*) mc_dwarf_resolve_locations(&frame->frame_base, unw_cursor, NULL);
+}
+
static
void mc_dwarf_expression_clear(mc_expression_t expression) {
free(expression->ops);
void* base = info->flags & MC_OBJECT_INFO_EXECUTABLE ? 0 : MC_object_base_address(info);
mc_dwarf_expression_init(expression, len, ops);
- expression->lowpc = (char*) base + start;
- expression->highpc = (char*) base + end;
+
+ // If start == 0, this is not a location list:
+ expression->lowpc = start == 0 ? NULL : (char*) base + start;
+ expression->highpc = start == 0 ? NULL : (char*) base + end;
}
}