diff --git a/libsolidity/interface/StandardCompiler.cpp b/libsolidity/interface/StandardCompiler.cpp index a3d7afb59f31..8c9640cae79c 100644 --- a/libsolidity/interface/StandardCompiler.cpp +++ b/libsolidity/interface/StandardCompiler.cpp @@ -180,7 +180,7 @@ bool hashMatchesContent(std::string const& _hash, std::string const& _content) bool isArtifactRequested(Json const& _outputSelection, std::string const& _artifact, bool _wildcardMatchesExperimental) { - static std::set experimental{"ir", "irAst", "irOptimized", "irOptimizedAst"}; + static std::set experimental{"ir", "irAst", "irOptimized", "irOptimizedAst", "ethdebug"}; for (auto const& selectedArtifactJson: _outputSelection) { std::string const& selectedArtifact = selectedArtifactJson.get(); @@ -265,7 +265,7 @@ bool isBinaryRequested(Json const& _outputSelection) static std::vector const outputsThatRequireBinaries = std::vector{ "*", "ir", "irAst", "irOptimized", "irOptimizedAst", - "evm.gasEstimates", "evm.legacyAssembly", "evm.assembly" + "evm.gasEstimates", "evm.legacyAssembly", "evm.assembly", "ethdebug" } + evmObjectComponents("bytecode") + evmObjectComponents("deployedBytecode"); for (auto const& fileRequests: _outputSelection) @@ -295,6 +295,21 @@ bool isEvmBytecodeRequested(Json const& _outputSelection) return false; } +/// @returns true if ethdebug was requested. +bool isEthdebugRequested(Json const& _outputSelection) +{ + if (!_outputSelection.is_object()) + return false; + + for (auto const& fileRequests: _outputSelection) + for (auto const& requests: fileRequests) + for (auto const& request: requests) + if (request == "ethdebug") + return true; + + return false; +} + /// @returns The IR output selection for CompilerStack, based on outputs requested in the JSON. /// Note that as an exception, '*' does not yet match "ir", "irAst", "irOptimized" or "irOptimizedAst". CompilerStack::IROutputSelection irOutputSelection(Json const& _outputSelection) @@ -1306,7 +1321,7 @@ Json StandardCompiler::compileSolidity(StandardCompiler::InputsAndSettings _inpu compilerStack.setSources(sourceList); for (auto const& smtLib2Response: _inputsAndSettings.smtLib2Responses) compilerStack.addSMTLib2Response(smtLib2Response.first, smtLib2Response.second); - compilerStack.setViaIR(_inputsAndSettings.viaIR); + compilerStack.setViaIR(_inputsAndSettings.viaIR || isEthdebugRequested(_inputsAndSettings.outputSelection)); compilerStack.setEVMVersion(_inputsAndSettings.evmVersion); compilerStack.setRemappings(std::move(_inputsAndSettings.remappings)); compilerStack.setOptimiserSettings(std::move(_inputsAndSettings.optimiserSettings)); @@ -1326,12 +1341,9 @@ Json StandardCompiler::compileSolidity(StandardCompiler::InputsAndSettings _inpu Json errors = std::move(_inputsAndSettings.errors); - if ( - _inputsAndSettings.debugInfoSelection.has_value() && - _inputsAndSettings.debugInfoSelection->ethdebug && - (selectedIrOutput == CompilerStack::IROutputSelection::None && !_inputsAndSettings.viaIR) - ) - errors.emplace_back(formatError(Error::Type::FatalError, "general", "'ethdebug' can only be selected in 'settings.debug.debugInfo' when at least one of the IR outputs is selected or 'viaIR' was set.")); + if (_inputsAndSettings.debugInfoSelection.has_value() && _inputsAndSettings.debugInfoSelection->ethdebug) + if (selectedIrOutput == CompilerStack::IROutputSelection::None && !isEthdebugRequested(_inputsAndSettings.outputSelection)) + errors.emplace_back(formatError(Error::Type::FatalError, "general", "'ethdebug' can only be selected in 'settings.debug.debugInfo' when either an IR output or 'ethdebug' was selected as output.")); bool const binariesRequested = isBinaryRequested(_inputsAndSettings.outputSelection); diff --git a/test/cmdlineTests/standard_debug_info_ethdebug_no_ir/output.json b/test/cmdlineTests/standard_debug_info_ethdebug_no_ir/output.json deleted file mode 100644 index 54515ba25040..000000000000 --- a/test/cmdlineTests/standard_debug_info_ethdebug_no_ir/output.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "contracts": { - "C": { - "C": { - "evm": { - "bytecode": { - "functionDebugData": {}, - "generatedSources": [], - "linkReferences": {}, - "object": "", - "opcodes":"", - "sourceMap":"" - } - } - } - } - }, - "errors": [ - { - "component": "general", - "formattedMessage": "'ethdebug' can only be selected in 'settings.debug.debugInfo' when at least one of the IR outputs is selected or 'viaIR' was set.", - "message": "'ethdebug' can only be selected in 'settings.debug.debugInfo' when at least one of the IR outputs is selected or 'viaIR' was set.", - "severity": "error", - "type": "FatalError" - } - ], - "sources": { - "C": { - "id": 0 - } - } -} diff --git a/test/cmdlineTests/standard_debug_info_ethdebug_no_ir/args b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ethdebug/args similarity index 100% rename from test/cmdlineTests/standard_debug_info_ethdebug_no_ir/args rename to test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ethdebug/args diff --git a/test/cmdlineTests/standard_debug_info_ethdebug_no_ir/in.sol b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ethdebug/in.sol similarity index 100% rename from test/cmdlineTests/standard_debug_info_ethdebug_no_ir/in.sol rename to test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ethdebug/in.sol diff --git a/test/cmdlineTests/standard_debug_info_ethdebug_no_ir/input.json b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ethdebug/input.json similarity index 52% rename from test/cmdlineTests/standard_debug_info_ethdebug_no_ir/input.json rename to test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ethdebug/input.json index 9fdf2232ac08..6dd268b64f03 100644 --- a/test/cmdlineTests/standard_debug_info_ethdebug_no_ir/input.json +++ b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ethdebug/input.json @@ -1,12 +1,12 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_debug_info_ethdebug_no_ir/in.sol"]} + "C": {"urls": ["standard_debug_info_in_yul_ethdebug_output_ethdebug/in.sol"]} }, "settings": { "debug": {"debugInfo": ["ethdebug"]}, "outputSelection": { - "*": {"*": ["evm.bytecode"]} + "*": {"*": ["ethdebug", "metadata"]} } } } diff --git a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ethdebug/output.json b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ethdebug/output.json new file mode 100644 index 000000000000..bbc41636b620 --- /dev/null +++ b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ethdebug/output.json @@ -0,0 +1,14 @@ +{ + "contracts": { + "C": { + "C": { + "metadata": "{\"compiler\":{\"version\":\"\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"f\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"C\":\"C\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"C\":{\"keccak256\":\"0xd664727da2d62b6156845f13be0ecb2d8d8223c0f736d39575a3bdfbb062c320\",\"license\":\"GPL-2.0\",\"urls\":[\"bzz-raw://470d51a492c4368fac9c29ebb491b0eaa1bc8a660445a014276dc686531742b8\",\"dweb:/ipfs/QmVVnjC3Z35AXGo3GUNPMuKBD2MdFcZxhVg1qHi4fmHzKo\"]}},\"version\":1}" + } + } + }, + "sources": { + "C": { + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug/args b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir/args similarity index 100% rename from test/cmdlineTests/standard_debug_info_in_yul_ethdebug/args rename to test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir/args diff --git a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug/in.sol b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir/in.sol similarity index 100% rename from test/cmdlineTests/standard_debug_info_in_yul_ethdebug/in.sol rename to test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir/in.sol diff --git a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug/input.json b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir/input.json similarity index 71% rename from test/cmdlineTests/standard_debug_info_in_yul_ethdebug/input.json rename to test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir/input.json index eca9b2d92f66..ac799fa7c1c6 100644 --- a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug/input.json +++ b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_debug_info_in_yul_ethdebug/in.sol"]} + "C": {"urls": ["standard_debug_info_in_yul_ethdebug_output_ir/in.sol"]} }, "settings": { "debug": {"debugInfo": ["ethdebug"]}, diff --git a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug/output.json b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir/output.json similarity index 100% rename from test/cmdlineTests/standard_debug_info_in_yul_ethdebug/output.json rename to test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir/output.json diff --git a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_optimized/args b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir_optimized/args similarity index 100% rename from test/cmdlineTests/standard_debug_info_in_yul_ethdebug_optimized/args rename to test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir_optimized/args diff --git a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_optimized/in.sol b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir_optimized/in.sol similarity index 100% rename from test/cmdlineTests/standard_debug_info_in_yul_ethdebug_optimized/in.sol rename to test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir_optimized/in.sol diff --git a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_optimized/input.json b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir_optimized/input.json similarity index 70% rename from test/cmdlineTests/standard_debug_info_in_yul_ethdebug_optimized/input.json rename to test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir_optimized/input.json index 410c03bd1a7e..adb46f1840ca 100644 --- a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_optimized/input.json +++ b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir_optimized/input.json @@ -1,7 +1,7 @@ { "language": "Solidity", "sources": { - "C": {"urls": ["standard_debug_info_in_yul_ethdebug_optimized/in.sol"]} + "C": {"urls": ["standard_debug_info_in_yul_ethdebug_output_ir_optimized/in.sol"]} }, "settings": { "debug": {"debugInfo": ["ethdebug"]}, diff --git a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_optimized/output.json b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir_optimized/output.json similarity index 100% rename from test/cmdlineTests/standard_debug_info_in_yul_ethdebug_optimized/output.json rename to test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_ir_optimized/output.json diff --git a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_no_ir/args b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_no_ir/args new file mode 100644 index 000000000000..18532c5a6d3f --- /dev/null +++ b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_no_ir/args @@ -0,0 +1 @@ +--allow-paths . diff --git a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_no_ir/in.sol b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_no_ir/in.sol new file mode 100644 index 000000000000..415509ef9aef --- /dev/null +++ b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_no_ir/in.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity >=0.0; + +contract C { + function f() public {} +} diff --git a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_no_ir/input.json b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_no_ir/input.json new file mode 100644 index 000000000000..4b0e2b2ca1f3 --- /dev/null +++ b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_no_ir/input.json @@ -0,0 +1,9 @@ +{ + "language": "Solidity", + "sources": { + "C": {"urls": ["standard_debug_info_in_yul_ethdebug_output_no_ir/in.sol"]} + }, + "settings": { + "debug": {"debugInfo": ["ethdebug"]} + } +} diff --git a/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_no_ir/output.json b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_no_ir/output.json new file mode 100644 index 000000000000..79a3cbf6ce67 --- /dev/null +++ b/test/cmdlineTests/standard_debug_info_in_yul_ethdebug_output_no_ir/output.json @@ -0,0 +1,16 @@ +{ + "errors": [ + { + "component": "general", + "formattedMessage": "'ethdebug' can only be selected in 'settings.debug.debugInfo' when either an IR output or 'ethdebug' was selected as output.", + "message": "'ethdebug' can only be selected in 'settings.debug.debugInfo' when either an IR output or 'ethdebug' was selected as output.", + "severity": "error", + "type": "FatalError" + } + ], + "sources": { + "C": { + "id": 0 + } + } +} diff --git a/test/cmdlineTests/standard_ethdebug_output_enables_via_ir/args b/test/cmdlineTests/standard_ethdebug_output_enables_via_ir/args new file mode 100644 index 000000000000..18532c5a6d3f --- /dev/null +++ b/test/cmdlineTests/standard_ethdebug_output_enables_via_ir/args @@ -0,0 +1 @@ +--allow-paths . diff --git a/test/cmdlineTests/standard_ethdebug_output_enables_via_ir/in.sol b/test/cmdlineTests/standard_ethdebug_output_enables_via_ir/in.sol new file mode 100644 index 000000000000..415509ef9aef --- /dev/null +++ b/test/cmdlineTests/standard_ethdebug_output_enables_via_ir/in.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-2.0 +pragma solidity >=0.0; + +contract C { + function f() public {} +} diff --git a/test/cmdlineTests/standard_ethdebug_output_enables_via_ir/input.json b/test/cmdlineTests/standard_ethdebug_output_enables_via_ir/input.json new file mode 100644 index 000000000000..61f1e14416e9 --- /dev/null +++ b/test/cmdlineTests/standard_ethdebug_output_enables_via_ir/input.json @@ -0,0 +1,11 @@ +{ + "language": "Solidity", + "sources": { + "C": {"urls": ["standard_ethdebug_output_enables_via_ir/in.sol"]} + }, + "settings": { + "outputSelection": { + "*": {"*": ["ethdebug", "metadata"]} + } + } +} diff --git a/test/cmdlineTests/standard_ethdebug_output_enables_via_ir/output.json b/test/cmdlineTests/standard_ethdebug_output_enables_via_ir/output.json new file mode 100644 index 000000000000..bbc41636b620 --- /dev/null +++ b/test/cmdlineTests/standard_ethdebug_output_enables_via_ir/output.json @@ -0,0 +1,14 @@ +{ + "contracts": { + "C": { + "C": { + "metadata": "{\"compiler\":{\"version\":\"\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"f\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"C\":\"C\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[],\"viaIR\":true},\"sources\":{\"C\":{\"keccak256\":\"0xd664727da2d62b6156845f13be0ecb2d8d8223c0f736d39575a3bdfbb062c320\",\"license\":\"GPL-2.0\",\"urls\":[\"bzz-raw://470d51a492c4368fac9c29ebb491b0eaa1bc8a660445a014276dc686531742b8\",\"dweb:/ipfs/QmVVnjC3Z35AXGo3GUNPMuKBD2MdFcZxhVg1qHi4fmHzKo\"]}},\"version\":1}" + } + } + }, + "sources": { + "C": { + "id": 0 + } + } +}