fix broken static initializers in non-main() modules
[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 /* Processor specific names */
9 typedef struct {
10     /** Target name used for -m */
11     const char *target;
12
13     /** Target name string, used for --help */
14     const char *target_name;
15
16     struct {
17         /** TRUE if all types of glue functions should be inseted into
18             the file that also defines main.
19             We dont want this in cases like the z80 where the startup
20             code is provided by a seperate module.
21         */
22         bool glue_up_main;
23     } general;
24
25     /* assembler related information */
26     struct {
27         /** Command to run and arguments (eg as-z80) */
28         const char **cmd;
29         /** Arguments for debug mode.  PENDING: ignored */
30         const char *debug_opts;
31         /** Arguments for normal assembly mode.  PENDING: ignored */
32         const char *plain_opts;
33     } assembler;
34
35     /* linker related info */
36     struct {
37         /** Command to run (eg link-z80) */
38         const char **cmd;
39     } linker;
40
41     struct {
42         /** Default peephole rules */
43         char *default_rules;
44     } peep;
45
46     /** Basic type sizes */
47     struct {
48         int char_size;
49         int short_size;
50         int int_size;
51         int long_size;
52         int ptr_size;
53         int fptr_size;
54         int gptr_size;
55         int bit_size;
56         int float_size;
57         int max_base_size;
58     } s;
59
60     /** Names for all the memory regions */
61     struct {
62         const char *xstack_name;
63         const char *istack_name;
64         const char *code_name;
65         const char *data_name;
66         const char *idata_name;
67         const char *xdata_name;
68         const char *bit_name;
69         const char *reg_name;
70         const char *static_name;
71         const char *overlay_name;
72         const char *post_static_name;
73     } mem;
74     
75     /* stack related information */
76     struct {
77         /** -1 for grows down (z80), +1 for grows up (mcs51) */
78         int direction;
79         /** Extra overhead when calling between banks */
80         int bank_overhead;
81         /** Extra overhead when the function is an ISR */
82         int isr_overhead;
83         /** Standard overhead for a function call */
84         int call_overhead;
85         /** Re-enterant space */
86         int reent_overhead;
87         
88     } stack;
89     struct {
90         /** One more than the smallest 
91             mul/div operation the processor can do nativley 
92             Eg if the processor has an 8 bit mul, nativebelow is 2 */
93         int native_below;
94     } muldiv;
95
96     /** Called once the processor target has been selected.
97         First chance to initalise and set any port specific varibles.
98         'port' is set before calling this.  May be NULL.
99     */
100     void (*init)(void);
101     /** Parses one option + its arguments */
102     bool (*parseOption)(int *pargc, char **argv, int *i);
103     /** Called after all the options have been parsed. */
104     void (*finaliseOptions)(void);
105     /** Called after the port has been selected but before any
106         options are parsed. */
107     void (*setDefaultOptions)(void);
108     /** Does the dirty work. */
109     void (*assignRegisters)(eBBlock **, int);
110     
111     /** Returns the register name of a symbol.
112         Used so that 'regs' can be an incomplete type. */
113     const char *(*getRegName)(struct regs *reg);
114
115     /* list of keywords that are used by this
116        target (used by lexer) */
117     char **keywords; 
118     
119     /* Write any port specific assembler output. */
120     void (*genAssemblerPreamble)(FILE *of);
121     
122     /* Write the port specific IVT. If genIVT is NULL or if
123      * it returns zero, default (8051) IVT generation code
124      * will be used. 
125      */
126     int (*genIVT)(FILE *of, symbol **intTable, int intCount); 
127 } PORT;
128
129 extern PORT *port;
130
131 #endif