return name;
}
+static Dwarf_Off MC_dwarf_attr_dieoffset(Dwarf_Die* die, int attribute) {
+ Dwarf_Attribute attr;
+ if (dwarf_hasattr_integrate(die, attribute)) {
+ dwarf_attr_integrate(die, attribute, &attr);
+ Dwarf_Die subtype_die;
+ if (dwarf_formref_die(&attr, &subtype_die)==NULL) {
+ xbt_die("Could not find DIE");
+ }
+ return dwarf_dieoffset(&subtype_die);
+ }
+ else return 0;
+}
+
+static Dwarf_Off MC_dwarf_attr_integrate_dieoffset(Dwarf_Die* die, int attribute) {
+ Dwarf_Attribute attr;
+ if (dwarf_hasattr_integrate(die, attribute)) {
+ dwarf_attr_integrate(die, DW_AT_type, &attr);
+ Dwarf_Die subtype_die;
+ if (dwarf_formref_die(&attr, &subtype_die)==NULL) {
+ xbt_die("Could not find DIE");
+ }
+ return dwarf_dieoffset(&subtype_die);
+ }
+ else return 0;
+}
+
/** \brief Find the type/subtype (DW_AT_type) for a DIE
*
* \param dit the DIE
* \return DW_AT_type reference as a global offset in hexadecimal (or NULL)
*/
static char* MC_dwarf_at_type(Dwarf_Die* die) {
- Dwarf_Attribute attr;
- if (dwarf_hasattr_integrate(die, DW_AT_type)) {
- dwarf_attr_integrate(die, DW_AT_type, &attr);
- Dwarf_Die subtype_die;
- if (dwarf_formref_die(&attr, &subtype_die)==NULL) {
- xbt_die("Could not find DIE for type");
- }
- Dwarf_Off subtype_global_offset = dwarf_dieoffset(&subtype_die);
- return bprintf("%" PRIx64 , subtype_global_offset);
- }
- else return NULL;
+ Dwarf_Off offset = MC_dwarf_attr_integrate_dieoffset(die, DW_AT_type);
+ return offset == 0 ? NULL : bprintf("%" PRIx64 , offset);
}
static uint64_t MC_dwarf_attr_integrate_addr(Dwarf_Die* die, int attribute) {
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->object_info = info;
const char* name = MC_dwarf_attr_integrate_string(die, DW_AT_name);
variable->name = xbt_strdup(name);
if (len==1 && expr[0].atom == DW_OP_addr) {
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_exec : 0;
+ Dwarf_Off base = (Dwarf_Off) MC_object_base_address(info);
variable->address = (void*) (base + offset);
} else {
mc_dwarf_location_list_init_from_expression(&variable->locations, len, expr);
dw_frame_t frame = xbt_new0(s_dw_frame_t, 1);
frame->tag = tag;
- frame->start = dwarf_dieoffset(die);
+ frame->id = dwarf_dieoffset(die);
+ frame->object_info = info;
- const char* name = MC_dwarf_attr_integrate_string(die, DW_AT_name);
- if(name)
+ if(klass==mc_tag_subprogram) {
+ const char* name = MC_dwarf_attr_integrate_string(die, DW_AT_name);
frame->name = namespace ? bprintf("%s::%s", namespace, name) : xbt_strdup(name);
+ }
+
+ frame->abstract_origin_id = MC_dwarf_attr_dieoffset(die, DW_AT_abstract_origin);
// 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);
+ void* base = 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 = ((char*) base) + MC_dwarf_attr_integrate_addr(die, DW_AT_high_pc);
frame->low_pc = ((char*) base) + MC_dwarf_attr_integrate_addr(die, DW_AT_low_pc);
+ // DW_AT_high_pc:
+ {
+ Dwarf_Attribute attr;
+ if(dwarf_attr_integrate(die, DW_AT_high_pc, &attr)) {
+ uint64_t high_pc;
+ Dwarf_Addr value;
+ if (dwarf_formaddr(&attr, &value) == 0)
+ high_pc = (uint64_t) value;
+ else
+ high_pc = 0;
+
+ int form = dwarf_whatform(&attr);
+ int klass = MC_dwarf_form_get_class(form);
+ if (klass == MC_DW_CLASS_CONSTANT)
+ frame->high_pc = frame->low_pc + high_pc;
+ else if(klass == MC_DW_CLASS_ADDRESS)
+ frame->high_pc = ((char*) base) + high_pc;
+ else
+ xbt_die("Unexpected class for DW_AT_high_pc");
+ } else {
+ frame->high_pc = 0;
+ }
+ }
+
if(klass==mc_tag_subprogram) {
Dwarf_Attribute attr_frame_base;
if (dwarf_attr_integrate(die, DW_AT_frame_base, &attr_frame_base))
// Register it:
if(klass==mc_tag_subprogram) {
- char* key = bprintf("%" PRIx64, (uint64_t) frame->start);
+ char* key = bprintf("%" PRIx64, (uint64_t) frame->id);
xbt_dict_set(info->subprograms, key, frame, NULL);
xbt_free(key);
} else if(klass==mc_tag_scope) {