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