aboutsummaryrefslogtreecommitdiff
path: root/lib/compilers/typescript.js
diff options
context:
space:
mode:
authorpartouf <partouf@gmail.com>2022-05-11 16:51:37 +0200
committerpartouf <partouf@gmail.com>2022-05-11 16:51:37 +0200
commitcb7a772e4a64f2c1c78725aef8b1d6687884456e (patch)
tree0319a274375b45dc07ef9e7f953eaac3a75bccfe /lib/compilers/typescript.js
parent8feb8ca9b320b802cfb3f4ddff7166c364aafc2f (diff)
parent7ee2ab17f29470575443bd67e5685ac54ce76158 (diff)
downloadcompiler-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.js96
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;
+ }
+}