blob: 6d3a548d48e87b204ef1d2167cea58ed6e581c6c [file] [log] [blame]
//===-- 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