From 0abb805fd2d72a89b41a10144ded610ebfc072bc Mon Sep 17 00:00:00 2001 From: michaelh Date: Tue, 1 Aug 2000 03:22:21 +0000 Subject: [PATCH] Pre 2.95-2 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@315 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- Makefile | 2 + as/z80/asdata.c | 4 +- as/z80/asexpr.c | 10 +- as/z80/aslex.c | 16 +-- as/z80/aslist.c | 4 +- as/z80/asm.h | 2 +- as/z80/asmain.c | 10 +- as/z80/asout.c | 22 ++-- as/z80/assubr.c | 2 +- as/z80/assym.c | 14 +-- as/z80/z80adr.c | 70 ++++++------ as/z80/z80mch.c | 2 +- as/z80/z80pst.c | 232 +++++++++++++++++++-------------------- link/z80/aslink.h | 2 +- link/z80/lkarea.c | 4 +- link/z80/lkeval.c | 10 +- link/z80/lkhead.c | 2 +- link/z80/lklex.c | 18 +-- link/z80/lklibr.c | 2 +- link/z80/lklist.c | 8 +- link/z80/lkmain.c | 19 ++-- link/z80/lkrloc.c | 4 +- link/z80/lksym.c | 15 +-- src/Makefile.in | 5 +- src/SDCC.lex | 1 + src/SDCC.y | 15 ++- src/SDCCast.c | 3 +- src/SDCCerr.c | 3 + src/SDCCerr.h | 3 + src/SDCCglobl.h | 17 ++- src/SDCCglue.c | 4 +- src/SDCCmain.c | 37 ++++++- src/SDCCmem.c | 2 +- src/SDCCsymt.c | 3 +- src/SDCCsymt.h | 12 +- src/avr/main.c | 2 + src/mcs51/main.c | 2 + src/port.h | 3 + src/z80/gen.c | 14 ++- src/z80/main.c | 5 + support/scripts/mega.mak | 21 ++-- 41 files changed, 352 insertions(+), 274 deletions(-) diff --git a/Makefile b/Makefile index 81db02c1..095b3dfb 100644 --- a/Makefile +++ b/Makefile @@ -48,6 +48,8 @@ sdcc: sdcc-cc sdcc-aslink sdcc-misc sdcc-device # Some interesting sub rules sdcc-bin: sdcc-cc sdcc-aslink sdcc-misc +sdcc-base: sdcc-cc sdcc-aslink + # Compiling and installing everything and runing test # --------------------------------------------------- install: diff --git a/as/z80/asdata.c b/as/z80/asdata.c index 1d1851dd..eaff461a 100644 --- a/as/z80/asdata.c +++ b/as/z80/asdata.c @@ -178,7 +178,7 @@ struct mne *mnehash[NHASH]; * }; */ struct sym sym[] = { - NULL, NULL, ".", S_USER, S_END, NULL, 0, 0 + { NULL, NULL, ".", S_USER, S_END, NULL, 0, } }; struct sym *symp; /* pointer to a symbol structure @@ -212,7 +212,7 @@ struct sym *symhash[NHASH]; /* array of pointers to NHASH * }; */ struct area area[] = { - NULL, "_CODE", 0, 0, 0, A_CON|A_REL + { NULL, "_CODE", 0, 0, 0, A_CON|A_REL } }; struct area *areap; /* pointer to an area structure diff --git a/as/z80/asexpr.c b/as/z80/asexpr.c index f610022e..009e3e1e 100644 --- a/as/z80/asexpr.c +++ b/as/z80/asexpr.c @@ -84,7 +84,7 @@ expr(esp, n) register struct expr *esp; int n; { - register c, d, p; + register int c, d, p; struct area *ap; struct expr re; @@ -268,7 +268,7 @@ VOID term(esp) register struct expr *esp; { - register c, n; + register int c, n; register char *jp; char id[NCPS]; struct sym *sp; @@ -347,7 +347,7 @@ register struct expr *esp; if (ctype[c] & DIGIT) { esp->e_mode = S_USER; jp = ip; - while (ctype[*jp] & RAD10) { + while (ctype[*jp] & RAD10) { jp++; } if (*jp == '$') { @@ -498,7 +498,7 @@ register struct expr *esp; int digit(c, r) -register c, r; +register int c, r; { if (r == 16) { if (ctype[c] & RAD16) { @@ -619,7 +619,7 @@ register struct expr *esp; int oprio(c) -register c; +register int c; { if (c == '*' || c == '/' || c == '%') return (10); diff --git a/as/z80/aslex.c b/as/z80/aslex.c index 3fadd787..49a395f9 100644 --- a/as/z80/aslex.c +++ b/as/z80/aslex.c @@ -84,7 +84,7 @@ VOID getid(id, c) -register c; +register int c; char *id; { register char *p; @@ -150,7 +150,7 @@ char *id; VOID getst(id, c) -register c; +register int c; char *id; { register char *p; @@ -193,7 +193,7 @@ char *id; char getnb() { - register c; + register int c; while ((c=get()) == ' ' || c == '\t') ; @@ -226,7 +226,7 @@ getnb() char get() { - register c; + register int c; if ((c = *ip) != 0) ++ip; @@ -302,7 +302,7 @@ unget(c) int getmap(d) { - register c, n, v; + register int c, n, v; if ((c=get()) == '\0') qerr(); @@ -403,7 +403,7 @@ getmap(d) int getline() { -register i; +register int i; loop: if (incfil >= 0) { if (fgets(ib, sizeof ib, ifp[incfil]) == NULL) { @@ -461,7 +461,7 @@ loop: if (incfil >= 0) { int more() { - register c; + register int c; c = getnb(); unget(c); @@ -493,7 +493,7 @@ more() char endline() { - register c; + register int c; c = getnb(); return( (c == '\0' || c == ';') ? 0 : c ); diff --git a/as/z80/aslist.c b/as/z80/aslist.c index 845f728d..e0e29f3a 100644 --- a/as/z80/aslist.c +++ b/as/z80/aslist.c @@ -78,7 +78,7 @@ list() { register char *wp; register int *wpt; - register nb; + register int nb; if (lfp == NULL || lmode == NLIST) return; @@ -354,7 +354,7 @@ list1(wp, wpt, nb, f) register char *wp; register int *wpt, nb, f; { - register i; + register int i; /* * HEX output Option. diff --git a/as/z80/asm.h b/as/z80/asm.h index 58db9faf..1ad722ec 100644 --- a/as/z80/asm.h +++ b/as/z80/asm.h @@ -512,7 +512,7 @@ extern char * strncpy(); extern FILE * afile(); extern VOID asexit(); extern VOID asmbl(); -extern VOID main(); +extern int main(); extern VOID newdot(); extern VOID phase(); extern VOID usage(); diff --git a/as/z80/asmain.c b/as/z80/asmain.c index 6e1aec7c..a74d7648 100644 --- a/as/z80/asmain.c +++ b/as/z80/asmain.c @@ -152,11 +152,11 @@ * REL, LST, and/or SYM files may be generated. */ -VOID +int main(int argc, char **argv) { register char *p; - register c, i; + register int c, i; struct area *ap; #ifdef SDK @@ -320,6 +320,8 @@ main(int argc, char **argv) lstsym(lfp); } asexit(aserr); + /* Never reached */ + return 0; } /*)Function VOID asexit(i) @@ -463,7 +465,7 @@ asmbl() register struct mne *mp; register struct sym *sp; register struct tsym *tp; - register c; + register int c; struct area *ap; struct expr e1; char id[NCPS]; @@ -1021,7 +1023,7 @@ char *ft; int wf; { register char *p1, *p2, *p3; - register c; + register int c; FILE *fp; p1 = fn; diff --git a/as/z80/asout.c b/as/z80/asout.c index eaf066fc..e91ba04b 100644 --- a/as/z80/asout.c +++ b/as/z80/asout.c @@ -312,7 +312,7 @@ outrb(esp, r) register struct expr *esp; int r; { - register n; + register int n; if (pass == 2) { if (esp->e_flag==0 && esp->e_base.e_ap==NULL) { @@ -383,7 +383,7 @@ outrw(esp, r) register struct expr *esp; int r; { - register n; + register int n; if (pass == 2) { if (esp->e_flag==0 && esp->e_base.e_ap==NULL) { @@ -456,7 +456,7 @@ outdp(carea, esp) register struct area *carea; register struct expr *esp; { - register n, r; + register int n, r; if (oflag && pass==2) { outchk(HUGE,HUGE); @@ -670,7 +670,7 @@ outgsd() { register struct area *ap; register struct sym *sp; - register i, j; + register int i, j; char *ptr; int c, narea, nglob, rn; @@ -786,7 +786,7 @@ outarea(ap) register struct area *ap; { register char *ptr; - register c; + register int c; fprintf(ofp, "A "); ptr = &ap->a_id[0]; @@ -834,7 +834,7 @@ outsym(sp) register struct sym *sp; { register char *ptr; - register c; + register int c; fprintf(ofp, "S "); ptr = &sp->s_id[0]; @@ -879,7 +879,7 @@ register struct sym *sp; VOID out(p, n) register char *p; -register n; +register int n; { while (n--) { if (xflag == 0) { @@ -919,7 +919,7 @@ register n; VOID out_lb(b,t) -register b,t; +register int b,t; { if (cp < &cb[NCODE]) { *cp++ = b; @@ -952,7 +952,7 @@ register b,t; VOID out_lw(n,t) -register n,t; +register int n,t; { if (hilo) { out_lb(hibyte(n),t ? t|R_HIGH : 0); @@ -986,7 +986,7 @@ register n,t; VOID out_rw(n) -register n; +register int n; { if (hilo) { *relp++ = hibyte(n); @@ -1020,7 +1020,7 @@ register n; VOID out_tw(n) -register n; +register int n; { if (hilo) { *txtp++ = hibyte(n); diff --git a/as/z80/assubr.c b/as/z80/assubr.c index 7302a4ff..132f2387 100644 --- a/as/z80/assubr.c +++ b/as/z80/assubr.c @@ -59,7 +59,7 @@ VOID err(c) -register c; +register int c; { register char *p; diff --git a/as/z80/assym.c b/as/z80/assym.c index 8b8a6ae1..cc7c08f7 100644 --- a/as/z80/assym.c +++ b/as/z80/assym.c @@ -80,7 +80,7 @@ syminit() struct mne **mpp; register struct sym *sp; struct sym **spp; - register h; + register int h; mpp = &mnehash[0]; while (mpp < &mnehash[NHASH]) @@ -176,7 +176,7 @@ mlookup(id) char *id; { register struct mne *mp; - register h; + register int h; h = hash(id); mp = mnehash[h]; @@ -221,7 +221,7 @@ lookup(id) char *id; { register struct sym *sp; - register h; + register int h; h = hash(id); sp = symhash[h]; @@ -268,7 +268,7 @@ VOID symglob() { register struct sym *sp; - register i; + register int i; for (i=0; if_type == F_STD) @@ -530,7 +530,7 @@ loop: if (pflag && cfp && cfp->f_type == F_STD) int more() { - register c; + register int c; c = getnb(); unget(c); @@ -562,7 +562,7 @@ more() char endline() { - register c; + register int c; c = getnb(); return( (c == '\0' || c == ';') ? 0 : c ); diff --git a/link/z80/lklibr.c b/link/z80/lklibr.c index b6cd1bd2..14c9ee04 100644 --- a/link/z80/lklibr.c +++ b/link/z80/lklibr.c @@ -289,7 +289,7 @@ VOID search() { register struct sym *sp; - register i,symfnd; + register int i, symfnd; /* * Look for undefined symbols. Keep diff --git a/link/z80/lklist.c b/link/z80/lklist.c index 4f907ff7..bea53725 100644 --- a/link/z80/lklist.c +++ b/link/z80/lklist.c @@ -60,7 +60,7 @@ VOID slew(fp) FILE *fp; { - register i; + register int i; if (lop++ >= NLPP) { newpag(fp); @@ -334,10 +334,8 @@ struct area *xp; #else VOID lstarea(struct area *xp) { - register struct area *op; register struct areax *oxp; - register c, i, j; - register char *ptr; + register int i, j; int nmsym; addr_t a0, ai, aj; struct sym *sp; @@ -678,7 +676,7 @@ VOID lstareatosym(struct area *xp) { /* Output the current area symbols to a NO$GMB .sym file */ register struct areax *oxp; - register i, j; + register int i, j; int nmsym; addr_t a0, ai; struct sym *sp; diff --git a/link/z80/lkmain.c b/link/z80/lkmain.c index e92f5994..ddff705e 100644 --- a/link/z80/lkmain.c +++ b/link/z80/lkmain.c @@ -157,12 +157,12 @@ char *default_globlp[] = { }; #endif /* GAMEBOY */ -VOID +int main(argc, argv) char *argv[]; { register char *p; - register c, i; + register int c, i; #ifdef GAMEBOY nb_rom_banks = 2; @@ -449,7 +449,7 @@ int i; VOID link() { - register c; + register int c; if ((c=endline()) == 0) { return; } switch (c) { @@ -681,7 +681,6 @@ map() #else VOID map() { - register i; register struct head *hdp; register struct lbfile *lbfh; @@ -774,10 +773,6 @@ VOID map() #ifdef SDK VOID sym() { - register i; - register struct head *hdp; - register struct lbfile *lbfh; - /* * Open sym File */ @@ -849,7 +844,7 @@ VOID sym() int parse() { - register c; + register int c; char fid[NINPUT]; while ((c = getnb()) != 0) { @@ -1088,7 +1083,7 @@ bassav() VOID setbas() { - register v; + register int v; char id[NCPS]; bsp = basep; @@ -1198,7 +1193,7 @@ gblsav() VOID setgbl() { - register v; + register int v; register struct sym *sp; char id[NCPS]; @@ -1280,7 +1275,7 @@ char *fn; char *ft; { register char *p1, *p2, *p3; - register c; + register int c; FILE *fp; char fb[FILSPC]; diff --git a/link/z80/lkrloc.c b/link/z80/lkrloc.c index d5873e05..847e070f 100644 --- a/link/z80/lkrloc.c +++ b/link/z80/lkrloc.c @@ -248,7 +248,7 @@ relt() VOID relr() { - register mode; + register int mode; register addr_t reli, relv; int aindex, rindex, rtp, error; addr_t r, rtbase, rtofst, paga, pags, pc; @@ -507,7 +507,7 @@ char *errmsg[] = { VOID relp() { - register aindex, rindex; + register int aindex, rindex; int mode, rtp; addr_t relv; struct areax **a; diff --git a/link/z80/lksym.c b/link/z80/lksym.c index 03b96b92..95452474 100644 --- a/link/z80/lksym.c +++ b/link/z80/lksym.c @@ -56,7 +56,7 @@ VOID syminit() { - register h; + register int h; struct sym **spp; spp = &symhash[0]; @@ -124,7 +124,7 @@ syminit() struct sym * newsym() { - register c, i, nglob; + register int c, i, nglob; struct sym *tsp; struct sym **s; char id[NCPS]; @@ -176,6 +176,7 @@ newsym() } fprintf(stderr, "Header symbol list overflow\n"); lkexit(1); + /* Never reached */ } /*)Function sym * lkpsym(id,f) @@ -214,7 +215,7 @@ lkpsym(id, f) char *id; { register struct sym *sp; - register h; + register int h; h = hash(id); sp = symhash[h]; @@ -298,7 +299,7 @@ symdef(fp) FILE *fp; { register struct sym *sp; - register i; + register int i; for (i=0; i SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN %token XOR_ASSIGN OR_ASSIGN %token TYPEDEF EXTERN STATIC AUTO REGISTER CODE EEPROM INTERRUPT SFR AT SBIT -%token REENTRANT USING XDATA DATA IDATA PDATA VAR_ARGS CRITICAL NONBANKED +%token REENTRANT USING XDATA DATA IDATA PDATA VAR_ARGS CRITICAL NONBANKED BANKED %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 _EEPROM %token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN @@ -168,6 +168,19 @@ using_reentrant_interrupt | NONBANKED {$$ = newLink (); $$->class = SPECIFIER ; SPEC_NONBANKED($$) = 1; + if (SPEC_BANKED($$)) { + werror(W_BANKED_WITH_NONBANKED); + } + } + | BANKED {$$ = newLink (); + $$->class = SPECIFIER ; + SPEC_BANKED($$) = 1; + if (SPEC_NONBANKED($$)) { + werror(W_BANKED_WITH_NONBANKED); + } + if (SPEC_STAT($$)) { + werror(W_BANKED_WITH_STATIC); + } } | Interrupt_storage { diff --git a/src/SDCCast.c b/src/SDCCast.c index 89cdcdab..bf8f2f60 100644 --- a/src/SDCCast.c +++ b/src/SDCCast.c @@ -3543,8 +3543,9 @@ ast *createFunction (symbol *name, ast *body ) we need to add the name to the publics list : this actually means we are now compiling the compiler support routine */ - if (name->cdef) + if (name->cdef) { addSet(&publics,name); + } } else { addSymChain(name); diff --git a/src/SDCCerr.c b/src/SDCCerr.c index 9bd37c6b..eb464c6f 100644 --- a/src/SDCCerr.c +++ b/src/SDCCerr.c @@ -146,6 +146,9 @@ struct { { WARNING,"warning *** unknown memory model at %s : %d\n" }, { ERROR ,"error *** cannot generate code for target '%s'\n"}, { WARNING,"warning *** Indirect call to a banked function not implemented.\n"}, +{ WARNING,"warning *** Model '%s' not supported for %s, ignored.\n"}, +{ WARNING,"warning *** Both banked and nonbanked attributes used. nonbanked wins.\n"}, +{ WARNING,"warning *** Both banked and static used. static wins.\n"}, }; /****************************************************************************/ diff --git a/src/SDCCerr.h b/src/SDCCerr.h index d5d82190..cb8472bd 100644 --- a/src/SDCCerr.h +++ b/src/SDCCerr.h @@ -133,5 +133,8 @@ #define W_UNKNOWN_MODEL 130 /* Unknown memory model */ #define E_UNKNOWN_TARGET 131 /* target not defined */ #define W_INDIR_BANKED 132 /* Indirect call to a banked fun */ +#define W_UNSUPPORTED_MODEL 133 /* Unsupported model, ignored */ +#define W_BANKED_WITH_NONBANKED 134 /* banked and nonbanked attributes mixed */ +#define W_BANKED_WITH_STATIC 135 /* banked and static mixed */ void werror(int, ...); diff --git a/src/SDCCglobl.h b/src/SDCCglobl.h index 000722ff..1c417dec 100644 --- a/src/SDCCglobl.h +++ b/src/SDCCglobl.h @@ -170,14 +170,21 @@ struct optimize { unsigned noLoopReverse :1; } ; -/* Values for options.model. */ -#define MODEL_SMALL 0 -#define MODEL_LARGE 1 -#define MODEL_FLAT24 2 +/** Build model. + Used in options.model.A bit each as port.supported_models is an OR + of these. +*/ +enum { + MODEL_SMALL = 1, + MODEL_COMPACT = 2, + MODEL_MEDIUM = 4, + MODEL_LARGE = 8, + MODEL_FLAT24 = 16 +}; /* other command line options */ struct options { - int model : 3 ; /* see MODEL_* defines above */ + int model; ; /* see MODEL_* defines above */ int stackAuto : 3 ; /* Stack Automatic */ int useXstack : 3 ; /* use Xternal Stack */ int stack10bit : 3; /* use 10 bit stack (flat24 model only) */ diff --git a/src/SDCCglue.c b/src/SDCCglue.c index 6b76e1d5..448034e8 100644 --- a/src/SDCCglue.c +++ b/src/SDCCglue.c @@ -178,8 +178,10 @@ static void emitRegularMap (memmap * map, bool addPublics, bool arFlag) if ((sym->level == 0 || (sym->_isparm && !IS_REGPARM(sym->etype))) && addPublics && - !IS_STATIC (sym->etype)) + !IS_STATIC (sym->etype) && + (sym->used || sym->fbody)) { addSetHead (&publics, sym); + } /* if extern then do nothing or is a function then do nothing */ diff --git a/src/SDCCmain.c b/src/SDCCmain.c index 7adc16ae..4e32a37e 100644 --- a/src/SDCCmain.c +++ b/src/SDCCmain.c @@ -74,7 +74,10 @@ bool verboseExec = FALSE; //extern int wait (int *); char *preOutName; +/* Far functions, far data */ #define OPTION_LARGE_MODEL "-model-large" +/* Far functions, near data */ +#define OPTION_MEDIUM_MODEL "-model-medium" #define OPTION_SMALL_MODEL "-model-small" #define OPTION_FLAT24_MODEL "-model-flat24" #define OPTION_STACK_AUTO "-stack-auto" @@ -248,8 +251,11 @@ void printVersionInfo () "SDCC : "); for (i=0; itarget); - - fprintf(stderr, " %s `" + fprintf(stderr, " %s" +#ifdef SDCC_SUB_VERSION_STR + "/" SDCC_SUB_VERSION_STR +#endif + " ` " #ifdef __CYGWIN32__ " (CYGWIN32)\n" #else @@ -259,6 +265,7 @@ void printVersionInfo () " (UNIX) \n" # endif #endif + , VersionString ); } @@ -340,6 +347,7 @@ static void setDefaultOptions() options.idata_loc = 0x80; options.genericPtr = 1; /* default on */ options.nopeep = 0; + options.model = port->general.default_model; /* now for the optimizations */ /* turn on the everything */ @@ -458,6 +466,14 @@ static void _addToList(const char **list, const char *str) *(++list) = NULL; } +static void _setModel(int model, const char *sz) +{ + if (port->general.supported_models & model) + options.model = model; + else + werror(W_UNSUPPORTED_MODEL, sz, port->target); +} + /*-----------------------------------------------------------------*/ /* parseCmdLine - parses the command line and sets the options */ /*-----------------------------------------------------------------*/ @@ -485,17 +501,22 @@ int parseCmdLine ( int argc, char **argv ) } if (strcmp(&argv[i][1],OPTION_LARGE_MODEL) == 0) { - options.model = MODEL_LARGE; + _setModel(MODEL_LARGE, argv[i]); + continue; + } + + if (strcmp(&argv[i][1],OPTION_MEDIUM_MODEL) == 0) { + _setModel(MODEL_MEDIUM, argv[i]); continue; } if (strcmp(&argv[i][1],OPTION_SMALL_MODEL) == 0) { - options.model = MODEL_SMALL; + _setModel(MODEL_SMALL, argv[i]); continue; } if (strcmp(&argv[i][1],OPTION_FLAT24_MODEL) == 0) { - options.model = MODEL_FLAT24; + _setModel(MODEL_FLAT24, argv[i]); continue; } @@ -1232,6 +1253,12 @@ static int preProcess (char **envp) case MODEL_SMALL: _addToList(preArgv, "-DSDCC_MODEL_SMALL"); break; + case MODEL_COMPACT: + _addToList(preArgv, "-DSDCC_MODEL_COMPACT"); + break; + case MODEL_MEDIUM: + _addToList(preArgv, "-DSDCC_MODEL_MEDIUM"); + break; case MODEL_FLAT24: _addToList(preArgv, "-DSDCC_MODEL_FLAT24"); break; diff --git a/src/SDCCmem.c b/src/SDCCmem.c index 662f04bb..ca4eff72 100644 --- a/src/SDCCmem.c +++ b/src/SDCCmem.c @@ -444,7 +444,7 @@ void allocParms ( value *val ) /* PENDING: isr, bank overhead, ... */ SPEC_STAK(lval->etype) = SPEC_STAK(lval->sym->etype) = lval->sym->stack = stackPtr + - (IS_BANKED(currFunc->etype) ? port->stack.banked_overhead : 0) + + (IS_BANKEDCALL(currFunc->etype) ? port->stack.banked_overhead : 0) + (IS_ISR(currFunc->etype) ? port->stack.isr_overhead : 0) + 0; stackPtr += getSize (lval->type); diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index c2addb57..33585fdd 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -1372,8 +1372,9 @@ int checkFunction (symbol *sym) deleteSym (SymbolTab,csym,csym->name); addSym (SymbolTab,sym,sym->name,sym->level,sym->block); if (IS_EXTERN(csym->etype) && ! - IS_EXTERN(sym->etype)) + IS_EXTERN(sym->etype)) { addSet(&publics,sym); + } return 1 ; } diff --git a/src/SDCCsymt.h b/src/SDCCsymt.h index ad908cf9..36e361d8 100644 --- a/src/SDCCsymt.h +++ b/src/SDCCsymt.h @@ -101,7 +101,8 @@ typedef struct specifier { unsigned _typedef :1 ; /* is typedefed */ unsigned _isregparm:1 ; /* is the first parameter */ unsigned _isenum :1 ; /* is an enumerated type */ - unsigned nonbanked :1 ; /* function has the nonbanked attribute */ + unsigned nonbanked :1 ; /* function has the nonbanked attribute */ + unsigned banked :1 ; /* function has the banked attribute */ unsigned _IntNo ; /* 1=Interrupt svc routine */ short _regbank ; /* register bank 2b used */ unsigned _addr ; /* address of symbol */ @@ -280,6 +281,7 @@ typedef struct symbol { #define SPEC_TYPEDEF(x) x->select.s._typedef #define SPEC_REGPARM(x) x->select.s._isregparm #define SPEC_NONBANKED(x) x->select.s.nonbanked +#define SPEC_BANKED(x) x->select.s.banked /* type check macros */ #define IS_DECL(x) ( x && x->class == DECLARATOR ) @@ -324,11 +326,11 @@ typedef struct symbol { #define IS_ARITHMETIC(x) (IS_INTEGRAL(x) || IS_FLOAT(x)) #define IS_AGGREGATE(x) (IS_ARRAY(x) || IS_STRUCT(x)) #define IS_LITERAL(x) (IS_SPEC(x) && x->select.s.sclass == S_LITERAL) -#define IS_ISR(x) (IS_SPEC(x) && SPEC_INTRTN(x)) +#define IS_ISR(x) (IS_SPEC(x) && SPEC_INTRTN(x)) #define IS_REGPARM(x) (IS_SPEC(x) && SPEC_REGPARM(x)) -#define IS_NONBANKED(x) (IS_SPEC(x) && SPEC_NONBANKED(x)) -/* Note that !IS_BANKED is not IS_NONBANKED */ -#define IS_BANKED(x) (IS_SPEC(x) && !SPEC_NONBANKED(x) && !SPEC_STAT(x)) +#define IS_NONBANKED(x) (IS_SPEC(x) && SPEC_NONBANKED(x)) +#define IS_BANKED(x) (IS_SPEC(x) && SPEC_BANKED(x)) +#define IS_BANKEDCALL(x) (IS_SPEC(x) && !SPEC_NONBANKED(x) && !SPEC_STAT(x) && (options.model == MODEL_LARGE || options.model == MODEL_MEDIUM || SPEC_BANKED(x))) /* forward declaration for the global vars */ extern bucket *SymbolTab[] ; diff --git a/src/avr/main.c b/src/avr/main.c index 57c0aece..45be337b 100644 --- a/src/avr/main.c +++ b/src/avr/main.c @@ -140,6 +140,8 @@ PORT avr_port = { "ATMEL AVR", /* Target name */ { TRUE, /* Emit glue around main */ + MODEL_LARGE | MODEL_SMALL, + MODEL_SMALL }, { _asmCmd, diff --git a/src/mcs51/main.c b/src/mcs51/main.c index 9bfed563..eded0bfe 100644 --- a/src/mcs51/main.c +++ b/src/mcs51/main.c @@ -197,6 +197,8 @@ PORT mcs51_port = { "MCU 8051", /* Target name */ { TRUE, /* Emit glue around main */ + MODEL_SMALL | MODEL_LARGE | MODEL_FLAT24, + MODEL_SMALL }, { _asmCmd, diff --git a/src/port.h b/src/port.h index 0b142f87..65cfc29d 100644 --- a/src/port.h +++ b/src/port.h @@ -20,6 +20,9 @@ typedef struct { code is provided by a seperate module. */ bool glue_up_main; + /* OR of MODEL_* */ + int supported_models; + int default_model; } general; /* assembler related information */ diff --git a/src/z80/gen.c b/src/z80/gen.c index ddee57b4..e33f3281 100644 --- a/src/z80/gen.c +++ b/src/z80/gen.c @@ -1680,9 +1680,6 @@ static void emitCall(iCode *ic, bool ispcall) int pushed_de = 0; link *detype = getSpec(operandType(IC_LEFT(ic))); - if (IS_BANKED(detype)) - emit2("; call to a banked function"); - /* if caller saves & we have not saved then */ if (!ic->regsSaved) { /* PENDING */ @@ -1753,7 +1750,7 @@ static void emitCall(iCode *ic, bool ispcall) } if (ispcall) { - if (IS_BANKED(detype)) { + if (IS_BANKEDCALL(detype)) { werror(W_INDIR_BANKED); } aopOp(IC_LEFT(ic),ic,FALSE, FALSE); @@ -1780,7 +1777,7 @@ static void emitCall(iCode *ic, bool ispcall) char *name = OP_SYMBOL(IC_LEFT(ic))->rname[0] ? OP_SYMBOL(IC_LEFT(ic))->rname : OP_SYMBOL(IC_LEFT(ic))->name; - if (IS_BANKED(detype)) { + if (IS_BANKEDCALL(detype)) { emit2("call banked_call"); emit2("!dws", name); emit2("!dw !bankimmeds", name); @@ -1870,6 +1867,8 @@ static int resultRemat (iCode *ic) return 0; } +extern set *publics; + /*-----------------------------------------------------------------*/ /* genFunction - generated code for function entry */ /*-----------------------------------------------------------------*/ @@ -1881,6 +1880,11 @@ static void genFunction (iCode *ic) nregssaved = 0; setArea(IS_NONBANKED(sym->etype)); + /* PENDING: hack */ + if (!IS_STATIC(sym->etype)) { + addSetIfnotP(&publics, sym); + } + /* create the function header */ emit2("!functionheader", sym->name); /* PENDING: portability. */ diff --git a/src/z80/main.c b/src/z80/main.c index 8254ac8c..53f09786 100644 --- a/src/z80/main.c +++ b/src/z80/main.c @@ -28,6 +28,7 @@ static struct { static char *_keywords[] = { "sfr", "nonbanked", + "banked", NULL }; @@ -282,6 +283,8 @@ PORT z80_port = { "Zilog Z80", /* Target name */ { FALSE, + MODEL_MEDIUM | MODEL_SMALL, + MODEL_SMALL }, { _z80_asmCmd, @@ -346,6 +349,8 @@ PORT gbz80_port = { "Gameboy Z80-like", /* Target name */ { FALSE, + MODEL_MEDIUM | MODEL_SMALL, + MODEL_SMALL }, { _gbz80_asmCmd, diff --git a/support/scripts/mega.mak b/support/scripts/mega.mak index af1d522a..9f8d0190 100644 --- a/support/scripts/mega.mak +++ b/support/scripts/mega.mak @@ -7,7 +7,9 @@ # * Takes the libs from native and hooks them into win32 # * tars it all up and calls it done -BUILD_DIR = /home/michaelh/tmp/sdcc-build +DIST = gbdk + +BUILD_DIR = /home/michaelh/tmp/$(DIST)-build NATIVE = linux-linux CROSS = linux-mingw32 NATIVE_DIST = linux-glibc2 @@ -25,12 +27,12 @@ spawn: build: orig native cross dist dist: - cd $(NATIVE)/build; tar czf ../../sdcc-$(VER)-$(NATIVE_DIST).tar.gz sdcc + cd $(NATIVE)/build; tar czf ../../$(DIST)-$(VER)-$(NATIVE_DIST).tar.gz $(DIST) ifeq ($(CROSS_DIST), win32) - rm -f sdcc-$(VER)-$(CROSS_DIST).zip - cd $(CROSS)/build; zip -rlq9 ../../sdcc-$(VER)-$(CROSS_DIST).zip sdcc + rm -f $(DIST)-$(VER)-$(CROSS_DIST).zip + cd $(CROSS)/build; zip -rlq9 ../../$(DIST)-$(VER)-$(CROSS_DIST).zip $(DIST) else - cd $(CROSS)/build; tar czf ../../sdcc-$(VER)-$(CROSS_DIST).tar.gz sdcc + cd $(CROSS)/build; tar czf ../../$(DIST)-$(VER)-$(CROSS_DIST).tar.gz $(DIST) endif clean: @@ -42,7 +44,6 @@ orig: touch orig/logged_in # Assume already logged in make -C orig -f build.mak update - linux-linux: orig mkdir -p linux-linux (cd orig; tar cf - .) | (cd linux-linux; tar xf -) @@ -67,9 +68,9 @@ cross-bin: $(CROSS) dummy # Binary files are compiled; now copy the built libs from the native # version across cross-mix: - mv $(CROSS)/build/sdcc/bin $(CROSS)/build/sdcc/bin.1 - (cd $(NATIVE); tar cf - build/sdcc) | (cd $(CROSS); tar xf - ) - rm -rf $(CROSS)/build/sdcc/bin - mv $(CROSS)/build/sdcc/bin.1 $(CROSS)/build/sdcc/bin + mv $(CROSS)/build/$(DIST)/bin $(CROSS)/build/$(DIST)/bin.1 + (cd $(NATIVE); tar cf - build/$(DIST)) | (cd $(CROSS); tar xf - ) + rm -rf $(CROSS)/build/$(DIST)/bin + mv $(CROSS)/build/$(DIST)/bin.1 $(CROSS)/build/$(DIST)/bin cross: cross-bin cross-mix -- 2.47.2