From d8e23a291de103bc9e4fcdc63aa01acea582b6b6 Mon Sep 17 00:00:00 2001 From: sandeep Date: Sun, 5 Mar 2000 23:06:51 +0000 Subject: [PATCH] Infrastructure stuff for AVR git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@161 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- src/SDCC.lex | 4 ++-- src/SDCC.y | 14 +++++++------- src/SDCCast.c | 4 ++-- src/SDCCglue.c | 4 ++-- src/SDCCmain.c | 2 +- src/SDCCmem.c | 32 +++++++++++++++++++++----------- src/SDCCsymt.c | 18 +++++++++--------- src/SDCCsymt.h | 6 +++--- src/SDCCval.c | 8 ++++---- src/mcs51/main.c | 12 +++++++++++- src/mcs51/ralloc.c | 5 +---- src/port.h | 4 +++- src/z80/main.c | 6 +++++- 13 files changed, 71 insertions(+), 48 deletions(-) diff --git a/src/SDCC.lex b/src/SDCC.lex index 04001590..821cff05 100644 --- a/src/SDCC.lex +++ b/src/SDCC.lex @@ -108,7 +108,7 @@ struct options save_options ; "enum" { count(); return(ENUM); } "extern" { count(); return(EXTERN); } "far" { count(); TKEYWORD(XDATA); } -"flash" { count(); TKEYWORD(FLASH); } +"eeprom" { count(); TKEYWORD(EEPROM); } "float" { count(); return(FLOAT); } "for" { count(); return(FOR); } "goto" { count(); return(GOTO); } @@ -140,7 +140,7 @@ struct options save_options ; "xdata" { count(); TKEYWORD(XDATA); } "_data" { count(); TKEYWORD(_NEAR); } "_code" { count(); TKEYWORD(_CODE); } -"_flash" { count(); TKEYWORD(_FLASH); } +"_eeprom" { count(); TKEYWORD(_EEPROM); } "_generic" { count(); TKEYWORD(_GENERIC); } "_near" { count(); TKEYWORD(_NEAR); } "_xdata" { count(); TKEYWORD(_XDATA);} diff --git a/src/SDCC.y b/src/SDCC.y index b9385b68..ed7e2a2a 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 FLASH INTERRUPT SFR AT SBIT +%token TYPEDEF EXTERN STATIC AUTO REGISTER CODE EEPROM 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 _FLASH +%token STRUCT UNION ENUM ELIPSIS RANGE FAR _XDATA _CODE _GENERIC _NEAR _PDATA _IDATA _EEPROM %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,10 +576,10 @@ type_specifier2 $$->class = SPECIFIER ; SPEC_SCLS($$) = S_CODE ; } - | FLASH { + | EEPROM { $$ = newLink () ; $$->class = SPECIFIER ; - SPEC_SCLS($$) = S_FLASH ; + SPEC_SCLS($$) = S_EEPROM ; } | DATA { $$ = newLink (); @@ -919,8 +919,8 @@ pointer case S_CODE: DCL_PTR_CONST($3) = 1; DCL_TYPE($3) = CPOINTER ; - case S_FLASH: - DCL_TYPE($3) = FLPOINTER; + case S_EEPROM: + DCL_TYPE($3) = EEPPOINTER; break; } } @@ -948,7 +948,7 @@ far_near | _IDATA { $$ = newLink() ; DCL_TYPE($$) = IPOINTER ; } | _NEAR { $$ = NULL ; } | _GENERIC { $$ = newLink() ; DCL_TYPE($$) = GPOINTER ; } - | _FLASH { $$ = newLink() ; DCL_TYPE($$) = FLPOINTER ;} + | _EEPROM { $$ = newLink() ; DCL_TYPE($$) = EEPPOINTER ;} | { $$ = newLink() ; DCL_TYPE($$) = UPOINTER ; } ; diff --git a/src/SDCCast.c b/src/SDCCast.c index 0f1ad90b..e4f1baa3 100644 --- a/src/SDCCast.c +++ b/src/SDCCast.c @@ -1768,8 +1768,8 @@ ast *decorateType (ast *tree) if (SPEC_SCLS(tree->left->etype) == S_IDATA) DCL_TYPE(p) = IPOINTER ; else - if (SPEC_SCLS(tree->left->etype) == S_FLASH) - DCL_TYPE(p) = FLPOINTER ; + if (SPEC_SCLS(tree->left->etype) == S_EEPROM) + DCL_TYPE(p) = EEPPOINTER ; else DCL_TYPE(p) = POINTER ; diff --git a/src/SDCCglue.c b/src/SDCCglue.c index 87779873..e512b0ed 100644 --- a/src/SDCCglue.c +++ b/src/SDCCglue.c @@ -226,8 +226,8 @@ value *initPointer (initList *ilist) if (SPEC_SCLS(expr->left->etype) == S_IDATA) DCL_TYPE(val->type) = IPOINTER ; else - if (SPEC_SCLS(expr->left->etype) == S_FLASH) - DCL_TYPE(val->type) = FLPOINTER ; + if (SPEC_SCLS(expr->left->etype) == S_EEPROM) + DCL_TYPE(val->type) = EEPPOINTER ; else DCL_TYPE(val->type) = POINTER ; val->type->next = expr->left->ftype; diff --git a/src/SDCCmain.c b/src/SDCCmain.c index 2a5064a4..9ed72306 100644 --- a/src/SDCCmain.c +++ b/src/SDCCmain.c @@ -1274,6 +1274,7 @@ int main ( int argc, char **argv , char **envp) if (port->init) port->init(); + initMem(); setDefaultOptions(); parseCmdLine(argc,argv); @@ -1290,7 +1291,6 @@ int main ( int argc, char **argv , char **envp) if (srcFileName) { initSymt(); - initMem(); initiCode(); initCSupport (); initPeepHole(); diff --git a/src/SDCCmem.c b/src/SDCCmem.c index d2d9ed37..435c3171 100644 --- a/src/SDCCmem.c +++ b/src/SDCCmem.c @@ -223,6 +223,18 @@ void initMem () */ sfrbit = allocMap (1,0, 0, 1, 1, 0,0, REG_NAME,'J',0); + /* EEPROM bit space + SFRSPACE - NO + FAR-SPACE - YES + PAGED - NO + DIRECT-ACCESS - NO + BIT-ACCESS - NO + CODE-ACESS - NO + DEBUG-NAME - 'K' + POINTER-TYPE - EEPPOINTER + */ + eeprom = allocMap (0,1, 0, 0, 0, 0,0, REG_NAME,'K',EEPPOINTER); + /* the unknown map */ generic = allocMap (1,0, 0, 1, 1, 0,0, REG_NAME,' ',GPOINTER); @@ -332,7 +344,7 @@ void allocGlobal ( symbol *sym ) if ( SPEC_SCLS(sym->etype) == S_FIXED || SPEC_SCLS(sym->etype) == S_AUTO ) { /* set the output class */ - SPEC_OCLS(sym->etype) = ( options.model ? xdata : data ) ; + SPEC_OCLS(sym->etype) = port->mem.default_globl_map ; /* generate the symbol */ allocIntoSeg (sym) ; return ; @@ -375,12 +387,6 @@ void allocParms ( value *val ) /* check the declaration */ checkDecl (lval->sym); - // /* if this is a literal e.g. enumerated type */ - // if (IS_LITERAL(lval->etype)) { - // SPEC_OCLS(lval->etype) = SPEC_OCLS(lval->sym->etype) = - // ( options.model ? xdata : data ); - // continue; - //} /* if this a register parm then allocate it as a local variable by adding it to the first block we see in the body */ @@ -439,7 +445,9 @@ void allocParms ( value *val ) first, we will remove it from the overlay segment after the overlay determination has been done */ SPEC_OCLS(lval->etype) = SPEC_OCLS(lval->sym->etype) = - ( options.model ? xdata : (options.noOverlay ? data :overlay )); + ( options.model ? port->mem.default_local_map : + (options.noOverlay ? port->mem.default_local_map + :overlay )); allocIntoSeg(lval->sym); } @@ -504,7 +512,8 @@ void allocLocal ( symbol *sym ) /* if this is a static variable */ if ( IS_STATIC (sym->etype)) { - SPEC_OCLS(sym->etype) = (options.model ? xdata : data ); +/* SPEC_OCLS(sym->etype) = (options.model ? xdata : data ); */ + SPEC_OCLS(sym->etype) = port->mem.default_local_map; allocIntoSeg (sym); sym->allocreq = 1; return ; @@ -604,8 +613,9 @@ void allocLocal ( symbol *sym ) /* again note that we have put it into the overlay segment will remove and put into the 'data' segment if required after overlay analysis has been done */ - SPEC_OCLS(sym->etype) = ( options.model ? xdata : - (options.noOverlay ? data : overlay )) ; + SPEC_OCLS(sym->etype) = ( options.model ? port->mem.default_local_map : + (options.noOverlay ? port->mem.default_local_map + : overlay )) ; allocIntoSeg (sym); } diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index 54c4616b..3f93c923 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -296,8 +296,8 @@ void pointerTypes (link *ptr, link *type) DCL_PTR_CONST(ptr) = 1; DCL_TYPE(ptr) = CPOINTER ; break; - case S_FLASH: - DCL_TYPE(ptr) = FLPOINTER; + case S_EEPROM: + DCL_TYPE(ptr) = EEPPOINTER; break; default: DCL_TYPE(ptr) = GPOINTER; @@ -565,7 +565,7 @@ unsigned int getSize ( link *p ) case PPOINTER: case POINTER: return ( PTRSIZE ) ; - case FLPOINTER: + case EEPPOINTER: case FPOINTER: case CPOINTER: return ( FPTRSIZE ); @@ -620,7 +620,7 @@ unsigned int bitsForType ( link *p ) case PPOINTER: case POINTER: return ( PTRSIZE * 8) ; - case FLPOINTER: + case EEPPOINTER: case FPOINTER: case CPOINTER: return ( FPTRSIZE * 8); @@ -1442,8 +1442,8 @@ void processFuncArgs (symbol *func, int ignoreName) case S_XDATA: DCL_TYPE(val->type) = FPOINTER; break; - case S_FLASH: - DCL_TYPE(val->type) = FLPOINTER; + case S_EEPROM: + DCL_TYPE(val->type) = EEPPOINTER; break; default : DCL_TYPE(val->type) = GPOINTER; @@ -1554,8 +1554,8 @@ void printTypeChain (link *type, FILE *of) if (DCL_PTR_CONST(type)) fprintf(of,"const "); break; - case FLPOINTER: - fprintf (of,"_flash * "); + case EEPPOINTER: + fprintf (of,"_eeprom * "); if (DCL_PTR_CONST(type)) fprintf(of,"const "); break; @@ -1663,7 +1663,7 @@ void cdbTypeInfo (link *type,FILE *of) case PPOINTER: fprintf (of,"DP,"); break; - case FLPOINTER: + case EEPPOINTER: fprintf (of,"DA,"); break; case ARRAY : diff --git a/src/SDCCsymt.h b/src/SDCCsymt.h index 73346afd..d25cd418 100644 --- a/src/SDCCsymt.h +++ b/src/SDCCsymt.h @@ -75,7 +75,7 @@ enum { S_FIXED = 0, S_STACK , S_XSTACK , S_BIT , - S_FLASH }; + S_EEPROM }; /* specifier is the last in the type-chain */ typedef struct specifier { @@ -124,7 +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 */ + EEPPOINTER , /* pointer to eeprom */ ARRAY , FUNCTION }; @@ -278,7 +278,7 @@ typedef struct symbol { DCL_TYPE(x) == GPOINTER || \ DCL_TYPE(x) == IPOINTER || \ DCL_TYPE(x) == PPOINTER || \ - DCL_TYPE(x) == FLPOINTER || \ + DCL_TYPE(x) == EEPPOINTER || \ DCL_TYPE(x) == CPOINTER || \ DCL_TYPE(x) == UPOINTER )) #define IS_PTR_CONST(x) (IS_PTR(x) && DCL_PTR_CONST(x)) diff --git a/src/SDCCval.c b/src/SDCCval.c index 1da5f3ec..c1dff719 100644 --- a/src/SDCCval.c +++ b/src/SDCCval.c @@ -1213,8 +1213,8 @@ value *valForArray (ast *arrExpr) if (SPEC_SCLS(arrExpr->left->etype) == S_IDATA) DCL_TYPE(val->type) = IPOINTER ; else - if (SPEC_SCLS(arrExpr->left->etype) == S_FLASH) - DCL_TYPE(val->type) = FLPOINTER ; + if (SPEC_SCLS(arrExpr->left->etype) == S_EEPROM) + DCL_TYPE(val->type) = EEPPOINTER ; else DCL_TYPE(val->type) = POINTER ; val->type->next = arrExpr->left->ftype; @@ -1282,8 +1282,8 @@ value *valForStructElem(ast *structT, ast *elemT) if (SPEC_SCLS(structT->etype) == S_IDATA) DCL_TYPE(val->type) = IPOINTER ; else - if (SPEC_SCLS(structT->etype) == S_FLASH) - DCL_TYPE(val->type) = FLPOINTER ; + if (SPEC_SCLS(structT->etype) == S_EEPROM) + DCL_TYPE(val->type) = EEPPOINTER ; else DCL_TYPE(val->type) = POINTER ; val->type->next = sym->type; diff --git a/src/mcs51/main.c b/src/mcs51/main.c index e7b3f412..04c158b0 100644 --- a/src/mcs51/main.c +++ b/src/mcs51/main.c @@ -72,6 +72,14 @@ static void _mcs51_finaliseOptions(void) fReturn = fReturn390; fReturnSize = 5; } + + if (options.model) { + port->mem.default_local_map = xdata; + port->mem.default_globl_map = xdata; + } else { + port->mem.default_local_map = data; + port->mem.default_globl_map = data; + } } static void _mcs51_setDefaultOptions(void) @@ -171,7 +179,9 @@ PORT mcs51_port = { "RSEG (DATA)", "GSINIT (CODE)", "OSEG (OVR,DATA)", - "GSFINAL (CODE)" + "GSFINAL (CODE)", + NULL, + NULL }, { +1, 1, 4, 1, 1 diff --git a/src/mcs51/ralloc.c b/src/mcs51/ralloc.c index 80573d3a..4acaf3bf 100644 --- a/src/mcs51/ralloc.c +++ b/src/mcs51/ralloc.c @@ -441,7 +441,6 @@ static symbol *createStackSpil (symbol *sym) { symbol *sloc= NULL; int useXstack, model, noOverlay; - int stackAuto; char slocBuffer[30]; @@ -472,7 +471,7 @@ static symbol *createStackSpil (symbol *sym) /* set the type to the spilling symbol */ sloc->type = copyLinkChain(sym->type); sloc->etype = getSpec(sloc->type); - SPEC_SCLS(sloc->etype) = S_AUTO ; + SPEC_SCLS(sloc->etype) = S_DATA ; SPEC_EXTR(sloc->etype) = 0; /* we don't allow it to be allocated` @@ -486,7 +485,6 @@ static symbol *createStackSpil (symbol *sym) useXstack = options.useXstack; model = options.model; noOverlay = options.noOverlay; - stackAuto = options.stackAuto; options.noOverlay = 1; options.model = options.useXstack = 0; @@ -495,7 +493,6 @@ static symbol *createStackSpil (symbol *sym) options.useXstack = useXstack; options.model = model; options.noOverlay = noOverlay; - options.stackAuto = stackAuto; sloc->isref = 1; /* to prevent compiler warning */ /* if it is on the stack then update the stack */ diff --git a/src/port.h b/src/port.h index 65822832..8b036313 100644 --- a/src/port.h +++ b/src/port.h @@ -57,7 +57,7 @@ typedef struct { int max_base_size; } s; - /** Names for all the memory regions */ + /** memory regions related stuff */ struct { const char *xstack_name; const char *istack_name; @@ -70,6 +70,8 @@ typedef struct { const char *static_name; const char *overlay_name; const char *post_static_name; + struct memmap *default_local_map ; /* default location for auto vars */ + struct memmap *default_globl_map ; /* default location for globl vars*/ } mem; /* stack related information */ diff --git a/src/z80/main.c b/src/z80/main.c index dca80167..b7c4f76b 100644 --- a/src/z80/main.c +++ b/src/z80/main.c @@ -22,6 +22,8 @@ static bool _z80_parseOptions(int *pargc, char **argv, int *i) static void _z80_finaliseOptions(void) { + port->mem.default_local_map = data; + port->mem.default_globl_map = data; } static void _z80_setDefaultOptions(void) @@ -98,7 +100,9 @@ PORT z80_port = { "_RSEG", "_GSINIT", "_OVERLAY", - "_GSFINAL" + "_GSFINAL", + NULL, + NULL }, { -1, 0, 0, 8, 0 -- 2.47.2