retdec
var_renamer.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_LLVMIR2HLL_VAR_RENAMER_VAR_RENAMER_H
8 #define RETDEC_LLVMIR2HLL_VAR_RENAMER_VAR_RENAMER_H
9 
10 #include <map>
11 #include <string>
12 
15 
16 namespace retdec {
17 namespace llvmir2hll {
18 
49 class VarRenamer: protected OrderedAllVisitor {
50 public:
54  virtual std::string getId() const = 0;
55 
57 
58 protected:
60 
61  void assignName(ShPtr<Variable> var, const std::string &name,
62  ShPtr<Function> func = nullptr);
64  ShPtr<Function> func = nullptr);
65  bool isGlobalVar(ShPtr<Variable> var) const;
66  bool isFunc(ShPtr<Variable> var) const;
67  bool hasBeenRenamed(ShPtr<Variable> var) const;
68  bool nameExists(const std::string &name,
69  ShPtr<Function> func = nullptr) const;
70  ShPtr<Function> getFuncByName(const std::string &name) const;
71 
72  virtual void doVarsRenaming();
73 
76  virtual void renameUsingDebugNames();
78 
81  virtual void renameGlobalVars();
82  virtual void renameGlobalVar(ShPtr<Variable> var);
84 
87  virtual void renameVarsInFuncs();
88  virtual void renameVarsInFunc(ShPtr<Function> func);
89  virtual void renameFuncParam(ShPtr<Variable> var,
90  ShPtr<Function> func);
91  virtual void renameFuncLocalVar(ShPtr<Variable> var,
92  ShPtr<Function> func);
94 
98  virtual void visit(ShPtr<Variable> var) override;
100 
101 protected:
103  using FuncStringSetMap = std::map<ShPtr<Function>, StringSet>;
104 
106  using FuncByNameMap = std::map<std::string, ShPtr<Function>>;
107 
108 protected:
111 
114 
117 
122 
127 
130 
133 
140 
143 
144 private:
145  void storeFuncsByName();
146  std::string ensureNameUniqueness(ShPtr<Variable> var,
147  const std::string &name, ShPtr<Function> func = nullptr);
148  std::string generateUniqueName(ShPtr<Variable> var,
149  const std::string &name, ShPtr<Function> func = nullptr);
150  void assignRealNamesToFuncs();
151  void assignNameToFunc(ShPtr<Function> func, const std::string &newName);
152 };
153 
154 } // namespace llvmir2hll
155 } // namespace retdec
156 
157 #endif
A visitor that visits everything in an ordered way.
Definition: ordered_all_visitor.h:44
virtual void visit(ShPtr< GlobalVarDef > varDef) override
Definition: ordered_all_visitor.cpp:95
A base class for all variable renamers.
Definition: var_renamer.h:49
VarSet renamedVars
Variables which have already been renamed.
Definition: var_renamer.h:129
ShPtr< Module > module
Module in which the variables are being renamed.
Definition: var_renamer.h:116
FuncStringSetMap localVarsNames
Definition: var_renamer.h:139
StringSet globalVarsNames
Assigned names of global variables.
Definition: var_renamer.h:132
bool isGlobalVar(ShPtr< Variable > var) const
Returns true if the given variable is global, false otherwise.
Definition: var_renamer.cpp:142
bool nameExists(const std::string &name, ShPtr< Function > func=nullptr) const
Returns true if the given name has already been assigned, false otherwise.
Definition: var_renamer.cpp:184
std::map< std::string, ShPtr< Function > > FuncByNameMap
Mapping of a function's name into the function.
Definition: var_renamer.h:106
VarRenamer(ShPtr< VarNameGen > varNameGen, bool useDebugNames=true)
Constructs a new variable renamer.
Definition: var_renamer.cpp:38
std::string ensureNameUniqueness(ShPtr< Variable > var, const std::string &name, ShPtr< Function > func=nullptr)
Ensures that the given name (possibly in the given function) is unique.
Definition: var_renamer.cpp:243
std::string generateUniqueName(ShPtr< Variable > var, const std::string &name, ShPtr< Function > func=nullptr)
Generates a new, unique name based on the given name.
Definition: var_renamer.cpp:269
virtual void renameGlobalVars()
Renames all global variables in the module.
Definition: var_renamer.cpp:375
virtual void renameGlobalVar(ShPtr< Variable > var)
Renames the given global variable.
Definition: var_renamer.cpp:398
virtual void renameVarsInFunc(ShPtr< Function > func)
Renames variables in the given function.
Definition: var_renamer.cpp:427
ShPtr< VarNameGen > varNameGen
Used generator of variable names.
Definition: var_renamer.h:110
FuncByNameMap funcsByName
Definition: var_renamer.h:126
ShPtr< Function > getFuncByName(const std::string &name) const
Returns a function with the given name.
Definition: var_renamer.cpp:206
std::map< ShPtr< Function >, StringSet > FuncStringSetMap
Mapping of a function into a set of strings.
Definition: var_renamer.h:103
ShPtr< Function > currFunc
The currently visited function.
Definition: var_renamer.h:142
void assignNameToFunc(ShPtr< Function > func, const std::string &newName)
Assigns name to the given function func.
Definition: var_renamer.cpp:309
virtual void visit(ShPtr< GlobalVarDef > varDef) override
Definition: ordered_all_visitor.cpp:95
bool isFunc(ShPtr< Variable > var) const
Returns true if the given variable corresponds to a function, false otherwise.
Definition: var_renamer.cpp:155
void renameVars(ShPtr< Module > module)
Renames variables in the given module according to the settings set when constructing the renamer.
Definition: var_renamer.cpp:56
virtual void doVarsRenaming()
Renames the variables in module.
Definition: var_renamer.cpp:337
VarSet globalVars
Definition: var_renamer.h:121
virtual void renameUsingDebugNames()
Renames all variables in the module by using the assigned names from debug information.
Definition: var_renamer.cpp:350
virtual void renameFuncParam(ShPtr< Variable > var, ShPtr< Function > func)
Renames the given parameter var of function func.
Definition: var_renamer.cpp:454
virtual void renameVarsInFuncs()
Renames the variables in all functions.
Definition: var_renamer.cpp:410
virtual void renameFuncLocalVar(ShPtr< Variable > var, ShPtr< Function > func)
Renames the given local variable var of function func.
Definition: var_renamer.cpp:469
void storeFuncsByName()
Populates the funcsByName map.
Definition: var_renamer.cpp:215
void assignNameFromDebugInfoIfAvail(ShPtr< Variable > var, ShPtr< Function > func=nullptr)
Assigns the name from debug information (if available) to the given variable.
Definition: var_renamer.cpp:121
bool useDebugNames
Should we use variable names from debugging information?
Definition: var_renamer.h:113
void assignRealNamesToFuncs()
Assigns real names to all functions, where available.
Definition: var_renamer.cpp:294
void assignName(ShPtr< Variable > var, const std::string &name, ShPtr< Function > func=nullptr)
Assigns name to the given variable var, possibly in the given function.
Definition: var_renamer.cpp:85
virtual std::string getId() const =0
Returns the ID of the renamer.
bool hasBeenRenamed(ShPtr< Variable > var) const
Returns true if the given variable has already been renamed, false otherwise.
Definition: var_renamer.cpp:168
A library providing API for working with back-end IR.
std::shared_ptr< T > ShPtr
An alias for a shared pointer.
Definition: smart_ptr.h:18
std::set< ShPtr< Variable > > VarSet
Set of variables.
Definition: types.h:57
std::set< std::string > StringSet
Set of strings.
Definition: types.h:51
Definition: archive_wrapper.h:19
A visitor that visits everything in an ordered way.
A base class for all generators of variable names.