aboutsummaryrefslogtreecommitdiff
path: root/lib/compilers
diff options
context:
space:
mode:
authorQuinton Miller <nicetas.c@gmail.com>2021-07-08 06:23:48 +0800
committerGitHub <noreply@github.com>2021-07-08 00:23:48 +0200
commit94ecb093a09a1c2885e260b30be87f18b5781ad3 (patch)
tree634f71d726bce9420cb60b5ffec0ef91056afdae /lib/compilers
parent7a3000c75821814743dcbc8db0c682b9de62b956 (diff)
downloadcompiler-explorer-94ecb093a09a1c2885e260b30be87f18b5781ad3.tar.gz
compiler-explorer-94ecb093a09a1c2885e260b30be87f18b5781ad3.zip
Add Crystal support (#2732)
* Add Crystal support * Fix copyright * Add ASM parser for Crystal * Add supportsLibraryCodeFilter * Update crystal-mode.js * use baseName * Force `square` call * Update default snippet Co-authored-by: Patrick Quist <partouf@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/crystal.js77
3 files changed, 85 insertions, 0 deletions
diff --git a/lib/compilers/_all.js b/lib/compilers/_all.js
index c72b1a417..8a69fe33e 100644
--- a/lib/compilers/_all.js
+++ b/lib/compilers/_all.js
@@ -30,6 +30,7 @@ export { Cc65Compiler } from './cc65';
export { ClangCompiler } from './clang';
export { ClangCudaCompiler } from './clang';
export { CleanCompiler } from './clean';
+export { CrystalCompiler } from './crystal';
export { DefaultCompiler } from './default';
export { DMDCompiler } from './dmd';
export { EllccCompiler } from './ellcc';
diff --git a/lib/compilers/argument-parsers.js b/lib/compilers/argument-parsers.js
index f1be78e9d..a7fd8d822 100644
--- a/lib/compilers/argument-parsers.js
+++ b/lib/compilers/argument-parsers.js
@@ -310,3 +310,10 @@ export class NimParser extends BaseParser {
return compiler;
}
}
+
+export class CrystalParser extends BaseParser {
+ static async parse(compiler) {
+ await CrystalParser.getOptions(compiler, 'build');
+ return compiler;
+ }
+}
diff --git a/lib/compilers/crystal.js b/lib/compilers/crystal.js
new file mode 100644
index 000000000..d03924eb6
--- /dev/null
+++ b/lib/compilers/crystal.js
@@ -0,0 +1,77 @@
+// Copyright (c) 2021, Compiler Explorer Authors
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+// this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+
+import path from 'path';
+
+import _ from 'underscore';
+
+import { BaseCompiler } from '../base-compiler';
+
+import { CrystalAsmParser } from '../asm-parser-crystal';
+import { CrystalParser } from './argument-parsers';
+
+export class CrystalCompiler extends BaseCompiler {
+ static get key() { return 'crystal'; }
+
+ constructor(compiler, env) {
+ super(compiler, env);
+ this.asm = new CrystalAsmParser();
+ this.compiler.supportsIrView = true;
+ this.compiler.irArg = ['--emit', 'llvm-ir'];
+ }
+
+ getSharedLibraryPathsAsArguments() {
+ return [];
+ }
+
+ optionsForFilter(filters, outputFilename, userOptions) {
+ const output = this.filename(this.getExecutableFilename(path.dirname(outputFilename), this.outputFilebase));
+ let options = ['build', '-o', output];
+
+ const userRequestedEmit = _.any(userOptions, opt => opt.includes('--emit'));
+ if (!filters.binary) {
+ if (!userRequestedEmit) {
+ options = options.concat('--emit', 'asm');
+ }
+ }
+
+ return options;
+ }
+
+ getOutputFilename(dirPath) {
+ return path.join(dirPath, `${path.basename(this.compileFilename, this.lang.extensions[0])}.s`);
+ }
+
+ getExecutableFilename(dirPath, outputFilebase) {
+ return path.join(dirPath, outputFilebase);
+ }
+
+ getObjdumpOutputFilename(defaultOutputFilename) {
+ return this.getExecutableFilename(path.dirname(defaultOutputFilename), this.outputFilebase);
+ }
+
+ getArgumentParser() {
+ return CrystalParser;
+ }
+}