blob: 6b39e90aeaf48e6c9601054179564cb2477b175f [file] [log] [blame]
Argyrios Kyrtzidis7196d062011-06-21 20:20:39 +00001//===-- 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
16namespace clang {
17 class Decl;
18 class Stmt;
19 class BlockDecl;
20 class ObjCMethodDecl;
21 class FunctionDecl;
22
23namespace arcmt {
24 class MigrationPass;
25
26namespace trans {
27
28//===----------------------------------------------------------------------===//
29// Transformations.
30//===----------------------------------------------------------------------===//
31
32void rewriteAutoreleasePool(MigrationPass &pass);
33void rewriteUnbridgedCasts(MigrationPass &pass);
Argyrios Kyrtzidis7196d062011-06-21 20:20:39 +000034void makeAssignARCSafe(MigrationPass &pass);
35void removeRetainReleaseDealloc(MigrationPass &pass);
Argyrios Kyrtzidis7196d062011-06-21 20:20:39 +000036void removeZeroOutPropsInDealloc(MigrationPass &pass);
Argyrios Kyrtzidis14c4b442011-07-13 19:22:00 +000037void rewriteProperties(MigrationPass &pass);
Argyrios Kyrtzidis7196d062011-06-21 20:20:39 +000038void rewriteBlockObjCVariable(MigrationPass &pass);
Argyrios Kyrtzidis7196d062011-06-21 20:20:39 +000039void rewriteUnusedInitDelegate(MigrationPass &pass);
Argyrios Kyrtzidisfd103982011-07-18 07:44:45 +000040void checkAPIUses(MigrationPass &pass);
Argyrios Kyrtzidis7196d062011-06-21 20:20:39 +000041
Argyrios Kyrtzidisfd3455a2011-06-21 20:20:42 +000042void removeEmptyStatementsAndDealloc(MigrationPass &pass);
43
Argyrios Kyrtzidis7196d062011-06-21 20:20:39 +000044//===----------------------------------------------------------------------===//
45// Helpers.
46//===----------------------------------------------------------------------===//
47
Argyrios Kyrtzidis86625b52011-07-12 22:05:17 +000048/// \brief Determine whether we can add weak to the given type.
49bool canApplyWeak(ASTContext &Ctx, QualType type);
50
Argyrios Kyrtzidis7196d062011-06-21 20:20:39 +000051/// \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.
55SourceLocation findLocationAfterSemi(SourceLocation loc, ASTContext &Ctx);
56
57bool hasSideEffects(Expr *E, ASTContext &Ctx);
Argyrios Kyrtzidis2c18ca02011-07-14 23:32:04 +000058bool isGlobalVar(Expr *E);
Argyrios Kyrtzidis18fd0c62011-07-27 05:28:18 +000059/// \brief Returns "nil" or "0" if 'nil' macro is not actually defined.
60StringRef getNilString(ASTContext &Ctx);
Argyrios Kyrtzidis7196d062011-06-21 20:20:39 +000061
62template <typename BODY_TRANS>
63class BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > {
64 MigrationPass &Pass;
65
66public:
67 BodyTransform(MigrationPass &pass) : Pass(pass) { }
68
Argyrios Kyrtzidisb1094a02011-06-23 21:21:33 +000069 bool TraverseStmt(Stmt *rootS) {
Argyrios Kyrtzidisfd103982011-07-18 07:44:45 +000070 if (rootS)
71 BODY_TRANS(Pass).transformBody(rootS);
Argyrios Kyrtzidis7196d062011-06-21 20:20:39 +000072 return true;
73 }
74};
75
76typedef llvm::DenseSet<Expr *> ExprSet;
77
78void clearRefsIn(Stmt *S, ExprSet &refs);
79template <typename iterator>
80void clearRefsIn(iterator begin, iterator end, ExprSet &refs) {
81 for (; begin != end; ++begin)
82 clearRefsIn(*begin, refs);
83}
84
85void collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs);
86
87void collectRemovables(Stmt *S, ExprSet &exprs);
88
89} // end namespace trans
90
91} // end namespace arcmt
92
93} // end namespace clang
94
95#endif