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" 14e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis#include "clang/AST/ParentMap.h" 157196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#include "llvm/ADT/DenseSet.h" 167196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 177196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisnamespace clang { 187196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis class Decl; 197196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis class Stmt; 207196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis class BlockDecl; 217196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis class ObjCMethodDecl; 227196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis class FunctionDecl; 237196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 247196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisnamespace arcmt { 257196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis class MigrationPass; 267196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 277196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisnamespace trans { 287196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 29e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis class MigrationContext; 30e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 317196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 327196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis// Transformations. 337196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 347196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 357196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid rewriteAutoreleasePool(MigrationPass &pass); 367196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid rewriteUnbridgedCasts(MigrationPass &pass); 377196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid makeAssignARCSafe(MigrationPass &pass); 38e7ef8556f4ee3012a0479308c993af0fbee448dfArgyrios Kyrtzidisvoid removeRetainReleaseDeallocFinalize(MigrationPass &pass); 39e7ef8556f4ee3012a0479308c993af0fbee448dfArgyrios Kyrtzidisvoid removeZeroOutPropsInDeallocFinalize(MigrationPass &pass); 407196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid rewriteUnusedInitDelegate(MigrationPass &pass); 41fd10398c10ffdcbdeb1e3e299c74d70e689f503cArgyrios Kyrtzidisvoid checkAPIUses(MigrationPass &pass); 427196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 43e7ef8556f4ee3012a0479308c993af0fbee448dfArgyrios Kyrtzidisvoid removeEmptyStatementsAndDeallocFinalize(MigrationPass &pass); 44fd3455a9ebecf67b9a1c46f0675697bf518e6b80Argyrios Kyrtzidis 45e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidisclass BodyContext { 46e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis MigrationContext &MigrateCtx; 47e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis ParentMap PMap; 48e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis Stmt *TopStmt; 49e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 50e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidispublic: 51e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis BodyContext(MigrationContext &MigrateCtx, Stmt *S) 52e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis : MigrateCtx(MigrateCtx), PMap(S), TopStmt(S) {} 53e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 54e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis MigrationContext &getMigrationContext() { return MigrateCtx; } 55e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis ParentMap &getParentMap() { return PMap; } 56e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis Stmt *getTopStmt() { return TopStmt; } 57e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis}; 58e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 59b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidisclass ObjCImplementationContext { 60b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis MigrationContext &MigrateCtx; 61b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis ObjCImplementationDecl *ImpD; 62b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis 63b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidispublic: 64b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis ObjCImplementationContext(MigrationContext &MigrateCtx, 65b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis ObjCImplementationDecl *D) 66b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis : MigrateCtx(MigrateCtx), ImpD(D) {} 67b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis 68b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis MigrationContext &getMigrationContext() { return MigrateCtx; } 69b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis ObjCImplementationDecl *getImplementationDecl() { return ImpD; } 70b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis}; 71b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis 72e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidisclass ASTTraverser { 73e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidispublic: 74e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis virtual ~ASTTraverser(); 75b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis virtual void traverseTU(MigrationContext &MigrateCtx) { } 76e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis virtual void traverseBody(BodyContext &BodyCtx) { } 77b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis virtual void traverseObjCImplementation(ObjCImplementationContext &ImplCtx) {} 78e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis}; 79e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 80e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidisclass MigrationContext { 81e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis std::vector<ASTTraverser *> Traversers; 82e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 83e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidispublic: 84f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis MigrationPass &Pass; 85f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis 86f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis struct GCAttrOccurrence { 87f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis enum AttrKind { Weak, Strong } Kind; 88f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis SourceLocation Loc; 89f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis QualType ModifiedType; 90f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis Decl *Dcl; 91f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis /// \brief true if the attribute is owned, e.g. it is in a body and not just 92f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis /// in an interface. 93f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis bool FullyMigratable; 94f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis }; 95f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis std::vector<GCAttrOccurrence> GCAttrs; 96f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis llvm::DenseSet<unsigned> AttrSet; 977cfd7fe020144afe61ffe4de6c43c10340c415a7Argyrios Kyrtzidis llvm::DenseSet<unsigned> RemovedAttrSet; 98f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis 99b0e1e121b32a9a04b39f1b77b3068bce2f3be05aArgyrios Kyrtzidis /// \brief Set of raw '@' locations for 'assign' properties group that contain 100b0e1e121b32a9a04b39f1b77b3068bce2f3be05aArgyrios Kyrtzidis /// GC __weak. 101b0e1e121b32a9a04b39f1b77b3068bce2f3be05aArgyrios Kyrtzidis llvm::DenseSet<unsigned> AtPropsWeak; 102bf8455c56cc5e328c31a2b56f5587cd0873ba0aeArgyrios Kyrtzidis 103e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis explicit MigrationContext(MigrationPass &pass) : Pass(pass) {} 104e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis ~MigrationContext(); 105e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 106e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis typedef std::vector<ASTTraverser *>::iterator traverser_iterator; 107e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis traverser_iterator traversers_begin() { return Traversers.begin(); } 108e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis traverser_iterator traversers_end() { return Traversers.end(); } 109e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 110e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis void addTraverser(ASTTraverser *traverser) { 111e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis Traversers.push_back(traverser); 112e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis } 113e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 1141fe4203ca05d0a3283efc8a2e8c01ecdf78fbf2eArgyrios Kyrtzidis bool isGCOwnedNonObjC(QualType T); 1156da4274724f6bd0f24f0fbfd1af076cd14b14710Argyrios Kyrtzidis bool removePropertyAttribute(StringRef fromAttr, SourceLocation atLoc) { 1166da4274724f6bd0f24f0fbfd1af076cd14b14710Argyrios Kyrtzidis return rewritePropertyAttribute(fromAttr, StringRef(), atLoc); 1176da4274724f6bd0f24f0fbfd1af076cd14b14710Argyrios Kyrtzidis } 118b0e1e121b32a9a04b39f1b77b3068bce2f3be05aArgyrios Kyrtzidis bool rewritePropertyAttribute(StringRef fromAttr, StringRef toAttr, 119b0e1e121b32a9a04b39f1b77b3068bce2f3be05aArgyrios Kyrtzidis SourceLocation atLoc); 1206da4274724f6bd0f24f0fbfd1af076cd14b14710Argyrios Kyrtzidis bool addPropertyAttribute(StringRef attr, SourceLocation atLoc); 1211fe4203ca05d0a3283efc8a2e8c01ecdf78fbf2eArgyrios Kyrtzidis 122e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis void traverse(TranslationUnitDecl *TU); 12317ac3197941b9f135424dfe3900577a04407c5c2Argyrios Kyrtzidis 12417ac3197941b9f135424dfe3900577a04407c5c2Argyrios Kyrtzidis void dumpGCAttrs(); 125e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis}; 126e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 127b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidisclass PropertyRewriteTraverser : public ASTTraverser { 128b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidispublic: 129b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis virtual void traverseObjCImplementation(ObjCImplementationContext &ImplCtx); 130b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis}; 131b0d5db1b7cac1a0680877c17fe92c6d64cf1c730Argyrios Kyrtzidis 1322a2781805a6b55573d369e34c5dcfba307ce83e9Argyrios Kyrtzidisclass BlockObjCVariableTraverser : public ASTTraverser { 1332a2781805a6b55573d369e34c5dcfba307ce83e9Argyrios Kyrtzidispublic: 1342a2781805a6b55573d369e34c5dcfba307ce83e9Argyrios Kyrtzidis virtual void traverseBody(BodyContext &BodyCtx); 1352a2781805a6b55573d369e34c5dcfba307ce83e9Argyrios Kyrtzidis}; 1362a2781805a6b55573d369e34c5dcfba307ce83e9Argyrios Kyrtzidis 137e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis// GC transformations 138e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 139f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidisclass GCAttrsTraverser : public ASTTraverser { 140f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidispublic: 141f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis virtual void traverseTU(MigrationContext &MigrateCtx); 142f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis}; 143f38fa73e605587abfa32ab6a39887cdebc0a320aArgyrios Kyrtzidis 144e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidisclass GCCollectableCallsTraverser : public ASTTraverser { 145e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidispublic: 146e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis virtual void traverseBody(BodyContext &BodyCtx); 147e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis}; 148e0ac7454bae910ab3d67a92f6e2e5046d3bb8c1aArgyrios Kyrtzidis 1497196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 1507196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis// Helpers. 1517196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis//===----------------------------------------------------------------------===// 1527196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 15386625b5650cdddc38c0b4cc1eb7fb460478c9d11Argyrios Kyrtzidis/// \brief Determine whether we can add weak to the given type. 15412192cf50a96cb59a3039af044b7fa97f043101cArgyrios Kyrtzidisbool canApplyWeak(ASTContext &Ctx, QualType type, 15512192cf50a96cb59a3039af044b7fa97f043101cArgyrios Kyrtzidis bool AllowOnUnknownClass = false); 15686625b5650cdddc38c0b4cc1eb7fb460478c9d11Argyrios Kyrtzidis 1577196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis/// \brief 'Loc' is the end of a statement range. This returns the location 1587196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis/// immediately after the semicolon following the statement. 1597196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis/// If no semicolon is found or the location is inside a macro, the returned 1607196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis/// source location will be invalid. 1617196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios KyrtzidisSourceLocation findLocationAfterSemi(SourceLocation loc, ASTContext &Ctx); 1627196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 163aec230d29835285777ecc467e268c83b33a2addeArgyrios Kyrtzidis/// \brief \arg Loc is the end of a statement range. This returns the location 164aec230d29835285777ecc467e268c83b33a2addeArgyrios Kyrtzidis/// of the semicolon following the statement. 165aec230d29835285777ecc467e268c83b33a2addeArgyrios Kyrtzidis/// If no semicolon is found or the location is inside a macro, the returned 166aec230d29835285777ecc467e268c83b33a2addeArgyrios Kyrtzidis/// source location will be invalid. 167aec230d29835285777ecc467e268c83b33a2addeArgyrios KyrtzidisSourceLocation findSemiAfterLocation(SourceLocation loc, ASTContext &Ctx); 168aec230d29835285777ecc467e268c83b33a2addeArgyrios Kyrtzidis 1697196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisbool hasSideEffects(Expr *E, ASTContext &Ctx); 1702c18ca0575b60082f2a9f4563b4071071960d37cArgyrios Kyrtzidisbool isGlobalVar(Expr *E); 17118fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis/// \brief Returns "nil" or "0" if 'nil' macro is not actually defined. 17218fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios KyrtzidisStringRef getNilString(ASTContext &Ctx); 1737196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 1747196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidistemplate <typename BODY_TRANS> 1757196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisclass BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > { 1767196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis MigrationPass &Pass; 1777196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 1787196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidispublic: 1797196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis BodyTransform(MigrationPass &pass) : Pass(pass) { } 1807196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 181b1094a0621c3bf91141f7cd9684ca80b357ae61eArgyrios Kyrtzidis bool TraverseStmt(Stmt *rootS) { 182fd10398c10ffdcbdeb1e3e299c74d70e689f503cArgyrios Kyrtzidis if (rootS) 183fd10398c10ffdcbdeb1e3e299c74d70e689f503cArgyrios Kyrtzidis BODY_TRANS(Pass).transformBody(rootS); 1847196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis return true; 1857196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis } 1867196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis}; 1877196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 1887196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidistypedef llvm::DenseSet<Expr *> ExprSet; 1897196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 1907196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid clearRefsIn(Stmt *S, ExprSet &refs); 1917196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidistemplate <typename iterator> 1927196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid clearRefsIn(iterator begin, iterator end, ExprSet &refs) { 1937196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis for (; begin != end; ++begin) 1947196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis clearRefsIn(*begin, refs); 1957196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis} 1967196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 1977196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs); 1987196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 1997196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid collectRemovables(Stmt *S, ExprSet &exprs); 2007196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 2017196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis} // end namespace trans 2027196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 2037196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis} // end namespace arcmt 2047196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 2057196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis} // end namespace clang 2067196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis 2077196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif 208