diff options
Code generation (missing external access and source locations).
Diffstat (limited to 'libsolidity/analysis/ReferencesResolver.cpp')
-rw-r--r-- | libsolidity/analysis/ReferencesResolver.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/libsolidity/analysis/ReferencesResolver.cpp b/libsolidity/analysis/ReferencesResolver.cpp index ca002f58..d7542bf3 100644 --- a/libsolidity/analysis/ReferencesResolver.cpp +++ b/libsolidity/analysis/ReferencesResolver.cpp @@ -25,6 +25,8 @@ #include <libsolidity/analysis/NameAndTypeResolver.h> #include <libsolidity/interface/Exceptions.h> #include <libsolidity/analysis/ConstantEvaluator.h> +#include <libsolidity/inlineasm/AsmCodeGen.h> +#include <libsolidity/inlineasm/AsmData.h> using namespace std; using namespace dev; @@ -112,6 +114,26 @@ void ReferencesResolver::endVisit(ArrayTypeName const& _typeName) _typeName.annotation().type = make_shared<ArrayType>(DataLocation::Storage, baseType); } +bool ReferencesResolver::visit(InlineAssembly const& _inlineAssembly) +{ + // We need to perform a full code generation pass here as inline assembly does not distinguish + // reference resolution and code generation. + // Errors created in this stage are completely ignored because we do not yet know + // the type and size of external identifiers, which would result in false errors. + ErrorList errorsIgnored; + assembly::CodeGenerator codeGen(_inlineAssembly.operations(), errorsIgnored); + codeGen.typeCheck([&](assembly::Identifier const& _identifier, eth::Assembly&, assembly::CodeGenerator::IdentifierContext) { + auto declarations = m_resolver.nameFromCurrentScope(_identifier.name); + if (declarations.size() != 1) + return false; + _inlineAssembly.annotation().externalReferences[&_identifier] = declarations.front(); + // At this stage we neither know the code to generate nor the stack size of the identifier, + // so we do not modify assembly. + return true; + }); + return false; +} + bool ReferencesResolver::visit(Return const& _return) { _return.annotation().functionReturnParameters = m_returnParameters; |