/* 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. */
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) */
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:
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;
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;