X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/1ee68a7d44ca89e57734578a1aa91c11ddb27de1..1d2b3b745feba3c5069fe4fdab54a1832fde11e6:/src/mc/mcer_ignore.cpp diff --git a/src/mc/mcer_ignore.cpp b/src/mc/mcer_ignore.cpp index d813e7364b..4c752035be 100644 --- a/src/mc/mcer_ignore.cpp +++ b/src/mc/mcer_ignore.cpp @@ -18,8 +18,21 @@ extern "C" { XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mcer_ignore, mc, "Logging specific to MC ignore mechanism"); +// ***** Ignore heap chunks + extern xbt_dynar_t mc_heap_comparison_ignore; +void heap_ignore_region_free(mc_heap_ignore_region_t r) +{ + xbt_free(r); +} + +void heap_ignore_region_free_voidp(void *r) +{ + heap_ignore_region_free((mc_heap_ignore_region_t) * (void **) r); +} + + void MC_heap_region_ignore_insert(mc_heap_ignore_region_t region) { if (mc_heap_comparison_ignore == NULL) { @@ -94,4 +107,133 @@ void MC_heap_region_ignore_remove(void *address, size_t size) } } +// ***** Ignore global variables + +void MCer_ignore_global_variable(const char *name) +{ + mc_process_t process = &mc_model_checker->process(); + xbt_assert(!process->object_infos.empty(), "MC subsystem not initialized"); + + for (std::shared_ptr const& info : process->object_infos) { + + // Binary search: + int start = 0; + int end = info->global_variables.size() - 1; + while (start <= end) { + unsigned int cursor = (start + end) / 2; + mc_variable_t current_var = &info->global_variables[cursor]; + int cmp = strcmp(current_var->name.c_str(), name); + if (cmp == 0) { + info->global_variables.erase( + info->global_variables.begin() + cursor); + start = 0; + end = info->global_variables.size() - 1; + } else if (cmp < 0) { + start = cursor + 1; + } else { + end = cursor - 1; + } + } + } +} + +// ***** Ignore local variables + +static void mc_ignore_local_variable_in_scope(const char *var_name, + const char *subprogram_name, + mc_frame_t subprogram, + mc_frame_t scope); +static void MC_ignore_local_variable_in_object(const char *var_name, + const char *subprogram_name, + mc_object_info_t info); + +void MC_ignore_local_variable(const char *var_name, const char *frame_name) +{ + mc_process_t process = &mc_model_checker->process(); + if (strcmp(frame_name, "*") == 0) + frame_name = NULL; + + for (std::shared_ptr const& info : process->object_infos) + MC_ignore_local_variable_in_object(var_name, frame_name, info.get()); +} + +static void MC_ignore_local_variable_in_object(const char *var_name, + const char *subprogram_name, + mc_object_info_t info) +{ + for (auto& entry : info->subprograms) + mc_ignore_local_variable_in_scope( + var_name, subprogram_name, &entry.second, &entry.second); +} + +/** \brief Ignore a local variable in a scope + * + * Ignore all instances of variables with a given name in + * any (possibly inlined) subprogram with a given namespaced + * name. + * + * \param var_name Name of the local variable (or parameter to ignore) + * \param subprogram_name Name of the subprogram fo ignore (NULL for any) + * \param subprogram (possibly inlined) Subprogram of the scope + * \param scope Current scope + */ +static void mc_ignore_local_variable_in_scope(const char *var_name, + const char *subprogram_name, + mc_frame_t subprogram, + mc_frame_t scope) +{ + // Processing of direct variables: + + // If the current subprogram matches the given name: + if (subprogram_name == nullptr || + (!subprogram->name.empty() + && subprogram->name == subprogram_name)) { + + // Try to find the variable and remove it: + int start = 0; + int end = scope->variables.size() - 1; + + // Dichotomic search: + while (start <= end) { + int cursor = (start + end) / 2; + mc_variable_t current_var = &scope->variables[cursor]; + + int compare = strcmp(current_var->name.c_str(), var_name); + if (compare == 0) { + // Variable found, remove it: + scope->variables.erase(scope->variables.begin() + cursor); + + // and start again: + start = 0; + end = scope->variables.size() - 1; + } else if (compare < 0) { + start = cursor + 1; + } else { + end = cursor - 1; + } + } + + } + // And recursive processing in nested scopes: + for (simgrid::mc::Frame& nested_scope : scope->scopes) { + // The new scope may be an inlined subroutine, in this case we want to use its + // namespaced name in recursive calls: + mc_frame_t nested_subprogram = + nested_scope.tag == + DW_TAG_inlined_subroutine ? &nested_scope : subprogram; + + mc_ignore_local_variable_in_scope(var_name, subprogram_name, + nested_subprogram, &nested_scope); + } +} + +extern xbt_dynar_t stacks_areas; + +void MC_stack_area_add(stack_region_t stack_area) +{ + if (stacks_areas == NULL) + stacks_areas = xbt_dynar_new(sizeof(stack_region_t), NULL); + xbt_dynar_push(stacks_areas, &stack_area); +} + }