Rev 7696 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 7696 | Rev 7983 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | (* |
1 | (* |
2 | BSD 2-Clause License |
2 | BSD 2-Clause License |
Line 3... | Line 3... | ||
3 | 3 | ||
4 | Copyright (c) 2018-2019, Anton Krotov |
4 | Copyright (c) 2018-2020, Anton Krotov |
5 | All rights reserved. |
5 | All rights reserved. |
Line 6... | Line 6... | ||
6 | *) |
6 | *) |
Line 7... | Line 7... | ||
7 | 7 | ||
8 | MODULE Compiler; |
- | |
9 | - | ||
10 | IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, PROG, C := CONSOLE, ERRORS, STRINGS, mConst := CONSTANTS, WRITER, MSP430; |
- | |
11 | - | ||
12 | - | ||
13 | PROCEDURE Target (s: ARRAY OF CHAR): INTEGER; |
- | |
14 | VAR |
- | |
15 | res: INTEGER; |
- | |
16 | - | ||
17 | BEGIN |
- | |
18 | IF s = mConst.Target_sConsole THEN |
- | |
19 | res := mConst.Target_iConsole |
- | |
20 | ELSIF s = mConst.Target_sGUI THEN |
- | |
21 | res := mConst.Target_iGUI |
- | |
22 | ELSIF s = mConst.Target_sDLL THEN |
- | |
23 | res := mConst.Target_iDLL |
- | |
24 | ELSIF s = mConst.Target_sKolibri THEN |
- | |
25 | res := mConst.Target_iKolibri |
- | |
26 | ELSIF s = mConst.Target_sObject THEN |
- | |
27 | res := mConst.Target_iObject |
- | |
28 | ELSIF s = mConst.Target_sConsole64 THEN |
- | |
29 | res := mConst.Target_iConsole64 |
- | |
30 | ELSIF s = mConst.Target_sGUI64 THEN |
- | |
31 | res := mConst.Target_iGUI64 |
- | |
32 | ELSIF s = mConst.Target_sDLL64 THEN |
- | |
33 | res := mConst.Target_iDLL64 |
- | |
34 | ELSIF s = mConst.Target_sELF32 THEN |
- | |
35 | res := mConst.Target_iELF32 |
- | |
36 | ELSIF s = mConst.Target_sELFSO32 THEN |
- | |
37 | res := mConst.Target_iELFSO32 |
- | |
38 | ELSIF s = mConst.Target_sELF64 THEN |
- | |
39 | res := mConst.Target_iELF64 |
8 | MODULE Compiler; |
40 | ELSIF s = mConst.Target_sELFSO64 THEN |
- | |
41 | res := mConst.Target_iELFSO64 |
- | |
42 | ELSIF s = mConst.Target_sMSP430 THEN |
- | |
43 | res := mConst.Target_iMSP430 |
- | |
44 | ELSE |
- | |
45 | res := 0 |
- | |
46 | END |
- | |
Line 47... | Line 9... | ||
47 | 9 | ||
48 | RETURN res |
10 | IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, PROG, C := CONSOLE, |
49 | END Target; |
11 | ERRORS, STRINGS, WRITER, MSP430, THUMB, TARGETS; |
Line 166... | Line 128... | ||
166 | 128 | ||
167 | options.checking := checking |
129 | options.checking := checking |
Line -... | Line 130... | ||
- | 130 | END keys; |
|
- | 131 | ||
- | 132 | ||
- | 133 | PROCEDURE OutTargetItem (target: INTEGER; text: ARRAY OF CHAR); |
|
- | 134 | VAR |
|
- | 135 | width: INTEGER; |
|
- | 136 | ||
- | 137 | BEGIN |
|
- | 138 | width := 15; |
|
- | 139 | width := width - LENGTH(TARGETS.Targets[target].ComLinePar) - 4; |
|
- | 140 | C.String(" '"); C.String(TARGETS.Targets[target].ComLinePar); C.String("'"); |
|
- | 141 | WHILE width > 0 DO |
|
- | 142 | C.String(20X); |
|
- | 143 | DEC(width) |
|
- | 144 | END; |
|
- | 145 | C.StringLn(text) |
|
168 | END keys; |
146 | END OutTargetItem; |
169 | 147 | ||
170 | 148 | ||
171 | PROCEDURE main; |
149 | PROCEDURE main; |
172 | VAR |
150 | VAR |
Line 178... | Line 156... | ||
178 | modname: PARS.PATH; |
156 | modname: PARS.PATH; |
179 | outname: PARS.PATH; |
157 | outname: PARS.PATH; |
180 | param: PARS.PATH; |
158 | param: PARS.PATH; |
181 | temp: PARS.PATH; |
159 | temp: PARS.PATH; |
182 | target: INTEGER; |
160 | target: INTEGER; |
183 | bit_depth: INTEGER; |
- | |
184 | time: INTEGER; |
161 | time: INTEGER; |
185 | options: PROG.OPTIONS; |
162 | options: PROG.OPTIONS; |
Line 186... | Line 163... | ||
186 | 163 | ||
187 | BEGIN |
164 | BEGIN |
Line 194... | Line 171... | ||
194 | lib_path := app_path; |
171 | lib_path := app_path; |
Line 195... | Line 172... | ||
195 | 172 | ||
Line 196... | Line 173... | ||
196 | UTILS.GetArg(1, inname); |
173 | UTILS.GetArg(1, inname); |
197 | 174 | ||
198 | C.Ln; |
175 | C.Ln; |
199 | C.String("Akron Oberon Compiler v"); C.Int(mConst.vMajor); C.String("."); C.Int2(mConst.vMinor); |
176 | C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor); |
Line 200... | Line 177... | ||
200 | C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)"); |
177 | C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)"); |
201 | C.StringLn("Copyright (c) 2018-2019, Anton Krotov"); |
178 | C.StringLn("Copyright (c) 2018-2020, Anton Krotov"); |
202 | 179 | ||
- | 180 | IF inname = "" THEN |
|
203 | IF inname = "" THEN |
181 | C.Ln; |
204 | C.Ln; |
182 | C.StringLn("Usage: Compiler |
205 | C.StringLn("Usage: Compiler |
183 | C.StringLn("target ="); |
206 | IF UTILS.bit_depth = 64 THEN |
184 | IF UTILS.bit_depth = 64 THEN |
- | 185 | OutTargetItem(TARGETS.Win64C, "Windows64 Console"); |
|
- | 186 | OutTargetItem(TARGETS.Win64GUI, "Windows64 GUI"); |
|
207 | C.StringLn('target = console | gui | dll | console64 | gui64 | dll64 | kos | obj | elfexe | elfso | elfexe64 | elfso64 | msp430'); C.Ln; |
187 | OutTargetItem(TARGETS.Win64DLL, "Windows64 DLL"); |
- | 188 | OutTargetItem(TARGETS.Linux64, "Linux64 Exec"); |
|
- | 189 | OutTargetItem(TARGETS.Linux64SO, "Linux64 SO") |
|
- | 190 | END; |
|
- | 191 | OutTargetItem(TARGETS.Win32C, "Windows32 Console"); |
|
- | 192 | OutTargetItem(TARGETS.Win32GUI, "Windows32 GUI"); |
|
- | 193 | OutTargetItem(TARGETS.Win32DLL, "Windows32 DLL"); |
|
- | 194 | OutTargetItem(TARGETS.Linux32, "Linux32 Exec"); |
|
- | 195 | OutTargetItem(TARGETS.Linux32SO, "Linux32 SO"); |
|
- | 196 | OutTargetItem(TARGETS.KolibriOS, "KolibriOS Exec"); |
|
- | 197 | OutTargetItem(TARGETS.KolibriOSDLL, "KolibriOS DLL"); |
|
208 | ELSIF UTILS.bit_depth = 32 THEN |
198 | OutTargetItem(TARGETS.MSP430, "MSP430x{1,2}xx microcontrollers"); |
209 | C.StringLn('target = console | gui | dll | kos | obj | elfexe | elfso | msp430'); C.Ln; |
199 | OutTargetItem(TARGETS.STM32CM3, "STM32 Cortex-M3 microcontrollers"); |
210 | END; |
200 | C.Ln; |
211 | C.StringLn("optional settings:"); C.Ln; |
201 | C.StringLn("optional settings:"); C.Ln; |
212 | C.StringLn(" -out |
202 | C.StringLn(" -out |
213 | C.StringLn(" -stk |
203 | C.StringLn(" -stk |
214 | C.StringLn(' -nochk <"ptibcwra"> disable runtime checking (pointers, types, indexes,'); |
204 | C.StringLn(" -nochk <'ptibcwra'> disable runtime checking (pointers, types, indexes,"); |
215 | C.StringLn(' BYTE, CHR, WCHR)'); C.Ln; |
205 | C.StringLn(" BYTE, CHR, WCHR)"); C.Ln; |
216 | C.StringLn(" -ver |
206 | C.StringLn(" -ver |
217 | C.StringLn(" -ram |
207 | C.StringLn(" -ram |
Line -... | Line 208... | ||
- | 208 | C.StringLn(" -rom |
|
218 | C.StringLn(" -rom |
209 | UTILS.Exit(0) |
Line 219... | Line 210... | ||
219 | UTILS.Exit(0) |
210 | END; |
220 | END; |
211 | |
221 | 212 | C.StringLn("--------------------------------------------"); |
|
Line 222... | Line 213... | ||
222 | PATHS.split(inname, path, modname, ext); |
213 | PATHS.split(inname, path, modname, ext); |
223 | 214 | ||
Line 233... | Line 224... | ||
233 | UTILS.GetArg(2, param); |
224 | UTILS.GetArg(2, param); |
234 | IF param = "" THEN |
225 | IF param = "" THEN |
235 | ERRORS.Error(205) |
226 | ERRORS.Error(205) |
236 | END; |
227 | END; |
Line 237... | Line 228... | ||
237 | 228 | ||
238 | target := Target(param); |
- | |
239 | 229 | IF TARGETS.Select(param) THEN |
|
- | 230 | target := TARGETS.target |
|
240 | IF target = 0 THEN |
231 | ELSE |
241 | ERRORS.Error(206) |
232 | ERRORS.Error(206) |
Line 242... | Line -... | ||
242 | END; |
- | |
243 | - | ||
244 | CASE target OF |
- | |
245 | |mConst.Target_iConsole64, mConst.Target_iGUI64, mConst.Target_iDLL64, mConst.Target_iELF64, mConst.Target_iELFSO64: |
- | |
246 | bit_depth := 64 |
- | |
247 | |mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iDLL, |
- | |
248 | mConst.Target_iKolibri, mConst.Target_iObject, mConst.Target_iELF32, mConst.Target_iELFSO32: |
233 | END; |
249 | bit_depth := 32 |
- | |
250 | |mConst.Target_iMSP430: |
234 | |
251 | bit_depth := 16; |
235 | IF target = TARGETS.MSP430 THEN |
252 | options.ram := MSP430.minRAM; |
236 | options.ram := MSP430.minRAM; |
Line -... | Line 237... | ||
- | 237 | options.rom := MSP430.minROM |
|
- | 238 | END; |
|
- | 239 | ||
- | 240 | IF target = TARGETS.STM32CM3 THEN |
|
- | 241 | options.ram := THUMB.STM32_minRAM; |
|
253 | options.rom := MSP430.minROM |
242 | options.rom := THUMB.STM32_minROM |
254 | END; |
243 | END; |
255 | 244 | ||
Line 256... | Line 245... | ||
256 | IF UTILS.bit_depth < bit_depth THEN |
245 | IF UTILS.bit_depth < TARGETS.BitDepth THEN |
257 | ERRORS.Error(206) |
246 | ERRORS.Error(206) |
258 | END; |
- | |
259 | - | ||
260 | STRINGS.append(lib_path, "lib"); |
- | |
261 | STRINGS.append(lib_path, UTILS.slash); |
- | |
262 | - | ||
263 | CASE target OF |
- | |
264 | |mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iDLL: |
247 | END; |
265 | STRINGS.append(lib_path, "Windows32") |
- | |
266 | - | ||
267 | |mConst.Target_iKolibri, mConst.Target_iObject: |
- | |
268 | STRINGS.append(lib_path, "KolibriOS") |
- | |
269 | - | ||
270 | |mConst.Target_iELF32, mConst.Target_iELFSO32: |
- | |
271 | STRINGS.append(lib_path, "Linux32") |
- | |
272 | - | ||
273 | |mConst.Target_iELF64, mConst.Target_iELFSO64: |
- | |
274 | STRINGS.append(lib_path, "Linux64") |
- | |
275 | - | ||
276 | |mConst.Target_iConsole64, mConst.Target_iGUI64, mConst.Target_iDLL64: |
- | |
277 | STRINGS.append(lib_path, "Windows64") |
- | |
278 | - | ||
279 | |mConst.Target_iMSP430: |
- | |
280 | STRINGS.append(lib_path, "MSP430") |
248 | |
Line 281... | Line 249... | ||
281 | 249 | STRINGS.append(lib_path, "lib"); |
|
282 | END; |
250 | STRINGS.append(lib_path, UTILS.slash); |
283 | 251 | STRINGS.append(lib_path, TARGETS.LibDir); |
|
284 | STRINGS.append(lib_path, UTILS.slash); |
252 | STRINGS.append(lib_path, UTILS.slash); |
285 | - | ||
286 | keys(options, outname); |
- | |
287 | IF outname = "" THEN |
- | |
288 | outname := path; |
- | |
289 | STRINGS.append(outname, modname); |
- | |
290 | CASE target OF |
- | |
291 | |mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iConsole64, mConst.Target_iGUI64: |
- | |
292 | STRINGS.append(outname, ".exe") |
- | |
293 | - | ||
294 | |mConst.Target_iObject: |
- | |
295 | STRINGS.append(outname, ".obj") |
- | |
296 | - | ||
297 | |mConst.Target_iKolibri, mConst.Target_iELF32, mConst.Target_iELF64: |
- | |
298 | - | ||
299 | |mConst.Target_iELFSO32, mConst.Target_iELFSO64: |
- | |
300 | STRINGS.append(outname, ".so") |
- | |
301 | 253 | ||
302 | |mConst.Target_iDLL, mConst.Target_iDLL64: |
- | |
303 | STRINGS.append(outname, ".dll") |
254 | keys(options, outname); |
304 | 255 | IF outname = "" THEN |
|
305 | |mConst.Target_iMSP430: |
256 | outname := path; |
306 | STRINGS.append(outname, ".hex") |
257 | STRINGS.append(outname, modname); |
307 | END |
258 | STRINGS.append(outname, TARGETS.FileExt) |
308 | ELSE |
259 | ELSE |
Line 309... | Line 260... | ||
309 | IF PATHS.isRelative(outname) THEN |
260 | IF PATHS.isRelative(outname) THEN |
310 | PATHS.RelPath(app_path, outname, temp); |
- | |
311 | outname := temp |
- | |
312 | END |
- | |
Line 313... | Line 261... | ||
313 | END; |
261 | PATHS.RelPath(app_path, outname, temp); |
Line 314... | Line 262... | ||
314 | 262 | outname := temp |
|
315 | PARS.init(bit_depth, target, options); |
- | |
- | 263 | END |
|
316 | 264 | END; |
|
317 | PARS.program.dll := target IN {mConst.Target_iELFSO32, mConst.Target_iELFSO64, mConst.Target_iDLL, mConst.Target_iDLL64, mConst.Target_iObject}; |
265 | |
318 | PARS.program.obj := target = mConst.Target_iObject; |
266 | PARS.init(options); |
Line 319... | Line 267... | ||
319 | 267 |