12#include "llvm/Support/Registry.h"
17LLVM_INSTANTIATE_REGISTRY(
20static clang::ssaf::SerializationFormatRegistry::Add<clang::ssaf::JSONFormat>
21 RegisterJSONFormat(
"json",
"JSON serialization format");
30 if (!llvm::sys::fs::exists(Path)) {
37 if (llvm::sys::fs::is_directory(Path)) {
52 auto BufferOrError = llvm::MemoryBuffer::getFile(Path);
54 const std::error_code EC = BufferOrError.getError();
60 return llvm::json::parse(BufferOrError.get()->getBuffer());
64 if (llvm::sys::fs::exists(Path)) {
71 llvm::StringRef Dir = llvm::sys::path::parent_path(Path);
72 if (!Dir.empty() && !llvm::sys::fs::is_directory(Dir)) {
88 llvm::raw_fd_ostream OutStream(Path, EC, llvm::sys::fs::OF_Text);
96 OutStream << llvm::formatv(
"{0:2}\n",
V);
102 if (OutStream.has_error()) {
105 OutStream.error().message())
109 return llvm::Error::success();
116std::map<SummaryName, JSONFormat::FormatInfo> JSONFormat::initFormatInfos() {
117 std::map<SummaryName, FormatInfo> FormatInfos;
118 for (
const auto &FormatInfoEntry : llvm::Registry<FormatInfo>::entries()) {
119 std::unique_ptr<FormatInfo> Info = FormatInfoEntry.instantiate();
120 bool Inserted = FormatInfos.try_emplace(Info->ForSummary, *Info).second;
122 llvm::report_fatal_error(
123 "FormatInfo is already registered for summary: " +
124 Info->ForSummary.str());
131 llvm::function_ref<
void(llvm::StringRef, llvm::StringRef)> Callback)
const {
132 for (
const auto &Entry : llvm::Registry<FormatInfo>::entries())
133 Callback(Entry.getName(), Entry.getDesc());
160EntityId JSONFormat::entityIdFromJSON(
const uint64_t EntityIdIndex)
const {
161 return makeEntityId(
static_cast<size_t>(EntityIdIndex));
164uint64_t JSONFormat::entityIdToJSON(EntityId EI)
const {
165 return static_cast<uint64_t
>(
getIndex(EI));
168llvm::Expected<EntityId>
169JSONFormat::entityIdFromJSONObject(
const Object &EntityIdObject) {
170 if (EntityIdObject.size() != 1) {
185 std::optional<uint64_t> OptEntityIdIndex = AtVal->getAsUINT64();
186 if (!OptEntityIdIndex) {
193 return makeEntityId(
static_cast<size_t>(*OptEntityIdIndex));
206llvm::Expected<BuildNamespaceKind>
208 auto OptBuildNamespaceKind =
210 if (!OptBuildNamespaceKind) {
213 BuildNamespaceKindStr)
216 return *OptBuildNamespaceKind;
229JSONFormat::buildNamespaceFromJSON(
const Object &BuildNamespaceObject)
const {
230 auto OptBuildNamespaceKindStr = BuildNamespaceObject.getString(
"kind");
231 if (!OptBuildNamespaceKindStr) {
234 "BuildNamespaceKind",
"kind",
"string")
245 auto OptNameStr = BuildNamespaceObject.getString(
"name");
249 "BuildNamespaceName",
"name",
"string")
253 return {BuildNamespace(*ExpectedKind, *OptNameStr)};
267llvm::Expected<NestedBuildNamespace> JSONFormat::nestedBuildNamespaceFromJSON(
268 const Array &NestedBuildNamespaceArray)
const {
269 std::vector<BuildNamespace> Namespaces;
271 size_t NamespaceCount = NestedBuildNamespaceArray.size();
272 Namespaces.reserve(NamespaceCount);
274 for (
const auto &[Index, BuildNamespaceValue] :
275 llvm::enumerate(NestedBuildNamespaceArray)) {
276 const Object *BuildNamespaceObject = BuildNamespaceValue.getAsObject();
277 if (!BuildNamespaceObject) {
280 "BuildNamespace", Index,
"object")
284 auto ExpectedBuildNamespace = buildNamespaceFromJSON(*BuildNamespaceObject);
285 if (!ExpectedBuildNamespace) {
291 Namespaces.push_back(std::move(*ExpectedBuildNamespace));
294 return NestedBuildNamespace(std::move(Namespaces));
297Array JSONFormat::nestedBuildNamespaceToJSON(
300 const auto &Namespaces = getNamespaces(NBN);
301 Result.reserve(Namespaces.size());
303 for (
const auto &BN : Namespaces) {
304 Result.push_back(buildNamespaceToJSON(BN));
314llvm::Expected<EntityName>
315JSONFormat::entityNameFromJSON(
const Object &EntityNameObject)
const {
316 const auto OptUSR = EntityNameObject.getString(
"usr");
324 const auto OptSuffix = EntityNameObject.getString(
"suffix");
328 "Suffix",
"suffix",
"string")
332 const Array *OptNamespaceArray = EntityNameObject.getArray(
"namespace");
333 if (!OptNamespaceArray) {
336 "NestedBuildNamespace",
"namespace",
"array")
340 auto ExpectedNamespace = nestedBuildNamespaceFromJSON(*OptNamespaceArray);
341 if (!ExpectedNamespace) {
348 return EntityName{*OptUSR, *OptSuffix, std::move(*ExpectedNamespace)};
354 Result[
"suffix"] = getSuffix(EN);
355 Result[
"namespace"] = nestedBuildNamespaceToJSON(getNamespace(EN));
363llvm::Expected<EntityLinkageType>
366 if (!OptEntityLinkageType) {
369 EntityLinkageTypeStr)
372 return *OptEntityLinkageType;
385JSONFormat::entityLinkageFromJSON(
const Object &EntityLinkageObject)
const {
386 auto OptLinkageStr = EntityLinkageObject.getString(
"type");
387 if (!OptLinkageStr) {
390 "EntityLinkageType",
"type",
"string")
395 if (!ExpectedLinkageType) {
401 return EntityLinkage(*ExpectedLinkageType);
414llvm::Expected<std::pair<EntityName, EntityId>>
415JSONFormat::entityIdTableEntryFromJSON(
416 const Object &EntityIdTableEntryObject)
const {
418 const Object *OptEntityNameObject =
419 EntityIdTableEntryObject.getObject(
"name");
420 if (!OptEntityNameObject) {
423 "EntityName",
"name",
"object")
427 auto ExpectedEntityName = entityNameFromJSON(*OptEntityNameObject);
428 if (!ExpectedEntityName) {
434 const Value *EntityIdIntValue = EntityIdTableEntryObject.get(
"id");
435 if (!EntityIdIntValue) {
439 "number (unsigned 64-bit integer)")
443 const std::optional<uint64_t> OptEntityIdInt =
444 EntityIdIntValue->getAsUINT64();
445 if (!OptEntityIdInt) {
449 "number (unsigned 64-bit integer)")
453 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
455 return std::make_pair(std::move(*ExpectedEntityName), std::move(EI));
461 Entry[
"id"] = entityIdToJSON(EI);
462 Entry[
"name"] = entityNameToJSON(EN);
470llvm::Expected<EntityIdTable>
471JSONFormat::entityIdTableFromJSON(
const Array &EntityIdTableArray)
const {
472 EntityIdTable IdTable;
473 std::map<EntityName, EntityId> &Entities = getEntities(IdTable);
475 for (
const auto &[Index, EntityIdTableEntryValue] :
476 llvm::enumerate(EntityIdTableArray)) {
477 const Object *OptEntityIdTableEntryObject =
478 EntityIdTableEntryValue.getAsObject();
479 if (!OptEntityIdTableEntryObject) {
482 "EntityIdTable entry", Index,
"object")
486 auto ExpectedEntityIdTableEntry =
487 entityIdTableEntryFromJSON(*OptEntityIdTableEntryObject);
488 if (!ExpectedEntityIdTableEntry) {
495 auto [EntityIt, EntityInserted] =
496 Entities.emplace(std::move(*ExpectedEntityIdTableEntry));
497 if (!EntityInserted) {
500 "EntityIdTable entry", Index,
510 Array EntityIdTableArray;
511 const auto &Entities = getEntities(IdTable);
512 EntityIdTableArray.reserve(Entities.size());
514 for (
const auto &[EntityName, EntityId] : Entities) {
515 EntityIdTableArray.push_back(
516 entityIdTableEntryToJSON(EntityName, EntityId));
519 return EntityIdTableArray;
526llvm::Expected<std::pair<EntityId, EntityLinkage>>
527JSONFormat::linkageTableEntryFromJSON(
528 const Object &LinkageTableEntryObject)
const {
529 const Value *EntityIdIntValue = LinkageTableEntryObject.get(
"id");
530 if (!EntityIdIntValue) {
534 "number (unsigned 64-bit integer)")
538 const std::optional<uint64_t> OptEntityIdInt =
539 EntityIdIntValue->getAsUINT64();
540 if (!OptEntityIdInt) {
544 "number (unsigned 64-bit integer)")
548 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
550 const Object *OptEntityLinkageObject =
551 LinkageTableEntryObject.getObject(
"linkage");
552 if (!OptEntityLinkageObject) {
555 "EntityLinkage",
"linkage",
"object")
559 auto ExpectedEntityLinkage = entityLinkageFromJSON(*OptEntityLinkageObject);
560 if (!ExpectedEntityLinkage) {
566 return std::make_pair(std::move(EI), std::move(*ExpectedEntityLinkage));
572 Entry[
"id"] = entityIdToJSON(EI);
573 Entry[
"linkage"] = entityLinkageToJSON(EL);
585llvm::Expected<std::map<EntityId, EntityLinkage>>
586JSONFormat::linkageTableFromJSON(
const Array &LinkageTableArray,
587 std::set<EntityId> ExpectedIds)
const {
588 std::map<EntityId, EntityLinkage> LinkageTable;
590 for (
const auto &[Index, LinkageTableEntryValue] :
591 llvm::enumerate(LinkageTableArray)) {
592 const Object *OptLinkageTableEntryObject =
593 LinkageTableEntryValue.getAsObject();
594 if (!OptLinkageTableEntryObject) {
597 "LinkageTable entry", Index,
"object")
601 auto ExpectedLinkageTableEntry =
602 linkageTableEntryFromJSON(*OptLinkageTableEntryObject);
603 if (!ExpectedLinkageTableEntry) {
609 const EntityId EI = ExpectedLinkageTableEntry->first;
611 auto [It, Inserted] =
612 LinkageTable.insert(std::move(*ExpectedLinkageTableEntry));
616 "LinkageTable entry", Index, It->first)
620 if (ExpectedIds.erase(EI) == 0) {
622 std::errc::invalid_argument,
629 if (!ExpectedIds.empty()) {
631 std::errc::invalid_argument,
633 *ExpectedIds.begin())
640Array JSONFormat::linkageTableToJSON(
641 const std::map<EntityId, EntityLinkage> &LinkageTable)
const {
643 Result.reserve(LinkageTable.size());
645 for (
const auto &[EI, EL] : LinkageTable) {
646 Result.push_back(linkageTableEntryToJSON(EI, EL));
656llvm::Expected<std::unique_ptr<EntitySummary>>
657JSONFormat::entitySummaryFromJSON(
const SummaryName &SN,
658 const Object &EntitySummaryObject,
660 auto InfoIt = FormatInfos.find(SN);
661 if (InfoIt == FormatInfos.end()) {
663 std::errc::invalid_argument,
668 const auto &InfoEntry = InfoIt->second;
669 assert(InfoEntry.ForSummary == SN);
671 return InfoEntry.Deserialize(EntitySummaryObject, IdTable,
672 entityIdFromJSONObject);
675llvm::Expected<Object>
676JSONFormat::entitySummaryToJSON(
const SummaryName &SN,
678 auto InfoIt = FormatInfos.find(SN);
679 if (InfoIt == FormatInfos.end()) {
681 std::errc::invalid_argument,
686 const auto &InfoEntry = InfoIt->second;
687 assert(InfoEntry.ForSummary == SN);
689 return InfoEntry.Serialize(ES, entityIdToJSONObject);
696llvm::Expected<std::pair<EntityId, std::unique_ptr<EntitySummary>>>
697JSONFormat::entityDataMapEntryFromJSON(
const Object &EntityDataMapEntryObject,
701 const Value *EntityIdIntValue = EntityDataMapEntryObject.get(
"entity_id");
702 if (!EntityIdIntValue) {
705 "EntityId",
"entity_id",
706 "number (unsigned 64-bit integer)")
710 const std::optional<uint64_t> OptEntityIdInt =
711 EntityIdIntValue->getAsUINT64();
712 if (!OptEntityIdInt) {
715 "EntityId",
"entity_id",
716 "number (unsigned 64-bit integer)")
720 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
722 const Object *OptEntitySummaryObject =
723 EntityDataMapEntryObject.getObject(
"entity_summary");
724 if (!OptEntitySummaryObject) {
727 "EntitySummary",
"entity_summary",
"object")
731 auto ExpectedEntitySummary =
732 entitySummaryFromJSON(SN, *OptEntitySummaryObject, IdTable);
733 if (!ExpectedEntitySummary) {
740 if (*ExpectedEntitySummary ==
nullptr) {
742 std::errc::invalid_argument,
747 auto ActualSN = (*ExpectedEntitySummary)->getSummaryName();
748 if (SN != ActualSN) {
750 std::errc::invalid_argument,
752 FailedToDeserializeEntitySummaryMismatchedSummaryName,
757 return std::make_pair(std::move(EI), std::move(*ExpectedEntitySummary));
760llvm::Expected<Object> JSONFormat::entityDataMapEntryToJSON(
765 Entry[
"entity_id"] = entityIdToJSON(EI);
767 if (!EntitySummary) {
772 const auto ActualSN = EntitySummary->getSummaryName();
773 if (SN != ActualSN) {
779 auto ExpectedEntitySummaryObject = entitySummaryToJSON(SN, *EntitySummary);
780 if (!ExpectedEntitySummaryObject) {
787 Entry[
"entity_summary"] = std::move(*ExpectedEntitySummaryObject);
796llvm::Expected<std::map<EntityId, std::unique_ptr<EntitySummary>>>
797JSONFormat::entityDataMapFromJSON(
const SummaryName &SN,
798 const Array &EntityDataArray,
800 std::map<EntityId, std::unique_ptr<EntitySummary>> EntityDataMap;
802 for (
const auto &[Index, EntityDataMapEntryValue] :
803 llvm::enumerate(EntityDataArray)) {
804 const Object *OptEntityDataMapEntryObject =
805 EntityDataMapEntryValue.getAsObject();
806 if (!OptEntityDataMapEntryObject) {
809 "EntitySummary entry", Index,
"object")
813 auto ExpectedEntityDataMapEntry =
814 entityDataMapEntryFromJSON(*OptEntityDataMapEntryObject, SN, IdTable);
815 if (!ExpectedEntityDataMapEntry) {
822 auto [DataIt, DataInserted] =
823 EntityDataMap.insert(std::move(*ExpectedEntityDataMapEntry));
827 "EntitySummary entry", Index, DataIt->first)
832 return std::move(EntityDataMap);
835llvm::Expected<Array> JSONFormat::entityDataMapToJSON(
837 const std::map<
EntityId, std::unique_ptr<EntitySummary>> &EntityDataMap)
840 Result.reserve(EntityDataMap.size());
842 for (
const auto &[Index, EntityDataMapEntry] :
843 llvm::enumerate(EntityDataMap)) {
844 const auto &[EntityId, EntitySummary] = EntityDataMapEntry;
846 auto ExpectedEntityDataMapEntryObject =
847 entityDataMapEntryToJSON(EntityId, EntitySummary, SN);
849 if (!ExpectedEntityDataMapEntryObject) {
855 Result.push_back(std::move(*ExpectedEntityDataMapEntryObject));
866 std::pair<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
867JSONFormat::summaryDataMapEntryFromJSON(
const Object &SummaryDataMapEntryObject,
870 std::optional<llvm::StringRef> OptSummaryNameStr =
871 SummaryDataMapEntryObject.getString(
"summary_name");
872 if (!OptSummaryNameStr) {
875 "SummaryName",
"summary_name",
"string")
881 const Array *OptEntityDataArray =
882 SummaryDataMapEntryObject.getArray(
"summary_data");
883 if (!OptEntityDataArray) {
886 "EntitySummary entries",
"summary_data",
891 auto ExpectedEntityDataMap =
892 entityDataMapFromJSON(SN, *OptEntityDataArray, IdTable);
893 if (!ExpectedEntityDataMap) {
900 return std::make_pair(std::move(SN), std::move(*ExpectedEntityDataMap));
903llvm::Expected<Object> JSONFormat::summaryDataMapEntryToJSON(
905 const std::map<
EntityId, std::unique_ptr<EntitySummary>> &SD)
const {
910 auto ExpectedSummaryDataArray = entityDataMapToJSON(SN, SD);
911 if (!ExpectedSummaryDataArray) {
918 Result[
"summary_data"] = std::move(*ExpectedSummaryDataArray);
928 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
929JSONFormat::summaryDataMapFromJSON(
const Array &SummaryDataArray,
931 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>
934 for (
const auto &[Index, SummaryDataMapEntryValue] :
935 llvm::enumerate(SummaryDataArray)) {
936 const Object *OptSummaryDataMapEntryObject =
937 SummaryDataMapEntryValue.getAsObject();
938 if (!OptSummaryDataMapEntryObject) {
941 "SummaryData entry", Index,
"object")
945 auto ExpectedSummaryDataMapEntry =
946 summaryDataMapEntryFromJSON(*OptSummaryDataMapEntryObject, IdTable);
947 if (!ExpectedSummaryDataMapEntry) {
953 auto [SummaryIt, SummaryInserted] =
954 SummaryDataMap.emplace(std::move(*ExpectedSummaryDataMapEntry));
955 if (!SummaryInserted) {
958 "SummaryData entry", Index, SummaryIt->first)
963 return std::move(SummaryDataMap);
966llvm::Expected<Array> JSONFormat::summaryDataMapToJSON(
968 std::map<
EntityId, std::unique_ptr<EntitySummary>>>
969 &SummaryDataMap)
const {
971 Result.reserve(SummaryDataMap.size());
973 for (
const auto &[Index, SummaryDataMapEntry] :
974 llvm::enumerate(SummaryDataMap)) {
975 const auto &[SummaryName, DataMap] = SummaryDataMapEntry;
977 auto ExpectedSummaryDataMapObject =
978 summaryDataMapEntryToJSON(SummaryName, DataMap);
979 if (!ExpectedSummaryDataMapObject) {
985 Result.push_back(std::move(*ExpectedSummaryDataMapObject));
995llvm::Expected<std::pair<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
996JSONFormat::encodingDataMapEntryFromJSON(
997 const Object &EntityDataMapEntryObject)
const {
998 const Value *EntityIdIntValue = EntityDataMapEntryObject.get(
"entity_id");
999 if (!EntityIdIntValue) {
1002 "EntityId",
"entity_id",
1003 "number (unsigned 64-bit integer)")
1007 const std::optional<uint64_t> OptEntityIdInt =
1008 EntityIdIntValue->getAsUINT64();
1009 if (!OptEntityIdInt) {
1012 "EntityId",
"entity_id",
1013 "number (unsigned 64-bit integer)")
1017 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
1019 const Object *OptEntitySummaryObject =
1020 EntityDataMapEntryObject.getObject(
"entity_summary");
1021 if (!OptEntitySummaryObject) {
1024 "EntitySummary",
"entity_summary",
"object")
1028 std::unique_ptr<EntitySummaryEncoding>
Encoding(
1031 return std::make_pair(std::move(EI), std::move(Encoding));
1034Object JSONFormat::encodingDataMapEntryToJSON(
1035 EntityId EI,
const std::unique_ptr<EntitySummaryEncoding> &Encoding)
const {
1037 Entry[
"entity_id"] = entityIdToJSON(EI);
1044 Entry[
"entity_summary"] = JSONEncoding->Data;
1053llvm::Expected<std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1054JSONFormat::encodingDataMapFromJSON(
const Array &EntityDataArray)
const {
1055 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>> EncodingDataMap;
1057 for (
const auto &[Index, EntityDataMapEntryValue] :
1058 llvm::enumerate(EntityDataArray)) {
1059 const Object *OptEntityDataMapEntryObject =
1060 EntityDataMapEntryValue.getAsObject();
1061 if (!OptEntityDataMapEntryObject) {
1064 "EntitySummary entry", Index,
"object")
1068 auto ExpectedEntry =
1069 encodingDataMapEntryFromJSON(*OptEntityDataMapEntryObject);
1070 if (!ExpectedEntry) {
1077 auto [DataIt, DataInserted] =
1078 EncodingDataMap.insert(std::move(*ExpectedEntry));
1079 if (!DataInserted) {
1082 "EntitySummary entry", Index, DataIt->first)
1087 return std::move(EncodingDataMap);
1090Array JSONFormat::encodingDataMapToJSON(
1091 const std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>
1092 &EncodingDataMap)
const {
1094 Result.reserve(EncodingDataMap.size());
1096 for (
const auto &[EI, Encoding] : EncodingDataMap) {
1097 Result.push_back(encodingDataMapEntryToJSON(EI, Encoding));
1107llvm::Expected<std::pair<
1108 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
1109JSONFormat::encodingSummaryDataMapEntryFromJSON(
1110 const Object &SummaryDataMapEntryObject)
const {
1111 std::optional<llvm::StringRef> OptSummaryNameStr =
1112 SummaryDataMapEntryObject.getString(
"summary_name");
1113 if (!OptSummaryNameStr) {
1116 "SummaryName",
"summary_name",
"string")
1122 const Array *OptEntityDataArray =
1123 SummaryDataMapEntryObject.getArray(
"summary_data");
1124 if (!OptEntityDataArray) {
1127 "EntitySummary entries",
"summary_data",
1132 auto ExpectedEncodingDataMap = encodingDataMapFromJSON(*OptEntityDataArray);
1133 if (!ExpectedEncodingDataMap) {
1140 return std::make_pair(std::move(SN), std::move(*ExpectedEncodingDataMap));
1143Object JSONFormat::encodingSummaryDataMapEntryToJSON(
1145 const std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>
1146 &EncodingMap)
const {
1150 Result[
"summary_data"] = encodingDataMapToJSON(EncodingMap);
1159llvm::Expected<std::map<
1160 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
1161JSONFormat::encodingSummaryDataMapFromJSON(
1162 const Array &SummaryDataArray)
const {
1163 std::map<SummaryName,
1164 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1165 EncodingSummaryDataMap;
1167 for (
const auto &[Index, SummaryDataMapEntryValue] :
1168 llvm::enumerate(SummaryDataArray)) {
1169 const Object *OptSummaryDataMapEntryObject =
1170 SummaryDataMapEntryValue.getAsObject();
1171 if (!OptSummaryDataMapEntryObject) {
1174 "SummaryData entry", Index,
"object")
1178 auto ExpectedEntry =
1179 encodingSummaryDataMapEntryFromJSON(*OptSummaryDataMapEntryObject);
1180 if (!ExpectedEntry) {
1186 auto [SummaryIt, SummaryInserted] =
1187 EncodingSummaryDataMap.emplace(std::move(*ExpectedEntry));
1188 if (!SummaryInserted) {
1191 "SummaryData entry", Index, SummaryIt->first)
1196 return std::move(EncodingSummaryDataMap);
1199Array JSONFormat::encodingSummaryDataMapToJSON(
1201 std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1202 &EncodingSummaryDataMap)
const {
1204 Result.reserve(EncodingSummaryDataMap.size());
1206 for (
const auto &[SN, EncodingMap] : EncodingSummaryDataMap) {
1207 Result.push_back(encodingSummaryDataMapEntryToJSON(SN, EncodingMap));
static std::optional< NonLoc > getIndex(ProgramStateRef State, const ElementRegion *ER, CharKind CK)
static Decl::Kind getKind(const Decl *D)
static std::string getUSR(const Decl *D)
volatile int SSAFJSONFormatAnchorSource
llvm::json::Object Object
Uniquely identifies a whole-program analysis and the AnalysisResult it produces.
llvm::StringRef str() const
Explicit conversion to the underlying string representation.
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.
Represents the linkage properties of an entity in the program model.
Uniquely identifies an entity in a program.
Base class for analysis-specific summary data.
static ErrorBuilder create(std::error_code EC, const char *Fmt, Args &&...ArgVals)
Create an ErrorBuilder with an error code and formatted message.
static void fatal(const char *Fmt, Args &&...ArgVals)
Report a fatal error with formatted message and terminate execution.
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.
Represents a hierarchical sequence of build namespaces.
Uniquely identifies an analysis summary.
llvm::StringRef str() const
Explicit conversion to the underlying string representation.
StringRef getName(const HeaderType T)
constexpr const char * FailedToSerializeEntitySummaryMismatchedSummaryName
constexpr const char * InvalidBuildNamespaceKind
constexpr const char * ReadingFromField
constexpr const char * FailedToReadObjectAtIndex
constexpr const char * FailedToDeserializeEntitySummaryNoFormatInfo
constexpr const char * InvalidEntityLinkageType
constexpr const char * FileIsDirectory
constexpr const char * FileNotFound
constexpr const char * FailedToReadObjectAtField
constexpr const char * FileExists
constexpr const char * FailedToReadEntityIdObject
constexpr const char * ReadingFromIndex
constexpr const char * WritingToField
constexpr const char * FailedInsertionOnDuplication
constexpr const char * FailedToDeserializeLinkageTableExtraId
constexpr const char * FailedToSerializeEntitySummaryMissingData
constexpr const char * FailedToDeserializeEntitySummaryMissingData
constexpr const char * FailedToWriteFile
constexpr const char * FailedToDeserializeLinkageTableMissingId
constexpr const char * FileIsNotJSON
constexpr const char * FailedToReadFile
constexpr const char * ParentDirectoryNotFound
constexpr const char * FailedToSerializeEntitySummaryNoFormatInfo
constexpr const char * WritingToIndex
SummaryName summaryNameFromJSON(llvm::StringRef SummaryNameStr)
llvm::StringRef summaryNameToJSON(const SummaryName &SN)
std::optional< EntityLinkageType > entityLinkageTypeFromString(llvm::StringRef Str)
Parses a string produced by entityLinkageTypeToString().
std::optional< BuildNamespaceKind > buildNamespaceKindFromString(llvm::StringRef Str)
Parses a string produced by buildNamespaceKindToString().
llvm::Expected< EntityLinkageType > entityLinkageTypeFromJSON(llvm::StringRef EntityLinkageTypeStr)
constexpr const char * JSONEntityIdKey
An entity ID is encoded as the single-key object {"@": <index>}.
llvm::StringRef analysisNameToJSON(const AnalysisName &AN)
AnalysisName analysisNameFromJSON(llvm::StringRef AnalysisNameStr)
llvm::Expected< BuildNamespaceKind > buildNamespaceKindFromJSON(llvm::StringRef BuildNamespaceKindStr)
llvm::json::Object Object
llvm::Expected< Value > readJSON(llvm::StringRef Path)
constexpr const char * JSONFormatFileExtension
llvm::StringRef buildNamespaceKindToJSON(BuildNamespaceKind BNK)
llvm::StringRef entityLinkageTypeToJSON(EntityLinkageType LT)
llvm::Error writeJSON(Value &&V, llvm::StringRef Path)
llvm::StringRef buildNamespaceKindToString(BuildNamespaceKind BNK)
Returns the canonical string representation of BNK used for serialization and display (e....
llvm::StringRef entityLinkageTypeToString(EntityLinkageType LT)
Returns the canonical string representation of LT used for serialization and display (e....
@ Result
The result type of a method or function.
template class CLANG_TEMPLATE_ABI Registry< clang::ssaf::JSONFormat::FormatInfo >
template class CLANG_TEMPLATE_ABI Registry< clang::ssaf::JSONFormat::AnalysisResultRegistry::Codec >