clang 23.0.0git
EntityPointerLevelFormat.cpp
Go to the documentation of this file.
1//===- EntityPointerLevelFormat.cpp ---------------------------------------===//
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
10#include "SSAFAnalysesCommon.h"
13#include "llvm/Support/Error.h"
14#include "llvm/Support/JSON.h"
15
16using namespace clang;
17using namespace ssaf;
18
19// Writes an EntityPointerLevel as
20// Array [
21// Object { "@" : [entity-id]},
22// [pointer-level-integer]
23// ]
25 const EntityPointerLevel &EPL, JSONFormat::EntityIdToJSONFn EntityId2JSON) {
26 return llvm::json::Array{EntityId2JSON(EPL.getEntity()),
27 llvm::json::Value(EPL.getPointerLevel())};
28}
29
31 const llvm::json::Value &EPLData,
32 JSONFormat::EntityIdFromJSONFn EntityIdFromJSON) {
33 auto *AsArr = EPLData.getAsArray();
34
35 if (!AsArr || AsArr->size() != 2)
37 EPLData, "an array with exactly two elements representing "
38 "EntityId and PointerLevel, respectively");
39
40 auto *EntityIdObj = (*AsArr)[0].getAsObject();
41
42 if (!EntityIdObj)
43 return makeSawButExpectedError((*AsArr)[0],
44 "an object representing EntityId");
45
46 llvm::Expected<EntityId> Id = EntityIdFromJSON(*EntityIdObj);
47
48 if (!Id)
49 return Id.takeError();
50
51 std::optional<uint64_t> PtrLv = (*AsArr)[1].getAsInteger();
52
53 if (!PtrLv)
54 return makeSawButExpectedError((*AsArr)[1],
55 "an integer representing PointerLevel");
56
57 return buildEntityPointerLevel(*Id, *PtrLv);
58}
59
61 llvm::iterator_range<EntityPointerLevelSet::const_iterator> EPLs,
62 JSONFormat::EntityIdToJSONFn EntityId2JSON) {
63 llvm::json::Array Result;
64
65 for (const auto &EPL : EPLs)
66 Result.push_back(entityPointerLevelToJSON(EPL, EntityId2JSON));
67 return Result;
68}
69
71 const llvm::json::Array &EPLsData,
72 JSONFormat::EntityIdFromJSONFn EntityIdFromJSON) {
73 EntityPointerLevelSet EPLs;
74
75 for (const auto &EltData : EPLsData) {
77 entityPointerLevelFromJSON(EltData, EntityIdFromJSON);
78
79 if (!EPL)
80 return EPL.takeError();
81 EPLs.insert(*EPL);
82 }
83 return EPLs;
84}
85
87 const std::map<EntityId, EntityPointerLevelSet> &Map,
89 llvm::json::Array Content;
90
91 for (const auto &[Id, EPLs] : Map) {
92 Content.push_back(IdToJSON(Id));
93 Content.push_back(entityPointerLevelSetToJSON(EPLs, IdToJSON));
94 }
95 return Content;
96}
97
100 const llvm::json::Array &Content,
102 if (Content.size() % 2 != 0)
103 return makeSawButExpectedError(Content,
104 "an even number of elements, got %lu",
105 static_cast<size_t>(Content.size()));
106
107 std::map<EntityId, EntityPointerLevelSet> Result;
108
109 for (size_t I = 0; I < Content.size(); I += 2) {
110 const llvm::json::Object *IdData = Content[I].getAsObject();
111
112 if (!IdData)
113 return makeSawButExpectedError(Content[I],
114 "an object representing EntityId");
115
116 auto Id = IdFromJSON(*IdData);
117
118 if (!Id)
119 return Id.takeError();
120
121 const llvm::json::Array *EPLsData = Content[I + 1].getAsArray();
122
123 if (!EPLsData)
125 Content[I + 1], "an array representing EntityPointerLevelSet");
126
127 auto EPLs = entityPointerLevelSetFromJSON(*EPLsData, IdFromJSON);
128
129 if (!EPLs)
130 return EPLs.takeError();
131 Result[*Id] = std::move(*EPLs);
132 }
133 return Result;
134}
llvm::function_ref< llvm::Expected< EntityId >(const Object &)> EntityIdFromJSONFn
Definition JSONFormat.h:71
llvm::function_ref< Object(EntityId)> EntityIdToJSONFn
Definition JSONFormat.h:70
Expected< std::map< EntityId, EntityPointerLevelSet > > entityPointerLevelMapFromJSON(const llvm::json::Array &Content, JSONFormat::EntityIdFromJSONFn IdFromJSON)
Deserialize a flat array of alternating [EntityId, EntityPointerLevelSet, ...] pairs into a map.
llvm::json::Array entityPointerLevelSetToJSON(llvm::iterator_range< EntityPointerLevelSet::const_iterator > EPLs, JSONFormat::EntityIdToJSONFn EntityId2JSON)
llvm::json::Value entityPointerLevelToJSON(const EntityPointerLevel &EPL, JSONFormat::EntityIdToJSONFn EntityId2JSON)
llvm::Error makeSawButExpectedError(const JSONTy &Saw, llvm::StringRef Expected, const Ts &...ExpectedArgs)
Expected< EntityPointerLevelSet > entityPointerLevelSetFromJSON(const llvm::json::Array &EPLsData, JSONFormat::EntityIdFromJSONFn EntityIdFromJSON)
Expected< EntityPointerLevel > entityPointerLevelFromJSON(const llvm::json::Value &EPLData, JSONFormat::EntityIdFromJSONFn EntityIdFromJSON)
llvm::json::Array entityPointerLevelMapToJSON(const std::map< EntityId, EntityPointerLevelSet > &Map, JSONFormat::EntityIdToJSONFn IdToJSON)
Serialize a map<EntityId, EntityPointerLevelSet> as a flat array of alternating [EntityId,...
The JSON file list parser is used to communicate input to InstallAPI.
@ Result
The result type of a method or function.
Definition TypeBase.h:905