missing files for "added seperate segments for initialized data"
[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         const char *xidata_name; // initialized xdata
138         const char *xinit_name; // a code copy of xidata
139         struct memmap *default_local_map; // default location for auto vars
140         struct memmap *default_globl_map; // default location for globl vars
141         int code_ro;            /* code space read-only 1=yes */
142       }
143     mem;
144
145     /* stack related information */
146     struct
147       {
148 /** -1 for grows down (z80), +1 for grows up (mcs51) */
149         int direction;
150 /** Extra overhead when calling between banks */
151         int bank_overhead;
152 /** Extra overhead when the function is an ISR */
153         int isr_overhead;
154 /** Standard overhead for a function call */
155         int call_overhead;
156 /** Re-enterant space */
157         int reent_overhead;
158         /** 'banked' call overhead.
159             Mild overlap with bank_overhead */
160         int banked_overhead;
161       }
162     stack;
163
164     struct
165       {
166         /** One more than the smallest 
167             mul/div operation the processor can do nativley 
168             Eg if the processor has an 8 bit mul, nativebelow is 2 */
169         unsigned muldiv;
170         unsigned shift;
171       }
172     support;
173
174 /** Prefix to add to a C function (eg "_") */
175     const char *fun_prefix;
176
177     /** Called once the processor target has been selected.
178         First chance to initalise and set any port specific variables.
179         'port' is set before calling this.  May be NULL.
180     */
181     void (*init) (void);
182 /** Parses one option + its arguments */
183       bool (*parseOption) (int *pargc, char **argv, int *i);
184 /** Called after all the options have been parsed. */
185     void (*finaliseOptions) (void);
186     /** Called after the port has been selected but before any
187         options are parsed. */
188     void (*setDefaultOptions) (void);
189 /** Does the dirty work. */
190     void (*assignRegisters) (struct eBBlock **, int);
191
192     /** Returns the register name of a symbol.
193         Used so that 'regs' can be an incomplete type. */
194     const char *(*getRegName) (struct regs * reg);
195
196     /* list of keywords that are used by this
197        target (used by lexer) */
198     char **keywords;
199
200     /* Write any port specific assembler output. */
201     void (*genAssemblerPreamble) (FILE * of);
202
203     /* Write the port specific IVT. If genIVT is NULL or if
204      * it returns zero, default (8051) IVT generation code
205      * will be used. 
206      */
207     int (*genIVT) (FILE * of, symbol ** intTable, int intCount);
208
209     void (*genXINIT) (FILE * of);
210
211     /* parameter passing in register related functions */
212     void (*reset_regparms) ();  /* reset the register count */
213     int (*reg_parm) (struct sym_link *);        /* will return 1 if can be passed in register */
214
215     /** Process the pragma string 'sz'.  Returns 0 if recognised and
216         processed, 1 otherwise.  May be NULL.
217     */
218     int (*process_pragma) (const char *sz);
219
220     /** Mangles a support function name to reflect the calling model. 
221      */
222     char *(*getMangledFunctionName) (char *szOrginial);
223
224     /** Returns true if the port can multiply the two types nativly
225         without using support functions.
226     */
227     bool (*hasNativeMulFor) (iCode *ic, sym_link *left, sym_link *right);
228
229     /** If TRUE, then tprintf and !dw will be used for some initalisers
230      */
231     bool use_dw_for_init;
232
233     /* condition transformations */
234     bool lt_nge;                /* transform (a < b)  to !(a >= b)  */
235     bool gt_nle;                /* transform (a > b)  to !(a <= b)  */
236     bool le_ngt;                /* transform (a <= b) to !(a > b)   */
237     bool ge_nlt;                /* transform (a >= b) to !(a < b)   */
238     bool ne_neq;                /* transform a != b --> ! (a == b)  */
239     bool eq_nne;                /* transform a == b --> ! (a != b)  */
240
241     bool arrayInitializerSuppported;  
242     
243     bool (*cseOk) (iCode *ic, iCode *pdic);
244     builtins *builtintable;    /* table of builtin functions */
245 #define PORT_MAGIC 0xAC32
246 /** Used at runtime to detect if this structure has been completly filled in. */
247     int magic;
248   }
249 PORT;
250
251 extern PORT *port;
252
253 #if !OPT_DISABLE_MCS51
254 extern PORT mcs51_port;
255 #endif
256 #if !OPT_DISABLE_GBZ80
257 extern PORT gbz80_port;
258 #endif
259 #if !OPT_DISABLE_Z80
260 extern PORT z80_port;
261 #endif
262 #if !OPT_DISABLE_AVR
263 extern PORT avr_port;
264 #endif
265 #if !OPT_DISABLE_DS390
266 extern PORT ds390_port;
267 #endif
268 #if !OPT_DISABLE_PIC
269 extern PORT pic_port;
270 #endif
271 #if !OPT_DISABLE_I186
272 extern PORT i186_port;
273 #endif
274 #if !OPT_DISABLE_TLCS900H
275 extern PORT tlcs900h_port;
276 #endif
277
278 #endif /* PORT_INCLUDE*/