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_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
71 llvm::Expected<WPASuite> readWPASuite(llvm::StringRef Path) override;
72
73 llvm::Error writeWPASuite(const WPASuite &Suite,
74 llvm::StringRef Path) override;
75
77 llvm::function_ref<void(llvm::StringRef Name, llvm::StringRef Desc)>
78 Callback) const override;
79
80 using EntityIdToJSONFn = llvm::function_ref<Object(EntityId)>;
82 llvm::function_ref<llvm::Expected<EntityId>(const Object &)>;
83
85 llvm::function_ref<Object(const EntitySummary &, EntityIdToJSONFn)>;
87 llvm::function_ref<llvm::Expected<std::unique_ptr<EntitySummary>>(
88 const Object &, EntityIdTable &, EntityIdFromJSONFn)>;
89
91
93 llvm::function_ref<Object(const AnalysisResult &, EntityIdToJSONFn)>;
95 llvm::function_ref<llvm::Expected<std::unique_ptr<AnalysisResult>>(
96 const Object &, EntityIdFromJSONFn)>;
97
101
102private:
103 static std::map<SummaryName, FormatInfo> initFormatInfos();
104 const std::map<SummaryName, FormatInfo> FormatInfos = initFormatInfos();
105
106 /// Parses a TUSummary from an already-validated root JSON object. The
107 /// caller is responsible for verifying the self-describing type field
108 /// and for wrapping any returned error with file-path context.
109 llvm::Expected<TUSummary> readTUSummaryFromObject(const Object &Root);
110
111 /// Parses an LUSummary from an already-validated root JSON object. See
112 /// \c readTUSummaryFromObject for caller responsibilities.
113 llvm::Expected<LUSummary> readLUSummaryFromObject(const Object &Root);
114
115 /// Parses a TUSummaryEncoding from an already-validated root JSON
116 /// object. See \c readTUSummaryFromObject for caller responsibilities.
118 readTUSummaryEncodingFromObject(const Object &Root);
119
120 /// Parses an LUSummaryEncoding from an already-validated root JSON
121 /// object. See \c readTUSummaryFromObject for caller responsibilities.
123 readLUSummaryEncodingFromObject(const Object &Root);
124
125 /// Parses a WPASuite from an already-validated root JSON object. See
126 /// \c readTUSummaryFromObject for caller responsibilities.
127 llvm::Expected<WPASuite> readWPASuiteFromObject(const Object &Root);
128
129 EntityId entityIdFromJSON(const uint64_t EntityIdIndex) const;
130 uint64_t entityIdToJSON(EntityId EI) const;
131
133 entityIdFromJSONObject(const Object &EntityIdObject);
134 static Object entityIdToJSONObject(EntityId EI);
135
137 buildNamespaceFromJSON(const Object &BuildNamespaceObject) const;
138 Object buildNamespaceToJSON(const BuildNamespace &BN) const;
139
141 nestedBuildNamespaceFromJSON(const Array &NestedBuildNamespaceArray) const;
142 Array nestedBuildNamespaceToJSON(const NestedBuildNamespace &NBN) const;
143
145 tuEntityNameFromJSON(const Object &EntityNameObject) const;
146 Object tuEntityNameToJSON(const EntityName &EN) const;
147
149 luEntityNameFromJSON(const Object &EntityNameObject) const;
150 Object luEntityNameToJSON(const EntityName &EN) const;
151
153 entityLinkageFromJSON(const Object &EntityLinkageObject) const;
154 Object entityLinkageToJSON(const EntityLinkage &EL) const;
155
157 tuEntityIdTableEntryFromJSON(const Object &EntityIdTableEntryObject) const;
159 tuEntityIdTableFromJSON(const Array &EntityIdTableArray) const;
160 Object tuEntityIdTableEntryToJSON(const EntityName &EN, EntityId EI) const;
161 Array tuEntityIdTableToJSON(const EntityIdTable &IdTable) const;
162
164 luEntityIdTableEntryFromJSON(const Object &EntityIdTableEntryObject) const;
166 luEntityIdTableFromJSON(const Array &EntityIdTableArray) const;
167 Object luEntityIdTableEntryToJSON(const EntityName &EN, EntityId EI) const;
168 Array luEntityIdTableToJSON(const EntityIdTable &IdTable) const;
169
171 linkageTableEntryFromJSON(const Object &LinkageTableEntryObject) const;
172 Object linkageTableEntryToJSON(EntityId EI, const EntityLinkage &EL) const;
173
175 linkageTableFromJSON(const Array &LinkageTableArray,
176 std::set<EntityId> ExpectedIds) const;
177 Array linkageTableToJSON(
178 const std::map<EntityId, EntityLinkage> &LinkageTable) const;
179
181 entitySummaryFromJSON(const SummaryName &SN,
182 const Object &EntitySummaryObject,
183 EntityIdTable &IdTable) const;
184 llvm::Expected<Object> entitySummaryToJSON(const SummaryName &SN,
185 const EntitySummary &ES) const;
186
188 entityDataMapEntryFromJSON(const Object &EntityDataMapEntryObject,
189 const SummaryName &SN,
190 EntityIdTable &IdTable) const;
192 entityDataMapEntryToJSON(const EntityId EI,
193 const std::unique_ptr<EntitySummary> &EntitySummary,
194 const SummaryName &SN) const;
196 entityDataMapFromJSON(const SummaryName &SN, const Array &EntityDataArray,
197 EntityIdTable &IdTable) const;
199 entityDataMapToJSON(const SummaryName &SN,
200 const std::map<EntityId, std::unique_ptr<EntitySummary>>
201 &EntityDataMap) const;
202
203 llvm::Expected<std::pair<SummaryName,
204 std::map<EntityId, std::unique_ptr<EntitySummary>>>>
205 summaryDataMapEntryFromJSON(const Object &SummaryDataObject,
206 EntityIdTable &IdTable) const;
207 llvm::Expected<Object> summaryDataMapEntryToJSON(
208 const SummaryName &SN,
209 const std::map<EntityId, std::unique_ptr<EntitySummary>> &SD) const;
210
212 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
213 summaryDataMapFromJSON(const Array &SummaryDataArray,
214 EntityIdTable &IdTable) const;
215 llvm::Expected<Array> summaryDataMapToJSON(
216 const std::map<SummaryName,
217 std::map<EntityId, std::unique_ptr<EntitySummary>>>
218 &SummaryDataMap) const;
219
221 encodingDataMapEntryFromJSON(const Object &EntityDataMapEntryObject) const;
222 Object encodingDataMapEntryToJSON(
223 EntityId EI,
224 const std::unique_ptr<EntitySummaryEncoding> &Encoding) const;
225
227 encodingDataMapFromJSON(const Array &EntityDataArray) const;
228 Array encodingDataMapToJSON(
229 const std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>
230 &EncodingDataMap) const;
231
232 llvm::Expected<std::pair<
233 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
234 encodingSummaryDataMapEntryFromJSON(
235 const Object &SummaryDataMapEntryObject) const;
236 Object encodingSummaryDataMapEntryToJSON(
237 const SummaryName &SN,
238 const std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>
239 &EncodingMap) const;
240
241 llvm::Expected<std::map<
242 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
243 encodingSummaryDataMapFromJSON(const Array &SummaryDataArray) const;
244 Array encodingSummaryDataMapToJSON(
245 const std::map<SummaryName,
246 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
247 &EncodingSummaryDataMap) const;
248
250 analysisResultMapEntryFromJSON(const Object &Entry) const;
251 llvm::Expected<Object> analysisResultMapEntryToJSON(
252 const AnalysisName &Name,
253 const std::unique_ptr<AnalysisResult> &Result) const;
254
256 analysisResultMapFromJSON(const Array &ResultsArray) const;
257 llvm::Expected<Array> analysisResultMapToJSON(
258 const std::map<AnalysisName, std::unique_ptr<AnalysisResult>> &Data)
259 const;
260};
261
262} // namespace clang::ssaf
263
264LLVM_DECLARE_REGISTRY(llvm::Registry<clang::ssaf::JSONFormat::FormatInfo>)
265LLVM_DECLARE_REGISTRY(
266 llvm::Registry<clang::ssaf::JSONFormat::AnalysisResultRegistry::Codec>)
267
268#endif // LLVM_CLANG_SCALABLESTATICANALYSIS_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: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:156
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:84
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:86
llvm::function_ref< llvm::Expected< EntityId >(const Object &)> EntityIdFromJSONFn
Definition JSONFormat.h:81
SerializationFormat::AnalysisResultRegistryGenerator< JSONFormat, AnalysisResultSerializerFn, AnalysisResultDeserializerFn > AnalysisResultRegistry
Definition JSONFormat.h:98
FormatInfoEntry< SerializerFn, DeserializerFn > FormatInfo
Definition JSONFormat.h:90
llvm::Error writeWPASuite(const WPASuite &Suite, llvm::StringRef Path) override
Definition WPASuite.cpp:200
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:92
llvm::function_ref< Object(EntityId)> EntityIdToJSONFn
Definition JSONFormat.h:80
llvm::function_ref< llvm::Expected< std::unique_ptr< AnalysisResult > >( const Object &, EntityIdFromJSONFn)> AnalysisResultDeserializerFn
Definition JSONFormat.h:94
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.
llvm::Expected< Artifact > readArtifact(llvm::StringRef Path) override
Generic read entry point.
Definition Artifact.cpp:18
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 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:25
Bundles the EntityIdTable (moved from the LUSummary) and the analysis results produced by one Analysi...
Definition WPASuite.h:37
std::variant< TUSummaryEncoding, LUSummaryEncoding > 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