7 #ifndef RETDEC_BIN2LLVMIR_OPTIMIZATIONS_SIMPLE_TYPES_SIMPLE_TYPES_H
8 #define RETDEC_BIN2LLVMIR_OPTIMIZATIONS_SIMPLE_TYPES_SIMPLE_TYPES_H
14 #include <unordered_map>
15 #include <unordered_set>
17 #include <llvm/IR/Function.h>
18 #include <llvm/IR/Module.h>
19 #include <llvm/Pass.h>
54 std::size_t
hash()
const;
75 std::size_t
hash()
const;
79 llvm::Type*
type =
nullptr;
98 std::size_t
hash()
const;
135 EqSet(std::size_t
id);
143 std::unordered_set<llvm::Instruction*>& instToErase);
156 std::unordered_set<llvm::Type*>& seen);
160 const std::size_t
id;
185 std::unordered_set<llvm::Instruction*>& valsToErase);
193 using ValueMap = std::unordered_map<llvm::Value*, EqSet*>;
194 using ValuePair = std::pair<llvm::Value*, llvm::Value*>;
206 virtual bool runOnModule(llvm::Module& m)
override;
214 void processUse(llvm::Value* c, llvm::Value* x, std::queue<llvm::Value*>& toProcess,
EqSet& eqSet);
Definition: simple_types.h:177
friend std::ostream & operator<<(std::ostream &out, const EqSetContainer &eqs)
Definition: simple_types.cpp:750
EqSet & createEmptySet()
Definition: simple_types.cpp:724
std::list< EqSet > eqSets
Definition: simple_types.h:190
void apply(llvm::Module *module, Config *config, FileImage *objf, std::unordered_set< llvm::Instruction * > &valsToErase)
Definition: simple_types.cpp:738
void propagate(llvm::Module *module)
Definition: simple_types.cpp:730
Definition: simple_types.h:133
TypeEntrySet typeSet
This allows to add certain types to set without having a value for them.
Definition: simple_types.h:167
EqSet(std::size_t id)
Definition: simple_types.cpp:767
void apply(llvm::Module *module, Config *config, FileImage *objf, std::unordered_set< llvm::Instruction * > &instToErase)
Definition: simple_types.cpp:1220
ValueEntrySet valSet
Values in the set.
Definition: simple_types.h:165
friend std::ostream & operator<<(std::ostream &out, const EqSet &eq)
Definition: simple_types.cpp:1272
llvm::Type * getHigherPriorityType(llvm::Module *module, llvm::Type *t1, llvm::Type *t2)
Definition: simple_types.cpp:843
void propagate(llvm::Module *module)
Definition: simple_types.cpp:1152
const std::size_t id
Each instance gets its own unique ID for debug print purposes.
Definition: simple_types.h:160
llvm::Type * getHigherPriorityTypePrivate(llvm::Module *module, llvm::Type *t1, llvm::Type *t2, std::unordered_set< llvm::Type * > &seen)
Definition: simple_types.cpp:860
EquationEntrySet equationSet
Definition: simple_types.h:170
void insert(Config *config, llvm::Value *v, eSourcePriority p=eSourcePriority::PRIORITY_NONE)
Definition: simple_types.cpp:773
TypeEntry masterType
Type of an entire equivalence set.
Definition: simple_types.h:163
Definition: simple_types.h:91
bool operator==(const EquationEntry &o) const
Definition: simple_types.cpp:1430
eqType type
Definition: simple_types.h:118
EquationEntry(EqSet *o, eqType t)
Definition: simple_types.cpp:1413
std::size_t hash() const
Definition: simple_types.cpp:1440
static EquationEntry otherIsPtrToThis(EqSet *o)
Definition: simple_types.cpp:1420
eqType
Definition: simple_types.h:109
bool operator<(const EquationEntry &o) const
Definition: simple_types.cpp:1435
bool isOtherIsPtrToThis()
Definition: simple_types.cpp:1446
static EquationEntry thisIsPtrToOther(EqSet *o)
Definition: simple_types.cpp:1425
friend std::ostream & operator<<(std::ostream &out, const EquationEntry &ee)
Definition: simple_types.cpp:1456
EqSet * other
Definition: simple_types.h:105
bool isThisIsPtrToOther()
Definition: simple_types.cpp:1451
Definition: fileimage.h:27
Definition: reaching_definitions.h:121
Definition: simple_types.h:201
void buildEquations()
Definition: simple_types.cpp:685
virtual bool runOnModule(llvm::Module &m) override
Definition: simple_types.cpp:70
ReachingDefinitionsAnalysis RDA
Definition: simple_types.h:223
Config * config
Definition: simple_types.h:226
std::unordered_set< llvm::Instruction * > instToErase
Definition: simple_types.h:229
void processValue(std::queue< llvm::Value * > &toProcess, EqSet &eqSet)
Definition: simple_types.cpp:360
void processUse(llvm::Value *c, llvm::Value *x, std::queue< llvm::Value * > &toProcess, EqSet &eqSet)
Definition: simple_types.cpp:384
virtual void getAnalysisUsage(llvm::AnalysisUsage &AU) const override
Definition: simple_types.cpp:65
void setGlobalConstants()
Definition: simple_types.cpp:226
llvm::Module * module
Definition: simple_types.h:224
void processRoot(llvm::Value *root)
Definition: simple_types.cpp:332
void buildEqSets(llvm::Module &M)
Definition: simple_types.cpp:291
ValuePairList val2PtrVal
Definition: simple_types.h:221
SimpleTypesAnalysis()
Definition: simple_types.cpp:59
FileImage * objf
Definition: simple_types.h:227
const llvm::GlobalVariable * _specialGlobal
Definition: simple_types.h:225
EqSetContainer eqSets
Definition: simple_types.h:220
void eraseObsoleteInstructions()
Definition: simple_types.cpp:710
ValueMap processedObjs
Definition: simple_types.h:219
static char ID
Definition: simple_types.h:203
Definition: simple_types.h:70
eSourcePriority priority
Definition: simple_types.h:80
bool operator==(const TypeEntry &o) const
Definition: simple_types.cpp:1384
friend std::ostream & operator<<(std::ostream &out, const TypeEntry &te)
Definition: simple_types.cpp:1400
std::size_t hash() const
Definition: simple_types.cpp:1394
TypeEntry(llvm::Type *t=nullptr, eSourcePriority p=eSourcePriority::PRIORITY_NONE)
Definition: simple_types.cpp:1377
bool operator<(const TypeEntry &o) const
Definition: simple_types.cpp:1389
llvm::Type * type
Definition: simple_types.h:79
Definition: simple_types.h:48
std::size_t hash() const
Definition: simple_types.cpp:1355
llvm::Type * getTypeForPropagation() const
Definition: simple_types.cpp:1316
bool operator==(const ValueEntry &o) const
Definition: simple_types.cpp:1345
ValueEntry(llvm::Value *v=nullptr, eSourcePriority p=eSourcePriority::PRIORITY_NONE)
Definition: simple_types.cpp:1301
llvm::Value * value
Definition: simple_types.h:58
bool operator<(const ValueEntry &o) const
Definition: simple_types.cpp:1350
eSourcePriority priority
Definition: simple_types.h:59
friend std::ostream & operator<<(std::ostream &out, const ValueEntry &ve)
Definition: simple_types.cpp:1361
File image provider for bin2llvmirl.
ShPtr< Module > module
The current module.
Definition: hll_writer.cpp:100
The frontend-end part of the decompiler.
std::pair< llvm::Value *, llvm::Value * > ValuePair
Definition: simple_types.h:194
std::unordered_set< EquationEntry, EquationEntryHash > EquationEntrySet
Definition: simple_types.h:127
std::unordered_set< ValueEntry, ValueEntryHash > ValueEntrySet
Definition: simple_types.h:125
eSourcePriority
Definition: simple_types.h:38
std::list< ValuePair > ValuePairList
Definition: simple_types.h:195
std::unordered_set< TypeEntry, TypeEntryHash > TypeEntrySet
Definition: simple_types.h:126
std::unordered_map< llvm::Value *, EqSet * > ValueMap
Definition: simple_types.h:193
Definition: archive_wrapper.h:19
Definition: simple_types.h:121
std::size_t operator()(const EquationEntry &e) const
Definition: simple_types.h:122
Definition: simple_types.h:83
std::size_t operator()(const TypeEntry &t) const
Definition: simple_types.h:84
Definition: simple_types.h:62
std::size_t operator()(const ValueEntry &v) const
Definition: simple_types.h:63