#include "SDCCicode.h"
#include "SDCCargs.h"
+#include "SDCCpeeph.h"
#define TARGET_ID_MCS51 1
#define TARGET_ID_GBZ80 2
#define TARGET_ID_AVR 4
#define TARGET_ID_DS390 5
#define TARGET_ID_PIC 6
+#define TARGET_ID_PIC16 7
#define TARGET_ID_XA51 9
+#define TARGET_ID_DS400 10
+#define TARGET_ID_HC08 11
/* Macro to test the target we are compiling for.
Can only be used after SDCCmain has defined the port
#define TARGET_IS_Z80 (port->id==TARGET_ID_Z80)
#define TARGET_IS_AVR (port->id==TARGET_ID_AVR)
#define TARGET_IS_DS390 (port->id==TARGET_ID_DS390)
+#define TARGET_IS_DS400 (port->id==TARGET_ID_DS400)
#define TARGET_IS_PIC (port->id==TARGET_ID_PIC)
+#define TARGET_IS_PIC16 (port->id==TARGET_ID_PIC16)
#define TARGET_IS_XA51 (port->id==TARGET_ID_XA51)
+#define TARGET_IS_HC08 (port->id==TARGET_ID_HC08)
#define MAX_BUILTIN_ARGS 16
/* definition of builtin functions */
struct
{
+ /** Pointer to glue function */
+ void (*do_glue)(void);
/** TRUE if all types of glue functions should be inserted into
the file that also defines main.
We dont want this in cases like the z80 where the startup
/* assembler file extension */
const char *file_ext;
/** If non-null will be used to execute the assembler. */
- void (*do_assemble) (const char * const*);
+ void (*do_assemble) (set *);
}
assembler;
void (*do_link) (void);
/** Extension for object files (.rel, .obj, ...) */
const char *rel_ext;
+ /** 1 if port needs the .lnk file, 0 otherwise */
+ const int needLinkerScript;
}
linker;
{
/** Default peephole rules */
char *default_rules;
+ int (*getSize)(lineNode *line);
+ bitVect * (*getRegsRead)(lineNode *line);
+ bitVect * (*getRegsWritten)(lineNode *line);
}
peep;
const char *code_name;
const char *data_name;
const char *idata_name;
+ const char *pdata_name;
const char *xdata_name;
const char *bit_name;
const char *reg_name;
}
mem;
+ struct
+ {
+ void (*genExtraAreaDeclaration)(FILE *, bool);
+ void (*genExtraAreaLinkOptions)(FILE *);
+ }
+ extraAreas;
+
/* stack related information */
struct
{
}
support;
+ struct
+ {
+ void (*emitDebuggerSymbol) (char *);
+ struct
+ {
+ int (*regNum) (struct regs *);
+ bitVect * cfiSame;
+ bitVect * cfiUndef;
+ int addressSize;
+ int regNumRet;
+ int regNumSP;
+ int regNumBP;
+ int offsetSP;
+ }
+ dwarf;
+ }
+ debugger;
+
+ struct
+ {
+ int maxCount;
+ int sizeofElement;
+ int sizeofMatchJump[3];
+ int sizeofRangeCompare[3];
+ int sizeofSubtract;
+ int sizeofDispatch;
+ }
+ jumptableCost;
+
/** Prefix to add to a C function (eg "_") */
const char *fun_prefix;
/** Optional list of automatically parsed options. Should be
implemented to at least show the help text correctly. */
OPTION *poptions;
+/** Initialise port spectific paths */
+ void (*initPaths)(void);
/** Called after all the options have been parsed. */
void (*finaliseOptions) (void);
/** Called after the port has been selected but before any
int (*genIVT) (FILE * of, symbol ** intTable, int intCount);
void (*genXINIT) (FILE * of);
+
+ /* Write port specific startup code */
+ void (*genInitStartup) (FILE * of);
/* parameter passing in register related functions */
- void (*reset_regparms) (); /* reset the register count */
+ void (*reset_regparms) (void); /* reset the register count */
int (*reg_parm) (struct sym_link *); /* will return 1 if can be passed in register */
/** Process the pragma string 'sz'. Returns 0 if recognised and
*/
bool (*hasNativeMulFor) (iCode *ic, sym_link *left, sym_link *right);
+ /** Returns true if the port has implemented certain bit
+ manipulation iCodes (RRC, RLC, SWAP, GETHBIT)
+ */
+ bool (*hasExtBitOp) (int op, int size);
+
+ /** Returns the relative expense of accessing a particular output
+ storage class. Larger values indicate higher expense.
+ */
+ int (*oclsExpense) (struct memmap *oclass);
+
/** If TRUE, then tprintf and !dw will be used for some initalisers
*/
bool use_dw_for_init;
+ /** TRUE for targets with little endian byte ordering, FALSE for
+ targets with big endian byte ordering.
+ */
+ bool little_endian;
+
/* condition transformations */
bool lt_nge; /* transform (a < b) to !(a >= b) */
bool gt_nle; /* transform (a > b) to !(a <= b) */
#if !OPT_DISABLE_PIC
extern PORT pic_port;
#endif
+#if !OPT_DISABLE_PIC16
+extern PORT pic16_port;
+#endif
#if !OPT_DISABLE_TININative
extern PORT tininative_port;
#endif
#if !OPT_DISABLE_XA51
extern PORT xa51_port;
#endif
+#if !OPT_DISABLE_DS400
+extern PORT ds400_port;
+#endif
+#if !OPT_DISABLE_HC08
+extern PORT hc08_port;
+#endif
#endif /* PORT_INCLUDE*/