* sim/ucsim/configure.in,
[fw/sdcc] / src / SDCCsymt.h
index c9e2adc3a268ecae6e81d5563cfd3101ae193fad..82acf79b6bab1546cf9fcf7e44a034597af80c15 100644 (file)
@@ -86,6 +86,7 @@ typedef struct structdef
     unsigned char level;       /* Nesting level         */
     struct symbol *fields;     /* pointer to fields     */
     unsigned size;             /* sizeof the table in bytes  */
+    int type;                  /* STRUCT or UNION */
   }
 structdef;
 
@@ -296,6 +297,7 @@ typedef struct symbol
     struct iCode *fuse;                /* furthest use */
     struct iCode *rematiCode;  /* rematerialse with which instruction */
     struct operand *reqv;      /* register equivalent of a local variable */
+    struct symbol *prereqv;    /* symbol before register equiv. substituion */
     union
       {
        struct symbol *spillLoc;        /* register spil location */
@@ -306,6 +308,7 @@ typedef struct symbol
     unsigned offset;           /* offset from top if struct */
 
     int lineDef;               /* defined line number        */
+    char *fileDef;             /* defined filename           */
     int lastLine;              /* for functions the last line */
     struct sym_link *type;     /* 1st link to declator chain */
     struct sym_link *etype;    /* last link to declarator chn */
@@ -454,6 +457,8 @@ extern sym_link *validateLink(sym_link      *l,
 #define IS_BITVAR(x) (IS_SPEC(x) && (x->select.s.noun == V_BITFIELD || \
                                      x->select.s.noun  == V_BIT ||   \
                                      x->select.s.noun == V_SBIT ))
+#define IS_BIT(x) (IS_SPEC(x) && (x->select.s.noun  == V_BIT ||   \
+                                  x->select.s.noun == V_SBIT ))
 #define IS_FLOAT(x)  (IS_SPEC(x) && x->select.s.noun == V_FLOAT)
 #define IS_ARITHMETIC(x) (IS_INTEGRAL(x) || IS_FLOAT(x))
 #define IS_AGGREGATE(x) (IS_ARRAY(x) || IS_STRUCT(x))
@@ -499,6 +504,18 @@ extern sym_link *floatType;
 
 #include "SDCCval.h"
 
+typedef enum
+{
+  RESULT_TYPE_NONE = 0,        /* operands will be promoted to int */
+  RESULT_CHECK = 0, /* TODO: replace all occurences with the appropriate type and remove me */
+  RESULT_TYPE_BIT,
+  RESULT_TYPE_CHAR,
+  RESULT_TYPE_INT,
+  RESULT_TYPE_OTHER,   /* operands will be promoted to int */
+  RESULT_TYPE_IFX,
+  RESULT_TYPE_NOPROM,  /* operands will be promoted to int */
+} RESULT_TYPE;
+
 /* forward definitions for the symbol table related functions */
 void initSymt ();
 symbol *newSymbol (char *, int);
@@ -538,10 +555,10 @@ int funcInChain (sym_link *);
 void addSymChain (symbol *);
 sym_link *structElemType (sym_link *, value *);
 symbol *getStructElement (structdef *, symbol *);
-sym_link *computeType (sym_link *, sym_link *);
+sym_link *computeType (sym_link *, sym_link *, RESULT_TYPE, char);
 void processFuncArgs (symbol *);
 int isSymbolEqual (symbol *, symbol *);
-int powof2 (unsigned long);
+int powof2 (TYPE_UDWORD);
 void printTypeChain (sym_link *, FILE *);
 void printTypeChainRaw (sym_link *, FILE *);
 void initCSupport ();
@@ -559,6 +576,8 @@ void changePointer (symbol * sym);
 void checkTypeSanity(sym_link *etype, char *name);
 sym_link *typeFromStr (char *) ;
 STORAGE_CLASS sclsFromPtr(sym_link *ptr);
+sym_link *newEnumType (symbol *);
+void  promoteAnonStructs (int, structdef *);
 
 
 extern char *nounName(sym_link *); /* noun strings */