Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Use resolved addresses in frame->low_pc and frame->high_pc
[simgrid.git] / src / mc / mc_dwarf.c
index 84e4260..b4427da 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. */
 
@@ -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) */
@@ -795,6 +798,8 @@ static dw_location_t MC_dwarf_get_expression(Dwarf_Op* expr,  size_t len) {
   return loc;
 }
 
+static int mc_anonymous_variable_index = 0;
+
 static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame) {
   // Drop declaration:
   if (MC_dwarf_attr_flag(die, DW_AT_declaration, false))
@@ -848,6 +853,12 @@ static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die* die, D
       klass, klass, (void*) variable->dwarf_offset, variable->name);
   }
 
+  // The current code needs a variable name,
+  // generate a fake one:
+  if(!variable->name) {
+    variable->name = bprintf("@anonymous#%i", mc_anonymous_variable_index++);
+  }
+
   return variable;
 }
 
@@ -868,10 +879,15 @@ static void MC_dwarf_handle_subprogram_die(mc_object_info_t info, Dwarf_Die* die
     name = MC_dwarf_attr_string(die, DW_AT_name);
   frame->name = xbt_strdup(name);
 
+  // This is the base address for DWARF addresses.
+  // Relocated addresses are offset from this base address.
+  // See DWARF4 spec 7.5
+  void* base = info->flags & MC_OBJECT_INFO_EXECUTABLE ? 0 : MC_object_base_address(info);
+
   // Variables are filled in the (recursive) call of MC_dwarf_handle_children:
   frame->variables = xbt_dynar_new(sizeof(dw_variable_t), dw_variable_free_voidp);
-  frame->high_pc = (void*) MC_dwarf_attr_addr(die, DW_AT_high_pc);
-  frame->low_pc = (void*) MC_dwarf_attr_addr(die, DW_AT_low_pc);
+  frame->high_pc = ((char*) base) + MC_dwarf_attr_addr(die, DW_AT_high_pc);
+  frame->low_pc = ((char*) base) + MC_dwarf_attr_addr(die, DW_AT_low_pc);
   frame->frame_base = MC_dwarf_at_location(die, DW_AT_frame_base);
   frame->end = -1; // This one is now useless:
 
@@ -917,7 +933,6 @@ static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die
     case DW_TAG_shared_type:
       MC_dwarf_handle_type_die(info, die, unit);
       break;
-    case DW_TAG_inlined_subroutine:
     case DW_TAG_subprogram:
       MC_dwarf_handle_subprogram_die(info, die, unit, frame);
       return;
@@ -947,7 +962,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;