Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Deduplicate address location resolution in MC_dwarf_resolve_location()
[simgrid.git] / src / mc / mc_dwarf.c
index 195cce2..6d7833f 100644 (file)
@@ -61,36 +61,7 @@ static inline const char* MC_dwarf_die_tagname(Dwarf_Die* die) {
   return MC_dwarf_tagname(dwarf_tag(die));
 }
 
-static int MC_dwarf_tag_type(int tag) {
-  switch(tag) {
-  case DW_TAG_array_type:
-  case DW_TAG_class_type:
-  case DW_TAG_enumeration_type:
-  case DW_TAG_typedef:
-  case DW_TAG_pointer_type:
-  case DW_TAG_string_type:
-  case DW_TAG_structure_type:
-  case DW_TAG_subroutine_type:
-  case DW_TAG_union_type:
-  case DW_TAG_ptr_to_member_type:
-  case DW_TAG_set_type:
-  case DW_TAG_subrange_type:
-  case DW_TAG_base_type:
-  case DW_TAG_const_type:
-  case DW_TAG_file_type:
-  case DW_TAG_packed_type:
-  case DW_TAG_volatile_type:
-  case DW_TAG_restrict_type:
-  case DW_TAG_interface_type:
-  case DW_TAG_unspecified_type:
-  case DW_TAG_mutable_type:
-  case DW_TAG_shared_type:
-  case DW_TAG_rvalue_reference_type:
-    return 1;
-  default:
-    return 0;
-  }
-}
+// ***** Attributes
 
 static const char* MC_dwarf_attr_string(Dwarf_Die* die, int attribute) {
   Dwarf_Attribute attr;
@@ -191,6 +162,40 @@ static uint64_t MC_dwarf_array_element_count(Dwarf_Die* die, Dwarf_Die* unit) {
   return result;
 }
 
+// ***** Location
+
+Dwarf_Off MC_dwarf_resolve_location(unw_cursor_t* c, dw_location_t location, void* frame_pointer_address) {
+  unw_word_t res;
+  switch (location->type){
+  case e_dw_compose:
+    if (xbt_dynar_length(location->location.compose) > 1){
+      return 0; /* TODO : location list with optimizations enabled */
+    }
+    dw_location_t location_entry = xbt_dynar_get_as(location->location.compose, 0, dw_location_t);
+    switch (location_entry->type){
+    case e_dw_register:
+      unw_get_reg(c, location_entry->location.reg, &res);
+      return res;
+    case e_dw_bregister_op:
+      unw_get_reg(c, location_entry->location.breg_op.reg, &res);
+      return (Dwarf_Off) ((long)res + location_entry->location.breg_op.offset);
+      break;
+    case e_dw_fbregister_op:
+      if (frame_pointer_address != NULL)
+        return (Dwarf_Off)((char *)frame_pointer_address + location_entry->location.fbreg_op);
+      else
+        return 0;
+    default:
+      return 0; /* FIXME : implement other cases (with optimizations enabled) */
+    }
+    break;
+    default:
+      return 0;
+  }
+}
+
+// ***** dw_type_t
+
 static void MC_dwarf_fill_member_location(dw_type_t type, dw_type_t member, Dwarf_Die* child) {
   if (dwarf_hasattr(child, DW_AT_data_bit_offset)) {
     xbt_die("Can't groke DW_AT_data_bit_offset.");
@@ -359,19 +364,44 @@ static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die* die, Dwar
 }
 
 static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit) {
-       int tag = dwarf_tag(die);
-
-       // Register types:
-       if (MC_dwarf_tag_type(tag))
-               MC_dwarf_handle_type_die(info, die, unit);
+  int tag = dwarf_tag(die);
 
-       // Other tag-specific handling:
-       else switch(tag) {
-
-       }
+  switch (tag) {
+    case DW_TAG_array_type:
+    case DW_TAG_class_type:
+    case DW_TAG_enumeration_type:
+    case DW_TAG_typedef:
+    case DW_TAG_pointer_type:
+    case DW_TAG_string_type:
+    case DW_TAG_structure_type:
+    case DW_TAG_subroutine_type:
+    case DW_TAG_union_type:
+    case DW_TAG_ptr_to_member_type:
+    case DW_TAG_set_type:
+    case DW_TAG_subrange_type:
+    case DW_TAG_base_type:
+    case DW_TAG_const_type:
+    case DW_TAG_file_type:
+    case DW_TAG_packed_type:
+    case DW_TAG_volatile_type:
+    case DW_TAG_restrict_type:
+    case DW_TAG_interface_type:
+    case DW_TAG_unspecified_type:
+    case DW_TAG_mutable_type:
+    case DW_TAG_shared_type:
+      MC_dwarf_handle_type_die(info, die, unit);
+      break;
+    case DW_TAG_inlined_subroutine:
+    case DW_TAG_subprogram:
+      // TODO
+      break;
+    case DW_TAG_variable:
+      // TODO
+      break;
+  }
 
-       // Recursive processing od children DIE:
-       MC_dwarf_handle_children(info, die, unit);
+  // Recursive processing of children DIE:
+  MC_dwarf_handle_children(info, die, unit);
 }
 
 void MC_dwarf_get_variables_libdw(mc_object_info_t info) {