Subversion Repositories Kolibri OS

Rev

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