#include <stdlib.h>
#include <setjmp.h>
#include <stdio.h>
-#include "sdccconf.h"
-#include "SDCCerr.h"
-#ifdef __BORLANDC__
+/*
+ * Define host port dependant constants etc.
+ */
+
+#define DOS_DIR_SEPARATOR_CHAR '\\'
+#define DOS_DIR_SEPARATOR_STRING "\\"
+#define UNIX_DIR_SEPARATOR_CHAR '/'
+#define UNIX_DIR_SEPARATOR_STRING "/"
+
+#if defined(__BORLANDC__) /* Borland Turbo C/Win32 Host */
+
#define NATIVE_WIN32 1
-#endif
-#ifdef __MINGW32__
+#define DIR_SEPARATOR_CHAR DOS_DIR_SEPARATOR_CHAR
+#define DIR_SEPARATOR_STRING DOS_DIR_SEPARATOR_STRING
+
+#elif defined(_MSC_VER) /* Miscosoft VC6/Win32 Host */
+
+#define NATIVE_WIN32 1
+#include "sdcc_vc.h"
+#define DIR_SEPARATOR_CHAR DOS_DIR_SEPARATOR_CHAR
+#define DIR_SEPARATOR_STRING DOS_DIR_SEPARATOR_STRING
+
+#elif defined(__MINGW32__) /* MINGW32 DOS Host */
+
#define NATIVE_WIN32 1
-#endif
+#define DIR_SEPARATOR_CHAR DOS_DIR_SEPARATOR_CHAR
+#define DIR_SEPARATOR_STRING DOS_DIR_SEPARATOR_STRING
-#ifdef _NO_GC
+#else /* Assume Un*x style system */
-#define GC_malloc malloc
-#define GC_free free
-#define GC_realloc realloc
-#define GC_malloc_atomic malloc
-#else
+#include "sdccconf.h"
+#define DIR_SEPARATOR_CHAR UNIX_DIR_SEPARATOR_CHAR
+#define DIR_SEPARATOR_STRING UNIX_DIR_SEPARATOR_STRING
-#include "./gc/gc.h"
+#endif // _MSC_VER
-#endif
+#include "SDCCerr.h"
#define SPACE ' '
#define ZERO 0
#ifndef THROWS
#define THROWS
-#define THROW_NONE 0
-#define THROW_SRC 1
+#define THROW_NONE 0
+#define THROW_SRC 1
#define THROW_DEST 2
#define THROW_BOTH 3
#endif
#define PRAGMA_NOOVERLAY "NOOVERLAY"
#define PRAGMA_CALLEESAVES "CALLEE-SAVES"
#define PRAGMA_EXCLUDE "EXCLUDE"
-#define PRAGMA_NOREGPARMS "NOREGPARMS"
#define SMALL_MODEL 0
#define LARGE_MODEL 1
#define TRUE 1
#define FALSE 0
#define MAX_TVAR 6
-#define MAX_INLINEASM 4*1024
+#define INITIAL_INLINEASM 4*1024
#define DEFPOOLSTACK(type,size) \
type *type##Pool ; \
type *type##FreeStack [size] ; \
int type##StackPtr = 0 ;
-#define ALLOCTYPE(type,size) if (!(type##Pool = GC_malloc(size*sizeof(type)))) \
- { \
- werror(E_OUT_OF_MEM,__FILE__,(long) size); \
- exit (1); \
- }
-
#define PUSH(x,y) x##FreeStack[x##StackPtr++] = y
#define PEEK(x) x##FreeStack[x##StackPtr-1]
-#define POP(type) type##FreeStack[--type##StackPtr]
+#define POP(type) type##FreeStack[--type##StackPtr]
/* #define POP(x) (x##StackPtr ? x##FreeStack[--x##StackPtr] : \
- (assert(x##StackPtr),0)) */
+ (assert(x##StackPtr),0)) */
#ifdef UNIX
#define EMPTY(x) (x##StackPtr <= 1 ? 1 : 0)
#else
#define EMPTY(x) (x##StackPtr == 0 ? 1 : 0)
#endif
-#define ALLOC(x,sz) if (!(x = GC_malloc(sz))) \
- { \
- werror(E_OUT_OF_MEM,__FILE__,(long) sz);\
- exit (1); \
- }
-
-#define ALLOC_ATOMIC(x,sz) if (!(x = GC_malloc_atomic(sz))) \
- { \
- werror(E_OUT_OF_MEM,__FILE__,(long) sz); \
- exit (1); \
- }
#define COPYTYPE(start,end,from) (end = getSpec (start = from))
#define EXTERN_STACK_DCL(stack,type,size) \
typedef type t_##stack ; \
extern t_##stack stack[size] ; \
- extern t_##stack *p_##stack;
+ extern t_##stack *p_##stack;
#define STACK_FULL(stack) ((p_##stack) <= stack )
#define STACK_EMPTY(stack) ((p_##stack) >= (stack + \
- sizeof(stack)/sizeof(*stack)) )
+ sizeof(stack)/sizeof(*stack)) )
#define STACK_PUSH_(stack,x) (*--p_##stack = (x))
#define STACK_POP_(stack) (*p_##stack++)
: fprintf(stderr,"stack underflow\n"))
/* optimization options */
-struct optimize {
- unsigned global_cse : 1 ;
- unsigned ptrArithmetic :1;
- unsigned label1 : 1 ;
- unsigned label2 : 1 ;
- unsigned label3 : 1 ;
- unsigned label4 : 1 ;
- unsigned loopInvariant: 1;
- unsigned loopInduction: 1;
- unsigned noJTabBoundary:1;
- unsigned noLoopReverse :1;
-} ;
+struct optimize
+ {
+ unsigned global_cse:1;
+ unsigned ptrArithmetic:1;
+ unsigned label1:1;
+ unsigned label2:1;
+ unsigned label3:1;
+ unsigned label4:1;
+ unsigned loopInvariant:1;
+ unsigned loopInduction:1;
+ unsigned noJTabBoundary:1;
+ unsigned noLoopReverse:1;
+ };
/** 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
-};
+enum
+ {
+ MODEL_SMALL = 1,
+ MODEL_COMPACT = 2,
+ MODEL_MEDIUM = 4,
+ MODEL_LARGE = 8,
+ MODEL_FLAT24 = 16
+ };
/* other command line options */
-struct options {
- 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) */
- int genericPtr: 1 ; /* use generic pointers */
- int regExtend : 1 ; /* don't use extended registers */
- int dump_raw : 1 ; /* dump after intermediate code generation */
- int dump_gcse : 1 ; /* dump after gcse */
- int dump_loop : 1 ; /* dump after loop optimizations */
- int dump_kill : 1 ; /* dump after dead code elimination */
- int dump_range: 1 ; /* dump after live range analysis */
- int dump_pack : 1 ; /* dump after register packing */
- int dump_rassgn:1 ; /* dump after register assignment */
- int cc_only : 1 ; /* compile only flag */
- int intlong_rent:1 ; /* integer & long support routines reentrant */
- int float_rent: 1 ; /* floating point routines are reentrant */
- int out_fmt : 1 ; /* 1 = motorola S19 format 0 = intel Hex format */
- int cyclomatic: 1 ; /* print cyclomatic information */
- int noOverlay : 1 ; /* don't overlay local variables & parameters */
- int mainreturn: 1 ; /* issue a return after main */
- int nopeep : 1 ; /* no peep hole optimization */
- int asmpeep : 1 ; /* pass inline assembler thru peep hole */
- int debug : 1 ; /* generate extra debug info */
- int nodebug : 1 ; /* Generate no debug info. */
- int stackOnData:1 ; /* stack after data segment */
- int noregparms: 1 ; /* do not pass parameters in registers */
- int c1mode : 1 ; /* Act like c1 - no pre-proc, asm or link */
- char *peep_file ; /* additional rules for peep hole */
- char *out_name ; /* Asm output name for c1 mode */
-
- char *calleeSaves[128]; /* list of functions using callee save */
- char *excludeRegs[32] ; /* registers excluded from saving */
+struct options
+ {
+ 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) */
+ int genericPtr:1; /* use generic pointers */
+ int regExtend:1; /* don't use extended registers */
+ int dump_raw:1; /* dump after intermediate code generation */
+ int dump_gcse:1; /* dump after gcse */
+ int dump_loop:1; /* dump after loop optimizations */
+ int dump_kill:1; /* dump after dead code elimination */
+ int dump_range:1; /* dump after live range analysis */
+ int dump_pack:1; /* dump after register packing */
+ int dump_rassgn:1; /* dump after register assignment */
+ int cc_only:1; /* compile only flag */
+ int intlong_rent:1; /* integer & long support routines reentrant */
+ int float_rent:1; /* floating point routines are reentrant */
+ int out_fmt:1; /* 1 = motorola S19 format 0 = intel Hex format */
+ int cyclomatic:1; /* print cyclomatic information */
+ int noOverlay:1; /* don't overlay local variables & parameters */
+ int mainreturn:1; /* issue a return after main */
+ int nopeep:1; /* no peep hole optimization */
+ int asmpeep:1; /* pass inline assembler thru peep hole */
+ int debug:1; /* generate extra debug info */
+ int nodebug:1; /* Generate no debug info. */
+ int stackOnData:1; /* stack after data segment */
+ int c1mode:1; /* Act like c1 - no pre-proc, asm or link */
+ char *peep_file; /* additional rules for peep hole */
+ char *out_name; /* Asm output name for c1 mode */
+ int nostdlib:1; /* Don't use standard lib files */
+ int nostdinc:1; /* Don't use standard include files */
+ int verbose:1; /* Show what the compiler is doing */
+
+ char *calleeSaves[128]; /* list of functions using callee save */
+ char *excludeRegs[32]; /* registers excluded from saving */
/* 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 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) */
+ };
/* forward definition for variables accessed globally */
-extern char *currFname ;
-extern char *srcFileName; /* source file name without the extenstion */
-extern char *moduleName ; /* source file name without path & extension */
-extern int currLineno ; /* current line number */
-extern int yylineno ; /* 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[] ;/* general buffer SDCCgen.c */
-extern int currRegBank; /* register bank being used SDCCgens.c */
-extern struct symbol *currFunc; /* current function SDCCgens.c */
-extern int cNestLevel; /* block nest level SDCCval.c */
-extern int currBlockno; /* sequentail block number */
-extern struct optimize optimize ;
+extern char *currFname;
+extern char *srcFileName; /* source file name without the extenstion */
+extern char *moduleName; /* source file name without path & extension */
+extern int currLineno; /* current line number */
+extern int yylineno; /* 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[]; /* general buffer SDCCgen.c */
+extern int currRegBank; /* register bank being used SDCCgens.c */
+extern struct symbol *currFunc; /* current function SDCCgens.c */
+extern int cNestLevel; /* block nest level SDCCval.c */
+extern int currBlockno; /* sequentail block number */
+extern struct optimize optimize;
extern struct options options;
-extern int maxInterrupts;
+extern unsigned maxInterrupts;
/* Visible from SDCCmain.c */
extern int nrelFiles;
extern char *relFiles[128];
-extern char *libFiles[128] ;
+extern char *libFiles[128];
extern int nlibFiles;
-void buildCmdLine(char *into, char **args, const char **cmds,
- const char *p1, const char *p2,
- const char *p3, const char **list);
-int my_system (const char *cmd, char **cmd_argv);
+extern bool verboseExec ;
+
+/*
+ void buildCmdLine(char *into, char **args, const char **cmds,
+ const char *p1, const char *p2,
+ const char *p3, const char **list);
+ int my_system (const char *cmd, char **cmd_argv);
+ */
-void parseWithComma (char **,char *) ;
+void parseWithComma (char **, 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);
+FILE *tempfile (void);
/** Creates a duplicate of the string 'sz' a'la strdup but using
libgc.
*/
-char *gc_strdup(const char *sz);
+char *gc_strdup (const char *sz);
/** An assert() macro that will go out through sdcc's error
system.