Rev 7696 | 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 | |
7983 | leency | 4 | Copyright (c) 2018-2020, 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, |
11 | ERRORS, STRINGS, WRITER, MSP430, THUMB, TARGETS; |
||
6613 | leency | 12 | |
13 | |||
7696 | akron1 | 14 | PROCEDURE keys (VAR options: PROG.OPTIONS; VAR out: PARS.PATH); |
6613 | leency | 15 | VAR |
7597 | akron1 | 16 | param: PARS.PATH; |
17 | i, j: INTEGER; |
||
18 | end: BOOLEAN; |
||
19 | value: INTEGER; |
||
20 | minor, |
||
21 | major: INTEGER; |
||
7693 | akron1 | 22 | checking: SET; |
6613 | leency | 23 | |
24 | BEGIN |
||
7696 | akron1 | 25 | out := ""; |
7693 | akron1 | 26 | checking := options.checking; |
7597 | akron1 | 27 | end := FALSE; |
7696 | akron1 | 28 | i := 3; |
7597 | akron1 | 29 | REPEAT |
30 | UTILS.GetArg(i, param); |
||
6613 | leency | 31 | |
7597 | akron1 | 32 | IF param = "-stk" THEN |
33 | INC(i); |
||
34 | UTILS.GetArg(i, param); |
||
35 | IF STRINGS.StrToInt(param, value) & (1 <= value) & (value <= 32) THEN |
||
7693 | akron1 | 36 | options.stack := value |
7597 | akron1 | 37 | END; |
38 | IF param[0] = "-" THEN |
||
39 | DEC(i) |
||
40 | END |
||
6613 | leency | 41 | |
7696 | akron1 | 42 | ELSIF param = "-out" THEN |
7597 | akron1 | 43 | INC(i); |
44 | UTILS.GetArg(i, param); |
||
45 | IF param[0] = "-" THEN |
||
46 | DEC(i) |
||
7696 | akron1 | 47 | ELSE |
48 | out := param |
||
7597 | akron1 | 49 | END |
6613 | leency | 50 | |
7693 | akron1 | 51 | ELSIF param = "-ram" THEN |
52 | INC(i); |
||
53 | UTILS.GetArg(i, param); |
||
54 | IF STRINGS.StrToInt(param, value) THEN |
||
55 | options.ram := value |
||
56 | END; |
||
57 | IF param[0] = "-" THEN |
||
58 | DEC(i) |
||
59 | END |
||
60 | |||
61 | ELSIF param = "-rom" THEN |
||
62 | INC(i); |
||
63 | UTILS.GetArg(i, param); |
||
64 | IF STRINGS.StrToInt(param, value) THEN |
||
65 | options.rom := value |
||
66 | END; |
||
67 | IF param[0] = "-" THEN |
||
68 | DEC(i) |
||
69 | END |
||
70 | |||
7597 | akron1 | 71 | ELSIF param = "-nochk" THEN |
72 | INC(i); |
||
73 | UTILS.GetArg(i, param); |
||
6613 | leency | 74 | |
7597 | akron1 | 75 | IF param[0] = "-" THEN |
76 | DEC(i) |
||
77 | ELSE |
||
78 | j := 0; |
||
79 | WHILE param[j] # 0X DO |
||
6613 | leency | 80 | |
7597 | akron1 | 81 | IF param[j] = "p" THEN |
82 | EXCL(checking, ST.chkPTR) |
||
83 | ELSIF param[j] = "t" THEN |
||
84 | EXCL(checking, ST.chkGUARD) |
||
85 | ELSIF param[j] = "i" THEN |
||
86 | EXCL(checking, ST.chkIDX) |
||
87 | ELSIF param[j] = "b" THEN |
||
88 | EXCL(checking, ST.chkBYTE) |
||
89 | ELSIF param[j] = "c" THEN |
||
90 | EXCL(checking, ST.chkCHR) |
||
91 | ELSIF param[j] = "w" THEN |
||
92 | EXCL(checking, ST.chkWCHR) |
||
93 | ELSIF param[j] = "r" THEN |
||
94 | EXCL(checking, ST.chkCHR); |
||
95 | EXCL(checking, ST.chkWCHR); |
||
96 | EXCL(checking, ST.chkBYTE) |
||
97 | ELSIF param[j] = "a" THEN |
||
98 | checking := {} |
||
99 | END; |
||
6613 | leency | 100 | |
7597 | akron1 | 101 | INC(j) |
7693 | akron1 | 102 | END; |
103 | |||
7597 | akron1 | 104 | END |
6613 | leency | 105 | |
7597 | akron1 | 106 | ELSIF param = "-ver" THEN |
107 | INC(i); |
||
108 | UTILS.GetArg(i, param); |
||
109 | IF STRINGS.StrToVer(param, major, minor) THEN |
||
7693 | akron1 | 110 | options.version := major * 65536 + minor |
7597 | akron1 | 111 | END; |
112 | IF param[0] = "-" THEN |
||
113 | DEC(i) |
||
114 | END |
||
6613 | leency | 115 | |
7597 | akron1 | 116 | ELSIF param = "-pic" THEN |
7693 | akron1 | 117 | options.pic := TRUE |
6613 | leency | 118 | |
7597 | akron1 | 119 | ELSIF param = "" THEN |
120 | end := TRUE |
||
6613 | leency | 121 | |
7107 | akron1 | 122 | ELSE |
7693 | akron1 | 123 | ERRORS.BadParam(param) |
7107 | akron1 | 124 | END; |
6613 | leency | 125 | |
7597 | akron1 | 126 | INC(i) |
7693 | akron1 | 127 | UNTIL end; |
6613 | leency | 128 | |
7693 | akron1 | 129 | options.checking := checking |
7597 | akron1 | 130 | END keys; |
6613 | leency | 131 | |
132 | |||
7983 | leency | 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) |
||
146 | END OutTargetItem; |
||
147 | |||
148 | |||
7597 | akron1 | 149 | PROCEDURE main; |
150 | VAR |
||
151 | path: PARS.PATH; |
||
152 | inname: PARS.PATH; |
||
153 | ext: PARS.PATH; |
||
154 | app_path: PARS.PATH; |
||
155 | lib_path: PARS.PATH; |
||
156 | modname: PARS.PATH; |
||
157 | outname: PARS.PATH; |
||
158 | param: PARS.PATH; |
||
159 | temp: PARS.PATH; |
||
160 | target: INTEGER; |
||
161 | time: INTEGER; |
||
7693 | akron1 | 162 | options: PROG.OPTIONS; |
6613 | leency | 163 | |
164 | BEGIN |
||
7693 | akron1 | 165 | options.stack := 2; |
166 | options.version := 65536; |
||
167 | options.pic := FALSE; |
||
168 | options.checking := ST.chkALL; |
||
6613 | leency | 169 | |
7597 | akron1 | 170 | PATHS.GetCurrentDirectory(app_path); |
171 | lib_path := app_path; |
||
6613 | leency | 172 | |
7597 | akron1 | 173 | UTILS.GetArg(1, inname); |
6613 | leency | 174 | |
7693 | akron1 | 175 | C.Ln; |
7983 | leency | 176 | C.String("Akron Oberon Compiler v"); C.Int(UTILS.vMajor); C.String("."); C.Int2(UTILS.vMinor); |
7693 | akron1 | 177 | C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)"); |
7983 | leency | 178 | C.StringLn("Copyright (c) 2018-2020, Anton Krotov"); |
7693 | akron1 | 179 | |
7597 | akron1 | 180 | IF inname = "" THEN |
7693 | akron1 | 181 | C.Ln; |
7696 | akron1 | 182 | C.StringLn("Usage: Compiler |
7983 | leency | 183 | C.StringLn("target ="); |
7597 | akron1 | 184 | IF UTILS.bit_depth = 64 THEN |
7983 | leency | 185 | OutTargetItem(TARGETS.Win64C, "Windows64 Console"); |
186 | OutTargetItem(TARGETS.Win64GUI, "Windows64 GUI"); |
||
187 | OutTargetItem(TARGETS.Win64DLL, "Windows64 DLL"); |
||
188 | OutTargetItem(TARGETS.Linux64, "Linux64 Exec"); |
||
189 | OutTargetItem(TARGETS.Linux64SO, "Linux64 SO") |
||
7107 | akron1 | 190 | END; |
7983 | leency | 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"); |
||
198 | OutTargetItem(TARGETS.MSP430, "MSP430x{1,2}xx microcontrollers"); |
||
199 | OutTargetItem(TARGETS.STM32CM3, "STM32 Cortex-M3 microcontrollers"); |
||
200 | C.Ln; |
||
7597 | akron1 | 201 | C.StringLn("optional settings:"); C.Ln; |
7983 | leency | 202 | C.StringLn(" -out |
203 | C.StringLn(" -stk |
||
204 | C.StringLn(" -nochk <'ptibcwra'> disable runtime checking (pointers, types, indexes,"); |
||
205 | C.StringLn(" BYTE, CHR, WCHR)"); C.Ln; |
||
206 | C.StringLn(" -ver |
||
207 | C.StringLn(" -ram |
||
208 | C.StringLn(" -rom |
||
7597 | akron1 | 209 | UTILS.Exit(0) |
6613 | leency | 210 | END; |
211 | |||
7983 | leency | 212 | C.StringLn("--------------------------------------------"); |
7597 | akron1 | 213 | PATHS.split(inname, path, modname, ext); |
6613 | leency | 214 | |
7983 | leency | 215 | IF ext # UTILS.FILE_EXT THEN |
7693 | akron1 | 216 | ERRORS.Error(207) |
6613 | leency | 217 | END; |
7693 | akron1 | 218 | |
7597 | akron1 | 219 | IF PATHS.isRelative(path) THEN |
220 | PATHS.RelPath(app_path, path, temp); |
||
221 | path := temp |
||
6613 | leency | 222 | END; |
223 | |||
7696 | akron1 | 224 | UTILS.GetArg(2, param); |
7597 | akron1 | 225 | IF param = "" THEN |
7693 | akron1 | 226 | ERRORS.Error(205) |
6613 | leency | 227 | END; |
228 | |||
7983 | leency | 229 | IF TARGETS.Select(param) THEN |
230 | target := TARGETS.target |
||
231 | ELSE |
||
7693 | akron1 | 232 | ERRORS.Error(206) |
6613 | leency | 233 | END; |
234 | |||
7983 | leency | 235 | IF target = TARGETS.MSP430 THEN |
7693 | akron1 | 236 | options.ram := MSP430.minRAM; |
237 | options.rom := MSP430.minROM |
||
238 | END; |
||
6613 | leency | 239 | |
7983 | leency | 240 | IF target = TARGETS.STM32CM3 THEN |
241 | options.ram := THUMB.STM32_minRAM; |
||
242 | options.rom := THUMB.STM32_minROM |
||
243 | END; |
||
244 | |||
245 | IF UTILS.bit_depth < TARGETS.BitDepth THEN |
||
7693 | akron1 | 246 | ERRORS.Error(206) |
6613 | leency | 247 | END; |
248 | |||
7597 | akron1 | 249 | STRINGS.append(lib_path, "lib"); |
250 | STRINGS.append(lib_path, UTILS.slash); |
||
7983 | leency | 251 | STRINGS.append(lib_path, TARGETS.LibDir); |
7597 | akron1 | 252 | STRINGS.append(lib_path, UTILS.slash); |
6613 | leency | 253 | |
7696 | akron1 | 254 | keys(options, outname); |
255 | IF outname = "" THEN |
||
256 | outname := path; |
||
257 | STRINGS.append(outname, modname); |
||
7983 | leency | 258 | STRINGS.append(outname, TARGETS.FileExt) |
7696 | akron1 | 259 | ELSE |
260 | IF PATHS.isRelative(outname) THEN |
||
261 | PATHS.RelPath(app_path, outname, temp); |
||
262 | outname := temp |
||
263 | END |
||
264 | END; |
||
265 | |||
7983 | leency | 266 | PARS.init(options); |
6613 | leency | 267 | |
7693 | akron1 | 268 | ST.compile(path, lib_path, modname, outname, target, options); |
269 | |||
7597 | akron1 | 270 | time := UTILS.GetTickCount() - UTILS.time; |
7983 | leency | 271 | C.StringLn("--------------------------------------------"); |
7696 | akron1 | 272 | C.Int(PARS.lines); C.String(" lines, "); |
7597 | akron1 | 273 | C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, "); |
274 | C.Int(WRITER.counter); C.StringLn(" bytes"); |
||
6613 | leency | 275 | |
7597 | akron1 | 276 | UTILS.Exit(0) |
277 | END main; |
||
278 | |||
279 | |||
6613 | leency | 280 | BEGIN |
7597 | akron1 | 281 | main |
7983 | leency | 282 | END Compiler.>'ptibcwra'>=>=> |