retdec
writer_dsm.h
Go to the documentation of this file.
1 
7 #ifndef RETDEC_BIN2LLVMIR_OPTIMIZATIONS_WRITER_DSM_WRITER_DSM_H
8 #define RETDEC_BIN2LLVMIR_OPTIMIZATIONS_WRITER_DSM_WRITER_DSM_H
9 
10 #include <ostream>
11 
12 #include <llvm/IR/Module.h>
13 #include <llvm/Pass.h>
14 
19 
20 namespace retdec {
21 namespace bin2llvmir {
22 
23 class DsmWriter : public llvm::ModulePass
24 {
25  public:
26  static char ID;
27  DsmWriter();
28  virtual bool runOnModule(llvm::Module& m) override;
29  bool runOnModuleCustom(
30  llvm::Module& m,
31  Config* c,
32  FileImage* objf,
33  Abi* abi,
34  std::ostream& ret);
35 
36  private:
37  void run(std::ostream& ret);
38  void generateHeader(std::ostream& ret);
39  void generateCode(std::ostream& ret);
40  void generateCodeSeg(
41  const retdec::loader::Segment* seg,
42  std::ostream& ret);
43  void generateFunction(
44  const retdec::common::Function* fnc,
45  std::ostream& ret);
46  void generateInstruction(AsmInstruction& ai, std::ostream& ret);
47  void generateData(std::ostream& ret);
48  void generateDataSeg(
49  const retdec::loader::Segment* seg,
50  std::ostream& ret);
51  void generateDataRange(
54  std::ostream& ret);
57  std::ostream& ret);
58 
59  void getAsmInstructionHex(AsmInstruction& ai, std::ostream& ret);
60  std::string processInstructionDsm(AsmInstruction& ai);
61  void generateData(
62  std::ostream& ret,
64  std::size_t size,
65  const std::string& objVal = "");
66  std::string escapeString(const std::string& str);
67  std::string reduceNegativeNumbers(const std::string& str);
69  void findLongestAddress();
70  std::string getString(
71  const retdec::common::Object* cgv,
72  const llvm::ConstantDataArray* cda);
73 
74  std::string getFunctionName(llvm::Function* f) const;
75  std::string getFunctionName(const retdec::common::Function* f) const;
76 
77  private:
78  llvm::Module* _module = nullptr;
79  Config* _config = nullptr;
80  FileImage* _objf = nullptr;
81  Abi* _abi = nullptr;
82 
83  std::size_t _longestInst = 0;
84  std::size_t _longestAddr = 0;
85  std::map<retdec::common::Address, const retdec::common::Function*> _addr2fnc;
86 
87  const std::size_t DATA_SEGMENT_LINE = 16;
88  const std::string ALIGN = " ";
89  const std::string INSTR_SEPARATOR = "\t"; // maybe "\t"
90 };
91 
92 } // namespace bin2llvmir
93 } // namespace retdec
94 
95 #endif
ABI information.
Mapping of LLVM instructions to underlying ASM instructions.
Config DB provider for bin2llvmirl.
Definition: abi.h:27
Definition: asm_instruction.h:34
Definition: config.h:24
Definition: writer_dsm.h:24
void generateInstruction(AsmInstruction &ai, std::ostream &ret)
Definition: writer_dsm.cpp:279
void generateHeader(std::ostream &ret)
Definition: writer_dsm.cpp:110
void findLongestInstruction()
Definition: writer_dsm.cpp:647
void generateAlignedAddress(retdec::common::Address addr, std::ostream &ret)
Definition: writer_dsm.cpp:621
Abi * _abi
Definition: writer_dsm.h:81
std::string processInstructionDsm(AsmInstruction &ai)
Definition: writer_dsm.cpp:286
void generateDataSeg(const retdec::loader::Segment *seg, std::ostream &ret)
Definition: writer_dsm.cpp:425
static char ID
Definition: writer_dsm.h:26
std::string reduceNegativeNumbers(const std::string &str)
Find negative numbers in additions and change it to subtractions.
Definition: writer_dsm.cpp:584
std::map< retdec::common::Address, const retdec::common::Function * > _addr2fnc
Definition: writer_dsm.h:85
void generateDataRange(retdec::common::Address start, retdec::common::Address end, std::ostream &ret)
Definition: writer_dsm.cpp:433
void generateCode(std::ostream &ret)
Definition: writer_dsm.cpp:124
std::string escapeString(const std::string &str)
Definition: writer_dsm.cpp:543
const std::string INSTR_SEPARATOR
Definition: writer_dsm.h:89
std::size_t _longestAddr
Definition: writer_dsm.h:84
const std::string ALIGN
Definition: writer_dsm.h:88
llvm::Module * _module
Definition: writer_dsm.h:78
std::size_t _longestInst
Definition: writer_dsm.h:83
FileImage * _objf
Definition: writer_dsm.h:80
std::string getString(const retdec::common::Object *cgv, const llvm::ConstantDataArray *cda)
Definition: writer_dsm.cpp:679
DsmWriter()
Definition: writer_dsm.cpp:37
void getAsmInstructionHex(AsmInstruction &ai, std::ostream &ret)
Definition: writer_dsm.cpp:250
virtual bool runOnModule(llvm::Module &m) override
Definition: writer_dsm.cpp:47
const std::size_t DATA_SEGMENT_LINE
Definition: writer_dsm.h:87
std::string getFunctionName(llvm::Function *f) const
Definition: writer_dsm.cpp:707
void run(std::ostream &ret)
Definition: writer_dsm.cpp:96
void findLongestAddress()
Definition: writer_dsm.cpp:636
void generateCodeSeg(const retdec::loader::Segment *seg, std::ostream &ret)
Definition: writer_dsm.cpp:153
void generateData(std::ostream &ret)
Definition: writer_dsm.cpp:404
Config * _config
Definition: writer_dsm.h:79
bool runOnModuleCustom(llvm::Module &m, Config *c, FileImage *objf, Abi *abi, std::ostream &ret)
Definition: writer_dsm.cpp:81
void generateFunction(const retdec::common::Function *fnc, std::ostream &ret)
Definition: writer_dsm.cpp:190
Definition: fileimage.h:27
Definition: address.h:21
Definition: function.h:36
Definition: object.h:34
Definition: segment.h:25
File image provider for bin2llvmirl.
The frontend-end part of the decompiler.
Definition: archive_wrapper.h:19