From: Gabriel Corona Date: Mon, 24 Feb 2014 11:03:24 +0000 (+0100) Subject: [mc] Use dynar instead of dict for storing functions X-Git-Tag: v3_11~199^2~2^2~22^2~14 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/d2153a5d5e08ae057d587354db583072367f686e [mc] Use dynar instead of dict for storing functions Multiple instances of the same function with the same name can be found in a given program: * different local static functions; * same inline functions; * overloads (C++); * ... --- diff --git a/examples/msg/mc/bugged1_liveness_visited.tesh b/examples/msg/mc/bugged1_liveness_visited.tesh index 25377200eb..7f2c2ec680 100644 --- a/examples/msg/mc/bugged1_liveness_visited.tesh +++ b/examples/msg/mc/bugged1_liveness_visited.tesh @@ -35,6 +35,8 @@ $ ${bindir:=.}/bugged1_liveness ${bindir:=.}/../msg_platform.xml ${bindir:=.}/de > [ 0.000000] (1:coordinator@Tremblay) CS release. Grant to queued requests (queue size: 1) > [ 0.000000] (2:client@Boivin) Ask the request > [ 0.000000] (1:coordinator@Tremblay) CS idle. Grant immediatly +> [ 0.000000] (2:client@Boivin) 2 got the answer. Sleep a bit and release it +> [ 0.000000] (1:coordinator@Tremblay) CS release. Grant to queued requests (queue size: 1) > [ 0.000000] (1:coordinator@Tremblay) CS idle. Grant immediatly > [ 0.000000] (2:client@Boivin) 2 got the answer. Sleep a bit and release it > [ 0.000000] (1:coordinator@Tremblay) CS release. resource now idle @@ -46,6 +48,8 @@ $ ${bindir:=.}/bugged1_liveness ${bindir:=.}/../msg_platform.xml ${bindir:=.}/de > [ 0.000000] (2:client@Boivin) Ask the request > [ 0.000000] (1:coordinator@Tremblay) CS idle. Grant immediatly > [ 0.000000] (2:client@Boivin) 2 got the answer. Sleep a bit and release it +> [ 0.000000] (2:client@Boivin) Ask the request +> [ 0.000000] (1:coordinator@Tremblay) CS release. Grant to queued requests (queue size: 1) > [ 0.000000] (1:coordinator@Tremblay) CS idle. Grant immediatly > [ 0.000000] (2:client@Boivin) 2 got the answer. Sleep a bit and release it > [ 0.000000] (1:coordinator@Tremblay) CS release. resource now idle @@ -57,6 +61,8 @@ $ ${bindir:=.}/bugged1_liveness ${bindir:=.}/../msg_platform.xml ${bindir:=.}/de > [ 0.000000] (2:client@Boivin) Ask the request > [ 0.000000] (1:coordinator@Tremblay) CS idle. Grant immediatly > [ 0.000000] (2:client@Boivin) 2 got the answer. Sleep a bit and release it +> [ 0.000000] (2:client@Boivin) Ask the request +> [ 0.000000] (1:coordinator@Tremblay) CS release. Grant to queued requests (queue size: 1) > [ 0.000000] (1:coordinator@Tremblay) CS idle. Grant immediatly > [ 0.000000] (2:client@Boivin) 2 got the answer. Sleep a bit and release it > [ 0.000000] (1:coordinator@Tremblay) CS release. resource now idle @@ -68,12 +74,14 @@ $ ${bindir:=.}/bugged1_liveness ${bindir:=.}/../msg_platform.xml ${bindir:=.}/de > [ 0.000000] (2:client@Boivin) Ask the request > [ 0.000000] (1:coordinator@Tremblay) CS idle. Grant immediatly > [ 0.000000] (2:client@Boivin) 2 got the answer. Sleep a bit and release it -> [ 0.000000] (3:client@Fafard) Propositions changed : r=1, cs=0 -> [ 0.000000] (1:coordinator@Tremblay) CS release. Grant to queued requests (queue size: 1) > [ 0.000000] (2:client@Boivin) Ask the request +> [ 0.000000] (1:coordinator@Tremblay) CS release. Grant to queued requests (queue size: 1) +> [ 0.000000] (3:client@Fafard) Propositions changed : r=1, cs=0 > [ 0.000000] (1:coordinator@Tremblay) CS idle. Grant immediatly > [ 0.000000] (2:client@Boivin) 2 got the answer. Sleep a bit and release it -> [ 0.000000] (0:@) Pair 57 already reached (equal to pair 45) ! +> [ 0.000000] (1:coordinator@Tremblay) CS release. Grant to queued requests (queue size: 1) +> [ 0.000000] (2:client@Boivin) Ask the request +> [ 0.000000] (0:@) Pair 61 already reached (equal to pair 49) ! > [ 0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* > [ 0.000000] (0:@) | ACCEPTANCE CYCLE | > [ 0.000000] (0:@) *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-* @@ -111,15 +119,15 @@ $ ${bindir:=.}/bugged1_liveness ${bindir:=.}/../msg_platform.xml ${bindir:=.}/de > [ 0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (54) > [ 0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62) > [ 0.000000] (0:@) [(2)Boivin (client)] iRecv(dst=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (56) -> [ 0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62) > [ 0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62) -> [ 0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54) -> [ 0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62) -> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56) -> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62) > [ 0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56) +> [ 0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62) +> [ 0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54) > [ 0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62) +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62) > [ 0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54) +> [ 0.000000] (0:@) [(3)Fafard (client)] Wait(comm=(verbose only) [(3)Fafard (client)-> (1)Tremblay (coordinator)]) (62) +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56) > [ 0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62) > [ 0.000000] (0:@) [(1)Tremblay (coordinator)] iSend(src=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (54) > [ 0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62) @@ -128,7 +136,11 @@ $ ${bindir:=.}/bugged1_liveness ${bindir:=.}/../msg_platform.xml ${bindir:=.}/de > [ 0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56) > [ 0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(1)Tremblay (coordinator)-> (2)Boivin (client)]) (62) > [ 0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54) -> [ 0.000000] (0:@) Expanded pairs = 57 -> [ 0.000000] (0:@) Visited pairs = 208 -> [ 0.000000] (0:@) Executed transitions = 207 -> [ 0.000000] (0:@) Counter-example depth : 50 +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62) +> [ 0.000000] (0:@) [(1)Tremblay (coordinator)] iRecv(dst=(1)Tremblay (coordinator), buff=(verbose only), size=(verbose only)) (56) +> [ 0.000000] (0:@) [(2)Boivin (client)] Wait(comm=(verbose only) [(2)Boivin (client)-> (1)Tremblay (coordinator)]) (62) +> [ 0.000000] (0:@) [(2)Boivin (client)] iSend(src=(2)Boivin (client), buff=(verbose only), size=(verbose only)) (54) +> [ 0.000000] (0:@) Expanded pairs = 61 +> [ 0.000000] (0:@) Visited pairs = 224 +> [ 0.000000] (0:@) Executed transitions = 223 +> [ 0.000000] (0:@) Counter-example depth : 54 diff --git a/src/mc/mc_dwarf.c b/src/mc/mc_dwarf.c index f13cc5063d..5bfb6cd78c 100644 --- a/src/mc/mc_dwarf.c +++ b/src/mc/mc_dwarf.c @@ -928,7 +928,7 @@ static void MC_dwarf_handle_subprogram_die(mc_object_info_t info, Dwarf_Die* die MC_dwarf_handle_children(info, die, unit, frame); // Register it: - xbt_dict_set(info->local_variables, frame->name, frame, NULL); + xbt_dynar_push(info->subprograms, &frame); } static void MC_dwarf_handle_children(mc_object_info_t info, Dwarf_Die* die, Dwarf_Die* unit, dw_frame_t frame) { diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index a17bffc34a..987c6fc4fc 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -183,17 +183,16 @@ void dw_variable_free_voidp(void *t){ 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); @@ -227,9 +226,8 @@ static void MC_make_functions_index(mc_object_info_t 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; @@ -299,10 +297,9 @@ static void MC_post_process_variables(mc_object_info_t info) { } static void MC_post_process_functions(mc_object_info_t info) { - xbt_dict_cursor_t cursor = NULL; - char* key = NULL; + unsigned cursor = 0; dw_frame_t function = NULL; - xbt_dict_foreach(info->local_variables, cursor, key, function) { + xbt_dynar_foreach(info->subprograms, cursor, function) { unsigned cursor2 = 0; dw_variable_t variable = NULL; xbt_dynar_foreach(function->variables, cursor2, variable) { @@ -739,72 +736,50 @@ void MC_ignore_global_variable(const char *name){ 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; diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index ecf5bf12e6..f17fad5481 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -341,7 +341,7 @@ struct s_mc_object_info { char *start_exec, *end_exec; // Executable segment char *start_rw, *end_rw; // Read-write segment char *start_ro, *end_ro; // read-only segment - xbt_dict_t local_variables; // xbt_dict_t + xbt_dynar_t subprograms; // xbt_dynar_t xbt_dynar_t global_variables; // xbt_dynar_t xbt_dict_t types; // xbt_dict_t xbt_dict_t types_by_name; // xbt_dict_t (full defined type only)