From 0c0853e635166dc13ada17e2b1a0d19460e0fd8e Mon Sep 17 00:00:00 2001 From: Alexander Arlt Date: Wed, 9 Mar 2022 16:51:08 -0500 Subject: [PATCH] CLI: Add checks for invalid output-modes for --import-asm-json. --- solc/CommandLineInterface.cpp | 12 ++++++++++-- solc/CommandLineParser.cpp | 29 +++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 4 deletions(-) diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index c6f5a2e0c..6d3bdb7d7 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -161,7 +161,11 @@ static bool coloredOutput(CommandLineOptions const& _options) void CommandLineInterface::handleBinary(string const& _contract) { - solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, ""); + solAssert( + m_options.input.mode == InputMode::Compiler || + m_options.input.mode == InputMode::CompilerWithASTImport || + m_options.input.mode == InputMode::CompilerWithEvmAssemblyJsonImport, "" + ); if (m_options.compiler.outputs.binary) { @@ -187,7 +191,11 @@ void CommandLineInterface::handleBinary(string const& _contract) void CommandLineInterface::handleOpcode(string const& _contract) { - solAssert(m_options.input.mode == InputMode::Compiler || m_options.input.mode == InputMode::CompilerWithASTImport, ""); + solAssert( + m_options.input.mode == InputMode::Compiler || + m_options.input.mode == InputMode::CompilerWithASTImport || + m_options.input.mode == InputMode::CompilerWithEvmAssemblyJsonImport, "" + ); if (!m_options.output.dir.empty()) createFile(m_compiler->filesystemFriendlyName(_contract) + ".opcode", evmasm::disassemble(m_compiler->object(_contract).bytecode)); diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index a306820b1..2a139c8cb 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -455,6 +455,13 @@ void CommandLineParser::parseOutputSelection() CompilerOutputs::componentName(&CompilerOutputs::ewasm), CompilerOutputs::componentName(&CompilerOutputs::ewasmIR), }; + static set const evmAssemblyJsonImportModeOutputs = { + CompilerOutputs::componentName(&CompilerOutputs::asm_), + CompilerOutputs::componentName(&CompilerOutputs::binary), + CompilerOutputs::componentName(&CompilerOutputs::binaryRuntime), + CompilerOutputs::componentName(&CompilerOutputs::opcodes), + CompilerOutputs::componentName(&CompilerOutputs::asmJson), + }; switch (_mode) { @@ -465,8 +472,9 @@ void CommandLineParser::parseOutputSelection() solAssert(false); case InputMode::Compiler: case InputMode::CompilerWithASTImport: - case InputMode::CompilerWithEvmAssemblyJsonImport: return util::contains(compilerModeOutputs, _outputName); + case InputMode::CompilerWithEvmAssemblyJsonImport: + return util::contains(evmAssemblyJsonImportModeOutputs, _outputName); case InputMode::Assembler: return util::contains(assemblerModeOutputs, _outputName); case InputMode::StandardJson: @@ -936,7 +944,6 @@ void CommandLineParser::processArgs() return; checkMutuallyExclusive({g_strColor, g_strNoColor}); - array const conflictingWithStopAfter{ CompilerOutputs::componentName(&CompilerOutputs::binary), CompilerOutputs::componentName(&CompilerOutputs::ir), @@ -952,9 +959,27 @@ void CommandLineParser::processArgs() for (auto& option: conflictingWithStopAfter) checkMutuallyExclusive({g_strStopAfter, option}); + array const conflictingWithAsmJsonImport{ + CompilerOutputs::componentName(&CompilerOutputs::ir), + CompilerOutputs::componentName(&CompilerOutputs::irOptimized), + CompilerOutputs::componentName(&CompilerOutputs::ewasm), + CompilerOutputs::componentName(&CompilerOutputs::ewasmIR), + g_strGas, + CompilerOutputs::componentName(&CompilerOutputs::metadata), + CompilerOutputs::componentName(&CompilerOutputs::natspecDev), + CompilerOutputs::componentName(&CompilerOutputs::natspecUser), + CompilerOutputs::componentName(&CompilerOutputs::signatureHashes), + CompilerOutputs::componentName(&CompilerOutputs::storageLayout), + CompilerOutputs::componentName(&CompilerOutputs::astCompactJson), + }; + + for (auto& option: conflictingWithAsmJsonImport) + checkMutuallyExclusive({g_strImportEvmAssemblerJson, option}); + if ( m_options.input.mode != InputMode::Compiler && m_options.input.mode != InputMode::CompilerWithASTImport && + m_options.input.mode != InputMode::CompilerWithEvmAssemblyJsonImport && m_options.input.mode != InputMode::Assembler ) {