Home | History | Annotate | Download | only in ARCMigrate
      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