* as/asx8051.dsp: added mcs51/strcmpi.h
[fw/sdcc] / src / port.h
1 /** @file port.h
2     Definitions for what a port must provide.
3     All ports are referenced in SDCCmain.c.
4 */
5 #ifndef PORT_INCLUDE
6 #define PORT_INCLUDE
7
8 #include "SDCCicode.h"
9 #include "SDCCargs.h"
10 #include "SDCCpeeph.h"
11
12 #define TARGET_ID_MCS51    1
13 #define TARGET_ID_GBZ80    2
14 #define TARGET_ID_Z80      3
15 #define TARGET_ID_AVR      4
16 #define TARGET_ID_DS390    5
17 #define TARGET_ID_PIC      6
18 #define TARGET_ID_PIC16    7
19 #define TARGET_ID_XA51     9
20 #define TARGET_ID_DS400    10
21 #define TARGET_ID_HC08     11
22
23 /* Macro to test the target we are compiling for.
24    Can only be used after SDCCmain has defined the port
25 */
26 #define TARGET_IS_MCS51 (port->id==TARGET_ID_MCS51)
27 #define TARGET_IS_GBZ80 (port->id==TARGET_ID_GBZ80)
28 #define TARGET_IS_Z80 (port->id==TARGET_ID_Z80)
29 #define TARGET_IS_AVR (port->id==TARGET_ID_AVR)
30 #define TARGET_IS_DS390 (port->id==TARGET_ID_DS390)
31 #define TARGET_IS_DS400 (port->id==TARGET_ID_DS400)
32 #define TARGET_IS_PIC   (port->id==TARGET_ID_PIC)
33 #define TARGET_IS_PIC16 (port->id==TARGET_ID_PIC16)
34 #define TARGET_IS_XA51 (port->id==TARGET_ID_XA51)
35 #define TARGET_IS_HC08 (port->id==TARGET_ID_HC08)
36
37 #define MAX_BUILTIN_ARGS        16
38 /* definition of builtin functions */
39 typedef struct builtins
40 {
41     char *name ;                /* name of builtin function */
42     char *rtype;                /* return type as string : see typefromStr */
43     int  nParms;                /* number of parms : max 8 */
44     char *parm_types[MAX_BUILTIN_ARGS]; /* each parm type as string : see typeFromStr */
45 } builtins ;
46
47 struct ebbIndex;
48
49 /* Processor specific names */
50 typedef struct
51   {
52 /** Unique id for this target */
53     const int id;
54 /** Target name used for -m */
55     const char *target;
56
57 /** Target name string, used for --help */
58     const char *target_name;
59
60 /** Specific processor for the given target family. specified by -p */
61     char *processor;
62
63     struct
64       {
65         /** Pointer to glue function */
66         void (*do_glue)(void);
67         /** TRUE if all types of glue functions should be inserted into
68             the file that also defines main.
69             We dont want this in cases like the z80 where the startup
70             code is provided by a seperate module.
71         */
72         bool glue_up_main;
73         /* OR of MODEL_* */
74         int supported_models;
75         int default_model;
76       }
77     general;
78
79     /* assembler related information */
80     struct
81       {
82         /** Command to run and arguments (eg as-z80) */
83         const char **cmd;
84         /** Alternate macro based form. */
85         const char *mcmd;
86         /** Arguments for debug mode. */
87         const char *debug_opts;
88         /** Arguments for normal assembly mode. */
89         const char *plain_opts;
90         /* print externs as global */
91         int externGlobal;
92         /* assembler file extension */
93         const char *file_ext;
94         /** If non-null will be used to execute the assembler. */
95         void (*do_assemble) (set *);
96       }
97     assembler;
98
99     /* linker related info */
100     struct
101       {
102         /** Command to run (eg link-z80) */
103         const char **cmd;
104         /** Alternate macro based form. */
105         const char *mcmd;
106         /** If non-null will be used to execute the link. */
107         void (*do_link) (void);
108         /** Extension for object files (.rel, .obj, ...) */
109         const char *rel_ext;
110         /** 1 if port needs the .lnk file, 0 otherwise */
111         const int needLinkerScript;
112       }
113     linker;
114
115     struct
116       {
117 /** Default peephole rules */
118         char *default_rules;
119         int (*getSize)(lineNode *line);
120         bitVect * (*getRegsRead)(lineNode *line);
121         bitVect * (*getRegsWritten)(lineNode *line);
122       }
123     peep;
124
125 /** Basic type sizes */
126     struct
127       {
128         int char_size;
129         int short_size;
130         unsigned int int_size;
131         int long_size;
132         int ptr_size;       //near
133         int fptr_size;      //far
134         int gptr_size;      //generic
135         int bit_size;
136         int float_size;
137         int max_base_size;
138       }
139     s;
140
141 /** memory regions related stuff */
142     struct
143       {
144         const char *xstack_name;
145         const char *istack_name;
146         const char *code_name;
147         const char *data_name;
148         const char *idata_name;
149         const char *pdata_name;
150         const char *xdata_name;
151         const char *bit_name;
152         const char *reg_name;
153         const char *static_name;
154         const char *overlay_name;
155         const char *post_static_name;
156         const char *home_name;
157         const char *xidata_name; // initialized xdata
158         const char *xinit_name; // a code copy of xidata
159         const char *const_name; // const data (code or not)
160         struct memmap *default_local_map; // default location for auto vars
161         struct memmap *default_globl_map; // default location for globl vars
162         int code_ro;            /* code space read-only 1=yes */
163       }
164     mem;
165
166     struct
167       {
168           void (*genExtraAreaDeclaration)(FILE *, bool);
169           void (*genExtraAreaLinkOptions)(FILE *);
170       }
171     extraAreas;
172
173     /* stack related information */
174     struct
175       {
176 /** -1 for grows down (z80), +1 for grows up (mcs51) */
177         int direction;
178 /** Extra overhead when calling between banks */
179         int bank_overhead;
180 /** Extra overhead when the function is an ISR */
181         int isr_overhead;
182 /** Standard overhead for a function call */
183         int call_overhead;
184 /** Re-enterant space */
185         int reent_overhead;
186         /** 'banked' call overhead.
187             Mild overlap with bank_overhead */
188         int banked_overhead;
189       }
190     stack;
191
192     struct
193       {
194         /** One more than the smallest
195             mul/div operation the processor can do nativley
196             Eg if the processor has an 8 bit mul, nativebelow is 2 */
197         unsigned muldiv;
198         unsigned shift;
199       }
200     support;
201
202     struct
203       {
204         void (*emitDebuggerSymbol) (char *);
205         struct
206           {
207             int (*regNum) (struct regs *);
208             bitVect * cfiSame;
209             bitVect * cfiUndef;
210             int addressSize;
211             int regNumRet;
212             int regNumSP;
213             int regNumBP;
214             int offsetSP;
215           }
216         dwarf;
217       }
218     debugger;
219
220     struct
221       {
222         int maxCount;
223         int sizeofElement;
224         int sizeofMatchJump[3];
225         int sizeofRangeCompare[3];
226         int sizeofSubtract;
227         int sizeofDispatch;
228       }
229     jumptableCost;
230
231 /** Prefix to add to a C function (eg "_") */
232     const char *fun_prefix;
233
234     /** Called once the processor target has been selected.
235         First chance to initalise and set any port specific variables.
236         'port' is set before calling this.  May be NULL.
237     */
238     void (*init) (void);
239 /** Parses one option + its arguments */
240       bool (*parseOption) (int *pargc, char **argv, int *i);
241 /** Optional list of automatically parsed options.  Should be
242     implemented to at least show the help text correctly. */
243     OPTION *poptions;
244 /** Initialise port spectific paths */
245     void (*initPaths)(void);
246 /** Called after all the options have been parsed. */
247     void (*finaliseOptions) (void);
248     /** Called after the port has been selected but before any
249         options are parsed. */
250     void (*setDefaultOptions) (void);
251 /** Does the dirty work. */
252     void (*assignRegisters) (struct ebbIndex *);
253
254     /** Returns the register name of a symbol.
255         Used so that 'regs' can be an incomplete type. */
256     const char *(*getRegName) (struct regs * reg);
257
258     /* list of keywords that are used by this
259        target (used by lexer) */
260     char **keywords;
261
262     /* Write any port specific assembler output. */
263     void (*genAssemblerPreamble) (FILE * of);
264       /* invoked at end assembler file */
265     void (*genAssemblerEnd) (FILE * of);
266
267     /* Write the port specific IVT. If genIVT is NULL or if
268      * it returns zero, default (8051) IVT generation code
269      * will be used.
270      */
271     int (*genIVT) (FILE * of, symbol ** intTable, int intCount);
272
273     void (*genXINIT) (FILE * of);
274
275     /* Write port specific startup code */
276     void (*genInitStartup) (FILE * of);
277
278     /* parameter passing in register related functions */
279     void (*reset_regparms) (void);      /* reset the register count */
280     int (*reg_parm) (struct sym_link *, bool reentrant);        /* will return 1 if can be passed in register */
281
282     /** Process the pragma string 'sz'.  Returns 0 if recognised and
283         processed, 1 otherwise.  May be NULL.
284     */
285     int (*process_pragma) (const char *sz);
286
287     /** Mangles a support function name to reflect the calling model.
288      */
289     char *(*getMangledFunctionName) (char *szOrginial);
290
291     /** Returns true if the port can multiply the two types nativly
292         without using support functions.
293     */
294     bool (*hasNativeMulFor) (iCode *ic, sym_link *left, sym_link *right);
295
296     /** Returns true if the port has implemented certain bit
297         manipulation iCodes (RRC, RLC, SWAP, GETHBIT, GETABIT, GETBYTE, GETWORD)
298     */
299     bool (*hasExtBitOp) (int op, int size);
300
301     /** Returns the relative expense of accessing a particular output
302         storage class. Larger values indicate higher expense.
303     */
304     int (*oclsExpense) (struct memmap *oclass);
305
306     /** If TRUE, then tprintf and !dw will be used for some initalisers
307      */
308     bool use_dw_for_init;
309
310     /** TRUE for targets with little endian byte ordering, FALSE for
311         targets with big endian byte ordering.
312      */
313     bool little_endian;
314
315     /* condition transformations */
316     bool lt_nge;                /* transform (a < b)  to !(a >= b)  */
317     bool gt_nle;                /* transform (a > b)  to !(a <= b)  */
318     bool le_ngt;                /* transform (a <= b) to !(a > b)   */
319     bool ge_nlt;                /* transform (a >= b) to !(a < b)   */
320     bool ne_neq;                /* transform a != b --> ! (a == b)  */
321     bool eq_nne;                /* transform a == b --> ! (a != b)  */
322
323     bool arrayInitializerSuppported;
324     bool (*cseOk) (iCode *ic, iCode *pdic);
325     builtins *builtintable;     /* table of builtin functions */
326     int unqualified_pointer;    /* unqualified pointers type is  */
327     int reset_labelKey  ;       /* reset Label no 1 at the start of a function */
328     int globals_allowed ;       /* global & static locals not allowed ?  0 ONLY TININative*/
329 #define PORT_MAGIC 0xAC32
330 /** Used at runtime to detect if this structure has been completly filled in. */
331     int magic;
332   }
333 PORT;
334
335 extern PORT *port;
336
337 #if !OPT_DISABLE_MCS51
338 extern PORT mcs51_port;
339 #endif
340 #if !OPT_DISABLE_GBZ80
341 extern PORT gbz80_port;
342 #endif
343 #if !OPT_DISABLE_Z80
344 extern PORT z80_port;
345 #endif
346 #if !OPT_DISABLE_AVR
347 extern PORT avr_port;
348 #endif
349 #if !OPT_DISABLE_DS390
350 extern PORT ds390_port;
351 #endif
352 #if !OPT_DISABLE_PIC
353 extern PORT pic_port;
354 #endif
355 #if !OPT_DISABLE_PIC16
356 extern PORT pic16_port;
357 #endif
358 #if !OPT_DISABLE_TININative
359 extern PORT tininative_port;
360 #endif
361 #if !OPT_DISABLE_XA51
362 extern PORT xa51_port;
363 #endif
364 #if !OPT_DISABLE_DS400
365 extern PORT ds400_port;
366 #endif
367 #if !OPT_DISABLE_HC08
368 extern PORT hc08_port;
369 #endif
370
371 #endif /* PORT_INCLUDE*/