Use 'ao-dbg' instead of 's51' to communicate with TeleMetrum
[fw/sdcc] / src / SDCCglobl.h
index 644d9923eb153f4f58c28a5ff9e7827b29745431..7166d88177841520743536b7ec1e7a3134ec55d7 100644 (file)
 
 #define UNIX_DIR_SEPARATOR_CHAR    '/'
 
-#ifdef _WIN32       /* WIN32 native */
-
-#  define NATIVE_WIN32                 1
-#  ifdef __MINGW32__  /* GCC MINGW32 depends on configure */
-#    include "sdccconf.h"
-#  else
-#    include "sdcc_vc.h"
-#    define PATH_MAX  _MAX_PATH
-#  endif
-
-#else               /* Assume Un*x style system */
-#  include "sdccconf.h"
+#if defined(__BORLANDC__) || defined(_MSC_VER)
+#define STRCASECMP stricmp
+#define STRNCASECMP strnicmp
+#else
+#define STRCASECMP strcasecmp
+#define STRNCASECMP strncasecmp
+#endif
+
+#if defined(__MSDOS__) || defined(_WIN32) || defined(__OS2__) || defined (__CYGWIN__)
+
+#ifndef HAVE_DOS_BASED_FILE_SYSTEM
+#define HAVE_DOS_BASED_FILE_SYSTEM 1
+#endif
+
+#define IS_DIR_SEPARATOR(c)     ((c) == DIR_SEPARATOR_CHAR || (c) == UNIX_DIR_SEPARATOR_CHAR)
+/* Note that IS_ABSOLUTE_PATH accepts d:foo as well, although it is
+   only semi-absolute.  This is because the users of IS_ABSOLUTE_PATH
+   want to know whether to prepend the current working directory to
+   a file name, which should not be done with a name like d:foo.  */
+#define IS_ABSOLUTE_PATH(f)     (IS_DIR_SEPARATOR((f)[0]) || (((f)[0]) && ((f)[1] == ':')))
+#define FILENAME_CMP(s1, s2)    STRCASECMP(s1, s2)
+
+#else  /* not DOSish */
+
+#define IS_DIR_SEPARATOR(c)     ((c) == DIR_SEPARATOR_CHAR)
+#define IS_ABSOLUTE_PATH(f)     (IS_DIR_SEPARATOR((f)[0]))
+#define FILENAME_CMP(s1, s2)    strcmp(s1, s2)
+
+#endif /* not DOSish */
+
+#ifdef WIN32
+# define NATIVE_WIN32          1
+# ifndef __MINGW32__
+#   define  PATH_MAX  _MAX_PATH
+# endif
+#endif
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#elif defined(_WIN32) && !defined(__MINGW32__)
+# include "sdcc_vc.h"
+#else
+# include "sdccconf.h"
 #endif
 
 #include "SDCCerr.h"
 #define SPACE ' '
 #define ZERO  0
 
-#include <limits.h>            /* PATH_MAX                  */
-#ifndef PATH_MAX               /* POSIX, but not required   */
-#  define PATH_MAX 255         /* define a reasonable value */
+#include <limits.h>             /* PATH_MAX                  */
+#if !defined(PATH_MAX) || (PATH_MAX < 2048)
+#  undef  PATH_MAX
+#  define PATH_MAX 2048         /* define a reasonable value */
 #endif
 
 #define  MAX_REG_PARMS  1
@@ -93,7 +125,7 @@ typedef int bool;
 #ifdef UNIX
 #define EMPTY(x)        (x##StackPtr <= 1 ? 1 : 0)
 #else
-#define EMPTY(x)       (x##StackPtr == 0 ? 1 : 0)
+#define EMPTY(x)        (x##StackPtr == 0 ? 1 : 0)
 #endif
 
 
@@ -145,21 +177,23 @@ typedef int bool;
  */
 struct optimize
   {
-    unsigned global_cse;
-    unsigned ptrArithmetic;
-    unsigned label1;
-    unsigned label2;
-    unsigned label3;
-    unsigned label4;
-    unsigned loopInvariant;
-    unsigned loopInduction;
-    unsigned noJTabBoundary;
-    unsigned noLoopReverse;
+    int global_cse;
+    int ptrArithmetic;
+    int label1;
+    int label2;
+    int label3;
+    int label4;
+    int loopInvariant;
+    int loopInduction;
+    int noJTabBoundary;
+    int noLoopReverse;
+    int codeSpeed;
+    int codeSize;
   };
 
 /** Build model.
     Used in options.model.A bit each as port.supported_models is an OR
-    of these. 
+    of these.
 */
 enum
   {
@@ -168,13 +202,14 @@ enum
     MODEL_MEDIUM = 4,
     MODEL_LARGE = 8,
     MODEL_FLAT24 = 16,
-    MODEL_PAGE0 = 32 /* for the xa51 port */
+    MODEL_PAGE0 = 32, /* for the xa51 port */
+    MODEL_HUGE = 64 /* for banked support */
   };
 
 /* overlay segment name and the functions
    that belong to it. used by pragma overlay */
 typedef struct {
-    char *osname;      /* overlay segment name */
+    char *osname;       /* overlay segment name */
     int  nfuncs;        /* number of functions in this overlay */
     char *funcs[128];   /* function name that belong to this */
 } olay;
@@ -186,66 +221,76 @@ typedef struct {
  */
 struct options
   {
-    int model;                 /* see MODEL_* defines above */
-    int stackAuto;             /* Stack Automatic  */
-    int useXstack;             /* use Xternal Stack */
-    int stack10bit;            /* use 10 bit stack (flat24 model only) */
-    int dump_raw;              /* dump after intermediate code generation */
-    int dump_gcse;             /* dump after gcse */
-    int dump_loop;             /* dump after loop optimizations */
-    int dump_kill;             /* dump after dead code elimination */
-    int dump_range;            /* dump after live range analysis */
-    int dump_pack;             /* dump after register packing */
-    int dump_rassgn;           /* dump after register assignment */
+    int model;                  /* see MODEL_* defines above */
+    int stackAuto;              /* Stack Automatic  */
+    int useXstack;              /* use Xternal Stack */
+    int stack10bit;             /* use 10 bit stack (flat24 model only) */
+    int dump_raw;               /* dump after intermediate code generation */
+    int dump_gcse;              /* dump after gcse */
+    int dump_loop;              /* dump after loop optimizations */
+    int dump_kill;              /* dump after dead code elimination */
+    int dump_range;             /* dump after live range analysis */
+    int dump_pack;              /* dump after register packing */
+    int dump_rassgn;            /* dump after register assignment */
     int dump_tree;              /* dump front-end tree before lowering to iCode */
-    int cc_only;               /* compile only flag              */
-    int intlong_rent;          /* integer & long support routines reentrant */
-    int float_rent;            /* floating point routines are reentrant */
-    int out_fmt;               /* 1 = motorola S19 format 0 = intel Hex format */
-    int cyclomatic;            /* print cyclomatic information */
-    int noOverlay;             /* don't overlay local variables & parameters */
-    int mainreturn;            /* issue a return after main */
+    int cc_only;                /* compile only flag              */
+    int intlong_rent;           /* integer & long support routines reentrant */
+    int float_rent;             /* floating point routines are reentrant */
+    int out_fmt;                /* 1 = motorola S19 format 0 = intel Hex format */
+    int cyclomatic;             /* print cyclomatic information */
+    int noOverlay;              /* don't overlay local variables & parameters */
+    int mainreturn;             /* issue a return after main */
     int xram_movc;              /* use movc instead of movx to read xram (mcs51) */
-    int nopeep;                        /* no peep hole optimization */
-    int asmpeep;               /* pass inline assembler thru peep hole */
-    int debug;                 /* generate extra debug info */
-    int c1mode;                        /* Act like c1 - no pre-proc, asm or link */
-    char *peep_file;           /* additional rules for peep hole */
-    int nostdlib;              /* Don't use standard lib files */
-    int nostdinc;              /* Don't use standard include files */
+    int nopeep;                 /* no peep hole optimization */
+    int asmpeep;                /* pass inline assembler thru peep hole */
+    int debug;                  /* generate extra debug info */
+    int c1mode;                 /* Act like c1 - no pre-proc, asm or link */
+    char *peep_file;            /* additional rules for peep hole */
+    int nostdlib;               /* Don't use standard lib files */
+    int nostdinc;               /* Don't use standard include files */
     int noRegParams;            /* Disable passing some parameters in registers */
-    int verbose;               /* Show what the compiler is doing */
+    int verbose;                /* Show what the compiler is doing */
     int shortis8bits;           /* treat short like int or char */
     int lessPedantic;           /* disable some warnings */
     int profile;                /* Turn on extra profiling information */
-    int ommitFramePtr;         /* Turn off the frame pointer. */
-    int useAccelerator;                /* use ds390 Arithmetic Accelerator */
-    int noiv;                  /* do not generate irq vector table entries */
-    int all_callee_saves;      /* callee saves for all functions */
+    int ommitFramePtr;          /* Turn off the frame pointer. */
+    int useAccelerator;         /* use ds390 Arithmetic Accelerator */
+    int noiv;                   /* do not generate irq vector table entries */
+    int all_callee_saves;       /* callee saves for all functions */
     int stack_probe;            /* insert call to function __stack_probe */
-    int tini_libid;            /* library ID for TINI */
-    int protect_sp_update;     /* DS390 - will disable interrupts during ESP:SP updates */
-    int parms_in_bank1;        /* DS390 - use reg bank1 to pass parameters */
+    int tini_libid;             /* library ID for TINI */
+    int protect_sp_update;      /* DS390 - will disable interrupts during ESP:SP updates */
+    int parms_in_bank1;         /* DS390 - use reg bank1 to pass parameters */
+    int stack_size;             /* MCS51/DS390 - Tells the linker to allocate this space for stack */
+    int no_pack_iram;           /* MCS51/DS390 - Tells the linker not to pack variables in internal ram */
+    int acall_ajmp;             /* MCS51 - Use acall/ajmp instead of lcall/ljmp */
     /* starting address of the segments */
-    int xstack_loc;            /* initial location of external stack */
-    int stack_loc;             /* initial value of internal stack pointer */
-    int xdata_loc;             /* xternal ram starts at address */
-    int data_loc;              /* interram start location       */
-    int idata_loc;             /* indirect address space        */
-    int code_loc;              /* code location start           */
-    int iram_size;             /* internal ram size (used only for error checking) */   
-    int xram_size;             /* external ram size (used only for error checking) */
+    int xstack_loc;             /* initial location of external stack */
+    int stack_loc;              /* initial value of internal stack pointer */
+    int xdata_loc;              /* xternal ram starts at address */
+    int data_loc;               /* interram start location       */
+    int idata_loc;              /* indirect address space        */
+    int code_loc;               /* code location start           */
+    int iram_size;              /* internal ram size (used only for error checking) */
+    int xram_size;              /* external ram size (used only for error checking) */
     bool xram_size_set;         /* since xram_size=0 is a possibility */
-    int code_size;             /* code size (used only for error checking) */    
+    int code_size;              /* code size (used only for error checking) */
     int verboseExec;            /* show what we are doing */
     int noXinitOpt;             /* don't optimize initialized xdata */
     int noCcodeInAsm;           /* hide c-code from asm */
     int iCodeInAsm;             /* show i-code in asm */
+    int noPeepComments;         /* hide peephole optimizer comments */
+    int verboseAsm;             /* include comments generated with gen.c */
     int printSearchDirs;        /* display the directories in the compiler's search path */
-    int gen_banksel;           /* enable the generation of the banksel assembler directive in pic16 port */
     int vc_err_style;           /* errors and warnings are compatible with Micro$oft visual studio */
     int use_stdout;             /* send errors to stdout instead of stderr */
-    int no_std_crt0;            /*For the z80/gbz80 do not link default crt0.o*/
+    int no_std_crt0;            /* for the z80/gbz80 do not link default crt0.o*/
+    int std_c99;                /* enable C99 keywords/constructs */
+    int std_sdcc;               /* enable SDCC extensions to C */
+    int dollars_in_ident;       /* zero means dollar signs are punctuation */
+    int unsigned_char;          /* use unsigned for char without signed/unsigned modifier */
+    char *code_seg;             /* segment name to use instead of CSEG */
+    char *const_seg;            /* segment name to use instead of CONST */
     /* sets */
     set *calleeSavesSet;        /* list of functions using callee save */
     set *excludeRegsSet;        /* registers excluded from saving */
@@ -253,34 +298,35 @@ struct options
   };
 
 /* forward definition for variables accessed globally */
-extern int noAssemble;         /* no assembly, stop after code generation */
+extern int noAssemble;          /* no assembly, stop after code generation */
 extern char *yytext;
-extern char *currFname;
-extern char *fullSrcFileName;  /* full name for the source file; */
-                               /* can be NULL while linking without compiling */
-extern char *fullDstFileName;  /* full name for the output file; */
-                               /* only given by -o, otherwise NULL */
-extern char *dstFileName;      /* destination file name without extension */
-extern char *dstPath;          /* path for the output files; */
-                               /* "" is equivalent with cwd */
-extern char *moduleName;       /* module name is source file without path and extension */
-                               /* can be NULL while linking without compiling */
-extern int seqPointNo;         /* current sequence point */
-extern int currLineno;         /* current line number    */
-extern int mylineno;           /* line number of the current file SDCC.lex */
-extern FILE *yyin;             /* */
-extern FILE *asmFile;          /* assembly output file */
-extern FILE *cdbFile;          /* debugger symbol file */
-extern int NestLevel;          /* NestLevel                 SDCC.y   */
-extern int stackPtr;           /* stack pointer             SDCC.y   */
-extern int xstackPtr;          /* external stack pointer    SDCC.y   */
-extern int reentrant;          /* /X flag has been sent     SDCC.y */
-extern char buffer[PATH_MAX * 2];/* general buffer           SDCCmain.c   */
-extern int currRegBank;                /* register bank being used  SDCCgens.c   */
-extern int RegBankUsed[4];     /* JCF: register banks used  SDCCmain.c   */
-extern struct symbol *currFunc;        /* current function    SDCCgens.c */
-extern int cNestLevel;         /* block nest level  SDCCval.c      */
-extern int currBlockno;                /* sequentail block number */
+extern char *lexFilename;       /* lex idea of current file name */
+extern int lexLineno;           /* lex idea of line number of the current file */
+extern char *fullSrcFileName;   /* full name for the source file; */
+                                /* can be NULL while linking without compiling */
+extern char *fullDstFileName;   /* full name for the output file; */
+                                /* only given by -o, otherwise NULL */
+extern char *dstFileName;       /* destination file name without extension */
+extern char *dstPath;           /* path for the output files; */
+                                /* "" is equivalent with cwd */
+extern char *moduleName;        /* module name is source file without path and extension */
+                                /* can be NULL while linking without compiling */
+extern int seqPointNo;          /* current sequence point */
+extern FILE *yyin;              /* */
+extern FILE *asmFile;           /* assembly output file */
+extern FILE *cdbFile;           /* debugger symbol file */
+extern int NestLevel;           /* NestLevel                 SDCC.y */
+extern int stackPtr;            /* stack pointer             SDCC.y */
+extern int xstackPtr;           /* external stack pointer    SDCC.y */
+extern int reentrant;           /* /X flag has been sent     SDCC.y */
+extern char buffer[PATH_MAX * 2];/* general buffer           SDCCmain.c */
+extern int currRegBank;         /* register bank being used  SDCCgens.c */
+extern int RegBankUsed[4];      /* JCF: register banks used  SDCCmain.c */
+extern int BitBankUsed;         /* MB: overlayable bit bank  SDCCmain.c */
+extern struct symbol *currFunc; /* current function    SDCCgens.c */
+extern int cNestLevel;          /* block nest level  SDCCval.c */
+extern int blockNo;             /* maximum sequential block number */
+extern int currBlockno;         /* sequential block number */
 extern struct optimize optimize;
 extern struct options options;
 extern unsigned maxInterrupts;
@@ -293,24 +339,12 @@ extern set *libFilesSet;
 extern set *libPathsSet;
 extern set *libDirsSet;         /* list of lib search directories */
 
-void setParseWithComma (set **, char *);
-
-/** Creates a temporary file a'la tmpfile which avoids the bugs
-    in cygwin wrt c:\tmp.
-    Scans, in order: TMP, TEMP, TMPDIR, else uses tmpfile().
-*/
-FILE *tempfile (void);
-
-/** Creates a temporary file name a'la tmpnam which avoids the bugs
-    in cygwin wrt c:\tmp.
-    Scans, in order: TMP, TEMP, TMPDIR, else uses tmpfile().
-*/
-char *tempfilename (void);
+void setParseWithComma (set **, const char *);
 
 /** An assert() macro that will go out through sdcc's error
     system.
 */
-#define wassertl(a,s)  ((a) ? 0 : \
+#define wassertl(a,s)   ((a) ? 0 : \
         (werror (E_INTERNAL_ERROR,__FILE__,__LINE__, s), 0))
 
 #define wassert(a)    wassertl(a,"code generator internal error")