aboutsummaryrefslogtreecommitdiff
path: root/lib/compilers
diff options
context:
space:
mode:
authorODuzhar <59564676+ODuzhar@users.noreply.github.com>2022-03-22 03:14:03 +0000
committerGitHub <noreply@github.com>2022-03-21 22:14:03 -0500
commitdf3042f29b26e5ec2e080119156bf1c725d07d95 (patch)
tree8e3e4bb19d2c3d1ba0bb99af36ae97b1fdb4ca1c /lib/compilers
parent5f01821eb40450284a92fc4fa066772743b2a697 (diff)
downloadcompiler-explorer-df3042f29b26e5ec2e080119156bf1c725d07d95.tar.gz
compiler-explorer-df3042f29b26e5ec2e080119156bf1c725d07d95.zip
Added TypeScript Native compiler (#3448)gh-2193
* progress * added some config Co-authored-by: Alex D <duzhar@gmail.com>
Diffstat (limited to 'lib/compilers')
-rw-r--r--lib/compilers/_all.js1
-rw-r--r--lib/compilers/argument-parsers.js7
-rw-r--r--lib/compilers/typescript.js98
3 files changed, 106 insertions, 0 deletions
diff --git a/lib/compilers/_all.js b/lib/compilers/_all.js
index b2c8142bf..d587abc1a 100644
--- a/lib/compilers/_all.js
+++ b/lib/compilers/_all.js
@@ -75,6 +75,7 @@ export { SPIRVCompiler } from './spirv';
export { SwiftCompiler } from './swift';
export { TenDRACompiler } from './tendra';
export { TinyCCompiler } from './tinyc';
+export { TypeScriptCompiler } from './typescript';
export { VBCompiler } from './dotnet';
export { Win32Compiler } from './win32';
export { Win32VcCompiler } from './win32-vc';
diff --git a/lib/compilers/argument-parsers.js b/lib/compilers/argument-parsers.js
index aeed08a50..2ff065a59 100644
--- a/lib/compilers/argument-parsers.js
+++ b/lib/compilers/argument-parsers.js
@@ -345,3 +345,10 @@ export class CrystalParser extends BaseParser {
return compiler;
}
}
+
+export class TypeScriptNativeParser extends BaseParser {
+ static async parse(compiler) {
+ await TypeScriptNativeParser.getOptions(compiler, '--help');
+ return compiler;
+ }
+}
diff --git a/lib/compilers/typescript.js b/lib/compilers/typescript.js
new file mode 100644
index 000000000..13c87d585
--- /dev/null
+++ b/lib/compilers/typescript.js
@@ -0,0 +1,98 @@
+import _ from 'underscore';
+
+import { BaseCompiler } from '../base-compiler';
+import { logger } from '../logger';
+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();
+ // A higher max output is needed for when the user includes headers
+ 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;
+ }
+}