Static Value-Flow Analysis
LLVMModule.h
Go to the documentation of this file.
1 //===- LLVMModule.h -- LLVM Module class-----------------------------------------//
2 //
3 // SVF: Static Value-Flow Analysis
4 //
5 // Copyright (C) <2013-> <Yulei Sui>
6 //
7 
8 // This program is free software: you can redistribute it and/or modify
9 // it under the terms of the GNU Affero General Public License as published by
10 // the Free Software Foundation, either version 3 of the License, or
11 // (at your option) any later version.
12 
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 // GNU Affero General Public License for more details.
17 
18 // You should have received a copy of the GNU Affero General Public License
19 // along with this program. If not, see <http://www.gnu.org/licenses/>.
20 //
21 //===----------------------------------------------------------------------===//
22 
23 /*
24  * LLVMModule.h
25  *
26  * Created on: 23 Mar.2020
27  * Author: Yulei Sui
28  */
29 
30 #ifndef INCLUDE_SVF_FE_LLVMMODULE_H_
31 #define INCLUDE_SVF_FE_LLVMMODULE_H_
32 
33 #include "SVF-LLVM/BasicTypes.h"
34 #include "SVFIR/SVFValue.h"
35 #include "SVFIR/SVFModule.h"
36 #include "Util/Options.h"
37 
38 namespace SVF
39 {
40 
41 class SymbolTableInfo;
42 class ObjTypeInference;
43 
45 {
46  friend class SVFIRBuilder;
47  friend class ICFGBuilder;
48 
49 public:
50 
51  typedef std::vector<const Function*> FunctionSetType;
55 
67 
73 
74 private:
76  static bool preProcessed;
80  std::unique_ptr<LLVMContext> owned_ctx;
81  std::vector<std::unique_ptr<Module>> owned_modules;
82  std::vector<std::reference_wrapper<Module>> modules;
83 
90 
101 
109 
111  LLVMModuleSet();
112 
113  void build();
114 
115 public:
116  ~LLVMModuleSet();
117 
119  {
120  if (!llvmModuleSet)
122  return llvmModuleSet;
123  }
124 
125  static void releaseLLVMModuleSet()
126  {
127  delete llvmModuleSet;
128  llvmModuleSet = nullptr;
129  }
130 
131  // Build an SVF module from a given LLVM Module instance (for use e.g. in a LLVM pass)
132  static SVFModule* buildSVFModule(Module& mod);
133 
134  // Build an SVF module from the bitcode files provided in `moduleNameVec`
135  static SVFModule* buildSVFModule(const std::vector<std::string>& moduleNameVec);
136 
138  {
139  return svfModule;
140  }
141 
142  static void preProcessBCs(std::vector<std::string>& moduleNameVec);
143 
145  {
146  return modules.size();
147  }
148 
149  const std::vector<std::reference_wrapper<Module>>& getLLVMModules() const
150  {
151  return modules;
152  }
153 
154  Module *getModule(u32_t idx) const
155  {
156  return &getModuleRef(idx);
157  }
158 
160  {
161  assert(idx < getModuleNum() && "Out of range.");
162  return modules[idx];
163  }
164 
165  // Dump modules to files
166  void dumpModulesToFile(const std::string& suffix);
167 
168  inline void addFunctionMap(const Function* func, SVFFunction* svfFunc)
169  {
170  LLVMFunc2SVFFunc[func] = svfFunc;
171  setValueAttr(func,svfFunc);
172  }
173  inline void addBasicBlockMap(const BasicBlock* bb, SVFBasicBlock* svfBB)
174  {
175  LLVMBB2SVFBB[bb] = svfBB;
176  setValueAttr(bb,svfBB);
177  }
178  inline void addInstructionMap(const Instruction* inst, SVFInstruction* svfInst)
179  {
180  LLVMInst2SVFInst[inst] = svfInst;
181  setValueAttr(inst,svfInst);
182  }
183  inline void addArgumentMap(const Argument* arg, SVFArgument* svfArg)
184  {
185  LLVMArgument2SVFArgument[arg] = svfArg;
186  setValueAttr(arg,svfArg);
187  }
188  inline void addGlobalValueMap(const GlobalValue* glob, SVFGlobalValue* svfglob)
189  {
190  if (auto glob_var = llvm::dyn_cast<llvm::GlobalVariable>(glob);
191  hasGlobalRep(glob_var))
192  {
193  glob = getGlobalRep(glob_var);
194  }
195  LLVMConst2SVFConst[glob] = svfglob;
196  setValueAttr(glob,svfglob);
197  }
198  inline void addConstantDataMap(const ConstantData* cd, SVFConstantData* svfcd)
199  {
200  LLVMConst2SVFConst[cd] = svfcd;
201  setValueAttr(cd,svfcd);
202  }
203  inline void addOtherConstantMap(const Constant* cons, SVFConstant* svfcons)
204  {
205  LLVMConst2SVFConst[cons] = svfcons;
206  setValueAttr(cons,svfcons);
207  }
208  inline void addOtherValueMap(const Value* ov, SVFOtherValue* svfov)
209  {
210  LLVMValue2SVFOtherValue[ov] = svfov;
211  setValueAttr(ov,svfov);
212  }
213 
214  SVFValue* getSVFValue(const Value* value);
215 
216  const Value* getLLVMValue(const SVFValue* value) const
217  {
218  SVFValue2LLVMValueMap::const_iterator it = SVFValue2LLVMValue.find(value);
219  assert(it!=SVFValue2LLVMValue.end() && "can't find corresponding llvm value!");
220  return it->second;
221  }
222 
223  const Value* getLLVMValue(const SVFBaseNode* value) const
224  {
225  SVFBaseNode2LLVMValueMap ::const_iterator it = SVFBaseNode2LLVMValue.find(value);
226  assert(it!=SVFBaseNode2LLVMValue.end() && "can't find corresponding llvm value!");
227  return it->second;
228  }
229 
230  inline SVFFunction* getSVFFunction(const Function* fun) const
231  {
232  LLVMFun2SVFFunMap::const_iterator it = LLVMFunc2SVFFunc.find(fun);
233  assert(it!=LLVMFunc2SVFFunc.end() && "SVF Function not found!");
234  return it->second;
235  }
236 
237  inline SVFBasicBlock* getSVFBasicBlock(const BasicBlock* bb) const
238  {
239  LLVMBB2SVFBBMap::const_iterator it = LLVMBB2SVFBB.find(bb);
240  assert(it!=LLVMBB2SVFBB.end() && "SVF BasicBlock not found!");
241  return it->second;
242  }
243 
244  inline SVFInstruction* getSVFInstruction(const Instruction* inst) const
245  {
246  LLVMInst2SVFInstMap::const_iterator it = LLVMInst2SVFInst.find(inst);
247  assert(it!=LLVMInst2SVFInst.end() && "SVF Instruction not found!");
248  return it->second;
249  }
250 
251  inline SVFArgument* getSVFArgument(const Argument* arg) const
252  {
253  LLVMArgument2SVFArgumentMap::const_iterator it = LLVMArgument2SVFArgument.find(arg);
254  assert(it!=LLVMArgument2SVFArgument.end() && "SVF Argument not found!");
255  return it->second;
256  }
257 
259  {
260  if (auto glob_var = llvm::dyn_cast<llvm::GlobalVariable>(g);
261  hasGlobalRep(glob_var))
262  {
263  g = getGlobalRep(glob_var);
264  }
265  LLVMConst2SVFConstMap::const_iterator it = LLVMConst2SVFConst.find(g);
266  assert(it!=LLVMConst2SVFConst.end() && "SVF Global not found!");
267  assert(SVFUtil::isa<SVFGlobalValue>(it->second) && "not a SVFGlobal type!");
268  return SVFUtil::cast<SVFGlobalValue>(it->second);
269  }
270 
273 
275 
278  {
279  Function* fun = nullptr;
280 
281  for (u32_t i = 0; i < llvmModuleSet->getModuleNum(); ++i)
282  {
283  Module* mod = llvmModuleSet->getModule(i);
284  fun = mod->getFunction(name);
285  if (fun)
286  {
287  return llvmModuleSet->getSVFFunction(fun);
288  }
289  }
290  return nullptr;
291  }
292 
293  ICFGNode* getICFGNode(const Instruction* inst);
294 
295  bool hasICFGNode(const Instruction* inst);
296 
303 
306  {
308  assert(b && "Function entry not created?");
309  return b;
310  }
313  {
315  assert(b && "Function exit not created?");
316  return b;
317  }
318 
319 
321  bool hasGlobalRep(const GlobalVariable* val) const
322  {
323  GlobalDefToRepMapTy::const_iterator it = GlobalDefToRepMap.find(val);
324  return it != GlobalDefToRepMap.end();
325  }
326 
328  {
329  GlobalDefToRepMapTy::const_iterator it = GlobalDefToRepMap.find(val);
330  assert(it != GlobalDefToRepMap.end() && "has no rep?");
331  return it->second;
332  }
333 
335  {
336  assert(!empty() && "empty LLVM module!!");
337  for (size_t i = 0; i < getModuleNum(); ++i)
338  {
339  Module& module = getModuleRef(i);
340  if (module.getName().str() != ExtAPI::getExtAPI()->getExtBcPath())
341  {
342  return &module;
343  }
344  }
345  assert(false && "no main module found!");
346  return nullptr;
347  }
348 
350  {
351  assert(!empty() && "empty LLVM module!!");
352  return getMainLLVMModule()->getContext();
353  }
354 
355  bool empty() const
356  {
357  return getModuleNum() == 0;
358  }
359 
361  SVFType* getSVFType(const Type* T);
363  const Type* getLLVMType(const SVFType* T) const;
364 
366 
367  inline ICFG* getICFG()
368  {
369  return icfg;
370  }
371 
372 private:
374  SVFType* addSVFTypeInfo(const Type* t);
376  StInfo* collectTypeInfo(const Type* ty);
378  StInfo* collectStructInfo(const StructType* structTy, u32_t& numFields);
380  StInfo* collectArrayInfo(const ArrayType* T);
382  StInfo* collectSimpleTypeInfo(const Type* T);
383 
384  std::vector<const Function*> getLLVMGlobalFunctions(const GlobalVariable* global);
385 
386  void loadModules(const std::vector<std::string>& moduleNameVec);
387  // Loads ExtAPI bitcode file; uses LLVMContext made while loading module bitcode files or from Module
388  void loadExtAPIModules();
389  void addSVFMain();
390 
391  void createSVFDataStructure();
392  void createSVFFunction(const Function* func);
393  void initSVFFunction();
394  void initSVFBasicBlock(const Function* func);
395  void initDomTree(SVFFunction* func, const Function* f);
396  void setValueAttr(const Value* val, SVFValue* value);
397  void setValueAttr(const Value* val, SVFBaseNode* svfBaseNode);
398  void buildFunToFunMap();
399  void buildGlobalDefToRepMap();
401  void prePassSchedule();
402  void buildSymbolTable() const;
403  void collectExtFunAnnotations(const Module* mod);
404 
407  {
408  CSToCallNodeMapTy::const_iterator it = CSToCallNodeMap.find(cs);
409  if (it == CSToCallNodeMap.end())
410  return nullptr;
411  return it->second;
412  }
413 
416  {
417  CSToRetNodeMapTy::const_iterator it = CSToRetNodeMap.find(cs);
418  if (it == CSToRetNodeMap.end())
419  return nullptr;
420  return it->second;
421  }
422 
424  {
425  InstToBlockNodeMapTy::const_iterator it = InstToBlockNodeMap.find(inst);
426  if (it == InstToBlockNodeMap.end())
427  return nullptr;
428  return it->second;
429  }
430 
433  {
434  FunToFunEntryNodeMapTy::const_iterator it = FunToFunEntryNodeMap.find(fun);
435  if (it == FunToFunEntryNodeMap.end())
436  return nullptr;
437  return it->second;
438  }
439 
442  {
443  FunToFunExitNodeMapTy::const_iterator it = FunToFunExitNodeMap.find(fun);
444  if (it == FunToFunExitNodeMap.end())
445  return nullptr;
446  return it->second;
447  }
448 };
449 
450 } // End namespace SVF
451 
452 #endif /* INCLUDE_SVF_FE_LLVMMODULE_H_ */
const cJSON *const b
Definition: cJSON.h:255
const char *const name
Definition: cJSON.h:264
const char *const string
Definition: cJSON.h:172
std::string getExtBcPath()
Definition: ExtAPI.cpp:119
static ExtAPI * getExtAPI()
Definition: ExtAPI.cpp:42
Definition: ICFG.h:48
void addOtherValueMap(const Value *ov, SVFOtherValue *svfov)
Definition: LLVMModule.h:208
void createSVFFunction(const Function *func)
Definition: LLVMModule.cpp:252
Map< const Instruction *, SVFInstruction * > LLVMInst2SVFInstMap
Definition: LLVMModule.h:58
LLVMType2SVFTypeMap LLVMType2SVFType
Definition: LLVMModule.h:98
std::vector< const Function * > getLLVMGlobalFunctions(const GlobalVariable *global)
Definition: LLVMModule.cpp:625
bool hasGlobalRep(const GlobalVariable *val) const
Global to rep.
Definition: LLVMModule.h:321
SVFOtherValue * getSVFOtherValue(const Value *ov)
LLVMBB2SVFBBMap LLVMBB2SVFBB
Definition: LLVMModule.h:92
void buildSymbolTable() const
Definition: LLVMModule.cpp:144
SVFModule * getSVFModule()
Definition: LLVMModule.h:137
std::vector< const Function * > FunctionSetType
Definition: LLVMModule.h:51
void addInstructionMap(const Instruction *inst, SVFInstruction *svfInst)
Definition: LLVMModule.h:178
StInfo * collectTypeInfo(const Type *ty)
Collect a type info.
void initSVFBasicBlock(const Function *func)
Definition: LLVMModule.cpp:329
Map< const Value *, SVFOtherValue * > LLVMValue2SVFOtherValueMap
Definition: LLVMModule.h:61
InstToBlockNodeMapTy InstToBlockNodeMap
map a basic block to its ICFGNode
Definition: LLVMModule.h:105
SVFConstantData * getSVFConstantData(const ConstantData *cd)
FunExitICFGNode * getFunExitBlock(const Function *fun)
Get/Add a function exit node.
Definition: LLVMModule.h:441
Map< const Function *, FunEntryICFGNode * > FunToFunEntryNodeMapTy
Definition: LLVMModule.h:71
void loadModules(const std::vector< std::string > &moduleNameVec)
Definition: LLVMModule.cpp:521
FunEntryICFGNode * getFunEntryBlock(const Function *fun)
Get/Add a function entry node.
Definition: LLVMModule.h:432
ObjTypeInference * typeInference
Definition: LLVMModule.h:100
static void releaseLLVMModuleSet()
Definition: LLVMModule.h:125
static void preProcessBCs(std::vector< std::string > &moduleNameVec)
Definition: LLVMModule.cpp:500
static bool preProcessed
Definition: LLVMModule.h:76
Map< const Type *, StInfo * > Type2TypeInfoMap
Definition: LLVMModule.h:65
SVFGlobalValue * getSVFGlobalValue(const GlobalValue *g) const
Definition: LLVMModule.h:258
void addBasicBlockMap(const BasicBlock *bb, SVFBasicBlock *svfBB)
Definition: LLVMModule.h:173
Map< const BasicBlock *, SVFBasicBlock * > LLVMBB2SVFBBMap
Definition: LLVMModule.h:57
FunExitICFGNode * getFunExitICFGNode(const Function *fun)
Add a function exit node.
Definition: LLVMModule.h:312
const std::vector< std::reference_wrapper< Module > > & getLLVMModules() const
Definition: LLVMModule.h:149
LLVMInst2SVFInstMap LLVMInst2SVFInst
Definition: LLVMModule.h:93
SVFModule * svfModule
Borrowed from singleton SVFModule::svfModule.
Definition: LLVMModule.h:78
FunEntryICFGNode * getFunEntryICFGNode(const Function *fun)
Add a function entry node.
Definition: LLVMModule.h:305
std::unique_ptr< LLVMContext > owned_ctx
Definition: LLVMModule.h:80
LLVMConst2SVFConstMap LLVMConst2SVFConst
Definition: LLVMModule.h:95
void createSVFDataStructure()
Definition: LLVMModule.cpp:179
Map< const GlobalVariable *, GlobalVariable * > GlobalDefToRepMapTy
Definition: LLVMModule.h:54
SVFFunction * getSVFFunction(const Function *fun) const
Definition: LLVMModule.h:230
StInfo * collectSimpleTypeInfo(const Type *T)
Collect simple type (non-aggregate) info.
SymbolTableInfo * symInfo
Definition: LLVMModule.h:77
void addArgumentMap(const Argument *arg, SVFArgument *svfArg)
Definition: LLVMModule.h:183
Map< const Instruction *, RetICFGNode * > CSToRetNodeMapTy
Definition: LLVMModule.h:69
Map< const Instruction *, IntraICFGNode * > InstToBlockNodeMapTy
Definition: LLVMModule.h:70
void addOtherConstantMap(const Constant *cons, SVFConstant *svfcons)
Definition: LLVMModule.h:203
SVFType * getSVFType(const Type *T)
Get or create SVFType and typeinfo.
const Type * getLLVMType(const SVFType *T) const
Get LLVM Type.
Map< const Function *, FunExitICFGNode * > FunToFunExitNodeMapTy
Definition: LLVMModule.h:72
bool hasICFGNode(const Instruction *inst)
const SVFFunction * getSVFFunction(const std::string &name)
Get the corresponding Function based on its name.
Definition: LLVMModule.h:277
ICFGNode * getICFGNode(const Instruction *inst)
Get a basic block ICFGNode.
SVFConstant * getOtherSVFConstant(const Constant *oc)
GlobalVariable * getGlobalRep(const GlobalVariable *val) const
Definition: LLVMModule.h:327
CallICFGNode * getCallICFGNode(const Instruction *cs)
get a call node
Fun2AnnoMap ExtFun2Annotations
Record annotations of function in extapi.bc.
Definition: LLVMModule.h:87
void setValueAttr(const Value *val, SVFValue *value)
void addGlobalValueMap(const GlobalValue *glob, SVFGlobalValue *svfglob)
Definition: LLVMModule.h:188
SVFValue2LLVMValueMap SVFValue2LLVMValue
Definition: LLVMModule.h:97
LLVMArgument2SVFArgumentMap LLVMArgument2SVFArgument
Definition: LLVMModule.h:94
RetICFGNode * getRetICFGNode(const Instruction *cs)
get a return node
Module * getModule(u32_t idx) const
Definition: LLVMModule.h:154
void prePassSchedule()
Invoke llvm passes to modify module.
Definition: LLVMModule.cpp:476
void initDomTree(SVFFunction *func, const Function *f)
Definition: LLVMModule.cpp:403
StInfo * collectStructInfo(const StructType *structTy, u32_t &numFields)
Collect the struct info and set the number of fields after flattening.
CSToCallNodeMapTy CSToCallNodeMap
map a callsite to its CallICFGNode
Definition: LLVMModule.h:103
CSToRetNodeMapTy CSToRetNodeMap
map a callsite to its RetICFGNode
Definition: LLVMModule.h:104
LLVMFun2SVFFunMap LLVMFunc2SVFFunc
Map an LLVM Function to an SVF Function.
Definition: LLVMModule.h:91
Module * getMainLLVMModule() const
Definition: LLVMModule.h:334
SVFBaseNode2LLVMValueMap SVFBaseNode2LLVMValue
Definition: LLVMModule.h:102
PTACallGraph * callgraph
Definition: LLVMModule.h:108
Map< const SVFValue *, const Value * > SVFValue2LLVMValueMap
Definition: LLVMModule.h:62
StInfo * collectArrayInfo(const ArrayType *T)
Collect the array info.
LLVMModuleSet()
Constructor.
Definition: LLVMModule.cpp:80
void buildGlobalDefToRepMap()
SVFType * addSVFTypeInfo(const Type *t)
Create SVFTypes.
const Value * getLLVMValue(const SVFValue *value) const
Definition: LLVMModule.h:216
SVFBasicBlock * getSVFBasicBlock(const BasicBlock *bb) const
Definition: LLVMModule.h:237
void addFunctionMap(const Function *func, SVFFunction *svfFunc)
Definition: LLVMModule.h:168
Map< const Instruction *, CallICFGNode * > CSToCallNodeMapTy
Definition: LLVMModule.h:68
FunctionSetType ExtFuncsVec
Record some "sse_" function declarations used in other ext function definition, e....
Definition: LLVMModule.h:85
CallICFGNode * getCallBlock(const Instruction *cs)
Get/Add a call node.
Definition: LLVMModule.h:406
Map< const Argument *, SVFArgument * > LLVMArgument2SVFArgumentMap
Definition: LLVMModule.h:59
FunToFunEntryNodeMapTy FunToFunEntryNodeMap
map a function to its FunExitICFGNode
Definition: LLVMModule.h:106
Map< const Constant *, SVFConstant * > LLVMConst2SVFConstMap
Definition: LLVMModule.h:60
LLVMContext & getContext() const
Definition: LLVMModule.h:349
LLVMValue2SVFOtherValueMap LLVMValue2SVFOtherValue
Definition: LLVMModule.h:96
static LLVMModuleSet * llvmModuleSet
Definition: LLVMModule.h:75
IntraICFGNode * getIntraICFGNode(const Instruction *inst)
get a intra node
Map< const SVFBaseNode *, const Value * > SVFBaseNode2LLVMValueMap
Definition: LLVMModule.h:63
std::vector< std::reference_wrapper< Module > > modules
Definition: LLVMModule.h:82
static LLVMModuleSet * getLLVMModuleSet()
Definition: LLVMModule.h:118
Map< const Function *, const Function * > FunDeclToDefMapTy
Definition: LLVMModule.h:52
Map< const Function *, SVFFunction * > LLVMFun2SVFFunMap
Definition: LLVMModule.h:56
SVFArgument * getSVFArgument(const Argument *arg) const
Definition: LLVMModule.h:251
Module & getModuleRef(u32_t idx) const
Definition: LLVMModule.h:159
FunToFunExitNodeMapTy FunToFunExitNodeMap
map a function to its FunEntryICFGNode
Definition: LLVMModule.h:107
bool empty() const
Definition: LLVMModule.h:355
Map< std::string, std::vector< std::string > > Fun2AnnoMap
Definition: LLVMModule.h:66
u32_t getModuleNum() const
Definition: LLVMModule.h:144
GlobalDefToRepMapTy GlobalDefToRepMap
Global definition to a rep definition map.
Definition: LLVMModule.h:89
std::vector< std::unique_ptr< Module > > owned_modules
Definition: LLVMModule.h:81
SVFInstruction * getSVFInstruction(const Instruction *inst) const
Definition: LLVMModule.h:244
static SVFModule * buildSVFModule(Module &mod)
Definition: LLVMModule.cpp:102
const Value * getLLVMValue(const SVFBaseNode *value) const
Definition: LLVMModule.h:223
IntraICFGNode * getIntraBlock(const Instruction *inst)
Definition: LLVMModule.h:423
Map< const Type *, SVFType * > LLVMType2SVFTypeMap
Definition: LLVMModule.h:64
Type2TypeInfoMap Type2TypeInfo
Definition: LLVMModule.h:99
Map< const Function *, FunctionSetType > FunDefToDeclsMapTy
Definition: LLVMModule.h:53
void dumpModulesToFile(const std::string &suffix)
void addConstantDataMap(const ConstantData *cd, SVFConstantData *svfcd)
Definition: LLVMModule.h:198
RetICFGNode * getRetBlock(const Instruction *cs)
Get/Add a return node.
Definition: LLVMModule.h:415
void collectExtFunAnnotations(const Module *mod)
Definition: LLVMModule.cpp:808
ObjTypeInference * getTypeInference()
Definition: LLVMModule.cpp:97
SVFValue * getSVFValue(const Value *value)
for isBitcode
Definition: BasicTypes.h:68
llvm::GlobalVariable GlobalVariable
Definition: BasicTypes.h:130
llvm::ArrayType ArrayType
Definition: BasicTypes.h:95
llvm::Type Type
Definition: BasicTypes.h:83
llvm::BasicBlock BasicBlock
Definition: BasicTypes.h:86
llvm::StructType StructType
LLVM types.
Definition: BasicTypes.h:94
llvm::Argument Argument
Definition: BasicTypes.h:145
llvm::Function Function
Definition: BasicTypes.h:85
llvm::GlobalValue GlobalValue
Definition: BasicTypes.h:88
llvm::ConstantData ConstantData
Definition: BasicTypes.h:116
llvm::Instruction Instruction
Definition: BasicTypes.h:87
llvm::Constant Constant
Definition: BasicTypes.h:124
std::unordered_map< Key, Value, Hash, KeyEqual, Allocator > Map
Definition: GeneralType.h:101
llvm::Value Value
LLVM Basic classes.
Definition: BasicTypes.h:82
llvm::Module Module
Definition: BasicTypes.h:84
unsigned u32_t
Definition: GeneralType.h:46
llvm::LLVMContext LLVMContext
Definition: BasicTypes.h:70