]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/llvm/tools/clang/lib/ARCMigrate/Transforms.h
Copy head to stable/9 as part of 9.0-RELEASE release cycle.
[FreeBSD/stable/9.git] / contrib / llvm / tools / clang / lib / ARCMigrate / Transforms.h
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
41 void removeEmptyStatementsAndDealloc(MigrationPass &pass);
42
43 //===----------------------------------------------------------------------===//
44 // Helpers.
45 //===----------------------------------------------------------------------===//
46
47 /// \brief Determine whether we can add weak to the given type.
48 bool canApplyWeak(ASTContext &Ctx, QualType type);
49
50 /// \brief 'Loc' is the end of a statement range. This returns the location
51 /// immediately after the semicolon following the statement.
52 /// If no semicolon is found or the location is inside a macro, the returned
53 /// source location will be invalid.
54 SourceLocation findLocationAfterSemi(SourceLocation loc, ASTContext &Ctx);
55
56 bool hasSideEffects(Expr *E, ASTContext &Ctx);
57 bool isGlobalVar(Expr *E);
58
59
60 template <typename BODY_TRANS>
61 class BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > {
62   MigrationPass &Pass;
63
64 public:
65   BodyTransform(MigrationPass &pass) : Pass(pass) { }
66
67   bool TraverseStmt(Stmt *rootS) {
68     BODY_TRANS(Pass).transformBody(rootS);
69     return true;
70   }
71 };
72
73 typedef llvm::DenseSet<Expr *> ExprSet;
74
75 void clearRefsIn(Stmt *S, ExprSet &refs);
76 template <typename iterator>
77 void clearRefsIn(iterator begin, iterator end, ExprSet &refs) {
78   for (; begin != end; ++begin)
79     clearRefsIn(*begin, refs);
80 }
81
82 void collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs);
83
84 void collectRemovables(Stmt *S, ExprSet &exprs);
85
86 } // end namespace trans
87
88 } // end namespace arcmt
89
90 } // end namespace clang
91
92 #endif