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