1226584Sdim//===-- MCFunction.h ------------------------------------------------------===// 2226584Sdim// 3226584Sdim// The LLVM Compiler Infrastructure 4226584Sdim// 5226584Sdim// This file is distributed under the University of Illinois Open Source 6226584Sdim// License. See LICENSE.TXT for details. 7226584Sdim// 8226584Sdim//===----------------------------------------------------------------------===// 9226584Sdim// 10226584Sdim// This file defines the data structures to hold a CFG reconstructed from 11226584Sdim// machine code. 12226584Sdim// 13226584Sdim//===----------------------------------------------------------------------===// 14226584Sdim 15226584Sdim#ifndef LLVM_OBJECTDUMP_MCFUNCTION_H 16226584Sdim#define LLVM_OBJECTDUMP_MCFUNCTION_H 17226584Sdim 18226584Sdim#include "llvm/ADT/ArrayRef.h" 19226584Sdim#include "llvm/ADT/DenseSet.h" 20226584Sdim#include "llvm/MC/MCInst.h" 21226584Sdim#include <map> 22226584Sdim 23226584Sdimnamespace llvm { 24226584Sdim 25226584Sdimclass MCDisassembler; 26226584Sdimclass MCInstrAnalysis; 27226584Sdimclass MemoryObject; 28226584Sdimclass raw_ostream; 29226584Sdim 30226584Sdim/// MCDecodedInst - Small container to hold an MCInst and associated info like 31226584Sdim/// address and size. 32226584Sdimstruct MCDecodedInst { 33226584Sdim uint64_t Address; 34226584Sdim uint64_t Size; 35226584Sdim MCInst Inst; 36226584Sdim 37226584Sdim MCDecodedInst() {} 38226584Sdim MCDecodedInst(uint64_t Address, uint64_t Size, MCInst Inst) 39226584Sdim : Address(Address), Size(Size), Inst(Inst) {} 40226584Sdim 41226584Sdim bool operator<(const MCDecodedInst &RHS) const { 42226584Sdim return Address < RHS.Address; 43226584Sdim } 44226584Sdim}; 45226584Sdim 46226584Sdim/// MCBasicBlock - Consists of multiple MCDecodedInsts and a list of successing 47226584Sdim/// MCBasicBlocks. 48226584Sdimclass MCBasicBlock { 49226584Sdim std::vector<MCDecodedInst> Insts; 50226584Sdim typedef DenseSet<uint64_t> SetTy; 51226584Sdim SetTy Succs; 52226584Sdimpublic: 53226584Sdim ArrayRef<MCDecodedInst> getInsts() const { return Insts; } 54226584Sdim 55226584Sdim typedef SetTy::const_iterator succ_iterator; 56226584Sdim succ_iterator succ_begin() const { return Succs.begin(); } 57226584Sdim succ_iterator succ_end() const { return Succs.end(); } 58226584Sdim 59226584Sdim bool contains(uint64_t Addr) const { return Succs.count(Addr); } 60226584Sdim 61226584Sdim void addInst(const MCDecodedInst &Inst) { Insts.push_back(Inst); } 62226584Sdim void addSucc(uint64_t Addr) { Succs.insert(Addr); } 63226584Sdim 64226584Sdim bool operator<(const MCBasicBlock &RHS) const { 65226584Sdim return Insts.size() < RHS.Insts.size(); 66226584Sdim } 67226584Sdim}; 68226584Sdim 69226584Sdim/// MCFunction - Represents a named function in machine code, containing 70226584Sdim/// multiple MCBasicBlocks. 71226584Sdimclass MCFunction { 72226584Sdim const StringRef Name; 73226584Sdim // Keep BBs sorted by address. 74226584Sdim typedef std::vector<std::pair<uint64_t, MCBasicBlock> > MapTy; 75226584Sdim MapTy Blocks; 76226584Sdimpublic: 77226584Sdim MCFunction(StringRef Name) : Name(Name) {} 78226584Sdim 79226584Sdim // Create an MCFunction from a region of binary machine code. 80226584Sdim static MCFunction 81226584Sdim createFunctionFromMC(StringRef Name, const MCDisassembler *DisAsm, 82226584Sdim const MemoryObject &Region, uint64_t Start, uint64_t End, 83226584Sdim const MCInstrAnalysis *Ana, raw_ostream &DebugOut, 84226584Sdim SmallVectorImpl<uint64_t> &Calls); 85226584Sdim 86226584Sdim typedef MapTy::const_iterator iterator; 87226584Sdim iterator begin() const { return Blocks.begin(); } 88226584Sdim iterator end() const { return Blocks.end(); } 89226584Sdim 90226584Sdim StringRef getName() const { return Name; } 91226584Sdim 92226584Sdim MCBasicBlock &addBlock(uint64_t Address, const MCBasicBlock &BB) { 93226584Sdim Blocks.push_back(std::make_pair(Address, BB)); 94226584Sdim return Blocks.back().second; 95226584Sdim } 96226584Sdim}; 97226584Sdim 98226584Sdim} 99226584Sdim 100226584Sdim#endif 101