Cleaned up warnings
[fw/sdcc] / src / mcs51 / main.c
1 /** @file main.c
2     mcs51 specific general functions.
3
4     Note that mlh prepended _mcs51_ on the static functions.  Makes
5     it easier to set a breakpoint using the debugger.
6 */
7 #include "common.h"
8 #include "main.h"
9 #include "ralloc.h"
10 #include "gen.h"
11
12 static char _defaultRules[] =
13 {
14 #include "peeph.rul"
15 };
16
17 /* list of key words used by msc51 */
18 static char *_mcs51_keywords[] =
19 {
20   "at",
21   "bit",
22   "code",
23   "critical",
24   "data",
25   "far",
26   "idata",
27   "interrupt",
28   "near",
29   "pdata",
30   "reentrant",
31   "sfr",
32   "sbit",
33   "using",
34   "xdata",
35   "_data",
36   "_code",
37   "_generic",
38   "_near",
39   "_xdata",
40   "_pdata",
41   "_idata",
42   "_naked",
43   NULL
44 };
45
46
47 void mcs51_assignRegisters (eBBlock ** ebbs, int count);
48
49 static int regParmFlg = 0;      /* determine if we can register a parameter */
50
51 static void
52 _mcs51_init (void)
53 {
54   asm_addTree (&asm_asxxxx_mapping);
55 }
56
57 static void
58 _mcs51_reset_regparm ()
59 {
60   regParmFlg = 0;
61 }
62
63 static int
64 _mcs51_regparm (sym_link * l)
65 {
66   /* for this processor it is simple
67      can pass only the first parameter in a register */
68   if (regParmFlg)
69     return 0;
70
71   regParmFlg = 1;
72   return 1;
73 }
74
75 static bool
76 _mcs51_parseOptions (int *pargc, char **argv, int *i)
77 {
78   /* TODO: allow port-specific command line options to specify
79    * segment names here.
80    */
81   return FALSE;
82 }
83
84 static void
85 _mcs51_finaliseOptions (void)
86 {
87   if (options.model == MODEL_LARGE) {
88       port->mem.default_local_map = xdata;
89       port->mem.default_globl_map = xdata;
90     }
91   else
92     {
93       port->mem.default_local_map = data;
94       port->mem.default_globl_map = data;
95     }
96 }
97
98 static void
99 _mcs51_setDefaultOptions (void)
100 {
101 }
102
103 static const char *
104 _mcs51_getRegName (struct regs *reg)
105 {
106   if (reg)
107     return reg->name;
108   return "err";
109 }
110
111 static void
112 _mcs51_genAssemblerPreamble (FILE * of)
113 {
114 }
115
116 /* Generate interrupt vector table. */
117 static int
118 _mcs51_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts)
119 {
120   return FALSE;
121 }
122
123 /* Do CSE estimation */
124 static bool cseCostEstimation (iCode *ic, iCode *pdic)
125 {
126     operand *result = IC_RESULT(ic);
127     sym_link *result_type = operandType(result);
128
129     /* if it is a pointer then return ok for now */
130     if (IC_RESULT(ic) && IS_PTR(result_type)) return 1;
131     
132     /* if bitwise | add & subtract then no since mcs51 is pretty good at it 
133        so we will cse only if they are local (i.e. both ic & pdic belong to
134        the same basic block */
135     if (IS_BITWISE_OP(ic) || ic->op == '+' || ic->op == '-') {
136         /* then if they are the same Basic block then ok */
137         if (ic->eBBlockNum == pdic->eBBlockNum) return 1;
138         else return 0;
139     }
140         
141     /* for others it is cheaper to do the cse */
142     return 1;
143 }
144
145 /** $1 is always the basename.
146     $2 is always the output file.
147     $3 varies
148     $l is the list of extra options that should be there somewhere...
149     MUST be terminated with a NULL.
150 */
151 static const char *_linkCmd[] =
152 {
153   "{bindir}{sep}aslink", "-nf", "$1", NULL
154 };
155
156 /* $3 is replaced by assembler.debug_opts resp. port->assembler.plain_opts */
157 static const char *_asmCmd[] =
158 {
159   "asx8051", "$l", "$3", "$1.asm", NULL
160 };
161
162 /* Globals */
163 PORT mcs51_port =
164 {
165   TARGET_ID_MCS51,
166   "mcs51",
167   "MCU 8051",                   /* Target name */
168   {
169     TRUE,                       /* Emit glue around main */
170     MODEL_SMALL | MODEL_LARGE,
171     MODEL_SMALL
172   },
173   {
174     _asmCmd,
175     NULL,
176     "-plosgffc",                /* Options with debug */
177     "-plosgff",                 /* Options without debug */
178     0,
179     ".asm"
180   },
181   {
182     _linkCmd,
183     NULL,
184     NULL,
185     ".rel"
186   },
187   {
188     _defaultRules
189   },
190   {
191         /* Sizes: char, short, int, long, ptr, fptr, gptr, bit, float, max */
192     1, 2, 2, 4, 1, 2, 3, 1, 4, 4
193   },
194   {
195     "XSEG    (XDATA)",
196     "STACK   (DATA)",
197     "CSEG    (CODE)",
198     "DSEG    (DATA)",
199     "ISEG    (DATA)",
200     "XSEG    (XDATA)",
201     "BSEG    (BIT)",
202     "RSEG    (DATA)",
203     "GSINIT  (CODE)",
204     "OSEG    (OVR,DATA)",
205     "GSFINAL (CODE)",
206     "HOME        (CODE)",
207     NULL,
208     NULL,
209     1
210   },
211   {
212     +1, 1, 4, 1, 1, 0
213   },
214     /* mcs51 has an 8 bit mul */
215   {
216     1, -1
217   },
218   "_",
219   _mcs51_init,
220   _mcs51_parseOptions,
221   _mcs51_finaliseOptions,
222   _mcs51_setDefaultOptions,
223   mcs51_assignRegisters,
224   _mcs51_getRegName,
225   _mcs51_keywords,
226   _mcs51_genAssemblerPreamble,
227   _mcs51_genIVT,
228   _mcs51_reset_regparm,
229   _mcs51_regparm,
230   NULL,
231   NULL,
232   NULL,
233   FALSE,
234   0,                            /* leave lt */
235   0,                            /* leave gt */
236   1,                            /* transform <= to ! > */
237   1,                            /* transform >= to ! < */
238   1,                            /* transform != to !(a == b) */
239   0,                            /* leave == */
240   FALSE,                        /* No array initializer support. */
241   cseCostEstimation,
242   NULL,                         /* no builtin functions */
243   PORT_MAGIC
244 };