Fixed several pointer related bugs in the PIC port
[fw/sdcc] / src / pic / main.c
index d2222421511fc8c49c96355c79d0aaddd3571cbb..df4d275938cc391fca4f653f8ea72d3875f2a848 100644 (file)
@@ -7,6 +7,7 @@
 #include "common.h"
 #include "main.h"
 #include "ralloc.h"
+#include "device.h"
 //#include "gen.h"
 
 
@@ -67,10 +68,10 @@ _pic14_regparm (sym_link * l)
 {
   /* for this processor it is simple
      can pass only the first parameter in a register */
-  if (regParmFlg)
-    return 0;
+  //if (regParmFlg)
+  //  return 0;
 
-  regParmFlg = 1;
+  regParmFlg++;// = 1;
   return 1;
 }
 
@@ -159,12 +160,22 @@ _pic14_getRegName (struct regs *reg)
   return "err";
 }
 
+extern char *processor_base_name(void);
+
 static void
 _pic14_genAssemblerPreamble (FILE * of)
 {
-  fprintf (of, "\tlist\tp=16c84\n");
-  fprintf (of, "\t__config _wdt_off\n");
-  fprintf (of, "\ninclude \"p16c84.inc\"\n");
+  char * name = processor_base_name();
+
+  if(!name) {
+
+    name = "p16f877";
+    fprintf(stderr,"WARNING: No Pic has been selected, defaulting to %s\n",name);
+  }
+
+  fprintf (of, "\tlist\tp=%s\n",&name[1]);
+  fprintf (of, "\t__CONFIG 0x%x\n",getConfigWord(0x2007));
+  fprintf (of, "\ninclude \"%s.inc\"\n",name);
 }
 
 /* Generate interrupt vector table. */
@@ -197,6 +208,50 @@ _pic14_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts)
   return TRUE;
 }
 
+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;
+    }
+
+  return TRUE;
+/*
+  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;
+*/
+}
+
 /** $1 is always the basename.
     $2 is always the output file.
     $3 varies
@@ -208,9 +263,13 @@ static const char *_linkCmd[] =
   "aslink", "-nf", "$1", NULL
 };
 
+/* Sigh. This really is not good. For now, I recommend:
+ * sdcc -S -mpic14 file.c
+ * the -S option does not compile or link
+ */
 static const char *_asmCmd[] =
 {
-  "gpasm", NULL, NULL, NULL
+  "gpasm", "-c  -I /usr/local/share/gpasm/header", "$1.asm", NULL
 
 };
 
@@ -220,6 +279,7 @@ PORT pic_port =
   TARGET_ID_PIC,
   "pic14",
   "MCU pic",                   /* Target name */
+  "p16f877",                    /* Processor */
   {
     TRUE,                      /* Emit glue around main */
     MODEL_SMALL | MODEL_LARGE | MODEL_FLAT24,
@@ -228,15 +288,18 @@ PORT pic_port =
   {
     _asmCmd,
     NULL,
+    NULL,
     NULL,
        //"-plosgffc",          /* Options with debug */
        //"-plosgff",           /* Options without debug */
     0,
-    ".asm"
+    ".asm",
+    NULL                       /* no do_assemble function */
   },
   {
     _linkCmd,
     NULL,
+    NULL,
     ".rel"
   },
   {
@@ -244,7 +307,7 @@ PORT pic_port =
   },
   {
        /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
-    1, 2, 2, 4, 1, 2, 1, 1, 4, 4
+    1, 2, 2, 4, 1, 2, 2, 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)
@@ -263,31 +326,37 @@ PORT pic_port =
     "OSEG    (OVR,DATA)",
     "GSFINAL (CODE)",
     "HOME       (CODE)",
+    NULL, // xidata
+    NULL, // xinit
     NULL,
     NULL,
-    1
+    1        // code is read only
   },
   {
     +1, 1, 4, 1, 1, 0
   },
     /* pic14 has an 8 bit mul */
   {
-    1, 0
+    1, -1
   },
   "_",
   _pic14_init,
   _pic14_parseOptions,
+  NULL,
   _pic14_finaliseOptions,
   _pic14_setDefaultOptions,
   pic14_assignRegisters,
   _pic14_getRegName,
   _pic14_keywords,
   _pic14_genAssemblerPreamble,
+  NULL,                                /* no genAssemblerEnd */
   _pic14_genIVT,
+  NULL, // _pic14_genXINIT
   _pic14_reset_regparm,
   _pic14_regparm,
   NULL,
   NULL,
+  _hasNativeMulFor,
   FALSE,
   0,                           /* leave lt */
   0,                           /* leave gt */
@@ -295,5 +364,11 @@ PORT pic_port =
   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
 };