#include "ralloc.h"
#include "device.h"
#include "SDCCutil.h"
+#include "SDCCmacro.h"
+#include "MySystem.h"
#include "glue.h"
//#include "gen.h"
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 */
{
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 */
}
return 1;
}
-
+
return FALSE;
}
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))
{
*/
static const char *_linkCmd[] =
{
- "gplink", "-o $2", "\"$1.o\"", "$l", NULL
+ "gplink", "$l", "-o \"$2\"", "\"$1\"", "$3", NULL
};
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 =
{
{
_linkCmd,
NULL,
- NULL,
+ _pic14_do_link, /* own do link function */
".o",
0
},
},
{
/* 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)
"code",
"DSEG (DATA)",
"ISEG (DATA)",
+ NULL, /* pdata */
"XSEG (XDATA)",
"BSEG (BIT)",
"RSEG (DATA)",
"HOME (CODE)",
NULL, // xidata
NULL, // xinit
+ "CONST (CODE)", // const_name - const data (code or not)
NULL,
NULL,
1 // code is read only
{
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,