12#include "llvm/Support/Registry.h"
16LLVM_DEFINE_REGISTRY(llvm::Registry<clang::ssaf::JSONFormat::FormatInfo>)
18 llvm::Registry<clang::ssaf::JSONFormat::AnalysisResultRegistry::Codec>)
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));
316static llvm::Expected<std::pair<llvm::StringRef, llvm::StringRef>>
318 const auto OptUSR = EntityNameObject.getString(
"usr");
326 const auto OptSuffix = EntityNameObject.getString(
"suffix");
330 "Suffix",
"suffix",
"string")
334 return std::make_pair(*OptUSR, *OptSuffix);
338JSONFormat::tuEntityNameFromJSON(
const Object &EntityNameObject)
const {
341 return ExpectedCore.takeError();
343 auto [USR, Suffix] = *ExpectedCore;
344 return EntityName{USR, Suffix, NestedBuildNamespace()};
350 Result[
"suffix"] = getSuffix(EN);
354llvm::Expected<EntityName>
355JSONFormat::luEntityNameFromJSON(
const Object &EntityNameObject)
const {
358 return ExpectedCore.takeError();
360 auto [USR, Suffix] = *ExpectedCore;
362 const Array *OptNamespaceArray = EntityNameObject.getArray(
"namespace");
363 if (!OptNamespaceArray) {
366 "NestedBuildNamespace",
"namespace",
"array")
370 auto ExpectedNamespace = nestedBuildNamespaceFromJSON(*OptNamespaceArray);
371 if (!ExpectedNamespace) {
378 return EntityName{USR, Suffix, std::move(*ExpectedNamespace)};
384 Result[
"suffix"] = getSuffix(EN);
385 Result[
"namespace"] = nestedBuildNamespaceToJSON(getNamespace(EN));
393llvm::Expected<EntityLinkageType>
396 if (!OptEntityLinkageType) {
399 EntityLinkageTypeStr)
402 return *OptEntityLinkageType;
415JSONFormat::entityLinkageFromJSON(
const Object &EntityLinkageObject)
const {
416 auto OptLinkageStr = EntityLinkageObject.getString(
"type");
417 if (!OptLinkageStr) {
420 "EntityLinkageType",
"type",
"string")
425 if (!ExpectedLinkageType) {
431 return EntityLinkage(*ExpectedLinkageType);
445static llvm::Expected<EntityId>
447 llvm::function_ref<
EntityId(uint64_t)> MakeId) {
448 const Value *EntityIdIntValue = EntityIdTableEntryObject.get(
"id");
449 if (!EntityIdIntValue) {
453 "number (unsigned 64-bit integer)")
457 const std::optional<uint64_t> OptEntityIdInt =
458 EntityIdIntValue->getAsUINT64();
459 if (!OptEntityIdInt) {
463 "number (unsigned 64-bit integer)")
467 return MakeId(*OptEntityIdInt);
471JSONFormat::tuEntityIdTableEntryFromJSON(
472 const Object &EntityIdTableEntryObject)
const {
474 const Object *OptEntityNameObject =
475 EntityIdTableEntryObject.getObject(
"name");
476 if (!OptEntityNameObject) {
479 "EntityName",
"name",
"object")
483 auto ExpectedEntityName = tuEntityNameFromJSON(*OptEntityNameObject);
484 if (!ExpectedEntityName) {
491 EntityIdTableEntryObject,
492 [
this](uint64_t
V) {
return entityIdFromJSON(
V); });
494 return ExpectedId.takeError();
496 return std::make_pair(std::move(*ExpectedEntityName), std::move(*ExpectedId));
502 Entry[
"id"] = entityIdToJSON(EI);
503 Entry[
"name"] = tuEntityNameToJSON(EN);
507llvm::Expected<std::pair<EntityName, EntityId>>
508JSONFormat::luEntityIdTableEntryFromJSON(
509 const Object &EntityIdTableEntryObject)
const {
511 const Object *OptEntityNameObject =
512 EntityIdTableEntryObject.getObject(
"name");
513 if (!OptEntityNameObject) {
516 "EntityName",
"name",
"object")
520 auto ExpectedEntityName = luEntityNameFromJSON(*OptEntityNameObject);
521 if (!ExpectedEntityName) {
528 EntityIdTableEntryObject,
529 [
this](uint64_t
V) {
return entityIdFromJSON(
V); });
531 return ExpectedId.takeError();
533 return std::make_pair(std::move(*ExpectedEntityName), std::move(*ExpectedId));
539 Entry[
"id"] = entityIdToJSON(EI);
540 Entry[
"name"] = luEntityNameToJSON(EN);
552 const Array &EntityIdTableArray,
556 llvm::function_ref<std::map<EntityName, EntityId> &(
EntityIdTable &)>
559 std::map<EntityName, EntityId> &Entities = GetEntities(IdTable);
561 for (
const auto &[Index, EntityIdTableEntryValue] :
562 llvm::enumerate(EntityIdTableArray)) {
563 const Object *OptEntityIdTableEntryObject =
564 EntityIdTableEntryValue.getAsObject();
565 if (!OptEntityIdTableEntryObject) {
568 "EntityIdTable entry", Index,
"object")
572 auto ExpectedEntityIdTableEntry = EntryReader(*OptEntityIdTableEntryObject);
573 if (!ExpectedEntityIdTableEntry) {
580 auto [EntityIt, EntityInserted] =
581 Entities.emplace(std::move(*ExpectedEntityIdTableEntry));
582 if (!EntityInserted) {
585 "EntityIdTable entry", Index,
595JSONFormat::tuEntityIdTableFromJSON(
const Array &EntityIdTableArray)
const {
598 [
this](
const Object &O) {
return tuEntityIdTableEntryFromJSON(O); },
599 [](EntityIdTable &T) -> std::map<EntityName, EntityId> & {
600 return getEntities(T);
605 Array EntityIdTableArray;
606 const auto &Entities = getEntities(IdTable);
607 EntityIdTableArray.reserve(Entities.size());
609 for (
const auto &[EntityName, EntityId] : Entities) {
610 EntityIdTableArray.push_back(
611 tuEntityIdTableEntryToJSON(EntityName, EntityId));
614 return EntityIdTableArray;
617llvm::Expected<EntityIdTable>
618JSONFormat::luEntityIdTableFromJSON(
const Array &EntityIdTableArray)
const {
621 [
this](
const Object &O) {
return luEntityIdTableEntryFromJSON(O); },
622 [](EntityIdTable &T) -> std::map<EntityName, EntityId> & {
623 return getEntities(T);
628 Array EntityIdTableArray;
629 const auto &Entities = getEntities(IdTable);
630 EntityIdTableArray.reserve(Entities.size());
632 for (
const auto &[EntityName, EntityId] : Entities) {
633 EntityIdTableArray.push_back(
634 luEntityIdTableEntryToJSON(EntityName, EntityId));
637 return EntityIdTableArray;
644llvm::Expected<std::pair<EntityId, EntityLinkage>>
645JSONFormat::linkageTableEntryFromJSON(
646 const Object &LinkageTableEntryObject)
const {
647 const Value *EntityIdIntValue = LinkageTableEntryObject.get(
"id");
648 if (!EntityIdIntValue) {
652 "number (unsigned 64-bit integer)")
656 const std::optional<uint64_t> OptEntityIdInt =
657 EntityIdIntValue->getAsUINT64();
658 if (!OptEntityIdInt) {
662 "number (unsigned 64-bit integer)")
666 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
668 const Object *OptEntityLinkageObject =
669 LinkageTableEntryObject.getObject(
"linkage");
670 if (!OptEntityLinkageObject) {
673 "EntityLinkage",
"linkage",
"object")
677 auto ExpectedEntityLinkage = entityLinkageFromJSON(*OptEntityLinkageObject);
678 if (!ExpectedEntityLinkage) {
684 return std::make_pair(std::move(EI), std::move(*ExpectedEntityLinkage));
690 Entry[
"id"] = entityIdToJSON(EI);
691 Entry[
"linkage"] = entityLinkageToJSON(EL);
703llvm::Expected<std::map<EntityId, EntityLinkage>>
704JSONFormat::linkageTableFromJSON(
const Array &LinkageTableArray,
705 std::set<EntityId> ExpectedIds)
const {
706 std::map<EntityId, EntityLinkage> LinkageTable;
708 for (
const auto &[Index, LinkageTableEntryValue] :
709 llvm::enumerate(LinkageTableArray)) {
710 const Object *OptLinkageTableEntryObject =
711 LinkageTableEntryValue.getAsObject();
712 if (!OptLinkageTableEntryObject) {
715 "LinkageTable entry", Index,
"object")
719 auto ExpectedLinkageTableEntry =
720 linkageTableEntryFromJSON(*OptLinkageTableEntryObject);
721 if (!ExpectedLinkageTableEntry) {
727 const EntityId EI = ExpectedLinkageTableEntry->first;
729 auto [It, Inserted] =
730 LinkageTable.insert(std::move(*ExpectedLinkageTableEntry));
734 "LinkageTable entry", Index, It->first)
738 if (ExpectedIds.erase(EI) == 0) {
740 std::errc::invalid_argument,
747 if (!ExpectedIds.empty()) {
749 std::errc::invalid_argument,
751 *ExpectedIds.begin())
758Array JSONFormat::linkageTableToJSON(
759 const std::map<EntityId, EntityLinkage> &LinkageTable)
const {
761 Result.reserve(LinkageTable.size());
763 for (
const auto &[EI, EL] : LinkageTable) {
764 Result.push_back(linkageTableEntryToJSON(EI, EL));
774llvm::Expected<std::unique_ptr<EntitySummary>>
775JSONFormat::entitySummaryFromJSON(
const SummaryName &SN,
776 const Object &EntitySummaryObject,
778 auto InfoIt = FormatInfos.find(SN);
779 if (InfoIt == FormatInfos.end()) {
781 std::errc::invalid_argument,
786 const auto &InfoEntry = InfoIt->second;
787 assert(InfoEntry.ForSummary == SN);
789 return InfoEntry.Deserialize(EntitySummaryObject, IdTable,
790 entityIdFromJSONObject);
793llvm::Expected<Object>
794JSONFormat::entitySummaryToJSON(
const SummaryName &SN,
796 auto InfoIt = FormatInfos.find(SN);
797 if (InfoIt == FormatInfos.end()) {
799 std::errc::invalid_argument,
804 const auto &InfoEntry = InfoIt->second;
805 assert(InfoEntry.ForSummary == SN);
807 return InfoEntry.Serialize(ES, entityIdToJSONObject);
814llvm::Expected<std::pair<EntityId, std::unique_ptr<EntitySummary>>>
815JSONFormat::entityDataMapEntryFromJSON(
const Object &EntityDataMapEntryObject,
819 const Value *EntityIdIntValue = EntityDataMapEntryObject.get(
"entity_id");
820 if (!EntityIdIntValue) {
823 "EntityId",
"entity_id",
824 "number (unsigned 64-bit integer)")
828 const std::optional<uint64_t> OptEntityIdInt =
829 EntityIdIntValue->getAsUINT64();
830 if (!OptEntityIdInt) {
833 "EntityId",
"entity_id",
834 "number (unsigned 64-bit integer)")
838 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
840 const Object *OptEntitySummaryObject =
841 EntityDataMapEntryObject.getObject(
"entity_summary");
842 if (!OptEntitySummaryObject) {
845 "EntitySummary",
"entity_summary",
"object")
849 auto ExpectedEntitySummary =
850 entitySummaryFromJSON(SN, *OptEntitySummaryObject, IdTable);
851 if (!ExpectedEntitySummary) {
858 if (*ExpectedEntitySummary ==
nullptr) {
860 std::errc::invalid_argument,
865 auto ActualSN = (*ExpectedEntitySummary)->getSummaryName();
866 if (SN != ActualSN) {
868 std::errc::invalid_argument,
870 FailedToDeserializeEntitySummaryMismatchedSummaryName,
875 return std::make_pair(std::move(EI), std::move(*ExpectedEntitySummary));
878llvm::Expected<Object> JSONFormat::entityDataMapEntryToJSON(
883 Entry[
"entity_id"] = entityIdToJSON(EI);
885 if (!EntitySummary) {
890 const auto ActualSN = EntitySummary->getSummaryName();
891 if (SN != ActualSN) {
897 auto ExpectedEntitySummaryObject = entitySummaryToJSON(SN, *EntitySummary);
898 if (!ExpectedEntitySummaryObject) {
905 Entry[
"entity_summary"] = std::move(*ExpectedEntitySummaryObject);
914llvm::Expected<std::map<EntityId, std::unique_ptr<EntitySummary>>>
915JSONFormat::entityDataMapFromJSON(
const SummaryName &SN,
916 const Array &EntityDataArray,
918 std::map<EntityId, std::unique_ptr<EntitySummary>> EntityDataMap;
920 for (
const auto &[Index, EntityDataMapEntryValue] :
921 llvm::enumerate(EntityDataArray)) {
922 const Object *OptEntityDataMapEntryObject =
923 EntityDataMapEntryValue.getAsObject();
924 if (!OptEntityDataMapEntryObject) {
927 "EntitySummary entry", Index,
"object")
931 auto ExpectedEntityDataMapEntry =
932 entityDataMapEntryFromJSON(*OptEntityDataMapEntryObject, SN, IdTable);
933 if (!ExpectedEntityDataMapEntry) {
940 auto [DataIt, DataInserted] =
941 EntityDataMap.insert(std::move(*ExpectedEntityDataMapEntry));
945 "EntitySummary entry", Index, DataIt->first)
950 return std::move(EntityDataMap);
953llvm::Expected<Array> JSONFormat::entityDataMapToJSON(
955 const std::map<
EntityId, std::unique_ptr<EntitySummary>> &EntityDataMap)
958 Result.reserve(EntityDataMap.size());
960 for (
const auto &[Index, EntityDataMapEntry] :
961 llvm::enumerate(EntityDataMap)) {
962 const auto &[EntityId, EntitySummary] = EntityDataMapEntry;
964 auto ExpectedEntityDataMapEntryObject =
965 entityDataMapEntryToJSON(EntityId, EntitySummary, SN);
967 if (!ExpectedEntityDataMapEntryObject) {
973 Result.push_back(std::move(*ExpectedEntityDataMapEntryObject));
984 std::pair<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
985JSONFormat::summaryDataMapEntryFromJSON(
const Object &SummaryDataMapEntryObject,
988 std::optional<llvm::StringRef> OptSummaryNameStr =
989 SummaryDataMapEntryObject.getString(
"summary_name");
990 if (!OptSummaryNameStr) {
993 "SummaryName",
"summary_name",
"string")
999 const Array *OptEntityDataArray =
1000 SummaryDataMapEntryObject.getArray(
"summary_data");
1001 if (!OptEntityDataArray) {
1004 "EntitySummary entries",
"summary_data",
1009 auto ExpectedEntityDataMap =
1010 entityDataMapFromJSON(SN, *OptEntityDataArray, IdTable);
1011 if (!ExpectedEntityDataMap) {
1018 return std::make_pair(std::move(SN), std::move(*ExpectedEntityDataMap));
1021llvm::Expected<Object> JSONFormat::summaryDataMapEntryToJSON(
1023 const std::map<
EntityId, std::unique_ptr<EntitySummary>> &SD)
const {
1028 auto ExpectedSummaryDataArray = entityDataMapToJSON(SN, SD);
1029 if (!ExpectedSummaryDataArray) {
1036 Result[
"summary_data"] = std::move(*ExpectedSummaryDataArray);
1046 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
1047JSONFormat::summaryDataMapFromJSON(
const Array &SummaryDataArray,
1049 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>
1052 for (
const auto &[Index, SummaryDataMapEntryValue] :
1053 llvm::enumerate(SummaryDataArray)) {
1054 const Object *OptSummaryDataMapEntryObject =
1055 SummaryDataMapEntryValue.getAsObject();
1056 if (!OptSummaryDataMapEntryObject) {
1059 "SummaryData entry", Index,
"object")
1063 auto ExpectedSummaryDataMapEntry =
1064 summaryDataMapEntryFromJSON(*OptSummaryDataMapEntryObject, IdTable);
1065 if (!ExpectedSummaryDataMapEntry) {
1071 auto [SummaryIt, SummaryInserted] =
1072 SummaryDataMap.emplace(std::move(*ExpectedSummaryDataMapEntry));
1073 if (!SummaryInserted) {
1076 "SummaryData entry", Index, SummaryIt->first)
1081 return std::move(SummaryDataMap);
1084llvm::Expected<Array> JSONFormat::summaryDataMapToJSON(
1086 std::map<
EntityId, std::unique_ptr<EntitySummary>>>
1087 &SummaryDataMap)
const {
1089 Result.reserve(SummaryDataMap.size());
1091 for (
const auto &[Index, SummaryDataMapEntry] :
1092 llvm::enumerate(SummaryDataMap)) {
1093 const auto &[SummaryName, DataMap] = SummaryDataMapEntry;
1095 auto ExpectedSummaryDataMapObject =
1096 summaryDataMapEntryToJSON(SummaryName, DataMap);
1097 if (!ExpectedSummaryDataMapObject) {
1103 Result.push_back(std::move(*ExpectedSummaryDataMapObject));
1106 return std::move(
Result);
1113llvm::Expected<std::pair<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1114JSONFormat::encodingDataMapEntryFromJSON(
1115 const Object &EntityDataMapEntryObject)
const {
1116 const Value *EntityIdIntValue = EntityDataMapEntryObject.get(
"entity_id");
1117 if (!EntityIdIntValue) {
1120 "EntityId",
"entity_id",
1121 "number (unsigned 64-bit integer)")
1125 const std::optional<uint64_t> OptEntityIdInt =
1126 EntityIdIntValue->getAsUINT64();
1127 if (!OptEntityIdInt) {
1130 "EntityId",
"entity_id",
1131 "number (unsigned 64-bit integer)")
1135 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
1137 const Object *OptEntitySummaryObject =
1138 EntityDataMapEntryObject.getObject(
"entity_summary");
1139 if (!OptEntitySummaryObject) {
1142 "EntitySummary",
"entity_summary",
"object")
1146 std::unique_ptr<EntitySummaryEncoding>
Encoding(
1149 return std::make_pair(std::move(EI), std::move(Encoding));
1152Object JSONFormat::encodingDataMapEntryToJSON(
1153 EntityId EI,
const std::unique_ptr<EntitySummaryEncoding> &Encoding)
const {
1155 Entry[
"entity_id"] = entityIdToJSON(EI);
1162 Entry[
"entity_summary"] = JSONEncoding->Data;
1171llvm::Expected<std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1172JSONFormat::encodingDataMapFromJSON(
const Array &EntityDataArray)
const {
1173 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>> EncodingDataMap;
1175 for (
const auto &[Index, EntityDataMapEntryValue] :
1176 llvm::enumerate(EntityDataArray)) {
1177 const Object *OptEntityDataMapEntryObject =
1178 EntityDataMapEntryValue.getAsObject();
1179 if (!OptEntityDataMapEntryObject) {
1182 "EntitySummary entry", Index,
"object")
1186 auto ExpectedEntry =
1187 encodingDataMapEntryFromJSON(*OptEntityDataMapEntryObject);
1188 if (!ExpectedEntry) {
1195 auto [DataIt, DataInserted] =
1196 EncodingDataMap.insert(std::move(*ExpectedEntry));
1197 if (!DataInserted) {
1200 "EntitySummary entry", Index, DataIt->first)
1205 return std::move(EncodingDataMap);
1208Array JSONFormat::encodingDataMapToJSON(
1209 const std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>
1210 &EncodingDataMap)
const {
1212 Result.reserve(EncodingDataMap.size());
1214 for (
const auto &[EI, Encoding] : EncodingDataMap) {
1215 Result.push_back(encodingDataMapEntryToJSON(EI, Encoding));
1225llvm::Expected<std::pair<
1226 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
1227JSONFormat::encodingSummaryDataMapEntryFromJSON(
1228 const Object &SummaryDataMapEntryObject)
const {
1229 std::optional<llvm::StringRef> OptSummaryNameStr =
1230 SummaryDataMapEntryObject.getString(
"summary_name");
1231 if (!OptSummaryNameStr) {
1234 "SummaryName",
"summary_name",
"string")
1240 const Array *OptEntityDataArray =
1241 SummaryDataMapEntryObject.getArray(
"summary_data");
1242 if (!OptEntityDataArray) {
1245 "EntitySummary entries",
"summary_data",
1250 auto ExpectedEncodingDataMap = encodingDataMapFromJSON(*OptEntityDataArray);
1251 if (!ExpectedEncodingDataMap) {
1258 return std::make_pair(std::move(SN), std::move(*ExpectedEncodingDataMap));
1261Object JSONFormat::encodingSummaryDataMapEntryToJSON(
1263 const std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>
1264 &EncodingMap)
const {
1268 Result[
"summary_data"] = encodingDataMapToJSON(EncodingMap);
1277llvm::Expected<std::map<
1278 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
1279JSONFormat::encodingSummaryDataMapFromJSON(
1280 const Array &SummaryDataArray)
const {
1281 std::map<SummaryName,
1282 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1283 EncodingSummaryDataMap;
1285 for (
const auto &[Index, SummaryDataMapEntryValue] :
1286 llvm::enumerate(SummaryDataArray)) {
1287 const Object *OptSummaryDataMapEntryObject =
1288 SummaryDataMapEntryValue.getAsObject();
1289 if (!OptSummaryDataMapEntryObject) {
1292 "SummaryData entry", Index,
"object")
1296 auto ExpectedEntry =
1297 encodingSummaryDataMapEntryFromJSON(*OptSummaryDataMapEntryObject);
1298 if (!ExpectedEntry) {
1304 auto [SummaryIt, SummaryInserted] =
1305 EncodingSummaryDataMap.emplace(std::move(*ExpectedEntry));
1306 if (!SummaryInserted) {
1309 "SummaryData entry", Index, SummaryIt->first)
1314 return std::move(EncodingSummaryDataMap);
1317Array JSONFormat::encodingSummaryDataMapToJSON(
1319 std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1320 &EncodingSummaryDataMap)
const {
1322 Result.reserve(EncodingSummaryDataMap.size());
1324 for (
const auto &[SN, EncodingMap] : EncodingSummaryDataMap) {
1325 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)
static llvm::Expected< std::pair< llvm::StringRef, llvm::StringRef > > entityNameCoreFromJSON(const Object &EntityNameObject)
Reads "usr" and "suffix" fields from an EntityName JSON object.
AnalysisName analysisNameFromJSON(llvm::StringRef AnalysisNameStr)
llvm::Expected< BuildNamespaceKind > buildNamespaceKindFromJSON(llvm::StringRef BuildNamespaceKindStr)
llvm::json::Object Object
llvm::Expected< Value > readJSON(llvm::StringRef Path)
static llvm::Expected< EntityId > entityIdTableEntryIdFromJSON(const Object &EntityIdTableEntryObject, llvm::function_ref< EntityId(uint64_t)> MakeId)
Shared logic for reading the "id" field from an EntityIdTableEntry object.
constexpr const char * JSONFormatFileExtension
llvm::StringRef buildNamespaceKindToJSON(BuildNamespaceKind BNK)
static llvm::Expected< EntityIdTable > entityIdTableFromJSONImpl(const Array &EntityIdTableArray, llvm::function_ref< llvm::Expected< std::pair< EntityName, EntityId > >(const Object &)> EntryReader, llvm::function_ref< std::map< EntityName, EntityId > &(EntityIdTable &)> GetEntities)
Shared logic for deserializing an EntityIdTable from a JSON array.
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.