forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			101 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
//===-- 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
 |