- /* Wipeout the new line character */
- line[read - 1] = '\0';
-
- if(strlen(line) == 0){
- read = getline(&line, &n, fp);
- continue;
- }
-
- xbt_dynar_free(&split);
- xbt_str_rtrim(line, NULL);
- xbt_str_strip_spaces(line);
- split = xbt_str_split(line, " ");
-
- node_type = xbt_dynar_get_as(split, 1, char *);
-
- if(strncmp(node_type, "DW_AT_", 6) != 0)
- break;
-
- if(strcmp(node_type, "DW_AT_name") == 0){
-
- new_variable = 1;
- var = xbt_new0(s_dw_local_variable_t, 1);
- var->name = strdup(xbt_dynar_get_as(split, xbt_dynar_length(split) - 1, char *));
-
- xbt_dict_set(variables_origin, origin, var->name, NULL);
-
- }else if(strcmp(node_type, "DW_AT_abstract_origin:") == 0){
-
- new_variable = 0;
- abstract_origin = xbt_dynar_get_as(split, 2, char *);
- xbt_str_ltrim(abstract_origin, "<0x");
- xbt_str_rtrim(abstract_origin, ">");
-
- variable_name = (char *)xbt_dict_get_or_null(variables_origin, abstract_origin);
- variable_frame = get_frame_by_offset(*all_variables, strtoul(abstract_origin, NULL, 16));
- var = xbt_dict_get_or_null(variable_frame->variables, variable_name);
-
- }else if(strcmp(node_type, "DW_AT_location") == 0){
-
- if(valid_variable == 1 && var != NULL){
-
- var->location = xbt_new0(s_dw_location_t, 1);
-
- location_type = xbt_dynar_get_as(split, xbt_dynar_length(split) - 1, char *);
-
- if(strcmp(location_type, "list)") == 0){ /* Search location in location list */
-
- var->location = get_location(location_list, xbt_dynar_get_as(split, 3, char *));
-
- }else{
-
- xbt_str_strip_spaces(line);
- split2 = xbt_str_split(line, "(");
- xbt_dynar_remove_at(split2, 0, NULL);
- loc_expr = xbt_str_join(split2, " ");
- xbt_str_rtrim(loc_expr, ")");
- var->location = get_location(NULL, loc_expr);
- xbt_dynar_free(&split2);
-
- }
-
- }
-
- }else if(strcmp(node_type, "DW_AT_external") == 0){
-
- valid_variable = 0;
-
- }
-
- read = getline(&line, &n, fp);
-
- }
-
- if(new_variable == 1 && valid_variable == 1){
-
- variable_frame = xbt_dict_get_or_null(*all_variables, current_frame);
- xbt_dict_set(variable_frame->variables, var->name, var, NULL);
- }
-
- valid_variable = 1;
- new_variable = 0;
-
- }else if(strcmp(node_type, "(DW_TAG_inlined_subroutine)") == 0){
-
- strtok(xbt_dynar_get_as(split, 0, char *), "<");
- origin = strdup(strtok(NULL, "<"));
- xbt_str_rtrim(origin, ">:");
-
- read = getline(&line, &n, fp);
-
- while(read != -1){
-
- /* Wipeout the new line character */
- line[read - 1] = '\0';
-
- if(n == 0){
- read = getline(&line, &n, fp);
- continue;
- }
-
- if(strlen(line) == 0){
- read = getline(&line, &n, fp);
- continue;
- }
-
- xbt_dynar_free(&split);
- xbt_str_rtrim(line, NULL);
- xbt_str_strip_spaces(line);
- split = xbt_str_split(line, " ");
-
- if(strncmp(xbt_dynar_get_as(split, 1, char *), "DW_AT_", 6) != 0)
- break;
-
- node_type = xbt_dynar_get_as(split, 1, char *);
-
- if(strcmp(node_type, "DW_AT_abstract_origin:") == 0){
-
- origin = xbt_dynar_get_as(split, 2, char *);
- xbt_str_ltrim(origin, "<0x");
- xbt_str_rtrim(origin, ">");
-
- subprogram_name = (char *)xbt_dict_get_or_null(subprograms_origin, origin);
- subroutine_frame = xbt_dict_get_or_null(*all_variables, subprogram_name);
-
- }else if(strcmp(node_type, "DW_AT_low_pc") == 0){
-
- subroutine_frame->low_pc = (void *)strtoul(xbt_dynar_get_as(split, 3, char *), NULL, 16);
-
- }else if(strcmp(node_type, "DW_AT_high_pc") == 0){
-
- subroutine_frame->high_pc = (void *)strtoul(xbt_dynar_get_as(split, 3, char *), NULL, 16);
- }
-
- read = getline(&line, &n, fp);
-
- }
-
- }else{
-
- read = getline(&line, &n, fp);
-
- }
-
- }
-
- xbt_dynar_free(&split);
- free(line);
- free(command);
- pclose(fp);
-
-}
-
-static dw_location_t get_location(xbt_dict_t location_list, char *expr){
-
- dw_location_t loc = xbt_new0(s_dw_location_t, 1);
-
- if(location_list != NULL){
-
- char *key = bprintf("%d", (int)strtoul(expr, NULL, 16));
- loc->type = e_dw_loclist;
- loc->location.loclist = (xbt_dynar_t)xbt_dict_get_or_null(location_list, key);
- if(loc == NULL)
- XBT_INFO("Key not found in loclist");
- return loc;
-
- }else{
-
- int cursor = 0;
- char *tok = NULL, *tok2 = NULL;
-
- xbt_dynar_t tokens1 = xbt_str_split(expr, ";");
- xbt_dynar_t tokens2;
-
- loc->type = e_dw_compose;
- loc->location.compose = xbt_dynar_new(sizeof(dw_location_t), NULL);
-
- while(cursor < xbt_dynar_length(tokens1)){
-
- tok = xbt_dynar_get_as(tokens1, cursor, char*);
- tokens2 = xbt_str_split(tok, " ");
- tok2 = xbt_dynar_get_as(tokens2, 0, char*);
-
- if(strncmp(tok2, "DW_OP_reg", 9) == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_register;
- new_element->location.reg = atoi(strtok(tok2, "DW_OP_reg"));
- xbt_dynar_push(loc->location.compose, &new_element);
- }else if(strcmp(tok2, "DW_OP_fbreg:") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_fbregister_op;
- new_element->location.fbreg_op = atoi(xbt_dynar_get_as(tokens2, 1, char*));
- xbt_dynar_push(loc->location.compose, &new_element);
- }else if(strncmp(tok2, "DW_OP_breg", 10) == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_bregister_op;
- new_element->location.breg_op.reg = atoi(strtok(tok2, "DW_OP_breg"));
- new_element->location.breg_op.offset = atoi(xbt_dynar_get_as(tokens2, 1, char*));
- xbt_dynar_push(loc->location.compose, &new_element);
- }else if(strncmp(tok2, "DW_OP_lit", 9) == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_lit;
- new_element->location.lit = atoi(strtok(tok2, "DW_OP_lit"));
- xbt_dynar_push(loc->location.compose, &new_element);
- }else if(strcmp(tok2, "DW_OP_piece:") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_piece;
- new_element->location.piece = atoi(xbt_dynar_get_as(tokens2, 1, char*));
- /*if(strlen(xbt_dynar_get_as(tokens2, 1, char*)) > 1)
- new_element->location.piece = atoi(xbt_dynar_get_as(tokens2, 1, char*));
- else
- new_element->location.piece = xbt_dynar_get_as(tokens2, 1, char*)[0] - '0';*/
- xbt_dynar_push(loc->location.compose, &new_element);
- }else if(strcmp(tok2, "DW_OP_plus_uconst:") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_plus_uconst;
- new_element->location.plus_uconst = atoi(xbt_dynar_get_as(tokens2, 1, char *));
- xbt_dynar_push(loc->location.compose, &new_element);
- }else if(strcmp(tok, "DW_OP_abs") == 0 ||
- strcmp(tok, "DW_OP_and") == 0 ||
- strcmp(tok, "DW_OP_div") == 0 ||
- strcmp(tok, "DW_OP_minus") == 0 ||
- strcmp(tok, "DW_OP_mod") == 0 ||
- strcmp(tok, "DW_OP_mul") == 0 ||
- strcmp(tok, "DW_OP_neg") == 0 ||
- strcmp(tok, "DW_OP_not") == 0 ||
- strcmp(tok, "DW_OP_or") == 0 ||
- strcmp(tok, "DW_OP_plus") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_arithmetic;
- new_element->location.arithmetic = strdup(strtok(tok2, "DW_OP_"));
- xbt_dynar_push(loc->location.compose, &new_element);
- }else if(strcmp(tok, "DW_OP_stack_value") == 0){
- }else if(strcmp(tok2, "DW_OP_deref_size:") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_deref;
- new_element->location.deref_size = (unsigned int short) atoi(xbt_dynar_get_as(tokens2, 1, char*));
- /*if(strlen(xbt_dynar_get_as(tokens, ++cursor, char*)) > 1)
- new_element->location.deref_size = atoi(xbt_dynar_get_as(tokens, cursor, char*));
- else
- new_element->location.deref_size = xbt_dynar_get_as(tokens, cursor, char*)[0] - '0';*/
- xbt_dynar_push(loc->location.compose, &new_element);
- }else if(strcmp(tok, "DW_OP_deref") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_deref;
- new_element->location.deref_size = sizeof(void *);
- xbt_dynar_push(loc->location.compose, &new_element);
- }else if(strcmp(tok2, "DW_OP_constu:") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_uconstant;
- new_element->location.uconstant.bytes = 1;
- new_element->location.uconstant.value = (unsigned long int)(atoi(xbt_dynar_get_as(tokens2, 1, char*)));
- /*if(strlen(xbt_dynar_get_as(tokens, ++cursor, char*)) > 1)
- new_element->location.uconstant.value = (unsigned long int)(atoi(xbt_dynar_get_as(tokens, cursor, char*)));
- else
- new_element->location.uconstant.value = (unsigned long int)(xbt_dynar_get_as(tokens, cursor, char*)[0] - '0');*/
- xbt_dynar_push(loc->location.compose, &new_element);
- }else if(strcmp(tok2, "DW_OP_consts:") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_sconstant;
- new_element->location.sconstant.bytes = 1;
- new_element->location.sconstant.value = (long int)(atoi(xbt_dynar_get_as(tokens2, 1, char*)));
- xbt_dynar_push(loc->location.compose, &new_element);
- }else if(strcmp(tok2, "DW_OP_const1u:") == 0 ||
- strcmp(tok2, "DW_OP_const2u:") == 0 ||
- strcmp(tok2, "DW_OP_const4u:") == 0 ||
- strcmp(tok2, "DW_OP_const8u:") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_uconstant;
- new_element->location.uconstant.bytes = tok2[11] - '0';
- new_element->location.uconstant.value = (unsigned long int)(atoi(xbt_dynar_get_as(tokens2, 1, char*)));
- /*if(strlen(xbt_dynar_get_as(tokens, ++cursor, char*)) > 1)
- new_element->location.constant.value = atoi(xbt_dynar_get_as(tokens, cursor, char*));
- else
- new_element->location.constant.value = xbt_dynar_get_as(tokens, cursor, char*)[0] - '0';*/
- xbt_dynar_push(loc->location.compose, &new_element);
- }else if(strcmp(tok, "DW_OP_const1s") == 0 ||
- strcmp(tok, "DW_OP_const2s") == 0 ||
- strcmp(tok, "DW_OP_const4s") == 0 ||
- strcmp(tok, "DW_OP_const8s") == 0){
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_sconstant;
- new_element->location.sconstant.bytes = tok2[11] - '0';
- new_element->location.sconstant.value = (long int)(atoi(xbt_dynar_get_as(tokens2, 1, char*)));
- xbt_dynar_push(loc->location.compose, &new_element);
- }else{
- dw_location_t new_element = xbt_new0(s_dw_location_t, 1);
- new_element->type = e_dw_unsupported;
- xbt_dynar_push(loc->location.compose, &new_element);
- }
-
- cursor++;
- xbt_dynar_free(&tokens2);
-
- }
-
- xbt_dynar_free(&tokens1);
-
- return loc;
-
- }
-
-}
-
-
-void print_local_variables(xbt_dict_t list){
-
- dw_location_entry_t entry;
- dw_location_t location_entry;
- unsigned int cursor3 = 0, cursor4 = 0;
- xbt_dict_cursor_t cursor = 0, cursor2 = 0;
-
- char *frame_name, *variable_name;
- dw_frame_t current_frame;
- dw_local_variable_t current_variable;
-
- xbt_dict_foreach(list, cursor, frame_name, current_frame){
- fprintf(stderr, "Frame name : %s\n", current_frame->name);
- fprintf(stderr, "Location type : %d\n", current_frame->frame_base->type);
- xbt_dict_foreach((xbt_dict_t)current_frame->variables, cursor2, variable_name, current_variable){
- fprintf(stderr, "Name : %s\n", current_variable->name);
- if(current_variable->location == NULL)
- continue;
- fprintf(stderr, "Location type : %d\n", current_variable->location->type);
- switch(current_variable->location->type){
- case e_dw_loclist :
- xbt_dynar_foreach(current_variable->location->location.loclist, cursor3, entry){
- fprintf(stderr, "Lowpc : %lx, Highpc : %lx,", entry->lowpc, entry->highpc);
- switch(entry->location->type){
- case e_dw_register :
- fprintf(stderr, " Location : in register %d\n", entry->location->location.reg);
- break;
- case e_dw_bregister_op:
- fprintf(stderr, " Location : Add %d to the value in register %d\n", entry->location->location.breg_op.offset, entry->location->location.breg_op.reg);
- break;
- case e_dw_lit:
- fprintf(stderr, "Value already kwnown : %d\n", entry->location->location.lit);
- break;
- case e_dw_fbregister_op:
- fprintf(stderr, " Location : %d bytes from logical frame pointer\n", entry->location->location.fbreg_op);
- break;
- case e_dw_compose:
- fprintf(stderr, " Location :\n");
- xbt_dynar_foreach(entry->location->location.compose, cursor4, location_entry){
- switch(location_entry->type){
- case e_dw_register :
- fprintf(stderr, " %d) in register %d\n", cursor4 + 1, location_entry->location.reg);
- break;
- case e_dw_bregister_op:
- fprintf(stderr, " %d) add %d to the value in register %d\n", cursor4 + 1, location_entry->location.breg_op.offset, location_entry->location.breg_op.reg);
- break;
- case e_dw_lit:
- fprintf(stderr, "%d) Value already kwnown : %d\n", cursor4 + 1, location_entry->location.lit);
- break;
- case e_dw_fbregister_op:
- fprintf(stderr, " %d) %d bytes from logical frame pointer\n", cursor4 + 1, location_entry->location.fbreg_op);
- break;
- case e_dw_deref:
- fprintf(stderr, " %d) Pop the stack entry and treats it as an address (size of data %d)\n", cursor4 + 1, location_entry->location.deref_size);
- break;
- case e_dw_arithmetic :
- fprintf(stderr, "%d) arithmetic operation : %s\n", cursor4 + 1, location_entry->location.arithmetic);
- break;
- case e_dw_piece:
- fprintf(stderr, "%d) The %d byte(s) previous value\n", cursor4 + 1, location_entry->location.piece);
- break;
- case e_dw_uconstant :
- fprintf(stderr, "%d) Unsigned constant %lu\n", cursor4 + 1, location_entry->location.uconstant.value);
- break;
- case e_dw_sconstant :
- fprintf(stderr, "%d) Signed constant %lu\n", cursor4 + 1, location_entry->location.sconstant.value);
- break;
- default :
- fprintf(stderr, "%d) Location type not supported\n", cursor4 + 1);
- break;
- }
- }
- break;
- default:
- fprintf(stderr, "Location type not supported\n");
- break;
- }
- }
- break;
- case e_dw_compose:
- cursor4 = 0;
- fprintf(stderr, "Location :\n");
- xbt_dynar_foreach(current_variable->location->location.compose, cursor4, location_entry){
- switch(location_entry->type){
- case e_dw_register :
- fprintf(stderr, " %d) in register %d\n", cursor4 + 1, location_entry->location.reg);
- break;
- case e_dw_bregister_op:
- fprintf(stderr, " %d) add %d to the value in register %d\n", cursor4 + 1, location_entry->location.breg_op.offset, location_entry->location.breg_op.reg);
- break;
- case e_dw_lit:
- fprintf(stderr, "%d) Value already kwnown : %d\n", cursor4 + 1, location_entry->location.lit);
- break;
- case e_dw_fbregister_op:
- fprintf(stderr, " %d) %d bytes from logical frame pointer\n", cursor4 + 1, location_entry->location.fbreg_op);
- break;
- case e_dw_deref:
- fprintf(stderr, " %d) Pop the stack entry and treats it as an address (size of data %d)\n", cursor4 + 1, location_entry->location.deref_size);
- break;
- case e_dw_arithmetic :
- fprintf(stderr, "%d) arithmetic operation : %s\n", cursor4 + 1, location_entry->location.arithmetic);
- break;
- case e_dw_piece:
- fprintf(stderr, "%d) The %d byte(s) previous value\n", cursor4 + 1, location_entry->location.piece);
- break;
- case e_dw_uconstant :
- fprintf(stderr, "%d) Unsigned constant %lu\n", cursor4 + 1, location_entry->location.uconstant.value);
- break;
- case e_dw_sconstant :
- fprintf(stderr, "%d) Signed constant %lu\n", cursor4 + 1, location_entry->location.sconstant.value);
- break;
- default :
- fprintf(stderr, "%d) Location type not supported\n", cursor4 + 1);
- break;
- }
- }
- break;
- default :
- fprintf(stderr, "Location type not supported\n");
- break;
- }
- }
- }
-
-}
-
-static size_t data_bss_ignore_size(void *address){
- unsigned int cursor = 0;
- int start = 0;
- int end = xbt_dynar_length(mc_data_bss_comparison_ignore) - 1;
- mc_data_bss_ignore_variable_t var;
-
- while(start <= end){
- cursor = (start + end) / 2;
- var = (mc_data_bss_ignore_variable_t)xbt_dynar_get_as(mc_data_bss_comparison_ignore, cursor, mc_data_bss_ignore_variable_t);
- if(var->address == address)
- return var->size;
- if(var->address < address){
- if((void *)((char *)var->address + var->size) > address)
- return (char *)var->address + var->size - (char*)address;
- else
- start = cursor + 1;
- }
- if(var->address > address)
- end = cursor - 1;
- }
-
- return 0;
-}
-
-
-static void MC_get_global_variables(char *elf_file){
-
- FILE *fp;
-
- char *command = bprintf("objdump -t -j .data -j .bss %s", elf_file);
-
- fp = popen(command, "r");
-
- if(fp == NULL){
- perror("popen failed");
- xbt_abort();
- }
-
- if(mc_global_variables == NULL)
- mc_global_variables = xbt_dynar_new(sizeof(global_variable_t), global_variable_free_voidp);
-
- char *line = NULL;
- ssize_t read;
- size_t n = 0;
-
- xbt_dynar_t line_tokens = NULL;
- unsigned long offset;
-
- int type = strcmp(elf_file, xbt_binary_name); /* 0 = binary, other = libsimgrid */
-
- while ((read = getline(&line, &n, fp)) != -1){
-
- if(n == 0)
- continue;
-
- /* Wipeout the new line character */
- line[read - 1] = '\0';
-
- xbt_str_strip_spaces(line);
- xbt_str_ltrim(line, NULL);
-
- line_tokens = xbt_str_split(line, NULL);
-
- if(xbt_dynar_length(line_tokens) <= 4 || strcmp(xbt_dynar_get_as(line_tokens, 0, char *), "SYMBOL") == 0)
- continue;
-
- if((strncmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "__gcov", 6) == 0)
- || (strncmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "gcov", 4) == 0)
- || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), ".data") == 0)
- || (strcmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), ".bss") == 0)
- || (strncmp(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*), "stderr", 6) == 0)
- || ((size_t)strtoul(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 2, char*), NULL, 16) == 0))
- continue;
-
- global_variable_t var = xbt_new0(s_global_variable_t, 1);
-
- if(type == 0){
- var->address = (void *)strtoul(xbt_dynar_get_as(line_tokens, 0, char*), NULL, 16);
- }else{
- offset = strtoul(xbt_dynar_get_as(line_tokens, 0, char*), NULL, 16);
- var->address = (char *)start_text_libsimgrid+offset;
- }
-
- var->size = (size_t)strtoul(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 2, char*), NULL, 16);
- var->name = strdup(xbt_dynar_get_as(line_tokens, xbt_dynar_length(line_tokens) - 1, char*));
-
- if(data_bss_ignore_size(var->address) > 0)
- global_variable_free(var);
- else
- xbt_dynar_push(mc_global_variables, &var);
-
- xbt_dynar_free(&line_tokens);
-
- }
-
- free(command);
- free(line);
- pclose(fp);
-
-}
-
-void global_variable_free(global_variable_t v){
- xbt_free(v->name);
- xbt_free(v);
-}