c980c6075a10a6681c614585f453aaf0e46bd4ab
[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 /** tags for far, near, xstack, code generic pointers */
142     struct
143       {
144         int tag_far;
145         int tag_near;
146         int tag_xstack;
147         int tag_code;
148       }
149     gp_tags;
150       
151 /** memory regions related stuff */
152     struct
153       {
154         const char *xstack_name;
155         const char *istack_name;
156         const char *code_name;
157         const char *data_name;
158         const char *idata_name;
159         const char *pdata_name;
160         const char *xdata_name;
161         const char *bit_name;
162         const char *reg_name;
163         const char *static_name;
164         const char *overlay_name;
165         const char *post_static_name;
166         const char *home_name;
167         const char *xidata_name; // initialized xdata
168         const char *xinit_name; // a code copy of xidata
169         const char *const_name; // const data (code or not)
170         const char *cabs_name; // const absolute data (code or not)
171         struct memmap *default_local_map; // default location for auto vars
172         struct memmap *default_globl_map; // default location for globl vars
173         int code_ro;            /* code space read-only 1=yes */
174       }
175     mem;
176
177     struct
178       {
179           void (*genExtraAreaDeclaration)(FILE *, bool);
180           void (*genExtraAreaLinkOptions)(FILE *);
181       }
182     extraAreas;
183
184     /* stack related information */
185     struct
186       {
187 /** -1 for grows down (z80), +1 for grows up (mcs51) */
188         int direction;
189 /** Extra overhead when calling between banks */
190         int bank_overhead;
191 /** Extra overhead when the function is an ISR */
192         int isr_overhead;
193 /** Standard overhead for a function call */
194         int call_overhead;
195 /** Re-enterant space */
196         int reent_overhead;
197         /** 'banked' call overhead.
198             Mild overlap with bank_overhead */
199         int banked_overhead;
200       }
201     stack;
202
203     struct
204       {
205         /** One more than the smallest
206             mul/div operation the processor can do natively
207             Eg if the processor has an 8 bit mul, native below is 2 */
208         unsigned muldiv;
209         unsigned shift;
210       }
211     support;
212
213     struct
214       {
215         void (*emitDebuggerSymbol) (char *);
216         struct
217           {
218             int (*regNum) (struct regs *);
219             bitVect * cfiSame;
220             bitVect * cfiUndef;
221             int addressSize;
222             int regNumRet;
223             int regNumSP;
224             int regNumBP;
225             int offsetSP;
226           }
227         dwarf;
228       }
229     debugger;
230
231     struct
232       {
233         int maxCount;
234         int sizeofElement;
235         int sizeofMatchJump[3];
236         int sizeofRangeCompare[3];
237         int sizeofSubtract;
238         int sizeofDispatch;
239       }
240     jumptableCost;
241
242 /** Prefix to add to a C function (eg "_") */
243     const char *fun_prefix;
244
245     /** Called once the processor target has been selected.
246         First chance to initalise and set any port specific variables.
247         'port' is set before calling this.  May be NULL.
248     */
249     void (*init) (void);
250 /** Parses one option + its arguments */
251       bool (*parseOption) (int *pargc, char **argv, int *i);
252 /** Optional list of automatically parsed options.  Should be
253     implemented to at least show the help text correctly. */
254     OPTION *poptions;
255 /** Initialise port spectific paths */
256     void (*initPaths)(void);
257 /** Called after all the options have been parsed. */
258     void (*finaliseOptions) (void);
259     /** Called after the port has been selected but before any
260         options are parsed. */
261     void (*setDefaultOptions) (void);
262 /** Does the dirty work. */
263     void (*assignRegisters) (struct ebbIndex *);
264
265     /** Returns the register name of a symbol.
266         Used so that 'regs' can be an incomplete type. */
267     const char *(*getRegName) (struct regs * reg);
268
269     /* list of keywords that are used by this
270        target (used by lexer) */
271     char **keywords;
272
273     /* Write any port specific assembler output. */
274     void (*genAssemblerPreamble) (FILE * of);
275       /* invoked at end assembler file */
276     void (*genAssemblerEnd) (FILE * of);
277
278     /* Write the port specific IVT. If genIVT is NULL or if
279      * it returns zero, default (8051) IVT generation code
280      * will be used.
281      */
282     int (*genIVT) (FILE * of, symbol ** intTable, int intCount);
283
284     void (*genXINIT) (FILE * of);
285
286     /* Write port specific startup code */
287     void (*genInitStartup) (FILE * of);
288
289     /* parameter passing in register related functions */
290     void (*reset_regparms) (void);      /* reset the register count */
291     int (*reg_parm) (struct sym_link *, bool reentrant);        /* will return 1 if can be passed in register */
292
293     /** Process the pragma string 'sz'.  Returns 0 if recognised and
294         processed, 1 otherwise.  May be NULL.
295     */
296     int (*process_pragma) (const char *sz);
297
298     /** Mangles a support function name to reflect the calling model.
299      */
300     char *(*getMangledFunctionName) (char *szOrginial);
301
302     /** Returns true if the port can multiply the two types nativly
303         without using support functions.
304     */
305     bool (*hasNativeMulFor) (iCode *ic, sym_link *left, sym_link *right);
306
307     /** Returns true if the port has implemented certain bit
308         manipulation iCodes (RRC, RLC, SWAP, GETHBIT, GETABIT, GETBYTE, GETWORD)
309     */
310     bool (*hasExtBitOp) (int op, int size);
311
312     /** Returns the relative expense of accessing a particular output
313         storage class. Larger values indicate higher expense.
314     */
315     int (*oclsExpense) (struct memmap *oclass);
316
317     /** If TRUE, then tprintf and !dw will be used for some initalisers
318      */
319     bool use_dw_for_init;
320
321     /** TRUE for targets with little endian byte ordering, FALSE for
322         targets with big endian byte ordering.
323      */
324     bool little_endian;
325
326     /* condition transformations */
327     bool lt_nge;                /* transform (a < b)  to !(a >= b)  */
328     bool gt_nle;                /* transform (a > b)  to !(a <= b)  */
329     bool le_ngt;                /* transform (a <= b) to !(a > b)   */
330     bool ge_nlt;                /* transform (a >= b) to !(a < b)   */
331     bool ne_neq;                /* transform a != b --> ! (a == b)  */
332     bool eq_nne;                /* transform a == b --> ! (a != b)  */
333
334     bool arrayInitializerSuppported;
335     bool (*cseOk) (iCode *ic, iCode *pdic);
336     builtins *builtintable;     /* table of builtin functions */
337     int unqualified_pointer;    /* unqualified pointers type is  */
338     int reset_labelKey  ;       /* reset Label no 1 at the start of a function */
339     int globals_allowed ;       /* global & static locals not allowed ?  0 ONLY TININative*/
340 #define PORT_MAGIC 0xAC32
341 /** Used at runtime to detect if this structure has been completly filled in. */
342     int magic;
343   }
344 PORT;
345
346 extern PORT *port;
347
348 #if !OPT_DISABLE_MCS51
349 extern PORT mcs51_port;
350 #endif
351 #if !OPT_DISABLE_GBZ80
352 extern PORT gbz80_port;
353 #endif
354 #if !OPT_DISABLE_Z80
355 extern PORT z80_port;
356 #endif
357 #if !OPT_DISABLE_AVR
358 extern PORT avr_port;
359 #endif
360 #if !OPT_DISABLE_DS390
361 extern PORT ds390_port;
362 #endif
363 #if !OPT_DISABLE_PIC
364 extern PORT pic_port;
365 #endif
366 #if !OPT_DISABLE_PIC16
367 extern PORT pic16_port;
368 #endif
369 #if !OPT_DISABLE_TININative
370 extern PORT tininative_port;
371 #endif
372 #if !OPT_DISABLE_XA51
373 extern PORT xa51_port;
374 #endif
375 #if !OPT_DISABLE_DS400
376 extern PORT ds400_port;
377 #endif
378 #if !OPT_DISABLE_HC08
379 extern PORT hc08_port;
380 #endif
381
382 #endif /* PORT_INCLUDE*/