#include "xbt/automaton.h"
#include "xbt/dict.h"
+static void MC_post_process_types(mc_object_info_t info);
+
XBT_LOG_NEW_CATEGORY(mc, "All MC categories");
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_global, mc,
"Logging specific to MC (global)");
return location_list;
}
+/** \brief Finds a frame (DW_TAG_subprogram) from an DWARF offset in the rangd of this subprogram
+ *
+ * The offset can be an offset of a child DW_TAG_variable.
+ */
static dw_frame_t MC_dwarf_get_frame_by_offset(xbt_dict_t all_variables, unsigned long int offset){
xbt_dict_cursor_t cursor = NULL;
}
-static void MC_dwarf_get_variables(mc_object_info_t info){
+/** \brief Fill DWARf debug infomations (types, frames, variables ...). */
+void MC_dwarf_get_variables(mc_object_info_t info) {
mc_object_info_t result = info;
const char *elf_file = info->file_name;
}else if(strcmp(node_type, "(DW_TAG_base_type)") == 0
|| strcmp(node_type, "(DW_TAG_enumeration_type)") == 0
- || strcmp(node_type, "(DW_TAG_enumerator)") == 0
|| strcmp(node_type, "(DW_TAG_typedef)") == 0
|| strcmp(node_type, "(DW_TAG_const_type)") == 0
|| strcmp(node_type, "(DW_TAG_subroutine_type)") == 0
type_type = e_dw_base_type;
else if(strcmp(node_type, "(DW_TAG_enumeration_type)") == 0)
type_type = e_dw_enumeration_type;
- else if(strcmp(node_type, "(DW_TAG_enumerator)") == 0)
- type_type = e_dw_enumerator;
else if(strcmp(node_type, "(DW_TAG_typedef)") == 0)
type_type = e_dw_typedef;
else if(strcmp(node_type, "(DW_TAG_const_type)") == 0)
type->id = (void *)strtoul(origin, NULL, 16);
if(type_origin)
type->dw_type_id = xbt_strdup(type_origin);
- if(type_type == e_dw_enumerator)
- type->size = enumeration_size;
- else
- type->size = size;
+
+ type->byte_size = size;
+ // Not relevant:
+ type->element_count = -1;
+
type->members = NULL;
xbt_dict_set(*types, origin, type, NULL);
if(member_end && type){
member_end = 0;
+ // Why are we not simply referencing, the DW_AT_type?
dw_type_t member_type = xbt_new0(s_dw_type_t, 1);
member_type->name = xbt_strdup(name);
- member_type->size = size;
+ member_type->byte_size = size;
+ member_type->element_count = -1;
member_type->is_pointer_type = is_pointer;
member_type->id = (void *)strtoul(origin, NULL, 16);
member_type->offset = offset;
else
type->type = e_dw_union_type;
type->name = xbt_strdup(name);
- type->size = size;
+ type->byte_size = size;
+ type->element_count = -1;
type->is_pointer_type = is_pointer;
type->id = (void *)strtoul(origin, NULL, 16);
if(type_origin)
dw_type_t type = NULL;
+ // Read DW_TAG_subrange_type children:
while(read != -1){
+ // Read attributes of the DW_TAG_subrange_type:
while(read != -1){
/* Wipeout the new line character */
}
if(subrange && type){
- type->size = size;
-
+ type->element_count = size;
+
xbt_free(name);
name = NULL;
xbt_free(end);
if(type_origin)
type->dw_type_id = xbt_strdup(type_origin);
type->members = NULL;
+
+ // Filled in a post processing step:
+ type-> byte_size = 0;
xbt_dict_set(*types, origin, type, NULL);
xbt_dict_free(&location_list);
pclose(fp);
+
+ MC_post_process_types(info);
}
+static void MC_post_process_types(mc_object_info_t info) {
+ xbt_dict_cursor_t cursor;
+ char *origin;
+ dw_type_t type;
+ xbt_dict_foreach(info->types, cursor, origin, type){
+ if(type->type==e_dw_array_type) {
+ xbt_assert(type->dw_type_id, "No base type for array %s %s", type->id, type->name);
+ dw_type_t subtype = xbt_dict_get_or_null(info->types, type->dw_type_id);
+ xbt_assert(subtype, "Unkown base type for array %s %s", type->id, type->name);
+ type->byte_size = type->element_count*subtype->byte_size;
+ }
+ }
+}
/******************************* Ignore mechanism *******************************/
/*********************************************************************************/
memory_map_t maps = MC_get_memory_map();
/* Get local variables for state equality detection */
-
- mc_binary_info = MC_find_object_address(maps, xbt_binary_name);
- MC_dwarf_get_variables(mc_binary_info);
-
- mc_libsimgrid_info = MC_find_object_address(maps, libsimgrid_path);
- MC_dwarf_get_variables(mc_libsimgrid_info);
+ mc_binary_info = MC_find_object_info(maps, xbt_binary_name);
+ mc_libsimgrid_info = MC_find_object_info(maps, libsimgrid_path);
MC_free_memory_map(maps);
-
XBT_INFO("Get debug information done !");
}
}else{
MC_SET_RAW_MEM;
MC_init_memory_map_info();
- MC_init();
+ MC_init_debug_info();
MC_UNSET_RAW_MEM;
}