aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/inlineasm/AsmAnalysis.cpp
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-02-23 18:42:53 +0800
committerchriseth <chris@ethereum.org>2018-03-02 00:19:35 +0800
commitdc317a44e031d45ebf745b47248bf06bc92d58bf (patch)
treed03753c0d0ff0672669e0e8ecb70db84f73f6a7f /libsolidity/inlineasm/AsmAnalysis.cpp
parenta53d6b499d5cc5c45fc096cea6393dc285581f90 (diff)
downloaddexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.tar
dexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.tar.gz
dexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.tar.bz2
dexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.tar.lz
dexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.tar.xz
dexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.tar.zst
dexon-solidity-dc317a44e031d45ebf745b47248bf06bc92d58bf.zip
Provide EVM version to assembly analysis.
Diffstat (limited to 'libsolidity/inlineasm/AsmAnalysis.cpp')
-rw-r--r--libsolidity/inlineasm/AsmAnalysis.cpp32
1 files changed, 23 insertions, 9 deletions
diff --git a/libsolidity/inlineasm/AsmAnalysis.cpp b/libsolidity/inlineasm/AsmAnalysis.cpp
index 1030523a..efa0410d 100644
--- a/libsolidity/inlineasm/AsmAnalysis.cpp
+++ b/libsolidity/inlineasm/AsmAnalysis.cpp
@@ -533,19 +533,33 @@ void AsmAnalyzer::expectValidType(string const& type, SourceLocation const& _loc
void AsmAnalyzer::warnOnInstructions(solidity::Instruction _instr, SourceLocation const& _location)
{
- static set<solidity::Instruction> futureInstructions{
- solidity::Instruction::CREATE2,
- solidity::Instruction::RETURNDATACOPY,
- solidity::Instruction::RETURNDATASIZE,
- solidity::Instruction::STATICCALL
- };
- if (futureInstructions.count(_instr))
+ // We assume that returndatacopy, returndatasize and staticcall are either all available
+ // or all not available.
+ solAssert(m_evmVersion.supportsReturndata() == m_evmVersion.hasStaticCall(), "");
+
+ if (_instr == solidity::Instruction::CREATE2)
m_errorReporter.warning(
_location,
"The \"" +
boost::to_lower_copy(instructionInfo(_instr).name)
- + "\" instruction is only available after " +
- "the Metropolis hard fork. Before that it acts as an invalid instruction."
+ + "\" instruction is not supported by the VM version \"" +
+ "" + m_evmVersion.name() +
+ "\" you are currently compiling for. " +
+ "It will be interpreted as an invalid instruction on this VM."
+ );
+ else if ((
+ _instr == solidity::Instruction::RETURNDATACOPY ||
+ _instr == solidity::Instruction::RETURNDATASIZE ||
+ _instr == solidity::Instruction::STATICCALL
+ ) && !m_evmVersion.supportsReturndata())
+ m_errorReporter.warning(
+ _location,
+ "The \"" +
+ boost::to_lower_copy(instructionInfo(_instr).name)
+ + "\" instruction is only available for Byzantium-compatible VMs. " +
+ "You are currently compiling for \"" +
+ m_evmVersion.name() +
+ "\", where it will be interpreted as an invalid instruction."
);
static set<solidity::Instruction> experimentalInstructions{