|  | //===-- MCFunction.h ------------------------------------------------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file defines the data structures to hold a CFG reconstructed from | 
|  | // machine code. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_OBJECTDUMP_MCFUNCTION_H | 
|  | #define LLVM_OBJECTDUMP_MCFUNCTION_H | 
|  |  | 
|  | #include "llvm/ADT/ArrayRef.h" | 
|  | #include "llvm/ADT/DenseSet.h" | 
|  | #include "llvm/MC/MCInst.h" | 
|  | #include <map> | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | class MCDisassembler; | 
|  | class MCInstrAnalysis; | 
|  | class MemoryObject; | 
|  | class raw_ostream; | 
|  |  | 
|  | /// MCDecodedInst - Small container to hold an MCInst and associated info like | 
|  | /// address and size. | 
|  | struct MCDecodedInst { | 
|  | uint64_t Address; | 
|  | uint64_t Size; | 
|  | MCInst Inst; | 
|  |  | 
|  | MCDecodedInst() {} | 
|  | MCDecodedInst(uint64_t Address, uint64_t Size, MCInst Inst) | 
|  | : Address(Address), Size(Size), Inst(Inst) {} | 
|  |  | 
|  | bool operator<(const MCDecodedInst &RHS) const { | 
|  | return Address < RHS.Address; | 
|  | } | 
|  | }; | 
|  |  | 
|  | /// MCBasicBlock - Consists of multiple MCDecodedInsts and a list of successing | 
|  | /// MCBasicBlocks. | 
|  | class MCBasicBlock { | 
|  | std::vector<MCDecodedInst> Insts; | 
|  | typedef DenseSet<uint64_t> SetTy; | 
|  | SetTy Succs; | 
|  | public: | 
|  | ArrayRef<MCDecodedInst> getInsts() const { return Insts; } | 
|  |  | 
|  | typedef SetTy::const_iterator succ_iterator; | 
|  | succ_iterator succ_begin() const { return Succs.begin(); } | 
|  | succ_iterator succ_end() const { return Succs.end(); } | 
|  |  | 
|  | bool contains(uint64_t Addr) const { return Succs.count(Addr); } | 
|  |  | 
|  | void addInst(const MCDecodedInst &Inst) { Insts.push_back(Inst); } | 
|  | void addSucc(uint64_t Addr) { Succs.insert(Addr); } | 
|  |  | 
|  | bool operator<(const MCBasicBlock &RHS) const { | 
|  | return Insts.size() < RHS.Insts.size(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | /// MCFunction - Represents a named function in machine code, containing | 
|  | /// multiple MCBasicBlocks. | 
|  | class MCFunction { | 
|  | const StringRef Name; | 
|  | // Keep BBs sorted by address. | 
|  | typedef std::vector<std::pair<uint64_t, MCBasicBlock> > MapTy; | 
|  | MapTy Blocks; | 
|  | public: | 
|  | MCFunction(StringRef Name) : Name(Name) {} | 
|  |  | 
|  | // Create an MCFunction from a region of binary machine code. | 
|  | static MCFunction | 
|  | createFunctionFromMC(StringRef Name, const MCDisassembler *DisAsm, | 
|  | const MemoryObject &Region, uint64_t Start, uint64_t End, | 
|  | const MCInstrAnalysis *Ana, raw_ostream &DebugOut, | 
|  | SmallVectorImpl<uint64_t> &Calls); | 
|  |  | 
|  | typedef MapTy::const_iterator iterator; | 
|  | iterator begin() const { return Blocks.begin(); } | 
|  | iterator end() const { return Blocks.end(); } | 
|  |  | 
|  | StringRef getName() const { return Name; } | 
|  |  | 
|  | MCBasicBlock &addBlock(uint64_t Address, const MCBasicBlock &BB) { | 
|  | Blocks.push_back(std::make_pair(Address, BB)); | 
|  | return Blocks.back().second; | 
|  | } | 
|  | }; | 
|  |  | 
|  | } | 
|  |  | 
|  | #endif |