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