* as/z80/z80mch.c: fixed bug #1704376: missing as-z80 errors
[fw/sdcc] / src / pic / main.c
index 37a2b40a82bd9f0b80f70d6c15ccb3041cc64765..8707cc99921c3e0b91d9b59222c59cb6bbab304a 100644 (file)
     it easier to set a breakpoint using the debugger.
 */
 #include "common.h"
-#include "main.h"
-#include "ralloc.h"
-#include "device.h"
-#include "SDCCutil.h"
-#include "SDCCmacro.h"
 #include "MySystem.h"
+#include "SDCCmacro.h"
+
+#include "device.h"
+#include "gen.h"
 #include "glue.h"
-#include <errno.h>
-//#include "gen.h"
+#include "main.h"
+#include "pcode.h"
+#include "ralloc.h"
+
+/*
+ * Imports
+ */
+extern set *dataDirsSet;
+extern set *includeDirsSet;
+extern set *libDirsSet;
+extern set *libPathsSet;
+extern set *linkOptionsSet;
+
+
+pic14_options_t pic14_options;
+int debug_verbose = 0;
+
 
+#define OPTION_STACK_SIZE         "--stack-size"
 
 static char _defaultRules[] =
 {
 #include "peeph.rul"
-       ""
 };
 
+static OPTION _pic14_poptions[] =
+  {
+    { 0, "--debug-xtra",   &debug_verbose, "show more debug info in assembly output" },
+    { 0, "--no-pcode-opt", &pic14_options.disable_df, "disable (slightly faulty) optimization on pCode" },
+    { 0, OPTION_STACK_SIZE, &options.stack_size, "sets the size if the argument passing stack (default: 16, minimum: 4)", CLAT_INTEGER },
+    { 0, NULL, NULL, NULL }
+  };
+
 /* list of key words used by pic14 */
 static char *_pic14_keywords[] =
 {
-       "at",
-       //"bit",
-       "code",
-       "critical",
-       "data",
-       "far",
-       "idata",
-       "interrupt",
-       "near",
-       "pdata",
-       "reentrant",
-       "sfr",
-       //"sbit",
-       "using",
-       "xdata",
-       "_data",
-       "_code",
-       "_generic",
-       "_near",
-       "_xdata",
-       "_pdata",
-       "_idata",
-       NULL
+  "at",
+  //"bit",
+  "code",
+  "critical",
+  "data",
+  "far",
+  "idata",
+  "interrupt",
+  "near",
+  "pdata",
+  "reentrant",
+  "sfr",
+  //"sbit",
+  "using",
+  "xdata",
+  "_data",
+  "_code",
+  "_generic",
+  "_near",
+  "_xdata",
+  "_pdata",
+  "_idata",
+  NULL
 };
 
-pic14_options_t pic14_options;
+static int regParmFlg = 0;  /* determine if we can register a parameter */
 
-#define ARG_STACKLOC   "--stack-loc"
-#define ARG_STACKSIZ   "--stack-size"
 
-extern int debug_verbose;      /* from pcode.c */
-static OPTION _pic14_poptions[] = {
-       { 0 , "--debug-xtra", &debug_verbose, "show more debug info in assembly output" },
-       { 0 , "--no-pcode-opt", &pic14_options.disable_df, "disable (slightly faulty) optimization on pCode" },
-       { 0 , ARG_STACKLOC, NULL, "sets the lowest address of the argument passing stack" },
-       { 0 , ARG_STACKSIZ, NULL, "sets the size if the argument passing stack (default: 16, minimum: 4)" },
-       { 0 , NULL, NULL, NULL }
+/** $1 is always the basename.
+    $2 is always the output file.
+    $3 varies
+    $l is the list of extra options that should be there somewhere...
+    MUST be terminated with a NULL.
+*/
+static const char *_linkCmd[] =
+{
+  "gplink", "$l", "-w", "-r", "-o \"$2\"", "\"$1\"", "$3", NULL
 };
 
-void  pCodeInitRegisters(void);
-
-void pic14_assignRegisters (ebbIndex *);
-
-/* Also defined in gen.h, but the #include is commented out */
-/* for an unknowned reason. - EEP */
-void pic14_emitDebuggerSymbol (char *);
-
-static int regParmFlg = 0;     /* determine if we can register a parameter */
+static const char *_asmCmd[] =
+{
+  "gpasm", "$l", "$3", "-c", "\"$1.asm\"", NULL
+};
 
 static void
 _pic14_init (void)
 {
-       asm_addTree (&asm_asxxxx_mapping);
-       memset (&pic14_options, 0, sizeof (pic14_options));
+  asm_addTree (&asm_asxxxx_mapping);
+  memset (&pic14_options, 0, sizeof (pic14_options));
 }
 
 static void
 _pic14_reset_regparm (void)
 {
-       regParmFlg = 0;
+  regParmFlg = 0;
 }
 
 static int
 _pic14_regparm (sym_link * l, bool reentrant)
 {
 /* for this processor it is simple
-       can pass only the first parameter in a register */
-       //if (regParmFlg)
-       //  return 0;
-       
-       regParmFlg++;// = 1;
-       return 1;
-}
-
-static int
-_process_pragma(const char *sz)
-{
-       static const char *WHITE = " \t";
-       char    *ptr = strtok((char *)sz, WHITE);
-       
-       if (startsWith (ptr, "memmap"))
-       {
-               char    *start;
-               char    *end;
-               char    *type;
-               char    *alias;
-               
-               start = strtok((char *)NULL, WHITE);
-               end = strtok((char *)NULL, WHITE);
-               type = strtok((char *)NULL, WHITE);
-               alias = strtok((char *)NULL, WHITE);
-               
-               if (start != (char *)NULL
-                       && end != (char *)NULL
-                       && type != (char *)NULL) {
-                       value           *startVal = constVal(start);
-                       value           *endVal = constVal(end);
-                       value           *aliasVal;
-                       memRange        r;
-                       
-                       if (alias == (char *)NULL) {
-                               aliasVal = constVal(0);
-                       } else {
-                               aliasVal = constVal(alias);
-                       }
-                       
-                       r.start_address = (int)floatFromVal(startVal);
-                       r.end_address = (int)floatFromVal(endVal);
-                       r.alias = (int)floatFromVal(aliasVal);
-                       r.bank = (r.start_address >> 7) & 3;
-                       
-                       if (strcmp(type, "RAM") == 0) {
-                               addMemRange(&r, 0);
-                       } else if (strcmp(type, "SFR") == 0) {
-                               addMemRange(&r, 1);
-                       } else {
-                               return 1;
-                       }
-               }
-               
-               return 0;
-       } else if (startsWith (ptr, "maxram")) {
-               // not used any more - comes from device config file pic14devices.txt instead
-               return 0;
-       }
-       return 1;
+  can pass only the first parameter in a register */
+  //if (regParmFlg)
+  //  return 0;
+  
+  regParmFlg++;// = 1;
+  return 1;
 }
 
-extern char *udata_section_name;
-
 static bool
 _pic14_parseOptions (int *pargc, char **argv, int *i)
 {
-       char buf[128];
-       
-       /* TODO: allow port-specific command line options to specify
-       * segment names here.
-       */
-       
-       /* This is a temporary hack, to solve problems with some processors
-       * that do not have udata section. It will be changed when a more
-       * robust solution is figured out -- VR 27-11-2003 FIXME
-       */
-       strcpy(buf, "--udata-section-name");
-       if(!strncmp(buf, argv[ *i ], strlen(buf))) {
-               if(strlen(argv[ *i ]) <= strlen(buf)+1) {
-                       fprintf(stderr, "WARNING: no `%s' entered\n", buf+2);
-                       exit(EXIT_FAILURE);
-               } else {
-                       udata_section_name = strdup( strchr(argv[*i], '=') + 1 );
-               }
-               return 1;
-       }
-
-       return FALSE;
+    /* TODO: allow port-specific command line options to specify
+    * segment names here.
+    */
+    return FALSE;
 }
 
-extern set *dataDirsSet;
-extern set *includeDirsSet;
 /* pic14 port uses include/pic and lib/pic instead of
  * include/pic14 and lib/pic14 as indicated by SDCCmain.c's
  * setIncludePaths routine. */
@@ -217,65 +158,10 @@ _pic14_initPaths (void)
 static void
 _pic14_finaliseOptions (void)
 {
-       pCodeInitRegisters();
-       
-       port->mem.default_local_map = data;
-       port->mem.default_globl_map = data;
-#if 0
-       /* Hack-o-matic: if we are using the flat24 model,
-       * adjust pointer sizes.
-       */
-       if (options.model == MODEL_FLAT24)
-       {
-               
-               fprintf (stderr, "*** WARNING: you should use the '-mds390' option "
-                       "for DS80C390 support. This code generator is "
-                       "badly out of date and probably broken.\n");
-               
-               port->s.fptr_size = 3;
-               port->s.gptr_size = 4;
-               port->stack.isr_overhead++;     /* Will save dpx on ISR entry. */
-#if 1
-               port->stack.call_overhead++;    /* This acounts for the extra byte 
-                                                * of return addres on the stack.
-                                                * but is ugly. There must be a 
-                                                * better way.
-                                                */
-#endif
-               fReturn = fReturn390;
-               fReturnSize = 5;
-       }
-       
-       if (options.model == MODEL_LARGE)
-       {
-               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;
-       }
-       
-       if (options.stack10bit)
-       {
-               if (options.model != MODEL_FLAT24)
-               {
-                       fprintf (stderr,
-                               "*** warning: 10 bit stack mode is only supported in flat24 model.\n");
-                       fprintf (stderr, "\t10 bit stack mode disabled.\n");
-                       options.stack10bit = 0;
-               }
-               else
-               {
-               /* Fixup the memory map for the stack; it is now in
-               * far space and requires a FPOINTER to access it.
-               */
-                       istack->fmap = 1;
-                       istack->ptrType = FPOINTER;
-               }
-       }
-#endif
+  pCodeInitRegisters();
+  
+  port->mem.default_local_map = data;
+  port->mem.default_globl_map = data;
 }
 
 static void
@@ -286,163 +172,77 @@ _pic14_setDefaultOptions (void)
 static const char *
 _pic14_getRegName (struct regs *reg)
 {
-       if (reg)
-               return reg->name;
-       return "err";
+  if (reg)
+    return reg->name;
+  return "err";
 }
 
-extern char *processor_base_name(void);
-
 static void
 _pic14_genAssemblerPreamble (FILE * of)
 {
-       char * name = processor_base_name();
-       
-       if(!name) {
-               
-               name = "16f877";
-               fprintf(stderr,"WARNING: No Pic has been selected, defaulting to %s\n",name);
-       }
-       
-       fprintf (of, "\tlist\tp=%s\n",name);
-       fprintf (of, "\tradix dec\n");
-       fprintf (of, "\tinclude \"p%s.inc\"\n",name);
+  char * name = processor_base_name();
+  
+  if(!name) {
+    
+    name = "16f877";
+    fprintf(stderr,"WARNING: No Pic has been selected, defaulting to %s\n",name);
+  }
+  
+  fprintf (of, "\tlist\tp=%s\n",name);
+  fprintf (of, "\tradix dec\n");
+  fprintf (of, "\tinclude \"p%s.inc\"\n",name);
 }
 
 /* Generate interrupt vector table. */
 static int
-_pic14_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts)
+_pic14_genIVT (struct dbuf_s * oBuf, symbol ** interrupts, int maxInterrupts)
 {
-       int i;
-       
-       if (options.model != MODEL_FLAT24)
-       {
-               /* Let the default code handle it. */
-               return FALSE;
-       }
-       
-       fprintf (of, "\t;ajmp\t__sdcc_gsinit_startup\n");
-       
-       /* now for the other interrupts */
-       for (i = 0; i < maxInterrupts; i++)
-       {
-               if (interrupts[i])
-               {
-                       fprintf (of, "\t;ljmp\t%s\n\t.ds\t4\n", interrupts[i]->rname);
-               }
-               else
-               {
-                       fprintf (of, "\t;reti\n\t.ds\t7\n");
-               }
-       }
-       
-       return TRUE;
+  /* Let the default code handle it. */
+  return FALSE;
 }
 
 static bool
 _hasNativeMulFor (iCode *ic, sym_link *left, sym_link *right)
 {
-/*
-sym_link *test = NULL;
-value *val;
-       */
-       
-       //fprintf(stderr,"checking for native mult\n");
-       
-       if ( ic->op != '*')
-       {
-               return FALSE;
-       }
-       
-       /* multiply chars in-place */
-       if (getSize(left) == 1 && getSize(right) == 1)
-               return TRUE;
-       
-       /* use library functions for more complex maths */
-       return FALSE;
-
-       /*
-       if ( IS_LITERAL (left))
-       {
-       fprintf(stderr,"left is lit\n");
-       test = left;
-       val = OP_VALUE (IC_LEFT (ic));
-       }
-       else if ( IS_LITERAL (right))
-       {
-       fprintf(stderr,"right is lit\n");
-       test = left;
-       val = OP_VALUE (IC_RIGHT (ic));
-       }
-       else
-       {
-       fprintf(stderr,"oops, neither is lit so no\n");
-       return FALSE;
-       }
-       
-         if ( getSize (test) <= 2)
-         {
-         fprintf(stderr,"yep\n");
-         return TRUE;
-         }
-         fprintf(stderr,"nope\n");
-         
-               return FALSE;
-       */
+  if ( ic->op != '*')
+  {
+    return FALSE;
+  }
+  
+  /* multiply chars in-place */
+  if (getSize(left) == 1 && getSize(right) == 1)
+    return TRUE;
+  
+  /* use library functions for more complex maths */
+  return FALSE;
 }
 
 /* Indicate which extended bit operations this port supports */
 static bool
 hasExtBitOp (int op, int size)
 {
-       if (op == RRC
-               || op == RLC
-               /* || op == GETHBIT */ /* GETHBIT doesn't look complete for PIC */
-               )
-               return TRUE;
-       else
-               return FALSE;
+  if (op == RRC
+    || op == RLC
+    /* || op == GETHBIT */ /* GETHBIT doesn't look complete for PIC */
+    )
+    return TRUE;
+  else
+    return FALSE;
 }
 
 /* Indicate the expense of an access to an output storage class */
 static int
 oclsExpense (struct memmap *oclass)
 {
-       /* The IN_FARSPACE test is compatible with historical behaviour, */
-       /* but I don't think it is applicable to PIC. If so, please feel */
-       /* free to remove this test -- EEP */
-       if (IN_FARSPACE(oclass))
-               return 1;
+  /* The IN_FARSPACE test is compatible with historical behaviour, */
+  /* but I don't think it is applicable to PIC. If so, please feel */
+  /* free to remove this test -- EEP */
+  if (IN_FARSPACE(oclass))
+    return 1;
 
-       return 0;
+  return 0;
 }
 
-/** $1 is always the basename.
-$2 is always the output file.
-$3 varies
-$l is the list of extra options that should be there somewhere...
-MUST be terminated with a NULL.
-*/
-static const char *_linkCmd[] =
-{
-       "gplink", "$l", "-w", "-r", "-o \"$2\"", "\"$1\"", "$3", NULL
-};
-
-static const char *_asmCmd[] =
-{
-       "gpasm", "$l", "-c", "\"$1.asm\"", NULL
-               
-};
-
-extern set *libFilesSet;
-extern set *libDirsSet;
-extern set *libPathsSet;
-extern set *includeDirsSet;
-extern set *userIncDirsSet;
-extern set *dataDirsSetSet;
-extern set *relFilesSet;
-extern set *linkOptionsSet;
-
 static void _pic14_do_link (void)
 {
   hTab *linkValues=NULL;
@@ -488,7 +288,7 @@ static void _pic14_do_link (void)
   if (!procName) {
      procName = "16f877";
   }
-       
+
   addSet(&libFilesSet, "libsdcc.lib");
   SNPRINTF(&temp[0], 128, "pic%s.lib", procName);
   addSet(&libFilesSet, temp);
@@ -507,126 +307,129 @@ static void _pic14_do_link (void)
 /* Globals */
 PORT pic_port =
 {
-       TARGET_ID_PIC,
-       "pic14",
-       "MCU pic",                      /* Target name */
-       "",                    /* Processor */
-       {
-               picglue,
-               TRUE,                   /* Emit glue around main */
-               MODEL_SMALL | MODEL_LARGE | MODEL_FLAT24,
-               MODEL_SMALL
-       },
-       {
-               _asmCmd,
-               NULL,
-               NULL,
-               NULL,
-               //"-plosgffc",          /* Options with debug */
-               //"-plosgff",           /* Options without debug */
-               0,
-               ".asm",
-               NULL                    /* no do_assemble function */
-       },
-       {
-               _linkCmd,
-               NULL,
-               _pic14_do_link,         /* own do link function */
-               ".o",
-               0
-       },
-       {
-               _defaultRules
-       },
-       {
-               /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
-               1, 2, 2, 4, 2, 2, 3, 1, 4, 4
-               /* TSD - I changed the size of gptr from 3 to 1. However, it should be
-                  2 so that we can accomodate the PIC's with 4 register banks (like the
-                  16f877)
-                */
-       },
-       /* tags for generic pointers */
-       { 0x00, 0x00, 0x00, 0x80 },             /* far, near, xstack, code */
-       {
-               "XSEG    (XDATA)",
-               "STACK   (DATA)",
-               "code",
-               "DSEG    (DATA)",
-               "ISEG    (DATA)",
-               NULL, /* pdata */
-               "XSEG    (XDATA)",
-               "BSEG    (BIT)",
-               "RSEG    (DATA)",
-               "GSINIT  (CODE)",
-               "udata_ovr",
-               "GSFINAL (CODE)",
-               "HOME    (CODE)",
-               NULL, // xidata
-               NULL, // xinit
-               "CONST   (CODE)",               // const_name - const data (code or not)
-               "CABS    (ABS,CODE)",   // cabs_name - const absolute data (code or not)
-               NULL,
-               NULL,
-               1        // code is read only
-       },
-       { NULL, NULL },
-       {
-               +1, 1, 4, 1, 1, 0
-       },
-               /* pic14 has an 8 bit mul */
-       {
-               1, -1
-       },
-       {
-               pic14_emitDebuggerSymbol
-       },
-       {
-               255/3,      /* maxCount */
-               3,          /* sizeofElement */
-               /* The rest of these costs are bogus. They approximate */
-               /* the behavior of src/SDCCicode.c 1.207 and earlier.  */
-               {4,4,4},    /* sizeofMatchJump[] */
-               {0,0,0},    /* sizeofRangeCompare[] */
-               0,          /* sizeofSubtract */
-               3,          /* sizeofDispatch */
-       },
-       "_",
-       _pic14_init,
-       _pic14_parseOptions,
-       _pic14_poptions,
-       _pic14_initPaths,
-       _pic14_finaliseOptions,
-       _pic14_setDefaultOptions,
-       pic14_assignRegisters,
-       _pic14_getRegName,
-       _pic14_keywords,
-       _pic14_genAssemblerPreamble,
-       NULL,                           /* no genAssemblerEnd */
-       _pic14_genIVT,
-       NULL, // _pic14_genXINIT
-       NULL,                           /* genInitStartup */
-       _pic14_reset_regparm,
-       _pic14_regparm,
-       _process_pragma,                                /* process a pragma */
-       NULL,
-       _hasNativeMulFor,
-       hasExtBitOp,                    /* hasExtBitOp */
-       oclsExpense,                    /* oclsExpense */
-       FALSE,
-//     TRUE,                           /* little endian */
-       FALSE,                          /* little endian - PIC code enumlates big endian */
-       0,                              /* leave lt */
-       0,                              /* leave gt */
-       1,                              /* transform <= to ! > */
-       1,                              /* transform >= to ! < */
-       1,                              /* transform != to !(a == b) */
-       0,                              /* leave == */
-       FALSE,                        /* No array initializer support. */
-       0,                            /* no CSE cost estimation yet */
-       NULL,                   /* no builtin functions */
-       GPOINTER,                       /* treat unqualified pointers as "generic" pointers */
-       1,                              /* reset labelKey to 1 */
-       1,                              /* globals & local static allowed */
-       PORT_MAGIC
+  TARGET_ID_PIC,
+  "pic14",
+  "MCU pic",        /* Target name */
+  "",               /* Processor */
+  {
+    picglue,
+    TRUE,     /* Emit glue around main */
+    MODEL_SMALL | MODEL_LARGE | MODEL_FLAT24,
+    MODEL_SMALL
+  },
+  {
+    _asmCmd,
+    NULL,
+    "-g",          /* options with --debug */
+    NULL,          /* options without --debug */
+    //"-plosgffc",  /* Options with debug */
+    //"-plosgff",   /* Options without debug */
+    0,
+    ".asm",
+    NULL            /* no do_assemble function */
+  },
+  {
+    _linkCmd,
+    NULL,
+    _pic14_do_link, /* own do link function */
+    ".o",
+    0
+  },
+  {
+    _defaultRules
+  },
+  {
+    /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
+    1, 2, 2, 4, 2, 2, 3, 1, 4, 4
+    /* TSD - I changed the size of gptr from 3 to 1. However, it should be
+       2 so that we can accomodate the PIC's with 4 register banks (like the
+       16f877)
+     */
+  },
+  /* tags for generic pointers */
+  { 0x00, 0x00, 0x00, 0x80 },   /* far, near, xstack, code */
+  {
+    "XSEG    (XDATA)",
+    "STACK   (DATA)",
+    "code",
+    "DSEG    (DATA)",
+    "ISEG    (DATA)",
+    NULL, /* pdata */
+    "XSEG    (XDATA)",
+    "BSEG    (BIT)",
+    "RSEG    (DATA)",
+    "GSINIT  (CODE)",
+    "udata_ovr",
+    "GSFINAL (CODE)",
+    "HOME       (CODE)",
+    NULL, // xidata
+    NULL, // xinit
+    "CONST   (CODE)",   // const_name - const data (code or not)
+    "CABS    (ABS,CODE)", // cabs_name - const absolute data (code or not)
+    "XABS    (ABS,XDATA)",  // xabs_name - absolute xdata
+    "IABS    (ABS,DATA)", // iabs_name - absolute data
+    NULL,
+    NULL,
+    1        // code is read only
+  },
+  { NULL, NULL },
+  {
+    +1, 1, 4, 1, 1, 0
+  },
+    /* pic14 has an 8 bit mul */
+  {
+    1, -1
+  },
+  {
+    pic14_emitDebuggerSymbol
+  },
+  {
+    255/3,      /* maxCount */
+    3,          /* sizeofElement */
+    /* The rest of these costs are bogus. They approximate */
+    /* the behavior of src/SDCCicode.c 1.207 and earlier.  */
+    {4,4,4},    /* sizeofMatchJump[] */
+    {0,0,0},    /* sizeofRangeCompare[] */
+    0,          /* sizeofSubtract */
+    3,          /* sizeofDispatch */
+  },
+  "_",
+  _pic14_init,
+  _pic14_parseOptions,
+  _pic14_poptions,
+  _pic14_initPaths,
+  _pic14_finaliseOptions,
+  _pic14_setDefaultOptions,
+  pic14_assignRegisters,
+  _pic14_getRegName,
+  _pic14_keywords,
+  _pic14_genAssemblerPreamble,
+  NULL,         /* no genAssemblerEnd */
+  _pic14_genIVT,
+  NULL, // _pic14_genXINIT
+  NULL,         /* genInitStartup */
+  _pic14_reset_regparm,
+  _pic14_regparm,
+  NULL,         /* process a pragma */
+  NULL,
+  _hasNativeMulFor,
+  hasExtBitOp,  /* hasExtBitOp */
+  oclsExpense,  /* oclsExpense */
+  FALSE,
+//  TRUE,       /* little endian */
+  FALSE,        /* little endian - PIC code enumlates big endian */
+  0,            /* leave lt */
+  0,            /* leave gt */
+  1,            /* transform <= to ! > */
+  1,            /* transform >= to ! < */
+  1,            /* transform != to !(a == b) */
+  0,            /* leave == */
+  FALSE,        /* No array initializer support. */
+  0,            /* no CSE cost estimation yet */
+  NULL,         /* no builtin functions */
+  GPOINTER,     /* treat unqualified pointers as "generic" pointers */
+  1,            /* reset labelKey to 1 */
+  1,            /* globals & local static allowed */
+  PORT_MAGIC
 };
+