work on avr port start by defining the new
authorsandeep <sandeep@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 9 Feb 2000 01:38:44 +0000 (01:38 +0000)
committersandeep <sandeep@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Wed, 9 Feb 2000 01:38:44 +0000 (01:38 +0000)
memory maps & extra keywords.

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@90 4a8a32a2-be11-0410-ad9d-d568d2c75423

src/SDCC.lex
src/SDCC.y
src/SDCCcse.c
src/SDCCmem.c
src/SDCCmem.h
src/SDCCsymt.h

index 001e00b26fad93d4590b6432b5dbbc29bedb6783..92d235b8069caa55ff2c8187a4da5cf3fa310172 100644 (file)
@@ -108,6 +108,7 @@ struct options  save_options  ;
 "enum"         { count(); return(ENUM); }
 "extern"       { count(); return(EXTERN); }
 "far"          { count(); TKEYWORD(XDATA);  }
+"flash"        { count(); TKEYWORD(FLASH);  }
 "float"        { count(); return(FLOAT); }
 "for"          { count(); return(FOR); }
 "goto"        { count(); return(GOTO); }
@@ -139,6 +140,7 @@ struct options  save_options  ;
 "xdata"        { count(); TKEYWORD(XDATA); }
 "_data"               { count(); TKEYWORD(_NEAR); }
 "_code"               { count(); TKEYWORD(_CODE); }
+"_flash"       { count(); TKEYWORD(_FLASH); }
 "_generic"     { count(); TKEYWORD(_GENERIC); }
 "_near"               { count(); TKEYWORD(_NEAR); }
 "_xdata"       { count(); TKEYWORD(_XDATA);}
index e777a3133db6bd59dd9ab5c3e7ef902b3e8a6116..b9385b6898a63b8d6a4d32915ed91b6413799c51 100644 (file)
@@ -75,10 +75,10 @@ value *cenum = NULL  ;  /* current enumeration  type chain*/
 %token <yyint> MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN
 %token <yyint> SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN
 %token <yyint> XOR_ASSIGN OR_ASSIGN
-%token TYPEDEF EXTERN STATIC AUTO REGISTER CODE INTERRUPT SFR AT SBIT
+%token TYPEDEF EXTERN STATIC AUTO REGISTER CODE FLASH INTERRUPT SFR AT SBIT
 %token REENTRANT USING  XDATA DATA IDATA PDATA VAR_ARGS CRITICAL
 %token CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE CONST VOLATILE VOID BIT
-%token STRUCT UNION ENUM ELIPSIS RANGE FAR _XDATA _CODE _GENERIC _NEAR _PDATA _IDATA
+%token STRUCT UNION ENUM ELIPSIS RANGE FAR _XDATA _CODE _GENERIC _NEAR _PDATA _IDATA _FLASH
 %token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN 
 %token <yyinline> INLINEASM
 %token IFX ADDRESS_OF GET_VALUE_AT_ADDRESS SPIL UNSPIL GETHBIT
@@ -576,6 +576,11 @@ type_specifier2
                   $$->class = SPECIFIER  ;
                   SPEC_SCLS($$) = S_CODE ;                 
                }
+   | FLASH      {
+                  $$ = newLink () ;
+                  $$->class = SPECIFIER  ;
+                  SPEC_SCLS($$) = S_FLASH ;
+               }
    | DATA      {
                   $$ = newLink ();
                   $$->class = SPECIFIER ;
@@ -914,6 +919,8 @@ pointer
                 case S_CODE:
                     DCL_PTR_CONST($3) = 1;
                     DCL_TYPE($3) = CPOINTER ;
+                case S_FLASH:
+                    DCL_TYPE($3) = FLPOINTER;
                     break;
                 }
             }
@@ -941,6 +948,7 @@ far_near
    | _IDATA    { $$ = newLink() ; DCL_TYPE($$) = IPOINTER ; }
    | _NEAR     { $$ = NULL ; }
    | _GENERIC  { $$ = newLink() ; DCL_TYPE($$) = GPOINTER ; } 
+   | _FLASH    { $$ = newLink() ; DCL_TYPE($$) = FLPOINTER ;} 
    |           { $$ = newLink() ; DCL_TYPE($$) = UPOINTER ; }
    ;
 
index d86d00b22f3bba9392b5f0f17291df4e55692091..9ce0698fa483dc06bde608796fd3a98dee0d4da2 100644 (file)
@@ -762,6 +762,7 @@ void updateSpillLocation ( iCode *ic)
 
     if (ASSIGN_ITEMP_TO_ITEMP(ic) &&
        !SPIL_LOC(IC_RIGHT(ic))   &&
+       bitVectnBitsOn(OP_USES(IC_RIGHT(ic))) == 0 &&
        OP_SYMBOL(IC_RESULT(ic))->isreqv) {
        
        setype = getSpec(operandType(IC_RESULT(ic)));
@@ -796,6 +797,36 @@ void setUsesDefs (operand *op, bitVect *bdefs,
     *oud = bitVectUnion(*oud,adefs);
 }
 
+/*-----------------------------------------------------------------*/
+/* unsetDefsAndUses - clear this operation for the operands        */
+/*-----------------------------------------------------------------*/
+void unsetDefsAndUses ( iCode *ic ) 
+{
+    if ( ic->op == JUMPTABLE)
+       return ;
+
+    /* take away this definition from the def chain of the */
+    /* result & take away from use set of the operands */
+    if (ic->op != IFX) {
+       /* turn off def set */
+       if (IS_SYMOP(IC_RESULT(ic))) {
+           if ( !POINTER_SET(ic)) 
+               bitVectUnSetBit(OP_DEFS(IC_RESULT(ic)),ic->key);
+           else
+               bitVectUnSetBit(OP_USES(IC_RESULT(ic)),ic->key);
+       }
+       /* turn off the useSet for the operands */
+       if (IS_SYMOP(IC_LEFT(ic)))
+           bitVectUnSetBit (OP_USES(IC_LEFT(ic)),ic->key);
+       
+       if (IS_SYMOP(IC_RIGHT(ic)))
+           bitVectUnSetBit (OP_USES(IC_RIGHT(ic)),ic->key);
+    }
+    else /* must be ifx turn off the use */
+       if (IS_SYMOP(IC_COND(ic)))
+           bitVectUnSetBit (OP_USES(IC_COND(ic)),ic->key);    
+}
+
 /*-----------------------------------------------------------------*/
 /* ifxOptimize - changes ifx conditions if it can                  */
 /*-----------------------------------------------------------------*/
@@ -870,36 +901,6 @@ void ifxOptimize (iCode *ic, set *cseSet,
     return ;  
 }
 
-/*-----------------------------------------------------------------*/
-/* unsetDefsAndUses - clear this operation for the operands        */
-/*-----------------------------------------------------------------*/
-void unsetDefsAndUses ( iCode *ic ) 
-{
-    if ( ic->op == JUMPTABLE)
-       return ;
-
-    /* take away this definition from the def chain of the */
-    /* result & take away from use set of the operands */
-    if (ic->op != IFX) {
-       /* turn off def set */
-       if (IS_SYMOP(IC_RESULT(ic))) {
-           if ( !POINTER_SET(ic)) 
-               bitVectUnSetBit(OP_DEFS(IC_RESULT(ic)),ic->key);
-           else
-               bitVectUnSetBit(OP_USES(IC_RESULT(ic)),ic->key);
-       }
-       /* turn off the useSet for the operands */
-       if (IS_SYMOP(IC_LEFT(ic)))
-           bitVectUnSetBit (OP_USES(IC_LEFT(ic)),ic->key);
-       
-       if (IS_SYMOP(IC_RIGHT(ic)))
-           bitVectUnSetBit (OP_USES(IC_RIGHT(ic)),ic->key);
-    }
-    else /* must be ifx turn off the use */
-       if (IS_SYMOP(IC_COND(ic)))
-           bitVectUnSetBit (OP_USES(IC_COND(ic)),ic->key);    
-}
-
 /*-----------------------------------------------------------------*/
 /* diCodeForSym - finds the definiting instruction for a symbol    */
 /*-----------------------------------------------------------------*/
index 812026c02ce90148d8b29b830162bb9afa887dc4..cd8df6a4f4359567bcce660ad4014eec67aa7225 100644 (file)
@@ -18,6 +18,7 @@ memmap  *reg   = NULL;   /* register space              */
 memmap  *sfrbit= NULL;   /* sfr bit space               */
 memmap  *generic=NULL;   /* is a generic pointer        */
 memmap  *overlay=NULL;   /* overlay segment             */
+memmap  *eeprom =NULL;   /* eeprom location             */
 
 /* this is a set of sets each set containing
    symbols in a single overlay */
@@ -40,7 +41,8 @@ memmap *allocMap (char rspace,     /* sfr space            */
                  char codemap,    /* this is code space   */
                  unsigned sloc,   /* starting location    */
                  const char *name,      /* 2 character name     */
-                 char dbName     
+                 char dbName    , /* debug name                 */
+                 int  ptrType     /* pointer type for this space */
                  )
 {
        memmap *map ;
@@ -60,6 +62,7 @@ memmap *allocMap (char rspace,     /* sfr space            */
        map->sloc   =  sloc ;
        map->sname = name ;
        map->dbName = dbName ;
+       map->ptrType= ptrType;
        if (!(map->oFile = tmpfile())) {
                werror(E_TMPFILE_FAILED);
                exit (1);
@@ -82,8 +85,11 @@ void initMem ()
                   PAGED          -   YES
                   DIRECT-ACCESS  -   NO
                   BIT-ACCESS     -   NO
-                  CODE-ACESS     -   NO */
-       xstack    = allocMap (0, 1, 1, 0, 0, 0, options.xstack_loc, XSTACK_NAME,'A');
+                  CODE-ACESS     -   NO 
+                  DEBUG-NAME     -   'A'
+                  POINTER-TYPE   -   FPOINTER
+       */
+       xstack    = allocMap (0, 1, 1, 0, 0, 0, options.xstack_loc, XSTACK_NAME,'A',FPOINTER);
 
        /* internal stack segment ;   
                   SFRSPACE       -   NO
@@ -91,8 +97,11 @@ void initMem ()
                   PAGED          -   NO
                   DIRECT-ACCESS  -   NO
                   BIT-ACCESS     -   NO
-                  CODE-ACESS     -   NO */
-       istack    = allocMap (0, 0, 0, 0, 0, 0,options.stack_loc, ISTACK_NAME,'B');
+                  CODE-ACESS     -   NO 
+                  DEBUG-NAME     -   'B'
+                  POINTER-TYPE   -   POINTER
+       */
+       istack    = allocMap (0, 0, 0, 0, 0, 0,options.stack_loc, ISTACK_NAME,'B',POINTER);
 
        /* code  segment ;   
                   SFRSPACE       -   NO
@@ -100,8 +109,11 @@ void initMem ()
                   PAGED          -   NO
                   DIRECT-ACCESS  -   NO
                   BIT-ACCESS     -   NO
-                  CODE-ACESS     -   YES */
-       code      = allocMap (0, 1, 0, 0, 0, 1, options.code_loc, CODE_NAME,'C');
+                  CODE-ACESS     -   YES 
+                  DEBUG-NAME     -   'C'
+                  POINTER-TYPE   -   CPOINTER
+       */
+       code      = allocMap (0, 1, 0, 0, 0, 1, options.code_loc, CODE_NAME,'C',CPOINTER);
 
        /* Static segment (code for variables );
                   SFRSPACE       -   NO
@@ -109,8 +121,11 @@ void initMem ()
                   PAGED          -   NO
                   DIRECT-ACCESS  -   NO
                   BIT-ACCESS     -   NO
-                  CODE-ACESS     -   YES */
-       statsg    = allocMap (0, 1, 0, 0, 0, 1,0, STATIC_NAME,'D');
+                  CODE-ACESS     -   YES 
+                  DEBUG-NAME     -   'D'
+                  POINTER-TYPE   -   CPOINTER
+       */
+       statsg    = allocMap (0, 1, 0, 0, 0, 1,0, STATIC_NAME,'D',CPOINTER);
 
        /* Data segment - internal storage segment ;
                   SFRSPACE       -   NO
@@ -118,8 +133,11 @@ void initMem ()
                   PAGED          -   NO
                   DIRECT-ACCESS  -   YES
                   BIT-ACCESS     -   NO
-                  CODE-ACESS     -   NO */     
-       data      = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, DATA_NAME,'E');
+                  CODE-ACESS     -   NO 
+                  DEBUG-NAME     -   'E'
+                  POINTER-TYPE   -   POINTER
+       */      
+       data      = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, DATA_NAME,'E',POINTER);
 
        /* overlay segment - same as internal storage segment ;
                   SFRSPACE       -   NO
@@ -127,8 +145,11 @@ void initMem ()
                   PAGED          -   NO
                   DIRECT-ACCESS  -   YES
                   BIT-ACCESS     -   NO
-                  CODE-ACESS     -   NO */     
-       overlay   = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, DATA_NAME,'E');
+                  CODE-ACESS     -   NO 
+                  DEBUG-NAME     -   'E'
+                  POINTER-TYPE   -   POINTER
+       */
+       overlay   = allocMap (0, 0, 0, 1, 0, 0, options.data_loc, DATA_NAME,'E',POINTER);
 
        /* Xternal Data segment - 
                   SFRSPACE       -   NO
@@ -136,8 +157,11 @@ void initMem ()
                   PAGED          -   NO
                   DIRECT-ACCESS  -   NO
                   BIT-ACCESS     -   NO
-                  CODE-ACESS     -   NO */
-       xdata     = allocMap (0, 1, 0, 0, 0, 0, options.xdata_loc, XDATA_NAME,'F' );
+                  CODE-ACESS     -   NO 
+                  DEBUG-NAME     -   'F'
+                  POINTER-TYPE   -   FPOINTER
+       */
+       xdata     = allocMap (0, 1, 0, 0, 0, 0, options.xdata_loc, XDATA_NAME,'F',FPOINTER);
 
        /* Inderectly addressed internal data segment
                   SFRSPACE       -   NO
@@ -145,8 +169,11 @@ void initMem ()
                   PAGED          -   NO
                   DIRECT-ACCESS  -   NO
                   BIT-ACCESS     -   NO
-                  CODE-ACESS     -   NO */
-       idata     = allocMap (0, 0, 0, 0, 0, 0, options.idata_loc,IDATA_NAME,'G' );
+                  CODE-ACESS     -   NO 
+                  DEBUG-NAME     -   'G'
+                  POINTER-TYPE   -   IPOINTER
+       */
+       idata     = allocMap (0, 0, 0, 0, 0, 0, options.idata_loc,IDATA_NAME,'G',IPOINTER);
 
        /* Static segment (code for variables );
                   SFRSPACE       -   NO
@@ -154,8 +181,11 @@ void initMem ()
                   PAGED          -   NO
                   DIRECT-ACCESS  -   YES
                   BIT-ACCESS     -   YES
-                  CODE-ACESS     -   NO */
-       bit       = allocMap (0, 0, 0, 1, 1, 0,0, BIT_NAME,'H');
+                  CODE-ACESS     -   NO 
+                  DEBUG-NAME     -   'H'
+                  POINTER-TYPE   -  _NONE_
+       */
+       bit       = allocMap (0, 0, 0, 1, 1, 0,0, BIT_NAME,'H',0);
        
        /* Special function register space :-
                   SFRSPACE       -   YES
@@ -163,8 +193,11 @@ void initMem ()
                   PAGED          -   NO
                   DIRECT-ACCESS  -   YES
                   BIT-ACCESS     -   NO
-                  CODE-ACESS     -   NO */
-       sfr        = allocMap (1,0, 0, 1, 0, 0,0, REG_NAME,'I');
+                  CODE-ACESS     -   NO 
+                  DEBUG-NAME     -   'I'
+                  POINTER-TYPE   -   _NONE_
+       */
+       sfr        = allocMap (1,0, 0, 1, 0, 0,0, REG_NAME,'I',0);
 
        /* Register space ;
                   SFRSPACE       -   YES
@@ -172,8 +205,11 @@ void initMem ()
                   PAGED          -   NO
                   DIRECT-ACCESS  -   NO
                   BIT-ACCESS     -   NO
-                  CODE-ACESS     -   NO */
-       reg        = allocMap (1,0, 0, 0, 0, 0, 0,REG_NAME,' ');
+                  CODE-ACESS     -   NO 
+                  DEBUG-NAME     -   ' '
+                  POINTER-TYPE   -   _NONE_
+       */
+       reg        = allocMap (1,0, 0, 0, 0, 0, 0,REG_NAME,' ',0);
 
        /* SFR bit space 
                   SFRSPACE       -   YES
@@ -181,12 +217,15 @@ void initMem ()
                   PAGED          -   NO
                   DIRECT-ACCESS  -   YES
                   BIT-ACCESS     -   YES
-                  CODE-ACESS     -   NO */
-       sfrbit     = allocMap (1,0, 0, 1, 1, 0,0, REG_NAME,'J' );
+                  CODE-ACESS     -   NO 
+                  DEBUG-NAME     -   'J'
+                  POINTER-TYPE   -   _NONE_
+       */
+       sfrbit     = allocMap (1,0, 0, 1, 1, 0,0, REG_NAME,'J',0);
 
        /* the unknown map */
-       generic     = allocMap (1,0, 0, 1, 1, 0,0, REG_NAME,' ' );
-
+       generic     = allocMap (1,0, 0, 1, 1, 0,0, REG_NAME,' ',GPOINTER);
+       
 }
 
 /*-----------------------------------------------------------------*/
index 9ff8dfc111a4ac59e492a535484f56ba549551f6..7a5517c359b296e9aac9636d42b2f39129a12e2e 100644 (file)
@@ -8,19 +8,20 @@
 struct set ;
 struct value ;
 typedef  struct memmap{
-    unsigned char  pageno;/* page no for this variable  */
+    unsigned char  pageno;    /* page no for this variable  */
     const char     *sname;    /*   character prefix for map */
-    char     dbName ;   /* debugger address space name */
-    int      slbl ;    /* label counter for space    */
-    unsigned sloc    ;    /* starting location          */
-    unsigned fmap : 1;    /* 1 = 16bit addressing reqd  */
-    unsigned paged : 1;    /* this is a paged mem space  */
-    unsigned direct: 1;    /* 1= indirect access only    */
-    unsigned bitsp: 1;    /* 1 = bit addressable space  */
-    unsigned codesp:1;    /* 1 = code space             */
-    unsigned regsp: 1;    /* 1= sfr space               */
-    FILE    *oFile   ;    /* object file associated     */
-    struct  set *syms;   /* symbols defined in this segment */
+    char     dbName ;         /* debugger address space name */
+    int      ptrType;         /* pointer Type for this space */
+    int      slbl ;           /* label counter for space    */
+    unsigned sloc    ;        /* starting location          */
+    unsigned fmap : 1;        /* 1 = 16bit addressing reqd  */
+    unsigned paged : 1;       /* this is a paged mem space  */
+    unsigned direct: 1;       /* 1= indirect access only    */
+    unsigned bitsp: 1;        /* 1 = bit addressable space  */
+    unsigned codesp:1;        /* 1 = code space             */
+    unsigned regsp: 1;        /* 1= sfr space               */
+    FILE    *oFile   ;        /* object file associated     */
+    struct  set *syms;        /* symbols defined in this segment */
 } memmap ;
 
 extern FILE    *junkFile ;     
@@ -51,6 +52,7 @@ extern   memmap  *reg   ;    /* register space                   */
 extern   memmap  *_const;    /* constant segment           */
 extern   memmap  *generic;   /* unknown                    */
 extern   memmap  *overlay;   /* the overlay segment        */
+extern   memmap  *eeprom;    /* eepromp space              */
 
 extern   struct  set     *ovrSetSets;
 
@@ -63,7 +65,7 @@ extern   struct  set     *ovrSetSets;
 #define IN_CODESPACE(map)       (map && map->codesp)
 
 /* forward decls for functions    */
-memmap     *allocMap       (char,char,char,char,char,char,unsigned, const char *,char );
+memmap     *allocMap       (char,char,char,char,char,char,unsigned, const char *,char,int );
 void        initMem        (                                );
 void        allocGlobal    (struct symbol  *                );
 void        allocLocal     (struct symbol  *                );
index b6bebde093b345f439b21712e9b729b632db2b1f..beea79c2381deeadd61625f6975394db74bafc0c 100644 (file)
@@ -74,7 +74,8 @@ enum  { S_FIXED  =  0,
         S_LITERAL    ,
         S_STACK      ,
         S_XSTACK     ,
-        S_BIT        };
+        S_BIT        ,
+        S_FLASH      };
 
 /* specifier is the last in the type-chain */
 typedef struct specifier {
@@ -123,6 +124,7 @@ enum {  POINTER   = 0,       /* pointer to near data */
         PPOINTER     ,       /* paged area pointer   */
         IPOINTER     ,       /* pointer to upper 128 bytes */
        UPOINTER     ,       /* unknown pointer used only when parsing */
+       FLPOINTER    ,       /* pointer to flash     */
         ARRAY        ,
         FUNCTION     };