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
|