7 #ifndef RETDEC_BIN2LLVMIR_OPTIMIZATIONS_DECODER_DECODER_H
8 #define RETDEC_BIN2LLVMIR_OPTIMIZATIONS_DECODER_DECODER_H
15 #include <llvm/IR/CFG.h>
16 #include <llvm/IR/Function.h>
17 #include <llvm/IR/InstIterator.h>
18 #include <llvm/IR/Module.h>
19 #include <llvm/Pass.h>
20 #include <llvm/Transforms/Utils/BasicBlockUtils.h>
57 using ByteData =
typename std::pair<const std::uint8_t*, std::size_t>;
100 llvm::IRBuilder<>& irb);
105 std::size_t& rangeSize);
108 llvm::CallInst* branchCall,
112 llvm::CallInst* branchCall,
122 llvm::IRBuilder<>& irb);
127 llvm::IRBuilder<>& irb);
145 llvm::BasicBlock* insertAfter =
nullptr);
148 std::map<common::Address, llvm::BasicBlock*>
_addr2bb;
149 std::map<llvm::BasicBlock*, common::Address>
_bb2addr;
163 bool declaration =
false);
165 void addFunctionSize(llvm::Function* f, std::optional<std::size_t> sz);
178 std::map<llvm::Function*, std::size_t>
_fnc2sz;
193 bool strict =
false);
201 bool strict =
false);
206 std::size_t &decodedSz,
207 bool strict =
false);
217 bool strict =
false);
232 bool strict =
false);
241 bool strict =
false);
247 llvm::CallInst* pseudo,
248 llvm::Function* callee);
250 llvm::CallInst* pseudo,
252 llvm::Function* callee,
253 llvm::BasicBlock* falseBb);
256 llvm::CallInst* pseudo,
257 llvm::BasicBlock* branchee);
259 llvm::CallInst* pseudo,
261 llvm::BasicBlock* trueBb,
262 llvm::BasicBlock* falseBb);
264 llvm::CallInst* pseudo,
266 llvm::BasicBlock* defaultBb,
267 const std::vector<llvm::BasicBlock*>& cases);
273 llvm::Function*& tFnc,
274 llvm::BasicBlock*& tBb);
277 llvm::BasicBlock*& tBb,
278 llvm::Function*& tFnc,
279 llvm::Instruction* from);
284 llvm::BasicBlock* bb,
285 std::set<llvm::BasicBlock*>& newFncStarts);
300 std::unique_ptr<capstone2llvmir::Capstone2LlvmIrTranslator>
_c2l;
313 std::map<common::Address, const common::Function*>
_debugFncs;
Mapping of LLVM instructions to underlying ASM instructions.
Config DB provider for bin2llvmirl.
Common public interface for translators converting bytes to LLVM IR.
Definition: asm_instruction.h:34
std::map< llvm::BasicBlock *, common::Address > _bb2addr
Definition: decoder.h:149
std::set< common::Address > _vtableFncs
Definition: decoder.h:315
void initEnvironmentPseudoFunctions()
Definition: decoder_init.cpp:128
llvm::IRBuilder * _irb
Definition: decoder.h:303
llvm::BranchInst * transformToCondBranch(llvm::CallInst *pseudo, llvm::Value *cond, llvm::BasicBlock *trueBb, llvm::BasicBlock *falseBb)
Definition: ir_modifications.cpp:81
void getOrCreateCallTarget(common::Address addr, llvm::Function *&tFnc, llvm::BasicBlock *&tBb)
Definition: ir_modifications.cpp:186
typename std::pair< const std::uint8_t *, std::size_t > ByteData
Definition: decoder.h:57
static char ID
Definition: decoder.h:44
llvm::Function * getFunctionContainingAddress(common::Address a)
Definition: functions.cpp:95
void initJumpTargetsExterns()
Definition: decoder_init.cpp:626
void initJumpTargetsDebug()
Definition: decoder_init.cpp:887
void addFunction(common::Address a, llvm::Function *f)
Definition: functions.cpp:154
bool patternTerminatingCalls()
Definition: patterns.cpp:31
RangesToDecode _ranges
Definition: decoder.h:305
std::set< llvm::Function * > _terminatingFncs
Definition: decoder.h:316
std::map< common::Address, llvm::Function * > _addr2fnc
Definition: decoder.h:167
std::size_t decodeJumpTargetDryRun_arm(const JumpTarget &jt, ByteData bytes, bool strict=false)
Definition: arm.cpp:45
llvm::BasicBlock * getBasicBlockAfterAddress(common::Address a)
Definition: bbs.cpp:96
void initJumpTargetsExports()
Definition: decoder_init.cpp:787
void initializeGpReg_mips()
Definition: mips.cpp:148
void decode()
Definition: decoder.cpp:144
capstone2llvmir::Capstone2LlvmIrTranslator::TranslationResultOne translate(ByteData &bytes, common::Address &addr, llvm::IRBuilder<> &irb)
Definition: decoder.cpp:338
std::size_t decodeJumpTargetDryRun_arm64(const JumpTarget &jt, ByteData bytes, bool strict=false)
Definition: arm64.cpp:47
void initDryRunCsInstruction()
Definition: decoder_init.cpp:93
JumpTargets _jumpTargets
Definition: decoder.h:306
cs_mode determineMode_arm(cs_insn *insn, common::Address &target)
Definition: arm.cpp:216
llvm::BasicBlock * getBasicBlockBeforeAddress(common::Address a)
Definition: bbs.cpp:65
bool run()
Definition: decoder.cpp:98
bool getJumpTargetSwitch(common::Address addr, llvm::CallInst *branchCall, llvm::Value *val, SymbolicTree &st)
Definition: decoder.cpp:950
cs_insn * _dryCsInsn
Definition: decoder.h:301
bool _somethingDecoded
Definition: decoder.h:339
llvm::CallInst * transformToCondCall(llvm::CallInst *pseudo, llvm::Value *cond, llvm::Function *callee, llvm::BasicBlock *falseBb)
Definition: ir_modifications.cpp:32
common::Address getBasicBlockAddress(llvm::BasicBlock *b)
Definition: bbs.cpp:17
std::set< std::string > _externs
Name of all extern functions gathered from object files.
Definition: decoder.h:309
void patternsPseudoCall_arm64(llvm::CallInst *&call, AsmInstruction &pAi)
std::size_t decodeJumpTargetDryRun(const JumpTarget &jt, ByteData bytes, bool strict=false)
Definition: decoder.cpp:367
std::set< common::Address > _imports
Definition: decoder.h:310
llvm::Function * splitFunctionOn(common::Address addr)
Definition: ir_modifications.cpp:474
common::Address getBasicBlockAddressAfter(common::Address a)
Definition: bbs.cpp:47
std::set< common::Address > _staticFncs
Definition: decoder.h:314
llvm::Function * createFunction(common::Address a, bool declaration=false)
Definition: functions.cpp:109
std::set< common::Address > _symbols
Definition: decoder.h:312
Abi * _abi
Definition: decoder.h:298
void initJumpTargetsSymbols()
Definition: decoder_init.cpp:841
llvm::Function * getFunctionAfterAddress(common::Address a)
Definition: functions.cpp:85
llvm::GlobalVariable * getCallReturnObject()
Definition: ir_modifications.cpp:149
bool patternsRecognize()
Definition: patterns.cpp:18
bool canSplitFunctionOn(llvm::BasicBlock *bb)
Definition: ir_modifications.cpp:317
void handleDelaySlotTypical(common::Address &addr, capstone2llvmir::Capstone2LlvmIrTranslator::TranslationResultOne &res, ByteData &bytes, llvm::IRBuilder<> &irb)
Definition: decoder.cpp:1332
std::size_t decodeJumpTargetDryRun_mips(const JumpTarget &jt, ByteData bytes, bool strict=false)
Definition: mips.cpp:68
void initJumpTargets()
Definition: decoder_init.cpp:544
llvm::SwitchInst * transformToSwitch(llvm::CallInst *pseudo, llvm::Value *val, llvm::BasicBlock *defaultBb, const std::vector< llvm::BasicBlock * > &cases)
Definition: ir_modifications.cpp:95
bool runOnModuleCustom(llvm::Module &m, Config *c, FileImage *o, DebugFormat *d, NameContainer *n, Abi *a)
Definition: decoder.cpp:61
void initEnvironmentAsm2LlvmMapping()
Definition: decoder_init.cpp:117
std::set< common::Address > _exports
Definition: decoder.h:311
cs_mode determineMode(cs_insn *insn, common::Address &target)
Definition: decoder.cpp:404
std::map< llvm::Function *, common::Address > _fnc2addr
Definition: decoder.h:168
llvm::Function * _entryPointFunction
Definition: decoder.h:317
bool patternStaticallyLinked()
Definition: patterns.cpp:309
virtual bool runOnModule(llvm::Module &m) override
Definition: decoder.cpp:49
common::Address getBasicBlockEndAddress(llvm::BasicBlock *b)
Definition: bbs.cpp:33
void decodeJumpTarget(const JumpTarget &jt)
Definition: decoder.cpp:181
Llvm2CapstoneInsnMap * _llvm2capstone
Definition: decoder.h:297
llvm::BasicBlock * getBasicBlockAtAddress(common::Address a)
Definition: bbs.cpp:56
void initConfigFunctions()
Definition: decoder_init.cpp:1032
void initEnvironmentRegisters()
Definition: decoder_init.cpp:162
NameContainer * _names
Definition: decoder.h:296
void initRanges()
Definition: decoder_init.cpp:184
std::map< common::Address, llvm::BasicBlock * > _addr2bb
Definition: decoder.h:148
void addFunctionSize(llvm::Function *f, std::optional< std::size_t > sz)
Definition: functions.cpp:164
std::map< llvm::BasicBlock *, llvm::BasicBlock * > _likelyBb2Target
Definition: decoder.h:334
llvm::BasicBlock * getBasicBlockContainingAddress(common::Address a)
Definition: bbs.cpp:106
std::map< common::Address, const common::Function * > _debugFncs
Definition: decoder.h:313
std::unique_ptr< capstone2llvmir::Capstone2LlvmIrTranslator > _c2l
Definition: decoder.h:300
std::map< llvm::Function *, std::size_t > _fnc2sz
Definition: decoder.h:178
bool _switchGenerated
Definition: decoder.h:337
void resolvePseudoCalls()
Definition: decoder.cpp:1427
void patternsPseudoCall_arm(llvm::CallInst *&call, AsmInstruction &pAi)
Definition: arm.cpp:171
bool instructionBreaksBasicBlock(common::Address addr, capstone2llvmir::Capstone2LlvmIrTranslator::TranslationResultOne &tr)
Definition: decoder.cpp:416
bool disasm_mips(csh ce, cs_mode m, ByteData &bytes, uint64_t &a, cs_insn *i)
Definition: mips.cpp:49
void initTranslator()
Definition: decoder_init.cpp:26
void initEnvironment()
Definition: decoder_init.cpp:102
void finalizePseudoCalls()
Definition: decoder.cpp:1484
llvm::Module * _module
Definition: decoder.h:292
void initAllowedRangesWithConfig()
Definition: decoder_init.cpp:338
void initAllowedRangesWithSegments()
Definition: decoder_init.cpp:217
void initJumpTargetsEntryPoint()
Definition: decoder_init.cpp:596
bool getJumpTargetsFromInstruction(common::Address addr, capstone2llvmir::Capstone2LlvmIrTranslator::TranslationResultOne &tr, std::size_t &rangeSize)
Definition: decoder.cpp:470
void handleDelaySlotLikely(common::Address &addr, capstone2llvmir::Capstone2LlvmIrTranslator::TranslationResultOne &res, ByteData &bytes, llvm::IRBuilder<> &irb)
Definition: decoder.cpp:1377
Decoder()
Definition: decoder.cpp:35
bool runCatcher()
Definition: decoder.cpp:79
llvm::Function * getFunctionBeforeAddress(common::Address a)
Definition: functions.cpp:57
void getOrCreateBranchTarget(common::Address addr, llvm::BasicBlock *&tBb, llvm::Function *&tFnc, llvm::Instruction *from)
Definition: ir_modifications.cpp:237
void initStaticCode()
Definition: decoder_init.cpp:934
bool getJumpTarget(JumpTarget &jt)
Definition: decoder.cpp:161
FileImage * _image
Definition: decoder.h:294
std::size_t decodeJumpTargetDryRun_ppc(const JumpTarget &jt, ByteData bytes, bool strict=false)
Definition: powerpc.cpp:18
common::Address getFunctionAddressAfter(common::Address a)
Definition: functions.cpp:39
void initJumpTargetsImports()
Definition: decoder_init.cpp:667
void initVtables()
Definition: decoder_init.cpp:992
std::map< common::Address, std::set< llvm::SwitchInst * > > _switchTableStarts
Definition: decoder.h:329
llvm::ReturnInst * transformToReturn(llvm::CallInst *pseudo)
Definition: ir_modifications.cpp:56
llvm::CallInst * transformToCall(llvm::CallInst *pseudo, llvm::Function *callee)
Definition: ir_modifications.cpp:14
llvm::BranchInst * transformToBranch(llvm::CallInst *pseudo, llvm::BasicBlock *branchee)
Definition: ir_modifications.cpp:69
void initJumpTargetsConfig()
Definition: decoder_init.cpp:560
llvm::Function * getFunctionAtAddress(common::Address a)
Definition: functions.cpp:48
common::Address getFunctionEndAddress(llvm::Function *f)
Definition: functions.cpp:28
std::size_t decodeJumpTargetDryRun_x86(const JumpTarget &jt, ByteData bytes, bool strict=false)
Definition: x86.cpp:18
llvm::BasicBlock * createBasicBlock(common::Address a, llvm::Function *f, llvm::BasicBlock *insertAfter=nullptr)
Definition: bbs.cpp:137
void addBasicBlock(common::Address a, llvm::BasicBlock *b)
Definition: bbs.cpp:162
Config * _config
Definition: decoder.h:293
DebugFormat * _debug
Definition: decoder.h:295
common::Address getFunctionAddress(llvm::Function *f)
Definition: functions.cpp:18
~Decoder()
Definition: decoder.cpp:41
Definition: fileimage.h:27
Definition: jump_targets.h:27
Definition: jump_targets.h:97
Definition: decoder_ranges.h:19
Definition: symbolic_tree.h:43
Address, address pair and other derived class representation.
Decode input binary into LLVM IR.
Representation of ranges to decode.
File image provider for bin2llvmirl.
Modify both LLVM IR and config.
Jump targets representation.
Database of objects' names in binary.
The frontend-end part of the decompiler.
typename std::map< llvm::StoreInst *, cs_insn * > Llvm2CapstoneInsnMap
Definition: asm_instruction.h:25
Definition: archive_wrapper.h:19
Static code finder library.
Definition: capstone2llvmir.h:395
Construction of symbolic tree from the given node.