mc_object_info_t MC_new_object_info(void) {
mc_object_info_t res = xbt_new0(s_mc_object_info_t, 1);
- res->local_variables = xbt_dict_new_homogeneous(NULL);
+ res->subprograms = xbt_dynar_new(sizeof(dw_frame_t), NULL);
res->global_variables = xbt_dynar_new(sizeof(dw_variable_t), dw_variable_free_voidp);
res->types = xbt_dict_new_homogeneous(NULL);
res->types_by_name = xbt_dict_new_homogeneous(NULL);
return res;
}
-
void MC_free_object_info(mc_object_info_t* info) {
xbt_free(&(*info)->file_name);
- xbt_dict_free(&(*info)->local_variables);
+ xbt_dynar_free(&(*info)->subprograms);
xbt_dynar_free(&(*info)->global_variables);
xbt_dict_free(&(*info)->types);
xbt_dict_free(&(*info)->types_by_name);
static void MC_make_functions_index(mc_object_info_t info) {
xbt_dynar_t index = xbt_dynar_new(sizeof(s_mc_function_index_item_t), NULL);
- // The base address of the function must be used to offset the addresses.
- // This should be fixed this in the frame_t structure instead.
- // Relocated addresses are offset for shared objets and constant for executables objects.
- // See DWARF4 spec 7.5
- void* offset = info->flags & MC_OBJECT_INFO_EXECUTABLE ? 0 : MC_object_base_address(info);
-
// Populate the array:
dw_frame_t frame = NULL;
- xbt_dict_cursor_t cursor = NULL;
- const char* name = NULL;
- xbt_dict_foreach(info->local_variables, cursor, name, frame) {
+ unsigned cursor = 0;
+ xbt_dynar_foreach(info->subprograms, cursor, frame) {
if(frame->low_pc==NULL)
continue;
s_mc_function_index_item_t entry;
- entry.low_pc = (char*) frame->low_pc + (unsigned long) offset;
- entry.high_pc = (char*) frame->high_pc + (unsigned long) offset;
+ entry.low_pc = frame->low_pc;
+ entry.high_pc = frame->high_pc;
entry.function = frame;
xbt_dynar_push(index, &entry);
}
return MC_find_function_by_ip_and_object(ip, info);
}
+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 = xbt_dict_get_or_null(info->types, variable->type_origin);
+ }
+ }
+}
+
+static void MC_post_process_functions(mc_object_info_t info) {
+ unsigned cursor = 0;
+ dw_frame_t function = NULL;
+ xbt_dynar_foreach(info->subprograms, cursor, function) {
+ unsigned cursor2 = 0;
+ dw_variable_t variable = NULL;
+ xbt_dynar_foreach(function->variables, cursor2, variable) {
+ if(variable->type_origin) {
+ variable->type = xbt_dict_get_or_null(info->types, variable->type_origin);
+ }
+ }
+ }
+}
+
/** \brief Finds informations about a given shared object/executable */
mc_object_info_t MC_find_object_info(memory_map_t maps, char* name, int executable) {
mc_object_info_t result = MC_new_object_info();
MC_find_object_address(maps, result);
MC_dwarf_get_variables(result);
MC_post_process_types(result);
+ MC_post_process_variables(result);
+ MC_post_process_functions(result);
MC_make_functions_index(result);
return result;
}
MC_UNSET_RAW_MEM;
}
+static void MC_ignore_local_variable_in_object(const char *var_name, const char *frame_name, mc_object_info_t info) {
+ unsigned cursor2;
+ dw_frame_t frame;
+ int start, end;
+ int cursor = 0;
+ dw_variable_t current_var;
+
+ xbt_dynar_foreach(info->subprograms, cursor2, frame) {
+
+ if(frame_name && strcmp(frame_name, frame->name))
+ continue;
+
+ start = 0;
+ end = xbt_dynar_length(frame->variables) - 1;
+ while(start <= end){
+ cursor = (start + end) / 2;
+ current_var = (dw_variable_t)xbt_dynar_get_as(frame->variables, cursor, dw_variable_t);
+
+ int compare = strcmp(current_var->name, var_name);
+ if(compare == 0){
+ xbt_dynar_remove_at(frame->variables, cursor, NULL);
+ start = 0;
+ end = xbt_dynar_length(frame->variables) - 1;
+ }else if(compare < 0){
+ start = cursor + 1;
+ }else{
+ end = cursor - 1;
+ }
+ }
+ }
+}
+
void MC_ignore_local_variable(const char *var_name, const char *frame_name){
int raw_mem_set = (mmalloc_get_current_heap() == raw_heap);
+ if(strcmp(frame_name, "*") == 0)
+ frame_name = NULL;
+
MC_SET_RAW_MEM;
- unsigned int cursor = 0;
- dw_variable_t current_var;
- int start, end;
- if(strcmp(frame_name, "*") == 0){ /* Remove variable in all frames */
- xbt_dict_cursor_t dict_cursor;
- char *current_frame_name;
- dw_frame_t frame;
- xbt_dict_foreach(mc_libsimgrid_info->local_variables, dict_cursor, current_frame_name, frame){
- start = 0;
- end = xbt_dynar_length(frame->variables) - 1;
- while(start <= end){
- cursor = (start + end) / 2;
- current_var = (dw_variable_t)xbt_dynar_get_as(frame->variables, cursor, dw_variable_t);
- if(strcmp(current_var->name, var_name) == 0){
- xbt_dynar_remove_at(frame->variables, cursor, NULL);
- start = 0;
- end = xbt_dynar_length(frame->variables) - 1;
- }else if(strcmp(current_var->name, var_name) < 0){
- start = cursor + 1;
- }else{
- end = cursor - 1;
- }
- }
- }
- xbt_dict_foreach(mc_binary_info->local_variables, dict_cursor, current_frame_name, frame){
- start = 0;
- end = xbt_dynar_length(frame->variables) - 1;
- while(start <= end){
- cursor = (start + end) / 2;
- current_var = (dw_variable_t)xbt_dynar_get_as(frame->variables, cursor, dw_variable_t);
- if(strcmp(current_var->name, var_name) == 0){
- xbt_dynar_remove_at(frame->variables, cursor, NULL);
- start = 0;
- end = xbt_dynar_length(frame->variables) - 1;
- }else if(strcmp(current_var->name, var_name) < 0){
- start = cursor + 1;
- }else{
- end = cursor - 1;
- }
- }
- }
- }else{
- xbt_dynar_t variables_list = ((dw_frame_t)xbt_dict_get_or_null(
- mc_libsimgrid_info->local_variables, frame_name))->variables;
- start = 0;
- end = xbt_dynar_length(variables_list) - 1;
- while(start <= end){
- cursor = (start + end) / 2;
- current_var = (dw_variable_t)xbt_dynar_get_as(variables_list, cursor, dw_variable_t);
- if(strcmp(current_var->name, var_name) == 0){
- xbt_dynar_remove_at(variables_list, cursor, NULL);
- start = 0;
- end = xbt_dynar_length(variables_list) - 1;
- }else if(strcmp(current_var->name, var_name) < 0){
- start = cursor + 1;
- }else{
- end = cursor - 1;
- }
- }
- }
+ MC_ignore_local_variable_in_object(var_name, frame_name, mc_libsimgrid_info);
+ if(frame_name!=NULL)
+ MC_ignore_local_variable_in_object(var_name, frame_name, mc_binary_info);
if(!raw_mem_set)
MC_UNSET_RAW_MEM;
/******************************* Initialisation of MC *******************************/
/*********************************************************************************/
-static void MC_init_debug_info();
-static void MC_init_debug_info() {
+static void MC_post_process_object_info(mc_object_info_t info) {
+ mc_object_info_t other_info = info == mc_binary_info ? mc_libsimgrid_info : mc_binary_info;
+ xbt_dict_cursor_t cursor = NULL;
+ char* key = NULL;
+ dw_type_t type = NULL;
+ xbt_dict_foreach(info->types, cursor, key, type){
+ if(type->name && type->byte_size == 0) {
+ type->other_object_same_type = xbt_dict_get_or_null(other_info->types_by_name, type->name);
+ }
+ }
+}
+
+static void MC_init_debug_info(void) {
XBT_INFO("Get debug information ...");
memory_map_t maps = MC_get_memory_map();
mc_binary_info = MC_find_object_info(maps, xbt_binary_name, 1);
mc_libsimgrid_info = MC_find_object_info(maps, libsimgrid_path, 0);
+ // Use information of the other objects:
+ MC_post_process_object_info(mc_binary_info);
+ MC_post_process_object_info(mc_libsimgrid_info);
+
MC_free_memory_map(maps);
XBT_INFO("Get debug information done !");
}
MC_ignore_local_variable("_throw_ctx", "*");
MC_ignore_local_variable("ctx", "*");
+ MC_ignore_local_variable("self", "simcall_BODY_mc_snapshot");
MC_ignore_local_variable("next_context", "smx_ctx_sysv_suspend_serial");
MC_ignore_local_variable("i", "smx_ctx_sysv_suspend_serial");
/* Ignore local variable about time used for tracing */
MC_ignore_local_variable("start_time", "*");
+ MC_ignore_global_variable("compared_pointers");
MC_ignore_global_variable("mc_comp_times");
MC_ignore_global_variable("mc_snapshot_comparison_time");
MC_ignore_global_variable("mc_time");