catch DECLARATOR / SPECIFIER abuse
authorjohanknol <johanknol@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 14 Mar 2003 10:40:18 +0000 (10:40 +0000)
committerjohanknol <johanknol@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Fri, 14 Mar 2003 10:40:18 +0000 (10:40 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2388 4a8a32a2-be11-0410-ad9d-d568d2c75423

src/SDCC.y
src/SDCCast.c
src/SDCCglue.c
src/SDCCicode.c
src/SDCCsymt.c
src/SDCCsymt.h
src/SDCCval.c
src/ds390/ralloc.c
src/mcs51/ralloc.c

index 16839f811f7fe07169248a7be0689d95ab75a545..c8515cd0a60587787e5ddc51fa9d6a61190006b5 100644 (file)
@@ -177,39 +177,31 @@ function_attribute
 
 function_attributes
    :  USING CONSTANT {
-                        $$ = newLink() ;
-                        $$->class = SPECIFIER   ;
+                        $$ = newLink(SPECIFIER) ;
                        FUNC_REGBANK($$) = (int) floatFromVal($2);
                      }
-   |  REENTRANT      {  $$ = newLink ();
-                        $$->class = SPECIFIER   ;
+   |  REENTRANT      {  $$ = newLink (SPECIFIER);
                        FUNC_ISREENT($$)=1;
                      }
-   |  CRITICAL       {  $$ = newLink ();
-                        $$->class = SPECIFIER   ;
+   |  CRITICAL       {  $$ = newLink (SPECIFIER);
                        FUNC_ISCRITICAL($$) = 1;
                      }
-   |  NAKED          {  $$ = newLink ();
-                        $$->class = SPECIFIER   ;
+   |  NAKED          {  $$ = newLink (SPECIFIER);
                        FUNC_ISNAKED($$)=1;
                      }
-   |  JAVANATIVE     {  $$ = newLink ();
-                        $$->class = SPECIFIER   ;
+   |  JAVANATIVE     {  $$ = newLink (SPECIFIER);
                        FUNC_ISJAVANATIVE($$)=1;
                      }
-   |  OVERLAY        {  $$ = newLink ();
-                        $$->class = SPECIFIER   ;
+   |  OVERLAY        {  $$ = newLink (SPECIFIER);
                        FUNC_ISOVERLAY($$)=1;
                      }
-   |  NONBANKED      {$$ = newLink ();
-                        $$->class = SPECIFIER   ;
+   |  NONBANKED      {$$ = newLink (SPECIFIER);
                         FUNC_NONBANKED($$) = 1;
                        if (FUNC_BANKED($$)) {
                            werror(W_BANKED_WITH_NONBANKED);
                        }
                      }
-   |  BANKED         {$$ = newLink ();
-                        $$->class = SPECIFIER   ;
+   |  BANKED         {$$ = newLink (SPECIFIER);
                         FUNC_BANKED($$) = 1;
                        if (FUNC_NONBANKED($$)) {
                            werror(W_BANKED_WITH_NONBANKED);
@@ -220,8 +212,7 @@ function_attributes
                      }
    |  Interrupt_storage
                      {
-                        $$ = newLink () ;
-                        $$->class = SPECIFIER ;
+                        $$ = newLink (SPECIFIER) ;
                         FUNC_INTNO($$) = $1 ;
                         FUNC_ISISR($$) = 1;
                      }
@@ -528,28 +519,23 @@ init_declarator
 
 storage_class_specifier
    : TYPEDEF   {
-                  $$ = newLink () ;
-                  $$->class = SPECIFIER ;
+                  $$ = newLink (SPECIFIER) ;
                   SPEC_TYPEDEF($$) = 1 ;
                }
    | EXTERN    {
-                  $$ = newLink();
-                  $$->class = SPECIFIER ;
+                  $$ = newLink(SPECIFIER);
                   SPEC_EXTR($$) = 1 ;
                }
    | STATIC    {
-                  $$ = newLink ();
-                  $$->class = SPECIFIER ;
+                  $$ = newLink (SPECIFIER);
                   SPEC_STAT($$) = 1 ;
                }
    | AUTO      {
-                  $$ = newLink () ;
-                  $$->class = SPECIFIER ;
+                  $$ = newLink (SPECIFIER) ;
                   SPEC_SCLS($$) = S_AUTO  ;
                }
    | REGISTER  {
-                  $$ = newLink ();
-                  $$->class = SPECIFIER ;
+                  $$ = newLink (SPECIFIER);
                   SPEC_SCLS($$) = S_REGISTER ;
                }
    ;
@@ -571,88 +557,71 @@ type_specifier
 
 type_specifier2
    : CHAR   {
-               $$=newLink();
-               $$->class = SPECIFIER   ;
+               $$=newLink(SPECIFIER);
                SPEC_NOUN($$) = V_CHAR  ;
             }
    | SHORT  {
-               $$=newLink();
-               $$->class = SPECIFIER   ;
+               $$=newLink(SPECIFIER);
               $$->select.s._short = 1 ;
             }
    | INT    {
-               $$=newLink();
-               $$->class = SPECIFIER   ;
+               $$=newLink(SPECIFIER);
                SPEC_NOUN($$) = V_INT   ;
             }
    | LONG   {
-               $$=newLink();
-               $$->class = SPECIFIER   ;
+               $$=newLink(SPECIFIER);
               SPEC_LONG($$) = 1       ;
             }
    | SIGNED {
-               $$=newLink();
-               $$->class = SPECIFIER   ;
+               $$=newLink(SPECIFIER);
                $$->select.s._signed = 1;
             }
    | UNSIGNED  {
-               $$=newLink();
-               $$->class = SPECIFIER   ;
+               $$=newLink(SPECIFIER);
                SPEC_USIGN($$) = 1      ;
             }
    | VOID   {
-               $$=newLink();
-               $$->class = SPECIFIER   ;
+               $$=newLink(SPECIFIER);
                SPEC_NOUN($$) = V_VOID  ;
             }
    | CONST  {
-               $$=newLink();
-              $$->class = SPECIFIER ;
+               $$=newLink(SPECIFIER);
               SPEC_CONST($$) = 1;
             }
    | VOLATILE  {
-               $$=newLink();
-              $$->class = SPECIFIER ;
+               $$=newLink(SPECIFIER);
               SPEC_VOLATILE($$) = 1 ;
             }
    | FLOAT  {
-               $$=newLink();
+               $$=newLink(SPECIFIER);
               SPEC_NOUN($$) = V_FLOAT;
-              $$->class = SPECIFIER ;
             }
    | XDATA     {
-                  $$ = newLink ();
-                  $$->class = SPECIFIER ;
+                  $$ = newLink (SPECIFIER);
                   SPEC_SCLS($$) = S_XDATA  ;
                }
    | CODE      {
-                  $$ = newLink () ;
-                  $$->class = SPECIFIER  ;
+                  $$ = newLink (SPECIFIER) ;
                   SPEC_SCLS($$) = S_CODE ;                 
                }
    | EEPROM      {
-                  $$ = newLink () ;
-                  $$->class = SPECIFIER  ;
+                  $$ = newLink (SPECIFIER) ;
                   SPEC_SCLS($$) = S_EEPROM ;
                }
    | DATA      {
-                  $$ = newLink ();
-                  $$->class = SPECIFIER ;
+                  $$ = newLink (SPECIFIER);
                   SPEC_SCLS($$) = S_DATA   ;
                }
    | IDATA     {
-                  $$ = newLink ();
-                  $$->class = SPECIFIER ;
+                  $$ = newLink (SPECIFIER);
                   SPEC_SCLS($$) = S_IDATA  ;
                }
    | PDATA     { 
-                  $$ = newLink ();
-                  $$->class = SPECIFIER ;
+                  $$ = newLink (SPECIFIER);
                   SPEC_SCLS($$) = S_PDATA  ;
                }
    | BIT    {
-               $$=newLink();
-               $$->class = SPECIFIER   ;
+               $$=newLink(SPECIFIER);
                SPEC_NOUN($$) = V_BIT   ;
               SPEC_SCLS($$) = S_BIT   ;
               SPEC_BLEN($$) = 1;
@@ -677,14 +646,12 @@ type_specifier2
 
 sfr_reg_bit
    :  SBIT  {
-               $$ = newLink() ;
-               $$->class = SPECIFIER ;
+               $$ = newLink(SPECIFIER) ;
                SPEC_NOUN($$) = V_SBIT;
                SPEC_SCLS($$) = S_SBIT;
             }
    |  SFR   {
-               $$ = newLink() ;
-               $$->class = SPECIFIER ;
+               $$ = newLink(SPECIFIER) ;
                SPEC_NOUN($$) = V_CHAR;
                SPEC_SCLS($$) = S_SFR ;
               SPEC_USIGN($$) = 1 ;
@@ -702,15 +669,13 @@ struct_or_union_specifier
            sdef->size  = compStructSize($1,sdef);   /* update size of  */
 
            /* Create the specifier */
-           $$ = newLink () ;
-           $$->class = SPECIFIER   ;
+           $$ = newLink (SPECIFIER) ;
            SPEC_NOUN($$) = V_STRUCT;
            SPEC_STRUCT($$)= sdef ;
         }
    | struct_or_union stag
          {
-            $$ = newLink() ;
-            $$->class = SPECIFIER   ;
+            $$ = newLink(SPECIFIER) ;
             SPEC_NOUN($$) = V_STRUCT;
             SPEC_STRUCT($$) = $2 ;
          }
@@ -827,8 +792,7 @@ enum_specifier
                                                 if ((csym = findSym(enumTab,$2,$2->name)))
                                                    $$ = copyLinkChain(csym->type);
                                                 else  {
-                                                   $$ = newLink() ;
-                                                   $$->class = SPECIFIER   ;
+                                                   $$ = newLink(SPECIFIER) ;
                                                    SPEC_NOUN($$) = V_INT   ;
                                                 }
 
@@ -919,7 +883,7 @@ declarator2
          {
             sym_link   *p;
 
-            p = newLink ();
+            p = newLink (DECLARATOR);
             DCL_TYPE(p) = ARRAY ;
             DCL_ELEM(p) = 0     ;
             addDecl($1,0,p);
@@ -934,7 +898,7 @@ declarator2
             if ( SPEC_SCLS(p) != S_LITERAL)
                werror(E_CONST_EXPECTED) ;
             else {
-               p = newLink ();
+               p = newLink (DECLARATOR);
                DCL_TYPE(p) = ARRAY ;
                DCL_ELEM(p) = (int) floatFromVal(tval) ;
                addDecl($1,0,p);
@@ -1029,7 +993,7 @@ pointer
 unqualified_pointer
    :  '*'   
       {
-       $$ = newLink();
+       $$ = newLink(DECLARATOR);
        DCL_TYPE($$)=UPOINTER;
       }
    ;
@@ -1123,18 +1087,18 @@ abstract_declarator
 abstract_declarator2
    : '(' abstract_declarator ')'    { $$ = $2 ; }
    | '[' ']'                        {             
-                                       $$ = newLink ();
+                                       $$ = newLink (DECLARATOR);
                                        DCL_TYPE($$) = ARRAY ;
                                        DCL_ELEM($$) = 0     ;
                                     }
    | '[' constant_expr ']'          { 
                                        value *val ;
-                                       $$ = newLink ();
+                                       $$ = newLink (DECLARATOR);
                                        DCL_TYPE($$) = ARRAY ;
                                        DCL_ELEM($$) = (int) floatFromVal(val = constExprValue($2,TRUE));
                                     }
    | abstract_declarator2 '[' ']'   {
-                                       $$ = newLink ();
+                                       $$ = newLink (DECLARATOR);
                                        DCL_TYPE($$) = ARRAY ;
                                        DCL_ELEM($$) = 0     ;
                                        $$->next = $1 ;
@@ -1142,7 +1106,7 @@ abstract_declarator2
    | abstract_declarator2 '[' constant_expr ']'
                                     {
                                        value *val ;
-                                       $$ = newLink ();
+                                       $$ = newLink (DECLARATOR);
                                        DCL_TYPE($$) = ARRAY ;
                                        DCL_ELEM($$) = (int) floatFromVal(val = constExprValue($3,TRUE));
                                        $$->next = $1 ;
@@ -1151,11 +1115,11 @@ abstract_declarator2
    | '(' parameter_type_list ')'    { $$ = NULL;}   
    | abstract_declarator2 '(' ')' {
      // $1 must be a pointer to a function
-     sym_link *p=newLink();
+     sym_link *p=newLink(DECLARATOR);
      DCL_TYPE(p) = FUNCTION;
      if (!$1) {
        // ((void (code *) ()) 0) ()
-       $1=newLink();
+       $1=newLink(DECLARATOR);
        DCL_TYPE($1)=CPOINTER;
        $$ = $1;
      }
@@ -1167,11 +1131,11 @@ abstract_declarator2
        werror(E_TOO_FEW_PARMS);
      } else {
        // $1 must be a pointer to a function
-       sym_link *p=newLink();
+       sym_link *p=newLink(DECLARATOR);
        DCL_TYPE(p) = FUNCTION;
        if (!$1) {
         // ((void (code *) (void)) 0) ()
-        $1=newLink();
+        $1=newLink(DECLARATOR);
         DCL_TYPE($1)=CPOINTER;
         $$ = $1;
        }
index 093a90435dbc5b5ec61c79d1989326f0ffa7c3ec..35d8cc821da279764a34f5514304bc86cef38edb 100644 (file)
@@ -448,7 +448,7 @@ resolveSymbols (ast * tree)
          /* mark it as returning an int     */
          if (tree->funcName)
            {
-             tree->opval.val->sym->type = newLink ();
+             tree->opval.val->sym->type = newLink (DECLARATOR);
              DCL_TYPE (tree->opval.val->sym->type) = FUNCTION;
              tree->opval.val->sym->type->next =
                tree->opval.val->sym->etype = newIntLink ();
@@ -501,7 +501,7 @@ funcOfType (char *name, sym_link * type, sym_link * argType,
   sym = newSymbol (name, 0);
 
   /* setup return value */
-  sym->type = newLink ();
+  sym->type = newLink (DECLARATOR);
   DCL_TYPE (sym->type) = FUNCTION;
   sym->type->next = copyLinkChain (type);
   sym->etype = getSpec (sym->type);
@@ -545,7 +545,7 @@ funcOfTypeVarg (char *name, char * rtype, int nArgs , char **atypes)
     sym = newSymbol (name, 0);
     
     /* setup return value */
-    sym->type = newLink ();
+    sym->type = newLink (DECLARATOR);
     DCL_TYPE (sym->type) = FUNCTION;
     sym->type->next = typeFromStr(rtype);
     sym->etype = getSpec (sym->type);
@@ -2205,8 +2205,7 @@ decorateType (ast * tree)
       /*----------------------------*/
       /*  address of                */
       /*----------------------------*/
-      p = newLink ();
-      p->class = DECLARATOR;
+      p = newLink (DECLARATOR);
       /* if bit field then error */
       if (IS_BITVAR (tree->left->etype))
        {
@@ -2783,7 +2782,7 @@ decorateType (ast * tree)
                         ((int)floatFromVal(valFromType(RETYPE(tree)))) !=0 ) /* special case of NULL */  {
                      sym_link *rest = LTYPE(tree)->next;
                      werror(W_LITERAL_GENERIC);                      
-                     TTYPE(tree) = newLink();
+                     TTYPE(tree) = newLink(DECLARATOR);
                      DCL_TYPE(TTYPE(tree)) = FPOINTER;
                      TTYPE(tree)->next = rest;
                      tree->left->opval.lnk = TTYPE(tree);
index e72964cd4dcf5e01550ad3984f49ed002dc81e93..22af1da0f784aa77e84af58fff25718008f98005 100644 (file)
@@ -405,7 +405,7 @@ initPointer (initList * ilist, sym_link *toType)
                /* address of symbol */
                if (IS_AST_SYM_VALUE (expr->left)) {
                        val = copyValue (AST_VALUE (expr->left));
-                       val->type = newLink ();
+                       val->type = newLink (DECLARATOR);
                        if (SPEC_SCLS (expr->left->etype) == S_CODE) {
                                DCL_TYPE (val->type) = CPOINTER;
                        }
@@ -463,7 +463,7 @@ initPointer (initList * ilist, sym_link *toType)
            IS_ARRAY(expr->right->ftype)) {
 
                val = copyValue (AST_VALUE (expr->right));
-               val->type = newLink ();
+               val->type = newLink (DECLARATOR);
                if (SPEC_SCLS (expr->right->etype) == S_CODE) {
                        DCL_TYPE (val->type) = CPOINTER;
                }
@@ -808,8 +808,11 @@ printIvalArray (symbol * sym, sym_link * type, initList * ilist,
 
   iloop = ilist->init.deep;
   lcnt = DCL_ELEM (type);
-  for (last_type = type->next; last_type && DCL_ELEM (last_type); last_type = last_type->next)
+  for (last_type = type->next; 
+       last_type && IS_DECL(last_type) && DCL_ELEM (last_type); 
+       last_type = last_type->next) {
     lcnt *= DCL_ELEM (last_type);
+  }
 
   for (;;)
     {
index 32f913aec7f0a10e33a7ac3013399320ebd9f20a..49d1aaa414046272d4052e3751999912683df3c8 100644 (file)
@@ -2118,7 +2118,7 @@ aggrToPtr (sym_link * type, bool force)
     return type;
 
   etype = getSpec (type);
-  ptype = newLink ();
+  ptype = newLink (DECLARATOR);
 
   ptype->next = type;
 
@@ -2451,8 +2451,7 @@ geniCodeAddressOf (operand * op)
 /*  return op; */
 /*     } */
 
-  p = newLink ();
-  p->class = DECLARATOR;
+  p = newLink (DECLARATOR);
 
 #ifdef JWK
   /* set the pointer depending on the storage class */
index 7e5e40a5cc6bdd0b54ea67c63912e419249fe01a..a2c11a2aeb0635bd50685bab88e101ae311714a7 100644 (file)
@@ -298,11 +298,12 @@ newSymbol (char *name, int scope)
 /* newLink - creates a new link (declarator,specifier)              */
 /*------------------------------------------------------------------*/
 sym_link *
-newLink ()
+newLink (SYM_LINK_CLASS select)
 {
   sym_link *p;
 
   p = Safe_alloc ( sizeof (sym_link));
+  p->class=select;
 
   return p;
 }
@@ -419,7 +420,7 @@ addDecl (symbol * sym, int type, sym_link * p)
     }
   else
     {
-      head = tail = newLink ();
+      head = tail = newLink (DECLARATOR);
       DCL_TYPE (head) = type;
     }
 
@@ -468,8 +469,7 @@ addDecl (symbol * sym, int type, sym_link * p)
 
       if (!IS_SPEC (sym->etype))
        {
-         sym->etype = sym->etype->next = newLink ();
-         sym->etype->class = SPECIFIER;
+         sym->etype = sym->etype->next = newLink (SPECIFIER);
        }
       
       DCL_PTR_CONST (sym->type) = SPEC_CONST (DCL_TSPEC (p));
@@ -682,8 +682,7 @@ newCharLink ()
 {
   sym_link *p;
 
-  p = newLink ();
-  p->class = SPECIFIER;
+  p = newLink (SPECIFIER);
   SPEC_NOUN (p) = V_CHAR;
 
   return p;
@@ -697,8 +696,7 @@ newFloatLink ()
 {
   sym_link *p;
 
-  p = newLink ();
-  p->class = SPECIFIER;
+  p = newLink (SPECIFIER);
   SPEC_NOUN (p) = V_FLOAT;
 
   return p;
@@ -712,8 +710,7 @@ newLongLink ()
 {
   sym_link *p;
 
-  p = newLink ();
-  p->class = SPECIFIER;
+  p = newLink (SPECIFIER);
   SPEC_NOUN (p) = V_INT;
   SPEC_LONG (p) = 1;
 
@@ -728,8 +725,7 @@ newIntLink ()
 {
   sym_link *p;
 
-  p = newLink ();
-  p->class = SPECIFIER;
+  p = newLink (SPECIFIER);
   SPEC_NOUN (p) = V_INT;
 
   return p;
@@ -1330,11 +1326,11 @@ copyLinkChain (sym_link * p)
   sym_link *head, *curr, *loop;
 
   curr = p;
-  head = loop = (curr ? newLink () : (void *) NULL);
+  head = loop = (curr ? newLink (p->class) : (void *) NULL);
   while (curr)
     {
       memcpy (loop, curr, sizeof (sym_link));  /* copy it */
-      loop->next = (curr->next ? newLink () : (void *) NULL);
+      loop->next = (curr->next ? newLink (curr->next->class) : (void *) NULL);
       loop = loop->next;
       curr = curr->next;
     }
@@ -1572,7 +1568,7 @@ aggregateToPointer (value * val)
          sym_link *p = val->type;
 
          werror (W_STRUCT_AS_ARG, val->name);
-         val->type = newLink ();
+         val->type = newLink (DECLARATOR);
          val->type->next = p;
        }
 
@@ -1879,8 +1875,10 @@ processFuncArgs (symbol * func)
          val->sym->etype = getSpec (val->sym->type);
          val->sym->_isparm = 1;
          strncpyz (val->sym->rname, val->name, sizeof(val->sym->rname));
-         SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) =
-           SPEC_STAT (func->etype);
+         if (IS_SPEC(func->etype)) {
+           SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) =
+             SPEC_STAT (func->etype);
+         }
          addSymChain (val->sym);
 
        }
@@ -1892,8 +1890,10 @@ processFuncArgs (symbol * func)
          val->sym->_isparm = 1;
          SPEC_OCLS (val->etype) = SPEC_OCLS (val->sym->etype) =
            (options.model != MODEL_SMALL ? xdata : data);
-         SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) =
-           SPEC_STAT (func->etype);
+         if (IS_SPEC(func->etype)) {
+           SPEC_STAT (val->etype) = SPEC_STAT (val->sym->etype) =
+             SPEC_STAT (func->etype);
+         }
        }
       if (!isinSet(operKeyReset, val->sym)) {
        addSet (&operKeyReset, val->sym);
@@ -2373,7 +2373,7 @@ _mangleFunctionName(char *in)
 /*-----------------------------------------------------------------*/
 sym_link *typeFromStr (char *s)
 {
-    sym_link *r = newLink();
+    sym_link *r = newLink(DECLARATOR);
     int usign = 0;
 
     do {
@@ -2415,10 +2415,9 @@ sym_link *typeFromStr (char *s)
        case 'd':
        case 'F':
            assert(*(s+1)=='*');
-           nr = newLink();
+           nr = newLink(DECLARATOR);
            nr->next = r;
            r = nr;
-           r->class = DECLARATOR ;
            switch (*s) {
            case 'g':
                DCL_TYPE(r) = GPOINTER;
@@ -2434,10 +2433,9 @@ sym_link *typeFromStr (char *s)
                break;
            case 'F':
                DCL_TYPE(r) = FUNCTION;
-               nr = newLink();
+               nr = newLink(DECLARATOR);
                nr->next = r;
                r = nr;
-               r->class = DECLARATOR ;
                DCL_TYPE(r) = CPOINTER;
                break;
            }
@@ -2594,3 +2592,23 @@ void initBuiltIns()
        FUNC_ISREENT(sym->type) = 0;    /* can never be reentrant */
     }
 }
+
+sym_link *validateLink(sym_link        *l, 
+                       const char      *macro,
+                       const char      *args,
+                       const char      select,
+                       const char      *file, 
+                       unsigned        line)
+{    
+  if (l && l->class==select)
+    {
+       return l;
+    }
+    fprintf(stderr, 
+           "Internal error: validateLink failed in %s(%s) @ %s:%u:"
+           " expected %s, got %s\n",
+           macro, args, file, line, 
+           DECLSPEC2TXT(select), l ? DECLSPEC2TXT(l->class) : "null-link");
+    exit(-1);
+    return l; // never reached, makes compiler happy.
+}
index f49036fad9380f9a7827b648133fcbe45d01c57a..d13e58edad648c42c9121a237b43b4d0757f8894 100644 (file)
@@ -183,12 +183,15 @@ typedef struct declarator
   }
 declarator;
 
-#define DECLARATOR   0
-#define SPECIFIER    1
+typedef enum {
+  DECLARATOR=1,
+  SPECIFIER
+} SYM_LINK_CLASS;
+#define DECLSPEC2TXT(select) (select==DECLARATOR?"DECLARATOR":select==SPECIFIER?"SPECIFIER":"UNKNOW")
 
 typedef struct sym_link
   {
-    unsigned class:1;          /* DECLARATOR or SPECIFIER    */
+    SYM_LINK_CLASS class;      /* DECLARATOR or SPECIFIER    */
     unsigned tdef:1;           /* current link created by    */
     /* typedef if this flag is set */
     union
@@ -313,12 +316,18 @@ typedef struct symbol
   }
 symbol;
 
+extern sym_link *validateLink(sym_link         *l, 
+                              const char       *macro,
+                              const char       *args,
+                              const char       select,
+                              const char       *file, 
+                              unsigned         line);
 /* Easy Access Macros */
-#define DCL_TYPE(l)  l->select.d.dcl_type
-#define DCL_ELEM(l)  l->select.d.num_elem
-#define DCL_PTR_CONST(l) l->select.d.ptr_const
-#define DCL_PTR_VOLATILE(l) l->select.d.ptr_volatile
-#define DCL_TSPEC(l) l->select.d.tspec
+#define DCL_TYPE(l)  validateLink(l, "DCL_TYPE", #l, DECLARATOR, __FILE__, __LINE__)->select.d.dcl_type
+#define DCL_ELEM(l)  validateLink(l, "DCL_ELEM", #l, DECLARATOR, __FILE__, __LINE__)->select.d.num_elem
+#define DCL_PTR_CONST(l) validateLink(l, "DCL_PTR_CONST", #l, DECLARATOR, __FILE__, __LINE__)->select.d.ptr_const
+#define DCL_PTR_VOLATILE(l) validateLink(l, "DCL_PTR_VOLATILE", #l, DECLARATOR, __FILE__, __LINE__)->select.d.ptr_volatile
+#define DCL_TSPEC(l) validateLink(l, "DCL_TSPEC", #l, DECLARATOR, __FILE__, __LINE__)->select.d.tspec
 
 #define FUNC_DEBUG //assert(IS_FUNC(x));
 #define FUNC_HASVARARGS(x) (x->funcAttrs.hasVargs)
@@ -362,35 +371,35 @@ symbol;
    options.model == MODEL_MEDIUM || \
   IFFUNC_BANKED(x)))
 
-#define SPEC_NOUN(x) x->select.s.noun
-#define SPEC_LONG(x) x->select.s._long
-#define SPEC_USIGN(x) x->select.s._unsigned
-#define SPEC_SCLS(x) x->select.s.sclass
-#define SPEC_ENUM(x) x->select.s._isenum
-#define SPEC_OCLS(x) x->select.s.oclass
-#define SPEC_STAT(x) x->select.s._static
-#define SPEC_EXTR(x) x->select.s._extern
-#define SPEC_CODE(x) x->select.s._codesg
-#define SPEC_ABSA(x) x->select.s._absadr
-#define SPEC_BANK(x) x->select.s._regbank
-#define SPEC_ADDR(x) x->select.s._addr
-#define SPEC_STAK(x) x->select.s._stack
-#define SPEC_CVAL(x) x->select.s.const_val
-#define SPEC_BSTR(x) x->select.s._bitStart
-#define SPEC_BLEN(x) x->select.s._bitLength
+#define SPEC_NOUN(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s.noun
+#define SPEC_LONG(x) validateLink(x, "SPEC_LONG", #x, SPECIFIER, __FILE__, __LINE__)->select.s._long
+#define SPEC_USIGN(x) validateLink(x, "SPEC_USIGN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._unsigned
+#define SPEC_SCLS(x) validateLink(x, "SPEC_SCLS", #x, SPECIFIER, __FILE__, __LINE__)->select.s.sclass
+#define SPEC_ENUM(x) validateLink(x, "SPEC_ENUM", #x, SPECIFIER, __FILE__, __LINE__)->select.s._isenum
+#define SPEC_OCLS(x) validateLink(x, "SPEC_OCLS", #x, SPECIFIER, __FILE__, __LINE__)->select.s.oclass
+#define SPEC_STAT(x) validateLink(x, "SPEC_STAT", #x, SPECIFIER, __FILE__, __LINE__)->select.s._static
+#define SPEC_EXTR(x) validateLink(x, "SPEC_EXTR", #x, SPECIFIER, __FILE__, __LINE__)->select.s._extern
+#define SPEC_CODE(x) validateLink(x, "SPEC_CODE", #x, SPECIFIER, __FILE__, __LINE__)->select.s._codesg
+#define SPEC_ABSA(x) validateLink(x, "SPEC_ABSA", #x, SPECIFIER, __FILE__, __LINE__)->select.s._absadr
+#define SPEC_BANK(x) validateLink(x, "SPEC_BANK", #x, SPECIFIER, __FILE__, __LINE__)->select.s._regbank
+#define SPEC_ADDR(x) validateLink(x, "SPEC_ADDR", #x, SPECIFIER, __FILE__, __LINE__)->select.s._addr
+#define SPEC_STAK(x) validateLink(x, "SPEC_STAK", #x, SPECIFIER, __FILE__, __LINE__)->select.s._stack
+#define SPEC_CVAL(x) validateLink(x, "SPEC_CVAL", #x, SPECIFIER, __FILE__, __LINE__)->select.s.const_val
+#define SPEC_BSTR(x) validateLink(x, "SPEC_BSTR", #x, SPECIFIER, __FILE__, __LINE__)->select.s._bitStart
+#define SPEC_BLEN(x) validateLink(x, "SPEC_BLEN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._bitLength
 
 /* Sleaze: SPEC_ISR_SAVED_BANKS is only used on 
  * function type symbols, which obviously cannot
  * be of BIT type. Therefore, we recycle the 
  * _bitStart field instead of defining a new field.
  */
-#define SPEC_ISR_SAVED_BANKS(x) x->select.s._bitStart
-#define SPEC_VOLATILE(x) x->select.s._volatile
-#define SPEC_CONST(x) x->select.s._const
-#define SPEC_STRUCT(x) x->select.s.v_struct
-#define SPEC_TYPEDEF(x) x->select.s._typedef
-#define SPEC_REGPARM(x) x->select.s._isregparm
-#define SPEC_ARGREG(x) x->select.s.argreg
+#define SPEC_ISR_SAVED_BANKS(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._bitStart
+#define SPEC_VOLATILE(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._volatile
+#define SPEC_CONST(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._const
+#define SPEC_STRUCT(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s.v_struct
+#define SPEC_TYPEDEF(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._typedef
+#define SPEC_REGPARM(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s._isregparm
+#define SPEC_ARGREG(x) validateLink(x, "SPEC_NOUN", #x, SPECIFIER, __FILE__, __LINE__)->select.s.argreg
 
 /* type check macros */
 #define IS_DECL(x)   ( x && x->class == DECLARATOR     )
@@ -415,7 +424,7 @@ symbol;
 #define IS_TYPEDEF(x)(IS_SPEC(x) && x->select.s._typedef)
 #define IS_CONSTANT(x)  (!x ? 0 : \
                            IS_SPEC(x) ? \
-                           x->select.s._const == 1 : \
+                           x->select.s._const : \
                            x->select.d.ptr_const)
 #define IS_STRUCT(x) (IS_SPEC(x) && x->select.s.noun == V_STRUCT)
 #define IS_ABSOLUTE(x)  (IS_SPEC(x) && x->select.s._absadr )
@@ -485,7 +494,7 @@ extern sym_link *floatType;
 /* forward definitions for the symbol table related functions */
 void initSymt ();
 symbol *newSymbol (char *, int);
-sym_link *newLink ();
+sym_link *newLink (SYM_LINK_CLASS);
 sym_link *newFloatLink ();
 structdef *newStruct (char *);
 void addDecl (symbol *, int, sym_link *);
index b2a9899615e51d6ceba129b227685c6f64fb96fb..687a2a3f34cba86ca943687f11d2e008966663ba 100644 (file)
@@ -403,8 +403,7 @@ constFloatVal (char *s)
       return constVal ("0");
     }
 
-  val->type = val->etype = newLink ();
-  val->type->class = SPECIFIER;
+  val->type = val->etype = newLink (SPECIFIER);
   SPEC_NOUN (val->type) = V_FLOAT;
   SPEC_SCLS (val->type) = S_LITERAL;
   SPEC_CVAL (val->type).v_float = sval;
@@ -425,8 +424,7 @@ value *constVal (char *s)
 
   val = newValue ();           /* alloc space for value   */
 
-  val->type = val->etype = newLink (); /* create the spcifier */
-  val->type->class = SPECIFIER;
+  val->type = val->etype = newLink (SPECIFIER);        /* create the spcifier */
   SPEC_SCLS (val->type) = S_LITERAL;
   // let's start with an unsigned char
   SPEC_NOUN (val->type) = V_CHAR;
@@ -665,10 +663,9 @@ strVal (char *s)
   val = newValue ();           /* get a new one */
 
   /* get a declarator */
-  val->type = newLink ();
+  val->type = newLink (DECLARATOR);
   DCL_TYPE (val->type) = ARRAY;
-  val->type->next = val->etype = newLink ();
-  val->etype->class = SPECIFIER;
+  val->type->next = val->etype = newLink (SPECIFIER);
   SPEC_NOUN (val->etype) = V_CHAR;
   SPEC_SCLS (val->etype) = S_LITERAL;
 
@@ -776,8 +773,7 @@ charVal (char *s)
 
   val = newValue ();
 
-  val->type = val->etype = newLink ();
-  val->type->class = SPECIFIER;
+  val->type = val->etype = newLink (SPECIFIER);
   SPEC_NOUN (val->type) = V_CHAR;
   SPEC_USIGN(val->type) = 1;
   SPEC_SCLS (val->type) = S_LITERAL;
@@ -1018,8 +1014,7 @@ valMult (value * lval, value * rval)
 
   /* create a new value */
   val = newValue ();
-  val->type = val->etype = newLink ();
-  val->type->class = SPECIFIER;
+  val->type = val->etype = newLink (SPECIFIER);
   SPEC_NOUN (val->type) = (IS_FLOAT (lval->etype) ||
                           IS_FLOAT (rval->etype) ? V_FLOAT : V_INT);
   SPEC_SCLS (val->type) = S_LITERAL;   /* will remain literal */
@@ -1059,8 +1054,7 @@ valDiv (value * lval, value * rval)
 
   /* create a new value */
   val = newValue ();
-  val->type = val->etype = newLink();
-  val->type->class = SPECIFIER;
+  val->type = val->etype = newLink(SPECIFIER);
   SPEC_NOUN (val->type) = (IS_FLOAT (lval->etype) ||
                           IS_FLOAT (rval->etype) ? V_FLOAT : V_INT);
   SPEC_SCLS (val->etype) = S_LITERAL;
@@ -1105,8 +1099,7 @@ valMod (value * lval, value * rval)
 
   /* create a new value */
   val = newValue ();
-  val->type = val->etype = newLink ();
-  val->type->class = SPECIFIER;
+  val->type = val->etype = newLink (SPECIFIER);
   SPEC_NOUN (val->type) = V_INT;       /* type is int */
   SPEC_SCLS (val->type) = S_LITERAL;   /* will remain literal */
   SPEC_USIGN (val->type) = (SPEC_USIGN (lval->etype) & SPEC_USIGN (rval->etype));
@@ -1145,8 +1138,7 @@ valPlus (value * lval, value * rval)
 
   /* create a new value */
   val = newValue ();
-  val->type = val->etype = newLink ();
-  val->type->class = SPECIFIER;
+  val->type = val->etype = newLink (SPECIFIER);
   SPEC_NOUN (val->type) = (IS_FLOAT (lval->etype) ||
                           IS_FLOAT (rval->etype) ? V_FLOAT : V_INT);
   SPEC_SCLS (val->type) = S_LITERAL;   /* will remain literal */
@@ -1184,8 +1176,7 @@ valMinus (value * lval, value * rval)
 
   /* create a new value */
   val = newValue ();
-  val->type = val->etype = newLink ();
-  val->type->class = SPECIFIER;
+  val->type = val->etype = newLink (SPECIFIER);
   SPEC_NOUN (val->type) = (IS_FLOAT (lval->etype) ||
                           IS_FLOAT (rval->etype) ? V_FLOAT : V_INT);
   SPEC_SCLS (val->type) = S_LITERAL;   /* will remain literal */
@@ -1542,7 +1533,7 @@ valForArray (ast * arrExpr)
   SNPRINTF (val->name, sizeof(val->name), "(%s + %d)", buffer,
           (int) AST_LIT_VALUE (arrExpr->right) * size);
 
-  val->type = newLink ();
+  val->type = newLink (DECLARATOR);
   if (SPEC_SCLS (arrExpr->left->etype) == S_CODE)
     {
       DCL_TYPE (val->type) = CPOINTER;
@@ -1612,7 +1603,7 @@ valForStructElem (ast * structT, ast * elemT)
   SNPRINTF (val->name, sizeof(val->name), "(%s + %d)", buffer,
           (int) sym->offset);
 
-  val->type = newLink ();
+  val->type = newLink (DECLARATOR);
   if (SPEC_SCLS (structT->etype) == S_CODE)
     {
       DCL_TYPE (val->type) = CPOINTER;
index c323459a5fcb5cdaba82667ef941cf15bb1b9368..d6206f52eeeaede71afeefb64af3a989047399a6 100644 (file)
@@ -2628,6 +2628,7 @@ packForPush (iCode * ic, eBBlock * ebp)
          if (bitVectBitValue(dbv,lic->key)) return ;
   }
   /* make sure they have the same type */
+  if (IS_SPEC(operandType(IC_LEFT(ic))))
   {
     sym_link *itype=operandType(IC_LEFT(ic));
     sym_link *ditype=operandType(IC_RIGHT(dic));
index 82bda5a5b75caf5a612284d1810d6b90b7058622..8ecb55b395dfe6ac39580dbaa781a79f84650fd4 100644 (file)
@@ -2503,6 +2503,7 @@ packForPush (iCode * ic, eBBlock ** ebpp, int blockno)
        return ;
     }
     /* make sure they have the same type */
+    if (IS_SPEC(operandType(IC_LEFT(ic))))
     {
       sym_link *itype=operandType(IC_LEFT(ic));
       sym_link *ditype=operandType(IC_RIGHT(dic));