1 //===----------------------------------------------------------------------===//
2 //
3 // Copyright (c) 2012, 2016 The University of Utah
4 // All rights reserved.
5 //
6 // This file is distributed under the University of Illinois Open Source
7 // License.  See the file COPYING for details.
8 //
9 //===----------------------------------------------------------------------===//
10 
11 #ifndef RENAME_VAR_H
12 #define RENAME_VAR_H
13 
14 #include <string>
15 #include <vector>
16 #include "llvm/ADT/SmallVector.h"
17 #include "llvm/ADT/DenseMap.h"
18 #include "Transformation.h"
19 
20 namespace clang {
21   class DeclGroupRef;
22   class ASTContext;
23   class VarDecl;
24 }
25 
26 class RNVCollectionVisitor;
27 class RenameVarVisitor;
28 
29 class RenameVar : public Transformation {
30 friend class RNVCollectionVisitor;
31 friend class RenameVarVisitor;
32 
33 public:
34 
RenameVar(const char * TransName,const char * Desc)35   RenameVar(const char *TransName, const char *Desc)
36     : Transformation(TransName, Desc),
37       VarCollectionVisitor(NULL),
38       RenameVisitor(NULL),
39       RenamePrefix('t')
40   { }
41 
42   ~RenameVar(void);
43 
skipCounter(void)44   virtual bool skipCounter(void) {
45     return true;
46   }
47 
48 private:
49 
50   virtual void Initialize(clang::ASTContext &context);
51 
52   virtual bool HandleTopLevelDecl(clang::DeclGroupRef D);
53 
54   virtual void HandleTranslationUnit(clang::ASTContext &Ctx);
55 
56   void addVar(clang::VarDecl *VD);
57 
58   bool allValidNames();
59 
60   void collectVars(void);
61 
62   RNVCollectionVisitor *VarCollectionVisitor;
63 
64   RenameVarVisitor *RenameVisitor;
65 
66   char RenamePrefix;
67 
68   std::vector<clang::VarDecl *> ValidVars;
69 
70   llvm::SmallVector<char, 26> AvailableNames;
71 
72   llvm::DenseMap<clang::VarDecl *, std::string> VarToNameMap;
73 
74   llvm::SmallPtrSet<clang::DeclRefExpr *, 10> VisitedDREs;
75 
76   // Unimplemented
77   RenameVar(void);
78 
79   RenameVar(const RenameVar &);
80 
81   void operator=(const RenameVar &);
82 };
83 #endif
84