/* 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. */
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):
} 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) {
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) */
variable->global = frame == NULL; // Can be override base on DW_AT_location
variable->name = xbt_strdup(MC_dwarf_attr_string(die, DW_AT_name));
variable->type_origin = MC_dwarf_at_type(die);
- variable->address.address = NULL;
int klass = MC_dwarf_form_get_class(dwarf_whatform(&attr_location));
switch (klass) {
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;
- variable->address.address = (void*) (base + offset);
+ Dwarf_Off base = strcmp(info->file_name, xbt_binary_name) !=0 ? (Dwarf_Off) info->start_exec : 0;
+ variable->address = (void*) (base + offset);
} else {
- variable->address.location = MC_dwarf_get_expression(expr, len);
+ variable->location = MC_dwarf_get_expression(expr, len);
}
break;
case MC_DW_CLASS_LOCLISTPTR:
case MC_DW_CLASS_CONSTANT:
// Reference to location list:
- variable->address.location = MC_dwarf_get_location_list(die, &attr_location);
+ variable->location = MC_dwarf_get_location_list(die, &attr_location);
break;
default:
xbt_die("Unexpected calss 0x%x (%i) list for location in <%p>%s",
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;