clang 23.0.0git
JSONFormat.h
Go to the documentation of this file.
1//===- JSONFormat.h ---------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// JSON serialization format implementation.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_CORE_SERIALIZATION_JSONFORMAT_H
14#define LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_CORE_SERIALIZATION_JSONFORMAT_H
15
19#include "llvm/ADT/STLFunctionalExtras.h"
20#include "llvm/Support/JSON.h"
21#include "llvm/Support/Registry.h"
22
23#include <set>
24
25namespace clang::ssaf {
26
27class EntityIdTable;
28class EntitySummary;
29class SummaryName;
30
31class JSONFormat final : public SerializationFormat {
32 using Array = llvm::json::Array;
33 using Object = llvm::json::Object;
34 using Value = llvm::json::Value;
35
37
38public:
39 llvm::Expected<TUSummary> readTUSummary(llvm::StringRef Path) override;
40
41 llvm::Error writeTUSummary(const TUSummary &Summary,
42 llvm::StringRef Path) override;
43
45 readTUSummaryEncoding(llvm::StringRef Path) override;
46
47 llvm::Error writeTUSummaryEncoding(const TUSummaryEncoding &SummaryEncoding,
48 llvm::StringRef Path) override;
49
50 llvm::Expected<LUSummary> readLUSummary(llvm::StringRef Path) override;
51
52 llvm::Error writeLUSummary(const LUSummary &Summary,
53 llvm::StringRef Path) override;
54
56 readLUSummaryEncoding(llvm::StringRef Path) override;
57
58 llvm::Error writeLUSummaryEncoding(const LUSummaryEncoding &SummaryEncoding,
59 llvm::StringRef Path) override;
60
61 llvm::Expected<WPASuite> readWPASuite(llvm::StringRef Path) override;
62
63 llvm::Error writeWPASuite(const WPASuite &Suite,
64 llvm::StringRef Path) override;
65
67 llvm::function_ref<void(llvm::StringRef Name, llvm::StringRef Desc)>
68 Callback) const override;
69
70 using EntityIdToJSONFn = llvm::function_ref<Object(EntityId)>;
72 llvm::function_ref<llvm::Expected<EntityId>(const Object &)>;
73
75 llvm::function_ref<Object(const EntitySummary &, EntityIdToJSONFn)>;
77 llvm::function_ref<llvm::Expected<std::unique_ptr<EntitySummary>>(
78 const Object &, EntityIdTable &, EntityIdFromJSONFn)>;
79
81
83 llvm::function_ref<Object(const AnalysisResult &, EntityIdToJSONFn)>;
85 llvm::function_ref<llvm::Expected<std::unique_ptr<AnalysisResult>>(
86 const Object &, EntityIdFromJSONFn)>;
87
91
92private:
93 static std::map<SummaryName, FormatInfo> initFormatInfos();
94 const std::map<SummaryName, FormatInfo> FormatInfos = initFormatInfos();
95
96 EntityId entityIdFromJSON(const uint64_t EntityIdIndex) const;
97 uint64_t entityIdToJSON(EntityId EI) const;
98
100 entityIdFromJSONObject(const Object &EntityIdObject);
101 static Object entityIdToJSONObject(EntityId EI);
102
104 buildNamespaceFromJSON(const Object &BuildNamespaceObject) const;
105 Object buildNamespaceToJSON(const BuildNamespace &BN) const;
106
108 nestedBuildNamespaceFromJSON(const Array &NestedBuildNamespaceArray) const;
109 Array nestedBuildNamespaceToJSON(const NestedBuildNamespace &NBN) const;
110
112 tuEntityNameFromJSON(const Object &EntityNameObject) const;
113 Object tuEntityNameToJSON(const EntityName &EN) const;
114
116 luEntityNameFromJSON(const Object &EntityNameObject) const;
117 Object luEntityNameToJSON(const EntityName &EN) const;
118
120 entityLinkageFromJSON(const Object &EntityLinkageObject) const;
121 Object entityLinkageToJSON(const EntityLinkage &EL) const;
122
124 tuEntityIdTableEntryFromJSON(const Object &EntityIdTableEntryObject) const;
126 tuEntityIdTableFromJSON(const Array &EntityIdTableArray) const;
127 Object tuEntityIdTableEntryToJSON(const EntityName &EN, EntityId EI) const;
128 Array tuEntityIdTableToJSON(const EntityIdTable &IdTable) const;
129
131 luEntityIdTableEntryFromJSON(const Object &EntityIdTableEntryObject) const;
133 luEntityIdTableFromJSON(const Array &EntityIdTableArray) const;
134 Object luEntityIdTableEntryToJSON(const EntityName &EN, EntityId EI) const;
135 Array luEntityIdTableToJSON(const EntityIdTable &IdTable) const;
136
138 linkageTableEntryFromJSON(const Object &LinkageTableEntryObject) const;
139 Object linkageTableEntryToJSON(EntityId EI, const EntityLinkage &EL) const;
140
142 linkageTableFromJSON(const Array &LinkageTableArray,
143 std::set<EntityId> ExpectedIds) const;
144 Array linkageTableToJSON(
145 const std::map<EntityId, EntityLinkage> &LinkageTable) const;
146
148 entitySummaryFromJSON(const SummaryName &SN,
149 const Object &EntitySummaryObject,
150 EntityIdTable &IdTable) const;
151 llvm::Expected<Object> entitySummaryToJSON(const SummaryName &SN,
152 const EntitySummary &ES) const;
153
155 entityDataMapEntryFromJSON(const Object &EntityDataMapEntryObject,
156 const SummaryName &SN,
157 EntityIdTable &IdTable) const;
159 entityDataMapEntryToJSON(const EntityId EI,
160 const std::unique_ptr<EntitySummary> &EntitySummary,
161 const SummaryName &SN) const;
163 entityDataMapFromJSON(const SummaryName &SN, const Array &EntityDataArray,
164 EntityIdTable &IdTable) const;
166 entityDataMapToJSON(const SummaryName &SN,
167 const std::map<EntityId, std::unique_ptr<EntitySummary>>
168 &EntityDataMap) const;
169
170 llvm::Expected<std::pair<SummaryName,
171 std::map<EntityId, std::unique_ptr<EntitySummary>>>>
172 summaryDataMapEntryFromJSON(const Object &SummaryDataObject,
173 EntityIdTable &IdTable) const;
174 llvm::Expected<Object> summaryDataMapEntryToJSON(
175 const SummaryName &SN,
176 const std::map<EntityId, std::unique_ptr<EntitySummary>> &SD) const;
177
179 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
180 summaryDataMapFromJSON(const Array &SummaryDataArray,
181 EntityIdTable &IdTable) const;
182 llvm::Expected<Array> summaryDataMapToJSON(
183 const std::map<SummaryName,
184 std::map<EntityId, std::unique_ptr<EntitySummary>>>
185 &SummaryDataMap) const;
186
188 encodingDataMapEntryFromJSON(const Object &EntityDataMapEntryObject) const;
189 Object encodingDataMapEntryToJSON(
190 EntityId EI,
191 const std::unique_ptr<EntitySummaryEncoding> &Encoding) const;
192
194 encodingDataMapFromJSON(const Array &EntityDataArray) const;
195 Array encodingDataMapToJSON(
196 const std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>
197 &EncodingDataMap) const;
198
199 llvm::Expected<std::pair<
200 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
201 encodingSummaryDataMapEntryFromJSON(
202 const Object &SummaryDataMapEntryObject) const;
203 Object encodingSummaryDataMapEntryToJSON(
204 const SummaryName &SN,
205 const std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>
206 &EncodingMap) const;
207
208 llvm::Expected<std::map<
209 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
210 encodingSummaryDataMapFromJSON(const Array &SummaryDataArray) const;
211 Array encodingSummaryDataMapToJSON(
212 const std::map<SummaryName,
213 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
214 &EncodingSummaryDataMap) const;
215
217 analysisResultMapEntryFromJSON(const Object &Entry) const;
218 llvm::Expected<Object> analysisResultMapEntryToJSON(
219 const AnalysisName &Name,
220 const std::unique_ptr<AnalysisResult> &Result) const;
221
223 analysisResultMapFromJSON(const Array &ResultsArray) const;
224 llvm::Expected<Array> analysisResultMapToJSON(
225 const std::map<AnalysisName, std::unique_ptr<AnalysisResult>> &Data)
226 const;
227};
228
229} // namespace clang::ssaf
230
231namespace llvm {
232extern template class CLANG_TEMPLATE_ABI
233 Registry<clang::ssaf::JSONFormat::FormatInfo>;
234extern template class CLANG_TEMPLATE_ABI
235 Registry<clang::ssaf::JSONFormat::AnalysisResultRegistry::Codec>;
236} // namespace llvm
237
238#endif // LLVM_CLANG_SCALABLESTATICANALYSISFRAMEWORK_CORE_SERIALIZATION_JSONFORMAT_H
Uniquely identifies a whole-program analysis and the AnalysisResult it produces.
Base class for whole-program analysis results.
Represents a single namespace in the build process.
Manages entity name interning and provides efficient EntityId handles.
Lightweight opaque handle representing an entity in an EntityIdTable.
Definition EntityId.h:31
Represents the linkage properties of an entity in the program model.
Uniquely identifies an entity in a program.
Definition EntityName.h:28
Base class for analysis-specific summary data.
llvm::Expected< TUSummary > readTUSummary(llvm::StringRef Path) override
Definition TUSummary.cpp:21
llvm::Error writeLUSummary(const LUSummary &Summary, llvm::StringRef Path) override
llvm::Expected< LUSummary > readLUSummary(llvm::StringRef Path) override
Definition LUSummary.cpp:21
llvm::Expected< WPASuite > readWPASuite(llvm::StringRef Path) override
Definition WPASuite.cpp:122
llvm::function_ref< Object(const EntitySummary &, EntityIdToJSONFn)> SerializerFn
Definition JSONFormat.h:74
llvm::Expected< LUSummaryEncoding > readLUSummaryEncoding(llvm::StringRef Path) override
llvm::function_ref< llvm::Expected< std::unique_ptr< EntitySummary > >( const Object &, EntityIdTable &, EntityIdFromJSONFn)> DeserializerFn
Definition JSONFormat.h:76
llvm::function_ref< llvm::Expected< EntityId >(const Object &)> EntityIdFromJSONFn
Definition JSONFormat.h:71
SerializationFormat::AnalysisResultRegistryGenerator< JSONFormat, AnalysisResultSerializerFn, AnalysisResultDeserializerFn > AnalysisResultRegistry
Definition JSONFormat.h:88
FormatInfoEntry< SerializerFn, DeserializerFn > FormatInfo
Definition JSONFormat.h:80
llvm::Error writeWPASuite(const WPASuite &Suite, llvm::StringRef Path) override
Definition WPASuite.cpp:188
friend class JSONEntitySummaryEncoding
Definition JSONFormat.h:36
llvm::Error writeTUSummary(const TUSummary &Summary, llvm::StringRef Path) override
llvm::function_ref< Object(const AnalysisResult &, EntityIdToJSONFn)> AnalysisResultSerializerFn
Definition JSONFormat.h:82
llvm::function_ref< Object(EntityId)> EntityIdToJSONFn
Definition JSONFormat.h:70
llvm::function_ref< llvm::Expected< std::unique_ptr< AnalysisResult > >( const Object &, EntityIdFromJSONFn)> AnalysisResultDeserializerFn
Definition JSONFormat.h:84
llvm::Expected< TUSummaryEncoding > readTUSummaryEncoding(llvm::StringRef Path) override
llvm::Error writeLUSummaryEncoding(const LUSummaryEncoding &SummaryEncoding, llvm::StringRef Path) override
llvm::Error writeTUSummaryEncoding(const TUSummaryEncoding &SummaryEncoding, llvm::StringRef Path) override
void forEachRegisteredAnalysis(llvm::function_ref< void(llvm::StringRef Name, llvm::StringRef Desc)> Callback) const override
Invokes Callback once for each analysis that has registered serialization support for this format.
Represents a link unit summary in its serialized encoding.
Represents a link unit (LU) summary containing merged entity summaries.
Definition LUSummary.h:33
Represents a hierarchical sequence of build namespaces.
Per-format plugin registry for analysis result (de)serializers.
Abstract base class for serialization formats.
Uniquely identifies an analysis summary.
Definition SummaryName.h:22
Represents a translation unit summary in its serialized encoding.
Data extracted for a given translation unit and for a given set of analyses.
Definition TUSummary.h:24
Bundles the EntityIdTable (moved from the LUSummary) and the analysis results produced by one Analysi...
Definition WPASuite.h:37
llvm::json::Object Object
@ Result
The result type of a method or function.
Definition TypeBase.h:905
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30