mirror of
https://github.com/compiler-explorer/compiler-explorer.git
synced 2025-12-27 10:33:59 -05:00
Add zig support
This commit is contained in:
@@ -57,3 +57,4 @@ From oldest to newest contributor, we would like to thank:
|
|||||||
- [phuclv90](https://github.com/phuclv90)
|
- [phuclv90](https://github.com/phuclv90)
|
||||||
- [Nicole Mazzuca](https://github.com/ubsan)
|
- [Nicole Mazzuca](https://github.com/ubsan)
|
||||||
- [Jameson Nash](https://github.com/vtjnash)
|
- [Jameson Nash](https://github.com/vtjnash)
|
||||||
|
- [Marc Tiehuis](https://github.com/tiehuis)
|
||||||
|
|||||||
15
etc/config/zig.amazon.properties
Normal file
15
etc/config/zig.amazon.properties
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
compilers=&zig
|
||||||
|
defaultCompiler=master
|
||||||
|
|
||||||
|
group.zig.compilers=master
|
||||||
|
group.zig.objdumper=/opt/compiler-explorer/gcc-8.1.0/bin/objdump
|
||||||
|
group.zig.isSemVer=true
|
||||||
|
group.zig.baseName=zig
|
||||||
|
|
||||||
|
compiler.master.exe=/opt/compiler-explorer/zig-master/bin/zig
|
||||||
|
compiler.master.semver=master
|
||||||
|
|
||||||
|
#################################
|
||||||
|
#################################
|
||||||
|
# Installed libs (See c++.amazon.properties for a scheme of libs group)
|
||||||
|
libs=
|
||||||
12
etc/config/zig.defaults.properties
Normal file
12
etc/config/zig.defaults.properties
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
compilers=/usr/bin/zig
|
||||||
|
supportsBinary=true
|
||||||
|
compilerType=zig
|
||||||
|
objdumper=objdump
|
||||||
|
versionFlag=version
|
||||||
|
binaryHideFuncRe=^(_.*|call_gmon_start|(de)?register_tm_clones|frame_dummy|.*@plt.*)$
|
||||||
|
|
||||||
|
|
||||||
|
#################################
|
||||||
|
#################################
|
||||||
|
# Installed libs (See c++.amazon.properties for a scheme of libs group)
|
||||||
|
libs=
|
||||||
7
examples/zig/Sum_over_array.zig
Normal file
7
examples/zig/Sum_over_array.zig
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
export fn sumArray(array: [*]const u32, len: usize) u32 {
|
||||||
|
var sum: u32 = 0;
|
||||||
|
for (array[0..len]) |item| {
|
||||||
|
sum += item;
|
||||||
|
}
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
4
examples/zig/default.zig
Normal file
4
examples/zig/default.zig
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
// Type your code here, or load an example.
|
||||||
|
export fn square(num: i32) i32 {
|
||||||
|
return num * num;
|
||||||
|
}
|
||||||
@@ -250,6 +250,8 @@ class BaseCompiler {
|
|||||||
return this.env.cacheGet(key)
|
return this.env.cacheGet(key)
|
||||||
.then((result) => {
|
.then((result) => {
|
||||||
if (result) return result;
|
if (result) return result;
|
||||||
|
|
||||||
|
source = this.preProcess(source);
|
||||||
if (filters.binary && !source.match(this.compilerProps("stubRe"))) {
|
if (filters.binary && !source.match(this.compilerProps("stubRe"))) {
|
||||||
source += "\n" + this.compilerProps("stubText") + "\n";
|
source += "\n" + this.compilerProps("stubText") + "\n";
|
||||||
}
|
}
|
||||||
@@ -544,6 +546,10 @@ Please select another pass or change filters.`;
|
|||||||
.then(postResult => this.handlePostProcessResult(result, postResult));
|
.then(postResult => this.handlePostProcessResult(result, postResult));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
preProcess(source) {
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
postProcess(result, outputFilename, filters) {
|
postProcess(result, outputFilename, filters) {
|
||||||
const postProcess = _.compact(this.compiler.postProcess);
|
const postProcess = _.compact(this.compiler.postProcess);
|
||||||
const maxSize = this.env.ceProps("max-asm-size", 8 * 1024 * 1024);
|
const maxSize = this.env.ceProps("max-asm-size", 8 * 1024 * 1024);
|
||||||
|
|||||||
64
lib/compilers/zig.js
Normal file
64
lib/compilers/zig.js
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
// Copyright (c) 2018, Marc Tiehuis
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
const BaseCompiler = require('../base-compiler'),
|
||||||
|
_ = require('underscore'),
|
||||||
|
path = require('path');
|
||||||
|
|
||||||
|
class ZigCompiler extends BaseCompiler {
|
||||||
|
constructor(info, env) {
|
||||||
|
super(info, env);
|
||||||
|
this.compiler.supportsIntel = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
preProcess(source) {
|
||||||
|
source += '\n';
|
||||||
|
source += 'extern fn zig_panic() noreturn;\n';
|
||||||
|
source += 'pub inline fn panic(msg: []const u8, error_return_trace: ' +
|
||||||
|
'?*@import("builtin").StackTrace) noreturn {\n';
|
||||||
|
source += ' zig_panic();\n';
|
||||||
|
source += '}\n';
|
||||||
|
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
optionsForFilter(filters, outputFilename, userOptions) {
|
||||||
|
let options = [
|
||||||
|
'build-obj',
|
||||||
|
'--cache-dir', path.dirname(outputFilename),
|
||||||
|
'--output', this.filename(outputFilename)
|
||||||
|
];
|
||||||
|
|
||||||
|
let userRequestedEmit = _.any(userOptions, opt => opt.indexOf("--emit") > -1);
|
||||||
|
if (!filters.binary) {
|
||||||
|
if (!userRequestedEmit) {
|
||||||
|
options = options.concat('--emit', 'asm');
|
||||||
|
}
|
||||||
|
if (filters.intel) options = options.concat('-mllvm', '--x86-asm-syntax=intel');
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = ZigCompiler;
|
||||||
@@ -130,7 +130,13 @@ const languages = {
|
|||||||
monaco: 'cuda',
|
monaco: 'cuda',
|
||||||
extensions: ['.cu'],
|
extensions: ['.cu'],
|
||||||
alias: ['nvcc']
|
alias: ['nvcc']
|
||||||
}
|
},
|
||||||
|
zig: {
|
||||||
|
name: 'Zig',
|
||||||
|
monaco: 'zig',
|
||||||
|
extensions: ['.zig'],
|
||||||
|
alias: []
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const fs = require('fs-extra');
|
const fs = require('fs-extra');
|
||||||
|
|||||||
135
static/modes/zig-mode.js
Normal file
135
static/modes/zig-mode.js
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
// Copyright (c) 2018, Marc Tiehuis
|
||||||
|
// 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.
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
function definition() {
|
||||||
|
return {
|
||||||
|
defaultToken: 'invalid',
|
||||||
|
|
||||||
|
keywords: [
|
||||||
|
'const', 'var', 'extern', 'packed', 'export', 'pub', 'noalias', 'inline',
|
||||||
|
'comptime', 'nakedcc', 'stdcallcc', 'volatile', 'align', 'section',
|
||||||
|
'struct', 'enum', 'union',
|
||||||
|
'break', 'return', 'continue', 'asm', 'defer', 'errdefer', 'unreachable',
|
||||||
|
'try', 'catch', 'async', 'await', 'suspend', 'resume', 'cancel',
|
||||||
|
'if', 'else', 'switch', 'and', 'or', 'orelse',
|
||||||
|
'while', 'for',
|
||||||
|
'null', 'undefined', 'this',
|
||||||
|
'fn', 'use', 'test'
|
||||||
|
],
|
||||||
|
typeKeywords: [
|
||||||
|
'bool', 'f32', 'f64', 'f128', 'void', 'noreturn', 'type', 'error', 'promise',
|
||||||
|
'isize', 'usize', 'c_short', 'c_ushort', 'c_int', 'c_uint', 'c_long', 'c_ulong',
|
||||||
|
'c_longlong', 'c_ulonglong', 'c_longdouble', 'c_void'
|
||||||
|
],
|
||||||
|
operators: [
|
||||||
|
'+', '+%', '-', '-%', '/', '*', '*%', '=', '^', '&', '?', '|',
|
||||||
|
'!', '>', '<', '%', '<<', '<<%', '>>',
|
||||||
|
'+=', '+%=', '-=', '-%=', '/=', '*=', '*%=', '==', '^=', '&=',
|
||||||
|
'?=', '|=', '!=', '>=', '<=', '%=', '<<=', '<<%=', '>>='
|
||||||
|
],
|
||||||
|
|
||||||
|
symbols: /[=><!~?:&|+\-*/^%]+/,
|
||||||
|
|
||||||
|
escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,
|
||||||
|
|
||||||
|
tokenizer: {
|
||||||
|
root: [
|
||||||
|
// u0/i0 integer types
|
||||||
|
[/[iu]\d+/, 'keyword'],
|
||||||
|
|
||||||
|
// identifiers and keywords
|
||||||
|
[/[a-z_$][\w$]*/, {
|
||||||
|
cases: {
|
||||||
|
'@typeKeywords': 'keyword',
|
||||||
|
'@keywords': 'keyword',
|
||||||
|
'@default': 'identifier'
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
|
||||||
|
[/@[a-zA-Z_$]*/, 'builtin.identifier'],
|
||||||
|
|
||||||
|
[/[A-Z][\w$]*/, 'type.identifier'], // to show class names nicely
|
||||||
|
|
||||||
|
// whitespace
|
||||||
|
{include: '@whitespace'},
|
||||||
|
|
||||||
|
// delimiters and operators
|
||||||
|
[/[{}()[\]]/, '@brackets'],
|
||||||
|
[/[<>](?!@symbols)/, '@brackets'],
|
||||||
|
[/@symbols/, {
|
||||||
|
cases: {
|
||||||
|
'@operators': 'operator',
|
||||||
|
'@default': ''
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
|
||||||
|
// numbers
|
||||||
|
[/\d*\.\d+([eE][-+]?\d+)?[fFdD]?/, 'number.float'],
|
||||||
|
[/0[xX][0-9a-fA-F_]*[0-9a-fA-F][Ll]?/, 'number.hex'],
|
||||||
|
[/0o[0-7_]*[0-7][Ll]?/, 'number.octal'],
|
||||||
|
[/0[bB][0-1_]*[0-1][Ll]?/, 'number.binary'],
|
||||||
|
[/\d+/, 'number'],
|
||||||
|
|
||||||
|
// delimiter: after number because of .\d floats
|
||||||
|
[/[;,.]/, 'delimiter'],
|
||||||
|
|
||||||
|
// strings
|
||||||
|
[/"([^"\\]|\\.)*$/, 'string.invalid'], // non-teminated string
|
||||||
|
[/c?\\\\.*$/, 'string'],
|
||||||
|
[/c?"/, 'string', '@string'],
|
||||||
|
|
||||||
|
// characters
|
||||||
|
[/'[^\\']'/, 'string'],
|
||||||
|
[/(')(@escapes)(')/, ['string', 'string.escape', 'string']],
|
||||||
|
[/'/, 'string.invalid']
|
||||||
|
],
|
||||||
|
|
||||||
|
whitespace: [
|
||||||
|
[/[ \r\n]+/, 'white'],
|
||||||
|
[/\/\*/, 'comment', '@comment'],
|
||||||
|
[/\/\+/, 'comment', '@comment'],
|
||||||
|
[/\/\/.*$/, 'comment'],
|
||||||
|
[/\t/, 'comment.invalid']
|
||||||
|
],
|
||||||
|
|
||||||
|
comment: [
|
||||||
|
[/[^/*]+/, 'comment'],
|
||||||
|
[/\/\*/, 'comment.invalid'],
|
||||||
|
[/[/*]/, 'comment']
|
||||||
|
],
|
||||||
|
|
||||||
|
string: [
|
||||||
|
[/[^\\"]+/, 'string'],
|
||||||
|
[/@escapes/, 'string.escape'],
|
||||||
|
[/\\./, 'string.escape.invalid'],
|
||||||
|
[/"/, 'string', '@pop']
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
monaco.languages.register({id: 'zig'});
|
||||||
|
monaco.languages.setMonarchTokensProvider('zig', definition());
|
||||||
@@ -40,6 +40,7 @@ require('../modes/ispc-mode');
|
|||||||
require('../modes/haskell-mode');
|
require('../modes/haskell-mode');
|
||||||
require('../modes/pascal-mode');
|
require('../modes/pascal-mode');
|
||||||
require('../modes/cuda-mode');
|
require('../modes/cuda-mode');
|
||||||
|
require('../modes/zig-mode');
|
||||||
require('selectize');
|
require('selectize');
|
||||||
|
|
||||||
var loadSave = new loadSaveLib.LoadSave();
|
var loadSave = new loadSaveLib.LoadSave();
|
||||||
|
|||||||
@@ -8,10 +8,10 @@ if metadata
|
|||||||
meta(name="description" content=metadata.ogDescription)
|
meta(name="description" content=metadata.ogDescription)
|
||||||
meta(property="og:description" content=metadata.ogDescription)
|
meta(property="og:description" content=metadata.ogDescription)
|
||||||
else
|
else
|
||||||
meta(name="description" content="Compiler Explorer is an interactive online compiler which shows the assembly output of compiled C, C++, Rust, Go, D, Haskell, Swift, Pascal & CUDA code.")
|
meta(name="description" content="Compiler Explorer is an interactive online compiler which shows the assembly output of compiled C, C++, Rust, Go, D, Haskell, Swift, Pascal, Zig & CUDA code.")
|
||||||
meta(property="og:description" content="Compiler Explorer is an interactive online compiler which shows the assembly output of compiled C, C++, Rust, Go, D, Haskell, Swift, Pascal & CUDA code.")
|
meta(property="og:description" content="Compiler Explorer is an interactive online compiler which shows the assembly output of compiled C, C++, Rust, Go, D, Haskell, Swift, Pascal, Zig & CUDA code.")
|
||||||
else
|
else
|
||||||
meta(name="description" content="Compiler Explorer is an interactive online compiler which shows the assembly output of compiled C, C++, Rust, Go, D, Haskell, Swift, Pascal & CUDA code.")
|
meta(name="description" content="Compiler Explorer is an interactive online compiler which shows the assembly output of compiled C, C++, Rust, Go, D, Haskell, Swift, Pascal, Zig & CUDA code.")
|
||||||
meta(property="og:title" content="Compiler Explorer")
|
meta(property="og:title" content="Compiler Explorer")
|
||||||
meta(name="twitter:card" content="summary")
|
meta(name="twitter:card" content="summary")
|
||||||
meta(name="twitter:site" content="@mattgodbolt")
|
meta(name="twitter:site" content="@mattgodbolt")
|
||||||
|
|||||||
Reference in New Issue
Block a user