1ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha//===-- llvm/MC/MCFunction.h ------------------------------------*- C++ -*-===// 2ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha// 3ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha// The LLVM Compiler Infrastructure 4ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha// 5ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha// This file is distributed under the University of Illinois Open Source 6ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha// License. See LICENSE.TXT for details. 7ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha// 8ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha//===----------------------------------------------------------------------===// 9ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha// 10ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha// This file defines the data structures to hold a CFG reconstructed from 11ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha// machine code. 12ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha// 13ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha//===----------------------------------------------------------------------===// 14ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 15ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha#ifndef LLVM_MC_MCFUNCTION_H 16ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha#define LLVM_MC_MCFUNCTION_H 17ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 18ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha#include "llvm/ADT/StringRef.h" 19ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha#include "llvm/MC/MCInst.h" 20ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha#include <string> 21ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha#include <vector> 22ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 23ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougachanamespace llvm { 24ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 25ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougachaclass MCFunction; 26ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougachaclass MCModule; 27ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougachaclass MCTextAtom; 28ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 29ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha/// \brief Basic block containing a sequence of disassembled instructions. 30ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha/// The basic block is backed by an MCTextAtom, which holds the instructions, 31ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha/// and the address range it covers. 32ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha/// Create a basic block using MCFunction::createBlock. 33ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougachaclass MCBasicBlock { 34ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha const MCTextAtom *Insts; 35ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 36ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha // MCFunction owns the basic block. 37ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCFunction *Parent; 38ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha friend class MCFunction; 39ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCBasicBlock(const MCTextAtom &Insts, MCFunction *Parent); 40ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 41ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \name Predecessors/Successors, to represent the CFG. 42ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @{ 43ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha typedef std::vector<const MCBasicBlock *> BasicBlockListTy; 44ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha BasicBlockListTy Successors; 45ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha BasicBlockListTy Predecessors; 46ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @} 47ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougachapublic: 48ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 49ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \brief Get the backing MCTextAtom, containing the instruction sequence. 50ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha const MCTextAtom *getInsts() const { return Insts; } 51ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 52ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \name Get the owning MCFunction. 53ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @{ 54ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha const MCFunction *getParent() const { return Parent; } 55ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCFunction *getParent() { return Parent; } 56ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @} 57ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 58ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// MC CFG access: Predecessors/Successors. 59ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @{ 60ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha typedef BasicBlockListTy::const_iterator succ_const_iterator; 61ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha succ_const_iterator succ_begin() const { return Successors.begin(); } 62ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha succ_const_iterator succ_end() const { return Successors.end(); } 63ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 64ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha typedef BasicBlockListTy::const_iterator pred_const_iterator; 65ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha pred_const_iterator pred_begin() const { return Predecessors.begin(); } 66ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha pred_const_iterator pred_end() const { return Predecessors.end(); } 67ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 68ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha void addSuccessor(const MCBasicBlock *MCBB); 69ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha bool isSuccessor(const MCBasicBlock *MCBB) const; 70ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 71ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha void addPredecessor(const MCBasicBlock *MCBB); 72ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha bool isPredecessor(const MCBasicBlock *MCBB) const; 73ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @} 74ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha}; 75ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 76ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha/// \brief Represents a function in machine code, containing MCBasicBlocks. 77ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha/// MCFunctions are created using MCModule::createFunction. 78ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougachaclass MCFunction { 79ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCFunction (const MCFunction&) LLVM_DELETED_FUNCTION; 80ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCFunction& operator=(const MCFunction&) LLVM_DELETED_FUNCTION; 81ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 82ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha std::string Name; 83ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha typedef std::vector<MCBasicBlock*> BasicBlockListTy; 84ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha BasicBlockListTy Blocks; 85ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 86ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha // MCModule owns the function. 87ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha friend class MCModule; 88ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCFunction(StringRef Name); 89ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougachapublic: 90ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha ~MCFunction(); 91ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 92ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \brief Create an MCBasicBlock backed by Insts and add it to this function. 93ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \param Insts Sequence of straight-line code backing the basic block. 94ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \returns The newly created basic block. 95ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCBasicBlock &createBlock(const MCTextAtom &Insts); 96ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 97ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha StringRef getName() const { return Name; } 98ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 99ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \name Access to the function's basic blocks. No ordering is enforced. 100ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @{ 101ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// \brief Get the entry point basic block. 102ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha const MCBasicBlock *getEntryBlock() const { return front(); } 103ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCBasicBlock *getEntryBlock() { return front(); } 104ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 105ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha // NOTE: Dereferencing iterators gives pointers, so maybe a list is best here. 106ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha typedef BasicBlockListTy::const_iterator const_iterator; 107ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha typedef BasicBlockListTy:: iterator iterator; 108ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha const_iterator begin() const { return Blocks.begin(); } 109ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha iterator begin() { return Blocks.begin(); } 110ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha const_iterator end() const { return Blocks.end(); } 111ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha iterator end() { return Blocks.end(); } 112ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 113ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha const MCBasicBlock* front() const { return Blocks.front(); } 114ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCBasicBlock* front() { return Blocks.front(); } 115ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha const MCBasicBlock* back() const { return Blocks.back(); } 116ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha MCBasicBlock* back() { return Blocks.back(); } 117ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha /// @} 118ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha}; 119ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 120ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha} 121ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha 122ef99356dfebb96f6f90efb912c2877214bad060eAhmed Bougacha#endif 123