Rev 8097 | Rev 9177 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
7983 | leency | 1 | (* |
7597 | akron1 | 2 | BSD 2-Clause License |
6613 | leency | 3 | |
8859 | leency | 4 | Copyright (c) 2018-2021, Anton Krotov |
7597 | akron1 | 5 | All rights reserved. |
6613 | leency | 6 | *) |
7 | |||
8 | MODULE Compiler; |
||
9 | |||
7983 | leency | 10 | IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, PROG, C := CONSOLE, |
8097 | maxcodehac | 11 | ERRORS, STRINGS, WRITER, MSP430, THUMB, TARGETS, SCAN; |
6613 | leency | 12 | |
13 | |||
8859 | leency | 14 | CONST |
15 | |||
16 | DEF_WINDOWS = "WINDOWS"; |
||
17 | DEF_LINUX = "LINUX"; |
||
18 | DEF_KOLIBRIOS = "KOLIBRIOS"; |
||
19 | DEF_CPU_X86 = "CPU_X86"; |
||
20 | DEF_CPU_X8664 = "CPU_X8664"; |
||
21 | |||
22 | |||
7696 | akron1 | 23 | PROCEDURE keys (VAR options: PROG.OPTIONS; VAR out: PARS.PATH); |
6613 | leency | 24 | VAR |
7597 | akron1 | 25 | param: PARS.PATH; |
26 | i, j: INTEGER; |
||
8097 | maxcodehac | 27 | _end: BOOLEAN; |
7597 | akron1 | 28 | value: INTEGER; |
29 | minor, |
||
30 | major: INTEGER; |
||
7693 | akron1 | 31 | checking: SET; |
6613 | leency | 32 | |
33 | BEGIN |
||
7696 | akron1 | 34 | out := ""; |
7693 | akron1 | 35 | checking := options.checking; |
8097 | maxcodehac | 36 | _end := FALSE; |
7696 | akron1 | 37 | i := 3; |
7597 | akron1 | 38 | REPEAT |
39 | UTILS.GetArg(i, param); |
||
6613 | leency | 40 | |
7597 | akron1 | 41 | IF param = "-stk" THEN |
42 | INC(i); |
||
43 | UTILS.GetArg(i, param); |
||
44 | IF STRINGS.StrToInt(param, value) & (1 <= value) & (value <= 32) THEN |
||
7693 | akron1 | 45 | options.stack := value |
7597 | akron1 | 46 | END; |
47 | IF param[0] = "-" THEN |
||
48 | DEC(i) |
||
49 | END |
||
6613 | leency | 50 | |
7696 | akron1 | 51 | ELSIF param = "-out" THEN |
7597 | akron1 | 52 | INC(i); |
53 | UTILS.GetArg(i, param); |
||
54 | IF param[0] = "-" THEN |
||
55 | DEC(i) |
||
7696 | akron1 | 56 | ELSE |
57 | out := param |
||
7597 | akron1 | 58 | END |
6613 | leency | 59 | |
7693 | akron1 | 60 | ELSIF param = "-ram" THEN |
61 | INC(i); |
||
62 | UTILS.GetArg(i, param); |
||
63 | IF STRINGS.StrToInt(param, value) THEN |
||
64 | options.ram := value |
||
65 | END; |
||
66 | IF param[0] = "-" THEN |
||
67 | DEC(i) |
||
68 | END |
||
69 | |||
70 | ELSIF param = "-rom" THEN |
||
71 | INC(i); |
||
72 | UTILS.GetArg(i, param); |
||
73 | IF STRINGS.StrToInt(param, value) THEN |
||
74 | options.rom := value |
||
75 | END; |
||
76 | IF param[0] = "-" THEN |
||
77 | DEC(i) |
||
78 | END |
||
79 | |||
7597 | akron1 | 80 | ELSIF param = "-nochk" THEN |
81 | INC(i); |
||
82 | UTILS.GetArg(i, param); |
||
6613 | leency | 83 | |
7597 | akron1 | 84 | IF param[0] = "-" THEN |
85 | DEC(i) |
||
86 | ELSE |
||
87 | j := 0; |
||
88 | WHILE param[j] # 0X DO |
||
6613 | leency | 89 | |
7597 | akron1 | 90 | IF param[j] = "p" THEN |
91 | EXCL(checking, ST.chkPTR) |
||
92 | ELSIF param[j] = "t" THEN |
||
93 | EXCL(checking, ST.chkGUARD) |
||
94 | ELSIF param[j] = "i" THEN |
||
95 | EXCL(checking, ST.chkIDX) |
||
96 | ELSIF param[j] = "b" THEN |
||
97 | EXCL(checking, ST.chkBYTE) |
||
98 | ELSIF param[j] = "c" THEN |
||
99 | EXCL(checking, ST.chkCHR) |
||
100 | ELSIF param[j] = "w" THEN |
||
101 | EXCL(checking, ST.chkWCHR) |
||
102 | ELSIF param[j] = "r" THEN |
||
103 | EXCL(checking, ST.chkCHR); |
||
104 | EXCL(checking, ST.chkWCHR); |
||
105 | EXCL(checking, ST.chkBYTE) |
||
8859 | leency | 106 | ELSIF param[j] = "s" THEN |
107 | EXCL(checking, ST.chkSTK) |
||
7597 | akron1 | 108 | ELSIF param[j] = "a" THEN |
109 | checking := {} |
||
110 | END; |
||
6613 | leency | 111 | |
7597 | akron1 | 112 | INC(j) |
7693 | akron1 | 113 | END; |
114 | |||
7597 | akron1 | 115 | END |
6613 | leency | 116 | |
7597 | akron1 | 117 | ELSIF param = "-ver" THEN |
118 | INC(i); |
||
119 | UTILS.GetArg(i, param); |
||
120 | IF STRINGS.StrToVer(param, major, minor) THEN |
||
7693 | akron1 | 121 | options.version := major * 65536 + minor |
7597 | akron1 | 122 | END; |
123 | IF param[0] = "-" THEN |
||
124 | DEC(i) |
||
125 | END |
||
6613 | leency | 126 | |
8097 | maxcodehac | 127 | ELSIF param = "-lower" THEN |
128 | options.lower := TRUE |
||
129 | |||
7597 | akron1 | 130 | ELSIF param = "-pic" THEN |
7693 | akron1 | 131 | options.pic := TRUE |
6613 | leency | 132 | |
8097 | maxcodehac | 133 | ELSIF param = "-def" THEN |
134 | INC(i); |
||
135 | UTILS.GetArg(i, param); |
||
136 | SCAN.NewDef(param) |
||
137 | |||
7597 | akron1 | 138 | ELSIF param = "" THEN |
8097 | maxcodehac | 139 | _end := TRUE |
6613 | leency | 140 | |
7107 | akron1 | 141 | ELSE |
7693 | akron1 | 142 | ERRORS.BadParam(param) |
7107 | akron1 | 143 | END; |
6613 | leency | 144 | |
7597 | akron1 | 145 | INC(i) |
8097 | maxcodehac | 146 | UNTIL _end; |
6613 | leency | 147 | |
7693 | akron1 | 148 | options.checking := checking |
7597 | akron1 | 149 | END keys; |
6613 | leency | 150 | |
151 | |||
7983 | leency | 152 | PROCEDURE OutTargetItem (target: INTEGER; text: ARRAY OF CHAR); |
153 | VAR |
||
154 | width: INTEGER; |
||
155 | |||
156 | BEGIN |
||
157 | width := 15; |
||
158 | width := width - LENGTH(TARGETS.Targets[target].ComLinePar) - 4; |
||
159 | C.String(" '"); C.String(TARGETS.Targets[target].ComLinePar); C.String("'"); |
||
160 | WHILE width > 0 DO |
||
161 | C.String(20X); |
||
162 | DEC(width) |
||
163 | END; |
||
164 | C.StringLn(text) |
||
165 | END OutTargetItem; |
||
166 | |||
167 | |||
7597 | akron1 | 168 | PROCEDURE main; |
169 | VAR |
||
170 | path: PARS.PATH; |
||
171 | inname: PARS.PATH; |
||
172 | ext: PARS.PATH; |
||
173 | app_path: PARS.PATH; |
||
174 | lib_path: PARS.PATH; |
||
175 | modname: PARS.PATH; |
||
176 | outname: PARS.PATH; |
||
177 | param: PARS.PATH; |
||
178 | temp: PARS.PATH; |
||
179 | target: INTEGER; |
||
180 | time: INTEGER; |
||
7693 | akron1 | 181 | options: PROG.OPTIONS; |
6613 | leency | 182 | |
183 | BEGIN |
||
7693 | akron1 | 184 | options.stack := 2; |
185 | options.version := 65536; |
||
186 | options.pic := FALSE; |
||
8097 | maxcodehac | 187 | options.lower := FALSE; |
7693 | akron1 | 188 | options.checking := ST.chkALL; |
6613 | leency | 189 | |
7597 | akron1 | 190 | PATHS.GetCurrentDirectory(app_path); |
6613 | leency | 191 | |
8859 | leency | 192 | UTILS.GetArg(0, temp); |
193 | PATHS.split(temp, path, modname, ext); |
||
194 | IF PATHS.isRelative(path) THEN |
||
195 | PATHS.RelPath(app_path, path, temp); |
||
196 | path := temp |
||
197 | END; |
||
198 | lib_path := path; |
||
199 | |||
7597 | akron1 | 200 | UTILS.GetArg(1, inname); |
8859 | leency | 201 | STRINGS.replace(inname, "\", UTILS.slash); |
202 | STRINGS.replace(inname, "/", UTILS.slash); |
||
6613 | leency | 203 | |
7693 | akron1 | 204 | C.Ln; |
7983 | leency | 205 | C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor); |
8859 | leency | 206 | C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit) " + UTILS.Date); |
207 | C.StringLn("Copyright (c) 2018-2021, Anton Krotov"); |
||
7693 | akron1 | 208 | |
7597 | akron1 | 209 | IF inname = "" THEN |
7693 | akron1 | 210 | C.Ln; |
7696 | akron1 | 211 | C.StringLn("Usage: Compiler |
7983 | leency | 212 | C.StringLn("target ="); |
7597 | akron1 | 213 | IF UTILS.bit_depth = 64 THEN |
7983 | leency | 214 | OutTargetItem(TARGETS.Win64C, "Windows64 Console"); |
215 | OutTargetItem(TARGETS.Win64GUI, "Windows64 GUI"); |
||
216 | OutTargetItem(TARGETS.Win64DLL, "Windows64 DLL"); |
||
217 | OutTargetItem(TARGETS.Linux64, "Linux64 Exec"); |
||
218 | OutTargetItem(TARGETS.Linux64SO, "Linux64 SO") |
||
7107 | akron1 | 219 | END; |
7983 | leency | 220 | OutTargetItem(TARGETS.Win32C, "Windows32 Console"); |
221 | OutTargetItem(TARGETS.Win32GUI, "Windows32 GUI"); |
||
222 | OutTargetItem(TARGETS.Win32DLL, "Windows32 DLL"); |
||
223 | OutTargetItem(TARGETS.Linux32, "Linux32 Exec"); |
||
224 | OutTargetItem(TARGETS.Linux32SO, "Linux32 SO"); |
||
225 | OutTargetItem(TARGETS.KolibriOS, "KolibriOS Exec"); |
||
226 | OutTargetItem(TARGETS.KolibriOSDLL, "KolibriOS DLL"); |
||
227 | OutTargetItem(TARGETS.MSP430, "MSP430x{1,2}xx microcontrollers"); |
||
228 | OutTargetItem(TARGETS.STM32CM3, "STM32 Cortex-M3 microcontrollers"); |
||
229 | C.Ln; |
||
7597 | akron1 | 230 | C.StringLn("optional settings:"); C.Ln; |
7983 | leency | 231 | C.StringLn(" -out |
232 | C.StringLn(" -stk |
||
233 | C.StringLn(" -nochk <'ptibcwra'> disable runtime checking (pointers, types, indexes,"); |
||
234 | C.StringLn(" BYTE, CHR, WCHR)"); C.Ln; |
||
8097 | maxcodehac | 235 | C.StringLn(" -lower allow lower case for keywords"); C.Ln; |
236 | C.StringLn(" -def |
||
7983 | leency | 237 | C.StringLn(" -ver |
238 | C.StringLn(" -ram |
||
239 | C.StringLn(" -rom |
||
7597 | akron1 | 240 | UTILS.Exit(0) |
6613 | leency | 241 | END; |
242 | |||
8859 | leency | 243 | C.Dashes; |
7597 | akron1 | 244 | PATHS.split(inname, path, modname, ext); |
6613 | leency | 245 | |
7983 | leency | 246 | IF ext # UTILS.FILE_EXT THEN |
7693 | akron1 | 247 | ERRORS.Error(207) |
6613 | leency | 248 | END; |
7693 | akron1 | 249 | |
7597 | akron1 | 250 | IF PATHS.isRelative(path) THEN |
251 | PATHS.RelPath(app_path, path, temp); |
||
252 | path := temp |
||
6613 | leency | 253 | END; |
254 | |||
7696 | akron1 | 255 | UTILS.GetArg(2, param); |
7597 | akron1 | 256 | IF param = "" THEN |
7693 | akron1 | 257 | ERRORS.Error(205) |
6613 | leency | 258 | END; |
259 | |||
8097 | maxcodehac | 260 | SCAN.NewDef(param); |
261 | |||
7983 | leency | 262 | IF TARGETS.Select(param) THEN |
263 | target := TARGETS.target |
||
264 | ELSE |
||
7693 | akron1 | 265 | ERRORS.Error(206) |
6613 | leency | 266 | END; |
267 | |||
8859 | leency | 268 | IF TARGETS.CPU = TARGETS.cpuMSP430 THEN |
7693 | akron1 | 269 | options.ram := MSP430.minRAM; |
270 | options.rom := MSP430.minROM |
||
271 | END; |
||
6613 | leency | 272 | |
8859 | leency | 273 | IF (TARGETS.CPU = TARGETS.cpuTHUMB) & (TARGETS.OS = TARGETS.osNONE) THEN |
274 | options.ram := THUMB.minRAM; |
||
275 | options.rom := THUMB.minROM |
||
7983 | leency | 276 | END; |
277 | |||
278 | IF UTILS.bit_depth < TARGETS.BitDepth THEN |
||
7693 | akron1 | 279 | ERRORS.Error(206) |
6613 | leency | 280 | END; |
281 | |||
7597 | akron1 | 282 | STRINGS.append(lib_path, "lib"); |
283 | STRINGS.append(lib_path, UTILS.slash); |
||
7983 | leency | 284 | STRINGS.append(lib_path, TARGETS.LibDir); |
7597 | akron1 | 285 | STRINGS.append(lib_path, UTILS.slash); |
6613 | leency | 286 | |
7696 | akron1 | 287 | keys(options, outname); |
288 | IF outname = "" THEN |
||
289 | outname := path; |
||
290 | STRINGS.append(outname, modname); |
||
7983 | leency | 291 | STRINGS.append(outname, TARGETS.FileExt) |
7696 | akron1 | 292 | ELSE |
293 | IF PATHS.isRelative(outname) THEN |
||
294 | PATHS.RelPath(app_path, outname, temp); |
||
295 | outname := temp |
||
296 | END |
||
297 | END; |
||
298 | |||
7983 | leency | 299 | PARS.init(options); |
6613 | leency | 300 | |
8859 | leency | 301 | CASE TARGETS.OS OF |
302 | |TARGETS.osNONE: |
||
303 | |TARGETS.osWIN32, |
||
304 | TARGETS.osWIN64: SCAN.NewDef(DEF_WINDOWS) |
||
305 | |TARGETS.osLINUX32, |
||
306 | TARGETS.osLINUX64: SCAN.NewDef(DEF_LINUX) |
||
307 | |TARGETS.osKOS: SCAN.NewDef(DEF_KOLIBRIOS) |
||
308 | END; |
||
309 | |||
310 | CASE TARGETS.CPU OF |
||
311 | |TARGETS.cpuX86: SCAN.NewDef(DEF_CPU_X86) |
||
312 | |TARGETS.cpuAMD64: SCAN.NewDef(DEF_CPU_X8664) |
||
313 | |TARGETS.cpuMSP430: |
||
314 | |TARGETS.cpuTHUMB: |
||
315 | |TARGETS.cpuRVM32I: |
||
316 | |TARGETS.cpuRVM64I: |
||
317 | END; |
||
318 | |||
7693 | akron1 | 319 | ST.compile(path, lib_path, modname, outname, target, options); |
320 | |||
7597 | akron1 | 321 | time := UTILS.GetTickCount() - UTILS.time; |
8859 | leency | 322 | C.Dashes; |
7696 | akron1 | 323 | C.Int(PARS.lines); C.String(" lines, "); |
7597 | akron1 | 324 | C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, "); |
325 | C.Int(WRITER.counter); C.StringLn(" bytes"); |
||
6613 | leency | 326 | |
7597 | akron1 | 327 | UTILS.Exit(0) |
328 | END main; |
||
329 | |||
330 | |||
6613 | leency | 331 | BEGIN |
7597 | akron1 | 332 | main |
7983 | leency | 333 | END Compiler.>'ptibcwra'>=>=> |