19llvm::Expected<std::pair<AnalysisName, std::unique_ptr<AnalysisResult>>>
20JSONFormat::analysisResultMapEntryFromJSON(
const Object &Entry)
const {
21 auto OptName = Entry.getString(
"analysis_name");
25 "AnalysisName",
"analysis_name",
"string")
31 auto ExpectedCodec = AnalysisResultRegistry::instantiate(Name);
33 return ExpectedCodec.takeError();
36 const Object *ResultObj = Entry.getObject(
"result");
40 "AnalysisResult",
"result",
"object")
45 (*ExpectedCodec)->deserialize(*ResultObj, &entityIdFromJSONObject);
46 if (!ExpectedResult) {
47 return ExpectedResult.takeError();
50 return std::make_pair(std::move(Name), std::move(*ExpectedResult));
53llvm::Expected<Object> JSONFormat::analysisResultMapEntryToJSON(
55 const std::unique_ptr<AnalysisResult> &
Result)
const {
56 auto ExpectedCodec = AnalysisResultRegistry::instantiate(Name);
58 return ExpectedCodec.takeError();
63 Entry[
"result"] = (*ExpectedCodec)->serialize(*
Result, &entityIdToJSONObject);
71llvm::Expected<std::map<AnalysisName, std::unique_ptr<AnalysisResult>>>
72JSONFormat::analysisResultMapFromJSON(
const Array &ResultsArray)
const {
73 std::map<AnalysisName, std::unique_ptr<AnalysisResult>> Results;
75 auto AsObject = [](
const Value &
V) {
return V.getAsObject(); };
76 auto ObjectsRange = llvm::map_range(ResultsArray, AsObject);
78 for (
auto [I, Entry] : enumerate(ObjectsRange)) {
82 "WPA result entry", I,
"object")
86 auto ExpectedPair = analysisResultMapEntryFromJSON(*Entry);
93 auto [Name,
Result] = std::move(*ExpectedPair);
94 bool Inserted = Results.try_emplace(Name, std::move(
Result)).second;
98 "WPA result", I, Name)
102 return std::move(Results);
105llvm::Expected<Array> JSONFormat::analysisResultMapToJSON(
106 const std::map<
AnalysisName, std::unique_ptr<AnalysisResult>> &
Data)
const {
109 auto ExpectedEntry = analysisResultMapEntryToJSON(Name,
Result);
110 if (!ExpectedEntry) {
111 return ExpectedEntry.takeError();
113 Results.push_back(std::move(*ExpectedEntry));
130 Object *RootObjectPtr = ExpectedJSON->getAsObject();
131 if (!RootObjectPtr) {
139 const Object &RootObject = *RootObjectPtr;
144 const Array *IdTableArray = RootObject.getArray(
"id_table");
148 "IdTable",
"id_table",
"array")
153 auto ExpectedIdTable = entityIdTableFromJSON(*IdTableArray);
154 if (!ExpectedIdTable) {
161 getIdTable(Suite) = std::move(*ExpectedIdTable);
165 const Array *ResultsArray = RootObject.getArray(
"results");
169 "WPA results",
"results",
"array")
174 auto ExpectedResultsMap = analysisResultMapFromJSON(*ResultsArray);
175 if (!ExpectedResultsMap) {
182 getData(Suite) = std::move(*ExpectedResultsMap);
185 return std::move(Suite);
189 llvm::StringRef Path) {
192 RootObject[
"id_table"] = entityIdTableToJSON(getIdTable(Suite));
194 auto ExpectedResults = analysisResultMapToJSON(getData(Suite));
195 if (!ExpectedResults) {
201 RootObject[
"results"] = std::move(*ExpectedResults);
209 return llvm::Error::success();
Uniquely identifies a whole-program analysis and the AnalysisResult it produces.
static ErrorBuilder create(std::error_code EC, const char *Fmt, Args &&...ArgVals)
Create an ErrorBuilder with an error code and formatted message.
ErrorBuilder & context(const char *Msg)
Add context information as a plain string.
llvm::Error build() const
Build and return the final error.
static ErrorBuilder wrap(llvm::Error E)
Wrap an existing error and optionally add context.
Bundles the EntityIdTable (moved from the LUSummary) and the analysis results produced by one Analysi...
constexpr const char * ReadingFromFile
constexpr const char * ReadingFromField
constexpr const char * FailedToReadObjectAtIndex
constexpr const char * FailedToReadObjectAtField
constexpr const char * WritingToFile
constexpr const char * ReadingFromIndex
constexpr const char * FailedInsertionOnDuplication
constexpr const char * FailedToReadObject
llvm::StringRef analysisNameToJSON(const AnalysisName &AN)
AnalysisName analysisNameFromJSON(llvm::StringRef AnalysisNameStr)
llvm::json::Object Object
llvm::Expected< Value > readJSON(llvm::StringRef Path)
llvm::Error writeJSON(Value &&V, llvm::StringRef Path)
@ Result
The result type of a method or function.