#include "mc_object_info.h"
#include "mc_private.h"
-static void dw_variable_free(dw_variable_t v);
-static void dw_variable_free_voidp(void *t);
+static void mc_variable_free_voidp(void *t)
+{
+ delete *(simgrid::mc::Variable**)t;
+}
+
+static void mc_frame_free(void* frame)
+{
+ delete (simgrid::mc::Frame*)frame;
+}
-static void MC_dwarf_register_global_variable(mc_object_info_t info, dw_variable_t variable);
-static void MC_register_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable);
-static void MC_dwarf_register_non_global_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable);
-static void MC_dwarf_register_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable);
+static void MC_dwarf_register_global_variable(mc_object_info_t info, mc_variable_t variable);
+static void MC_register_variable(mc_object_info_t info, mc_frame_t frame, mc_variable_t variable);
+static void MC_dwarf_register_non_global_variable(mc_object_info_t info, mc_frame_t frame, mc_variable_t variable);
+static void MC_dwarf_register_variable(mc_object_info_t info, mc_frame_t frame, mc_variable_t variable);
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_dwarf, mc, "DWARF processing");
* \param frame containg frame if any
*/
static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die * die,
- Dwarf_Die * unit, dw_frame_t frame,
+ Dwarf_Die * unit, mc_frame_t frame,
const char *ns);
/** \brief Process a type DIE
*/
static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die * die,
- Dwarf_Die * unit, dw_frame_t frame,
+ Dwarf_Die * unit, mc_frame_t frame,
const char *ns);
/** \brief Calls MC_dwarf_handle_die on all childrend of the given die
* \param frame containg frame if any
*/
static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die * die,
- Dwarf_Die * unit, dw_frame_t frame,
+ Dwarf_Die * unit, mc_frame_t frame,
const char *ns);
/** \brief Handle a variable (DW_TAG_variable or other)
* \param frame containg frame if any
*/
static void MC_dwarf_handle_variable_die(mc_object_info_t info, Dwarf_Die * die,
- Dwarf_Die * unit, dw_frame_t frame,
+ Dwarf_Die * unit, mc_frame_t frame,
const char *ns);
/** \brief Get the DW_TAG_type of the DIE
* \param die DIE
* \return DW_TAG_type attribute as a new string (NULL if none)
*/
-static char *MC_dwarf_at_type(Dwarf_Die * die);
+static std::string MC_dwarf_at_type(Dwarf_Die * die);
/** \brief A class of DWARF tags (DW_TAG_*)
*/
* \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)
+static
+std::string MC_dwarf_at_type(Dwarf_Die * die)
{
Dwarf_Off offset = MC_dwarf_attr_integrate_dieoffset(die, DW_AT_type);
- return offset == 0 ? NULL : bprintf("%" PRIx64, offset);
+ if (offset == 0)
+ return std::string();
+ char* s = bprintf("%" PRIx64, offset);
+ std::string res(s);
+ free(s);
+ return std::move(res);
}
static uint64_t MC_dwarf_attr_integrate_addr(Dwarf_Die * die, int attribute)
member.byte_size =
MC_dwarf_attr_integrate_uint(&child, DW_AT_byte_size, 0);
member.element_count = -1;
-
- char* type_id = MC_dwarf_at_type(&child);
- if (type_id) {
- member.dw_type_id = type_id;
- free(type_id);
- }
+ member.type_id = MC_dwarf_at_type(&child);
if (dwarf_hasattr(&child, DW_AT_data_bit_offset)) {
xbt_die("Can't groke DW_AT_data_bit_offset.");
MC_dwarf_fill_member_location(type, &member, &child);
- if (member.dw_type_id.empty()) {
+ if (member.type_id.empty()) {
xbt_die("Missing type for member %s of <%" PRIx64 ">%s",
member.name.c_str(),
(uint64_t) type->id, type->name.c_str());
* \return MC representation of the type
*/
static mc_type_t MC_dwarf_die_to_type(mc_object_info_t info, Dwarf_Die * die,
- Dwarf_Die * unit, dw_frame_t frame,
+ Dwarf_Die * unit, mc_frame_t frame,
const char *ns)
{
free(full_name);
}
- char* type_id = MC_dwarf_at_type(die);
- if (type_id) {
- type->dw_type_id = type_id;
- free(type_id);
- }
+ type->type_id = MC_dwarf_at_type(die);
// Some compilers do not emit DW_AT_byte_size for pointer_type,
// so we fill this. We currently assume that the model-checked process is in
}
static void MC_dwarf_handle_type_die(mc_object_info_t info, Dwarf_Die * die,
- Dwarf_Die * unit, dw_frame_t frame,
+ Dwarf_Die * unit, mc_frame_t frame,
const char *ns)
{
mc_type_t type = MC_dwarf_die_to_type(info, die, unit, frame, ns);
static int mc_anonymous_variable_index = 0;
-static dw_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die * die,
- Dwarf_Die * unit, dw_frame_t frame,
+static mc_variable_t MC_die_to_variable(mc_object_info_t info, Dwarf_Die * die,
+ Dwarf_Die * unit, mc_frame_t frame,
const char *ns)
{
// Skip declarations:
return NULL;
}
- dw_variable_t variable = xbt_new0(s_dw_variable_t, 1);
+ simgrid::mc::Variable* variable = new simgrid::mc::Variable();
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);
-
- variable->type_origin = MC_dwarf_at_type(die);
+ if (name)
+ variable->name = name;
+ variable->type_id = MC_dwarf_at_type(die);
int form = dwarf_whatform(&attr_location);
int klass =
Dwarf_Op *expr;
size_t len;
if (dwarf_getlocation(&attr_location, &expr, &len)) {
- xbt_die
- ("Could not read location expression in DW_AT_location of variable <%"
- PRIx64 ">%s", (uint64_t) variable->dwarf_offset, variable->name);
+ xbt_die(
+ "Could not read location expression in DW_AT_location "
+ "of variable <%" PRIx64 ">%s",
+ (uint64_t) variable->dwarf_offset,
+ variable->name.c_str());
}
if (len == 1 && expr[0].atom == DW_OP_addr) {
uintptr_t base = (uintptr_t) info->base_address();
variable->address = (void *) (base + offset);
} else {
- mc_dwarf_location_list_init_from_expression(&variable->locations, len,
- expr);
+ simgrid::mc::LocationListEntry entry;
+ entry.expression = {expr, expr + len};
+ variable->location_list = { std::move(entry) };
}
break;
case MC_DW_CLASS_LOCLISTPTR:
case MC_DW_CLASS_CONSTANT:
// Reference to location list:
- mc_dwarf_location_list_init(&variable->locations, info, die,
- &attr_location);
+ mc_dwarf_location_list_init(
+ &variable->location_list, info, die,
+ &attr_location);
break;
default:
- 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);
+ 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.c_str());
}
// Handle start_scope:
}
}
- if (ns && variable->global) {
- char *old_name = variable->name;
- variable->name = bprintf("%s::%s", ns, old_name);
- free(old_name);
- }
+ if (ns && variable->global)
+ variable->name =
+ std::string(ns) + "::" + variable->name;
+
// The current code needs a variable name,
// generate a fake one:
- if (!variable->name) {
- variable->name = bprintf("@anonymous#%i", mc_anonymous_variable_index++);
- }
+ if (variable->name.empty())
+ variable->name =
+ "@anonymous#" + std::to_string(mc_anonymous_variable_index++);
return variable;
}
static void MC_dwarf_handle_variable_die(mc_object_info_t info, Dwarf_Die * die,
- Dwarf_Die * unit, dw_frame_t frame,
+ Dwarf_Die * unit, mc_frame_t frame,
const char *ns)
{
- dw_variable_t variable =
+ mc_variable_t variable =
MC_die_to_variable(info, die, unit, frame, ns);
if (variable == NULL)
return;
MC_dwarf_register_variable(info, frame, variable);
}
-static void mc_frame_free_voipd(dw_frame_t * p)
-{
- mc_frame_free(*p);
- *p = NULL;
-}
-
static void MC_dwarf_handle_scope_die(mc_object_info_t info, Dwarf_Die * die,
- Dwarf_Die * unit, dw_frame_t parent_frame,
+ Dwarf_Die * unit, mc_frame_t parent_frame,
const char *ns)
{
// TODO, handle DW_TAG_type/DW_TAG_location for DW_TAG_with_stmt
if (klass == mc_tag_scope)
xbt_assert(parent_frame, "No parent scope for this scope");
- dw_frame_t frame = xbt_new0(s_dw_frame_t, 1);
+ mc_frame_t frame = new simgrid::mc::Frame();
frame->tag = tag;
frame->id = dwarf_dieoffset(die);
if (klass == mc_tag_subprogram) {
const char *name = MC_dwarf_attr_integrate_string(die, DW_AT_name);
- frame->name =
- ns ? bprintf("%s::%s", ns, name) : xbt_strdup(name);
+ if(ns)
+ frame->name = std::string(ns) + "::" + name;
+ else
+ frame->name = name;
}
frame->abstract_origin_id =
// See DWARF4 spec 7.5
void *base = info->base_address();
- // 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);
-
// TODO, support DW_AT_ranges
uint64_t low_pc = MC_dwarf_attr_integrate_addr(die, DW_AT_low_pc);
frame->low_pc = low_pc ? ((char *) base) + low_pc : 0;
&attr_frame_base);
}
- frame->scopes =
- xbt_dynar_new(sizeof(dw_frame_t), (void_f_pvoid_t) mc_frame_free_voipd);
-
// Register it:
if (klass == mc_tag_subprogram) {
char *key = bprintf("%" PRIx64, (uint64_t) frame->id);
static void mc_dwarf_handle_namespace_die(mc_object_info_t info,
Dwarf_Die * die, Dwarf_Die * unit,
- dw_frame_t frame,
+ mc_frame_t frame,
const char *ns)
{
const char *name = MC_dwarf_attr_integrate_string(die, DW_AT_name);
}
static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die * die,
- Dwarf_Die * unit, dw_frame_t frame,
+ Dwarf_Die * unit, mc_frame_t frame,
const char *ns)
{
// For each child DIE:
}
static void MC_dwarf_handle_die(mc_object_info_t info, Dwarf_Die * die,
- Dwarf_Die * unit, dw_frame_t frame,
+ Dwarf_Die * unit, mc_frame_t frame,
const char *ns)
{
int tag = dwarf_tag(die);
/************************** Free functions *************************/
-void mc_frame_free(dw_frame_t frame)
-{
- xbt_free(frame->name);
- mc_dwarf_location_list_clear(&(frame->frame_base));
- xbt_dynar_free(&(frame->variables));
- xbt_dynar_free(&(frame->scopes));
- xbt_free(frame);
-}
-
static void dw_type_free(mc_type_t t)
{
delete t;
}
-void dw_variable_free(dw_variable_t v)
-{
- if (v) {
- xbt_free(v->name);
- xbt_free(v->type_origin);
-
- if (v->locations.locations)
- mc_dwarf_location_list_clear(&v->locations);
- xbt_free(v);
- }
-}
-
-void dw_variable_free_voidp(void *t)
-{
- dw_variable_free((dw_variable_t) * (void **) t);
-}
-
// ***** object_info
namespace simgrid {
this->end_rw = nullptr;
this->start_ro = nullptr;
this->end_ro = nullptr;
- this->subprograms = xbt_dict_new_homogeneous((void (*)(void *)) mc_frame_free);
+ this->subprograms = xbt_dict_new_homogeneous(mc_frame_free);
this->global_variables =
- xbt_dynar_new(sizeof(dw_variable_t), dw_variable_free_voidp);
+ xbt_dynar_new(sizeof(mc_variable_t), mc_variable_free_voidp);
this->types = xbt_dict_new_homogeneous((void (*)(void *)) dw_type_free);
this->full_types_by_name = xbt_dict_new_homogeneous(NULL);
this->functions_index = nullptr;
xbt_dynar_t index = xbt_dynar_new(sizeof(s_mc_function_index_item_t), NULL);
// Populate the array:
- dw_frame_t frame = NULL;
+ mc_frame_t frame = NULL;
xbt_dict_cursor_t cursor;
char *key;
xbt_dict_foreach(info->subprograms, cursor, key, frame) {
static void MC_post_process_variables(mc_object_info_t info)
{
unsigned cursor = 0;
- dw_variable_t variable = NULL;
- xbt_dynar_foreach(info->global_variables, cursor, variable) {
- if (variable->type_origin) {
- variable->type = (mc_type_t) xbt_dict_get_or_null(info->types, variable->type_origin);
- }
- }
+ mc_variable_t variable = nullptr;
+ xbt_dynar_foreach(info->global_variables, cursor, variable)
+ if (!variable->type_id.empty())
+ variable->type = (mc_type_t) xbt_dict_get_or_null(
+ info->types, variable->type_id.c_str());
}
-static void mc_post_process_scope(mc_object_info_t info, dw_frame_t scope)
+static void mc_post_process_scope(mc_object_info_t info, mc_frame_t scope)
{
if (scope->tag == DW_TAG_inlined_subroutine) {
// Attach correct namespaced name in inlined subroutine:
char *key = bprintf("%" PRIx64, (uint64_t) scope->abstract_origin_id);
- dw_frame_t abstract_origin = (dw_frame_t) xbt_dict_get_or_null(info->subprograms, key);
+ mc_frame_t abstract_origin = (mc_frame_t) xbt_dict_get_or_null(info->subprograms, key);
xbt_assert(abstract_origin, "Could not lookup abstract origin %s", key);
xbt_free(key);
- scope->name = xbt_strdup(abstract_origin->name);
-
+ scope->name = abstract_origin->name;
}
+
// Direct:
unsigned cursor = 0;
- dw_variable_t variable = NULL;
- xbt_dynar_foreach(scope->variables, cursor, variable) {
- if (variable->type_origin) {
- variable->type = (mc_type_t) xbt_dict_get_or_null(info->types, variable->type_origin);
- }
- }
+ mc_variable_t variable = nullptr;
+ xbt_dynar_foreach(scope->variables, cursor, variable)
+ if (!variable->type_id.empty())
+ variable->type = (mc_type_t) xbt_dict_get_or_null(
+ info->types, variable->type_id.c_str());
// Recursive post-processing of nested-scopes:
- dw_frame_t nested_scope = NULL;
+ mc_frame_t nested_scope = nullptr;
xbt_dynar_foreach(scope->scopes, cursor, nested_scope)
mc_post_process_scope(info, nested_scope);
{
xbt_dict_cursor_t cursor;
char *key;
- dw_frame_t subprogram = NULL;
+ mc_frame_t subprogram = NULL;
xbt_dict_foreach(info->subprograms, cursor, key, subprogram) {
mc_post_process_scope(info, subprogram);
}
static void MC_resolve_subtype(mc_object_info_t info, mc_type_t type)
{
- if (type->dw_type_id.empty())
+ if (type->type_id.empty())
return;
type->subtype = (mc_type_t) xbt_dict_get_or_null(
- info->types, type->dw_type_id.c_str());
+ info->types, type->type_id.c_str());
if (type->subtype == NULL)
return;
if (type->subtype->byte_size != 0)
/*************************************************************************/
-static int MC_dwarf_get_variable_index(xbt_dynar_t variables, char *var,
+static int MC_dwarf_get_variable_index(xbt_dynar_t variables, const char *var,
void *address)
{
unsigned int cursor = 0;
int start = 0;
int end = xbt_dynar_length(variables) - 1;
- dw_variable_t var_test = NULL;
+ mc_variable_t var_test = NULL;
while (start <= end) {
cursor = (start + end) / 2;
var_test =
- (dw_variable_t) xbt_dynar_get_as(variables, cursor, dw_variable_t);
- if (strcmp(var_test->name, var) < 0) {
+ (mc_variable_t) xbt_dynar_get_as(variables, cursor, mc_variable_t);
+ if (strcmp(var_test->name.c_str(), var) < 0) {
start = cursor + 1;
- } else if (strcmp(var_test->name, var) > 0) {
+ } else if (strcmp(var_test->name.c_str(), var) > 0) {
end = cursor - 1;
} else {
if (address) { /* global variable */
}
}
- if (strcmp(var_test->name, var) == 0) {
+ if (strcmp(var_test->name.c_str(), var) == 0) {
if (address && var_test->address < address)
return cursor + 1;
else
return cursor;
- } else if (strcmp(var_test->name, var) < 0)
+ } else if (strcmp(var_test->name.c_str(), var) < 0)
return cursor + 1;
else
return cursor;
}
void MC_dwarf_register_global_variable(mc_object_info_t info,
- dw_variable_t variable)
+ mc_variable_t variable)
{
int index =
- MC_dwarf_get_variable_index(info->global_variables, variable->name,
- variable->address);
+ MC_dwarf_get_variable_index(info->global_variables,
+ variable->name.c_str(),
+ variable->address);
if (index != -1)
xbt_dynar_insert_at(info->global_variables, index, &variable);
// TODO, else ?
}
void MC_dwarf_register_non_global_variable(mc_object_info_t info,
- dw_frame_t frame,
- dw_variable_t variable)
+ mc_frame_t frame,
+ mc_variable_t variable)
{
xbt_assert(frame, "Frame is NULL");
int index =
- MC_dwarf_get_variable_index(frame->variables, variable->name, NULL);
+ MC_dwarf_get_variable_index(
+ frame->variables, variable->name.c_str(), NULL);
if (index != -1)
xbt_dynar_insert_at(frame->variables, index, &variable);
// TODO, else ?
}
-void MC_dwarf_register_variable(mc_object_info_t info, dw_frame_t frame,
- dw_variable_t variable)
+void MC_dwarf_register_variable(mc_object_info_t info, mc_frame_t frame,
+ mc_variable_t variable)
{
if (variable->global)
MC_dwarf_register_global_variable(info, variable);