Transforms.h revision 1b8fbd3601e009803565e74d2ec54abecb5cbf73
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
1571b8fbd3601e009803565e74d2ec54abecb5cbf73Argyrios Kyrtzidisbool isPlusOneAssign(const BinaryOperator *E);
1581b8fbd3601e009803565e74d2ec54abecb5cbf73Argyrios Kyrtzidis
1597196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis/// \brief 'Loc' is the end of a statement range. This returns the location
1607196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis/// immediately after the semicolon following the statement.
1617196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis/// If no semicolon is found or the location is inside a macro, the returned
1627196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis/// source location will be invalid.
1637196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios KyrtzidisSourceLocation findLocationAfterSemi(SourceLocation loc, ASTContext &Ctx);
1647196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
165aec230d29835285777ecc467e268c83b33a2addeArgyrios Kyrtzidis/// \brief \arg Loc is the end of a statement range. This returns the location
166aec230d29835285777ecc467e268c83b33a2addeArgyrios Kyrtzidis/// of the semicolon following the statement.
167aec230d29835285777ecc467e268c83b33a2addeArgyrios Kyrtzidis/// If no semicolon is found or the location is inside a macro, the returned
168aec230d29835285777ecc467e268c83b33a2addeArgyrios Kyrtzidis/// source location will be invalid.
169aec230d29835285777ecc467e268c83b33a2addeArgyrios KyrtzidisSourceLocation findSemiAfterLocation(SourceLocation loc, ASTContext &Ctx);
170aec230d29835285777ecc467e268c83b33a2addeArgyrios Kyrtzidis
1717196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisbool hasSideEffects(Expr *E, ASTContext &Ctx);
1722c18ca0575b60082f2a9f4563b4071071960d37cArgyrios Kyrtzidisbool isGlobalVar(Expr *E);
17318fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios Kyrtzidis/// \brief Returns "nil" or "0" if 'nil' macro is not actually defined.
17418fd0c6915b45c4daafe18e3cd324c13306f913fArgyrios KyrtzidisStringRef getNilString(ASTContext &Ctx);
1757196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
1767196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidistemplate <typename BODY_TRANS>
1777196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisclass BodyTransform : public RecursiveASTVisitor<BodyTransform<BODY_TRANS> > {
1787196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  MigrationPass &Pass;
1797196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
1807196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidispublic:
1817196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  BodyTransform(MigrationPass &pass) : Pass(pass) { }
1827196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
183b1094a0621c3bf91141f7cd9684ca80b357ae61eArgyrios Kyrtzidis  bool TraverseStmt(Stmt *rootS) {
184fd10398c10ffdcbdeb1e3e299c74d70e689f503cArgyrios Kyrtzidis    if (rootS)
185fd10398c10ffdcbdeb1e3e299c74d70e689f503cArgyrios Kyrtzidis      BODY_TRANS(Pass).transformBody(rootS);
1867196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis    return true;
1877196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  }
1887196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis};
1897196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
1907196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidistypedef llvm::DenseSet<Expr *> ExprSet;
1917196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
1927196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid clearRefsIn(Stmt *S, ExprSet &refs);
1937196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidistemplate <typename iterator>
1947196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid clearRefsIn(iterator begin, iterator end, ExprSet &refs) {
1957196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis  for (; begin != end; ++begin)
1967196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis    clearRefsIn(*begin, refs);
1977196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis}
1987196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
1997196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid collectRefs(ValueDecl *D, Stmt *S, ExprSet &refs);
2007196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
2017196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidisvoid collectRemovables(Stmt *S, ExprSet &exprs);
2027196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
2037196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis} // end namespace trans
2047196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
2057196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis} // end namespace arcmt
2067196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
2077196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis} // end namespace clang
2087196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis
2097196d06c2fb020a91a26e727be1871110b4a0dc9Argyrios Kyrtzidis#endif
210