#pragma once // // This file is distributed under the MIT License. See LICENSE.md for details. // #include #include "revng/Clift/Clift.h" #include "revng/Pipeline/Location.h" #include "revng/Pipes/Ranks.h" #include "revng/Support/MetaAddress.h" namespace clift { inline MetaAddress getMetaAddress(clift::FunctionOp F) { if (auto L = pipeline::locationFromString(revng::ranks::Function, F.getHandle())) { auto [Key] = L->at(revng::ranks::Function); return Key; } return MetaAddress::invalid(); } inline auto getUniqueIsolatedFunction(ConstOrNot auto Module, const MetaAddress &Address = MetaAddress::invalid()) -> ConstIf, FunctionOp> { using FunctionType = ConstIf, FunctionOp>; std::optional FoundFunction; std::optional FoundMetaAddress; Module->walk([&FoundFunction, &FoundMetaAddress](clift::FunctionOp Function) { if (Function.isExternal()) return; MetaAddress MA = getMetaAddress(Function); if (MA.isValid()) { revng_assert(not FoundFunction.has_value()); FoundFunction = Function; FoundMetaAddress = MA; } }); revng_assert(FoundFunction.has_value()); if (not Address.isInvalid()) revng_assert(FoundMetaAddress == Address); return *FoundFunction; } } // namespace clift