Subversion Repositories Kolibri OS

Rev

Rev 7693 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7696 akron1 1
(*
7597 akron1 2
    BSD 2-Clause License
6613 leency 3
 
7696 akron1 4
    Copyright (c) 2018-2019, Anton Krotov
7597 akron1 5
    All rights reserved.
6613 leency 6
*)
7
 
8
MODULE Compiler;
9
 
7693 akron1 10
IMPORT ST := STATEMENTS, PARS, UTILS, PATHS, PROG, C := CONSOLE, ERRORS, STRINGS, mConst := CONSTANTS, WRITER, MSP430;
6613 leency 11
 
12
 
7597 akron1 13
PROCEDURE Target (s: ARRAY OF CHAR): INTEGER;
14
VAR
15
    res: INTEGER;
6613 leency 16
 
7597 akron1 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
7693 akron1 36
    ELSIF s = mConst.Target_sELFSO32 THEN
37
        res := mConst.Target_iELFSO32
7597 akron1 38
    ELSIF s = mConst.Target_sELF64 THEN
39
        res := mConst.Target_iELF64
7693 akron1 40
    ELSIF s = mConst.Target_sELFSO64 THEN
41
        res := mConst.Target_iELFSO64
42
    ELSIF s = mConst.Target_sMSP430 THEN
43
        res := mConst.Target_iMSP430
7597 akron1 44
    ELSE
45
        res := 0
46
    END
6613 leency 47
 
7597 akron1 48
    RETURN res
49
END Target;
6613 leency 50
 
51
 
7696 akron1 52
PROCEDURE keys (VAR options: PROG.OPTIONS; VAR out: PARS.PATH);
6613 leency 53
VAR
7597 akron1 54
    param: PARS.PATH;
55
    i, j:  INTEGER;
56
    end:   BOOLEAN;
57
    value: INTEGER;
58
    minor,
59
    major: INTEGER;
7693 akron1 60
    checking: SET;
6613 leency 61
 
62
BEGIN
7696 akron1 63
    out := "";
7693 akron1 64
    checking := options.checking;
7597 akron1 65
    end := FALSE;
7696 akron1 66
    i := 3;
7597 akron1 67
    REPEAT
68
        UTILS.GetArg(i, param);
6613 leency 69
 
7597 akron1 70
        IF param = "-stk" THEN
71
            INC(i);
72
            UTILS.GetArg(i, param);
73
            IF STRINGS.StrToInt(param, value) & (1 <= value) & (value <= 32) THEN
7693 akron1 74
                options.stack := value
7597 akron1 75
            END;
76
            IF param[0] = "-" THEN
77
                DEC(i)
78
            END
6613 leency 79
 
7696 akron1 80
        ELSIF param = "-out" THEN
7597 akron1 81
            INC(i);
82
            UTILS.GetArg(i, param);
83
            IF param[0] = "-" THEN
84
                DEC(i)
7696 akron1 85
            ELSE
86
                out := param
7597 akron1 87
            END
6613 leency 88
 
7693 akron1 89
        ELSIF param = "-ram" THEN
90
            INC(i);
91
            UTILS.GetArg(i, param);
92
            IF STRINGS.StrToInt(param, value) THEN
93
                options.ram := value
94
            END;
95
            IF param[0] = "-" THEN
96
                DEC(i)
97
            END
98
 
99
        ELSIF param = "-rom" THEN
100
            INC(i);
101
            UTILS.GetArg(i, param);
102
            IF STRINGS.StrToInt(param, value) THEN
103
                options.rom := value
104
            END;
105
            IF param[0] = "-" THEN
106
                DEC(i)
107
            END
108
 
7597 akron1 109
        ELSIF param = "-nochk" THEN
110
            INC(i);
111
            UTILS.GetArg(i, param);
6613 leency 112
 
7597 akron1 113
            IF param[0] = "-" THEN
114
                DEC(i)
115
            ELSE
116
                j := 0;
117
                WHILE param[j] # 0X DO
6613 leency 118
 
7597 akron1 119
                    IF    param[j] = "p" THEN
120
                        EXCL(checking, ST.chkPTR)
121
                    ELSIF param[j] = "t" THEN
122
                        EXCL(checking, ST.chkGUARD)
123
                    ELSIF param[j] = "i" THEN
124
                        EXCL(checking, ST.chkIDX)
125
                    ELSIF param[j] = "b" THEN
126
                        EXCL(checking, ST.chkBYTE)
127
                    ELSIF param[j] = "c" THEN
128
                        EXCL(checking, ST.chkCHR)
129
                    ELSIF param[j] = "w" THEN
130
                        EXCL(checking, ST.chkWCHR)
131
                    ELSIF param[j] = "r" THEN
132
                        EXCL(checking, ST.chkCHR);
133
                        EXCL(checking, ST.chkWCHR);
134
                        EXCL(checking, ST.chkBYTE)
135
                    ELSIF param[j] = "a" THEN
136
                        checking := {}
137
                    END;
6613 leency 138
 
7597 akron1 139
                    INC(j)
7693 akron1 140
                END;
141
 
7597 akron1 142
            END
6613 leency 143
 
7597 akron1 144
        ELSIF param = "-ver" THEN
145
            INC(i);
146
            UTILS.GetArg(i, param);
147
            IF STRINGS.StrToVer(param, major, minor) THEN
7693 akron1 148
                options.version := major * 65536 + minor
7597 akron1 149
            END;
150
            IF param[0] = "-" THEN
151
                DEC(i)
152
            END
6613 leency 153
 
7597 akron1 154
        ELSIF param = "-pic" THEN
7693 akron1 155
            options.pic := TRUE
6613 leency 156
 
7597 akron1 157
        ELSIF param = "" THEN
158
            end := TRUE
6613 leency 159
 
7107 akron1 160
        ELSE
7693 akron1 161
            ERRORS.BadParam(param)
7107 akron1 162
        END;
6613 leency 163
 
7597 akron1 164
        INC(i)
7693 akron1 165
    UNTIL end;
6613 leency 166
 
7693 akron1 167
    options.checking := checking
7597 akron1 168
END keys;
6613 leency 169
 
170
 
7597 akron1 171
PROCEDURE main;
172
VAR
173
    path:       PARS.PATH;
174
    inname:     PARS.PATH;
175
    ext:        PARS.PATH;
176
    app_path:   PARS.PATH;
177
    lib_path:   PARS.PATH;
178
    modname:    PARS.PATH;
179
    outname:    PARS.PATH;
180
    param:      PARS.PATH;
181
    temp:       PARS.PATH;
182
    target:     INTEGER;
7693 akron1 183
    bit_depth:  INTEGER;
7597 akron1 184
    time:       INTEGER;
7693 akron1 185
    options:    PROG.OPTIONS;
6613 leency 186
 
187
BEGIN
7693 akron1 188
    options.stack := 2;
189
    options.version := 65536;
190
    options.pic := FALSE;
191
    options.checking := ST.chkALL;
6613 leency 192
 
7597 akron1 193
    PATHS.GetCurrentDirectory(app_path);
194
    lib_path := app_path;
6613 leency 195
 
7597 akron1 196
    UTILS.GetArg(1, inname);
6613 leency 197
 
7693 akron1 198
    C.Ln;
199
    C.String("Akron Oberon Compiler v"); C.Int(mConst.vMajor); C.String("."); C.Int2(mConst.vMinor);
200
        C.String(" ("); C.Int(UTILS.bit_depth); C.StringLn("-bit)");
201
    C.StringLn("Copyright (c) 2018-2019, Anton Krotov");
202
 
7597 akron1 203
    IF inname = "" THEN
7693 akron1 204
        C.Ln;
7696 akron1 205
        C.StringLn("Usage: Compiler 
[optional settings]"); C.Ln;
7597 akron1 206
        IF UTILS.bit_depth = 64 THEN
7693 akron1 207
            C.StringLn('target = console | gui | dll | console64 | gui64 | dll64 | kos | obj | elfexe | elfso | elfexe64 | elfso64 | msp430'); C.Ln;
7597 akron1 208
        ELSIF UTILS.bit_depth = 32 THEN
7693 akron1 209
            C.StringLn('target = console | gui | dll | kos | obj | elfexe | elfso | msp430'); C.Ln;
7107 akron1 210
        END;
7597 akron1 211
        C.StringLn("optional settings:"); C.Ln;
7696 akron1 212
        C.StringLn("  -out        output"); C.Ln;
7597 akron1 213
        C.StringLn("  -stk             set size of stack in megabytes"); C.Ln;
214
        C.StringLn('  -nochk <"ptibcwra">    disable runtime checking (pointers, types, indexes,');
215
        C.StringLn('                         BYTE, CHR, WCHR)'); C.Ln;
7696 akron1 216
        C.StringLn("  -ver      set version of program ('obj' target)"); C.Ln;
217
        C.StringLn("  -ram             set size of RAM in bytes ('msp430' target)"); C.Ln;
218
        C.StringLn("  -rom             set size of ROM in bytes ('msp430' target)"); C.Ln;
7597 akron1 219
        UTILS.Exit(0)
6613 leency 220
    END;
221
 
7597 akron1 222
    PATHS.split(inname, path, modname, ext);
6613 leency 223
 
7597 akron1 224
    IF ext # mConst.FILE_EXT THEN
7693 akron1 225
        ERRORS.Error(207)
6613 leency 226
    END;
7693 akron1 227
 
7597 akron1 228
    IF PATHS.isRelative(path) THEN
229
        PATHS.RelPath(app_path, path, temp);
230
        path := temp
6613 leency 231
    END;
232
 
7696 akron1 233
    UTILS.GetArg(2, param);
7597 akron1 234
    IF param = "" THEN
7693 akron1 235
        ERRORS.Error(205)
6613 leency 236
    END;
237
 
7597 akron1 238
    target := Target(param);
6613 leency 239
 
7597 akron1 240
    IF target = 0 THEN
7693 akron1 241
        ERRORS.Error(206)
6613 leency 242
    END;
243
 
7693 akron1 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:
249
        bit_depth := 32
250
    |mConst.Target_iMSP430:
251
        bit_depth := 16;
252
        options.ram := MSP430.minRAM;
253
        options.rom := MSP430.minROM
254
    END;
6613 leency 255
 
7693 akron1 256
    IF UTILS.bit_depth < bit_depth THEN
257
        ERRORS.Error(206)
6613 leency 258
    END;
259
 
7597 akron1 260
    STRINGS.append(lib_path, "lib");
261
    STRINGS.append(lib_path, UTILS.slash);
6613 leency 262
 
7693 akron1 263
    CASE target OF
264
    |mConst.Target_iConsole, mConst.Target_iGUI, mConst.Target_iDLL:
7597 akron1 265
        STRINGS.append(lib_path, "Windows32")
6613 leency 266
 
7693 akron1 267
    |mConst.Target_iKolibri, mConst.Target_iObject:
7597 akron1 268
        STRINGS.append(lib_path, "KolibriOS")
6613 leency 269
 
7693 akron1 270
    |mConst.Target_iELF32, mConst.Target_iELFSO32:
7597 akron1 271
        STRINGS.append(lib_path, "Linux32")
6613 leency 272
 
7693 akron1 273
    |mConst.Target_iELF64, mConst.Target_iELFSO64:
7597 akron1 274
        STRINGS.append(lib_path, "Linux64")
6613 leency 275
 
7693 akron1 276
    |mConst.Target_iConsole64, mConst.Target_iGUI64, mConst.Target_iDLL64:
7597 akron1 277
        STRINGS.append(lib_path, "Windows64")
6613 leency 278
 
7693 akron1 279
    |mConst.Target_iMSP430:
280
        STRINGS.append(lib_path, "MSP430")
281
 
6613 leency 282
    END;
283
 
7597 akron1 284
    STRINGS.append(lib_path, UTILS.slash);
6613 leency 285
 
7696 akron1 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")
6613 leency 293
 
7696 akron1 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
 
302
        |mConst.Target_iDLL, mConst.Target_iDLL64:
303
            STRINGS.append(outname, ".dll")
304
 
305
        |mConst.Target_iMSP430:
306
            STRINGS.append(outname, ".hex")
307
        END
308
    ELSE
309
        IF PATHS.isRelative(outname) THEN
310
            PATHS.RelPath(app_path, outname, temp);
311
            outname := temp
312
        END
313
    END;
314
 
7693 akron1 315
    PARS.init(bit_depth, target, options);
6613 leency 316
 
7693 akron1 317
    PARS.program.dll := target IN {mConst.Target_iELFSO32, mConst.Target_iELFSO64, mConst.Target_iDLL, mConst.Target_iDLL64, mConst.Target_iObject};
318
    PARS.program.obj := target = mConst.Target_iObject;
319
 
320
    ST.compile(path, lib_path, modname, outname, target, options);
321
 
7597 akron1 322
    time := UTILS.GetTickCount() - UTILS.time;
6613 leency 323
 
7696 akron1 324
    C.Int(PARS.lines); C.String(" lines, ");
7597 akron1 325
    C.Int(time DIV 100); C.String("."); C.Int2(time MOD 100); C.String(" sec, ");
326
    C.Int(WRITER.counter); C.StringLn(" bytes");
6613 leency 327
 
7597 akron1 328
    UTILS.Exit(0)
329
END main;
330
 
331
 
6613 leency 332
BEGIN
7597 akron1 333
    main
7696 akron1 334
END Compiler.