-/* Copyright (c) 2008-2013. The SimGrid Team.
+/* Copyright (c) 2008-2014. 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. */
#include <stdlib.h>
+#define DW_LANG_Objc DW_LANG_ObjC /* fix spelling error in older dwarf.h */
#include <dwarf.h>
#include <elfutils/libdw.h>
#include <inttypes.h>
#include "mc_private.h"
-// Define symbols not present in old version of dwarf.h.
-// Old version of dwarf.h, use DW_LANG_Objc instead of this:
-#define DW_LANG_ObjC 0x0010
-
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_dwarf, mc, "DWARF processing");
/** \brief The default DW_TAG_lower_bound for a given DW_AT_language.
if (!dwarf_hasattr_integrate(child, DW_AT_data_member_location)) {
if (type->type != DW_TAG_union_type) {
xbt_die(
- "Missing DW_AT_data_member_location field in DW_TAG_member %s of type <%p>%s",
- member->name, type->id, type->name);
+ "Missing DW_AT_data_member_location field in DW_TAG_member %s of type <%"PRIx64">%s",
+ member->name, (uint64_t) type->id, type->name);
} else {
return;
}
size_t len;
if (dwarf_getlocation(&attr, &expr, &len)) {
xbt_die(
- "Could not read location expression DW_AT_data_member_location in DW_TAG_member %s of type <%p>%s",
+ "Could not read location expression DW_AT_data_member_location in DW_TAG_member %s of type <%"PRIx64">%s",
MC_dwarf_attr_integrate_string(child, DW_AT_name),
- type->id, type->name);
+ (uint64_t) type->id, type->name);
}
if (len==1 && expr[0].atom == DW_OP_plus_uconst) {
member->offset = expr[0].number;
if (!dwarf_formudata(&attr, &offset))
member->offset = offset;
else
- xbt_die("Cannot get %s location <%p>%s",
+ xbt_die("Cannot get %s location <%"PRIx64">%s",
MC_dwarf_attr_integrate_string(child, DW_AT_name),
- type->id, type->name);
+ (uint64_t) type->id, type->name);
break;
}
case MC_DW_CLASS_LOCLISTPTR:
member->type = tag;
// Global Offset:
- member->id = (void *) dwarf_dieoffset(&child);
+ member->id = dwarf_dieoffset(&child);
const char* name = MC_dwarf_attr_integrate_string(&child, DW_AT_name);
if(name)
MC_dwarf_fill_member_location(type, member, &child);
if (!member->dw_type_id) {
- xbt_die("Missing type for member %s of <%p>%s", member->name, type->id, type->name);
+ xbt_die("Missing type for member %s of <%"PRIx64">%s", member->name, (uint64_t) type->id, type->name);
}
xbt_dynar_push(type->members, &member);
dw_type_t type = xbt_new0(s_dw_type_t, 1);
type->type = -1;
- type->id = NULL;
+ type->id = 0;
type->name = NULL;
type->byte_size = 0;
type->element_count = -1;
type->type = dwarf_tag(die);
// Global Offset
- type->id = (void *) dwarf_dieoffset(die);
+ type->id = dwarf_dieoffset(die);
const char* prefix = "";
switch (type->type) {
type->name = namespace ? bprintf("%s%s::%s", prefix, namespace, name) : bprintf("%s%s", prefix, name);
}
- XBT_DEBUG("Processing type <%p>%s", type->id, type->name);
-
type->dw_type_id = MC_dwarf_at_type(die);
// Computation of the byte_size;
size_t len;
if (dwarf_getlocation(&attr_location, &expr, &len)) {
xbt_die(
- "Could not read location expression in DW_AT_location of variable <%p>%s",
- (void*) variable->dwarf_offset, variable->name);
+ "Could not read location expression in DW_AT_location of variable <%"PRIx64">%s",
+ (uint64_t) variable->dwarf_offset, variable->name);
}
if (len==1 && expr[0].atom == DW_OP_addr) {
variable->global = 1;
- Dwarf_Off offset = expr[0].number;
- Dwarf_Off base = (Dwarf_Off) MC_object_base_address(info);
+ uintptr_t offset = (uintptr_t) expr[0].number;
+ uintptr_t base = (uintptr_t) MC_object_base_address(info);
variable->address = (void*) (base + offset);
} else {
mc_dwarf_location_list_init_from_expression(&variable->locations, len, expr);
mc_dwarf_location_list_init(&variable->locations, info, die, &attr_location);
break;
default:
- 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);
+ xbt_die("Unexpected form 0x%x (%i), class 0x%x (%i) list for location in <%"PRIx64">%s",
+ form, form, klass, klass, (uint64_t) variable->dwarf_offset, variable->name);
}
// Handle start_scope:
if (dwarf_formsdata(&attr, &offset) !=0)
xbt_die("Could not read constant");
- frame->high_pc = (void*) ((Dwarf_Off)frame->low_pc + offset);
+ frame->high_pc = (void*) ((char*)frame->low_pc + offset);
break;
// DW_AT_high_pc is a relocatable address: