//===-- 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