1 //===-- Transforms.h - Tranformations 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/RecursiveASTVisitor.h" 14 #include "llvm/ADT/DenseSet.h" 15 16 namespace clang { 17 class Decl; 18 class Stmt; 19 class BlockDecl; 20 class ObjCMethodDecl; 21 class FunctionDecl; 22 23 namespace arcmt { 24 class MigrationPass; 25 26 namespace trans { 27 28 //===----------------------------------------------------------------------===// 29 // Transformations. 30 //===----------------------------------------------------------------------===// 31 32 void rewriteAutoreleasePool(MigrationPass &pass); 33 void rewriteUnbridgedCasts(MigrationPass &pass); 34 void makeAssignARCSafe(MigrationPass &pass); 35 void removeRetainReleaseDealloc(MigrationPass &pass); 36 void removeZeroOutPropsInDealloc(MigrationPass &pass); 37 void rewriteProperties(MigrationPass &pass); 38 void rewriteBlockObjCVariable(MigrationPass &pass); 39 void rewriteUnusedInitDelegate(MigrationPass &pass); 40 void checkAPIUses(MigrationPass &pass); 41 42 void removeEmptyStatementsAndDealloc(MigrationPass &pass); 43 44 //===----------------------------------------------------------------------===// 45 // Helpers. 46 //===----------------------------------------------------------------------===// 47 48 /// \brief Determine whether we can add weak to the given type. 49 bool canApplyWeak(ASTContext &Ctx, QualType type); 50 51 /// \brief 'Loc' is the end of a statement range. This returns the location 52 /// immediately after the semicolon following the statement. 53 /// If no semicolon is found or the location is inside a macro, the returned 54 /// source location will be invalid. 55 SourceLocation findLocationAfterSemi(SourceLocation loc, ASTContext &Ctx); 56 57 /// \brief \arg Loc is the end of a statement range. This returns the location 58 /// of the semicolon following the statement. 59 /// If no semicolon is found or the location is inside a macro, the returned 60 /// source location will be invalid. 61 SourceLocation findSemiAfterLocation(SourceLocation loc, ASTContext &Ctx); 62 63 bool hasSideEffects(Expr *E, ASTContext &Ctx); 64 bool isGlobalVar(Expr *E); 65 /// \brief Returns "nil" or "0" if 'nil' macro is not actually defined. 66 StringRef getNilString(ASTContext &Ctx); 67 68 template <typename BODY_TRANS> 69 class BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > { 70 MigrationPass &Pass; 71 72 public: 73 BodyTransform(MigrationPass &pass) : Pass(pass) { } 74 75 bool TraverseStmt(Stmt *rootS) { 76 if (rootS) 77 BODY_TRANS(Pass).transformBody(rootS); 78 return true; 79 } 80 }; 81 82 typedef llvm::DenseSet<Expr *> ExprSet; 83 84 void clearRefsIn(Stmt *S, ExprSet &refs); 85 template <typename iterator> 86 void clearRefsIn(iterator begin, iterator end, ExprSet &refs) { 87 for (; begin != end; ++begin) 88 clearRefsIn(*begin, refs); 89 } 90 91 void collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs); 92 93 void collectRemovables(Stmt *S, ExprSet &exprs); 94 95 } // end namespace trans 96 97 } // end namespace arcmt 98 99 } // end namespace clang 100 101 #endif 102