Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[mc] Efficient lookup of subprogram by offset
authorGabriel Corona <gabriel.corona@loria.fr>
Thu, 20 Mar 2014 11:23:48 +0000 (12:23 +0100)
committerGabriel Corona <gabriel.corona@loria.fr>
Thu, 20 Mar 2014 11:47:45 +0000 (12:47 +0100)
info->subprograms is now a dict and not an array.

src/mc/mc_dwarf.c
src/mc/mc_global.c
src/mc/mc_private.h
testsuite/mc/dwarf.c

index 5b8700c..67eccc4 100644 (file)
@@ -728,7 +728,8 @@ static void MC_dwarf_handle_subprogram_die(mc_object_info_t info, Dwarf_Die* die
   frame->end = -1; // This one is now useless:
 
   // Register it:
   frame->end = -1; // This one is now useless:
 
   // Register it:
-  xbt_dynar_push(info->subprograms, &frame);
+  const char* key = bprintf("%" PRIx64, (uint64_t) frame->start);
+  xbt_dict_set(info->subprograms,  key, frame, NULL);
 
   // Handle children:
   MC_dwarf_handle_children(info, die, unit, frame, namespace);
 
   // Handle children:
   MC_dwarf_handle_children(info, die, unit, frame, namespace);
index 12208e4..6f36ffe 100644 (file)
@@ -155,6 +155,13 @@ const char* colors[13];
 
 /************************** Free functions *************************/
 
 
 /************************** Free functions *************************/
 
+void mc_frame_free(dw_frame_t frame){
+  xbt_free(frame->name);
+  mc_dwarf_location_list_clear(&(frame->frame_base));
+  xbt_dynar_free(&(frame->variables));
+  xbt_free(frame);
+}
+
 void dw_type_free(dw_type_t t){
   xbt_free(t->name);
   xbt_free(t->dw_type_id);
 void dw_type_free(dw_type_t t){
   xbt_free(t->name);
   xbt_free(t->dw_type_id);
@@ -184,9 +191,11 @@ void dw_variable_free_voidp(void *t){
 
 // ***** object_info
 
 
 // ***** object_info
 
+
+
 mc_object_info_t MC_new_object_info(void) {
   mc_object_info_t res = xbt_new0(s_mc_object_info_t, 1);
 mc_object_info_t MC_new_object_info(void) {
   mc_object_info_t res = xbt_new0(s_mc_object_info_t, 1);
-  res->subprograms = xbt_dynar_new(sizeof(dw_frame_t), NULL);
+  res->subprograms = xbt_dict_new_homogeneous((void (*)(void*))mc_frame_free);
   res->global_variables = xbt_dynar_new(sizeof(dw_variable_t), dw_variable_free_voidp);
   res->types = xbt_dict_new_homogeneous(NULL);
   res->full_types_by_name = xbt_dict_new_homogeneous(NULL);
   res->global_variables = xbt_dynar_new(sizeof(dw_variable_t), dw_variable_free_voidp);
   res->types = xbt_dict_new_homogeneous(NULL);
   res->full_types_by_name = xbt_dict_new_homogeneous(NULL);
@@ -195,7 +204,7 @@ mc_object_info_t MC_new_object_info(void) {
 
 void MC_free_object_info(mc_object_info_t* info) {
   xbt_free(&(*info)->file_name);
 
 void MC_free_object_info(mc_object_info_t* info) {
   xbt_free(&(*info)->file_name);
-  xbt_dynar_free(&(*info)->subprograms);
+  xbt_dict_free(&(*info)->subprograms);
   xbt_dynar_free(&(*info)->global_variables);
   xbt_dict_free(&(*info)->types);
   xbt_dict_free(&(*info)->full_types_by_name);
   xbt_dynar_free(&(*info)->global_variables);
   xbt_dict_free(&(*info)->types);
   xbt_dict_free(&(*info)->full_types_by_name);
@@ -229,8 +238,9 @@ static void MC_make_functions_index(mc_object_info_t info) {
 
   // Populate the array:
   dw_frame_t frame = NULL;
 
   // Populate the array:
   dw_frame_t frame = NULL;
-  unsigned cursor = 0;
-  xbt_dynar_foreach(info->subprograms, cursor, frame) {
+  xbt_dict_cursor_t cursor;
+  char* key;
+  xbt_dict_foreach(info->subprograms, cursor, key, frame) {
     if(frame->low_pc==NULL)
       continue;
     s_mc_function_index_item_t entry;
     if(frame->low_pc==NULL)
       continue;
     s_mc_function_index_item_t entry;
@@ -298,9 +308,10 @@ static void MC_post_process_variables(mc_object_info_t info) {
 }
 
 static void MC_post_process_functions(mc_object_info_t info) {
 }
 
 static void MC_post_process_functions(mc_object_info_t info) {
-  unsigned cursor = 0;
+  xbt_dict_cursor_t cursor;
+  char* key;
   dw_frame_t function = NULL;
   dw_frame_t function = NULL;
-  xbt_dynar_foreach(info->subprograms, cursor, function) {
+  xbt_dict_foreach(info->subprograms, cursor, key, function) {
     unsigned cursor2 = 0;
     dw_variable_t variable = NULL;
     xbt_dynar_foreach(function->variables, cursor2, variable) {
     unsigned cursor2 = 0;
     dw_variable_t variable = NULL;
     xbt_dynar_foreach(function->variables, cursor2, variable) {
@@ -601,13 +612,13 @@ void MC_ignore_global_variable(const char *name){
 }
 
 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 *frame_name, mc_object_info_t info) {
-  unsigned cursor2;
+  xbt_dict_cursor_t cursor2;
   dw_frame_t frame;
   int start, end;
   int cursor = 0;
   dw_variable_t current_var;
   dw_frame_t frame;
   int start, end;
   int cursor = 0;
   dw_variable_t current_var;
-
-  xbt_dynar_foreach(info->subprograms, cursor2, frame) {
+  char* key;
+  xbt_dict_foreach(info->subprograms, cursor2, key, frame) {
 
     if(frame_name && strcmp(frame_name, frame->name))
       continue;
 
     if(frame_name && strcmp(frame_name, frame->name))
       continue;
index 60a173e..168fa7a 100644 (file)
@@ -346,7 +346,7 @@ struct s_mc_object_info {
   char *start_exec, *end_exec; // Executable segment
   char *start_rw, *end_rw; // Read-write segment
   char *start_ro, *end_ro; // read-only segment
   char *start_exec, *end_exec; // Executable segment
   char *start_rw, *end_rw; // Read-write segment
   char *start_ro, *end_ro; // read-only segment
-  xbt_dynar_t subprograms; // xbt_dynar_t<dw_frame_t>
+  xbt_dict_t subprograms; // xbt_dict_t<origin as hexadecimal string, dw_frame_t>
   xbt_dynar_t global_variables; // xbt_dynar_t<dw_variable_t>
   xbt_dict_t types; // xbt_dict_t<origin as hexadecimal string, dw_type_t>
   xbt_dict_t full_types_by_name; // xbt_dict_t<name, dw_type_t> (full defined type only)
   xbt_dynar_t global_variables; // xbt_dynar_t<dw_variable_t>
   xbt_dict_t types; // xbt_dict_t<origin as hexadecimal string, dw_type_t>
   xbt_dict_t full_types_by_name; // xbt_dict_t<name, dw_type_t> (full defined type only)
@@ -457,6 +457,8 @@ struct s_mc_function_index_item {
   dw_frame_t function;
 };
 
   dw_frame_t function;
 };
 
+void mc_frame_free(dw_frame_t freme);
+
 void dw_type_free(dw_type_t t);
 void dw_variable_free(dw_variable_t v);
 void dw_variable_free_voidp(void *t);
 void dw_type_free(dw_type_t t);
 void dw_variable_free(dw_variable_t v);
 void dw_variable_free_voidp(void *t);
index b373c1f..fc85de4 100644 (file)
@@ -38,9 +38,10 @@ static dw_variable_t find_global_variable_by_name(mc_object_info_t info, const c
 }
 
 static dw_frame_t find_function_by_name(mc_object_info_t info, const char* name) {
 }
 
 static dw_frame_t find_function_by_name(mc_object_info_t info, const char* name) {
-  unsigned int cursor = 0;
+  xbt_dict_cursor_t cursor = 0;
   dw_frame_t subprogram;
   dw_frame_t subprogram;
-  xbt_dynar_foreach(info->subprograms, cursor, subprogram){
+  char* key;
+  xbt_dict_foreach(info->subprograms, cursor, key, subprogram){
     if(!strcmp(name, subprogram->name))
       return subprogram;
   }
     if(!strcmp(name, subprogram->name))
       return subprogram;
   }