Support metadata via IR.

This commit is contained in:
chriseth
2021-06-21 18:20:31 +02:00
parent ff3eca4ccc
commit 0df8a38e55
55 changed files with 211 additions and 29 deletions
+6 -1
View File
@@ -65,10 +65,15 @@ string Object::toString(Dialect const* _dialect) const
set<YulString> Object::qualifiedDataNames() const
{
set<YulString> qualifiedNames = name.empty() ? set<YulString>{} : set<YulString>{name};
set<YulString> qualifiedNames =
name.empty() || contains(name.str(), '.') ?
set<YulString>{} :
set<YulString>{name};
for (shared_ptr<ObjectNode> const& subObjectNode: subObjects)
{
yulAssert(qualifiedNames.count(subObjectNode->name) == 0, "");
if (contains(subObjectNode->name.str(), '.'))
continue;
qualifiedNames.insert(subObjectNode->name);
if (auto const* subObject = dynamic_cast<Object const*>(subObjectNode.get()))
for (YulString const& subSubObj: subObject->qualifiedDataNames())
+4
View File
@@ -71,6 +71,7 @@ public:
/// @returns the set of names of data objects accessible from within the code of
/// this object, including the name of object itself
/// Handles all names containing dots as reserved identifiers, not accessible as data.
std::set<YulString> qualifiedDataNames() const;
/// @returns vector of subIDs if possible to reach subobject with @a _qualifiedName, throws otherwise
@@ -92,6 +93,9 @@ public:
std::vector<std::shared_ptr<ObjectNode>> subObjects;
std::map<YulString, size_t> subIndexByName;
std::shared_ptr<yul::AsmAnalysisInfo> analysisInfo;
/// @returns the name of the special metadata data object.
static std::string metadataName() { return ".metadata"; }
};
}
+3
View File
@@ -110,6 +110,9 @@ public:
/// Appends an assignment to an immutable variable.
virtual void appendImmutableAssignment(std::string const& _identifier) = 0;
/// Appends data to the very end of the bytecode. Repeated calls concatenate.
virtual void appendToAuxiliaryData(bytes const& _data) = 0;
/// Mark this assembly as invalid. Any attempt to request bytecode from it should throw.
virtual void markAsInvalid() = 0;
};
+5 -1
View File
@@ -53,7 +53,11 @@ void EVMObjectCompiler::run(Object& _object, bool _optimize)
else
{
Data const& data = dynamic_cast<Data const&>(*subNode);
context.subIDs[data.name] = m_assembly.appendData(data.data);
// Special handling of metadata.
if (data.name.str() == Object::metadataName())
m_assembly.appendToAuxiliaryData(data.data);
else
context.subIDs[data.name] = m_assembly.appendData(data.data);
}
yulAssert(_object.analysisInfo, "No analysis info.");
@@ -161,6 +161,11 @@ AbstractAssembly::SubID EthAssemblyAdapter::appendData(bytes const& _data)
return subID;
}
void EthAssemblyAdapter::appendToAuxiliaryData(bytes const& _data)
{
m_assembly.appendToAuxiliaryData(_data);
}
void EthAssemblyAdapter::appendImmutable(std::string const& _identifier)
{
m_assembly.appendImmutable(_identifier);
+2
View File
@@ -58,6 +58,8 @@ public:
void appendDataSize(std::vector<SubID> const& _subPath) override;
SubID appendData(bytes const& _data) override;
void appendToAuxiliaryData(bytes const& _data) override;
void appendImmutable(std::string const& _identifier) override;
void appendImmutableAssignment(std::string const& _identifier) override;
+2
View File
@@ -70,6 +70,8 @@ public:
void appendDataSize(std::vector<SubID> const& _subPath) override;
SubID appendData(bytes const& _data) override;
void appendToAuxiliaryData(bytes const&) override {}
void appendImmutable(std::string const& _identifier) override;
void appendImmutableAssignment(std::string const& _identifier) override;