* .version: changed version to 2.5.4
[fw/sdcc] / src / pic / main.c
index a84d1bc8050122c8419d470bd3226677f16db153..976a2e4794e183548d0b3592a050b3dd7f535b68 100644 (file)
@@ -9,6 +9,8 @@
 #include "ralloc.h"
 #include "device.h"
 #include "SDCCutil.h"
+#include "SDCCmacro.h"
+#include "MySystem.h"
 #include "glue.h"
 //#include "gen.h"
 
@@ -23,33 +25,46 @@ static char _defaultRules[] =
 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
+       "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;
+
+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 , NULL, NULL, NULL }
 };
 
 void  pCodeInitRegisters(void);
 
-void pic14_assignRegisters (eBBlock ** ebbs, int count);
+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 */
 
@@ -58,16 +73,17 @@ _pic14_init (void)
 {
        asm_addTree (&asm_asxxxx_mapping);
        pCodeInitRegisters();
+       memset (&pic14_options, 0, sizeof (pic14_options));
 }
 
 static void
-_pic14_reset_regparm ()
+_pic14_reset_regparm (void)
 {
        regParmFlg = 0;
 }
 
 static int
-_pic14_regparm (sym_link * l)
+_pic14_regparm (sym_link * l, bool reentrant)
 {
 /* for this processor it is simple
        can pass only the first parameter in a register */
@@ -167,7 +183,7 @@ _pic14_parseOptions (int *pargc, char **argv, int *i)
                }
                return 1;
        }
-       
+
        return FALSE;
 }
 
@@ -303,14 +319,20 @@ sym_link *test = NULL;
 value *val;
        */
        
-       fprintf(stderr,"checking for native mult\n");
+       //fprintf(stderr,"checking for native mult\n");
        
        if ( ic->op != '*')
        {
                return FALSE;
        }
        
-       return TRUE;
+       /* 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))
        {
@@ -375,7 +397,7 @@ MUST be terminated with a NULL.
 */
 static const char *_linkCmd[] =
 {
-       "gplink", "-o $2", "\"$1.o\"", "$l", NULL
+       "gplink", "$l", "-o \"$2\"", "\"$1\"", "$3", NULL
 };
 
 static const char *_asmCmd[] =
@@ -384,6 +406,68 @@ static const char *_asmCmd[] =
                
 };
 
+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 ()
+{
+  hTab *linkValues=NULL;
+  char lfrm[256];
+  char *lcmd;
+  char temp[128];
+  set *tSet=NULL;
+  int ret;
+  
+  /*
+   * link command format:
+   * {linker} {incdirs} {lflags} -o {outfile} {spec_ofiles} {ofiles} {libs}
+   *
+   */
+
+  sprintf(lfrm, "{linker} {incdirs} {sysincdirs} {lflags} -o {outfile} {user_ofile} {spec_ofiles} {ofiles} {libs}");
+
+  shash_add(&linkValues, "linker", "gplink");
+
+  /* LIBRARY SEARCH DIRS */
+  mergeSets(&tSet, libPathsSet);
+  mergeSets(&tSet, libDirsSet);
+  shash_add(&linkValues, "incdirs", joinStrSet(appendStrSet(tSet, "-I\"", "\"")));
+
+  SNPRINTF (&temp[0], 128, "%cpic\"", DIR_SEPARATOR_CHAR);
+  joinStrSet(appendStrSet(libDirsSet, "-I\"", &temp[0]));
+  shash_add(&linkValues, "sysincdirs", joinStrSet(appendStrSet(libDirsSet, "-I\"", &temp[0])));
+  
+  shash_add(&linkValues, "lflags", joinStrSet(linkOptionsSet));
+
+  shash_add(&linkValues, "outfile", dstFileName);
+
+  if(fullSrcFileName) {
+    sprintf(temp, "%s.o", dstFileName);
+    shash_add(&linkValues, "user_ofile", temp);
+  }
+
+  shash_add(&linkValues, "ofiles", joinStrSet(relFilesSet));
+
+  /* LIBRARIES */
+  addSet(&libFilesSet, "libsdcc.lib");
+  shash_add(&linkValues, "libs", joinStrSet(libFilesSet));
+
+  lcmd = msprintf(linkValues, lfrm);
+
+  ret = my_system( lcmd );
+
+  Safe_free( lcmd );
+
+  if(ret)
+    exit(1);
+}
+
 /* Globals */
 PORT pic_port =
 {
@@ -411,7 +495,7 @@ PORT pic_port =
        {
                _linkCmd,
                NULL,
-               NULL,
+               _pic14_do_link,         /* own do link function */
                ".o",
                0
        },
@@ -420,7 +504,7 @@ PORT pic_port =
        },
        {
                /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
-               1, 2, 2, 4, 2, 2, 2, 1, 4, 4
+               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)
@@ -432,6 +516,7 @@ PORT pic_port =
                "code",
                "DSEG    (DATA)",
                "ISEG    (DATA)",
+               NULL, /* pdata */
                "XSEG    (XDATA)",
                "BSEG    (BIT)",
                "RSEG    (DATA)",
@@ -441,6 +526,7 @@ PORT pic_port =
                "HOME    (CODE)",
                NULL, // xidata
                NULL, // xinit
+               "CONST   (CODE)",               // const_name - const data (code or not)
                NULL,
                NULL,
                1        // code is read only
@@ -453,9 +539,23 @@ PORT pic_port =
        {
                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,
        NULL,
        _pic14_finaliseOptions,
        _pic14_setDefaultOptions,