14#include "llvm/ADT/iterator_range.h"
15#include "llvm/Support/Error.h"
16#include "llvm/Support/JSON.h"
25constexpr const char *
const PointerFlowKey =
"PointerFlow";
35 llvm::iterator_range<EdgeSet::const_iterator> Edges,
39 for (
const auto &[LHS, RHSSet] : Edges) {
42 for (
const auto &RHS : RHSSet)
44 EdgesData.push_back(
Value(std::move(EdgeEntry)));
54 for (
const auto &EdgesEntryData : EdgesData) {
55 const auto *EPLArray = EdgesEntryData.getAsArray();
57 if (!EPLArray || EPLArray->size() <= 1)
59 EdgesEntryData,
"a JSON array of EntityPointerLevels with a size "
60 "greater than 1: [src, dest, dest, ...]");
66 return SrcEPL.takeError();
67 for (
const auto &EPLData :
68 llvm::make_range(EPLArray->begin() + 1, EPLArray->end())) {
71 return EPL.takeError();
72 Edges[*SrcEPL].insert(*EPL);
78static llvm::json::Object
91 const Value *EdgesData =
Data.get(PointerFlowKey);
95 Object(
Data),
"a JSON object with the key: %s", PointerFlowKey);
97 const auto *EdgesDataAsArr = EdgesData->getAsArray();
101 *EdgesData,
"a JSON array of array of EntityPointerLevels");
106 return Edges.takeError();
107 return std::make_unique<PointerFlowEntitySummary>(
113 PointerFlowJSONFormatInfo()
114 : JSONFormat::FormatInfo(PointerFlowEntitySummary::summaryName(),
119static llvm::Registry<JSONFormat::FormatInfo>::Add<PointerFlowJSONFormatInfo>
121 "PointerFlow",
"JSON Format info for PointerFlowEntitySummary");
Manages entity name interning and provides efficient EntityId handles.
Base class for analysis-specific summary data.
llvm::json::Array edgeSetToJSON(llvm::iterator_range< EdgeSet::const_iterator > Edges, JSONFormat::EntityIdToJSONFn IdToJSON)
Serialize an EdgeSet {(src1, dest1), (src1, dest2), (src2, dest3), (src2, dest4), ....
std::map< EntityPointerLevel, EntityPointerLevelSet > EdgeSet
Maps each LHS pointer (source / assignee) to the set of RHS pointers (destinations / assigned values)...
llvm::json::Value entityPointerLevelToJSON(const EntityPointerLevel &EPL, JSONFormat::EntityIdToJSONFn EntityId2JSON)
llvm::iterator_range< EdgeSet::const_iterator > getEdges(const PointerFlowEntitySummary &)
llvm::Error makeSawButExpectedError(const JSONTy &Saw, llvm::StringRef Expected, const Ts &...ExpectedArgs)
volatile int PointerFlowJSONFormatAnchorSource
llvm::Expected< EdgeSet > edgeSetFromJSON(const llvm::json::Array &EdgesData, JSONFormat::EntityIdFromJSONFn IdFromJSON)
Deserialize an EdgeSet from the array format produced by edgeSetToJSON.
PointerFlowEntitySummary buildPointerFlowEntitySummary(EdgeSet Edges)
Expected< EntityPointerLevel > entityPointerLevelFromJSON(const llvm::json::Value &EPLData, JSONFormat::EntityIdFromJSONFn EntityIdFromJSON)
Top level wrappers for InstallAPI frontend operations.