- mc_function_index_item_t base = (mc_function_index_item_t) xbt_dynar_get_ptr(index, 0);
-
- // Sort the array by low_pc:
- qsort(base,
- xbt_dynar_length(index),
- sizeof(s_mc_function_index_item_t),
- (int (*)(const void *, const void *))MC_compare_frame_index_items);
-
- info->functions_index = index;
-}
-
-mc_object_info_t MC_ip_find_object_info(void* ip) {
- size_t i;
- for(i=0; i!=mc_object_infos_size; ++i) {
- if(ip >= (void*)mc_object_infos[i]->start_exec && ip <= (void*)mc_object_infos[i]->end_exec) {
- return mc_object_infos[i];
- }
- }
- return NULL;
-}
-
-static dw_frame_t MC_find_function_by_ip_and_object(void* ip, mc_object_info_t info) {
- xbt_dynar_t dynar = info->functions_index;
- mc_function_index_item_t base = (mc_function_index_item_t) xbt_dynar_get_ptr(dynar, 0);
- int i = 0;
- int j = xbt_dynar_length(dynar) - 1;
- while(j>=i) {
- int k = i + ((j-i)/2);
- if(ip < base[k].low_pc) {
- j = k-1;
- } else if(ip > base[k].high_pc) {
- i = k+1;
- } else {
- return base[k].function;
- }
- }
- return NULL;
-}
-
-dw_frame_t MC_find_function_by_ip(void* ip) {
- mc_object_info_t info = MC_ip_find_object_info(ip);
- if(info==NULL)
- return NULL;
- else
- 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) {
- xbt_dict_cursor_t cursor;
- char* key;
- dw_frame_t function = NULL;
- xbt_dict_foreach(info->subprograms, cursor, key, 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();
- if(executable)
- result->flags |= MC_OBJECT_INFO_EXECUTABLE;
- result->file_name = xbt_strdup(name);
- 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;
-}
-
-/*************************************************************************/
-
-/** \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;
- char *name;
- dw_frame_t res;
-
- xbt_dict_foreach(all_variables, cursor, name, res) {
- if(offset >= res->start && offset < res->end){
- xbt_dict_cursor_free(&cursor);
- return res;
- }
- }
-
- xbt_dict_cursor_free(&cursor);
- return NULL;
-
-}
-
-static dw_variable_t MC_dwarf_get_variable_by_name(dw_frame_t frame, char *var){
-
- unsigned int cursor = 0;
- dw_variable_t current_var;
-
- xbt_dynar_foreach(frame->variables, cursor, current_var){
- if(strcmp(var, current_var->name) == 0)
- return current_var;
- }
-
- return NULL;
-}
-
-static int MC_dwarf_get_variable_index(xbt_dynar_t variables, char* var, void *address){
-
- if(xbt_dynar_is_empty(variables))
- return 0;
-
- unsigned int cursor = 0;
- int start = 0;
- int end = xbt_dynar_length(variables) - 1;
- dw_variable_t var_test = NULL;
-
- while(start <= end){
- cursor = (start + end) / 2;
- var_test = (dw_variable_t)xbt_dynar_get_as(variables, cursor, dw_variable_t);
- if(strcmp(var_test->name, var) < 0){
- start = cursor + 1;
- }else if(strcmp(var_test->name, var) > 0){
- end = cursor - 1;
- }else{
- if(address){ /* global variable */
- if(var_test->address == address)
- return -1;
- if(var_test->address > address)
- end = cursor - 1;
- else
- start = cursor + 1;
- }else{ /* local variable */
- return -1;
- }
- }
- }
-
- if(strcmp(var_test->name, var) == 0){
- if(address && var_test->address < address)
- return cursor+1;
- else
- return cursor;
- }else if(strcmp(var_test->name, var) < 0)
- return cursor+1;
- else
- return cursor;
-
-}
-
-void MC_dwarf_register_global_variable(mc_object_info_t info, dw_variable_t variable) {
- int index = MC_dwarf_get_variable_index(info->global_variables, variable->name, variable->address);
- if (index != -1)
- xbt_dynar_insert_at(info->global_variables, index, &variable);
- // TODO, else ?
-}
-
-void MC_dwarf_register_non_global_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable) {
- xbt_assert(frame, "Frame is NULL");
- int index = MC_dwarf_get_variable_index(frame->variables, variable->name, NULL);
- if (index != -1)
- xbt_dynar_insert_at(frame->variables, index, &variable);
- // TODO, else ?
-}
-
-void MC_dwarf_register_variable(mc_object_info_t info, dw_frame_t frame, dw_variable_t variable) {
- if(variable->global)
- MC_dwarf_register_global_variable(info, variable);
- else if(frame==NULL)
- xbt_die("No frame for this local variable");
- else
- MC_dwarf_register_non_global_variable(info, frame, variable);
-}
-
-
-/******************************* Ignore mechanism *******************************/