Fixed up more warnings
[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
10 #define TARGET_ID_MCS51    1
11 #define TARGET_ID_GBZ80    2
12 #define TARGET_ID_Z80      3
13 #define TARGET_ID_AVR      4
14 #define TARGET_ID_DS390    5
15 #define TARGET_ID_PIC      6
16 #define TARGET_ID_I186     7
17 #define TARGET_ID_TLCS900H 8
18 #define TARGET_ID_XA51     9
19
20 /* Macro to test the target we are compiling for.
21    Can only be used after SDCCmain has defined the port
22 */
23 #define TARGET_IS_MCS51 (port->id==TARGET_ID_MCS51)
24 #define TARGET_IS_GBZ80 (port->id==TARGET_ID_GBZ80)
25 #define TARGET_IS_Z80 (port->id==TARGET_ID_Z80)
26 #define TARGET_IS_AVR (port->id==TARGET_ID_AVR)
27 #define TARGET_IS_DS390 (port->id==TARGET_ID_DS390)
28 #define TARGET_IS_PIC   (port->id==TARGET_ID_PIC)
29 #define TARGET_IS_I186 (port->id==TARGET_ID_I186)
30 #define TARGET_IS_TCLS900H (port->id==TARGET_ID_TCLS900H)
31
32 #define MAX_BUILTIN_ARGS        16
33 /* definition of builtin functions */
34 typedef struct builtins
35 {
36     char *name ;                /* name of builtin function */
37     char *rtype;                /* return type as string : see typefromStr */
38     int  nParms;                /* number of parms : max 8 */
39     char *parm_types[MAX_BUILTIN_ARGS]; /* each parm type as string : see typeFromStr */
40 } builtins ;
41
42 /* Processor specific names */
43 typedef struct
44   {
45 /** Unique id for this target */
46     const int id;
47 /** Target name used for -m */
48     const char *target;
49
50 /** Target name string, used for --help */
51     const char *target_name;
52
53     struct
54       {
55         /** TRUE if all types of glue functions should be inserted into
56             the file that also defines main.
57             We dont want this in cases like the z80 where the startup
58             code is provided by a seperate module.
59         */
60         bool glue_up_main;
61         /* OR of MODEL_* */
62         int supported_models;
63         int default_model;
64       }
65     general;
66
67     /* assembler related information */
68     struct
69       {
70         /** Command to run and arguments (eg as-z80) */
71         const char **cmd;
72         /** Alternate macro based form. */
73         const char *mcmd;
74         /** Arguments for debug mode. */
75         const char *debug_opts;
76         /** Arguments for normal assembly mode. */
77         const char *plain_opts;
78         /* print externs as global */
79         int externGlobal;
80         /* assembler file extension */
81         const char *file_ext;
82       }
83     assembler;
84
85     /* linker related info */
86     struct
87       {
88         /** Command to run (eg link-z80) */
89         const char **cmd;
90         /** Alternate macro based form. */
91         const char *mcmd;
92         /** If non-null will be used to execute the link. */
93         void (*do_link) (void);
94         /** Extention for object files (.rel, .obj, ...) */
95         const char *rel_ext;
96       }
97     linker;
98
99     struct
100       {
101 /** Default peephole rules */
102         char *default_rules;
103       }
104     peep;
105
106 /** Basic type sizes */
107     struct
108       {
109         int char_size;
110         int short_size;
111         int int_size;
112         int long_size;
113         int ptr_size;
114         int fptr_size;
115         int gptr_size;
116         int bit_size;
117         int float_size;
118         int max_base_size;
119       }
120     s;
121
122 /** memory regions related stuff */
123     struct
124       {
125         const char *xstack_name;
126         const char *istack_name;
127         const char *code_name;
128         const char *data_name;
129         const char *idata_name;
130         const char *xdata_name;
131         const char *bit_name;
132         const char *reg_name;
133         const char *static_name;
134         const char *overlay_name;
135         const char *post_static_name;
136         const char *home_name;
137         struct memmap *default_local_map;       /* default location for auto vars */
138         struct memmap *default_globl_map;       /* default location for globl vars */
139         int code_ro;            /* code space read-only 1=yes */
140       }
141     mem;
142
143     /* stack related information */
144     struct
145       {
146 /** -1 for grows down (z80), +1 for grows up (mcs51) */
147         int direction;
148 /** Extra overhead when calling between banks */
149         int bank_overhead;
150 /** Extra overhead when the function is an ISR */
151         int isr_overhead;
152 /** Standard overhead for a function call */
153         int call_overhead;
154 /** Re-enterant space */
155         int reent_overhead;
156         /** 'banked' call overhead.
157             Mild overlap with bank_overhead */
158         int banked_overhead;
159       }
160     stack;
161
162     struct
163       {
164         /** One more than the smallest 
165             mul/div operation the processor can do nativley 
166             Eg if the processor has an 8 bit mul, nativebelow is 2 */
167         unsigned muldiv;
168         unsigned shift;
169       }
170     support;
171
172 /** Prefix to add to a C function (eg "_") */
173     const char *fun_prefix;
174
175     /** Called once the processor target has been selected.
176         First chance to initalise and set any port specific variables.
177         'port' is set before calling this.  May be NULL.
178     */
179     void (*init) (void);
180 /** Parses one option + its arguments */
181       bool (*parseOption) (int *pargc, char **argv, int *i);
182 /** Called after all the options have been parsed. */
183     void (*finaliseOptions) (void);
184     /** Called after the port has been selected but before any
185         options are parsed. */
186     void (*setDefaultOptions) (void);
187 /** Does the dirty work. */
188     void (*assignRegisters) (struct eBBlock **, int);
189
190     /** Returns the register name of a symbol.
191         Used so that 'regs' can be an incomplete type. */
192     const char *(*getRegName) (struct regs * reg);
193
194     /* list of keywords that are used by this
195        target (used by lexer) */
196     char **keywords;
197
198     /* Write any port specific assembler output. */
199     void (*genAssemblerPreamble) (FILE * of);
200
201     /* Write the port specific IVT. If genIVT is NULL or if
202      * it returns zero, default (8051) IVT generation code
203      * will be used. 
204      */
205     int (*genIVT) (FILE * of, symbol ** intTable, int intCount);
206
207
208     /* parameter passing in register related functions */
209     void (*reset_regparms) ();  /* reset the register count */
210     int (*reg_parm) (struct sym_link *);        /* will return 1 if can be passed in register */
211
212     /** Process the pragma string 'sz'.  Returns 0 if recognised and
213         processed, 1 otherwise.  May be NULL.
214     */
215     int (*process_pragma) (const char *sz);
216
217     /** Mangles a support function name to reflect the calling model. 
218      */
219     char *(*getMangledFunctionName) (char *szOrginial);
220
221     /** Returns true if the port can multiply the two types nativly
222         without using support functions.
223     */
224     bool (*hasNativeMulFor) (iCode *ic, sym_link *left, sym_link *right);
225
226     /** If TRUE, then tprintf and !dw will be used for some initalisers
227      */
228     bool use_dw_for_init;
229
230     /* condition transformations */
231     bool lt_nge;                /* transform (a < b)  to !(a >= b)  */
232     bool gt_nle;                /* transform (a > b)  to !(a <= b)  */
233     bool le_ngt;                /* transform (a <= b) to !(a > b)   */
234     bool ge_nlt;                /* transform (a >= b) to !(a < b)   */
235     bool ne_neq;                /* transform a != b --> ! (a == b)  */
236     bool eq_nne;                /* transform a == b --> ! (a != b)  */
237
238     bool arrayInitializerSuppported;  
239     
240     bool (*cseOk) (iCode *ic, iCode *pdic);
241     builtins *builtintable;    /* table of builtin functions */
242 #define PORT_MAGIC 0xAC32
243 /** Used at runtime to detect if this structure has been completly filled in. */
244     int magic;
245   }
246 PORT;
247
248 extern PORT *port;
249
250 #if !OPT_DISABLE_MCS51
251 extern PORT mcs51_port;
252 #endif
253 #if !OPT_DISABLE_GBZ80
254 extern PORT gbz80_port;
255 #endif
256 #if !OPT_DISABLE_Z80
257 extern PORT z80_port;
258 #endif
259 #if !OPT_DISABLE_AVR
260 extern PORT avr_port;
261 #endif
262 #if !OPT_DISABLE_DS390
263 extern PORT ds390_port;
264 #endif
265 #if !OPT_DISABLE_PIC
266 extern PORT pic_port;
267 #endif
268 #if !OPT_DISABLE_I186
269 extern PORT i186_port;
270 #endif
271 #if !OPT_DISABLE_TLCS900H
272 extern PORT tlcs900h_port;
273 #endif
274
275 #endif /* PORT_INCLUDE*/