Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Don't use unprototyped functions
[simgrid.git] / src / mc / mc_dwarf.c
index c1fd447..2b2c2a0 100644 (file)
 #include <xbt/log.h>
 #include <xbt/sysdep.h>
 
+#include "mc_object_info.h"
 #include "mc_private.h"
 
+static void MC_dwarf_register_global_variable(mc_object_info_t info, dw_variable_t variable);
+static void MC_register_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable);
+static void MC_dwarf_register_non_global_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable);
+static void MC_dwarf_register_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable);
+
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_dwarf, mc, "DWARF processing");
 
 /** \brief The default DW_TAG_lower_bound for a given DW_AT_language.
@@ -159,7 +165,6 @@ static mc_tag_class MC_dwarf_tag_classify(int tag)
   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:
     return mc_tag_type;
 
@@ -1259,6 +1264,51 @@ static void MC_post_process_functions(mc_object_info_t info)
   }
 }
 
+
+/** \brief Fill/lookup the "subtype" field.
+ */
+static void MC_resolve_subtype(mc_object_info_t info, dw_type_t type)
+{
+
+  if (type->dw_type_id == NULL)
+    return;
+  type->subtype = xbt_dict_get_or_null(info->types, type->dw_type_id);
+  if (type->subtype == NULL)
+    return;
+  if (type->subtype->byte_size != 0)
+    return;
+  if (type->subtype->name == NULL)
+    return;
+  // Try to find a more complete description of the type:
+  // We need to fix in order to support C++.
+
+  dw_type_t subtype =
+      xbt_dict_get_or_null(info->full_types_by_name, type->subtype->name);
+  if (subtype != NULL) {
+    type->subtype = subtype;
+  }
+
+}
+
+static void MC_post_process_types(mc_object_info_t info)
+{
+  xbt_dict_cursor_t cursor = NULL;
+  char *origin;
+  dw_type_t type;
+
+  // Lookup "subtype" field:
+  xbt_dict_foreach(info->types, cursor, origin, type) {
+    MC_resolve_subtype(info, type);
+
+    dw_type_t member;
+    unsigned int i = 0;
+    if (type->members != NULL)
+      xbt_dynar_foreach(type->members, i, member) {
+      MC_resolve_subtype(info, member);
+      }
+  }
+}
+
 /** \brief Finds informations about a given shared object/executable */
 mc_object_info_t MC_find_object_info(memory_map_t maps, char *name,
                                      int executable)