top:
switch(type->type){
+
+ // Not relevant, do nothing:
+ case DW_TAG_unspecified_type:
+ return;
+
// Simple case, hash this has binary:
case DW_TAG_base_type:
case DW_TAG_enumeration_type:
XBT_DEBUG("Hash struct member %s", member->name);
if(type->subtype==NULL)
return;
- mc_hash_value(hash, state, info, ((char*)address) + member->offset, type->subtype);
+ void* member_variable = mc_member_resolve(address, type, member, NULL);
+ mc_hash_value(hash, state, info, member_variable, type->subtype);
}
return;
}
continue;
}
- dw_type_t type = xbt_dict_get_or_null(info->types, variable->type_origin);
+ dw_type_t type = variable->type;
if(type==NULL) {
// Nothing
continue;
XBT_DEBUG("Hash local variable %s without type", variable->name);
continue;
}
- if(variable->location == NULL) {
+ if(variable->locations.size == 0) {
XBT_DEBUG("Hash local variable %s without location", variable->name);
continue;
}
XBT_DEBUG("Hash local variable %s", variable->name);
- void* variable_address = (void*) MC_dwarf_resolve_location(unw_cursor, variable->location, frame_pointer);
+ void* variable_address = (void*) mc_dwarf_resolve_locations(
+ &variable->locations, variable->object_info, unw_cursor, frame_pointer, NULL);
- dw_type_t type = xbt_dict_get_or_null(info->types, variable->type_origin);
+ dw_type_t type = variable->type;
if(type==NULL) {
XBT_DEBUG("Hash local variable %s without loctypeation", variable->name);
continue;
mc_hash_value(hash, state, info, variable_address, type);
}
-}
-/** \brief Find the frame base of a given frame
- *
- * \param ip Instruction pointer
- * \param frame
- * \param unw_cursor
- */
-void* mc_find_frame_base(void* ip, dw_frame_t frame, unw_cursor_t* unw_cursor) {
- switch(frame->frame_base->type) {
- case e_dw_loclist:
- {
- int loclist_cursor;
- for(loclist_cursor=0; loclist_cursor < xbt_dynar_length(frame->frame_base->location.loclist); loclist_cursor++){
- dw_location_entry_t entry = xbt_dynar_get_as(frame->frame_base->location.loclist, loclist_cursor, dw_location_entry_t);
- if((ip >= entry->lowpc) && (ip < entry->highpc)){
- return (void*) MC_dwarf_resolve_location(unw_cursor, entry->location, NULL);
- }
- }
- return NULL;
- }
- // Not handled:
- default:
- return NULL;
- }
+ // TODO, handle nested scopes
}
static void mc_hash_stack(mc_hash_t *hash, mc_snapshot_stack_t stack, mc_hashing_state* state) {