clang 20.0.0git
Transforms.h
Go to the documentation of this file.
1//===-- Transforms.h - Transformations to ARC mode --------------*- C++ -*-===//
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
9#ifndef LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H
10#define LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H
11
12#include "clang/AST/ParentMap.h"
14#include "llvm/ADT/DenseSet.h"
15#include "llvm/Support/SaveAndRestore.h"
16
17namespace clang {
18 class Decl;
19 class Stmt;
20 class BlockDecl;
21 class ObjCMethodDecl;
22 class FunctionDecl;
23
24namespace arcmt {
25 class MigrationPass;
26
27namespace trans {
28
29 class MigrationContext;
30
31//===----------------------------------------------------------------------===//
32// Transformations.
33//===----------------------------------------------------------------------===//
34
41void checkAPIUses(MigrationPass &pass);
42
44
46 MigrationContext &MigrateCtx;
47 ParentMap PMap;
48 Stmt *TopStmt;
49
50public:
52 : MigrateCtx(MigrateCtx), PMap(S), TopStmt(S) {}
53
54 MigrationContext &getMigrationContext() { return MigrateCtx; }
55 ParentMap &getParentMap() { return PMap; }
56 Stmt *getTopStmt() { return TopStmt; }
57};
58
60 MigrationContext &MigrateCtx;
62
63public:
66 : MigrateCtx(MigrateCtx), ImpD(D) {}
67
68 MigrationContext &getMigrationContext() { return MigrateCtx; }
70};
71
73public:
74 virtual ~ASTTraverser();
75 virtual void traverseTU(MigrationContext &MigrateCtx) { }
76 virtual void traverseBody(BodyContext &BodyCtx) { }
78};
79
81 std::vector<ASTTraverser *> Traversers;
82
83public:
85
91 /// true if the attribute is owned, e.g. it is in a body and not just
92 /// in an interface.
94 };
95 std::vector<GCAttrOccurrence> GCAttrs;
96 llvm::DenseSet<SourceLocation> AttrSet;
97 llvm::DenseSet<SourceLocation> RemovedAttrSet;
98
99 /// Set of raw '@' locations for 'assign' properties group that contain
100 /// GC __weak.
101 llvm::DenseSet<SourceLocation> AtPropsWeak;
102
103 explicit MigrationContext(MigrationPass &pass) : Pass(pass) {}
105
106 typedef std::vector<ASTTraverser *>::iterator traverser_iterator;
107 traverser_iterator traversers_begin() { return Traversers.begin(); }
108 traverser_iterator traversers_end() { return Traversers.end(); }
109
110 void addTraverser(ASTTraverser *traverser) {
111 Traversers.push_back(traverser);
112 }
113
115 bool removePropertyAttribute(StringRef fromAttr, SourceLocation atLoc) {
116 return rewritePropertyAttribute(fromAttr, StringRef(), atLoc);
117 }
118 bool rewritePropertyAttribute(StringRef fromAttr, StringRef toAttr,
119 SourceLocation atLoc);
120 bool addPropertyAttribute(StringRef attr, SourceLocation atLoc);
121
123
124 void dumpGCAttrs();
125};
126
128public:
130};
131
133public:
134 void traverseBody(BodyContext &BodyCtx) override;
135};
136
138public:
139 void traverseBody(BodyContext &BodyCtx) override;
140};
141
142// GC transformations
143
145public:
146 void traverseTU(MigrationContext &MigrateCtx) override;
147};
148
150public:
151 void traverseBody(BodyContext &BodyCtx) override;
152};
153
154//===----------------------------------------------------------------------===//
155// Helpers.
156//===----------------------------------------------------------------------===//
157
158/// Determine whether we can add weak to the given type.
160 bool AllowOnUnknownClass = false);
161
162bool isPlusOneAssign(const BinaryOperator *E);
163bool isPlusOne(const Expr *E);
164
165/// 'Loc' is the end of a statement range. This returns the location
166/// immediately after the semicolon following the statement.
167/// If no semicolon is found or the location is inside a macro, the returned
168/// source location will be invalid.
170 bool IsDecl = false);
171
172/// 'Loc' is the end of a statement range. This returns the location
173/// of the semicolon following the statement.
174/// If no semicolon is found or the location is inside a macro, the returned
175/// source location will be invalid.
177 bool IsDecl = false);
178
179bool hasSideEffects(Expr *E, ASTContext &Ctx);
180bool isGlobalVar(Expr *E);
181/// Returns "nil" or "0" if 'nil' macro is not actually defined.
182StringRef getNilString(MigrationPass &Pass);
183
184template <typename BODY_TRANS>
185class BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > {
186 MigrationPass &Pass;
187 Decl *ParentD;
188
190public:
191 BodyTransform(MigrationPass &pass) : Pass(pass), ParentD(nullptr) { }
192
193 bool TraverseStmt(Stmt *rootS) {
194 if (rootS)
195 BODY_TRANS(Pass).transformBody(rootS, ParentD);
196 return true;
197 }
198
200 SaveAndRestore<Decl *> SetParent(ParentD, D);
201 return base::TraverseObjCMethodDecl(D);
202 }
203};
204
205typedef llvm::DenseSet<Expr *> ExprSet;
206
207void clearRefsIn(Stmt *S, ExprSet &refs);
208template <typename iterator>
209void clearRefsIn(iterator begin, iterator end, ExprSet &refs) {
210 for (; begin != end; ++begin)
211 clearRefsIn(*begin, refs);
212}
213
214void collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs);
215
216void collectRemovables(Stmt *S, ExprSet &exprs);
217
218} // end namespace trans
219
220} // end namespace arcmt
221
222} // end namespace clang
223
224#endif
const Decl * D
Expr * E
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:187
A builtin binary operation expression such as "x + y" or "x <= y".
Definition: Expr.h:3860
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
This represents one expression.
Definition: Expr.h:110
ObjCImplementationDecl - Represents a class definition - this is where method definitions are specifi...
Definition: DeclObjC.h:2596
ObjCMethodDecl - Represents an instance or class method declaration.
Definition: DeclObjC.h:140
A (possibly-)qualified type.
Definition: Type.h:941
A class that does preorder or postorder depth-first traversal on the entire Clang AST and visits each...
Encodes a location in the source.
Stmt - This represents one statement.
Definition: Stmt.h:84
The top declaration context.
Definition: Decl.h:84
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:667
virtual void traverseObjCImplementation(ObjCImplementationContext &ImplCtx)
Definition: Transforms.h:77
virtual void traverseBody(BodyContext &BodyCtx)
Definition: Transforms.h:76
virtual void traverseTU(MigrationContext &MigrateCtx)
Definition: Transforms.h:75
MigrationContext & getMigrationContext()
Definition: Transforms.h:54
BodyContext(MigrationContext &MigrateCtx, Stmt *S)
Definition: Transforms.h:51
BodyTransform(MigrationPass &pass)
Definition: Transforms.h:191
bool TraverseObjCMethodDecl(ObjCMethodDecl *D)
Definition: Transforms.h:199
void traverseTU(MigrationContext &MigrateCtx) override
void traverseBody(BodyContext &BodyCtx) override
llvm::DenseSet< SourceLocation > AttrSet
Definition: Transforms.h:96
void traverse(TranslationUnitDecl *TU)
Definition: Transforms.cpp:509
bool addPropertyAttribute(StringRef attr, SourceLocation atLoc)
Definition: Transforms.cpp:461
bool removePropertyAttribute(StringRef fromAttr, SourceLocation atLoc)
Definition: Transforms.h:115
traverser_iterator traversers_begin()
Definition: Transforms.h:107
std::vector< ASTTraverser * >::iterator traverser_iterator
Definition: Transforms.h:106
std::vector< GCAttrOccurrence > GCAttrs
Definition: Transforms.h:95
llvm::DenseSet< SourceLocation > AtPropsWeak
Set of raw '@' locations for 'assign' properties group that contain GC __weak.
Definition: Transforms.h:101
MigrationContext(MigrationPass &pass)
Definition: Transforms.h:103
bool rewritePropertyAttribute(StringRef fromAttr, StringRef toAttr, SourceLocation atLoc)
Definition: Transforms.cpp:379
void addTraverser(ASTTraverser *traverser)
Definition: Transforms.h:110
llvm::DenseSet< SourceLocation > RemovedAttrSet
Definition: Transforms.h:97
traverser_iterator traversers_end()
Definition: Transforms.h:108
ObjCImplementationDecl * getImplementationDecl()
Definition: Transforms.h:69
ObjCImplementationContext(MigrationContext &MigrateCtx, ObjCImplementationDecl *D)
Definition: Transforms.h:64
void traverseObjCImplementation(ObjCImplementationContext &ImplCtx) override
void traverseBody(BodyContext &BodyCtx) override
@ Decl
The l-value was an access to a declared entity or something equivalently strong, like the address of ...
StringRef getNilString(MigrationPass &Pass)
Returns "nil" or "0" if 'nil' macro is not actually defined.
Definition: Transforms.cpp:208
bool hasSideEffects(Expr *E, ASTContext &Ctx)
Definition: Transforms.cpp:167
void removeRetainReleaseDeallocFinalize(MigrationPass &pass)
bool canApplyWeak(ASTContext &Ctx, QualType type, bool AllowOnUnknownClass=false)
Determine whether we can add weak to the given type.
Definition: Transforms.cpp:39
void removeEmptyStatementsAndDeallocFinalize(MigrationPass &pass)
void collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs)
Definition: Transforms.cpp:304
void clearRefsIn(Stmt *S, ExprSet &refs)
Definition: Transforms.cpp:300
llvm::DenseSet< Expr * > ExprSet
Definition: Transforms.h:205
void rewriteAutoreleasePool(MigrationPass &pass)
void rewriteUnbridgedCasts(MigrationPass &pass)
void rewriteUnusedInitDelegate(MigrationPass &pass)
bool isPlusOneAssign(const BinaryOperator *E)
Definition: Transforms.cpp:68
void checkAPIUses(MigrationPass &pass)
bool isPlusOne(const Expr *E)
Definition: Transforms.cpp:75
SourceLocation findLocationAfterSemi(SourceLocation loc, ASTContext &Ctx, bool IsDecl=false)
'Loc' is the end of a statement range.
Definition: Transforms.cpp:117
bool isGlobalVar(Expr *E)
Definition: Transforms.cpp:196
void removeZeroOutPropsInDeallocFinalize(MigrationPass &pass)
SourceLocation findSemiAfterLocation(SourceLocation loc, ASTContext &Ctx, bool IsDecl=false)
'Loc' is the end of a statement range.
Definition: Transforms.cpp:129
void makeAssignARCSafe(MigrationPass &pass)
void collectRemovables(Stmt *S, ExprSet &exprs)
Definition: Transforms.cpp:308
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
enum clang::arcmt::trans::MigrationContext::GCAttrOccurrence::AttrKind Kind
bool FullyMigratable
true if the attribute is owned, e.g.
Definition: Transforms.h:93