Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Fix DW_OP_call_frame_cfa
[simgrid.git] / src / mc / mc_hash.c
index c46dc4a..dc2add0 100644 (file)
@@ -77,6 +77,11 @@ static void mc_hash_value(mc_hash_t* hash, mc_hashing_state* state, mc_object_in
   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:
@@ -132,7 +137,8 @@ static void mc_hash_value(mc_hash_t* hash, mc_hashing_state* state, mc_object_in
       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;
   }
@@ -197,7 +203,7 @@ static void mc_hash_object_globals(mc_hash_t *hash, mc_hashing_state* state, mc_
       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;
@@ -228,16 +234,16 @@ static void mc_hash_stack_frame(
       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, 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;
@@ -245,31 +251,8 @@ static void mc_hash_stack_frame(
 
     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) {