Merge pull request #14514 from junaire/solc-namespace-std

Purge using namespace std from solc
This commit is contained in:
Nikola Matić 2023-08-23 10:57:05 +02:00 committed by GitHub
commit 589adee306
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 303 additions and 305 deletions

View File

@ -34,6 +34,7 @@ NAMESPACE_STD_FREE_FILES=(
libsolidity/lsp/*
libsolidity/parsing/*
libsolutil/*
solc/*
)
(

View File

@ -81,8 +81,7 @@
#define STDERR_FILENO 2
#endif
using namespace std;
using namespace std::string_literals;
using namespace solidity;
using namespace solidity::util;
using namespace solidity::langutil;
@ -90,7 +89,7 @@ using namespace solidity::langutil;
namespace
{
set<frontend::InputMode> const CompilerInputModes{
std::set<frontend::InputMode> const CompilerInputModes{
frontend::InputMode::Compiler,
frontend::InputMode::CompilerWithASTImport,
};
@ -100,14 +99,14 @@ set<frontend::InputMode> const CompilerInputModes{
namespace solidity::frontend
{
ostream& CommandLineInterface::sout(bool _markAsUsed)
std::ostream& CommandLineInterface::sout(bool _markAsUsed)
{
if (_markAsUsed)
m_hasOutput = true;
return m_sout;
}
ostream& CommandLineInterface::serr(bool _markAsUsed)
std::ostream& CommandLineInterface::serr(bool _markAsUsed)
{
if (_markAsUsed)
m_hasOutput = true;
@ -118,27 +117,27 @@ ostream& CommandLineInterface::serr(bool _markAsUsed)
#define cout
#define cerr
static string const g_stdinFileName = "<stdin>";
static string const g_strAbi = "abi";
static string const g_strAsm = "asm";
static string const g_strAst = "ast";
static string const g_strBinary = "bin";
static string const g_strBinaryRuntime = "bin-runtime";
static string const g_strContracts = "contracts";
static string const g_strFunDebug = "function-debug";
static string const g_strFunDebugRuntime = "function-debug-runtime";
static string const g_strGeneratedSources = "generated-sources";
static string const g_strGeneratedSourcesRuntime = "generated-sources-runtime";
static string const g_strNatspecDev = "devdoc";
static string const g_strNatspecUser = "userdoc";
static string const g_strOpcodes = "opcodes";
static string const g_strSignatureHashes = "hashes";
static string const g_strSourceList = "sourceList";
static string const g_strSources = "sources";
static string const g_strSrcMap = "srcmap";
static string const g_strSrcMapRuntime = "srcmap-runtime";
static string const g_strStorageLayout = "storage-layout";
static string const g_strVersion = "version";
static std::string const g_stdinFileName = "<stdin>";
static std::string const g_strAbi = "abi";
static std::string const g_strAsm = "asm";
static std::string const g_strAst = "ast";
static std::string const g_strBinary = "bin";
static std::string const g_strBinaryRuntime = "bin-runtime";
static std::string const g_strContracts = "contracts";
static std::string const g_strFunDebug = "function-debug";
static std::string const g_strFunDebugRuntime = "function-debug-runtime";
static std::string const g_strGeneratedSources = "generated-sources";
static std::string const g_strGeneratedSourcesRuntime = "generated-sources-runtime";
static std::string const g_strNatspecDev = "devdoc";
static std::string const g_strNatspecUser = "userdoc";
static std::string const g_strOpcodes = "opcodes";
static std::string const g_strSignatureHashes = "hashes";
static std::string const g_strSourceList = "sourceList";
static std::string const g_strSources = "sources";
static std::string const g_strSrcMap = "srcmap";
static std::string const g_strSrcMapRuntime = "srcmap-runtime";
static std::string const g_strStorageLayout = "storage-layout";
static std::string const g_strVersion = "version";
static bool needsHumanTargetedStdout(CommandLineOptions const& _options)
{
@ -167,7 +166,7 @@ static bool coloredOutput(CommandLineOptions const& _options)
(_options.formatting.coloredOutput.has_value() && _options.formatting.coloredOutput.value());
}
void CommandLineInterface::handleBinary(string const& _contract)
void CommandLineInterface::handleBinary(std::string const& _contract)
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
@ -177,8 +176,8 @@ void CommandLineInterface::handleBinary(string const& _contract)
createFile(m_compiler->filesystemFriendlyName(_contract) + ".bin", objectWithLinkRefsHex(m_compiler->object(_contract)));
else
{
sout() << "Binary:" << endl;
sout() << objectWithLinkRefsHex(m_compiler->object(_contract)) << endl;
sout() << "Binary:" << std::endl;
sout() << objectWithLinkRefsHex(m_compiler->object(_contract)) << std::endl;
}
}
if (m_options.compiler.outputs.binaryRuntime)
@ -187,13 +186,13 @@ void CommandLineInterface::handleBinary(string const& _contract)
createFile(m_compiler->filesystemFriendlyName(_contract) + ".bin-runtime", objectWithLinkRefsHex(m_compiler->runtimeObject(_contract)));
else
{
sout() << "Binary of the runtime part:" << endl;
sout() << objectWithLinkRefsHex(m_compiler->runtimeObject(_contract)) << endl;
sout() << "Binary of the runtime part:" << std::endl;
sout() << objectWithLinkRefsHex(m_compiler->runtimeObject(_contract)) << std::endl;
}
}
}
void CommandLineInterface::handleOpcode(string const& _contract)
void CommandLineInterface::handleOpcode(std::string const& _contract)
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
@ -201,13 +200,13 @@ void CommandLineInterface::handleOpcode(string const& _contract)
createFile(m_compiler->filesystemFriendlyName(_contract) + ".opcode", evmasm::disassemble(m_compiler->object(_contract).bytecode, m_options.output.evmVersion));
else
{
sout() << "Opcodes:" << endl;
sout() << uppercase << evmasm::disassemble(m_compiler->object(_contract).bytecode, m_options.output.evmVersion);
sout() << endl;
sout() << "Opcodes:" << std::endl;
sout() << std::uppercase << evmasm::disassemble(m_compiler->object(_contract).bytecode, m_options.output.evmVersion);
sout() << std::endl;
}
}
void CommandLineInterface::handleIR(string const& _contractName)
void CommandLineInterface::handleIR(std::string const& _contractName)
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
@ -218,12 +217,12 @@ void CommandLineInterface::handleIR(string const& _contractName)
createFile(m_compiler->filesystemFriendlyName(_contractName) + ".yul", m_compiler->yulIR(_contractName));
else
{
sout() << "IR:" << endl;
sout() << m_compiler->yulIR(_contractName) << endl;
sout() << "IR:" << std::endl;
sout() << m_compiler->yulIR(_contractName) << std::endl;
}
}
void CommandLineInterface::handleIRAst(string const& _contractName)
void CommandLineInterface::handleIRAst(std::string const& _contractName)
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
@ -240,15 +239,15 @@ void CommandLineInterface::handleIRAst(string const& _contractName)
);
else
{
sout() << "IR AST:" << endl;
sout() << "IR AST:" << std::endl;
sout() << util::jsonPrint(
m_compiler->yulIRAst(_contractName),
m_options.formatting.json
) << endl;
) << std::endl;
}
}
void CommandLineInterface::handleIROptimized(string const& _contractName)
void CommandLineInterface::handleIROptimized(std::string const& _contractName)
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
@ -262,12 +261,12 @@ void CommandLineInterface::handleIROptimized(string const& _contractName)
);
else
{
sout() << "Optimized IR:" << endl;
sout() << m_compiler->yulIROptimized(_contractName) << endl;
sout() << "Optimized IR:" << std::endl;
sout() << m_compiler->yulIROptimized(_contractName) << std::endl;
}
}
void CommandLineInterface::handleIROptimizedAst(string const& _contractName)
void CommandLineInterface::handleIROptimizedAst(std::string const& _contractName)
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
@ -284,15 +283,15 @@ void CommandLineInterface::handleIROptimizedAst(string const& _contractName)
);
else
{
sout() << "Optimized IR AST:" << endl;
sout() << "Optimized IR AST:" << std::endl;
sout() << util::jsonPrint(
m_compiler->yulIROptimizedAst(_contractName),
m_options.formatting.json
) << endl;
) << std::endl;
}
}
void CommandLineInterface::handleBytecode(string const& _contract)
void CommandLineInterface::handleBytecode(std::string const& _contract)
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
@ -302,7 +301,7 @@ void CommandLineInterface::handleBytecode(string const& _contract)
handleBinary(_contract);
}
void CommandLineInterface::handleSignatureHashes(string const& _contract)
void CommandLineInterface::handleSignatureHashes(std::string const& _contract)
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
@ -310,7 +309,7 @@ void CommandLineInterface::handleSignatureHashes(string const& _contract)
return;
Json::Value interfaceSymbols = m_compiler->interfaceSymbols(_contract);
string out = "Function signatures:\n";
std::string out = "Function signatures:\n";
for (auto const& name: interfaceSymbols["methods"].getMemberNames())
out += interfaceSymbols["methods"][name].asString() + ": " + name + "\n";
@ -334,55 +333,55 @@ void CommandLineInterface::handleSignatureHashes(string const& _contract)
sout() << out;
}
void CommandLineInterface::handleMetadata(string const& _contract)
void CommandLineInterface::handleMetadata(std::string const& _contract)
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
if (!m_options.compiler.outputs.metadata)
return;
string data = m_compiler->metadata(_contract);
std::string data = m_compiler->metadata(_contract);
if (!m_options.output.dir.empty())
createFile(m_compiler->filesystemFriendlyName(_contract) + "_meta.json", data);
else
sout() << "Metadata:" << endl << data << endl;
sout() << "Metadata:" << std::endl << data << std::endl;
}
void CommandLineInterface::handleABI(string const& _contract)
void CommandLineInterface::handleABI(std::string const& _contract)
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
if (!m_options.compiler.outputs.abi)
return;
string data = jsonPrint(removeNullMembers(m_compiler->contractABI(_contract)), m_options.formatting.json);
std::string data = jsonPrint(removeNullMembers(m_compiler->contractABI(_contract)), m_options.formatting.json);
if (!m_options.output.dir.empty())
createFile(m_compiler->filesystemFriendlyName(_contract) + ".abi", data);
else
sout() << "Contract JSON ABI" << endl << data << endl;
sout() << "Contract JSON ABI" << std::endl << data << std::endl;
}
void CommandLineInterface::handleStorageLayout(string const& _contract)
void CommandLineInterface::handleStorageLayout(std::string const& _contract)
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
if (!m_options.compiler.outputs.storageLayout)
return;
string data = jsonPrint(removeNullMembers(m_compiler->storageLayout(_contract)), m_options.formatting.json);
std::string data = jsonPrint(removeNullMembers(m_compiler->storageLayout(_contract)), m_options.formatting.json);
if (!m_options.output.dir.empty())
createFile(m_compiler->filesystemFriendlyName(_contract) + "_storage.json", data);
else
sout() << "Contract Storage Layout:" << endl << data << endl;
sout() << "Contract Storage Layout:" << std::endl << data << std::endl;
}
void CommandLineInterface::handleNatspec(bool _natspecDev, string const& _contract)
void CommandLineInterface::handleNatspec(bool _natspecDev, std::string const& _contract)
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
bool enabled = false;
string suffix;
string title;
std::string suffix;
std::string title;
if (_natspecDev)
{
@ -399,7 +398,7 @@ void CommandLineInterface::handleNatspec(bool _natspecDev, string const& _contra
if (enabled)
{
string output = jsonPrint(
std::string output = jsonPrint(
removeNullMembers(
_natspecDev ?
m_compiler->natspecDev(_contract) :
@ -412,51 +411,51 @@ void CommandLineInterface::handleNatspec(bool _natspecDev, string const& _contra
createFile(m_compiler->filesystemFriendlyName(_contract) + suffix, output);
else
{
sout() << title << endl;
sout() << output << endl;
sout() << title << std::endl;
sout() << output << std::endl;
}
}
}
void CommandLineInterface::handleGasEstimation(string const& _contract)
void CommandLineInterface::handleGasEstimation(std::string const& _contract)
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
Json::Value estimates = m_compiler->gasEstimates(_contract);
sout() << "Gas estimation:" << endl;
sout() << "Gas estimation:" << std::endl;
if (estimates["creation"].isObject())
{
Json::Value creation = estimates["creation"];
sout() << "construction:" << endl;
sout() << "construction:" << std::endl;
sout() << " " << creation["executionCost"].asString();
sout() << " + " << creation["codeDepositCost"].asString();
sout() << " = " << creation["totalCost"].asString() << endl;
sout() << " = " << creation["totalCost"].asString() << std::endl;
}
if (estimates["external"].isObject())
{
Json::Value externalFunctions = estimates["external"];
sout() << "external:" << endl;
sout() << "external:" << std::endl;
for (auto const& name: externalFunctions.getMemberNames())
{
if (name.empty())
sout() << " fallback:\t";
else
sout() << " " << name << ":\t";
sout() << externalFunctions[name].asString() << endl;
sout() << externalFunctions[name].asString() << std::endl;
}
}
if (estimates["internal"].isObject())
{
Json::Value internalFunctions = estimates["internal"];
sout() << "internal:" << endl;
sout() << "internal:" << std::endl;
for (auto const& name: internalFunctions.getMemberNames())
{
sout() << " " << name << ":\t";
sout() << internalFunctions[name].asString() << endl;
sout() << internalFunctions[name].asString() << std::endl;
}
}
}
@ -465,7 +464,7 @@ void CommandLineInterface::readInputFiles()
{
solAssert(!m_standardJsonInput.has_value());
static set<frontend::InputMode> const noInputFiles{
static std::set<frontend::InputMode> const noInputFiles{
frontend::InputMode::Help,
frontend::InputMode::License,
frontend::InputMode::Version
@ -491,13 +490,13 @@ void CommandLineInterface::readInputFiles()
for (boost::filesystem::path const& allowedDirectory: m_options.input.allowedDirectories)
m_fileReader.allowDirectory(allowedDirectory);
map<string, set<boost::filesystem::path>> collisions =
std::map<std::string, std::set<boost::filesystem::path>> collisions =
m_fileReader.detectSourceUnitNameCollisions(m_options.input.paths);
if (!collisions.empty())
{
auto pathToQuotedString = [](boost::filesystem::path const& _path){ return "\"" + _path.string() + "\""; };
string message =
std::string message =
"Source unit name collision detected. "
"The specified values of base path and/or include paths would result in multiple "
"input files being assigned the same source unit name:\n";
@ -518,7 +517,7 @@ void CommandLineInterface::readInputFiles()
if (!m_options.input.ignoreMissingFiles)
solThrow(CommandLineValidationError, '"' + infile.string() + "\" is not found.");
else
serr() << infile << " is not found. Skipping." << endl;
serr() << infile << " is not found. Skipping." << std::endl;
continue;
}
@ -528,13 +527,13 @@ void CommandLineInterface::readInputFiles()
if (!m_options.input.ignoreMissingFiles)
solThrow(CommandLineValidationError, '"' + infile.string() + "\" is not a valid file.");
else
serr() << infile << " is not a valid file. Skipping." << endl;
serr() << infile << " is not a valid file. Skipping." << std::endl;
continue;
}
// NOTE: we ignore the FileNotFound exception as we manually check above
string fileContent = readFileAsString(infile);
std::string fileContent = readFileAsString(infile);
if (m_options.input.mode == InputMode::StandardJson)
{
solAssert(!m_standardJsonInput.has_value());
@ -566,12 +565,12 @@ void CommandLineInterface::readInputFiles()
solThrow(CommandLineValidationError, "All specified input files either do not exist or are not regular files.");
}
map<string, Json::Value> CommandLineInterface::parseAstFromInput()
std::map<std::string, Json::Value> CommandLineInterface::parseAstFromInput()
{
solAssert(m_options.input.mode == InputMode::CompilerWithASTImport);
map<string, Json::Value> sourceJsons;
map<string, string> tmpSources;
std::map<std::string, Json::Value> sourceJsons;
std::map<std::string, std::string> tmpSources;
for (SourceCode const& sourceCode: m_fileReader.sourceUnits() | ranges::views::values)
{
@ -581,7 +580,7 @@ map<string, Json::Value> CommandLineInterface::parseAstFromInput()
for (auto& src: ast["sources"].getMemberNames())
{
string astKey = ast["sources"][src].isMember("ast") ? "ast" : "AST";
std::string astKey = ast["sources"][src].isMember("ast") ? "ast" : "AST";
astAssert(ast["sources"][src].isMember(astKey), "astkey is not member");
astAssert(ast["sources"][src][astKey]["nodeType"].asString() == "SourceUnit", "Top-level node should be a 'SourceUnit'");
@ -596,7 +595,7 @@ map<string, Json::Value> CommandLineInterface::parseAstFromInput()
return sourceJsons;
}
void CommandLineInterface::createFile(string const& _fileName, string const& _data)
void CommandLineInterface::createFile(std::string const& _fileName, std::string const& _data)
{
namespace fs = boost::filesystem;
@ -607,19 +606,19 @@ void CommandLineInterface::createFile(string const& _fileName, string const& _da
// The simplest workaround is to use an absolute path.
fs::create_directories(fs::absolute(m_options.output.dir));
string pathName = (m_options.output.dir / _fileName).string();
std::string pathName = (m_options.output.dir / _fileName).string();
if (fs::exists(pathName) && !m_options.output.overwriteFiles)
solThrow(CommandLineOutputError, "Refusing to overwrite existing file \"" + pathName + "\" (use --overwrite to force).");
ofstream outFile(pathName);
std::ofstream outFile(pathName);
outFile << _data;
if (!outFile)
solThrow(CommandLineOutputError, "Could not write to file \"" + pathName + "\".");
}
void CommandLineInterface::createJson(string const& _fileName, string const& _json)
void CommandLineInterface::createJson(std::string const& _fileName, std::string const& _json)
{
createFile(boost::filesystem::path(_fileName).stem().string() + string(".json"), _json);
createFile(boost::filesystem::path(_fileName).stem().string() + std::string(".json"), _json);
}
bool CommandLineInterface::run(int _argc, char const* const* _argv)
@ -640,7 +639,7 @@ bool CommandLineInterface::run(int _argc, char const* const* _argv)
// There might be no message in the exception itself if the error output is bulky and has
// already been printed to stderr (this happens e.g. for compiler errors).
if (_exception.what() != ""s)
serr() << _exception.what() << endl;
serr() << _exception.what() << std::endl;
return false;
}
@ -683,7 +682,7 @@ void CommandLineInterface::processInput()
solAssert(m_standardJsonInput.has_value());
StandardCompiler compiler(m_universalCallback.callback(), m_options.formatting.json);
sout() << compiler.compile(std::move(m_standardJsonInput.value())) << endl;
sout() << compiler.compile(std::move(m_standardJsonInput.value())) << std::endl;
m_standardJsonInput.reset();
break;
}
@ -707,22 +706,22 @@ void CommandLineInterface::processInput()
void CommandLineInterface::printVersion()
{
sout() << "solc, the solidity compiler commandline interface" << endl;
sout() << "Version: " << solidity::frontend::VersionString << endl;
sout() << "solc, the solidity compiler commandline interface" << std::endl;
sout() << "Version: " << solidity::frontend::VersionString << std::endl;
}
void CommandLineInterface::printLicense()
{
sout() << otherLicenses << endl;
sout() << otherLicenses << std::endl;
// This is a static variable generated by cmake from LICENSE.txt
sout() << licenseText << endl;
sout() << licenseText << std::endl;
}
void CommandLineInterface::compile()
{
solAssert(CompilerInputModes.count(m_options.input.mode) == 1);
m_compiler = make_unique<CompilerStack>(m_universalCallback.callback());
m_compiler = std::make_unique<CompilerStack>(m_universalCallback.callback());
SourceReferenceFormatter formatter(serr(false), *m_compiler, coloredOutput(m_options), m_options.formatting.withErrorIds);
@ -840,7 +839,7 @@ void CommandLineInterface::handleCombinedJSON()
Json::Value output(Json::objectValue);
output[g_strVersion] = frontend::VersionString;
vector<string> contracts = m_compiler->contractNames();
std::vector<std::string> contracts = m_compiler->contractNames();
// NOTE: The state checks here are more strict that in Standard JSON. There we allow
// requesting certain outputs even if compilation fails as long as analysis went ok.
@ -848,7 +847,7 @@ void CommandLineInterface::handleCombinedJSON()
if (!contracts.empty())
output[g_strContracts] = Json::Value(Json::objectValue);
for (string const& contractName: contracts)
for (std::string const& contractName: contracts)
{
Json::Value& contractData = output[g_strContracts][contractName] = Json::objectValue;
if (m_options.compiler.combinedJsonRequests->abi && compilationSuccess)
@ -922,11 +921,11 @@ void CommandLineInterface::handleCombinedJSON()
}
}
string json = jsonPrint(removeNullMembers(std::move(output)), m_options.formatting.json);
std::string json = jsonPrint(removeNullMembers(std::move(output)), m_options.formatting.json);
if (!m_options.output.dir.empty())
createJson("combined", json);
else
sout() << json << endl;
sout() << json << std::endl;
}
void CommandLineInterface::handleAst()
@ -936,7 +935,7 @@ void CommandLineInterface::handleAst()
if (!m_options.compiler.outputs.astCompactJson)
return;
vector<ASTNode const*> asts;
std::vector<ASTNode const*> asts;
for (auto const& sourceCode: m_fileReader.sourceUnits())
asts.push_back(&m_compiler->ast(sourceCode.first));
@ -944,8 +943,8 @@ void CommandLineInterface::handleAst()
{
for (auto const& sourceCode: m_fileReader.sourceUnits())
{
stringstream data;
string postfix = "";
std::stringstream data;
std::string postfix = "";
ASTJsonExporter(m_compiler->state(), m_compiler->sourceIndices()).print(data, m_compiler->ast(sourceCode.first), m_options.formatting.json);
postfix += "_json";
boost::filesystem::path path(sourceCode.first);
@ -954,10 +953,10 @@ void CommandLineInterface::handleAst()
}
else
{
sout() << "JSON AST (compact format):" << endl << endl;
sout() << "JSON AST (compact format):" << std::endl << std::endl;
for (auto const& sourceCode: m_fileReader.sourceUnits())
{
sout() << endl << "======= " << sourceCode.first << " =======" << endl;
sout() << std::endl << "======= " << sourceCode.first << " =======" << std::endl;
ASTJsonExporter(m_compiler->state(), m_compiler->sourceIndices()).print(sout(), m_compiler->ast(sourceCode.first), m_options.formatting.json);
}
}
@ -975,11 +974,11 @@ void CommandLineInterface::link()
solAssert(m_options.input.mode == InputMode::Linker);
// Map from how the libraries will be named inside the bytecode to their addresses.
map<string, h160> librariesReplacements;
std::map<std::string, h160> librariesReplacements;
int const placeholderSize = 40; // 20 bytes or 40 hex characters
for (auto const& library: m_options.linker.libraries)
{
string const& name = library.first;
std::string const& name = library.first;
// Library placeholders are 40 hex digits (20 bytes) that start and end with '__'.
// This leaves 36 characters for the library identifier. The identifier used to
// be just the cropped or '_'-padded library name, but this changed to
@ -987,7 +986,7 @@ void CommandLineInterface::link()
// We support both ways of linking here.
librariesReplacements["__" + evmasm::LinkerObject::libraryPlaceholder(name) + "__"] = library.second;
string replacement = "__";
std::string replacement = "__";
for (size_t i = 0; i < placeholderSize - 4; ++i)
replacement.push_back(i < name.size() ? name[i] : '_');
replacement += "__";
@ -1010,18 +1009,18 @@ void CommandLineInterface::link()
)
solThrow(
CommandLineExecutionError,
"Error in binary object file " + src.first + " at position " + to_string(it - src.second.begin()) + "\n" +
'"' + string(it, it + min(placeholderSize, static_cast<int>(end - it))) + "\" is not a valid link reference."
"Error in binary object file " + src.first + " at position " + std::to_string(it - src.second.begin()) + "\n" +
'"' + std::string(it, it + std::min(placeholderSize, static_cast<int>(end - it))) + "\" is not a valid link reference."
);
string foundPlaceholder(it, it + placeholderSize);
std::string foundPlaceholder(it, it + placeholderSize);
if (librariesReplacements.count(foundPlaceholder))
{
string hexStr(util::toHex(librariesReplacements.at(foundPlaceholder).asBytes()));
std::string hexStr(util::toHex(librariesReplacements.at(foundPlaceholder).asBytes()));
copy(hexStr.begin(), hexStr.end(), it);
}
else
serr() << "Reference \"" << foundPlaceholder << "\" in file \"" << src.first << "\" still unresolved." << endl;
serr() << "Reference \"" << foundPlaceholder << "\" in file \"" << src.first << "\" still unresolved." << std::endl;
it += placeholderSize;
}
// Remove hints for resolved libraries.
@ -1039,25 +1038,25 @@ void CommandLineInterface::writeLinkedFiles()
for (auto const& src: m_fileReader.sourceUnits())
if (src.first == g_stdinFileName)
sout() << src.second << endl;
sout() << src.second << std::endl;
else
{
ofstream outFile(src.first);
std::ofstream outFile(src.first);
outFile << src.second;
if (!outFile)
solThrow(CommandLineOutputError, "Could not write to file " + src.first + ". Aborting.");
}
sout() << "Linking completed." << endl;
sout() << "Linking completed." << std::endl;
}
string CommandLineInterface::libraryPlaceholderHint(string const& _libraryName)
std::string CommandLineInterface::libraryPlaceholderHint(std::string const& _libraryName)
{
return "// " + evmasm::LinkerObject::libraryPlaceholder(_libraryName) + " -> " + _libraryName;
}
string CommandLineInterface::objectWithLinkRefsHex(evmasm::LinkerObject const& _obj)
std::string CommandLineInterface::objectWithLinkRefsHex(evmasm::LinkerObject const& _obj)
{
string out = _obj.toHex();
std::string out = _obj.toHex();
if (!_obj.linkReferences.empty())
{
out += "\n";
@ -1072,7 +1071,7 @@ void CommandLineInterface::assembleYul(yul::YulStack::Language _language, yul::Y
solAssert(m_options.input.mode == InputMode::Assembler);
bool successful = true;
map<string, yul::YulStack> yulStacks;
std::map<std::string, yul::YulStack> yulStacks;
for (auto const& src: m_fileReader.sourceUnits())
{
auto& stack = yulStacks[src.first] = yul::YulStack(
@ -1114,8 +1113,8 @@ void CommandLineInterface::assembleYul(yul::YulStack::Language _language, yul::Y
for (auto const& src: m_fileReader.sourceUnits())
{
solAssert(_targetMachine == yul::YulStack::Machine::EVM);
string machine = "EVM";
sout() << endl << "======= " << src.first << " (" << machine << ") =======" << endl;
std::string machine = "EVM";
sout() << std::endl << "======= " << src.first << " (" << machine << ") =======" << std::endl;
yul::YulStack& stack = yulStacks[src.first];
@ -1123,8 +1122,8 @@ void CommandLineInterface::assembleYul(yul::YulStack::Language _language, yul::Y
{
// NOTE: This actually outputs unoptimized code when the optimizer is disabled but
// 'ir' output in StandardCompiler works the same way.
sout() << endl << "Pretty printed source:" << endl;
sout() << stack.print() << endl;
sout() << std::endl << "Pretty printed source:" << std::endl;
sout() << stack.print() << std::endl;
}
yul::MachineAssemblyObject object;
@ -1133,25 +1132,25 @@ void CommandLineInterface::assembleYul(yul::YulStack::Language _language, yul::Y
if (m_options.compiler.outputs.binary)
{
sout() << endl << "Binary representation:" << endl;
sout() << std::endl << "Binary representation:" << std::endl;
if (object.bytecode)
sout() << object.bytecode->toHex() << endl;
sout() << object.bytecode->toHex() << std::endl;
else
serr() << "No binary representation found." << endl;
serr() << "No binary representation found." << std::endl;
}
if (m_options.compiler.outputs.astCompactJson)
{
sout() << "AST:" << endl << endl;
sout() << util::jsonPrint(stack.astJson(), m_options.formatting.json) << endl;
sout() << "AST:" << std::endl << std::endl;
sout() << util::jsonPrint(stack.astJson(), m_options.formatting.json) << std::endl;
}
solAssert(_targetMachine == yul::YulStack::Machine::EVM, "");
if (m_options.compiler.outputs.asm_)
{
sout() << endl << "Text representation:" << endl;
sout() << std::endl << "Text representation:" << std::endl;
if (!object.assembly.empty())
sout() << object.assembly << endl;
sout() << object.assembly << std::endl;
else
serr() << "No text representation found." << endl;
serr() << "No text representation found." << std::endl;
}
}
}
@ -1173,15 +1172,15 @@ void CommandLineInterface::outputCompilationResults()
// we can safely assume that full compilation was performed and successful.
solAssert(m_options.output.stopAfter >= CompilerStack::State::CompilationSuccessful);
for (string const& contract: m_compiler->contractNames())
for (std::string const& contract: m_compiler->contractNames())
{
if (needsHumanTargetedStdout(m_options))
sout() << endl << "======= " << contract << " =======" << endl;
sout() << std::endl << "======= " << contract << " =======" << std::endl;
// do we need EVM assembly?
if (m_options.compiler.outputs.asm_ || m_options.compiler.outputs.asmJson)
{
string ret;
std::string ret;
if (m_options.compiler.outputs.asmJson)
ret = util::jsonPrint(removeNullMembers(m_compiler->assemblyJSON(contract)), m_options.formatting.json);
else
@ -1190,7 +1189,7 @@ void CommandLineInterface::outputCompilationResults()
if (!m_options.output.dir.empty())
createFile(m_compiler->filesystemFriendlyName(contract) + (m_options.compiler.outputs.asmJson ? "_evm.json" : ".evm"), ret);
else
sout() << "EVM assembly:" << endl << ret << endl;
sout() << "EVM assembly:" << std::endl << ret << std::endl;
}
if (m_options.compiler.estimateGas)
@ -1213,11 +1212,11 @@ void CommandLineInterface::outputCompilationResults()
if (!m_hasOutput)
{
if (!m_options.output.dir.empty())
sout() << "Compiler run successful. Artifact(s) can be found in directory " << m_options.output.dir << "." << endl;
sout() << "Compiler run successful. Artifact(s) can be found in directory " << m_options.output.dir << "." << std::endl;
else if (m_compiler->contractNames().empty())
sout() << "Compiler run successful. No contracts to compile." << endl;
sout() << "Compiler run successful. No contracts to compile." << std::endl;
else
sout() << "Compiler run successful. No output generated." << endl;
sout() << "Compiler run successful. No output generated." << std::endl;
}
}

View File

@ -30,7 +30,6 @@
#include <range/v3/view/filter.hpp>
#include <range/v3/range/conversion.hpp>
using namespace std;
using namespace solidity::langutil;
namespace po = boost::program_options;
@ -38,59 +37,59 @@ namespace po = boost::program_options;
namespace solidity::frontend
{
static string const g_strAllowPaths = "allow-paths";
static string const g_strBasePath = "base-path";
static string const g_strIncludePath = "include-path";
static string const g_strAssemble = "assemble";
static string const g_strCombinedJson = "combined-json";
static string const g_strEVM = "evm";
static string const g_strEVMVersion = "evm-version";
static string const g_strEOFVersion = "experimental-eof-version";
static string const g_strViaIR = "via-ir";
static string const g_strExperimentalViaIR = "experimental-via-ir";
static string const g_strGas = "gas";
static string const g_strHelp = "help";
static string const g_strImportAst = "import-ast";
static string const g_strInputFile = "input-file";
static string const g_strYul = "yul";
static string const g_strYulDialect = "yul-dialect";
static string const g_strDebugInfo = "debug-info";
static string const g_strIPFS = "ipfs";
static string const g_strLicense = "license";
static string const g_strLibraries = "libraries";
static string const g_strLink = "link";
static string const g_strLSP = "lsp";
static string const g_strMachine = "machine";
static string const g_strNoCBORMetadata = "no-cbor-metadata";
static string const g_strMetadataHash = "metadata-hash";
static string const g_strMetadataLiteral = "metadata-literal";
static string const g_strModelCheckerContracts = "model-checker-contracts";
static string const g_strModelCheckerDivModNoSlacks = "model-checker-div-mod-no-slacks";
static string const g_strModelCheckerEngine = "model-checker-engine";
static string const g_strModelCheckerExtCalls = "model-checker-ext-calls";
static string const g_strModelCheckerInvariants = "model-checker-invariants";
static string const g_strModelCheckerPrintQuery = "model-checker-print-query";
static string const g_strModelCheckerShowProvedSafe = "model-checker-show-proved-safe";
static string const g_strModelCheckerShowUnproved = "model-checker-show-unproved";
static string const g_strModelCheckerShowUnsupported = "model-checker-show-unsupported";
static string const g_strModelCheckerSolvers = "model-checker-solvers";
static string const g_strModelCheckerTargets = "model-checker-targets";
static string const g_strModelCheckerTimeout = "model-checker-timeout";
static string const g_strModelCheckerBMCLoopIterations = "model-checker-bmc-loop-iterations";
static string const g_strNone = "none";
static string const g_strNoOptimizeYul = "no-optimize-yul";
static string const g_strOptimize = "optimize";
static string const g_strOptimizeRuns = "optimize-runs";
static string const g_strOptimizeYul = "optimize-yul";
static string const g_strYulOptimizations = "yul-optimizations";
static string const g_strOutputDir = "output-dir";
static string const g_strOverwrite = "overwrite";
static string const g_strRevertStrings = "revert-strings";
static string const g_strStopAfter = "stop-after";
static string const g_strParsing = "parsing";
static std::string const g_strAllowPaths = "allow-paths";
static std::string const g_strBasePath = "base-path";
static std::string const g_strIncludePath = "include-path";
static std::string const g_strAssemble = "assemble";
static std::string const g_strCombinedJson = "combined-json";
static std::string const g_strEVM = "evm";
static std::string const g_strEVMVersion = "evm-version";
static std::string const g_strEOFVersion = "experimental-eof-version";
static std::string const g_strViaIR = "via-ir";
static std::string const g_strExperimentalViaIR = "experimental-via-ir";
static std::string const g_strGas = "gas";
static std::string const g_strHelp = "help";
static std::string const g_strImportAst = "import-ast";
static std::string const g_strInputFile = "input-file";
static std::string const g_strYul = "yul";
static std::string const g_strYulDialect = "yul-dialect";
static std::string const g_strDebugInfo = "debug-info";
static std::string const g_strIPFS = "ipfs";
static std::string const g_strLicense = "license";
static std::string const g_strLibraries = "libraries";
static std::string const g_strLink = "link";
static std::string const g_strLSP = "lsp";
static std::string const g_strMachine = "machine";
static std::string const g_strNoCBORMetadata = "no-cbor-metadata";
static std::string const g_strMetadataHash = "metadata-hash";
static std::string const g_strMetadataLiteral = "metadata-literal";
static std::string const g_strModelCheckerContracts = "model-checker-contracts";
static std::string const g_strModelCheckerDivModNoSlacks = "model-checker-div-mod-no-slacks";
static std::string const g_strModelCheckerEngine = "model-checker-engine";
static std::string const g_strModelCheckerExtCalls = "model-checker-ext-calls";
static std::string const g_strModelCheckerInvariants = "model-checker-invariants";
static std::string const g_strModelCheckerPrintQuery = "model-checker-print-query";
static std::string const g_strModelCheckerShowProvedSafe = "model-checker-show-proved-safe";
static std::string const g_strModelCheckerShowUnproved = "model-checker-show-unproved";
static std::string const g_strModelCheckerShowUnsupported = "model-checker-show-unsupported";
static std::string const g_strModelCheckerSolvers = "model-checker-solvers";
static std::string const g_strModelCheckerTargets = "model-checker-targets";
static std::string const g_strModelCheckerTimeout = "model-checker-timeout";
static std::string const g_strModelCheckerBMCLoopIterations = "model-checker-bmc-loop-iterations";
static std::string const g_strNone = "none";
static std::string const g_strNoOptimizeYul = "no-optimize-yul";
static std::string const g_strOptimize = "optimize";
static std::string const g_strOptimizeRuns = "optimize-runs";
static std::string const g_strOptimizeYul = "optimize-yul";
static std::string const g_strYulOptimizations = "yul-optimizations";
static std::string const g_strOutputDir = "output-dir";
static std::string const g_strOverwrite = "overwrite";
static std::string const g_strRevertStrings = "revert-strings";
static std::string const g_strStopAfter = "stop-after";
static std::string const g_strParsing = "parsing";
/// Possible arguments to for --revert-strings
static set<string> const g_revertStringsArgs
static std::set<std::string> const g_revertStringsArgs
{
revertStringsToString(RevertStrings::Default),
revertStringsToString(RevertStrings::Strip),
@ -98,40 +97,40 @@ static set<string> const g_revertStringsArgs
revertStringsToString(RevertStrings::VerboseDebug)
};
static string const g_strSources = "sources";
static string const g_strSourceList = "sourceList";
static string const g_strStandardJSON = "standard-json";
static string const g_strStrictAssembly = "strict-assembly";
static string const g_strSwarm = "swarm";
static string const g_strPrettyJson = "pretty-json";
static string const g_strJsonIndent = "json-indent";
static string const g_strVersion = "version";
static string const g_strIgnoreMissingFiles = "ignore-missing";
static string const g_strColor = "color";
static string const g_strNoColor = "no-color";
static string const g_strErrorIds = "error-codes";
static std::string const g_strSources = "sources";
static std::string const g_strSourceList = "sourceList";
static std::string const g_strStandardJSON = "standard-json";
static std::string const g_strStrictAssembly = "strict-assembly";
static std::string const g_strSwarm = "swarm";
static std::string const g_strPrettyJson = "pretty-json";
static std::string const g_strJsonIndent = "json-indent";
static std::string const g_strVersion = "version";
static std::string const g_strIgnoreMissingFiles = "ignore-missing";
static std::string const g_strColor = "color";
static std::string const g_strNoColor = "no-color";
static std::string const g_strErrorIds = "error-codes";
/// Possible arguments to for --machine
static set<string> const g_machineArgs
static std::set<std::string> const g_machineArgs
{
g_strEVM
};
/// Possible arguments to for --yul-dialect
static set<string> const g_yulDialectArgs
static std::set<std::string> const g_yulDialectArgs
{
g_strEVM
};
/// Possible arguments to for --metadata-hash
static set<string> const g_metadataHashArgs
static std::set<std::string> const g_metadataHashArgs
{
g_strIPFS,
g_strSwarm,
g_strNone
};
static map<InputMode, string> const g_inputModeName = {
static std::map<InputMode, std::string> const g_inputModeName = {
{InputMode::Help, "help"},
{InputMode::License, "license"},
{InputMode::Version, "version"},
@ -143,7 +142,7 @@ static map<InputMode, string> const g_inputModeName = {
{InputMode::LanguageServer, "language server (LSP)"},
};
void CommandLineParser::checkMutuallyExclusive(vector<string> const& _optionNames)
void CommandLineParser::checkMutuallyExclusive(std::vector<std::string> const& _optionNames)
{
if (countEnabledOptions(_optionNames) > 1)
{
@ -163,9 +162,9 @@ bool CompilerOutputs::operator==(CompilerOutputs const& _other) const noexcept
return true;
}
ostream& operator<<(ostream& _out, CompilerOutputs const& _selection)
std::ostream& operator<<(std::ostream& _out, CompilerOutputs const& _selection)
{
vector<string> serializedSelection;
std::vector<std::string> serializedSelection;
for (auto&& [componentName, component]: CompilerOutputs::componentMap())
if (_selection.*component)
serializedSelection.push_back(CompilerOutputs::componentName(component));
@ -173,7 +172,7 @@ ostream& operator<<(ostream& _out, CompilerOutputs const& _selection)
return _out << util::joinHumanReadable(serializedSelection, ",");
}
string const& CompilerOutputs::componentName(bool CompilerOutputs::* _component)
std::string const& CompilerOutputs::componentName(bool CompilerOutputs::* _component)
{
solAssert(_component, "");
@ -194,9 +193,9 @@ bool CombinedJsonRequests::operator==(CombinedJsonRequests const& _other) const
}
ostream& operator<<(ostream& _out, CombinedJsonRequests const& _requests)
std::ostream& operator<<(std::ostream& _out, CombinedJsonRequests const& _requests)
{
vector<string> serializedRequests;
std::vector<std::string> serializedRequests;
for (auto&& [componentName, component]: CombinedJsonRequests::componentMap())
if (_requests.*component)
serializedRequests.push_back(CombinedJsonRequests::componentName(component));
@ -204,7 +203,7 @@ ostream& operator<<(ostream& _out, CombinedJsonRequests const& _requests)
return _out << util::joinHumanReadable(serializedRequests, ",");
}
string const& CombinedJsonRequests::componentName(bool CombinedJsonRequests::* _component)
std::string const& CombinedJsonRequests::componentName(bool CombinedJsonRequests::* _component)
{
solAssert(_component, "");
@ -274,11 +273,11 @@ OptimiserSettings CommandLineOptions::optimiserSettings() const
if (optimizer.yulSteps.has_value())
{
string const fullSequence = optimizer.yulSteps.value();
std::string const fullSequence = optimizer.yulSteps.value();
auto const delimiterPos = fullSequence.find(":");
settings.yulOptimiserSteps = fullSequence.substr(0, delimiterPos);
if (delimiterPos != string::npos)
if (delimiterPos != std::string::npos)
settings.yulOptimiserCleanupSteps = fullSequence.substr(delimiterPos + 1);
else
solAssert(settings.yulOptimiserCleanupSteps == OptimiserSettings::DefaultYulOptimiserCleanupSteps);
@ -298,11 +297,11 @@ void CommandLineParser::parseInputPathsAndRemappings()
m_options.input.ignoreMissingFiles = (m_args.count(g_strIgnoreMissingFiles) > 0);
if (m_args.count(g_strInputFile))
for (string const& positionalArg: m_args[g_strInputFile].as<vector<string>>())
for (std::string const& positionalArg: m_args[g_strInputFile].as<std::vector<std::string>>())
{
if (ImportRemapper::isRemapping(positionalArg))
{
optional<ImportRemapper::Remapping> remapping = ImportRemapper::parseRemapping(positionalArg);
std::optional<ImportRemapper::Remapping> remapping = ImportRemapper::parseRemapping(positionalArg);
if (!remapping.has_value())
solThrow(CommandLineValidationError, "Invalid remapping: \"" + positionalArg + "\".");
@ -353,10 +352,10 @@ void CommandLineParser::parseInputPathsAndRemappings()
);
}
void CommandLineParser::parseLibraryOption(string const& _input)
void CommandLineParser::parseLibraryOption(std::string const& _input)
{
namespace fs = boost::filesystem;
string data = _input;
std::string data = _input;
try
{
if (fs::is_regular_file(_input))
@ -375,19 +374,19 @@ void CommandLineParser::parseLibraryOption(string const& _input)
// Should not happen if `fs::is_regular_file` is correct.
}
vector<string> libraries;
std::vector<std::string> libraries;
boost::split(libraries, data, boost::is_space() || boost::is_any_of(","), boost::token_compress_on);
for (string const& lib: libraries)
for (std::string const& lib: libraries)
if (!lib.empty())
{
//search for equal sign or last colon in string as our binaries output placeholders in the form of file=Name or file:Name
//so we need to search for `=` or `:` in the string
auto separator = lib.rfind('=');
bool isSeparatorEqualSign = true;
if (separator == string::npos)
if (separator == std::string::npos)
{
separator = lib.rfind(':');
if (separator == string::npos)
if (separator == std::string::npos)
solThrow(
CommandLineValidationError,
"Equal sign separator missing in library address specifier \"" + lib + "\""
@ -402,7 +401,7 @@ void CommandLineParser::parseLibraryOption(string const& _input)
"Only one equal sign \"=\" is allowed in the address string \"" + lib + "\"."
);
string libName(lib.begin(), lib.begin() + static_cast<ptrdiff_t>(separator));
std::string libName(lib.begin(), lib.begin() + static_cast<ptrdiff_t>(separator));
boost::trim(libName);
if (m_options.linker.libraries.count(libName))
solThrow(
@ -410,7 +409,7 @@ void CommandLineParser::parseLibraryOption(string const& _input)
"Address specified more than once for library \"" + libName + "\"."
);
string addrString(lib.begin() + static_cast<ptrdiff_t>(separator) + 1, lib.end());
std::string addrString(lib.begin() + static_cast<ptrdiff_t>(separator) + 1, lib.end());
boost::trim(addrString);
if (addrString.empty())
solThrow(
@ -433,7 +432,7 @@ void CommandLineParser::parseLibraryOption(string const& _input)
solThrow(
CommandLineValidationError,
"Invalid length for address for library \"" + libName + "\": " +
to_string(addrString.length()) + " instead of 40 characters."
std::to_string(addrString.length()) + " instead of 40 characters."
);
if (!util::passesAddressChecksum(addrString, false))
solThrow(
@ -454,14 +453,14 @@ void CommandLineParser::parseLibraryOption(string const& _input)
void CommandLineParser::parseOutputSelection()
{
static auto outputSupported = [](InputMode _mode, string_view _outputName)
static auto outputSupported = [](InputMode _mode, std::string_view _outputName)
{
static set<string> const compilerModeOutputs = (
static std::set<std::string> const compilerModeOutputs = (
CompilerOutputs::componentMap() |
ranges::views::keys |
ranges::to<set>()
ranges::to<std::set>()
);
static set<string> const assemblerModeOutputs = {
static std::set<std::string> const assemblerModeOutputs = {
CompilerOutputs::componentName(&CompilerOutputs::asm_),
CompilerOutputs::componentName(&CompilerOutputs::binary),
CompilerOutputs::componentName(&CompilerOutputs::irOptimized),
@ -500,7 +499,7 @@ void CommandLineParser::parseOutputSelection()
m_options.compiler.outputs.irOptimized = true;
}
vector<string> unsupportedOutputs;
std::vector<std::string> unsupportedOutputs;
for (auto&& [optionName, outputComponent]: CompilerOutputs::componentMap())
if (m_options.compiler.outputs.*outputComponent && !outputSupported(m_options.input.mode, optionName))
unsupportedOutputs.push_back(optionName);
@ -547,12 +546,12 @@ General Information)").c_str(),
inputOptions.add_options()
(
g_strBasePath.c_str(),
po::value<string>()->value_name("path"),
po::value<std::string>()->value_name("path"),
"Use the given path as the root of the source tree instead of the root of the filesystem."
)
(
g_strIncludePath.c_str(),
po::value<vector<string>>()->value_name("path"),
po::value<std::vector<std::string>>()->value_name("path"),
"Make an additional source directory available to the default import callback. "
"Use this option if you want to import contracts whose location is not fixed in relation "
"to your main source tree, e.g. third-party libraries installed using a package manager. "
@ -561,7 +560,7 @@ General Information)").c_str(),
)
(
g_strAllowPaths.c_str(),
po::value<string>()->value_name("path(s)"),
po::value<std::string>()->value_name("path(s)"),
"Allow a given path for imports. A list of paths can be supplied by separating them with a comma."
)
(
@ -575,7 +574,7 @@ General Information)").c_str(),
outputOptions.add_options()
(
(g_strOutputDir + ",o").c_str(),
po::value<string>()->value_name("path"),
po::value<std::string>()->value_name("path"),
"If given, creates one file per output component and contract/file at the specified directory."
)
(
@ -584,7 +583,7 @@ General Information)").c_str(),
)
(
g_strEVMVersion.c_str(),
po::value<string>()->value_name("version")->default_value(EVMVersion{}.name()),
po::value<std::string>()->value_name("version")->default_value(EVMVersion{}.name()),
"Select desired EVM version. Either homestead, tangerineWhistle, spuriousDragon, "
"byzantium, constantinople, petersburg, istanbul, berlin, london, paris or shanghai."
)
@ -610,19 +609,19 @@ General Information)").c_str(),
)
(
g_strRevertStrings.c_str(),
po::value<string>()->value_name(util::joinHumanReadable(g_revertStringsArgs, ",")),
po::value<std::string>()->value_name(util::joinHumanReadable(g_revertStringsArgs, ",")),
"Strip revert (and require) reason strings or add additional debugging information."
)
(
g_strDebugInfo.c_str(),
po::value<string>()->default_value(util::toString(DebugInfoSelection::Default())),
po::value<std::string>()->default_value(util::toString(DebugInfoSelection::Default())),
("Debug info components to be included in the produced EVM assembly and Yul code. "
"Value can be all, none or a comma-separated list containing one or more of the "
"following components: " + util::joinHumanReadable(DebugInfoSelection::componentMap() | ranges::views::keys) + ".").c_str()
)
(
g_strStopAfter.c_str(),
po::value<string>()->value_name("stage"),
po::value<std::string>()->value_name("stage"),
"Stop execution after the given compiler stage. Valid options: \"parsing\"."
)
;
@ -670,12 +669,12 @@ General Information)").c_str(),
assemblyModeOptions.add_options()
(
g_strMachine.c_str(),
po::value<string>()->value_name(util::joinHumanReadable(g_machineArgs, ",")),
po::value<std::string>()->value_name(util::joinHumanReadable(g_machineArgs, ",")),
"Target machine in assembly or Yul mode."
)
(
g_strYulDialect.c_str(),
po::value<string>()->value_name(util::joinHumanReadable(g_yulDialectArgs, ",")),
po::value<std::string>()->value_name(util::joinHumanReadable(g_yulDialectArgs, ",")),
"Input dialect to use in assembly or yul mode."
)
;
@ -685,7 +684,7 @@ General Information)").c_str(),
linkerModeOptions.add_options()
(
g_strLibraries.c_str(),
po::value<vector<string>>()->value_name("libs"),
po::value<std::vector<std::string>>()->value_name("libs"),
"Direct string or file containing library addresses. Syntax: "
"<libraryName>=<address> [, or whitespace] ...\n"
"Address is interpreted as a hex string prefixed by 0x."
@ -748,7 +747,7 @@ General Information)").c_str(),
)
(
g_strCombinedJson.c_str(),
po::value<string>()->value_name(util::joinHumanReadable(CombinedJsonRequests::componentMap() | ranges::views::keys, ",")),
po::value<std::string>()->value_name(util::joinHumanReadable(CombinedJsonRequests::componentMap() | ranges::views::keys, ",")),
"Output a single json document containing the specified information."
)
;
@ -762,7 +761,7 @@ General Information)").c_str(),
)
(
g_strMetadataHash.c_str(),
po::value<string>()->value_name(util::joinHumanReadable(g_metadataHashArgs, ",")),
po::value<std::string>()->value_name(util::joinHumanReadable(g_metadataHashArgs, ",")),
"Choose hash method for the bytecode metadata or disable it."
)
(
@ -798,7 +797,7 @@ General Information)").c_str(),
)
(
g_strYulOptimizations.c_str(),
po::value<string>()->value_name("steps"),
po::value<std::string>()->value_name("steps"),
"Forces Yul optimizer to use the specified sequence of optimization steps instead of the built-in one."
)
;
@ -808,7 +807,7 @@ General Information)").c_str(),
smtCheckerOptions.add_options()
(
g_strModelCheckerContracts.c_str(),
po::value<string>()->value_name("default,<source>:<contract>")->default_value("default"),
po::value<std::string>()->value_name("default,<source>:<contract>")->default_value("default"),
"Select which contracts should be analyzed using the form <source>:<contract>."
"Multiple pairs <source>:<contract> can be selected at the same time, separated by a comma "
"and no spaces."
@ -820,18 +819,18 @@ General Information)").c_str(),
)
(
g_strModelCheckerEngine.c_str(),
po::value<string>()->value_name("all,bmc,chc,none")->default_value("none"),
po::value<std::string>()->value_name("all,bmc,chc,none")->default_value("none"),
"Select model checker engine."
)
(
g_strModelCheckerExtCalls.c_str(),
po::value<string>()->value_name("untrusted,trusted")->default_value("untrusted"),
po::value<std::string>()->value_name("untrusted,trusted")->default_value("untrusted"),
"Select whether to assume (trusted) that external calls always invoke"
" the code given by the type of the contract, if that code is available."
)
(
g_strModelCheckerInvariants.c_str(),
po::value<string>()->value_name("default,all,contract,reentrancy")->default_value("default"),
po::value<std::string>()->value_name("default,all,contract,reentrancy")->default_value("default"),
"Select whether to report inferred contract inductive invariants."
" Multiple types of invariants can be selected at the same time, separated by a comma and no spaces."
" By default no invariants are reported."
@ -854,12 +853,12 @@ General Information)").c_str(),
)
(
g_strModelCheckerSolvers.c_str(),
po::value<string>()->value_name("cvc4,eld,z3,smtlib2")->default_value("z3"),
po::value<std::string>()->value_name("cvc4,eld,z3,smtlib2")->default_value("z3"),
"Select model checker solvers."
)
(
g_strModelCheckerTargets.c_str(),
po::value<string>()->value_name("default,all,constantCondition,underflow,overflow,divByZero,balance,assert,popEmptyArray,outOfBounds")->default_value("default"),
po::value<std::string>()->value_name("default,all,constantCondition,underflow,overflow,divByZero,balance,assert,popEmptyArray,outOfBounds")->default_value("default"),
"Select model checker verification targets."
"Multiple targets can be selected at the same time, separated by a comma and no spaces."
" By default all targets except underflow and overflow are selected."
@ -880,7 +879,7 @@ General Information)").c_str(),
;
desc.add(smtCheckerOptions);
desc.add_options()(g_strInputFile.c_str(), po::value<vector<string>>(), "input file");
desc.add_options()(g_strInputFile.c_str(), po::value<std::vector<std::string>>(), "input file");
return desc;
}
@ -954,7 +953,7 @@ void CommandLineParser::processArgs()
)
return;
map<string, set<InputMode>> validOptionInputModeCombinations = {
std::map<std::string, std::set<InputMode>> validOptionInputModeCombinations = {
// TODO: This should eventually contain all options.
{g_strExperimentalViaIR, {InputMode::Compiler, InputMode::CompilerWithASTImport}},
{g_strViaIR, {InputMode::Compiler, InputMode::CompilerWithASTImport}},
@ -975,7 +974,7 @@ void CommandLineParser::processArgs()
{g_strModelCheckerContracts, {InputMode::Compiler, InputMode::CompilerWithASTImport}},
{g_strModelCheckerTargets, {InputMode::Compiler, InputMode::CompilerWithASTImport}}
};
vector<string> invalidOptionsForCurrentInputMode;
std::vector<std::string> invalidOptionsForCurrentInputMode;
for (auto const& [optionName, inputModes]: validOptionInputModeCombinations)
{
if (
@ -999,7 +998,7 @@ void CommandLineParser::processArgs()
checkMutuallyExclusive({g_strColor, g_strNoColor});
checkMutuallyExclusive({g_strStopAfter, g_strGas});
for (string const& option: CompilerOutputs::componentMap() | ranges::views::keys)
for (std::string const& option: CompilerOutputs::componentMap() | ranges::views::keys)
if (option != CompilerOutputs::componentName(&CompilerOutputs::astCompactJson))
checkMutuallyExclusive({g_strStopAfter, option});
@ -1015,7 +1014,7 @@ void CommandLineParser::processArgs()
"Option --" + g_strOptimizeRuns + " is only valid in compiler and assembler modes."
);
for (string const& option: {g_strOptimize, g_strNoOptimizeYul, g_strOptimizeYul, g_strYulOptimizations})
for (std::string const& option: {g_strOptimize, g_strNoOptimizeYul, g_strOptimizeYul, g_strYulOptimizations})
if (m_args.count(option) > 0)
solThrow(
CommandLineValidationError,
@ -1038,8 +1037,8 @@ void CommandLineParser::processArgs()
if (m_args.count(g_strRevertStrings))
{
string revertStringsString = m_args[g_strRevertStrings].as<string>();
optional<RevertStrings> revertStrings = revertStringsFromString(revertStringsString);
std::string revertStringsString = m_args[g_strRevertStrings].as<std::string>();
std::optional<RevertStrings> revertStrings = revertStringsFromString(revertStringsString);
if (!revertStrings)
solThrow(
CommandLineValidationError,
@ -1055,7 +1054,7 @@ void CommandLineParser::processArgs()
if (!m_args[g_strDebugInfo].defaulted())
{
string optionValue = m_args[g_strDebugInfo].as<string>();
std::string optionValue = m_args[g_strDebugInfo].as<std::string>();
m_options.output.debugInfoSelection = DebugInfoSelection::fromString(optionValue);
if (!m_options.output.debugInfoSelection.has_value())
solThrow(CommandLineValidationError, "Invalid value for --" + g_strDebugInfo + " option: " + optionValue);
@ -1067,7 +1066,7 @@ void CommandLineParser::processArgs()
parseCombinedJsonOption();
if (m_args.count(g_strOutputDir))
m_options.output.dir = m_args.at(g_strOutputDir).as<string>();
m_options.output.dir = m_args.at(g_strOutputDir).as<std::string>();
m_options.output.overwriteFiles = (m_args.count(g_strOverwrite) > 0);
@ -1086,14 +1085,14 @@ void CommandLineParser::processArgs()
m_options.compiler.estimateGas = (m_args.count(g_strGas) > 0);
if (m_args.count(g_strBasePath))
m_options.input.basePath = m_args[g_strBasePath].as<string>();
m_options.input.basePath = m_args[g_strBasePath].as<std::string>();
if (m_args.count(g_strIncludePath) > 0)
{
if (m_options.input.basePath.empty())
solThrow(CommandLineValidationError, "--" + g_strIncludePath + " option requires a non-empty base path.");
for (string const& includePath: m_args[g_strIncludePath].as<vector<string>>())
for (std::string const& includePath: m_args[g_strIncludePath].as<std::vector<std::string>>())
{
if (includePath.empty())
solThrow(CommandLineValidationError, "Empty values are not allowed in --" + g_strIncludePath + ".");
@ -1104,15 +1103,15 @@ void CommandLineParser::processArgs()
if (m_args.count(g_strAllowPaths))
{
vector<string> paths;
for (string const& allowedPath: boost::split(paths, m_args[g_strAllowPaths].as<string>(), boost::is_any_of(",")))
std::vector<std::string> paths;
for (std::string const& allowedPath: boost::split(paths, m_args[g_strAllowPaths].as<std::string>(), boost::is_any_of(",")))
if (!allowedPath.empty())
m_options.input.allowedDirectories.insert(allowedPath);
}
if (m_args.count(g_strStopAfter))
{
if (m_args[g_strStopAfter].as<string>() != "parsing")
if (m_args[g_strStopAfter].as<std::string>() != "parsing")
solThrow(CommandLineValidationError, "Valid options for --" + g_strStopAfter + " are: \"parsing\".\n");
else
m_options.output.stopAfter = CompilerStack::State::Parsed;
@ -1124,7 +1123,7 @@ void CommandLineParser::processArgs()
return;
if (m_args.count(g_strLibraries))
for (string const& library: m_args[g_strLibraries].as<vector<string>>())
for (std::string const& library: m_args[g_strLibraries].as<std::vector<std::string>>())
parseLibraryOption(library);
if (m_options.input.mode == InputMode::Linker)
@ -1132,8 +1131,8 @@ void CommandLineParser::processArgs()
if (m_args.count(g_strEVMVersion))
{
string versionOptionStr = m_args[g_strEVMVersion].as<string>();
optional<langutil::EVMVersion> versionOption = langutil::EVMVersion::fromString(versionOptionStr);
std::string versionOptionStr = m_args[g_strEVMVersion].as<std::string>();
std::optional<langutil::EVMVersion> versionOption = langutil::EVMVersion::fromString(versionOptionStr);
if (!versionOption)
solThrow(CommandLineValidationError, "Invalid option for --" + g_strEVMVersion + ": " + versionOptionStr);
m_options.output.evmVersion = *versionOption;
@ -1144,7 +1143,7 @@ void CommandLineParser::processArgs()
// Request as uint64_t, since uint8_t will be parsed as character by boost.
uint64_t versionOption = m_args[g_strEOFVersion].as<uint64_t>();
if (versionOption != 1)
solThrow(CommandLineValidationError, "Invalid option for --" + g_strEOFVersion + ": " + to_string(versionOption));
solThrow(CommandLineValidationError, "Invalid option for --" + g_strEOFVersion + ": " + std::to_string(versionOption));
m_options.output.eofVersion = 1;
}
@ -1170,7 +1169,7 @@ void CommandLineParser::processArgs()
try
{
yul::OptimiserSuite::validateSequence(m_args[g_strYulOptimizations].as<string>());
yul::OptimiserSuite::validateSequence(m_args[g_strYulOptimizations].as<std::string>());
}
catch (yul::OptimizerException const& _exception)
{
@ -1180,12 +1179,12 @@ void CommandLineParser::processArgs()
);
}
m_options.optimizer.yulSteps = m_args[g_strYulOptimizations].as<string>();
m_options.optimizer.yulSteps = m_args[g_strYulOptimizations].as<std::string>();
}
if (m_options.input.mode == InputMode::Assembler)
{
vector<string> const nonAssemblyModeOptions = {
std::vector<std::string> const nonAssemblyModeOptions = {
// TODO: The list is not complete. Add more.
g_strOutputDir,
g_strGas,
@ -1193,10 +1192,10 @@ void CommandLineParser::processArgs()
};
if (countEnabledOptions(nonAssemblyModeOptions) >= 1)
{
auto optionEnabled = [&](string const& name){ return m_args.count(name) > 0; };
auto optionEnabled = [&](std::string const& name){ return m_args.count(name) > 0; };
auto enabledOptions = nonAssemblyModeOptions | ranges::views::filter(optionEnabled) | ranges::to_vector;
string message = "The following options are invalid in assembly mode: " + joinOptionNames(enabledOptions) + ".";
std::string message = "The following options are invalid in assembly mode: " + joinOptionNames(enabledOptions) + ".";
solThrow(CommandLineValidationError, message);
}
@ -1207,7 +1206,7 @@ void CommandLineParser::processArgs()
if (m_args.count(g_strMachine))
{
string machine = m_args[g_strMachine].as<string>();
std::string machine = m_args[g_strMachine].as<std::string>();
if (machine == g_strEVM)
m_options.assembly.targetMachine = Machine::EVM;
else
@ -1215,7 +1214,7 @@ void CommandLineParser::processArgs()
}
if (m_args.count(g_strYulDialect))
{
string dialect = m_args[g_strYulDialect].as<string>();
std::string dialect = m_args[g_strYulDialect].as<std::string>();
if (dialect == g_strEVM)
m_options.assembly.inputLanguage = Input::StrictAssembly;
else
@ -1239,7 +1238,7 @@ void CommandLineParser::processArgs()
if (m_args.count(g_strMetadataHash))
{
string hashStr = m_args[g_strMetadataHash].as<string>();
std::string hashStr = m_args[g_strMetadataHash].as<std::string>();
if (hashStr == g_strIPFS)
m_options.metadata.hash = CompilerStack::MetadataHash::IPFS;
else if (hashStr == g_strSwarm)
@ -1267,8 +1266,8 @@ void CommandLineParser::processArgs()
if (m_args.count(g_strModelCheckerContracts))
{
string contractsStr = m_args[g_strModelCheckerContracts].as<string>();
optional<ModelCheckerContracts> contracts = ModelCheckerContracts::fromString(contractsStr);
std::string contractsStr = m_args[g_strModelCheckerContracts].as<std::string>();
std::optional<ModelCheckerContracts> contracts = ModelCheckerContracts::fromString(contractsStr);
if (!contracts)
solThrow(CommandLineValidationError, "Invalid option for --" + g_strModelCheckerContracts + ": " + contractsStr);
m_options.modelChecker.settings.contracts = std::move(*contracts);
@ -1279,8 +1278,8 @@ void CommandLineParser::processArgs()
if (m_args.count(g_strModelCheckerEngine))
{
string engineStr = m_args[g_strModelCheckerEngine].as<string>();
optional<ModelCheckerEngine> engine = ModelCheckerEngine::fromString(engineStr);
std::string engineStr = m_args[g_strModelCheckerEngine].as<std::string>();
std::optional<ModelCheckerEngine> engine = ModelCheckerEngine::fromString(engineStr);
if (!engine)
solThrow(CommandLineValidationError, "Invalid option for --" + g_strModelCheckerEngine + ": " + engineStr);
m_options.modelChecker.settings.engine = *engine;
@ -1288,8 +1287,8 @@ void CommandLineParser::processArgs()
if (m_args.count(g_strModelCheckerExtCalls))
{
string mode = m_args[g_strModelCheckerExtCalls].as<string>();
optional<ModelCheckerExtCalls> extCallsMode = ModelCheckerExtCalls::fromString(mode);
std::string mode = m_args[g_strModelCheckerExtCalls].as<std::string>();
std::optional<ModelCheckerExtCalls> extCallsMode = ModelCheckerExtCalls::fromString(mode);
if (!extCallsMode)
solThrow(CommandLineValidationError, "Invalid option for --" + g_strModelCheckerExtCalls + ": " + mode);
m_options.modelChecker.settings.externalCalls = *extCallsMode;
@ -1297,8 +1296,8 @@ void CommandLineParser::processArgs()
if (m_args.count(g_strModelCheckerInvariants))
{
string invsStr = m_args[g_strModelCheckerInvariants].as<string>();
optional<ModelCheckerInvariants> invs = ModelCheckerInvariants::fromString(invsStr);
std::string invsStr = m_args[g_strModelCheckerInvariants].as<std::string>();
std::optional<ModelCheckerInvariants> invs = ModelCheckerInvariants::fromString(invsStr);
if (!invs)
solThrow(CommandLineValidationError, "Invalid option for --" + g_strModelCheckerInvariants + ": " + invsStr);
m_options.modelChecker.settings.invariants = *invs;
@ -1315,8 +1314,8 @@ void CommandLineParser::processArgs()
if (m_args.count(g_strModelCheckerSolvers))
{
string solversStr = m_args[g_strModelCheckerSolvers].as<string>();
optional<smtutil::SMTSolverChoice> solvers = smtutil::SMTSolverChoice::fromString(solversStr);
std::string solversStr = m_args[g_strModelCheckerSolvers].as<std::string>();
std::optional<smtutil::SMTSolverChoice> solvers = smtutil::SMTSolverChoice::fromString(solversStr);
if (!solvers)
solThrow(CommandLineValidationError, "Invalid option for --" + g_strModelCheckerSolvers + ": " + solversStr);
m_options.modelChecker.settings.solvers = *solvers;
@ -1331,8 +1330,8 @@ void CommandLineParser::processArgs()
if (m_args.count(g_strModelCheckerTargets))
{
string targetsStr = m_args[g_strModelCheckerTargets].as<string>();
optional<ModelCheckerTargets> targets = ModelCheckerTargets::fromString(targetsStr);
std::string targetsStr = m_args[g_strModelCheckerTargets].as<std::string>();
std::optional<ModelCheckerTargets> targets = ModelCheckerTargets::fromString(targetsStr);
if (!targets)
solThrow(CommandLineValidationError, "Invalid option for --" + g_strModelCheckerTargets + ": " + targetsStr);
m_options.modelChecker.settings.targets = *targets;
@ -1371,8 +1370,8 @@ void CommandLineParser::parseCombinedJsonOption()
if (!m_args.count(g_strCombinedJson))
return;
set<string> requests;
for (string const& item: boost::split(requests, m_args[g_strCombinedJson].as<string>(), boost::is_any_of(",")))
std::set<std::string> requests;
for (std::string const& item: boost::split(requests, m_args[g_strCombinedJson].as<std::string>(), boost::is_any_of(",")))
if (CombinedJsonRequests::componentMap().count(item) == 0)
solThrow(CommandLineValidationError, "Invalid option to --" + g_strCombinedJson + ": " + item);
@ -1381,19 +1380,19 @@ void CommandLineParser::parseCombinedJsonOption()
m_options.compiler.combinedJsonRequests.value().*component = (requests.count(componentName) > 0);
}
size_t CommandLineParser::countEnabledOptions(vector<string> const& _optionNames) const
size_t CommandLineParser::countEnabledOptions(std::vector<std::string> const& _optionNames) const
{
size_t count = 0;
for (string const& _option: _optionNames)
for (std::string const& _option: _optionNames)
count += m_args.count(_option);
return count;
}
string CommandLineParser::joinOptionNames(vector<string> const& _optionNames, string _separator)
std::string CommandLineParser::joinOptionNames(std::vector<std::string> const& _optionNames, std::string _separator)
{
return util::joinHumanReadable(
_optionNames | ranges::views::transform([](string const& _option){ return "--" + _option; }),
_optionNames | ranges::views::transform([](std::string const& _option){ return "--" + _option; }),
_separator
);
}

View File

@ -29,7 +29,6 @@
#include <iostream>
using namespace std;
using namespace solidity;
@ -37,31 +36,31 @@ int main(int argc, char** argv)
{
try
{
solidity::frontend::CommandLineInterface cli(cin, cout, cerr);
solidity::frontend::CommandLineInterface cli(std::cin, std::cout, std::cerr);
return cli.run(argc, argv) ? 0 : 1;
}
catch (smtutil::SMTLogicError const& _exception)
{
cerr << "SMT logic error:" << endl;
cerr << boost::diagnostic_information(_exception);
std::cerr << "SMT logic error:" << std::endl;
std::cerr << boost::diagnostic_information(_exception);
return 2;
}
catch (langutil::UnimplementedFeatureError const& _exception)
{
cerr << "Unimplemented feature:" << endl;
cerr << boost::diagnostic_information(_exception);
std::cerr << "Unimplemented feature:" << std::endl;
std::cerr << boost::diagnostic_information(_exception);
return 2;
}
catch (langutil::InternalCompilerError const& _exception)
{
cerr << "Internal compiler error:" << endl;
cerr << boost::diagnostic_information(_exception);
std::cerr << "Internal compiler error:" << std::endl;
std::cerr << boost::diagnostic_information(_exception);
return 2;
}
catch (...)
{
cerr << "Uncaught exception:" << endl;
cerr << boost::current_exception_diagnostic_information() << endl;
std::cerr << "Uncaught exception:" << std::endl;
std::cerr << boost::current_exception_diagnostic_information() << std::endl;
return 2;
}
}