12#include "llvm/Support/Registry.h"
18static clang::ssaf::SerializationFormatRegistry::Add<clang::ssaf::JSONFormat>
28 if (!llvm::sys::fs::exists(Path)) {
35 if (llvm::sys::fs::is_directory(Path)) {
50 auto BufferOrError = llvm::MemoryBuffer::getFile(Path);
52 const std::error_code EC = BufferOrError.getError();
58 return llvm::json::parse(BufferOrError.get()->getBuffer());
62 if (llvm::sys::fs::exists(Path)) {
69 llvm::StringRef Dir = llvm::sys::path::parent_path(Path);
70 if (!Dir.empty() && !llvm::sys::fs::is_directory(Dir)) {
86 llvm::raw_fd_ostream OutStream(Path, EC, llvm::sys::fs::OF_Text);
94 OutStream << llvm::formatv(
"{0:2}\n",
V);
100 if (OutStream.has_error()) {
103 OutStream.error().message())
107 return llvm::Error::success();
114std::map<SummaryName, JSONFormat::FormatInfo> JSONFormat::initFormatInfos() {
115 std::map<SummaryName, FormatInfo> FormatInfos;
116 for (
const auto &FormatInfoEntry : llvm::Registry<FormatInfo>::entries()) {
117 std::unique_ptr<FormatInfo> Info = FormatInfoEntry.instantiate();
118 bool Inserted = FormatInfos.try_emplace(Info->ForSummary, *Info).second;
120 llvm::report_fatal_error(
121 "FormatInfo is already registered for summary: " +
122 Info->ForSummary.str());
129 llvm::function_ref<
void(llvm::StringRef, llvm::StringRef)> Callback)
const {
130 for (
const auto &Entry : llvm::Registry<FormatInfo>::entries())
131 Callback(Entry.getName(), Entry.getDesc());
148EntityId JSONFormat::entityIdFromJSON(
const uint64_t EntityIdIndex)
const {
149 return makeEntityId(
static_cast<size_t>(EntityIdIndex));
152uint64_t JSONFormat::entityIdToJSON(EntityId EI)
const {
153 return static_cast<uint64_t
>(
getIndex(EI));
156llvm::Expected<EntityId>
157JSONFormat::entityIdFromJSONObject(
const Object &EntityIdObject) {
158 if (EntityIdObject.size() != 1) {
173 std::optional<uint64_t> OptEntityIdIndex = AtVal->getAsUINT64();
174 if (!OptEntityIdIndex) {
181 return makeEntityId(
static_cast<size_t>(*OptEntityIdIndex));
194llvm::Expected<BuildNamespaceKind>
196 auto OptBuildNamespaceKind =
198 if (!OptBuildNamespaceKind) {
201 BuildNamespaceKindStr)
204 return *OptBuildNamespaceKind;
217JSONFormat::buildNamespaceFromJSON(
const Object &BuildNamespaceObject)
const {
218 auto OptBuildNamespaceKindStr = BuildNamespaceObject.getString(
"kind");
219 if (!OptBuildNamespaceKindStr) {
222 "BuildNamespaceKind",
"kind",
"string")
233 auto OptNameStr = BuildNamespaceObject.getString(
"name");
237 "BuildNamespaceName",
"name",
"string")
241 return {BuildNamespace(*ExpectedKind, *OptNameStr)};
255llvm::Expected<NestedBuildNamespace> JSONFormat::nestedBuildNamespaceFromJSON(
256 const Array &NestedBuildNamespaceArray)
const {
257 std::vector<BuildNamespace> Namespaces;
259 size_t NamespaceCount = NestedBuildNamespaceArray.size();
260 Namespaces.reserve(NamespaceCount);
262 for (
const auto &[Index, BuildNamespaceValue] :
263 llvm::enumerate(NestedBuildNamespaceArray)) {
264 const Object *BuildNamespaceObject = BuildNamespaceValue.getAsObject();
265 if (!BuildNamespaceObject) {
268 "BuildNamespace", Index,
"object")
272 auto ExpectedBuildNamespace = buildNamespaceFromJSON(*BuildNamespaceObject);
273 if (!ExpectedBuildNamespace) {
279 Namespaces.push_back(std::move(*ExpectedBuildNamespace));
282 return NestedBuildNamespace(std::move(Namespaces));
285Array JSONFormat::nestedBuildNamespaceToJSON(
288 const auto &Namespaces = getNamespaces(NBN);
289 Result.reserve(Namespaces.size());
291 for (
const auto &BN : Namespaces) {
292 Result.push_back(buildNamespaceToJSON(BN));
302llvm::Expected<EntityName>
303JSONFormat::entityNameFromJSON(
const Object &EntityNameObject)
const {
304 const auto OptUSR = EntityNameObject.getString(
"usr");
312 const auto OptSuffix = EntityNameObject.getString(
"suffix");
316 "Suffix",
"suffix",
"string")
320 const Array *OptNamespaceArray = EntityNameObject.getArray(
"namespace");
321 if (!OptNamespaceArray) {
324 "NestedBuildNamespace",
"namespace",
"array")
328 auto ExpectedNamespace = nestedBuildNamespaceFromJSON(*OptNamespaceArray);
329 if (!ExpectedNamespace) {
336 return EntityName{*OptUSR, *OptSuffix, std::move(*ExpectedNamespace)};
342 Result[
"suffix"] = getSuffix(EN);
343 Result[
"namespace"] = nestedBuildNamespaceToJSON(getNamespace(EN));
351llvm::Expected<EntityLinkageType>
354 if (!OptEntityLinkageType) {
357 EntityLinkageTypeStr)
360 return *OptEntityLinkageType;
373JSONFormat::entityLinkageFromJSON(
const Object &EntityLinkageObject)
const {
374 auto OptLinkageStr = EntityLinkageObject.getString(
"type");
375 if (!OptLinkageStr) {
378 "EntityLinkageType",
"type",
"string")
383 if (!ExpectedLinkageType) {
389 return EntityLinkage(*ExpectedLinkageType);
402llvm::Expected<std::pair<EntityName, EntityId>>
403JSONFormat::entityIdTableEntryFromJSON(
404 const Object &EntityIdTableEntryObject)
const {
406 const Object *OptEntityNameObject =
407 EntityIdTableEntryObject.getObject(
"name");
408 if (!OptEntityNameObject) {
411 "EntityName",
"name",
"object")
415 auto ExpectedEntityName = entityNameFromJSON(*OptEntityNameObject);
416 if (!ExpectedEntityName) {
422 const Value *EntityIdIntValue = EntityIdTableEntryObject.get(
"id");
423 if (!EntityIdIntValue) {
427 "number (unsigned 64-bit integer)")
431 const std::optional<uint64_t> OptEntityIdInt =
432 EntityIdIntValue->getAsUINT64();
433 if (!OptEntityIdInt) {
437 "number (unsigned 64-bit integer)")
441 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
443 return std::make_pair(std::move(*ExpectedEntityName), std::move(EI));
449 Entry[
"id"] = entityIdToJSON(EI);
450 Entry[
"name"] = entityNameToJSON(EN);
458llvm::Expected<EntityIdTable>
459JSONFormat::entityIdTableFromJSON(
const Array &EntityIdTableArray)
const {
460 EntityIdTable IdTable;
461 std::map<EntityName, EntityId> &Entities = getEntities(IdTable);
463 for (
const auto &[Index, EntityIdTableEntryValue] :
464 llvm::enumerate(EntityIdTableArray)) {
465 const Object *OptEntityIdTableEntryObject =
466 EntityIdTableEntryValue.getAsObject();
467 if (!OptEntityIdTableEntryObject) {
470 "EntityIdTable entry", Index,
"object")
474 auto ExpectedEntityIdTableEntry =
475 entityIdTableEntryFromJSON(*OptEntityIdTableEntryObject);
476 if (!ExpectedEntityIdTableEntry) {
483 auto [EntityIt, EntityInserted] =
484 Entities.emplace(std::move(*ExpectedEntityIdTableEntry));
485 if (!EntityInserted) {
488 "EntityIdTable entry", Index,
498 Array EntityIdTableArray;
499 const auto &Entities = getEntities(IdTable);
500 EntityIdTableArray.reserve(Entities.size());
502 for (
const auto &[EntityName, EntityId] : Entities) {
503 EntityIdTableArray.push_back(
504 entityIdTableEntryToJSON(EntityName, EntityId));
507 return EntityIdTableArray;
514llvm::Expected<std::pair<EntityId, EntityLinkage>>
515JSONFormat::linkageTableEntryFromJSON(
516 const Object &LinkageTableEntryObject)
const {
517 const Value *EntityIdIntValue = LinkageTableEntryObject.get(
"id");
518 if (!EntityIdIntValue) {
522 "number (unsigned 64-bit integer)")
526 const std::optional<uint64_t> OptEntityIdInt =
527 EntityIdIntValue->getAsUINT64();
528 if (!OptEntityIdInt) {
532 "number (unsigned 64-bit integer)")
536 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
538 const Object *OptEntityLinkageObject =
539 LinkageTableEntryObject.getObject(
"linkage");
540 if (!OptEntityLinkageObject) {
543 "EntityLinkage",
"linkage",
"object")
547 auto ExpectedEntityLinkage = entityLinkageFromJSON(*OptEntityLinkageObject);
548 if (!ExpectedEntityLinkage) {
554 return std::make_pair(std::move(EI), std::move(*ExpectedEntityLinkage));
560 Entry[
"id"] = entityIdToJSON(EI);
561 Entry[
"linkage"] = entityLinkageToJSON(EL);
573llvm::Expected<std::map<EntityId, EntityLinkage>>
574JSONFormat::linkageTableFromJSON(
const Array &LinkageTableArray,
575 std::set<EntityId> ExpectedIds)
const {
576 std::map<EntityId, EntityLinkage> LinkageTable;
578 for (
const auto &[Index, LinkageTableEntryValue] :
579 llvm::enumerate(LinkageTableArray)) {
580 const Object *OptLinkageTableEntryObject =
581 LinkageTableEntryValue.getAsObject();
582 if (!OptLinkageTableEntryObject) {
585 "LinkageTable entry", Index,
"object")
589 auto ExpectedLinkageTableEntry =
590 linkageTableEntryFromJSON(*OptLinkageTableEntryObject);
591 if (!ExpectedLinkageTableEntry) {
597 const EntityId EI = ExpectedLinkageTableEntry->first;
599 auto [It, Inserted] =
600 LinkageTable.insert(std::move(*ExpectedLinkageTableEntry));
604 "LinkageTable entry", Index, It->first)
608 if (ExpectedIds.erase(EI) == 0) {
610 std::errc::invalid_argument,
617 if (!ExpectedIds.empty()) {
619 std::errc::invalid_argument,
621 *ExpectedIds.begin())
628Array JSONFormat::linkageTableToJSON(
629 const std::map<EntityId, EntityLinkage> &LinkageTable)
const {
631 Result.reserve(LinkageTable.size());
633 for (
const auto &[EI, EL] : LinkageTable) {
634 Result.push_back(linkageTableEntryToJSON(EI, EL));
644llvm::Expected<std::unique_ptr<EntitySummary>>
645JSONFormat::entitySummaryFromJSON(
const SummaryName &SN,
646 const Object &EntitySummaryObject,
648 auto InfoIt = FormatInfos.find(SN);
649 if (InfoIt == FormatInfos.end()) {
651 std::errc::invalid_argument,
656 const auto &InfoEntry = InfoIt->second;
657 assert(InfoEntry.ForSummary == SN);
659 return InfoEntry.Deserialize(EntitySummaryObject, IdTable,
660 entityIdFromJSONObject);
663llvm::Expected<Object>
664JSONFormat::entitySummaryToJSON(
const SummaryName &SN,
666 auto InfoIt = FormatInfos.find(SN);
667 if (InfoIt == FormatInfos.end()) {
669 std::errc::invalid_argument,
674 const auto &InfoEntry = InfoIt->second;
675 assert(InfoEntry.ForSummary == SN);
677 return InfoEntry.Serialize(ES, entityIdToJSONObject);
684llvm::Expected<std::pair<EntityId, std::unique_ptr<EntitySummary>>>
685JSONFormat::entityDataMapEntryFromJSON(
const Object &EntityDataMapEntryObject,
689 const Value *EntityIdIntValue = EntityDataMapEntryObject.get(
"entity_id");
690 if (!EntityIdIntValue) {
693 "EntityId",
"entity_id",
694 "number (unsigned 64-bit integer)")
698 const std::optional<uint64_t> OptEntityIdInt =
699 EntityIdIntValue->getAsUINT64();
700 if (!OptEntityIdInt) {
703 "EntityId",
"entity_id",
704 "number (unsigned 64-bit integer)")
708 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
710 const Object *OptEntitySummaryObject =
711 EntityDataMapEntryObject.getObject(
"entity_summary");
712 if (!OptEntitySummaryObject) {
715 "EntitySummary",
"entity_summary",
"object")
719 auto ExpectedEntitySummary =
720 entitySummaryFromJSON(SN, *OptEntitySummaryObject, IdTable);
721 if (!ExpectedEntitySummary) {
728 if (*ExpectedEntitySummary ==
nullptr) {
730 std::errc::invalid_argument,
735 auto ActualSN = (*ExpectedEntitySummary)->getSummaryName();
736 if (SN != ActualSN) {
738 std::errc::invalid_argument,
740 FailedToDeserializeEntitySummaryMismatchedSummaryName,
745 return std::make_pair(std::move(EI), std::move(*ExpectedEntitySummary));
748llvm::Expected<Object> JSONFormat::entityDataMapEntryToJSON(
753 Entry[
"entity_id"] = entityIdToJSON(EI);
755 if (!EntitySummary) {
760 const auto ActualSN = EntitySummary->getSummaryName();
761 if (SN != ActualSN) {
767 auto ExpectedEntitySummaryObject = entitySummaryToJSON(SN, *EntitySummary);
768 if (!ExpectedEntitySummaryObject) {
775 Entry[
"entity_summary"] = std::move(*ExpectedEntitySummaryObject);
784llvm::Expected<std::map<EntityId, std::unique_ptr<EntitySummary>>>
785JSONFormat::entityDataMapFromJSON(
const SummaryName &SN,
786 const Array &EntityDataArray,
788 std::map<EntityId, std::unique_ptr<EntitySummary>> EntityDataMap;
790 for (
const auto &[Index, EntityDataMapEntryValue] :
791 llvm::enumerate(EntityDataArray)) {
792 const Object *OptEntityDataMapEntryObject =
793 EntityDataMapEntryValue.getAsObject();
794 if (!OptEntityDataMapEntryObject) {
797 "EntitySummary entry", Index,
"object")
801 auto ExpectedEntityDataMapEntry =
802 entityDataMapEntryFromJSON(*OptEntityDataMapEntryObject, SN, IdTable);
803 if (!ExpectedEntityDataMapEntry) {
810 auto [DataIt, DataInserted] =
811 EntityDataMap.insert(std::move(*ExpectedEntityDataMapEntry));
815 "EntitySummary entry", Index, DataIt->first)
820 return std::move(EntityDataMap);
823llvm::Expected<Array> JSONFormat::entityDataMapToJSON(
825 const std::map<
EntityId, std::unique_ptr<EntitySummary>> &EntityDataMap)
828 Result.reserve(EntityDataMap.size());
830 for (
const auto &[Index, EntityDataMapEntry] :
831 llvm::enumerate(EntityDataMap)) {
832 const auto &[EntityId, EntitySummary] = EntityDataMapEntry;
834 auto ExpectedEntityDataMapEntryObject =
835 entityDataMapEntryToJSON(EntityId, EntitySummary, SN);
837 if (!ExpectedEntityDataMapEntryObject) {
843 Result.push_back(std::move(*ExpectedEntityDataMapEntryObject));
854 std::pair<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
855JSONFormat::summaryDataMapEntryFromJSON(
const Object &SummaryDataMapEntryObject,
858 std::optional<llvm::StringRef> OptSummaryNameStr =
859 SummaryDataMapEntryObject.getString(
"summary_name");
860 if (!OptSummaryNameStr) {
863 "SummaryName",
"summary_name",
"string")
869 const Array *OptEntityDataArray =
870 SummaryDataMapEntryObject.getArray(
"summary_data");
871 if (!OptEntityDataArray) {
874 "EntitySummary entries",
"summary_data",
879 auto ExpectedEntityDataMap =
880 entityDataMapFromJSON(SN, *OptEntityDataArray, IdTable);
881 if (!ExpectedEntityDataMap) {
888 return std::make_pair(std::move(SN), std::move(*ExpectedEntityDataMap));
891llvm::Expected<Object> JSONFormat::summaryDataMapEntryToJSON(
893 const std::map<
EntityId, std::unique_ptr<EntitySummary>> &SD)
const {
898 auto ExpectedSummaryDataArray = entityDataMapToJSON(SN, SD);
899 if (!ExpectedSummaryDataArray) {
906 Result[
"summary_data"] = std::move(*ExpectedSummaryDataArray);
916 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>>
917JSONFormat::summaryDataMapFromJSON(
const Array &SummaryDataArray,
919 std::map<SummaryName, std::map<EntityId, std::unique_ptr<EntitySummary>>>
922 for (
const auto &[Index, SummaryDataMapEntryValue] :
923 llvm::enumerate(SummaryDataArray)) {
924 const Object *OptSummaryDataMapEntryObject =
925 SummaryDataMapEntryValue.getAsObject();
926 if (!OptSummaryDataMapEntryObject) {
929 "SummaryData entry", Index,
"object")
933 auto ExpectedSummaryDataMapEntry =
934 summaryDataMapEntryFromJSON(*OptSummaryDataMapEntryObject, IdTable);
935 if (!ExpectedSummaryDataMapEntry) {
941 auto [SummaryIt, SummaryInserted] =
942 SummaryDataMap.emplace(std::move(*ExpectedSummaryDataMapEntry));
943 if (!SummaryInserted) {
946 "SummaryData entry", Index, SummaryIt->first)
951 return std::move(SummaryDataMap);
954llvm::Expected<Array> JSONFormat::summaryDataMapToJSON(
956 std::map<
EntityId, std::unique_ptr<EntitySummary>>>
957 &SummaryDataMap)
const {
959 Result.reserve(SummaryDataMap.size());
961 for (
const auto &[Index, SummaryDataMapEntry] :
962 llvm::enumerate(SummaryDataMap)) {
963 const auto &[SummaryName, DataMap] = SummaryDataMapEntry;
965 auto ExpectedSummaryDataMapObject =
966 summaryDataMapEntryToJSON(SummaryName, DataMap);
967 if (!ExpectedSummaryDataMapObject) {
973 Result.push_back(std::move(*ExpectedSummaryDataMapObject));
983llvm::Expected<std::pair<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
984JSONFormat::encodingDataMapEntryFromJSON(
985 const Object &EntityDataMapEntryObject)
const {
986 const Value *EntityIdIntValue = EntityDataMapEntryObject.get(
"entity_id");
987 if (!EntityIdIntValue) {
990 "EntityId",
"entity_id",
991 "number (unsigned 64-bit integer)")
995 const std::optional<uint64_t> OptEntityIdInt =
996 EntityIdIntValue->getAsUINT64();
997 if (!OptEntityIdInt) {
1000 "EntityId",
"entity_id",
1001 "number (unsigned 64-bit integer)")
1005 EntityId EI = entityIdFromJSON(*OptEntityIdInt);
1007 const Object *OptEntitySummaryObject =
1008 EntityDataMapEntryObject.getObject(
"entity_summary");
1009 if (!OptEntitySummaryObject) {
1012 "EntitySummary",
"entity_summary",
"object")
1016 std::unique_ptr<EntitySummaryEncoding>
Encoding(
1019 return std::make_pair(std::move(EI), std::move(Encoding));
1022Object JSONFormat::encodingDataMapEntryToJSON(
1023 EntityId EI,
const std::unique_ptr<EntitySummaryEncoding> &Encoding)
const {
1025 Entry[
"entity_id"] = entityIdToJSON(EI);
1032 Entry[
"entity_summary"] = JSONEncoding->Data;
1041llvm::Expected<std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1042JSONFormat::encodingDataMapFromJSON(
const Array &EntityDataArray)
const {
1043 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>> EncodingDataMap;
1045 for (
const auto &[Index, EntityDataMapEntryValue] :
1046 llvm::enumerate(EntityDataArray)) {
1047 const Object *OptEntityDataMapEntryObject =
1048 EntityDataMapEntryValue.getAsObject();
1049 if (!OptEntityDataMapEntryObject) {
1052 "EntitySummary entry", Index,
"object")
1056 auto ExpectedEntry =
1057 encodingDataMapEntryFromJSON(*OptEntityDataMapEntryObject);
1058 if (!ExpectedEntry) {
1065 auto [DataIt, DataInserted] =
1066 EncodingDataMap.insert(std::move(*ExpectedEntry));
1067 if (!DataInserted) {
1070 "EntitySummary entry", Index, DataIt->first)
1075 return std::move(EncodingDataMap);
1078Array JSONFormat::encodingDataMapToJSON(
1079 const std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>
1080 &EncodingDataMap)
const {
1082 Result.reserve(EncodingDataMap.size());
1084 for (
const auto &[EI, Encoding] : EncodingDataMap) {
1085 Result.push_back(encodingDataMapEntryToJSON(EI, Encoding));
1095llvm::Expected<std::pair<
1096 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
1097JSONFormat::encodingSummaryDataMapEntryFromJSON(
1098 const Object &SummaryDataMapEntryObject)
const {
1099 std::optional<llvm::StringRef> OptSummaryNameStr =
1100 SummaryDataMapEntryObject.getString(
"summary_name");
1101 if (!OptSummaryNameStr) {
1104 "SummaryName",
"summary_name",
"string")
1110 const Array *OptEntityDataArray =
1111 SummaryDataMapEntryObject.getArray(
"summary_data");
1112 if (!OptEntityDataArray) {
1115 "EntitySummary entries",
"summary_data",
1120 auto ExpectedEncodingDataMap = encodingDataMapFromJSON(*OptEntityDataArray);
1121 if (!ExpectedEncodingDataMap) {
1128 return std::make_pair(std::move(SN), std::move(*ExpectedEncodingDataMap));
1131Object JSONFormat::encodingSummaryDataMapEntryToJSON(
1133 const std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>
1134 &EncodingMap)
const {
1138 Result[
"summary_data"] = encodingDataMapToJSON(EncodingMap);
1147llvm::Expected<std::map<
1148 SummaryName, std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>>
1149JSONFormat::encodingSummaryDataMapFromJSON(
1150 const Array &SummaryDataArray)
const {
1151 std::map<SummaryName,
1152 std::map<EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1153 EncodingSummaryDataMap;
1155 for (
const auto &[Index, SummaryDataMapEntryValue] :
1156 llvm::enumerate(SummaryDataArray)) {
1157 const Object *OptSummaryDataMapEntryObject =
1158 SummaryDataMapEntryValue.getAsObject();
1159 if (!OptSummaryDataMapEntryObject) {
1162 "SummaryData entry", Index,
"object")
1166 auto ExpectedEntry =
1167 encodingSummaryDataMapEntryFromJSON(*OptSummaryDataMapEntryObject);
1168 if (!ExpectedEntry) {
1174 auto [SummaryIt, SummaryInserted] =
1175 EncodingSummaryDataMap.emplace(std::move(*ExpectedEntry));
1176 if (!SummaryInserted) {
1179 "SummaryData entry", Index, SummaryIt->first)
1184 return std::move(EncodingSummaryDataMap);
1187Array JSONFormat::encodingSummaryDataMapToJSON(
1189 std::map<
EntityId, std::unique_ptr<EntitySummaryEncoding>>>
1190 &EncodingSummaryDataMap)
const {
1192 Result.reserve(EncodingSummaryDataMap.size());
1194 for (
const auto &[SN, EncodingMap] : EncodingSummaryDataMap) {
1195 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
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::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 >