retdec
names.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_BIN2LLVMIR_PROVIDERS_NAMES_H
8 #define RETDEC_BIN2LLVMIR_PROVIDERS_NAMES_H
9 
10 #include <map>
11 #include <set>
12 
18 #include "retdec/common/address.h"
19 
20 namespace retdec {
21 namespace bin2llvmir {
22 
23 namespace names {
24 
25 const std::string entryPointName = "entry_point";
26 const std::string generatedImportPrefix = "imported_function_ord_";
27 const std::string generatedFunctionPrefix = "function_";
28 const std::string generatedFunctionPrefixIDA = "ida_";
29 const std::string generatedFunctionPrefixUnk = "unknown_";
30 const std::string generatedGlobalVarPrefix = "global_var_";
31 const std::string generatedStackVarPrefix = "stack_var_";
32 const std::string generatedTempVarPrefix = "v";
33 const std::string generatedBasicBlockPrefix = "dec_label_pc_";
34 const std::string generatedUndefFunctionPrefix = "__decompiler_undefined_function_";
35 const std::string generatedVtablePrefix = "vtable_";
36 const std::string asm2llvmGv = "_asm_program_counter";
37 const std::string pseudoCallFunction = "__pseudo_call";
38 const std::string pseudoReturnFunction = "__pseudo_return";
39 const std::string pseudoBranchFunction = "__pseudo_branch";
40 const std::string pseudoCondBranchFunction = "__pseudo_cond_branch";
41 const std::string pseudoX87dataLoadFunction = "__frontend_reg_load.fpr";
42 const std::string pseudoX87dataStoreFunction = "__frontend_reg_store.fpr";
43 
44 std::string generateFunctionName(common::Address a, bool ida = false);
45 std::string generateFunctionNameUnknown(common::Address a, bool ida = false);
46 std::string generateGlobalVarName(
48  const std::string& name = std::string());
49 std::string generateStackVarName(
50  int offset,
51  const std::string& name = std::string());
53 std::string generateTempVariableName(common::Address a, unsigned cntr);
54 std::string generateFunctionNameUndef(unsigned cntr);
55 std::string generateVtableName(common::Address a);
56 
57 } // namespace names
58 
62 class Name
63 {
64  public:
69  enum class eType
70  {
71  // This is not set automatically in this module -> for manual use
72  // only - when some bin2llvmir part wants to really make sure
73  // a certain name is used.
74  HIGHEST_PRIORITY = 0,
75  // Stuff from config.
79  //
82  //
84  // Stuff from file image.
85  IMPORT,
86  EXPORT,
93  SECTION,
95  // This is not set automatically in this module -> for manual use
96  // only - when some bin2llvmir part wants to use some name if
97  // nothing better is available.
99  // Invalid - somethingwent wrong, do not use this entry.
100  INVALID,
101  };
102 
103  public:
104  Name();
105  Name(Config* c, const std::string& name, eType type, Lti* lti = nullptr);
106 
107  operator std::string() const;
108  explicit operator bool() const;
109  bool operator<(const Name& o) const;
110 
111  const std::string& getName() const;
112  eType getType() const;
113 
114  private:
115  void fixPic32Mangling();
116  void fixPostfix();
117 
118  private:
119  std::string _name;
121 };
122 
126 class Names
127 {
128  public:
129  using iterator = typename std::set<Name>::iterator;
130 
131  public:
132  bool addName(
133  Config* c,
134  const std::string& name,
135  Name::eType type,
136  Lti* lti = nullptr);
137 
138  const Name& getPreferredName();
139 
140  iterator begin();
141  iterator end();
142  std::size_t size() const;
143  bool empty() const;
144 
145  private:
146  std::set<Name> _names;
147  static Name _emptyName;
148 };
149 
154 {
155  public:
157  llvm::Module* m,
158  Config* c,
159  DebugFormat* d,
160  FileImage* i,
161  Demangler* dm,
162  Lti* lti = nullptr);
163 
164  bool addNameForAddress(
166  const std::string& name,
167  Name::eType type,
168  Lti* lti = nullptr);
169 
172 
173  private:
174  void initFromConfig();
175  void initFromDebug();
176  void initFromImage();
177 
178  std::string getNameFromImportLibAndOrd(
179  const std::string& libName,
180  int ord);
181  bool loadImportOrds(const std::string& libName);
182 
183  private:
185  using ImportOrdMap = std::map<int, std::string>;
186 
187  private:
188  Config* _config = nullptr;
189  DebugFormat* _debug = nullptr;
190  FileImage* _image = nullptr;
191  Lti* _lti = nullptr;
192 
193  std::map<retdec::common::Address, Names> _data;
195  std::map<std::string, ImportOrdMap> _dllOrds;
196 };
197 
202 {
203  public:
204  static NameContainer* addNames(
205  llvm::Module* m,
206  Config* c,
207  DebugFormat* d,
208  FileImage* i,
209  Demangler* dm,
210  Lti* lti);
211  static NameContainer* getNames(llvm::Module* m);
212  static bool getNames(llvm::Module* m, NameContainer*& names);
213  static void clear();
214 
215  private:
216  static std::map<llvm::Module*, NameContainer> _module2names;
217 };
218 
219 } // namespace bin2llvmir
220 } // namespace retdec
221 
222 #endif
Config DB provider for bin2llvmirl.
Debug format provider for bin2llvmirl.
Demangler provider for bin2llvmirl.
Definition: config.h:24
Definition: debugformat.h:20
Definition: demangler.h:34
Definition: fileimage.h:27
Definition: lti.h:21
Definition: names.h:154
FileImage * _image
Definition: names.h:190
Config * _config
Definition: names.h:188
void initFromDebug()
Definition: names.cpp:335
std::string getNameFromImportLibAndOrd(const std::string &libName, int ord)
Definition: names.cpp:477
const Name & getPreferredNameForAddress(retdec::common::Address a)
Definition: names.cpp:306
NameContainer(llvm::Module *m, Config *c, DebugFormat *d, FileImage *i, Demangler *dm, Lti *lti=nullptr)
Definition: names.cpp:264
void initFromConfig()
Definition: names.cpp:311
std::map< retdec::common::Address, Names > _data
Definition: names.h:193
void initFromImage()
Definition: names.cpp:363
Lti * _lti
Definition: names.h:191
bool addNameForAddress(retdec::common::Address a, const std::string &name, Name::eType type, Lti *lti=nullptr)
Definition: names.cpp:286
const Names & getNamesForAddress(retdec::common::Address a)
Definition: names.cpp:301
DebugFormat * _debug
Definition: names.h:189
std::map< std::string, ImportOrdMap > _dllOrds
<library name without suffix ".dll", map with ordinals>
Definition: names.h:195
std::map< int, std::string > ImportOrdMap
<ordinal number, function name>
Definition: names.h:185
bool loadImportOrds(const std::string &libName)
Definition: names.cpp:504
Definition: names.h:63
std::string _name
Definition: names.h:119
eType
Definition: names.h:70
void fixPic32Mangling()
Definition: names.cpp:149
Name()
Definition: names.cpp:76
eType getType() const
Definition: names.cpp:144
const std::string & getName() const
Definition: names.cpp:139
bool operator<(const Name &o) const
Definition: names.cpp:108
void fixPostfix()
Definition: names.cpp:196
eType _type
Definition: names.h:120
Definition: names.h:202
static std::map< llvm::Module *, NameContainer > _module2names
Definition: names.h:216
static NameContainer * addNames(llvm::Module *m, Config *c, DebugFormat *d, FileImage *i, Demangler *dm, Lti *lti)
Definition: names.cpp:549
static void clear()
Definition: names.cpp:582
static NameContainer * getNames(llvm::Module *m)
Definition: names.cpp:570
Definition: names.h:127
const Name & getPreferredName()
Definition: names.cpp:233
std::size_t size() const
Definition: names.cpp:248
bool empty() const
Definition: names.cpp:253
iterator end()
Definition: names.cpp:243
iterator begin()
Definition: names.cpp:238
typename std::set< Name >::iterator iterator
Definition: names.h:129
std::set< Name > _names
Definition: names.h:146
bool addName(Config *c, const std::string &name, Name::eType type, Lti *lti=nullptr)
Definition: names.cpp:217
static Name _emptyName
Definition: names.h:147
Definition: address.h:21
Address, address pair and other derived class representation.
File image provider for bin2llvmirl.
Library type information provider for bin2llvmirl.
The frontend-end part of the decompiler.
std::string generateFunctionNameUndef(unsigned cntr)
Definition: names.cpp:58
std::string generateFunctionNameUnknown(common::Address a, bool ida=false)
Definition: names.cpp:31
const std::string entryPointName
Definition: names.h:25
const std::string pseudoReturnFunction
Definition: names.h:38
std::string generateVtableName(common::Address a)
Definition: names.cpp:63
const std::string generatedVtablePrefix
Definition: names.h:35
std::string generateFunctionName(common::Address a, bool ida=false)
Definition: names.cpp:24
const std::string pseudoCondBranchFunction
Definition: names.h:40
const std::string generatedFunctionPrefixUnk
Definition: names.h:29
std::string generateBasicBlockName(common::Address a)
Definition: names.cpp:48
const std::string pseudoX87dataLoadFunction
Definition: names.h:41
const std::string generatedFunctionPrefix
Definition: names.h:27
const std::string generatedGlobalVarPrefix
Definition: names.h:30
const std::string generatedUndefFunctionPrefix
Definition: names.h:34
const std::string generatedFunctionPrefixIDA
Definition: names.h:28
const std::string generatedTempVarPrefix
Definition: names.h:32
std::string generateTempVariableName(common::Address a, unsigned cntr)
Definition: names.cpp:53
const std::string generatedImportPrefix
Definition: names.h:26
const std::string generatedBasicBlockPrefix
Definition: names.h:33
const std::string pseudoBranchFunction
Definition: names.h:39
const std::string pseudoCallFunction
Definition: names.h:37
const std::string generatedStackVarPrefix
Definition: names.h:31
std::string generateStackVarName(int offset, const std::string &name=std::string())
Definition: names.cpp:42
std::string generateGlobalVarName(common::Address a, const std::string &name=std::string())
Definition: names.cpp:36
const std::string pseudoX87dataStoreFunction
Definition: names.h:42
const std::string asm2llvmGv
Definition: names.h:36
Definition: archive_wrapper.h:19