Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Remove dead code for ignoring variables
[simgrid.git] / src / mc / mc_dwarf.c
index c95f51e..d830f23 100644 (file)
@@ -1,6 +1,5 @@
 /* Copyright (c) 2008-2013. The SimGrid Team.
  * All rights reserved.                                                     */
-
 /* This program is free software; you can redistribute it and/or modify it
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
@@ -395,7 +394,7 @@ static uint64_t MC_dwarf_subrange_element_count(Dwarf_Die* die, Dwarf_Die* unit)
     return MC_dwarf_attr_uint(die, DW_AT_count, 0);
   }
 
-  // Otherwise compute DW_TAG_upper_bound-DW_TAG_lower_bound:
+  // Otherwise compute DW_TAG_upper_bound-DW_TAG_lower_bound + 1:
 
   if (!dwarf_hasattr_integrate(die, DW_AT_upper_bound)) {
        // This is not really 0, but the code expects this (we do not know):
@@ -409,7 +408,7 @@ static uint64_t MC_dwarf_subrange_element_count(Dwarf_Die* die, Dwarf_Die* unit)
   } else {
        lower_bound = MC_dwarf_default_lower_bound(dwarf_srclang(unit));
   }
-  return upper_bound - lower_bound;
+  return upper_bound - lower_bound + 1;
 }
 
 static uint64_t MC_dwarf_array_element_count(Dwarf_Die* die, Dwarf_Die* unit) {
@@ -634,6 +633,10 @@ static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die* die, Dwar
 
   char* key = bprintf("%" PRIx64, (uint64_t) type->id);
   xbt_dict_set(info->types, key, type, NULL);
+
+  if(type->name && type->byte_size!=0) {
+    xbt_dict_set(info->types_by_name, type->name, type, NULL);
+  }
 }
 
 /** \brief Convert libdw location expresion elment into native one (or NULL in some cases) */
@@ -831,7 +834,7 @@ static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die* die, D
         variable->global = 1;
         Dwarf_Off offset = expr[0].number;
         // TODO, Why is this different base on the object?
-        Dwarf_Off base = strcmp(info->file_name, xbt_binary_name) !=0 ? (Dwarf_Off) info->start_text : 0;
+        Dwarf_Off base = strcmp(info->file_name, xbt_binary_name) !=0 ? (Dwarf_Off) info->start_exec : 0;
         variable->address.address = (void*) (base + offset);
       } else {
         variable->address.location = MC_dwarf_get_expression(expr, len);
@@ -948,7 +951,16 @@ void MC_dwarf_get_variables(mc_object_info_t info) {
   size_t length;
   while (dwarf_nextcu (dwarf, offset, &next_offset, &length, NULL, NULL, NULL) == 0) {
     Dwarf_Die die;
+
     if(dwarf_offdie(dwarf, offset+length, &die)!=NULL) {
+
+      // Skip C++ for now (we will add support for it soon):
+      int lang = dwarf_srclang(&die);
+      if((lang==DW_LANG_C_plus_plus) || (lang==DW_LANG_ObjC_plus_plus)) {
+        offset = next_offset;
+        continue;
+      }
+
       MC_dwarf_handle_die(info, &die, &die, NULL);
     }
     offset = next_offset;