Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Merge branch 'mc' into mc++
authorGabriel Corona <gabriel.corona@loria.fr>
Thu, 6 Mar 2014 12:29:59 +0000 (13:29 +0100)
committerGabriel Corona <gabriel.corona@loria.fr>
Thu, 6 Mar 2014 12:29:59 +0000 (13:29 +0100)
1  2 
src/mc/mc_dwarf.c

@@@ -926,13 -844,11 +923,14 @@@ static dw_variable_t MC_die_to_variable
    dw_variable_t variable = xbt_new0(s_dw_variable_t, 1);
    variable->dwarf_offset = dwarf_dieoffset(die);
    variable->global = frame == NULL; // Can be override base on DW_AT_location
 -  variable->name = xbt_strdup(MC_dwarf_attr_string(die, DW_AT_name));
 +
 +  const char* name = MC_dwarf_attr_string(die, DW_AT_name);
 +  variable->name = xbt_strdup(name);
 +
    variable->type_origin = MC_dwarf_at_type(die);
  
-   int klass = MC_dwarf_form_get_class(dwarf_whatform(&attr_location));
+   int form = dwarf_whatform(&attr_location);
+   int klass = form == DW_FORM_sec_offset ? MC_DW_CLASS_CONSTANT : MC_dwarf_form_get_class(form);
    switch (klass) {
    case MC_DW_CLASS_EXPRLOC:
    case MC_DW_CLASS_BLOCK:
      variable->location = MC_dwarf_get_location_list(info, die, &attr_location);
      break;
    default:
-     xbt_die("Unexpected calss 0x%x (%i) list for location in <%p>%s",
-       klass, klass, (void*) variable->dwarf_offset, variable->name);
+     xbt_die("Unexpected form 0x%x (%i), class 0x%x (%i) list for location in <%p>%s",
+       form, form, 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);
 +    free(old_name);
 +  }
 +
    // The current code needs a variable name,
    // generate a fake one:
    if(!variable->name) {