aboutsummaryrefslogtreecommitdiff
path: root/lib/compilers/typescript.js
blob: 5fd1037c9ac877aabbb9cf030bb12adf5443831a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import {BaseCompiler} from '../base-compiler';

import {TypeScriptNativeParser} from './argument-parsers';

export class TypeScriptCompiler extends BaseCompiler {
    static get key() {
        return 'typescript';
    }

    constructor(compilerInfo, env) {
        super(compilerInfo, env);

        this.compiler.supportsIntel = false;
        this.compiler.supportsIrView = true;

        this.tscJit = this.compilerProps(`compiler.${this.compiler.id}.exe`);
        this.tscSharedLib = this.compilerProps(`compiler.${this.compiler.id}.sharedlibs`);
    }

    getSharedLibraryPathsAsArguments() {
        return [];
    }

    optionsForFilter(filters, outputFilename) {
        return [this.filename(outputFilename)];
    }

    async handleInterpreting(key, executeParameters) {
        executeParameters.args = [
            '--emit=jit',
            this.tscSharedLib ? '--shared-libs=' + this.tscSharedLib : '-nogc',
            ...executeParameters.args,
        ];

        return await super.handleInterpreting(key, executeParameters);
    }

    async runCompiler(compiler, options, inputFilename, execOptions) {
        // These options make Clang produce an IR
        const newOptions = [
            '--emit=mlir-llvm',
            inputFilename,
        ];

        if (!this.tscSharedLib) {
            newOptions.push('-nogc');
        }

        const output = await this.runCompilerRawOutput(
            this.tscJit, newOptions, this.filename(inputFilename), execOptions);
        if (output.code !== 0) {
            return [{text: 'Failed to run compiler to get MLIR code'}];
        }

        return {code: 0};
    }

    async generateIR(inputFilename, options, filters) {
        // These options make Clang produce an IR
        const newOptions = [
            '--emit=llvm',
            inputFilename,
        ];

        if (!this.tscSharedLib) {
            newOptions.push('-nogc');
        }

        const execOptions = this.getDefaultExecOptions();
        // TODO: maybe this isn't needed?
        execOptions.maxOutput = 1024 * 1024 * 1024;

        const output = await this.runCompilerRawOutput(
            this.tscJit, newOptions, this.filename(inputFilename), execOptions);
        if (output.code !== 0) {
            return [{text: 'Failed to run compiler to get IR code'}];
        }

        filters.commentOnly = false;
        filters.libraryCode = true;
        filters.directives = true;

        const ir = await this.llvmIr.process(output.stderr, filters);
        return ir.asm;
    }

    isCfgCompiler() {
        return true;
    }

    getArgumentParser() {
        return TypeScriptNativeParser;
    }
}