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