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 CLANG_ANALYSIS_SCALABLE_SERIALIZATION_JSONFORMAT_H
14#define CLANG_ANALYSIS_SCALABLE_SERIALIZATION_JSONFORMAT_H
15
18#include "llvm/ADT/STLFunctionalExtras.h"
19#include "llvm/Support/JSON.h"
20#include "llvm/Support/Registry.h"
21
22namespace clang::ssaf {
23
24class EntityIdTable;
25class EntitySummary;
26class SummaryName;
27
28class JSONFormat final : public SerializationFormat {
29 using Array = llvm::json::Array;
30 using Object = llvm::json::Object;
31
32public:
33 // Helper class to provide limited access to EntityId conversion methods.
34 // Only exposes EntityId serialization/deserialization to format handlers.
35 class EntityIdConverter {
36 public:
37 EntityId fromJSON(uint64_t EntityIdIndex) const {
38 return Format.entityIdFromJSON(EntityIdIndex);
39 }
40
41 uint64_t toJSON(EntityId EI) const { return Format.entityIdToJSON(EI); }
42
43 private:
44 friend class JSONFormat;
45 EntityIdConverter(const JSONFormat &Format) : Format(Format) {}
46 const JSONFormat &Format;
47 };
48
49 llvm::Expected<TUSummary> readTUSummary(llvm::StringRef Path) override;
50
51 llvm::Error writeTUSummary(const TUSummary &Summary,
52 llvm::StringRef Path) override;
53
54 using SerializerFn = llvm::function_ref<Object(const EntitySummary &,
55 const EntityIdConverter &)>;
57 llvm::function_ref<llvm::Expected<std::unique_ptr<EntitySummary>>(
58 const Object &, EntityIdTable &, const EntityIdConverter &)>;
59
61
62private:
63 static std::map<SummaryName, FormatInfo> initFormatInfos();
64 const std::map<SummaryName, FormatInfo> FormatInfos = initFormatInfos();
65
66 EntityId entityIdFromJSON(const uint64_t EntityIdIndex) const;
67 uint64_t entityIdToJSON(EntityId EI) const;
68
70 buildNamespaceKindFromJSON(llvm::StringRef BuildNamespaceKindStr) const;
71
73 buildNamespaceFromJSON(const Object &BuildNamespaceObject) const;
74 Object buildNamespaceToJSON(const BuildNamespace &BN) const;
75
77 nestedBuildNamespaceFromJSON(const Array &NestedBuildNamespaceArray) const;
78 Array nestedBuildNamespaceToJSON(const NestedBuildNamespace &NBN) const;
79
81 entityNameFromJSON(const Object &EntityNameObject) const;
82 Object entityNameToJSON(const EntityName &EN) const;
83
85 entityIdTableEntryFromJSON(const Object &EntityIdTableEntryObject) const;
87 entityIdTableFromJSON(const Array &EntityIdTableArray) const;
88 Object entityIdTableEntryToJSON(const EntityName &EN, EntityId EI) const;
89 Array entityIdTableToJSON(const EntityIdTable &IdTable) const;
90
92 entitySummaryFromJSON(const SummaryName &SN,
93 const Object &EntitySummaryObject,
94 EntityIdTable &IdTable) const;
95 llvm::Expected<Object> entitySummaryToJSON(const SummaryName &SN,
96 const EntitySummary &ES) const;
97
99 entityDataMapEntryFromJSON(const Object &EntityDataMapEntryObject,
100 const SummaryName &SN,
101 EntityIdTable &IdTable) const;
103 entityDataMapFromJSON(const SummaryName &SN, const Array &EntityDataArray,
104 EntityIdTable &IdTable) const;
106 entityDataMapToJSON(const SummaryName &SN,
107 const std::map<EntityId, std::unique_ptr<EntitySummary>>
108 &EntityDataMap) const;
109
110 llvm::Expected<std::pair<SummaryName,
111 std::map<EntityId, std::unique_ptr<EntitySummary>>>>
112 summaryDataMapEntryFromJSON(const Object &SummaryDataObject,
113 EntityIdTable &IdTable) const;
114 llvm::Expected<Object> summaryDataMapEntryToJSON(
115 const SummaryName &SN,
116 const std::map<EntityId, std::unique_ptr<EntitySummary>> &SD) const;
117
119 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
120 summaryDataMapFromJSON(const Array &SummaryDataArray,
121 EntityIdTable &IdTable) const;
122 llvm::Expected<Array> summaryDataMapToJSON(
123 const std::map<SummaryName,
124 std::map<EntityId, std::unique_ptr<EntitySummary>>>
125 &SummaryDataMap) const;
126};
127
128} // namespace clang::ssaf
129
130namespace llvm {
131extern template class CLANG_TEMPLATE_ABI
132 Registry<clang::ssaf::JSONFormat::FormatInfo>;
133} // namespace llvm
134
135#endif // CLANG_ANALYSIS_SCALABLE_SERIALIZATION_JSONFORMAT_H
llvm::json::Object Object
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
Uniquely identifies an entity in a program.
Definition EntityName.h:28
Base class for analysis-specific summary data.
EntityId fromJSON(uint64_t EntityIdIndex) const
Definition JSONFormat.h:37
uint64_t toJSON(EntityId EI) const
Definition JSONFormat.h:41
llvm::function_ref< llvm::Expected< std::unique_ptr< EntitySummary > >( const Object &, EntityIdTable &, const EntityIdConverter &)> DeserializerFn
Definition JSONFormat.h:56
llvm::Expected< TUSummary > readTUSummary(llvm::StringRef Path) override
FormatInfoEntry< SerializerFn, DeserializerFn > FormatInfo
Definition JSONFormat.h:60
llvm::function_ref< Object(const EntitySummary &, const EntityIdConverter &)> SerializerFn
Definition JSONFormat.h:54
llvm::Error writeTUSummary(const TUSummary &Summary, llvm::StringRef Path) override
Represents a hierarchical sequence of build namespaces.
Abstract base class for serialization formats.
Uniquely identifies an analysis summary.
Definition SummaryName.h:22
Data extracted for a given translation unit and for a given set of analyses.
Definition TUSummary.h:24
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30