Subversion Repositories Kolibri OS

Rev

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 
[optional settings]"); C.Ln;
205
        C.StringLn("Usage: Compiler 
[optional settings]"); C.Ln;
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        output"); C.Ln;
202
        C.StringLn("  -out       output"); C.Ln;
213
        C.StringLn("  -stk             set size of stack in megabytes"); C.Ln;
203
        C.StringLn("  -stk            set size of stack in Mbytes (Windows, Linux, KolibriOS)"); C.Ln;
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      set version of program ('obj' target)"); C.Ln;
206
        C.StringLn("  -ver     set version of program (KolibriOS DLL)"); C.Ln;
217
        C.StringLn("  -ram             set size of RAM in bytes ('msp430' target)"); C.Ln;
207
        C.StringLn("  -ram            set size of RAM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
Line -... Line 208...
-
 
208
        C.StringLn("  -rom            set size of ROM in bytes (MSP430) or Kbytes (STM32)"); C.Ln;
218
        C.StringLn("  -rom             set size of ROM in bytes ('msp430' target)"); C.Ln;
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