-void* MC_object_base_address(mc_object_info_t info) {
- 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;
- return result;
-}
-
-// ***** Functions index
-
-static int MC_compare_frame_index_items(mc_function_index_item_t a, mc_function_index_item_t b) {
- if(a->low_pc < b->low_pc)
- return -1;
- else if(a->low_pc == b->low_pc)
- return 0;
- else
- return 1;
-}
-
-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);
-
- // Populate the array:
- dw_frame_t frame = NULL;
- 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 = frame->low_pc;
- entry.high_pc = frame->high_pc;
- entry.function = frame;
- xbt_dynar_push(index, &entry);
- }
-
- 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) {
- mc_object_info_t infos[2] = { mc_binary_info, mc_libsimgrid_info };
- size_t n = 2;
- size_t i;
- for(i=0; i!=n; ++i) {
- if(ip >= (void*)infos[i]->start_exec && ip <= (void*)infos[i]->end_exec) {
- return 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) {
- 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();
- 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;
- }