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_global.c
index 736b0d3..033d77b 100644 (file)
@@ -19,6 +19,8 @@
 #include "xbt/automaton.h"
 #include "xbt/dict.h"
 
+static void MC_post_process_types(mc_object_info_t info);
+
 XBT_LOG_NEW_CATEGORY(mc, "All MC categories");
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_global, mc,
                                 "Logging specific to MC (global)");
@@ -148,7 +150,7 @@ static void dw_location_entry_free(dw_location_entry_t e){
   xbt_free(e);
 }
 
-static void dw_type_free(dw_type_t t){
+void dw_type_free(dw_type_t t){
   xbt_free(t->name);
   xbt_free(t->dw_type_id);
   xbt_dynar_free(&(t->members));
@@ -175,7 +177,7 @@ static void dw_variable_free_voidp(void *t){
 
 // object_info
 
-mc_object_info_t MC_new_object_info() {
+mc_object_info_t MC_new_object_info(void) {
   mc_object_info_t res = xbt_new(s_mc_object_info_t, 1);
   res->file_name = NULL;
   res->start_text = NULL;
@@ -532,6 +534,8 @@ static int MC_dwarf_get_variable_index(xbt_dynar_t variables, char* var, void *a
 
 /** \brief Fill DWARf debug infomations (types, frames, variables ...). */
 void MC_dwarf_get_variables(mc_object_info_t info) {
+  if(MC_USE_LIBDW_TYPES)
+    MC_dwarf_get_variables_libdw(info);
   mc_object_info_t result = info;
   const char *elf_file = info->file_name;
 
@@ -757,6 +761,7 @@ void MC_dwarf_get_variables(mc_object_info_t info) {
         if(strcmp(node_type, "DW_AT_name") == 0){
 
           var = xbt_new0(s_dw_variable_t, 1);
+          var->dwarf_offset = 0;
           var->name = xbt_strdup(xbt_dynar_get_as(split, xbt_dynar_length(split) - 1, char *));
           xbt_dict_set(variables_origin, origin, xbt_strdup(var->name), NULL);
          
@@ -916,33 +921,30 @@ void MC_dwarf_get_variables(mc_object_info_t info) {
       
       }
 
-    }else if(strcmp(node_type, "(DW_TAG_base_type)") == 0 
+    }else if(!MC_USE_LIBDW_TYPES&&(strcmp(node_type, "(DW_TAG_base_type)") == 0
              || strcmp(node_type, "(DW_TAG_enumeration_type)") == 0
-             || strcmp(node_type, "(DW_TAG_enumerator)") == 0
              || strcmp(node_type, "(DW_TAG_typedef)") == 0
              || strcmp(node_type, "(DW_TAG_const_type)") == 0
              || strcmp(node_type, "(DW_TAG_subroutine_type)") == 0
              || strcmp(node_type, "(DW_TAG_volatile_type)") == 0
-             || (is_pointer = !strcmp(node_type, "(DW_TAG_pointer_type)"))){
+             || (is_pointer = !strcmp(node_type, "(DW_TAG_pointer_type)")))){
 
       /* Create the and add it to the types dictionnary */
 
       if(strcmp(node_type, "(DW_TAG_base_type)") == 0)
-        type_type = e_dw_base_type;
+        type_type = DW_TAG_base_type;
       else if(strcmp(node_type, "(DW_TAG_enumeration_type)") == 0)
-        type_type = e_dw_enumeration_type;
-      else if(strcmp(node_type, "(DW_TAG_enumerator)") == 0)
-        type_type = e_dw_enumerator;
+        type_type = DW_TAG_enumeration_type;
       else if(strcmp(node_type, "(DW_TAG_typedef)") == 0)
-        type_type = e_dw_typedef;
+        type_type = DW_TAG_typedef;
       else if(strcmp(node_type, "(DW_TAG_const_type)") == 0)
-        type_type = e_dw_const_type;
+        type_type = DW_TAG_const_type;
       else if(strcmp(node_type, "(DW_TAG_pointer_type)") == 0)
-        type_type = e_dw_pointer_type;
+        type_type = DW_TAG_pointer_type;
       else if(strcmp(node_type, "(DW_TAG_subroutine_type)") == 0)
-        type_type = e_dw_subroutine_type;
+        type_type = DW_TAG_subroutine_type;
       else if(strcmp(node_type, "(DW_TAG_volatile_type)") == 0)
-        type_type = e_dw_volatile_type;
+        type_type = DW_TAG_volatile_type;
 
       strtok(xbt_dynar_get_as(split, 0, char *), "<");
       origin = strdup(strtok(NULL, "<"));
@@ -972,7 +974,7 @@ void MC_dwarf_get_variables(mc_object_info_t info) {
 
         if(strcmp(node_type, "DW_AT_byte_size") == 0){
           size = strtol(xbt_dynar_get_as(split, xbt_dynar_length(split) - 1, char*), NULL, 10);
-          if(type_type == e_dw_enumeration_type)
+          if(type_type == DW_TAG_enumeration_type)
             enumeration_size = size;
         }else if(strcmp(node_type, "DW_AT_name") == 0){
           end = xbt_str_join(split, " ");
@@ -999,10 +1001,11 @@ void MC_dwarf_get_variables(mc_object_info_t info) {
       type->id = (void *)strtoul(origin, NULL, 16);
       if(type_origin)
         type->dw_type_id = xbt_strdup(type_origin);
-      if(type_type == e_dw_enumerator)
-        type->size = enumeration_size;
-      else
-        type->size = size;
+
+      type->byte_size = size;
+      // Not relevant:
+      type->element_count = -1;
+
       type->members = NULL;
 
       xbt_dict_set(*types, origin, type, NULL); 
@@ -1087,9 +1090,11 @@ void MC_dwarf_get_variables(mc_object_info_t info) {
         if(member_end && type){         
           member_end = 0;
           
+          // Why are we not simply referencing, the DW_AT_type?
           dw_type_t member_type = xbt_new0(s_dw_type_t, 1);
           member_type->name = xbt_strdup(name);
-          member_type->size = size;
+          member_type->byte_size = size;
+          member_type->element_count = -1;
           member_type->is_pointer_type = is_pointer;
           member_type->id = (void *)strtoul(origin, NULL, 16);
           member_type->offset = offset;
@@ -1118,11 +1123,12 @@ void MC_dwarf_get_variables(mc_object_info_t info) {
         if(struct_decl || union_decl){
           type = xbt_new0(s_dw_type_t, 1);
           if(struct_decl)
-            type->type = e_dw_structure_type;
+            type->type = DW_TAG_structure_type;
           else
-            type->type = e_dw_union_type;
+            type->type = DW_TAG_union_type;
           type->name = xbt_strdup(name);
-          type->size = size;
+          type->byte_size = size;
+          type->element_count = -1;
           type->is_pointer_type = is_pointer;
           type->id = (void *)strtoul(origin, NULL, 16);
           if(type_origin)
@@ -1210,8 +1216,8 @@ void MC_dwarf_get_variables(mc_object_info_t info) {
         }
 
         if(subrange && type){         
-          type->size = size;
-      
+          type->element_count = size;
+
           xbt_free(name);
           name = NULL;
           xbt_free(end);
@@ -1229,13 +1235,16 @@ void MC_dwarf_get_variables(mc_object_info_t info) {
         }else {
           
           type = xbt_new0(s_dw_type_t, 1);
-          type->type = e_dw_array_type;
+          type->type = DW_TAG_array_type;
           type->name = xbt_strdup(name);
           type->is_pointer_type = is_pointer;
           type->id = (void *)strtoul(origin, NULL, 16);
           if(type_origin)
             type->dw_type_id = xbt_strdup(type_origin);
           type->members = NULL;
+
+          // Filled in a post processing step:
+          type-> byte_size = 0;
           
           xbt_dict_set(*types, origin, type, NULL); 
           
@@ -1274,8 +1283,29 @@ void MC_dwarf_get_variables(mc_object_info_t info) {
   xbt_dict_free(&location_list);
 
   pclose(fp);
+
+  MC_post_process_types(info);
+}
+
+static void MC_post_process_array_size(mc_object_info_t info, dw_type_t type) {
+  xbt_assert(type->dw_type_id, "No base type for array <%p>%s", type->id, type->name);
+  dw_type_t subtype = xbt_dict_get_or_null(info->types, type->dw_type_id);
+  xbt_assert(subtype, "Unkown base type <%s> for array <%p>%s", type->dw_type_id, type->id, type->name);
+  if(subtype->type==DW_TAG_array_type && type->byte_size==0) {
+         MC_post_process_array_size(info, subtype);
+  }
+  type->byte_size = type->element_count*subtype->byte_size;
 }
 
+static void MC_post_process_types(mc_object_info_t info) {
+  xbt_dict_cursor_t cursor;
+  char *origin;
+  dw_type_t type;
+  xbt_dict_foreach(info->types, cursor, origin, type){
+    if(type->type==DW_TAG_array_type && type->byte_size==0)
+      MC_post_process_array_size(info, type);
+  }
+}
 
 /*******************************  Ignore mechanism *******************************/
 /*********************************************************************************/