diff options
author | partouf <partouf@gmail.com> | 2022-05-11 16:51:37 +0200 |
---|---|---|
committer | partouf <partouf@gmail.com> | 2022-05-11 16:51:37 +0200 |
commit | cb7a772e4a64f2c1c78725aef8b1d6687884456e (patch) | |
tree | 0319a274375b45dc07ef9e7f953eaac3a75bccfe /lib/compilers/typescript.js | |
parent | 8feb8ca9b320b802cfb3f4ddff7166c364aafc2f (diff) | |
parent | 7ee2ab17f29470575443bd67e5685ac54ce76158 (diff) | |
download | compiler-explorer-cb7a772e4a64f2c1c78725aef8b1d6687884456e.tar.gz compiler-explorer-cb7a772e4a64f2c1c78725aef8b1d6687884456e.zip |
Merge remote-tracking branch 'origin/main' into bbcmicrothings
Diffstat (limited to 'lib/compilers/typescript.js')
-rw-r--r-- | lib/compilers/typescript.js | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/lib/compilers/typescript.js b/lib/compilers/typescript.js new file mode 100644 index 000000000..732e482ca --- /dev/null +++ b/lib/compilers/typescript.js @@ -0,0 +1,96 @@ +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; + } +} |