Changes:
authorbdemsky <bdemsky>
Wed, 14 Jul 2004 19:37:57 +0000 (19:37 +0000)
committerbdemsky <bdemsky>
Wed, 14 Jul 2004 19:37:57 +0000 (19:37 +0000)
1) structextract escapes '.' in fieldnames...(internal pointers were causing problems)

2) compiler no longer requires types of pointers to be declared...

Repair/RepairCompiler/MCC/Compiler.java
Repair/RepairCompiler/MCC/IR/DotExpr.java
Repair/RepairCompiler/MCC/IR/SemanticChecker.java
Repair/RepairCompiler/structextract/common.c
Repair/RepairCompiler/structextract/common.h
Repair/RepairCompiler/structextract/dumpstructures.c

index 5e184b42e043eb4b7e4546c66532a0db3435608f..59609e99e993f1b2114856e033665520864c3dc5 100755 (executable)
@@ -196,8 +196,8 @@ public class Compiler {
             System.err.println("Unable to open file: " + state.infile + ".struct");
             System.exit(-1);
        } catch (Exception e) {
-           //      System.out.println(e);
-           //      e.printStackTrace();
+           System.out.println(e);
+           e.printStackTrace();
            return false;
        }
 
@@ -214,8 +214,8 @@ public class Compiler {
             System.err.println("Unable to open file: " + state.infile + ".model");
             System.exit(-1);
        } catch (Exception e) {
-           //      System.out.println(e);
-           //      e.printStackTrace();
+           System.out.println(e);
+           e.printStackTrace();
            return false;
        }
 
@@ -250,8 +250,8 @@ public class Compiler {
             System.err.println("Unable to open file: " + state.infile + ".constraints");
             System.exit(-1);
        } catch (Exception e) {
-           //      System.out.println(e);
-           //      e.printStackTrace();
+           System.out.println(e);
+           e.printStackTrace();
            return false;
        }
 
index f116cbfd4d235a22963a1906982f1e2de71c4c96..9fba88fa3c3f4f7bcb5afd431b35eb063625c896 100755 (executable)
@@ -372,6 +372,8 @@ public class DotExpr extends Expr {
                intindex=index;
            }
            this.fd=fd;
+           if (fieldtype instanceof MissingTypeDescriptor)
+               throw new Error(fieldtype.getSymbol()+" type undefined!");
        }
 
         if ((lefttype == null) || (index != null && indextype == null)) {
index 4dacc0b5ce2a48622e82004a93de45d912ef8d18..66e5744647644a30f1148455c3c0e5f13c38206e 100755 (executable)
@@ -921,13 +921,17 @@ public class SemanticChecker {
                         if (newtype == null) {
                             // type never defined
                             // #TBD#: replace new ParseNode with original parsenode
-                            er.report(null, "Undefined type '" + fieldtype.getSymbol() + "'");
-                            ok = false;
+                           
+                           if (!field.getPtr()) { 
+                               /* Pointer types don't have to be defined */
+                               er.report(null, "Undefined type '" + fieldtype.getSymbol() + "'");
+                               ok = false;
+                           }
                         } else {
                             assert newtype != null;
                             field.setType(newtype);
                         }
-                    }                        
+                    }
                 }
 
                 Iterator labels = type.getLabels();
index a047e8b4cf02683e81cdad85af1a5e83cce9e463..e685108c0d835c87deb1259056bbdaf4fb242ee4 100755 (executable)
@@ -17,6 +17,22 @@ char * copystr(const char *buf) {
     }
 }
 
+char * escapestr(const char *buf) {
+  int i,j;
+  if (buf==NULL)
+    return NULL;
+  for(i=0;;i++)
+    if (buf[i]==0) {
+      char *ptr=(char*)malloc(i+1);
+      for(j=0;j<=i;j++) {
+       ptr[j]=buf[j];
+       if (ptr[j]=='.')
+         ptr[j]='_';
+      }
+      return ptr;
+    }
+}
+
 
 unsigned int hashstring(char *strptr) {
   unsigned int hashcode=0;
index e9b20349029841745503c3863cfeb6a66231748a..26b56006550a4707a3fce85af5bece8cbaa01685 100755 (executable)
@@ -2,6 +2,7 @@
 #define COMMON_H
 
 char * copystr(const char *buf);
+char * escapestr(const char *buf);
 unsigned int hashstring(char *strptr);
 int equivalentstrings(char *str1, char *str2);
 #endif
index 3907c13dd8ec0bae569b6d2bd2ddb1e454b41f2d..67d4adadaf92e1373b238a35241b583afa0ddf4a 100755 (executable)
 #include "typedata.h"
 #include "elf/dwarf2.h"
 
-
 #define GETTYPE 1
 #define POSTNAME 2
 #define GETJUSTTYPE 3
 
+int FOLLOW_PTRS=0;
+
 int process_elf_binary_data(char* filename);
 
 char *rootfile=NULL;
@@ -226,7 +227,7 @@ void initializeTypeArray()
            dwarf_entry *typeptr=in_ptr->target_ptr;
            collection_type* sub_ptr = (collection_type*)(typeptr->entry_ptr);
            if (j==0)
-             printf("subclasses ");
+             printf("subclass of ");
            else
              printf(", ");
            printf("%s ",sub_ptr->name);
@@ -253,13 +254,15 @@ void initializeTypeArray()
              dwarf_entry *type=member_ptr->type_ptr;
              char *typestr=printname(type,GETTYPE);
              char *poststr=printname(type,POSTNAME);
+             char *newname=NULL;
              if (member_ptr->data_member_location>offset) {
                printf("   reserved byte[%ld];\n",member_ptr->data_member_location-offset);
                offset=member_ptr->data_member_location;
              }
              offset+=getsize(type);
-             
-             printf("   %s %s%s;\n",typestr,name,poststr);
+             newname=escapestr(name);
+             printf("   %s %s%s;\n",typestr,newname,poststr);
+             free(newname);
            }
          }
          if (offset<collection_ptr->byte_size)
@@ -298,6 +301,7 @@ int printtype(collection_type *collection_ptr,struct genhashtable *ght)
     } else {
       member * member_ptr=(member *)entry->entry_ptr;
       char *name=member_ptr->name;
+      char *newname=NULL;
       dwarf_entry *type=member_ptr->type_ptr;
       char *typestr=printname(type,GETTYPE);
       char *poststr=printname(type,POSTNAME);
@@ -307,14 +311,14 @@ int printtype(collection_type *collection_ptr,struct genhashtable *ght)
       }
       offset+=getsize(type);
       
-      printf("   %s %s%s;\n",typestr,name,poststr);
+      newname=escapestr(name);
+      printf("   %s %s%s;\n",typestr,newname,poststr);
+      free(newname);
     }
   }
   return offset;
 }
 
-
-
 int getsize(dwarf_entry *type) {
   if (type==NULL)
     return 0;
@@ -444,6 +448,9 @@ char * printname(dwarf_entry * type,int op) {
        return newptr;
       }
     } else if (op==GETJUSTTYPE) {
+      if (!FOLLOW_PTRS)
+       return NULL;
+
       if (modifier_ptr->target_ptr==NULL)
        return NULL;
       {