2 Definitions for what a port must provide.
3 All ports are referenced in SDCCmain.c.
10 #include "SDCCpeeph.h"
12 #include "mcs51/peep.h"
14 #define TARGET_ID_MCS51 1
15 #define TARGET_ID_GBZ80 2
16 #define TARGET_ID_Z80 3
17 #define TARGET_ID_AVR 4
18 #define TARGET_ID_DS390 5
19 #define TARGET_ID_PIC 6
20 #define TARGET_ID_PIC16 7
21 #define TARGET_ID_XA51 9
22 #define TARGET_ID_DS400 10
23 #define TARGET_ID_HC08 11
25 /* Macro to test the target we are compiling for.
26 Can only be used after SDCCmain has defined the port
28 #define TARGET_IS_MCS51 (port->id==TARGET_ID_MCS51)
29 #define TARGET_IS_GBZ80 (port->id==TARGET_ID_GBZ80)
30 #define TARGET_IS_Z80 (port->id==TARGET_ID_Z80)
31 #define TARGET_Z80_LIKE (TARGET_IS_Z80 || TARGET_IS_GBZ80)
32 #define TARGET_IS_AVR (port->id==TARGET_ID_AVR)
33 #define TARGET_IS_DS390 (port->id==TARGET_ID_DS390)
34 #define TARGET_IS_DS400 (port->id==TARGET_ID_DS400)
35 #define TARGET_IS_PIC (port->id==TARGET_ID_PIC)
36 #define TARGET_IS_PIC16 (port->id==TARGET_ID_PIC16)
37 #define TARGET_IS_XA51 (port->id==TARGET_ID_XA51)
38 #define TARGET_IS_HC08 (port->id==TARGET_ID_HC08)
39 #define TARGET_MCS51_LIKE (TARGET_IS_MCS51 || TARGET_IS_DS390 || TARGET_IS_DS400)
41 #define MAX_BUILTIN_ARGS 16
42 /* definition of builtin functions */
43 typedef struct builtins
45 char *name; /* name of builtin function */
46 char *rtype; /* return type as string : see typefromStr */
47 int nParms; /* number of parms : max 8 */
48 char *parm_types[MAX_BUILTIN_ARGS]; /* each parm type as string : see typeFromStr */
53 /* pragma structure */
59 int (*func)(int id, const char *name, const char *cp);
62 /* defined in SDCClex.lex */
63 int process_pragma_tbl(const struct pragma_s *pragma_tbl, const char *s);
65 /* Processor specific names */
68 /** Unique id for this target */
70 /** Target name used for -m */
71 const char * const target;
73 /** Target name string, used for --help */
74 const char * const target_name;
76 /** Specific processor for the given target family. specified by -p */
81 /** Pointer to glue function */
82 void (*do_glue)(void);
83 /** TRUE if all types of glue functions should be inserted into
84 the file that also defines main.
85 We dont want this in cases like the z80 where the startup
86 code is provided by a seperate module.
95 /* assembler related information */
98 /** Command to run and arguments (eg as-z80) */
100 /** Alternate macro based form. */
102 /** Arguments for debug mode. */
103 const char *debug_opts;
104 /** Arguments for normal assembly mode. */
105 const char *plain_opts;
106 /* print externs as global */
108 /* assembler file extension */
109 const char *file_ext;
110 /** If non-null will be used to execute the assembler. */
111 void (*do_assemble) (set *);
115 /* linker related info */
118 /** Command to run (eg link-z80) */
120 /** Alternate macro based form. */
122 /** If non-null will be used to execute the link. */
123 void (*do_link) (void);
124 /** Extension for object files (.rel, .obj, ...) */
126 /** 1 if port needs the .lnk file, 0 otherwise */
127 const int needLinkerScript;
133 /** Default peephole rules */
135 int (*getSize)(lineNode *line);
136 bitVect * (*getRegsRead)(lineNode *line);
137 bitVect * (*getRegsWritten)(lineNode *line);
138 bool (*deadMove) (const char *reg, lineNode *currPl, lineNode *head);
142 /** Basic type sizes */
147 unsigned int int_size;
151 int gptr_size; //generic
158 /** tags for far, near, xstack, code generic pointers */
168 /** memory regions related stuff */
171 const char * const xstack_name;
172 const char * const istack_name;
174 * The following 2 items can't be const pointers
175 * due to ugly implementation in z80 target;
176 * this should be fixed in src/z80/main.c (borutr)
178 const char *code_name;
179 const char *data_name;
180 const char * const idata_name;
181 const char * const pdata_name;
182 const char * const xdata_name;
183 const char * const bit_name;
184 const char * const reg_name;
185 const char * const static_name;
186 const char * const overlay_name;
187 const char * const post_static_name;
188 const char * const home_name;
189 const char * const xidata_name; // initialized xdata
190 const char * const xinit_name; // a code copy of xidata
191 const char * const const_name; // const data (code or not)
192 const char * const cabs_name; // const absolute data (code or not)
193 const char * const xabs_name; // absolute xdata/pdata
194 const char * const iabs_name; // absolute idata/data
195 struct memmap *default_local_map; // default location for auto vars
196 struct memmap *default_globl_map; // default location for globl vars
197 int code_ro; /* code space read-only 1=yes */
203 void (*genExtraAreaDeclaration)(FILE *, bool);
204 void (*genExtraAreaLinkOptions)(FILE *);
208 /* stack related information */
211 /** -1 for grows down (z80), +1 for grows up (mcs51) */
213 /** Extra overhead when calling between banks */
215 /** Extra overhead when the function is an ISR */
217 /** Standard overhead for a function call */
219 /** Re-enterant space */
221 /** 'banked' call overhead.
222 Mild overlap with bank_overhead */
229 /** One more than the smallest
230 mul/div operation the processor can do natively
231 Eg if the processor has an 8 bit mul, native below is 2 */
239 void (*emitDebuggerSymbol) (char *);
242 int (*regNum) (struct regs *);
259 int sizeofMatchJump[3];
260 int sizeofRangeCompare[3];
266 /** Prefix to add to a C function (eg "_") */
267 const char *fun_prefix;
269 /** Called once the processor target has been selected.
270 First chance to initalise and set any port specific variables.
271 'port' is set before calling this. May be NULL.
274 /** Parses one option + its arguments */
275 bool (*parseOption) (int *pargc, char **argv, int *i);
276 /** Optional list of automatically parsed options. Should be
277 implemented to at least show the help text correctly. */
279 /** Initialise port spectific paths */
280 void (*initPaths)(void);
281 /** Called after all the options have been parsed. */
282 void (*finaliseOptions) (void);
283 /** Called after the port has been selected but before any
284 options are parsed. */
285 void (*setDefaultOptions) (void);
286 /** Does the dirty work. */
287 void (*assignRegisters) (struct ebbIndex *);
289 /** Returns the register name of a symbol.
290 Used so that 'regs' can be an incomplete type. */
291 const char *(*getRegName) (struct regs * reg);
293 /* list of keywords that are used by this
294 target (used by lexer) */
297 /* Write any port specific assembler output. */
298 void (*genAssemblerPreamble) (FILE * of);
299 /* invoked at end assembler file */
300 void (*genAssemblerEnd) (FILE * of);
302 /* Write the port specific IVT. If genIVT is NULL or if
303 * it returns zero, default (8051) IVT generation code
306 int (*genIVT) (struct dbuf_s *oBuf, symbol ** intTable, int intCount);
308 void (*genXINIT) (FILE * of);
310 /* Write port specific startup code */
311 void (*genInitStartup) (FILE * of);
313 /* parameter passing in register related functions */
314 void (*reset_regparms) (void); /* reset the register count */
315 int (*reg_parm) (struct sym_link *, bool reentrant); /* will return 1 if can be passed in register */
317 /** Process the pragma string 'sz'. Returns 0 if recognised and
318 processed, 1 otherwise. May be NULL.
320 int (*process_pragma) (const char *sz);
322 /** Mangles a support function name to reflect the calling model.
324 char *(*getMangledFunctionName) (char *szOrginial);
326 /** Returns true if the port can multiply the two types nativly
327 without using support functions.
329 bool (*hasNativeMulFor) (iCode *ic, sym_link *left, sym_link *right);
331 /** Returns true if the port has implemented certain bit
332 manipulation iCodes (RRC, RLC, SWAP, GETHBIT, GETABIT, GETBYTE, GETWORD)
334 bool (*hasExtBitOp) (int op, int size);
336 /** Returns the relative expense of accessing a particular output
337 storage class. Larger values indicate higher expense.
339 int (*oclsExpense) (struct memmap *oclass);
341 /** If TRUE, then tprintf and !dw will be used for some initalisers
343 bool use_dw_for_init;
345 /** TRUE for targets with little endian byte ordering, FALSE for
346 targets with big endian byte ordering.
350 /* condition transformations */
351 bool lt_nge; /* transform (a < b) to !(a >= b) */
352 bool gt_nle; /* transform (a > b) to !(a <= b) */
353 bool le_ngt; /* transform (a <= b) to !(a > b) */
354 bool ge_nlt; /* transform (a >= b) to !(a < b) */
355 bool ne_neq; /* transform a != b --> ! (a == b) */
356 bool eq_nne; /* transform a == b --> ! (a != b) */
358 bool arrayInitializerSuppported;
359 bool (*cseOk) (iCode *ic, iCode *pdic);
360 builtins *builtintable; /* table of builtin functions */
361 int unqualified_pointer; /* unqualified pointers type is */
362 int reset_labelKey ; /* reset Label no 1 at the start of a function */
363 int globals_allowed ; /* global & static locals not allowed ? 0 ONLY TININative*/
364 #define PORT_MAGIC 0xAC32
365 /** Used at runtime to detect if this structure has been completly filled in. */
372 #if !OPT_DISABLE_MCS51
373 extern PORT mcs51_port;
375 #if !OPT_DISABLE_GBZ80
376 extern PORT gbz80_port;
379 extern PORT z80_port;
382 extern PORT avr_port;
384 #if !OPT_DISABLE_DS390
385 extern PORT ds390_port;
388 extern PORT pic_port;
390 #if !OPT_DISABLE_PIC16
391 extern PORT pic16_port;
393 #if !OPT_DISABLE_TININative
394 extern PORT tininative_port;
396 #if !OPT_DISABLE_XA51
397 extern PORT xa51_port;
399 #if !OPT_DISABLE_DS400
400 extern PORT ds400_port;
402 #if !OPT_DISABLE_HC08
403 extern PORT hc08_port;
406 #endif /* PORT_INCLUDE*/