]> git.siccegge.de Git - frida/frida.git/blob - src/disassembler/llvm/LLVMDisassembler.hxx
Add interface to iterate over functions
[frida/frida.git] / src / disassembler / llvm / LLVMDisassembler.hxx
1 #ifndef INCLUDE__LLVMDisassembler_hxx
2 #define INCLUDE__LLVMDisassembler_hxx
3
4 #include <memory>
5 #include <map>
6 #include <log4cxx/logger.h>
7
8 #include "include_llvm.hxx"
9
10 #include "disassembler/Disassembler.hxx"
11 #include "disassembler/BasicBlock.hxx"
12 #include "disassembler/Function.hxx"
13 #include "disassembler/llvm/LLVMBasicBlock.hxx"
14
15
16 class LLVMDisassembler
17 : public Disassembler {
18 public:
19 LLVMDisassembler(const std::string& filename);
20 virtual ~LLVMDisassembler() {};
21
22 void getSymbols();
23 uint64_t entryAddress();
24
25 void forEachFunction(std::function<void (uint64_t, Function*)> callback);
26
27 BasicBlock * generateControlFlowGraph(const std::string& name);
28 BasicBlock * generateControlFlowGraph(uint64_t address);
29
30 protected:
31 bool isFunctionCall(uint64_t address) {return false;}
32 bool isJump(uint64_t address) {return false;}
33
34 private:
35 void disassemble();
36
37 void readSymbols();
38 void readSections();
39
40 log4cxx::LoggerPtr logger;
41 std::map<uint64_t, LLVMBasicBlock*> blocks;
42 std::map<uint64_t, LLVMFunction*> functions;
43
44 llvm::Triple triple;
45 std::shared_ptr<llvm::object::Binary> binary;
46
47
48 const llvm::Target * target;
49 llvm::object::ObjectFile * o;
50
51 std::unique_ptr<const llvm::MCRegisterInfo> MRI;
52 std::unique_ptr<const llvm::MCAsmInfo> AsmInfo;
53 std::unique_ptr<llvm::MCModule> Mod;
54 std::unique_ptr<llvm::MCInstPrinter> IP;
55 std::unique_ptr<llvm::MCDisassembler> DisAsm;
56 std::unique_ptr<const llvm::MCObjectFileInfo> MOFI;
57 std::unique_ptr<llvm::MCContext> Ctx;
58 std::unique_ptr<const llvm::MCInstrAnalysis> MIA;
59 std::unique_ptr<const llvm::MCSubtargetInfo> STI;
60 std::unique_ptr<const llvm::MCInstrInfo> MII;
61 llvm::OwningPtr<llvm::MCRelocationInfo> RelInfo;
62 llvm::OwningPtr<llvm::MCSymbolizer> Symzer;
63
64 std::map<std::string, llvm::object::SectionRef> sections;
65 std::map<std::string, llvm::object::SymbolRef> symbols;
66 };
67
68 #endif