git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@161
4a8a32a2-be11-0410-ad9d-
d568d2c75423
13 files changed:
"enum" { count(); return(ENUM); }
"extern" { count(); return(EXTERN); }
"far" { count(); TKEYWORD(XDATA); }
"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); }
"float" { count(); return(FLOAT); }
"for" { count(); return(FOR); }
"goto" { count(); return(GOTO); }
"xdata" { count(); TKEYWORD(XDATA); }
"_data" { count(); TKEYWORD(_NEAR); }
"_code" { count(); TKEYWORD(_CODE); }
"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);}
"_generic" { count(); TKEYWORD(_GENERIC); }
"_near" { count(); TKEYWORD(_NEAR); }
"_xdata" { count(); TKEYWORD(_XDATA);}
%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 <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 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 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 <yyinline> INLINEASM
%token IFX ADDRESS_OF GET_VALUE_AT_ADDRESS SPIL UNSPIL GETHBIT
%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
$$->class = SPECIFIER ;
SPEC_SCLS($$) = S_CODE ;
}
$$->class = SPECIFIER ;
SPEC_SCLS($$) = S_CODE ;
}
$$ = newLink () ;
$$->class = SPECIFIER ;
$$ = newLink () ;
$$->class = SPECIFIER ;
- SPEC_SCLS($$) = S_FLASH ;
+ SPEC_SCLS($$) = S_EEPROM ;
}
| DATA {
$$ = newLink ();
}
| DATA {
$$ = newLink ();
case S_CODE:
DCL_PTR_CONST($3) = 1;
DCL_TYPE($3) = CPOINTER ;
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;
| _IDATA { $$ = newLink() ; DCL_TYPE($$) = IPOINTER ; }
| _NEAR { $$ = NULL ; }
| _GENERIC { $$ = newLink() ; DCL_TYPE($$) = GPOINTER ; }
| _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 ; }
;
| { $$ = newLink() ; DCL_TYPE($$) = UPOINTER ; }
;
if (SPEC_SCLS(tree->left->etype) == S_IDATA)
DCL_TYPE(p) = IPOINTER ;
else
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 ;
else
DCL_TYPE(p) = POINTER ;
if (SPEC_SCLS(expr->left->etype) == S_IDATA)
DCL_TYPE(val->type) = IPOINTER ;
else
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;
else
DCL_TYPE(val->type) = POINTER ;
val->type->next = expr->left->ftype;
if (port->init)
port->init();
if (port->init)
port->init();
setDefaultOptions();
parseCmdLine(argc,argv);
setDefaultOptions();
parseCmdLine(argc,argv);
if (srcFileName) {
initSymt();
if (srcFileName) {
initSymt();
initiCode();
initCSupport ();
initPeepHole();
initiCode();
initCSupport ();
initPeepHole();
*/
sfrbit = allocMap (1,0, 0, 1, 1, 0,0, REG_NAME,'J',0);
*/
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);
/* the unknown map */
generic = allocMap (1,0, 0, 1, 1, 0,0, REG_NAME,' ',GPOINTER);
if ( SPEC_SCLS(sym->etype) == S_FIXED ||
SPEC_SCLS(sym->etype) == S_AUTO ) {
/* set the output class */
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 ;
/* generate the symbol */
allocIntoSeg (sym) ;
return ;
/* check the declaration */
checkDecl (lval->sym);
/* 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 */
/* if this a register parm then allocate
it as a local variable by adding it
to the first block we see in the body */
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) =
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);
}
allocIntoSeg(lval->sym);
}
/* if this is a static variable */
if ( IS_STATIC (sym->etype)) {
/* 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 ;
allocIntoSeg (sym);
sym->allocreq = 1;
return ;
/* 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 */
/* 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 )) ;
DCL_PTR_CONST(ptr) = 1;
DCL_TYPE(ptr) = CPOINTER ;
break;
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;
break;
default:
DCL_TYPE(ptr) = GPOINTER;
case PPOINTER:
case POINTER:
return ( PTRSIZE ) ;
case PPOINTER:
case POINTER:
return ( PTRSIZE ) ;
case FPOINTER:
case CPOINTER:
return ( FPTRSIZE );
case FPOINTER:
case CPOINTER:
return ( FPTRSIZE );
case PPOINTER:
case POINTER:
return ( PTRSIZE * 8) ;
case PPOINTER:
case POINTER:
return ( PTRSIZE * 8) ;
case FPOINTER:
case CPOINTER:
return ( FPTRSIZE * 8);
case FPOINTER:
case CPOINTER:
return ( FPTRSIZE * 8);
case S_XDATA:
DCL_TYPE(val->type) = FPOINTER;
break;
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;
break;
default :
DCL_TYPE(val->type) = GPOINTER;
if (DCL_PTR_CONST(type))
fprintf(of,"const ");
break;
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;
if (DCL_PTR_CONST(type))
fprintf(of,"const ");
break;
case PPOINTER:
fprintf (of,"DP,");
break;
case PPOINTER:
fprintf (of,"DP,");
break;
fprintf (of,"DA,");
break;
case ARRAY :
fprintf (of,"DA,");
break;
case ARRAY :
S_STACK ,
S_XSTACK ,
S_BIT ,
S_STACK ,
S_XSTACK ,
S_BIT ,
/* specifier is the last in the type-chain */
typedef struct specifier {
/* specifier is the last in the type-chain */
typedef struct specifier {
PPOINTER , /* paged area pointer */
IPOINTER , /* pointer to upper 128 bytes */
UPOINTER , /* unknown pointer used only when parsing */
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 */
DCL_TYPE(x) == GPOINTER || \
DCL_TYPE(x) == IPOINTER || \
DCL_TYPE(x) == PPOINTER || \
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))
DCL_TYPE(x) == CPOINTER || \
DCL_TYPE(x) == UPOINTER ))
#define IS_PTR_CONST(x) (IS_PTR(x) && DCL_PTR_CONST(x))
if (SPEC_SCLS(arrExpr->left->etype) == S_IDATA)
DCL_TYPE(val->type) = IPOINTER ;
else
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;
else
DCL_TYPE(val->type) = POINTER ;
val->type->next = arrExpr->left->ftype;
if (SPEC_SCLS(structT->etype) == S_IDATA)
DCL_TYPE(val->type) = IPOINTER ;
else
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;
else
DCL_TYPE(val->type) = POINTER ;
val->type->next = sym->type;
fReturn = fReturn390;
fReturnSize = 5;
}
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)
}
static void _mcs51_setDefaultOptions(void)
"RSEG (DATA)",
"GSINIT (CODE)",
"OSEG (OVR,DATA)",
"RSEG (DATA)",
"GSINIT (CODE)",
"OSEG (OVR,DATA)",
+ "GSFINAL (CODE)",
+ NULL,
+ NULL
{
symbol *sloc= NULL;
int useXstack, model, noOverlay;
{
symbol *sloc= NULL;
int useXstack, model, noOverlay;
/* set the type to the spilling symbol */
sloc->type = copyLinkChain(sym->type);
sloc->etype = getSpec(sloc->type);
/* 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`
SPEC_EXTR(sloc->etype) = 0;
/* we don't allow it to be allocated`
useXstack = options.useXstack;
model = options.model;
noOverlay = options.noOverlay;
useXstack = options.useXstack;
model = options.model;
noOverlay = options.noOverlay;
- stackAuto = options.stackAuto;
options.noOverlay = 1;
options.model = options.useXstack = 0;
options.noOverlay = 1;
options.model = options.useXstack = 0;
options.useXstack = useXstack;
options.model = model;
options.noOverlay = noOverlay;
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 */
sloc->isref = 1; /* to prevent compiler warning */
/* if it is on the stack then update the stack */
- /** Names for all the memory regions */
+ /** memory regions related stuff */
struct {
const char *xstack_name;
const char *istack_name;
struct {
const char *xstack_name;
const char *istack_name;
const char *static_name;
const char *overlay_name;
const char *post_static_name;
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 */
} mem;
/* stack related information */
static void _z80_finaliseOptions(void)
{
static void _z80_finaliseOptions(void)
{
+ port->mem.default_local_map = data;
+ port->mem.default_globl_map = data;
}
static void _z80_setDefaultOptions(void)
}
static void _z80_setDefaultOptions(void)
"_RSEG",
"_GSINIT",
"_OVERLAY",
"_RSEG",
"_GSINIT",
"_OVERLAY",
+ "_GSFINAL",
+ NULL,
+ NULL