MachineFunction.h revision 820e55e9ad3cb3b17780e84863648e431b571d25
19c6342d0cc919711ea1024b98b1b387573995922Chris Lattner//===-- llvm/CodeGen/MachineFunction.h --------------------------*- C++ -*-===//
2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//                     The LLVM Compiler Infrastructure
46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===//
9ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
10cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner// Collect native machine code for a function.  This class contains a list of
11cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner// MachineBasicBlock instances that make up the current compiled function.
12cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner//
13cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner// This class also contains pointers to various classes which hold
14cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner// target-specific information about the generated code.
15ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman//
16f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner//===----------------------------------------------------------------------===//
17f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
18fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman#ifndef LLVM_CODEGEN_MACHINEFUNCTION_H
19fce1143bcfa73f61845002fa50473d1a01384202Misha Brukman#define LLVM_CODEGEN_MACHINEFUNCTION_H
20f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
212d8e3d20be377112999670f210200b3658762571Chris Lattner#include "llvm/CodeGen/MachineBasicBlock.h"
22fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/ADT/ilist.h"
231e86a66b00b94adc4ad6977ef6b47c516ac62cecDevang Patel#include "llvm/Support/DebugLoc.h"
248e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman#include "llvm/Support/Allocator.h"
258e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman#include "llvm/Support/Recycler.h"
268e7ae9860bd1f29c95e4e10fe151a22aaafafef9Chris Lattner
27d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm {
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
29c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohmanclass Value;
308bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattnerclass Function;
3184bc5427d6883f73cfeae3da640acd011d35c006Chris Lattnerclass MachineRegisterInfo;
328bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattnerclass MachineFrameInfo;
338bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattnerclass MachineConstantPool;
3437efe6764568a3829fee26aba532283131d1a104Nate Begemanclass MachineJumpTableInfo;
35820e55e9ad3cb3b17780e84863648e431b571d25Chris Lattnerclass MachineModuleInfo;
361b2eb0e8a6aaf034675b17be6d853cb1c666200fChris Lattnerclass MCContext;
37a655f088b88cf015fc48721fd9869787d1b8ce13Chris Lattnerclass Pass;
38d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Chengclass TargetMachine;
39998e125a87d49f28c714d8223a37746850401057Bob Wilsonclass TargetRegisterClass;
408bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner
41792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattnertemplate <>
428e4018e2de52c534405d7155c7009d0b35afb861Cedric Venetstruct ilist_traits<MachineBasicBlock>
43fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman    : public ilist_default_traits<MachineBasicBlock> {
447309be6735666143bd9835b275dc8501617a2591Gabor Greif  mutable ilist_half_node<MachineBasicBlock> Sentinel;
45792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattnerpublic:
46c7f6b8c5d40e17bf43fd3a1549d7d89c9da735e1Gabor Greif  MachineBasicBlock *createSentinel() const {
47c7f6b8c5d40e17bf43fd3a1549d7d89c9da735e1Gabor Greif    return static_cast<MachineBasicBlock*>(&Sentinel);
48c7f6b8c5d40e17bf43fd3a1549d7d89c9da735e1Gabor Greif  }
49fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  void destroySentinel(MachineBasicBlock *) const {}
50fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
51c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  MachineBasicBlock *provideInitialHead() const { return createSentinel(); }
52c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  MachineBasicBlock *ensureHead(MachineBasicBlock*) const {
53c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif    return createSentinel();
54c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  }
55f3841fcbd587c31aa9842b3f33bd57de40c9f443Gabor Greif  static void noteHead(MachineBasicBlock*, MachineBasicBlock*) {}
56c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif
578e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void addNodeToList(MachineBasicBlock* MBB);
588e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void removeNodeFromList(MachineBasicBlock* MBB);
598e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void deleteNode(MachineBasicBlock *MBB);
60fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanprivate:
61fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  void createNode(const MachineBasicBlock &);
62792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner};
63792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner
648bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner/// MachineFunctionInfo - This class can be derived from and used by targets to
658bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner/// hold private target-specific information for each MachineFunction.  Objects
668bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner/// of type are accessed/created with MF::getInfo and destroyed when the
678bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner/// MachineFunction is destroyed.
688bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattnerstruct MachineFunctionInfo {
69a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner  virtual ~MachineFunctionInfo();
708bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner};
71f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
72f266f89634363cb067a5b43cbe33f79c4397c08cDan Gohmanclass MachineFunction {
73ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohman  Function *Fn;
74335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  const TargetMachine &Target;
7511d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner  MCContext &Ctx;
76820e55e9ad3cb3b17780e84863648e431b571d25Chris Lattner  MachineModuleInfo &MMI;
77820e55e9ad3cb3b17780e84863648e431b571d25Chris Lattner
7884bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner  // RegInfo - Information about each register in use in the function.
7984bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner  MachineRegisterInfo *RegInfo;
8003ab7af4dec01a3003e469c458e37bbf4ce4f2f3Chris Lattner
818bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner  // Used to keep track of target-specific per-machine function information for
828bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner  // the target implementation.
838bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner  MachineFunctionInfo *MFInfo;
84cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
85cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  // Keep track of objects allocated on the stack.
86aa09b75d2257545c4583265c7ce10f2d0e3be72bChris Lattner  MachineFrameInfo *FrameInfo;
871617e6c9974813030c8294243bf9e152f89ffd9bMisha Brukman
8840a75577ea6b4fb9cc92780ca0caa21604246b1bChris Lattner  // Keep track of constants which are spilled to memory
8940a75577ea6b4fb9cc92780ca0caa21604246b1bChris Lattner  MachineConstantPool *ConstantPool;
9037efe6764568a3829fee26aba532283131d1a104Nate Begeman
9137efe6764568a3829fee26aba532283131d1a104Nate Begeman  // Keep track of jump tables for switch instructions
9237efe6764568a3829fee26aba532283131d1a104Nate Begeman  MachineJumpTableInfo *JumpTableInfo;
9340a75577ea6b4fb9cc92780ca0caa21604246b1bChris Lattner
9425d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  // Function-level unique numbering for MachineBasicBlocks.  When a
9525d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  // MachineBasicBlock is inserted into a MachineFunction is it automatically
9625d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  // numbered and this vector keeps track of the mapping from ID's to MBB's.
9725d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  std::vector<MachineBasicBlock*> MBBNumbering;
98f460f1679e8ac1935220e1878fd97cf44f093659Brian Gaeke
998e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // Pool-allocate MachineFunction-lifetime and IR objects.
1008e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  BumpPtrAllocator Allocator;
1018e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
1028e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // Allocation management for instructions in function.
1038e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  Recycler<MachineInstr> InstructionRecycler;
1048e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
1058e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // Allocation management for basic blocks in function.
1068e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  Recycler<MachineBasicBlock> BasicBlockRecycler;
1078e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
1088e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // List of machine basic blocks in function
109fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  typedef ilist<MachineBasicBlock> BasicBlockListType;
1108e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  BasicBlockListType BasicBlocks;
1118e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
112820e55e9ad3cb3b17780e84863648e431b571d25Chris Lattner  /// Default debug location. Used to print out the debug label at the beginning
113820e55e9ad3cb3b17780e84863648e431b571d25Chris Lattner  /// of a function.
1145d0f68134e66956242bc93843f56634bfc4df3a8Bill Wendling  DebugLoc DefaultDebugLoc;
1155d0f68134e66956242bc93843f56634bfc4df3a8Bill Wendling
116b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  /// FunctionNumber - This provides a unique ID for each function emitted in
117b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  /// this translation unit.
118b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  ///
119b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  unsigned FunctionNumber;
120b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner
121820e55e9ad3cb3b17780e84863648e431b571d25Chris Lattner  /// The alignment of the function.
12220c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling  unsigned Alignment;
12320c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling
12411d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner  MachineFunction(const MachineFunction &); // DO NOT IMPLEMENT
12511d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner  void operator=(const MachineFunction&);   // DO NOT IMPLEMENT
126f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattnerpublic:
12711d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner  MachineFunction(Function *Fn, const TargetMachine &TM, unsigned FunctionNum,
128820e55e9ad3cb3b17780e84863648e431b571d25Chris Lattner                  MachineModuleInfo &MMI);
12903ab7af4dec01a3003e469c458e37bbf4ce4f2f3Chris Lattner  ~MachineFunction();
130335d5c399b52c2507ad11048310edc51462f4811Chris Lattner
131820e55e9ad3cb3b17780e84863648e431b571d25Chris Lattner  MachineModuleInfo &getMMI() const { return MMI; }
13211d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner  MCContext &getContext() const { return Ctx; }
13311d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner
134335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  /// getFunction - Return the LLVM function that this machine code represents
135335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  ///
136ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohman  Function *getFunction() const { return Fn; }
137335d5c399b52c2507ad11048310edc51462f4811Chris Lattner
138b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  /// getFunctionNumber - Return a unique ID for the current function.
139b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  ///
140b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  unsigned getFunctionNumber() const { return FunctionNumber; }
141b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner
142335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  /// getTarget - Return the target machine this machine code is compiled with
143335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  ///
144335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  const TargetMachine &getTarget() const { return Target; }
145dea73839f69b004314d223f75d136551132108ccChris Lattner
14684bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner  /// getRegInfo - Return information about the registers currently in use.
147cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  ///
1488e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineRegisterInfo &getRegInfo() { return *RegInfo; }
1498e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  const MachineRegisterInfo &getRegInfo() const { return *RegInfo; }
150cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
151cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  /// getFrameInfo - Return the frame info object for the current function.
152cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  /// This object contains information about objects allocated on the stack
153cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  /// frame of the current function in an abstract way.
154cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  ///
1558e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineFrameInfo *getFrameInfo() { return FrameInfo; }
1568e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  const MachineFrameInfo *getFrameInfo() const { return FrameInfo; }
157cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
15837efe6764568a3829fee26aba532283131d1a104Nate Begeman  /// getJumpTableInfo - Return the jump table info object for the current
159071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  /// function.  This object contains information about jump tables in the
160071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  /// current function.  If the current function has no jump tables, this will
161071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  /// return null.
1628e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  const MachineJumpTableInfo *getJumpTableInfo() const { return JumpTableInfo; }
163071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  MachineJumpTableInfo *getJumpTableInfo() { return JumpTableInfo; }
164071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner
165071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  /// getOrCreateJumpTableInfo - Get the JumpTableInfo for this function, if it
166071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  /// does already exist, allocate one.
167071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  MachineJumpTableInfo *getOrCreateJumpTableInfo(unsigned JTEntryKind);
168071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner
16937efe6764568a3829fee26aba532283131d1a104Nate Begeman
17040a75577ea6b4fb9cc92780ca0caa21604246b1bChris Lattner  /// getConstantPool - Return the constant pool object for the current
17140a75577ea6b4fb9cc92780ca0caa21604246b1bChris Lattner  /// function.
172274ba03f49e78ccb5670292a8cab53009dcca896Misha Brukman  ///
1738e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineConstantPool *getConstantPool() { return ConstantPool; }
1748e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  const MachineConstantPool *getConstantPool() const { return ConstantPool; }
17540a75577ea6b4fb9cc92780ca0caa21604246b1bChris Lattner
176b4202b84d7e54efe5e144885c7da63e6cc465f80Bill Wendling  /// getAlignment - Return the alignment (log2, not bytes) of the function.
17720c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling  ///
17820c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling  unsigned getAlignment() const { return Alignment; }
17920c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling
180b4202b84d7e54efe5e144885c7da63e6cc465f80Bill Wendling  /// setAlignment - Set the alignment (log2, not bytes) of the function.
18120c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling  ///
18220c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling  void setAlignment(unsigned A) { Alignment = A; }
18320c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling
184aeb7be3435f2ad051ebc10bbf9613b7334181056Chris Lattner  /// EnsureAlignment - Make sure the function is at least 'A' bits aligned.
185aeb7be3435f2ad051ebc10bbf9613b7334181056Chris Lattner  void EnsureAlignment(unsigned A) {
186aeb7be3435f2ad051ebc10bbf9613b7334181056Chris Lattner    if (Alignment < A) Alignment = A;
187aeb7be3435f2ad051ebc10bbf9613b7334181056Chris Lattner  }
188aeb7be3435f2ad051ebc10bbf9613b7334181056Chris Lattner
189a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner  /// getInfo - Keep track of various per-function pieces of information for
190a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner  /// backends that would like to do so.
191cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  ///
1928bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner  template<typename Ty>
1938bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner  Ty *getInfo() {
194219c7905c503ece263bb755479edc16430870e83Dan Gohman    if (!MFInfo) {
195219c7905c503ece263bb755479edc16430870e83Dan Gohman        // This should be just `new (Allocator.Allocate<Ty>()) Ty(*this)', but
196219c7905c503ece263bb755479edc16430870e83Dan Gohman        // that apparently breaks GCC 3.3.
197219c7905c503ece263bb755479edc16430870e83Dan Gohman        Ty *Loc = static_cast<Ty*>(Allocator.Allocate(sizeof(Ty),
198219c7905c503ece263bb755479edc16430870e83Dan Gohman                                                      AlignOf<Ty>::Alignment));
199219c7905c503ece263bb755479edc16430870e83Dan Gohman        MFInfo = new (Loc) Ty(*this);
200219c7905c503ece263bb755479edc16430870e83Dan Gohman    }
2018bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner    return static_cast<Ty*>(MFInfo);
2028bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner  }
203cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
2045ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner  template<typename Ty>
2055ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner  const Ty *getInfo() const {
2065ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner     return const_cast<MachineFunction*>(this)->getInfo<Ty>();
2075ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner  }
2085ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner
20925d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// getBlockNumbered - MachineBasicBlocks are automatically numbered when they
21025d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// are inserted into the machine function.  The block number for a machine
21125d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// basic block can be found by using the MBB::getBlockNumber method, this
21225d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// method provides the inverse mapping.
213274ba03f49e78ccb5670292a8cab53009dcca896Misha Brukman  ///
21420683f94809ef74c11ea7ef6215405fd0dd18e3aJakob Stoklund Olesen  MachineBasicBlock *getBlockNumbered(unsigned N) const {
21525d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner    assert(N < MBBNumbering.size() && "Illegal block number");
21625d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner    assert(MBBNumbering[N] && "Block was removed from the machine function!");
21725d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner    return MBBNumbering[N];
21825d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  }
219cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
2202540813e5d583fdc40458a53badb323ae5d83a07Chris Lattner  /// getNumBlockIDs - Return the number of MBB ID's allocated.
221e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  ///
22234cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  unsigned getNumBlockIDs() const { return (unsigned)MBBNumbering.size(); }
223f5395cee6a24699a016b2e379cf4804b09ce5030Jim Laskey
224e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  /// RenumberBlocks - This discards all of the MachineBasicBlock numbers and
225e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  /// recomputes them.  This guarantees that the MBB numbers are sequential,
226e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  /// dense, and match the ordering of the blocks within the function.  If a
227e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  /// specific MachineBasicBlock is specified, only that block and those after
228e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  /// it are renumbered.
229e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  void RenumberBlocks(MachineBasicBlock *MBBFrom = 0);
230e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
231dea73839f69b004314d223f75d136551132108ccChris Lattner  /// print - Print out the MachineFunction in a format suitable for debugging
232dea73839f69b004314d223f75d136551132108ccChris Lattner  /// to the specified stream.
233dea73839f69b004314d223f75d136551132108ccChris Lattner  ///
2341d7fb4eae53c7ec5f9c5c18d603b50dfb9425862Chris Lattner  void print(raw_ostream &OS) const;
235dea73839f69b004314d223f75d136551132108ccChris Lattner
23671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// viewCFG - This function is meant for use from the debugger.  You can just
23771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// say 'call F->viewCFG()' and a ghostview window should pop up from the
23871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// program, displaying the CFG of the current function with the code for each
23971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// basic block inside.  This depends on there being a 'dot' and 'gv' program
24071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// in your path.
24171bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  ///
24271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  void viewCFG() const;
243ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
24471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// viewCFGOnly - This function is meant for use from the debugger.  It works
24571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// just like viewCFG, but it does not include the contents of basic blocks
24671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// into the nodes, just the label.  If you are only interested in the CFG
24771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// this can make the graph smaller.
24871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  ///
24971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  void viewCFGOnly() const;
25071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
251dea73839f69b004314d223f75d136551132108ccChris Lattner  /// dump - Print the current MachineFunction to cerr, useful for debugger use.
252dea73839f69b004314d223f75d136551132108ccChris Lattner  ///
253dea73839f69b004314d223f75d136551132108ccChris Lattner  void dump() const;
254dea73839f69b004314d223f75d136551132108ccChris Lattner
255ce727d0da006ca59bbd8c9ddc86e2fa71217d293Jakob Stoklund Olesen  /// verify - Run the current MachineFunction through the machine code
256ce727d0da006ca59bbd8c9ddc86e2fa71217d293Jakob Stoklund Olesen  /// verifier, useful for debugger use.
2578f16e02fc95c9b197d38bcd681f2612d36ed5c11Jakob Stoklund Olesen  void verify(Pass *p=NULL, bool allowDoubleDefs=false) const;
258ce727d0da006ca59bbd8c9ddc86e2fa71217d293Jakob Stoklund Olesen
259d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  // Provide accessors for the MachineBasicBlock list...
260d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  typedef BasicBlockListType::iterator iterator;
261d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  typedef BasicBlockListType::const_iterator const_iterator;
262d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
263d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  typedef std::reverse_iterator<iterator>             reverse_iterator;
264d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner
265998e125a87d49f28c714d8223a37746850401057Bob Wilson  /// addLiveIn - Add the specified physical register as a live-in value and
266998e125a87d49f28c714d8223a37746850401057Bob Wilson  /// create a corresponding virtual register for it.
267998e125a87d49f28c714d8223a37746850401057Bob Wilson  unsigned addLiveIn(unsigned PReg, const TargetRegisterClass *RC);
268998e125a87d49f28c714d8223a37746850401057Bob Wilson
269d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  //===--------------------------------------------------------------------===//
2708e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // BasicBlock accessor functions.
271d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  //
272d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  iterator                 begin()       { return BasicBlocks.begin(); }
273d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const_iterator           begin() const { return BasicBlocks.begin(); }
274d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  iterator                 end  ()       { return BasicBlocks.end();   }
275d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const_iterator           end  () const { return BasicBlocks.end();   }
276d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner
277d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  reverse_iterator        rbegin()       { return BasicBlocks.rbegin(); }
278d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const_reverse_iterator  rbegin() const { return BasicBlocks.rbegin(); }
279d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  reverse_iterator        rend  ()       { return BasicBlocks.rend();   }
280d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const_reverse_iterator  rend  () const { return BasicBlocks.rend();   }
2819c6342d0cc919711ea1024b98b1b387573995922Chris Lattner
28234cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  unsigned                  size() const { return (unsigned)BasicBlocks.size();}
283d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  bool                     empty() const { return BasicBlocks.empty(); }
284d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const MachineBasicBlock &front() const { return BasicBlocks.front(); }
285d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner        MachineBasicBlock &front()       { return BasicBlocks.front(); }
286d5806ffb40899aca4f3c23442645ed0ef4fa390fMisha Brukman  const MachineBasicBlock & back() const { return BasicBlocks.back(); }
287d5806ffb40899aca4f3c23442645ed0ef4fa390fMisha Brukman        MachineBasicBlock & back()       { return BasicBlocks.back(); }
28825d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner
2898e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void push_back (MachineBasicBlock *MBB) { BasicBlocks.push_back (MBB); }
2908e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void push_front(MachineBasicBlock *MBB) { BasicBlocks.push_front(MBB); }
2918e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void insert(iterator MBBI, MachineBasicBlock *MBB) {
2928e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman    BasicBlocks.insert(MBBI, MBB);
2938e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  }
2948e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void splice(iterator InsertPt, iterator MBBI) {
2958e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman    BasicBlocks.splice(InsertPt, BasicBlocks, MBBI);
2968e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  }
297b68d67caf3d8e73e92df932f46b67c87e7eb17c2Dan Gohman  void splice(iterator InsertPt, iterator MBBI, iterator MBBE) {
298b68d67caf3d8e73e92df932f46b67c87e7eb17c2Dan Gohman    BasicBlocks.splice(InsertPt, BasicBlocks, MBBI, MBBE);
299b68d67caf3d8e73e92df932f46b67c87e7eb17c2Dan Gohman  }
3008e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
3018e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void remove(iterator MBBI) {
3028e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman    BasicBlocks.remove(MBBI);
3038e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  }
3048e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void erase(iterator MBBI) {
3058e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman    BasicBlocks.erase(MBBI);
3068e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  }
3078e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
30825d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  //===--------------------------------------------------------------------===//
30925d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  // Internal functions used to automatically number MachineBasicBlocks
31025d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  //
31125d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner
31225d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// getNextMBBNumber - Returns the next unique number to be assigned
31325d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// to a MachineBasicBlock in this MachineFunction.
31425d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  ///
31525d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  unsigned addToMBBNumbering(MachineBasicBlock *MBB) {
31625d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner    MBBNumbering.push_back(MBB);
31734cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng    return (unsigned)MBBNumbering.size()-1;
31825d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  }
31925d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner
32025d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// removeFromMBBNumbering - Remove the specific machine basic block from our
32125d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// tracker, this is only really to be used by the MachineBasicBlock
32225d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// implementation.
32325d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  void removeFromMBBNumbering(unsigned N) {
32425d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner    assert(N < MBBNumbering.size() && "Illegal basic block #");
32525d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner    MBBNumbering[N] = 0;
32625d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  }
3278e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
3288e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// CreateMachineInstr - Allocate a new MachineInstr. Use this instead
3298e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// of `new MachineInstr'.
3308e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  ///
3318e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineInstr *CreateMachineInstr(const TargetInstrDesc &TID,
3329bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling                                   DebugLoc DL,
3338e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman                                   bool NoImp = false);
3348e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
3358e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// CloneMachineInstr - Create a new MachineInstr which is a copy of the
336f451cb870efcf9e0302d25ed05f4cac6bb494e42Dan Gohman  /// 'Orig' instruction, identical in all ways except the instruction
3378e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// has no parent, prev, or next.
3388e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  ///
339d1862037f04954f00cd6e6066ee213cfdc292877Jakob Stoklund Olesen  /// See also TargetInstrInfo::duplicate() for target-specific fixes to cloned
340d1862037f04954f00cd6e6066ee213cfdc292877Jakob Stoklund Olesen  /// instructions.
3418e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineInstr *CloneMachineInstr(const MachineInstr *Orig);
3428e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
3438e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// DeleteMachineInstr - Delete the given MachineInstr.
3448e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  ///
3458e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void DeleteMachineInstr(MachineInstr *MI);
3468e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
3478e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// CreateMachineBasicBlock - Allocate a new MachineBasicBlock. Use this
3488e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// instead of `new MachineBasicBlock'.
3498e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  ///
3508e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineBasicBlock *CreateMachineBasicBlock(const BasicBlock *bb = 0);
3518e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
3528e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// DeleteMachineBasicBlock - Delete the given MachineBasicBlock.
3538e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  ///
3548e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void DeleteMachineBasicBlock(MachineBasicBlock *MBB);
355d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng
356c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// getMachineMemOperand - Allocate a new MachineMemOperand.
357c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// MachineMemOperands are owned by the MachineFunction and need not be
358c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// explicitly deallocated.
359c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  MachineMemOperand *getMachineMemOperand(const Value *v, unsigned f,
360c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                                          int64_t o, uint64_t s,
361c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                                          unsigned base_alignment);
362c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
363c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// getMachineMemOperand - Allocate a new MachineMemOperand by copying
36491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  /// an existing one, adjusting by an offset and using the given size.
365c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// MachineMemOperands are owned by the MachineFunction and need not be
366c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// explicitly deallocated.
367c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  MachineMemOperand *getMachineMemOperand(const MachineMemOperand *MMO,
368c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                                          int64_t Offset, uint64_t Size);
369c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
370c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// allocateMemRefsArray - Allocate an array to hold MachineMemOperand
371c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// pointers.  This array is owned by the MachineFunction.
372c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  MachineInstr::mmo_iterator allocateMemRefsArray(unsigned long Num);
373c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
37491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  /// extractLoadMemRefs - Allocate an array and populate it with just the
37591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  /// load information from the given MachineMemOperand sequence.
37691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  std::pair<MachineInstr::mmo_iterator,
37791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman            MachineInstr::mmo_iterator>
37891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    extractLoadMemRefs(MachineInstr::mmo_iterator Begin,
37991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                       MachineInstr::mmo_iterator End);
38091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman
38191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  /// extractStoreMemRefs - Allocate an array and populate it with just the
38291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  /// store information from the given MachineMemOperand sequence.
38391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  std::pair<MachineInstr::mmo_iterator,
38491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman            MachineInstr::mmo_iterator>
38591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    extractStoreMemRefs(MachineInstr::mmo_iterator Begin,
38691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                        MachineInstr::mmo_iterator End);
38791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman
388d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng  //===--------------------------------------------------------------------===//
389589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  // Label Manipulation.
390589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  //
391589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner
392589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  /// getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
393589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  /// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a
394589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  /// normal 'L' label is returned.
395589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  MCSymbol *getJTISymbol(unsigned JTI, MCContext &Ctx,
396589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner                         bool isLinkerPrivate = false) const;
397589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner
398589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner
399589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  //===--------------------------------------------------------------------===//
400d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng  // Debug location.
401d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng  //
402d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng
4035d0f68134e66956242bc93843f56634bfc4df3a8Bill Wendling  /// getDefaultDebugLoc - Get the default debug location for the machine
4045d0f68134e66956242bc93843f56634bfc4df3a8Bill Wendling  /// function.
4055d0f68134e66956242bc93843f56634bfc4df3a8Bill Wendling  DebugLoc getDefaultDebugLoc() const { return DefaultDebugLoc; }
4065d0f68134e66956242bc93843f56634bfc4df3a8Bill Wendling
4075d0f68134e66956242bc93843f56634bfc4df3a8Bill Wendling  /// setDefaultDebugLoc - Get the default debug location for the machine
4085d0f68134e66956242bc93843f56634bfc4df3a8Bill Wendling  /// function.
4095d0f68134e66956242bc93843f56634bfc4df3a8Bill Wendling  void setDefaultDebugLoc(DebugLoc DL) { DefaultDebugLoc = DL; }
410f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner};
411f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
41271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos//===--------------------------------------------------------------------===//
41371bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// GraphTraits specializations for function basic block graphs (CFGs)
41471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos//===--------------------------------------------------------------------===//
41571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
41671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// Provide specializations of GraphTraits to be able to treat a
41771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// machine function as a graph of machine basic blocks... these are
41871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// the same as the machine basic block iterators, except that the root
41971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// node is implicitly the first node of the function.
42071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos//
42171bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenostemplate <> struct GraphTraits<MachineFunction*> :
42271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  public GraphTraits<MachineBasicBlock*> {
42371bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  static NodeType *getEntryNode(MachineFunction *F) {
42471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos    return &F->front();
42571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  }
42671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
42771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
42871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  typedef MachineFunction::iterator nodes_iterator;
42971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  static nodes_iterator nodes_begin(MachineFunction *F) { return F->begin(); }
43071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  static nodes_iterator nodes_end  (MachineFunction *F) { return F->end(); }
43171bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos};
43271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenostemplate <> struct GraphTraits<const MachineFunction*> :
43371bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  public GraphTraits<const MachineBasicBlock*> {
43471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  static NodeType *getEntryNode(const MachineFunction *F) {
43571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos    return &F->front();
43671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  }
43771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
43871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
43971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  typedef MachineFunction::const_iterator nodes_iterator;
440c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  static nodes_iterator nodes_begin(const MachineFunction *F) {
441c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif    return F->begin();
442c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  }
443c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  static nodes_iterator nodes_end  (const MachineFunction *F) {
444c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif    return F->end();
445c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  }
44671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos};
44771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
44871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
449ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// Provide specializations of GraphTraits to be able to treat a function as a
45071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// graph of basic blocks... and to walk it in inverse order.  Inverse order for
45171bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// a function is considered to be when traversing the predecessor edges of a BB
45271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// instead of the successor edges.
45371bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos//
45471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenostemplate <> struct GraphTraits<Inverse<MachineFunction*> > :
45571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  public GraphTraits<Inverse<MachineBasicBlock*> > {
45671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  static NodeType *getEntryNode(Inverse<MachineFunction*> G) {
45771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos    return &G.Graph->front();
45871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  }
45971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos};
46071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenostemplate <> struct GraphTraits<Inverse<const MachineFunction*> > :
46171bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  public GraphTraits<Inverse<const MachineBasicBlock*> > {
46271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  static NodeType *getEntryNode(Inverse<const MachineFunction *> G) {
46371bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos    return &G.Graph->front();
46471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  }
46571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos};
46671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
467d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
468d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
469f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner#endif
470