Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Handle DW_AT_start_scope (for constants)
authorGabriel Corona <gabriel.corona@loria.fr>
Tue, 25 Feb 2014 09:16:28 +0000 (10:16 +0100)
committerGabriel Corona <gabriel.corona@loria.fr>
Tue, 25 Feb 2014 09:31:21 +0000 (10:31 +0100)
src/mc/mc_checkpoint.c
src/mc/mc_dwarf.c
src/mc/mc_private.h

index 9a923b2..604572b 100644 (file)
@@ -236,6 +236,14 @@ void MC_find_object_address(memory_map_t maps, mc_object_info_t result) {
 /************************************* Take Snapshot ************************************/
 /****************************************************************************************/
 
+static bool mc_valid_variable(dw_variable_t var, dw_frame_t frame, const void* ip) {
+  // The variable is not yet valid:
+  if((const void*)((const char*) frame->low_pc + var->start_scope) > ip)
+    return false;
+  else
+    return true;
+}
+
 static xbt_dynar_t MC_get_local_variables_values(xbt_dynar_t stack_frames){
 
   unsigned cursor1 = 0;
@@ -248,6 +256,9 @@ static xbt_dynar_t MC_get_local_variables_values(xbt_dynar_t stack_frames){
     dw_variable_t current_variable;
     xbt_dynar_foreach(stack_frame->frame->variables, cursor2, current_variable){
       
+      if(!mc_valid_variable(current_variable, stack_frame->frame, (void*) stack_frame->ip))
+        continue;
+
       int region_type;
       if((long)stack_frame->ip > (long)mc_libsimgrid_info->start_exec)
         region_type = 1;
index 4927f81..11e0b32 100644 (file)
@@ -953,6 +953,25 @@ 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);
   }
 
+  // Handle start_scope:
+  if (dwarf_hasattr(die, DW_AT_start_scope)) {
+    Dwarf_Attribute attr;
+    dwarf_attr(die, DW_AT_start_scope, &attr);
+    int form  = dwarf_whatform(&attr);
+    int klass = MC_dwarf_form_get_class(form);
+    switch(klass) {
+    case MC_DW_CLASS_CONSTANT:
+    {
+      Dwarf_Word value;
+      variable->start_scope = dwarf_formudata(&attr, &value) == 0 ? (size_t) value : 0;
+      break;
+    }
+    default:
+      xbt_die("Unhandled form 0x%x, class 0x%X for DW_AT_start_scope of variable %s",
+        form, klass, name==NULL ? "?" : name);
+    }
+  }
+
   if(namespace && variable->global) {
     char* old_name = variable->name;
     variable->name = bprintf("%s::%s", namespace, old_name);
@@ -1047,6 +1066,7 @@ static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die
 
     case mc_tag_namespace:
       mc_dwarf_handle_namespace_die(info, die, unit, frame, namespace);
+      break;
 
     default:
       break;
index f17fad5..8997755 100644 (file)
@@ -443,6 +443,8 @@ typedef struct s_dw_variable{
   dw_location_t location;
   void* address;
 
+  size_t start_scope;
+
 }s_dw_variable_t, *dw_variable_t;
 
 struct s_dw_frame{