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