diff options
author | Alexey Shekhirin <a.shekhirin@gmail.com> | 2022-04-14 03:33:13 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-14 02:33:13 +0200 |
commit | 2001d1b65ebef08355d52159146a9f3513b26c0f (patch) | |
tree | f9c90b64be96edbdc9929503659b7d5076714ec5 | |
parent | 89894f3e6732c6aba1d1c240e9ae15cd235223a5 (diff) | |
download | compiler-explorer-2001d1b65ebef08355d52159146a9f3513b26c0f.tar.gz compiler-explorer-2001d1b65ebef08355d52159146a9f3513b26c0f.zip |
Add support for Solidity (#3507)gh-2350
* feat(compilers): Solidity support MVP
* don't concat userOptions in optionsForFilter
* fixes after review
* Update etc/config/solidity.defaults.properties
Co-authored-by: Rubén Rincón Blanco <ruben@rinconblanco.es>
Co-authored-by: Rubén Rincón Blanco <ruben@rinconblanco.es>
-rw-r--r-- | etc/config/solidity.amazon.properties | 178 | ||||
-rw-r--r-- | etc/config/solidity.defaults.properties | 12 | ||||
-rw-r--r-- | examples/solidity/default.sol | 8 | ||||
-rw-r--r-- | lib/compilers/_all.js | 1 | ||||
-rw-r--r-- | lib/compilers/solidity.js | 97 | ||||
-rw-r--r-- | lib/languages.js | 6 | ||||
-rw-r--r-- | webpack.config.esm.js | 3 |
7 files changed, 304 insertions, 1 deletions
diff --git a/etc/config/solidity.amazon.properties b/etc/config/solidity.amazon.properties new file mode 100644 index 000000000..f817d52f4 --- /dev/null +++ b/etc/config/solidity.amazon.properties @@ -0,0 +1,178 @@ +compilers=&solc +defaultCompiler=solc0813 + +group.solc.compilers=solc036:solc040:solc041:solc042:solc043:solc044:solc045:solc046:solc047:solc048:solc049:solc0410:solc0411:solc0412:solc0413:solc0414:solc0415:solc0416:solc0417:solc0418:solc0419:solc0420:solc0421:solc0422:solc0423:solc0424:solc0425:solc0426:solc050:solc051:solc052:solc053:solc054:solc055:solc056:solc057:solc058:solc059:solc0510:solc0511:solc0512:solc0513:solc0514:solc0515:solc0516:solc0517:solc060:solc061:solc062:solc063:solc064:solc065:solc066:solc067:solc068:solc069:solc0610:solc0611:solc0612:solc070:solc071:solc072:solc073:solc074:solc075:solc076:solc080:solc081:solc082:solc083:solc084:solc085:solc086:solc087:solc088:solc089:solc0810:solc0811:solc0812:solc0813 +group.solc.compilerType=solidity +group.solc.supportsBinary=false +group.solc.instructionSet=evm +compiler.solc036.exe=/opt/compiler-explorer/solc-0.3.6/solc +compiler.solc036.semver=0.3.6 +compiler.solc040.exe=/opt/compiler-explorer/solc-0.4.0/solc +compiler.solc040.semver=0.4.0 +compiler.solc041.exe=/opt/compiler-explorer/solc-0.4.1/solc +compiler.solc041.semver=0.4.1 +compiler.solc042.exe=/opt/compiler-explorer/solc-0.4.2/solc +compiler.solc042.semver=0.4.2 +compiler.solc043.exe=/opt/compiler-explorer/solc-0.4.3/solc +compiler.solc043.semver=0.4.3 +compiler.solc044.exe=/opt/compiler-explorer/solc-0.4.4/solc +compiler.solc044.semver=0.4.4 +compiler.solc045.exe=/opt/compiler-explorer/solc-0.4.5/solc +compiler.solc045.semver=0.4.5 +compiler.solc046.exe=/opt/compiler-explorer/solc-0.4.6/solc +compiler.solc046.semver=0.4.6 +compiler.solc047.exe=/opt/compiler-explorer/solc-0.4.7/solc +compiler.solc047.semver=0.4.7 +compiler.solc048.exe=/opt/compiler-explorer/solc-0.4.8/solc +compiler.solc048.semver=0.4.8 +compiler.solc049.exe=/opt/compiler-explorer/solc-0.4.9/solc +compiler.solc049.semver=0.4.9 +compiler.solc0410.exe=/opt/compiler-explorer/solc-0.4.10/solc +compiler.solc0410.semver=0.4.10 +compiler.solc0411.exe=/opt/compiler-explorer/solc-0.4.11/solc +compiler.solc0411.semver=0.4.11 +compiler.solc0412.exe=/opt/compiler-explorer/solc-0.4.12/solc +compiler.solc0412.semver=0.4.12 +compiler.solc0413.exe=/opt/compiler-explorer/solc-0.4.13/solc +compiler.solc0413.semver=0.4.13 +compiler.solc0414.exe=/opt/compiler-explorer/solc-0.4.14/solc +compiler.solc0414.semver=0.4.14 +compiler.solc0415.exe=/opt/compiler-explorer/solc-0.4.15/solc +compiler.solc0415.semver=0.4.15 +compiler.solc0416.exe=/opt/compiler-explorer/solc-0.4.16/solc +compiler.solc0416.semver=0.4.16 +compiler.solc0417.exe=/opt/compiler-explorer/solc-0.4.17/solc +compiler.solc0417.semver=0.4.17 +compiler.solc0418.exe=/opt/compiler-explorer/solc-0.4.18/solc +compiler.solc0418.semver=0.4.18 +compiler.solc0419.exe=/opt/compiler-explorer/solc-0.4.19/solc +compiler.solc0419.semver=0.4.19 +compiler.solc0420.exe=/opt/compiler-explorer/solc-0.4.20/solc +compiler.solc0420.semver=0.4.20 +compiler.solc0421.exe=/opt/compiler-explorer/solc-0.4.21/solc +compiler.solc0421.semver=0.4.21 +compiler.solc0422.exe=/opt/compiler-explorer/solc-0.4.22/solc +compiler.solc0422.semver=0.4.22 +compiler.solc0423.exe=/opt/compiler-explorer/solc-0.4.23/solc +compiler.solc0423.semver=0.4.23 +compiler.solc0424.exe=/opt/compiler-explorer/solc-0.4.24/solc +compiler.solc0424.semver=0.4.24 +compiler.solc0425.exe=/opt/compiler-explorer/solc-0.4.25/solc +compiler.solc0425.semver=0.4.25 +compiler.solc0426.exe=/opt/compiler-explorer/solc-0.4.26/solc +compiler.solc0426.semver=0.4.26 +compiler.solc050.exe=/opt/compiler-explorer/solc-0.5.0/solc +compiler.solc050.semver=0.5.0 +compiler.solc051.exe=/opt/compiler-explorer/solc-0.5.1/solc +compiler.solc051.semver=0.5.1 +compiler.solc052.exe=/opt/compiler-explorer/solc-0.5.2/solc +compiler.solc052.semver=0.5.2 +compiler.solc053.exe=/opt/compiler-explorer/solc-0.5.3/solc +compiler.solc053.semver=0.5.3 +compiler.solc054.exe=/opt/compiler-explorer/solc-0.5.4/solc +compiler.solc054.semver=0.5.4 +compiler.solc055.exe=/opt/compiler-explorer/solc-0.5.5/solc +compiler.solc055.semver=0.5.5 +compiler.solc056.exe=/opt/compiler-explorer/solc-0.5.6/solc +compiler.solc056.semver=0.5.6 +compiler.solc057.exe=/opt/compiler-explorer/solc-0.5.7/solc +compiler.solc057.semver=0.5.7 +compiler.solc058.exe=/opt/compiler-explorer/solc-0.5.8/solc +compiler.solc058.semver=0.5.8 +compiler.solc059.exe=/opt/compiler-explorer/solc-0.5.9/solc +compiler.solc059.semver=0.5.9 +compiler.solc0510.exe=/opt/compiler-explorer/solc-0.5.10/solc +compiler.solc0510.semver=0.5.10 +compiler.solc0511.exe=/opt/compiler-explorer/solc-0.5.11/solc +compiler.solc0511.semver=0.5.11 +compiler.solc0512.exe=/opt/compiler-explorer/solc-0.5.12/solc +compiler.solc0512.semver=0.5.12 +compiler.solc0513.exe=/opt/compiler-explorer/solc-0.5.13/solc +compiler.solc0513.semver=0.5.13 +compiler.solc0514.exe=/opt/compiler-explorer/solc-0.5.14/solc +compiler.solc0514.semver=0.5.14 +compiler.solc0515.exe=/opt/compiler-explorer/solc-0.5.15/solc +compiler.solc0515.semver=0.5.15 +compiler.solc0516.exe=/opt/compiler-explorer/solc-0.5.16/solc +compiler.solc0516.semver=0.5.16 +compiler.solc0517.exe=/opt/compiler-explorer/solc-0.5.17/solc +compiler.solc0517.semver=0.5.17 +compiler.solc060.exe=/opt/compiler-explorer/solc-0.6.0/solc +compiler.solc060.semver=0.6.0 +compiler.solc061.exe=/opt/compiler-explorer/solc-0.6.1/solc +compiler.solc061.semver=0.6.1 +compiler.solc062.exe=/opt/compiler-explorer/solc-0.6.2/solc +compiler.solc062.semver=0.6.2 +compiler.solc063.exe=/opt/compiler-explorer/solc-0.6.3/solc +compiler.solc063.semver=0.6.3 +compiler.solc064.exe=/opt/compiler-explorer/solc-0.6.4/solc +compiler.solc064.semver=0.6.4 +compiler.solc065.exe=/opt/compiler-explorer/solc-0.6.5/solc +compiler.solc065.semver=0.6.5 +compiler.solc066.exe=/opt/compiler-explorer/solc-0.6.6/solc +compiler.solc066.semver=0.6.6 +compiler.solc067.exe=/opt/compiler-explorer/solc-0.6.7/solc +compiler.solc067.semver=0.6.7 +compiler.solc068.exe=/opt/compiler-explorer/solc-0.6.8/solc +compiler.solc068.semver=0.6.8 +compiler.solc069.exe=/opt/compiler-explorer/solc-0.6.9/solc +compiler.solc069.semver=0.6.9 +compiler.solc0610.exe=/opt/compiler-explorer/solc-0.6.10/solc +compiler.solc0610.semver=0.6.10 +compiler.solc0611.exe=/opt/compiler-explorer/solc-0.6.11/solc +compiler.solc0611.semver=0.6.11 +compiler.solc0612.exe=/opt/compiler-explorer/solc-0.6.12/solc +compiler.solc0612.semver=0.6.12 +compiler.solc070.exe=/opt/compiler-explorer/solc-0.7.0/solc +compiler.solc070.semver=0.7.0 +compiler.solc071.exe=/opt/compiler-explorer/solc-0.7.1/solc +compiler.solc071.semver=0.7.1 +compiler.solc072.exe=/opt/compiler-explorer/solc-0.7.2/solc +compiler.solc072.semver=0.7.2 +compiler.solc073.exe=/opt/compiler-explorer/solc-0.7.3/solc +compiler.solc073.semver=0.7.3 +compiler.solc074.exe=/opt/compiler-explorer/solc-0.7.4/solc +compiler.solc074.semver=0.7.4 +compiler.solc075.exe=/opt/compiler-explorer/solc-0.7.5/solc +compiler.solc075.semver=0.7.5 +compiler.solc076.exe=/opt/compiler-explorer/solc-0.7.6/solc +compiler.solc076.semver=0.7.6 +compiler.solc080.exe=/opt/compiler-explorer/solc-0.8.0/solc +compiler.solc080.semver=0.8.0 +compiler.solc081.exe=/opt/compiler-explorer/solc-0.8.1/solc +compiler.solc081.semver=0.8.1 +compiler.solc082.exe=/opt/compiler-explorer/solc-0.8.2/solc +compiler.solc082.semver=0.8.2 +compiler.solc083.exe=/opt/compiler-explorer/solc-0.8.3/solc +compiler.solc083.semver=0.8.3 +compiler.solc084.exe=/opt/compiler-explorer/solc-0.8.4/solc +compiler.solc084.semver=0.8.4 +compiler.solc085.exe=/opt/compiler-explorer/solc-0.8.5/solc +compiler.solc085.semver=0.8.5 +compiler.solc086.exe=/opt/compiler-explorer/solc-0.8.6/solc +compiler.solc086.semver=0.8.6 +compiler.solc087.exe=/opt/compiler-explorer/solc-0.8.7/solc +compiler.solc087.semver=0.8.7 +compiler.solc088.exe=/opt/compiler-explorer/solc-0.8.8/solc +compiler.solc088.semver=0.8.8 +compiler.solc089.exe=/opt/compiler-explorer/solc-0.8.9/solc +compiler.solc089.semver=0.8.9 +compiler.solc0810.exe=/opt/compiler-explorer/solc-0.8.10/solc +compiler.solc0810.semver=0.8.10 +compiler.solc0811.exe=/opt/compiler-explorer/solc-0.8.11/solc +compiler.solc0811.semver=0.8.11 +compiler.solc0812.exe=/opt/compiler-explorer/solc-0.8.12/solc +compiler.solc0812.semver=0.8.12 +compiler.solc0813.exe=/opt/compiler-explorer/solc-0.8.13/solc +compiler.solc0813.semver=0.8.13 + +################################# +################################# +# Installed libs (See c++.amazon.properties for a scheme of libs group) +libs= + +################################# +################################# +# Installed tools + +tools= diff --git a/etc/config/solidity.defaults.properties b/etc/config/solidity.defaults.properties new file mode 100644 index 000000000..d682ac85b --- /dev/null +++ b/etc/config/solidity.defaults.properties @@ -0,0 +1,12 @@ +compilers=/usr/bin/solc +compilerType=solidity +supportsBinary=false +instructionSet=evm + +isSemVer=true +baseName=solc + +################################# +################################# +# Installed libs (See c++.amazon.properties for a scheme of libs group) +libs= diff --git a/examples/solidity/default.sol b/examples/solidity/default.sol new file mode 100644 index 000000000..e6300525c --- /dev/null +++ b/examples/solidity/default.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >=0.4.0; + +contract Square { + function square(uint32 num) public pure returns (uint32) { + return num * num; + } +} diff --git a/lib/compilers/_all.js b/lib/compilers/_all.js index d587abc1a..d0484a31c 100644 --- a/lib/compilers/_all.js +++ b/lib/compilers/_all.js @@ -71,6 +71,7 @@ export { RustcCgGCCCompiler } from './rustc-cg-gcc'; export { MrustcCompiler } from './mrustc'; export { ScalaCompiler } from './scala'; export { SdccCompiler } from './sdcc'; +export { SolidityCompiler } from './solidity'; export { SPIRVCompiler } from './spirv'; export { SwiftCompiler } from './swift'; export { TenDRACompiler } from './tendra'; diff --git a/lib/compilers/solidity.js b/lib/compilers/solidity.js new file mode 100644 index 000000000..6053de4ce --- /dev/null +++ b/lib/compilers/solidity.js @@ -0,0 +1,97 @@ +// Copyright (c) 2022, 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 { ClangParser } from './argument-parsers'; + +export class SolidityCompiler extends BaseCompiler { + static get key() { return 'solidity'; } + + getSharedLibraryPathsAsArguments() { + return []; + } + + getArgumentParser() { + return ClangParser; + } + + optionsForFilter(filters, outputFilename, userOptions) { + return [ + '--combined-json', 'asm', // We use it instead of `--asm-json` to have compacted json + '-o', 'contracts', + ]; + } + + isCfgCompiler(/*compilerVersion*/) { + return false; + } + + getOutputFilename(dirPath) { + return path.join(dirPath, 'contracts/combined.json'); + } + + processAsm(result) { + // Handle "error" documents. + if (!result.asm.includes('\n') && result.asm[0] === '<') { + return {asm: [{text: result.asm}]}; + } + + return { + asm: Object.entries(JSON.parse(result.asm).contracts) + .sort(([_name1, data1], [_name2, data2]) => + data1.asm['.code'][0].begin - data2.asm['.code'][0].begin, + ) + .map(([name, data]) => { + const processOpcodes = (opcodes, indent) => opcodes + .map(opcode => + `${opcode.name}${opcode.value !== undefined ? ` ${opcode.value}` : ''}`, + ) + .map(opcode => + (indent || '') + (opcode.startsWith('tag') ? opcode : `\t${opcode}`), + ); + + return [ + `// ${_.last(name.split(':'))}`, + '.code', + processOpcodes(data.asm['.code']), + '.data', + Object.entries(data.asm['.data']).map(([id, {'.code': code}]) => [ + `\t${id}:`, + '\t\t.code', + processOpcodes(code, '\t\t'), + ]), + '\n', + ]; + }) + .flat(Infinity) + .slice(0, -1) + .map(line => ({text: line})), + }; + } +} diff --git a/lib/languages.js b/lib/languages.js index 6cbd8760b..b4115d705 100644 --- a/lib/languages.js +++ b/lib/languages.js @@ -290,6 +290,12 @@ export const languages = { extensions: ['.ts', '.d.ts'], alias: [], }, + solidity: { + name: 'Solidity', + monaco: 'sol', + extensions: ['.sol'], + alias: [], + }, }; _.each(languages, (lang, key) => { diff --git a/webpack.config.esm.js b/webpack.config.esm.js index e4e9942e9..4c5945a2e 100644 --- a/webpack.config.esm.js +++ b/webpack.config.esm.js @@ -47,7 +47,8 @@ const webjackJsHack = '.v6.'; const plugins = [ new MonacoEditorWebpackPlugin({ languages: ['cpp', 'go', 'pascal', 'python', 'rust', 'swift', 'java', - 'kotlin', 'scala', 'ruby', 'csharp', 'fsharp', 'vb', 'dart', 'typescript'], + 'kotlin', 'scala', 'ruby', 'csharp', 'fsharp', 'vb', 'dart', + 'typescript', 'solidity'], filename: isDev ? '[name].worker.js' : `[name]${webjackJsHack}worker.[contenthash].js`, }), new ProvidePlugin({ |