From 22985043d8043d13f0cf35f7c916cd9104e2f142 Mon Sep 17 00:00:00 2001 From: sandeep Date: Wed, 9 Feb 2000 01:38:44 +0000 Subject: [PATCH] work on avr port start by defining the new 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 | 2 ++ src/SDCC.y | 12 +++++-- src/SDCCcse.c | 61 +++++++++++++++++---------------- src/SDCCmem.c | 93 +++++++++++++++++++++++++++++++++++--------------- src/SDCCmem.h | 28 ++++++++------- src/SDCCsymt.h | 4 ++- 6 files changed, 127 insertions(+), 73 deletions(-) diff --git a/src/SDCC.lex b/src/SDCC.lex index 001e00b2..92d235b8 100644 --- a/src/SDCC.lex +++ b/src/SDCC.lex @@ -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);} diff --git a/src/SDCC.y b/src/SDCC.y index e777a313..b9385b68 100644 --- a/src/SDCC.y +++ b/src/SDCC.y @@ -75,10 +75,10 @@ value *cenum = NULL ; /* current enumeration type chain*/ %token MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN %token SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN %token 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 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 ; } ; diff --git a/src/SDCCcse.c b/src/SDCCcse.c index d86d00b2..9ce0698f 100644 --- a/src/SDCCcse.c +++ b/src/SDCCcse.c @@ -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 */ /*-----------------------------------------------------------------*/ diff --git a/src/SDCCmem.c b/src/SDCCmem.c index 812026c0..cd8df6a4 100644 --- a/src/SDCCmem.c +++ b/src/SDCCmem.c @@ -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); + } /*-----------------------------------------------------------------*/ diff --git a/src/SDCCmem.h b/src/SDCCmem.h index 9ff8dfc1..7a5517c3 100644 --- a/src/SDCCmem.h +++ b/src/SDCCmem.h @@ -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 * ); diff --git a/src/SDCCsymt.h b/src/SDCCsymt.h index b6bebde0..beea79c2 100644 --- a/src/SDCCsymt.h +++ b/src/SDCCsymt.h @@ -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 }; -- 2.30.2