Hack to fix naming issues.
[repair.git] / Repair / RepairCompiler / structextract / dumpstructures.c
index a7bfdf65cfda8b67ceab4f84708f81186201cb3b..d769ae42f1f704ef17be691368fd63fb7c057c25 100755 (executable)
@@ -38,7 +38,7 @@ char *arrayfile=NULL;
 int main(int argc, char **argv) {
   int i;
   if (argc<2)
-    return 0;
+    return 1;
   if (argc>=3)
     rootfile=argv[2];
   for(i=3;i<argc;i++) {
@@ -51,6 +51,7 @@ int main(int argc, char **argv) {
   }
   process_elf_binary_data(argv[1]);
   daikon_preprocess_entry_array();
+  return 0;
 }
 
 // Pre-processes global dwarf_entry_array in order to place
@@ -62,7 +63,7 @@ void daikon_preprocess_entry_array()
 }
 
 int typecount=0;
-int assigntype=0;
+int assigntype=1;
 int entry_is_type(dwarf_entry *entry) {
   if (entry->tag_name==DW_TAG_structure_type||
       entry->tag_name==DW_TAG_union_type) {
@@ -163,6 +164,35 @@ void initializeTypeArray()
     }
   }
 
+  /* Assign names */
+  for (i = 0; i < dwarf_entry_array_size; i++)
+    {
+      cur_entry = &dwarf_entry_array[i];
+      if (entry_is_type(cur_entry))
+        {
+         collection_type* collection_ptr = (collection_type*)(cur_entry->entry_ptr);
+         int j=0;
+         int offset=0;
+         int value=0;
+         
+         for(j=0;j<collection_ptr->num_members;j++) {
+           dwarf_entry *entry=collection_ptr->members[j];
+           if (entry->tag_name==DW_TAG_inheritance) {
+             value++;
+           } else {
+             member * member_ptr=(member *)entry->entry_ptr;
+             char *name=member_ptr->name;
+             dwarf_entry *type=member_ptr->type_ptr;
+             char *typestr=printname(type,GETTYPE);
+             char *poststr=printname(type,POSTNAME);
+
+             if (typestr!=NULL)
+               value++;
+           }
+         }
+        }
+    }
+
   for (i = 0; i < dwarf_entry_array_size; i++)
     {
       cur_entry = &dwarf_entry_array[i];
@@ -172,6 +202,7 @@ void initializeTypeArray()
          int j=0;
          int offset=0;
          int value=0;
+         
          for(j=0;j<collection_ptr->num_members;j++) {
            dwarf_entry *entry=collection_ptr->members[j];
            if (entry->tag_name==DW_TAG_inheritance) {
@@ -187,6 +218,7 @@ void initializeTypeArray()
                value++;
            }
          }
+
          if (collection_ptr->name!=NULL) {
            struct valuepair *vp=NULL;
            if (gencontains(ght,collection_ptr->name))
@@ -212,6 +244,7 @@ void initializeTypeArray()
        cur_entry = &dwarf_entry_array[i];
        if (entry_is_type(cur_entry)) {
          collection_type* collection_ptr = (collection_type*)(cur_entry->entry_ptr);
+
          int j=0;
          int offset=0;
          int value=0;
@@ -520,8 +553,18 @@ char * printname(dwarf_entry * type,int op) {
     {
       tdef * tdef_ptr=(tdef*)type->entry_ptr;
       if (op==GETTYPE||op==GETJUSTTYPE) {
-       char *typename=printname(tdef_ptr->target_ptr,op);
-       return typename;
+        if (tdef_ptr->target_ptr==NULL)
+          return tdef_ptr->name;
+        if (tdef_ptr->target_ptr->tag_name==DW_TAG_union_type||
+            tdef_ptr->target_ptr->tag_name==DW_TAG_structure_type) {
+          collection_type *ctype=(collection_type*)tdef_ptr->target_ptr->entry_ptr;
+          if (ctype->name!=NULL)
+            return ctype->name;
+          ctype->name=tdef_ptr->name;
+          return tdef_ptr->name;
+        }
+        char *typename=printname(tdef_ptr->target_ptr,op);
+        return typename;
       }
     }
     break;
@@ -572,14 +615,38 @@ char * printname(dwarf_entry * type,int op) {
   case DW_TAG_structure_type: {
     collection_type *ctype=(collection_type*)type->entry_ptr;
     if (op==GETTYPE&&ctype->name==NULL&&assigntype) {
-      ctype->name=(char*)malloc(100);
-      sprintf(ctype->name,"TYPE%ld",typecount++);
+      char *newb=(char *)malloc(1000);
+      int newchars=0;
+      int i;
+      ctype->name=newb;
+      newchars=sprintf(newb,"unnamed_",type->ID);
+      newb+=newchars;
+      for(i=0;i<ctype->num_members;i++) {
+        dwarf_entry * de=ctype->members[i];
+        if (de->tag_name==DW_TAG_member) {
+          member * me=(member *)de->entry_ptr;
+          newchars=sprintf(newb,"%s",me->name);
+          newb+=newchars;
+        }
+      }
     }
     if (op==GETTYPE)
       return ctype->name;
     if (op==GETJUSTTYPE&&ctype->name==NULL&&assigntype) {
-      ctype->name=(char*)malloc(100);
-      sprintf(ctype->name,"TYPE%ld",typecount++);
+      char *newb=(char *)malloc(1000);
+      int newchars=0;
+      int i;
+      ctype->name=newb;
+      newchars=sprintf(newb,"unnamed_",type->ID);
+      newb+=newchars;
+      for(i=0;i<ctype->num_members;i++) {
+        dwarf_entry * de=ctype->members[i];
+        if (de->tag_name==DW_TAG_member) {
+          member * me=(member *)de->entry_ptr;
+          newchars=sprintf(newb,"%s",me->name);
+          newb+=newchars;
+        }
+      }
     }
     if (op==GETJUSTTYPE)
       return ctype->name;