clang 24.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_SCALABLESTATICANALYSIS_CORE_SERIALIZATION_JSONFORMAT_H
14#define LLVM_CLANG_SCALABLESTATICANALYSIS_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
55 llvm::Expected<Artifact> readArtifact(llvm::StringRef Path) override;
56
57 llvm::Error writeArtifact(const Artifact &A, llvm::StringRef Path) override;
58
60 readArtifactEncoding(llvm::StringRef Path) override;
61
62 llvm::Error writeArtifactEncoding(const ArtifactEncoding &E,
63 llvm::StringRef Path) override;
64
66 readLUSummaryEncoding(llvm::StringRef Path) override;
67
68 llvm::Error writeLUSummaryEncoding(const LUSummaryEncoding &SummaryEncoding,
69 llvm::StringRef Path) override;
70
72 readStaticLibrary(llvm::StringRef Path) override;
73
74 llvm::Error writeStaticLibrary(const StaticLibrary &S,
75 llvm::StringRef Path) override;
76
78 readMultiArchStaticLibrary(llvm::StringRef Path) override;
79
81 llvm::StringRef Path) override;
82
84 readMultiArchSharedLibrary(llvm::StringRef Path) override;
85
87 llvm::StringRef Path) override;
88
89 llvm::Expected<WPASuite> readWPASuite(llvm::StringRef Path) override;
90
91 llvm::Error writeWPASuite(const WPASuite &Suite,
92 llvm::StringRef Path) override;
93
95 llvm::function_ref<void(llvm::StringRef Name, llvm::StringRef Desc)>
96 Callback) const override;
97
98 using EntityIdToJSONFn = llvm::function_ref<Object(EntityId)>;
100 llvm::function_ref<llvm::Expected<EntityId>(const Object &)>;
101
103 llvm::function_ref<Object(const EntitySummary &, EntityIdToJSONFn)>;
105 llvm::function_ref<llvm::Expected<std::unique_ptr<EntitySummary>>(
106 const Object &, EntityIdTable &, EntityIdFromJSONFn)>;
107
109
111 llvm::function_ref<Object(const AnalysisResult &, EntityIdToJSONFn)>;
113 llvm::function_ref<llvm::Expected<std::unique_ptr<AnalysisResult>>(
114 const Object &, EntityIdFromJSONFn)>;
115
119
120private:
121 static std::map<SummaryName, FormatInfo> initFormatInfos();
122 const std::map<SummaryName, FormatInfo> FormatInfos = initFormatInfos();
123
124 /// Parses a TUSummary from an already-validated root JSON object. The
125 /// caller is responsible for verifying the self-describing type field
126 /// and for wrapping any returned error with file-path context.
127 llvm::Expected<TUSummary> readTUSummaryFromObject(const Object &Root);
128
129 /// Parses an LUSummary from an already-validated root JSON object. See
130 /// \c readTUSummaryFromObject for caller responsibilities.
131 llvm::Expected<LUSummary> readLUSummaryFromObject(const Object &Root);
132
133 /// Parses a TUSummaryEncoding from an already-validated root JSON
134 /// object. See \c readTUSummaryFromObject for caller responsibilities.
136 readTUSummaryEncodingFromObject(const Object &Root);
137
138 /// Parses an LUSummaryEncoding from an already-validated root JSON
139 /// object. See \c readTUSummaryFromObject for caller responsibilities.
141 readLUSummaryEncodingFromObject(const Object &Root);
142
143 /// Parses a StaticLibrary from an already-validated root JSON object.
144 /// See \c readTUSummaryFromObject for caller responsibilities.
145 llvm::Expected<StaticLibrary> readStaticLibraryFromObject(const Object &Root);
146
147 /// Parses a MultiArchStaticLibrary from an already-validated root JSON
148 /// object. See \c readTUSummaryFromObject for caller responsibilities.
150 readMultiArchStaticLibraryFromObject(const Object &Root);
151
152 /// Parses a MultiArchSharedLibrary from an already-validated root JSON
153 /// object. See \c readTUSummaryFromObject for caller responsibilities.
155 readMultiArchSharedLibraryFromObject(const Object &Root);
156
157 /// Serializes a TUSummaryEncoding to a JSON object including its
158 /// self-describing \c type field. Used both by \c writeTUSummaryEncoding
159 /// and by the StaticLibrary writer to emit member entries.
160 Object tuSummaryEncodingToJSON(const TUSummaryEncoding &SE) const;
161
162 /// Serializes a StaticLibrary to a JSON object including its
163 /// self-describing \c type field. Used both by \c writeStaticLibrary
164 /// and by the MultiArchStaticLibrary writer to emit per-arch slices.
165 Object staticLibraryToJSON(const StaticLibrary &S) const;
166
167 /// Serializes an LUSummaryEncoding to a JSON object including its
168 /// self-describing \c type field. Used both by \c writeLUSummaryEncoding
169 /// and by the MultiArchSharedLibrary writer to emit per-arch slices.
170 Object luSummaryEncodingToJSON(const LUSummaryEncoding &E) const;
171
172 /// Parses a WPASuite from an already-validated root JSON object. See
173 /// \c readTUSummaryFromObject for caller responsibilities.
174 llvm::Expected<WPASuite> readWPASuiteFromObject(const Object &Root);
175
176 EntityId entityIdFromJSON(const uint64_t EntityIdIndex) const;
177 uint64_t entityIdToJSON(EntityId EI) const;
178
180 entityIdFromJSONObject(const Object &EntityIdObject);
181 static Object entityIdToJSONObject(EntityId EI);
182
184 buildNamespaceFromJSON(const Object &BuildNamespaceObject) const;
185 Object buildNamespaceToJSON(const BuildNamespace &BN) const;
186
188 nestedBuildNamespaceFromJSON(const Array &NestedBuildNamespaceArray) const;
189 Array nestedBuildNamespaceToJSON(const NestedBuildNamespace &NBN) const;
190
192 tuEntityNameFromJSON(const Object &EntityNameObject) const;
193 Object tuEntityNameToJSON(const EntityName &EN) const;
194
196 luEntityNameFromJSON(const Object &EntityNameObject) const;
197 Object luEntityNameToJSON(const EntityName &EN) const;
198
200 entityLinkageFromJSON(const Object &EntityLinkageObject) const;
201 Object entityLinkageToJSON(const EntityLinkage &EL) const;
202
204 tuEntityIdTableEntryFromJSON(const Object &EntityIdTableEntryObject) const;
206 tuEntityIdTableFromJSON(const Array &EntityIdTableArray) const;
207 Object tuEntityIdTableEntryToJSON(const EntityName &EN, EntityId EI) const;
208 Array tuEntityIdTableToJSON(const EntityIdTable &IdTable) const;
209
211 luEntityIdTableEntryFromJSON(const Object &EntityIdTableEntryObject) const;
213 luEntityIdTableFromJSON(const Array &EntityIdTableArray) const;
214 Object luEntityIdTableEntryToJSON(const EntityName &EN, EntityId EI) const;
215 Array luEntityIdTableToJSON(const EntityIdTable &IdTable) const;
216
218 linkageTableEntryFromJSON(const Object &LinkageTableEntryObject) const;
219 Object linkageTableEntryToJSON(EntityId EI, const EntityLinkage &EL) const;
220
222 linkageTableFromJSON(const Array &LinkageTableArray,
223 std::set<EntityId> ExpectedIds) const;
224 Array linkageTableToJSON(
225 const std::map<EntityId, EntityLinkage> &LinkageTable) const;
226
228 entitySummaryFromJSON(const SummaryName &SN,
229 const Object &EntitySummaryObject,
230 EntityIdTable &IdTable) const;
231 llvm::Expected<Object> entitySummaryToJSON(const SummaryName &SN,
232 const EntitySummary &ES) const;
233
235 entityDataMapEntryFromJSON(const Object &EntityDataMapEntryObject,
236 const SummaryName &SN,
237 EntityIdTable &IdTable) const;
239 entityDataMapEntryToJSON(const EntityId EI,
240 const std::unique_ptr<EntitySummary> &EntitySummary,
241 const SummaryName &SN) const;
243 entityDataMapFromJSON(const SummaryName &SN, const Array &EntityDataArray,
244 EntityIdTable &IdTable) const;
246 entityDataMapToJSON(const SummaryName &SN,
247 const std::map<EntityId, std::unique_ptr<EntitySummary>>
248 &EntityDataMap) const;
249
250 llvm::Expected<std::pair<SummaryName,
251 std::map<EntityId, std::unique_ptr<EntitySummary>>>>
252 summaryDataMapEntryFromJSON(const Object &SummaryDataObject,
253 EntityIdTable &IdTable) const;
254 llvm::Expected<Object> summaryDataMapEntryToJSON(
255 const SummaryName &SN,
256 const std::map<EntityId, std::unique_ptr<EntitySummary>> &SD) const;
257
259 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
260 summaryDataMapFromJSON(const Array &SummaryDataArray,
261 EntityIdTable &IdTable) const;
262 llvm::Expected<Array> summaryDataMapToJSON(
263 const std::map<SummaryName,
264 std::map<EntityId, std::unique_ptr<EntitySummary>>>
265 &SummaryDataMap) const;
266
268 encodingDataMapEntryFromJSON(const Object &EntityDataMapEntryObject) const;
269 Object encodingDataMapEntryToJSON(
270 EntityId EI,
271 const std::unique_ptr<EntitySummaryEncoding> &Encoding) const;
272
274 encodingDataMapFromJSON(const Array &EntityDataArray) const;
275 Array encodingDataMapToJSON(
276 const std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>
277 &EncodingDataMap) const;
278
279 llvm::Expected<std::pair<
280 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
281 encodingSummaryDataMapEntryFromJSON(
282 const Object &SummaryDataMapEntryObject) const;
283 Object encodingSummaryDataMapEntryToJSON(
284 const SummaryName &SN,
285 const std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>
286 &EncodingMap) const;
287
288 llvm::Expected<std::map<
289 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
290 encodingSummaryDataMapFromJSON(const Array &SummaryDataArray) const;
291 Array encodingSummaryDataMapToJSON(
292 const std::map<SummaryName,
293 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
294 &EncodingSummaryDataMap) const;
295
297 analysisResultMapEntryFromJSON(const Object &Entry) const;
298 llvm::Expected<Object> analysisResultMapEntryToJSON(
299 const AnalysisName &Name,
300 const std::unique_ptr<AnalysisResult> &Result) const;
301
303 analysisResultMapFromJSON(const Array &ResultsArray) const;
304 llvm::Expected<Array> analysisResultMapToJSON(
305 const std::map<AnalysisName, std::unique_ptr<AnalysisResult>> &Data)
306 const;
307};
308
309} // namespace clang::ssaf
310
312 llvm::Registry<clang::ssaf::JSONFormat::FormatInfo>)
314 CLANG_ABI_EXPORT,
315 llvm::Registry<clang::ssaf::JSONFormat::AnalysisResultRegistry::Codec>)
316
317#endif // LLVM_CLANG_SCALABLESTATICANALYSIS_CORE_SERIALIZATION_JSONFORMAT_H
LLVM_DECLARE_REGISTRY_EX(CLANG_ABI_EXPORT, llvm::Registry< clang::ssaf::JSONFormat::FormatInfo >) LLVM_DECLARE_REGISTRY_EX(CLANG_ABI_EXPORT
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:22
llvm::Error writeArtifact(const Artifact &A, llvm::StringRef Path) override
Generic write entry point.
Definition Artifact.cpp:83
llvm::Expected< ArtifactEncoding > readArtifactEncoding(llvm::StringRef Path) override
Encoding-flavored counterpart of readArtifact.
Definition Artifact.cpp:101
llvm::Error writeArtifactEncoding(const ArtifactEncoding &E, llvm::StringRef Path) override
Encoding-flavored counterpart of writeArtifact.
Definition Artifact.cpp:188
llvm::Expected< MultiArchSharedLibrary > readMultiArchSharedLibrary(llvm::StringRef Path) override
llvm::Error writeLUSummary(const LUSummary &Summary, llvm::StringRef Path) override
llvm::Expected< LUSummary > readLUSummary(llvm::StringRef Path) override
Definition LUSummary.cpp:22
llvm::Expected< WPASuite > readWPASuite(llvm::StringRef Path) override
Definition WPASuite.cpp:122
llvm::function_ref< Object(const EntitySummary &, EntityIdToJSONFn)> SerializerFn
Definition JSONFormat.h:102
llvm::Expected< StaticLibrary > readStaticLibrary(llvm::StringRef Path) override
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:104
llvm::function_ref< llvm::Expected< EntityId >(const Object &)> EntityIdFromJSONFn
Definition JSONFormat.h:99
llvm::Expected< MultiArchStaticLibrary > readMultiArchStaticLibrary(llvm::StringRef Path) override
SerializationFormat::AnalysisResultRegistryGenerator< JSONFormat, AnalysisResultSerializerFn, AnalysisResultDeserializerFn > AnalysisResultRegistry
Definition JSONFormat.h:116
FormatInfoEntry< SerializerFn, DeserializerFn > FormatInfo
Definition JSONFormat.h:108
llvm::Error writeWPASuite(const WPASuite &Suite, llvm::StringRef Path) override
Definition WPASuite.cpp:200
llvm::Error writeMultiArchStaticLibrary(const MultiArchStaticLibrary &M, llvm::StringRef Path) override
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:110
llvm::function_ref< Object(EntityId)> EntityIdToJSONFn
Definition JSONFormat.h:98
llvm::function_ref< llvm::Expected< std::unique_ptr< AnalysisResult > >( const Object &, EntityIdFromJSONFn)> AnalysisResultDeserializerFn
Definition JSONFormat.h:112
llvm::Expected< TUSummaryEncoding > readTUSummaryEncoding(llvm::StringRef Path) override
llvm::Error writeLUSummaryEncoding(const LUSummaryEncoding &SummaryEncoding, llvm::StringRef Path) override
llvm::Error writeMultiArchSharedLibrary(const MultiArchSharedLibrary &M, 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.
llvm::Expected< Artifact > readArtifact(llvm::StringRef Path) override
Generic read entry point.
Definition Artifact.cpp:18
llvm::Error writeStaticLibrary(const StaticLibrary &S, llvm::StringRef Path) override
Represents a link unit summary in its serialized encoding.
Represents a link unit (LU) summary containing merged entity summaries.
Definition LUSummary.h:34
Represents a multi-architecture shared library.
Represents a multi-architecture static library.
Represents a hierarchical sequence of build namespaces.
Per-format plugin registry for analysis result (de)serializers.
Abstract base class for serialization formats.
Represents a static library of translation unit summary encodings.
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:25
Bundles the EntityIdTable (moved from the LUSummary) and the analysis results produced by one Analysi...
Definition WPASuite.h:37
std::variant< TUSummaryEncoding, LUSummaryEncoding, StaticLibrary, MultiArchStaticLibrary, MultiArchSharedLibrary > ArtifactEncoding
Lazily-deserialized counterpart of Artifact: the same on-disk artifacts but with their per-entity sum...
llvm::json::Object Object
std::variant< TUSummary, LUSummary, WPASuite > Artifact
Sum type returned by SerializationFormat::readArtifact, used when the caller does not know up-front w...
@ Result
The result type of a method or function.
Definition TypeBase.h:905