X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/6e4d65e37ba39356051d1725b98c0cf4547f7c6a..f9e6853d2c5b7b867211700bc12f0ee57f640b30:/src/mc/mc_global.c diff --git a/src/mc/mc_global.c b/src/mc/mc_global.c index efe1ef5245..0457aa97c7 100644 --- a/src/mc/mc_global.c +++ b/src/mc/mc_global.c @@ -213,6 +213,8 @@ void MC_free_object_info(mc_object_info_t* info) { // ***** Helpers void* MC_object_base_address(mc_object_info_t info) { + if(info->flags & MC_OBJECT_INFO_EXECUTABLE) + return 0; void* result = info->start_exec; if(info->start_rw!=NULL && result > (void*) info->start_rw) result = info->start_rw; if(info->start_ro!=NULL && result > (void*) info->start_ro) result = info->start_ro; @@ -306,6 +308,17 @@ static void MC_post_process_variables(mc_object_info_t info) { static void mc_post_process_scope(mc_object_info_t info, dw_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 = 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); + + } + // Direct: unsigned cursor = 0; dw_variable_t variable = NULL; @@ -585,42 +598,69 @@ void MC_ignore_global_variable(const char *name){ MC_UNSET_RAW_MEM; } -static void mc_ignore_local_variable_in_scope(const char *var_name, dw_frame_t scope) { +/** \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, + dw_frame_t subprogram, dw_frame_t scope) { // Processing of direct variables: - int start = 0; - int end = xbt_dynar_length(scope->variables) - 1; - while(start <= end){ - int cursor = (start + end) / 2; - dw_variable_t current_var = (dw_variable_t)xbt_dynar_get_as(scope->variables, cursor, dw_variable_t); - - int compare = strcmp(current_var->name, var_name); - if(compare == 0){ - xbt_dynar_remove_at(scope->variables, cursor, NULL); - start = 0; - end = xbt_dynar_length(scope->variables) - 1; - }else if(compare < 0){ - start = cursor + 1; - }else{ - end = cursor - 1; + + // If the current subprogram matche the given name: + if(subprogram_name==NULL || strcmp(subprogram_name, subprogram->name)==0) { + + // Try to find the variable and remove it: + int start = 0; + int end = xbt_dynar_length(scope->variables) - 1; + + // Dichotomic search: + while(start <= end){ + int cursor = (start + end) / 2; + dw_variable_t current_var = (dw_variable_t)xbt_dynar_get_as(scope->variables, cursor, dw_variable_t); + + int compare = strcmp(current_var->name, var_name); + if(compare == 0){ + // Variable found, remove it: + xbt_dynar_remove_at(scope->variables, cursor, NULL); + + // and start again: + start = 0; + end = xbt_dynar_length(scope->variables) - 1; + }else if(compare < 0){ + start = cursor + 1; + }else{ + end = cursor - 1; + } } + } // And recursive processing in nested scopes: unsigned cursor = 0; dw_frame_t nested_scope = NULL; xbt_dynar_foreach(scope->scopes, cursor, nested_scope) { - mc_ignore_local_variable_in_scope(var_name, nested_scope); + // The new scope may be an inlined subroutine, in this case we want to use its + // namespaced name in recursive calls: + dw_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); } } -static void MC_ignore_local_variable_in_object(const char *var_name, const char *frame_name, mc_object_info_t info) { +static void MC_ignore_local_variable_in_object(const char *var_name, const char *subprogram_name, mc_object_info_t info) { xbt_dict_cursor_t cursor2; dw_frame_t frame; char* key; xbt_dict_foreach(info->subprograms, cursor2, key, frame) { - if(frame_name && strcmp(frame_name, frame->name)) - continue; - mc_ignore_local_variable_in_scope(var_name, frame); + mc_ignore_local_variable_in_scope(var_name, subprogram_name, frame, frame); } }