35#include "llvm/ADT/StringRef.h"
36#include "llvm/Support/Error.h"
37#include "llvm/Support/JSON.h"
66 void HandleTranslationUnit(ASTContext &Ctx)
override;
68 std::unique_ptr<TypeConstrainedPointersEntitySummary>
69 extractEntitySummary(
const std::vector<const NamedDecl *> &Decls);
72void TypeConstrainedPointersExtractor::HandleTranslationUnit(
ASTContext &Ctx) {
74 *
this, SummaryBuilder, Ctx,
75 [&](
const std::vector<const NamedDecl *> &Decls) {
76 return extractEntitySummary(Decls);
81std::unique_ptr<TypeConstrainedPointersEntitySummary>
82TypeConstrainedPointersExtractor::extractEntitySummary(
83 const std::vector<const NamedDecl *> &ContributorDecls) {
84 auto Summary = std::make_unique<TypeConstrainedPointersEntitySummary>();
85 auto Matcher = [&Summary,
this](
const DynTypedNode &Node) {
86 const auto *FD = Node.get<FunctionDecl>();
97 if (
auto Id = addEntityForReturn(FD))
98 Summary->Entities.insert(*Id);
101 case OO_Array_Delete:
105 if (
auto Id = addEntity(FD->getParamDecl(0)))
106 Summary->Entities.insert(*Id);
111 for (
const ParmVarDecl *PVD : FD->parameters()) {
113 if (
auto Id = addEntity(PVD))
114 Summary->Entities.insert(*Id);
123 if (
auto Id = addEntity(FD->getParamDecl(1)))
124 Summary->Entities.insert(*Id);
128 for (
const NamedDecl *Decl : ContributorDecls)
136class TypeConstrainedPointersAnalysis final
137 :
public SummaryAnalysis<TypeConstrainedPointersAnalysisResult,
138 TypeConstrainedPointersEntitySummary> {
141 add(EntityId,
const TypeConstrainedPointersEntitySummary &Summary)
override {
142 getResult().Entities.insert(Summary.
Entities.begin(),
144 return llvm::Error::success();
148AnalysisRegistry::Add<TypeConstrainedPointersAnalysis>
149 RegisterTypeConstrainedPointersAnalysis(
150 "Whole-program set of pointer entities that "
151 "must retain their pointer type");
157llvm::json::Object serializeImpl(
const std::set<EntityId> &
Set,
159 llvm::json::Object
Result;
160 llvm::json::Array DataArray;
162 DataArray.reserve(
Set.size());
163 for (
const auto &Ent :
Set)
164 DataArray.push_back(
Fn(Ent));
169llvm::Expected<std::set<EntityId>>
172 const auto *DataArray =
174 std::set<EntityId> EntitySet;
178 Data,
"An object with a key %s",
181 for (
const auto &Elt : *DataArray) {
182 const auto *EltAsObj = Elt.getAsObject();
187 Expected<EntityId> EntityId =
Fn(*EltAsObj);
190 return EntityId.takeError();
192 EntitySet.insert(*EntityId);
197llvm::json::Object serializeSummary(
const EntitySummary &S,
199 const auto &SS =
static_cast<const TypeConstrainedPointersEntitySummary &
>(S);
200 return serializeImpl(SS.Entities, Fn);
203llvm::Expected<std::unique_ptr<EntitySummary>>
204deserializeSummary(
const llvm::json::Object &
Data, EntityIdTable &,
209 return EntityIDSet.takeError();
211 std::unique_ptr<TypeConstrainedPointersEntitySummary> Sum =
212 std::make_unique<TypeConstrainedPointersEntitySummary>();
214 Sum->Entities = std::move(*EntityIDSet);
219 TypeConstrainedPointersJSONFormatInfo()
220 : JSONFormat::FormatInfo(
221 TypeConstrainedPointersEntitySummary::summaryName(),
222 serializeSummary, deserializeSummary) {}
225static llvm::Registry<JSONFormat::FormatInfo>::Add<
226 TypeConstrainedPointersJSONFormatInfo>
227 RegisterTypeConstrainedPointersJSONFormatInfo(
229 "JSON Format info for TypeConstrainedPointersEntitySummary");
232serializeAnalysisResult(
const TypeConstrainedPointersAnalysisResult &R,
234 return serializeImpl(
R.Entities, Fn);
237llvm::Expected<std::unique_ptr<AnalysisResult>>
238deserializeAnalysisResult(
const llvm::json::Object &
Data,
243 return EntityIDSet.takeError();
245 std::unique_ptr<TypeConstrainedPointersAnalysisResult> AR =
246 std::make_unique<TypeConstrainedPointersAnalysisResult>();
248 AR->Entities = std::move(*EntityIDSet);
252JSONFormat::AnalysisResultRegistry::Add<TypeConstrainedPointersAnalysisResult>
253 RegisterTypeConstrainedPointersAnalysisResultForJSON(
254 serializeAnalysisResult, deserializeAnalysisResult);
258namespace clang::ssaf {
263static TUSummaryExtractorRegistry::Add<TypeConstrainedPointersExtractor>
266 "Extract pointer entities that must retain their pointer type");
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Result
Implement __builtin_bit_cast and related operations.
Defines an enumeration for C++ overloaded operators.
static TUSummaryExtractorRegistry::Add< TypeConstrainedPointersExtractor > RegisterTypeConstrainedPointersExtractor(TypeConstrainedPointersEntitySummary::Name, "Extract pointer entities that must retain their pointer type")
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
DynTypedNode DynTypedNode
void extractAndAddSummaries(TUSummaryExtractor &Extractor, TUSummaryBuilder &Builder, ASTContext &Ctx, ExtractorFnT ExtractFn, llvm::StringRef ExtractorName="")
The standard contributor-summary extraction procedure:
bool hasPtrOrArrType(const Expr *E)
volatile int TypeConstrainedPointersAnchorSource
void findMatchesIn(const NamedDecl *Contributor, llvm::function_ref< void(const DynTypedNode &)> MatchActionRef)
Perform "MatchAction" on each Stmt and Decl belonging to the Contributor.
llvm::Error makeSawButExpectedError(const JSONTy &Saw, llvm::StringRef Expected, const Ts &...ExpectedArgs)
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
static constexpr llvm::StringLiteral Name
static constexpr llvm::StringLiteral Name
std::set< EntityId > Entities