Transforms.h revision 7196d06c2fb020a91a26e727be1871110b4a0dc9
17196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//===-- Transforms.h - Tranformations to ARC mode ---------------*- C++ -*-===//
27196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//
37196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
47196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//
57196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
67196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis// License. See LICENSE.TXT for details.
77196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//
87196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
97196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
107196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#ifndef LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H
117196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#define LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H
127196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
137196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#include "clang/AST/RecursiveASTVisitor.h"
147196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#include "llvm/ADT/DenseSet.h"
157196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
167196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisnamespace clang {
177196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  class Decl;
187196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  class Stmt;
197196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  class BlockDecl;
207196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  class ObjCMethodDecl;
217196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  class FunctionDecl;
227196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
237196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisnamespace arcmt {
247196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  class MigrationPass;
257196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
267196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisnamespace trans {
277196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
287196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
297196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis// Transformations.
307196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
317196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
327196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid rewriteAutoreleasePool(MigrationPass &pass);
337196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid rewriteUnbridgedCasts(MigrationPass &pass);
347196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid rewriteAllocCopyWithZone(MigrationPass &pass);
357196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid makeAssignARCSafe(MigrationPass &pass);
367196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid removeRetainReleaseDealloc(MigrationPass &pass);
377196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid removeEmptyStatements(MigrationPass &pass);
387196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid removeZeroOutPropsInDealloc(MigrationPass &pass);
397196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid changeIvarsOfAssignProperties(MigrationPass &pass);
407196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid rewriteBlockObjCVariable(MigrationPass &pass);
417196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid removeDeallocMethod(MigrationPass &pass);
427196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid rewriteUnusedInitDelegate(MigrationPass &pass);
437196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
447196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
457196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis// Helpers.
467196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//===----------------------------------------------------------------------===//
477196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
487196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis/// \brief 'Loc' is the end of a statement range. This returns the location
497196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis/// immediately after the semicolon following the statement.
507196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis/// If no semicolon is found or the location is inside a macro, the returned
517196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis/// source location will be invalid.
527196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios KyrtzidisSourceLocation findLocationAfterSemi(SourceLocation loc, ASTContext &Ctx);
537196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
547196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisbool hasSideEffects(Expr *E, ASTContext &Ctx);
557196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
567196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidistemplate <typename BODY_TRANS>
577196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisclass BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > {
587196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  MigrationPass &Pass;
597196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
607196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidispublic:
617196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  BodyTransform(MigrationPass &pass) : Pass(pass) { }
627196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
637196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  void handleBody(Decl *D) {
647196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis    Stmt *body = D->getBody();
657196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis    if (body) {
667196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis      BODY_TRANS(D, Pass).transformBody(body);
677196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis    }
687196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  }
697196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
707196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  bool TraverseBlockDecl(BlockDecl *D) {
717196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis    handleBody(D);
727196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis    return true;
737196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  }
747196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  bool TraverseObjCMethodDecl(ObjCMethodDecl *D) {
757196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis    if (D->isThisDeclarationADefinition())
767196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis      handleBody(D);
777196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis    return true;
787196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  }
797196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  bool TraverseFunctionDecl(FunctionDecl *D) {
807196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis    if (D->isThisDeclarationADefinition())
817196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis      handleBody(D);
827196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis    return true;
837196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  }
847196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis};
857196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
867196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidistypedef llvm::DenseSet<Expr *> ExprSet;
877196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
887196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid clearRefsIn(Stmt *S, ExprSet &refs);
897196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidistemplate <typename iterator>
907196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid clearRefsIn(iterator begin, iterator end, ExprSet &refs) {
917196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  for (; begin != end; ++begin)
927196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis    clearRefsIn(*begin, refs);
937196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis}
947196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
957196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs);
967196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
977196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid collectRemovables(Stmt *S, ExprSet &exprs);
987196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
997196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis} // end namespace trans
1007196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
1017196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis} // end namespace arcmt
1027196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
1037196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis} // end namespace clang
1047196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
1057196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
106