Added bug 469671
[fw/sdcc] / src / SDCCsymt.h
index 5414d11994731f8552be268f8fe96bde6d81fdee..47bf56b58af963b294539bb7139e50155cdcf31a 100644 (file)
@@ -25,7 +25,8 @@
 #define  SDCCSYMT_H
 
 #define MAX_NEST_LEVEL  256
-#define SDCC_NAME_MAX    64
+#define SDCC_SYMNAME_MAX 64
+#define SDCC_NAME_MAX  3*SDCC_SYMNAME_MAX // big enough for _<func>_<var>_etc
 #include "SDCChasht.h"
 
 
@@ -73,7 +74,6 @@ typedef enum
     S_FIXED = 0,
     S_AUTO,
     S_REGISTER,
-    S_CONSTANT,
     S_SFR,
     S_SBIT,
     S_CODE,
@@ -183,7 +183,7 @@ sym_link;
 
 typedef struct symbol
   {
-    char name[SDCC_NAME_MAX + 1];      /* Input Variable Name     */
+    char name[SDCC_SYMNAME_MAX + 1];   /* Input Variable Name     */
     char rname[SDCC_NAME_MAX + 1];     /* internal name           */
 
     short level;               /* declration lev,fld offset */
@@ -228,6 +228,7 @@ typedef struct symbol
     unsigned ruonly:1;         /* used in return statement only */
     unsigned spildir:1;                /* spilt in direct space */
     unsigned ptrreg:1;         /* this symbol assigned to a ptr reg */
+    unsigned noSpilLoc:1;      /* cannot be assigned a spil location */
     unsigned accuse;           /* can be left in the accumulator
                                   On the Z80 accuse is devided into
                                   ACCUSE_A and ACCUSE_HL as the idea
@@ -279,9 +280,7 @@ symbol;
 #define DCL_TSPEC(l) l->select.d.tspec
 #define SPEC_NOUN(x) x->select.s.noun
 #define SPEC_LONG(x) x->select.s._long
-//#define SPEC_SHORT(x) x->select.s._short // only for type checking
 #define SPEC_USIGN(x) x->select.s._unsigned
-//#define SPEC_SIGNED(x) x->select.s._signed // only for type checking
 #define SPEC_SCLS(x) x->select.s.sclass
 #define SPEC_ENUM(x) x->select.s._isenum
 #define SPEC_OCLS(x) x->select.s.oclass
@@ -331,10 +330,10 @@ symbol;
                                      DCL_TYPE(x) == UPOINTER  ))
 #define IS_PTR_CONST(x) (IS_PTR(x) && DCL_PTR_CONST(x))
 #define IS_FARPTR(x) (IS_DECL(x) && DCL_TYPE(x) == FPOINTER)
+#define IS_CODEPTR(x) (IS_DECL(x) && DCL_TYPE(x) == CPOINTER)
 #define IS_GENPTR(x) (IS_DECL(x) && DCL_TYPE(x) == GPOINTER)
 #define IS_FUNC(x)   (IS_DECL(x) && DCL_TYPE(x) == FUNCTION)
 #define IS_LONG(x)   (IS_SPEC(x) && x->select.s._long)
-//#define IS_SHORT(x)   (IS_SPEC(x) && x->select.s._short)
 #define IS_TYPEDEF(x)(IS_SPEC(x) && x->select.s._typedef)
 #define IS_CONSTANT(x)  (IS_SPEC(x) && ( x->select.s._const == 1))
 #define IS_STRUCT(x) (IS_SPEC(x) && x->select.s.noun == V_STRUCT)
@@ -387,6 +386,8 @@ extern symbol *__muldiv[3][3][2];
 extern sym_link *__multypes[3][2];
 /* Dims: to/from float, BYTE/WORD/DWORD, SIGNED/USIGNED */
 extern symbol *__conv[2][3][2];
+/* Dims: shift left/shift right, BYTE/WORD/DWORD, SIGNED/UNSIGNED */
+extern symbol *__rlrr[2][3][2];
 
 #define CHARTYPE       __multypes[0][0]
 #define UCHARTYPE      __multypes[0][1]
@@ -407,7 +408,7 @@ sym_link *newLink ();
 sym_link *newFloatLink ();
 structdef *newStruct (char *);
 void addDecl (symbol *, int, sym_link *);
-sym_link *mergeSpec (sym_link *, sym_link *);
+sym_link *mergeSpec (sym_link *, sym_link *, char *name);
 sym_link *cloneSpec (sym_link *);
 symbol *reverseSyms (symbol *);
 sym_link *reverseLink (sym_link *);
@@ -420,7 +421,7 @@ sym_link *getSpec (sym_link *);
 char *genSymName (int);
 int compStructSize (int, structdef *);
 sym_link *copyLinkChain (sym_link *);
-int checkDecl (symbol *);
+int checkDecl (symbol *, int);
 void checkBasic (sym_link *, sym_link *);
 value *checkPointerIval (sym_link *, value *);
 value *checkStructIval (symbol *, value *);
@@ -431,7 +432,7 @@ unsigned int bitsForType (sym_link *);
 sym_link *newIntLink ();
 sym_link *newCharLink ();
 sym_link *newLongLink ();
-int checkType (sym_link *, sym_link *);
+int compareType (sym_link *, sym_link *);
 int checkFunction (symbol *);
 void cleanUpLevel (bucket **, int);
 void cleanUpBlock (bucket **, int);
@@ -451,7 +452,7 @@ void cdbSymbol (symbol *, FILE *, int, int);
 void cdbStructBlock (int, FILE *);
 void initHashT ();
 bucket *newBucket ();
-void addSym (bucket **, void *, char *, int, int);
+void addSym (bucket **, void *, char *, int, int, int checkType);
 void deleteSym (bucket **, void *, char *);
 void *findSym (bucket **, void *, const char *);
 void *findSymWithLevel (bucket **, struct symbol *);