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;
317a5a3f75eb6751c35682f506887c34bf57d6ea3eNicolas Geoffrayclass GCModuleInfo;
3284bc5427d6883f73cfeae3da640acd011d35c006Chris Lattnerclass MachineRegisterInfo;
338bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattnerclass MachineFrameInfo;
348bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattnerclass MachineConstantPool;
3537efe6764568a3829fee26aba532283131d1a104Nate Begemanclass MachineJumpTableInfo;
36820e55e9ad3cb3b17780e84863648e431b571d25Chris Lattnerclass MachineModuleInfo;
371b2eb0e8a6aaf034675b17be6d853cb1c666200fChris Lattnerclass MCContext;
38a655f088b88cf015fc48721fd9869787d1b8ce13Chris Lattnerclass Pass;
39d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Chengclass TargetMachine;
40998e125a87d49f28c714d8223a37746850401057Bob Wilsonclass TargetRegisterClass;
41da39c3964423744b4d79aebef8bece3e9141d5fcChris Lattnerstruct MachinePointerInfo;
428bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner
43792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattnertemplate <>
448e4018e2de52c534405d7155c7009d0b35afb861Cedric Venetstruct ilist_traits<MachineBasicBlock>
45fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman    : public ilist_default_traits<MachineBasicBlock> {
467309be6735666143bd9835b275dc8501617a2591Gabor Greif  mutable ilist_half_node<MachineBasicBlock> Sentinel;
47792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattnerpublic:
48c7f6b8c5d40e17bf43fd3a1549d7d89c9da735e1Gabor Greif  MachineBasicBlock *createSentinel() const {
49c7f6b8c5d40e17bf43fd3a1549d7d89c9da735e1Gabor Greif    return static_cast<MachineBasicBlock*>(&Sentinel);
50c7f6b8c5d40e17bf43fd3a1549d7d89c9da735e1Gabor Greif  }
51fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  void destroySentinel(MachineBasicBlock *) const {}
52fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman
53c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  MachineBasicBlock *provideInitialHead() const { return createSentinel(); }
54c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  MachineBasicBlock *ensureHead(MachineBasicBlock*) const {
55c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif    return createSentinel();
56c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  }
57f3841fcbd587c31aa9842b3f33bd57de40c9f443Gabor Greif  static void noteHead(MachineBasicBlock*, MachineBasicBlock*) {}
58c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif
598e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void addNodeToList(MachineBasicBlock* MBB);
608e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void removeNodeFromList(MachineBasicBlock* MBB);
618e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void deleteNode(MachineBasicBlock *MBB);
62fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanprivate:
63fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  void createNode(const MachineBasicBlock &);
64792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner};
65792699c46ef9bfc47dd459bbfa7e71bcb2cee29aTanya Lattner
668bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner/// MachineFunctionInfo - This class can be derived from and used by targets to
678bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner/// hold private target-specific information for each MachineFunction.  Objects
688bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner/// of type are accessed/created with MF::getInfo and destroyed when the
698bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner/// MachineFunction is destroyed.
708bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattnerstruct MachineFunctionInfo {
71a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner  virtual ~MachineFunctionInfo();
728bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner};
73f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
74f266f89634363cb067a5b43cbe33f79c4397c08cDan Gohmanclass MachineFunction {
75ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  const Function *Fn;
76335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  const TargetMachine &Target;
7711d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner  MCContext &Ctx;
78820e55e9ad3cb3b17780e84863648e431b571d25Chris Lattner  MachineModuleInfo &MMI;
797a5a3f75eb6751c35682f506887c34bf57d6ea3eNicolas Geoffray  GCModuleInfo *GMI;
80820e55e9ad3cb3b17780e84863648e431b571d25Chris Lattner
8184bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner  // RegInfo - Information about each register in use in the function.
8284bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner  MachineRegisterInfo *RegInfo;
8303ab7af4dec01a3003e469c458e37bbf4ce4f2f3Chris Lattner
848bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner  // Used to keep track of target-specific per-machine function information for
858bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner  // the target implementation.
868bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner  MachineFunctionInfo *MFInfo;
87cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
88cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  // Keep track of objects allocated on the stack.
89aa09b75d2257545c4583265c7ce10f2d0e3be72bChris Lattner  MachineFrameInfo *FrameInfo;
901617e6c9974813030c8294243bf9e152f89ffd9bMisha Brukman
9140a75577ea6b4fb9cc92780ca0caa21604246b1bChris Lattner  // Keep track of constants which are spilled to memory
9240a75577ea6b4fb9cc92780ca0caa21604246b1bChris Lattner  MachineConstantPool *ConstantPool;
9337efe6764568a3829fee26aba532283131d1a104Nate Begeman
9437efe6764568a3829fee26aba532283131d1a104Nate Begeman  // Keep track of jump tables for switch instructions
9537efe6764568a3829fee26aba532283131d1a104Nate Begeman  MachineJumpTableInfo *JumpTableInfo;
9640a75577ea6b4fb9cc92780ca0caa21604246b1bChris Lattner
9725d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  // Function-level unique numbering for MachineBasicBlocks.  When a
9825d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  // MachineBasicBlock is inserted into a MachineFunction is it automatically
9925d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  // numbered and this vector keeps track of the mapping from ID's to MBB's.
10025d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  std::vector<MachineBasicBlock*> MBBNumbering;
101f460f1679e8ac1935220e1878fd97cf44f093659Brian Gaeke
1028e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // Pool-allocate MachineFunction-lifetime and IR objects.
1038e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  BumpPtrAllocator Allocator;
1048e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
1058e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // Allocation management for instructions in function.
1068e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  Recycler<MachineInstr> InstructionRecycler;
1078e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
1088e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // Allocation management for basic blocks in function.
1098e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  Recycler<MachineBasicBlock> BasicBlockRecycler;
1108e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
1118e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // List of machine basic blocks in function
112fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman  typedef ilist<MachineBasicBlock> BasicBlockListType;
1138e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  BasicBlockListType BasicBlocks;
1148e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
115b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  /// FunctionNumber - This provides a unique ID for each function emitted in
116b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  /// this translation unit.
117b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  ///
118b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  unsigned FunctionNumber;
119b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner
1209af7e9a1b5fb04ba677059ada9290cd3864523b2Bill Wendling  /// Alignment - The alignment of the function.
12120c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling  unsigned Alignment;
12220c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling
12334706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger  /// ExposesReturnsTwice - True if the function calls setjmp or related
12434706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger  /// functions with attribute "returns twice", but doesn't have
12534706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger  /// the attribute itself.
12634706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger  /// This is used to limit optimizations which cannot reason
12734706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger  /// about the control flow of such functions.
12834706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger  bool ExposesReturnsTwice;
1299af7e9a1b5fb04ba677059ada9290cd3864523b2Bill Wendling
13011d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner  MachineFunction(const MachineFunction &); // DO NOT IMPLEMENT
13111d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner  void operator=(const MachineFunction&);   // DO NOT IMPLEMENT
132f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattnerpublic:
133ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  MachineFunction(const Function *Fn, const TargetMachine &TM,
1347a5a3f75eb6751c35682f506887c34bf57d6ea3eNicolas Geoffray                  unsigned FunctionNum, MachineModuleInfo &MMI,
1357a5a3f75eb6751c35682f506887c34bf57d6ea3eNicolas Geoffray                  GCModuleInfo* GMI);
13603ab7af4dec01a3003e469c458e37bbf4ce4f2f3Chris Lattner  ~MachineFunction();
137335d5c399b52c2507ad11048310edc51462f4811Chris Lattner
138820e55e9ad3cb3b17780e84863648e431b571d25Chris Lattner  MachineModuleInfo &getMMI() const { return MMI; }
1397a5a3f75eb6751c35682f506887c34bf57d6ea3eNicolas Geoffray  GCModuleInfo *getGMI() const { return GMI; }
14011d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner  MCContext &getContext() const { return Ctx; }
14111d53c129fc9c2a4510605ec0a1696f58750af52Chris Lattner
142335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  /// getFunction - Return the LLVM function that this machine code represents
143335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  ///
144ae541aad5c36cb3e4256514447d1f81e253079c7Dan Gohman  const Function *getFunction() const { return Fn; }
145335d5c399b52c2507ad11048310edc51462f4811Chris Lattner
146b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  /// getFunctionNumber - Return a unique ID for the current function.
147b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  ///
148b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner  unsigned getFunctionNumber() const { return FunctionNumber; }
149b84822fb7b64977c16e97b870891da1d6c9736feChris Lattner
150335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  /// getTarget - Return the target machine this machine code is compiled with
151335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  ///
152335d5c399b52c2507ad11048310edc51462f4811Chris Lattner  const TargetMachine &getTarget() const { return Target; }
153dea73839f69b004314d223f75d136551132108ccChris Lattner
15484bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner  /// getRegInfo - Return information about the registers currently in use.
155cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  ///
1568e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineRegisterInfo &getRegInfo() { return *RegInfo; }
1578e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  const MachineRegisterInfo &getRegInfo() const { return *RegInfo; }
158cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
159cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  /// getFrameInfo - Return the frame info object for the current function.
160cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  /// This object contains information about objects allocated on the stack
161cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  /// frame of the current function in an abstract way.
162cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  ///
1638e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineFrameInfo *getFrameInfo() { return FrameInfo; }
1648e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  const MachineFrameInfo *getFrameInfo() const { return FrameInfo; }
165cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
16637efe6764568a3829fee26aba532283131d1a104Nate Begeman  /// getJumpTableInfo - Return the jump table info object for the current
167071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  /// function.  This object contains information about jump tables in the
168071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  /// current function.  If the current function has no jump tables, this will
169071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  /// return null.
1708e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  const MachineJumpTableInfo *getJumpTableInfo() const { return JumpTableInfo; }
171071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  MachineJumpTableInfo *getJumpTableInfo() { return JumpTableInfo; }
172071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner
173071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  /// getOrCreateJumpTableInfo - Get the JumpTableInfo for this function, if it
174071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  /// does already exist, allocate one.
175071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner  MachineJumpTableInfo *getOrCreateJumpTableInfo(unsigned JTEntryKind);
176071c62fad0b25ad4131e7f984173a796c1e63f61Chris Lattner
17737efe6764568a3829fee26aba532283131d1a104Nate Begeman
17840a75577ea6b4fb9cc92780ca0caa21604246b1bChris Lattner  /// getConstantPool - Return the constant pool object for the current
17940a75577ea6b4fb9cc92780ca0caa21604246b1bChris Lattner  /// function.
180274ba03f49e78ccb5670292a8cab53009dcca896Misha Brukman  ///
1818e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineConstantPool *getConstantPool() { return ConstantPool; }
1828e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  const MachineConstantPool *getConstantPool() const { return ConstantPool; }
18340a75577ea6b4fb9cc92780ca0caa21604246b1bChris Lattner
184b4202b84d7e54efe5e144885c7da63e6cc465f80Bill Wendling  /// getAlignment - Return the alignment (log2, not bytes) of the function.
18520c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling  ///
18620c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling  unsigned getAlignment() const { return Alignment; }
18720c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling
188b4202b84d7e54efe5e144885c7da63e6cc465f80Bill Wendling  /// setAlignment - Set the alignment (log2, not bytes) of the function.
18920c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling  ///
19020c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling  void setAlignment(unsigned A) { Alignment = A; }
19120c568f366be211323eeaf0e45ef053278ec9ddcBill Wendling
192757a3179b2f3424bf64e0ac92934915c1d9c6fd0Jakob Stoklund Olesen  /// EnsureAlignment - Make sure the function is at least 1 << A bytes aligned.
193aeb7be3435f2ad051ebc10bbf9613b7334181056Chris Lattner  void EnsureAlignment(unsigned A) {
194aeb7be3435f2ad051ebc10bbf9613b7334181056Chris Lattner    if (Alignment < A) Alignment = A;
195aeb7be3435f2ad051ebc10bbf9613b7334181056Chris Lattner  }
1969af7e9a1b5fb04ba677059ada9290cd3864523b2Bill Wendling
19734706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger  /// exposesReturnsTwice - Returns true if the function calls setjmp or
19834706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger  /// any other similar functions with attribute "returns twice" without
19934706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger  /// having the attribute itself.
20034706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger  bool exposesReturnsTwice() const {
20134706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger    return ExposesReturnsTwice;
2029af7e9a1b5fb04ba677059ada9290cd3864523b2Bill Wendling  }
2039af7e9a1b5fb04ba677059ada9290cd3864523b2Bill Wendling
20434706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger  /// setCallsSetJmp - Set a flag that indicates if there's a call to
20534706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger  /// a "returns twice" function.
20634706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger  void setExposesReturnsTwice(bool B) {
20734706936412b9e9ff73511fed58e97bf6e100e69Joerg Sonnenberger    ExposesReturnsTwice = B;
2089af7e9a1b5fb04ba677059ada9290cd3864523b2Bill Wendling  }
209aeb7be3435f2ad051ebc10bbf9613b7334181056Chris Lattner
210a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner  /// getInfo - Keep track of various per-function pieces of information for
211a70e2e3d4831b8a39ea6bae5c62df29fa82a86f3Chris Lattner  /// backends that would like to do so.
212cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner  ///
2138bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner  template<typename Ty>
2148bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner  Ty *getInfo() {
215219c7905c503ece263bb755479edc16430870e83Dan Gohman    if (!MFInfo) {
216219c7905c503ece263bb755479edc16430870e83Dan Gohman        // This should be just `new (Allocator.Allocate<Ty>()) Ty(*this)', but
217219c7905c503ece263bb755479edc16430870e83Dan Gohman        // that apparently breaks GCC 3.3.
218219c7905c503ece263bb755479edc16430870e83Dan Gohman        Ty *Loc = static_cast<Ty*>(Allocator.Allocate(sizeof(Ty),
219219c7905c503ece263bb755479edc16430870e83Dan Gohman                                                      AlignOf<Ty>::Alignment));
220219c7905c503ece263bb755479edc16430870e83Dan Gohman        MFInfo = new (Loc) Ty(*this);
221219c7905c503ece263bb755479edc16430870e83Dan Gohman    }
2228bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner    return static_cast<Ty*>(MFInfo);
2238bdf87d1d8abde45c40b2698dd9af8407007281cChris Lattner  }
224cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
2255ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner  template<typename Ty>
2265ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner  const Ty *getInfo() const {
2275ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner     return const_cast<MachineFunction*>(this)->getInfo<Ty>();
2285ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner  }
2295ea64fd9eb0027ad20a66ea29211eef79d8842a0Chris Lattner
23025d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// getBlockNumbered - MachineBasicBlocks are automatically numbered when they
23125d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// are inserted into the machine function.  The block number for a machine
23225d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// basic block can be found by using the MBB::getBlockNumber method, this
23325d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// method provides the inverse mapping.
234274ba03f49e78ccb5670292a8cab53009dcca896Misha Brukman  ///
23520683f94809ef74c11ea7ef6215405fd0dd18e3aJakob Stoklund Olesen  MachineBasicBlock *getBlockNumbered(unsigned N) const {
23625d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner    assert(N < MBBNumbering.size() && "Illegal block number");
23725d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner    assert(MBBNumbering[N] && "Block was removed from the machine function!");
23825d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner    return MBBNumbering[N];
23925d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  }
240cd0d1d1f0f44773b5c4bb57f557e6187891ff1d5Chris Lattner
2412540813e5d583fdc40458a53badb323ae5d83a07Chris Lattner  /// getNumBlockIDs - Return the number of MBB ID's allocated.
242e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  ///
24334cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  unsigned getNumBlockIDs() const { return (unsigned)MBBNumbering.size(); }
244f5395cee6a24699a016b2e379cf4804b09ce5030Jim Laskey
245e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  /// RenumberBlocks - This discards all of the MachineBasicBlock numbers and
246e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  /// recomputes them.  This guarantees that the MBB numbers are sequential,
247e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  /// dense, and match the ordering of the blocks within the function.  If a
248e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  /// specific MachineBasicBlock is specified, only that block and those after
249e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  /// it are renumbered.
250e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner  void RenumberBlocks(MachineBasicBlock *MBBFrom = 0);
251e70cab0ca4d7835c8e1e0ee6a125be8f2790a136Chris Lattner
252dea73839f69b004314d223f75d136551132108ccChris Lattner  /// print - Print out the MachineFunction in a format suitable for debugging
253dea73839f69b004314d223f75d136551132108ccChris Lattner  /// to the specified stream.
254dea73839f69b004314d223f75d136551132108ccChris Lattner  ///
255f4a1e1a69f0727762a73ef0d551e3bbd16b7c04eJakob Stoklund Olesen  void print(raw_ostream &OS, SlotIndexes* = 0) const;
256dea73839f69b004314d223f75d136551132108ccChris Lattner
25771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// viewCFG - This function is meant for use from the debugger.  You can just
25871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// say 'call F->viewCFG()' and a ghostview window should pop up from the
25971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// program, displaying the CFG of the current function with the code for each
26071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// basic block inside.  This depends on there being a 'dot' and 'gv' program
26171bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// in your path.
26271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  ///
26371bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  void viewCFG() const;
264ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman
26571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// viewCFGOnly - This function is meant for use from the debugger.  It works
26671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// just like viewCFG, but it does not include the contents of basic blocks
26771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// into the nodes, just the label.  If you are only interested in the CFG
26871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  /// this can make the graph smaller.
26971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  ///
27071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  void viewCFGOnly() const;
27171bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
272dea73839f69b004314d223f75d136551132108ccChris Lattner  /// dump - Print the current MachineFunction to cerr, useful for debugger use.
273dea73839f69b004314d223f75d136551132108ccChris Lattner  ///
274dea73839f69b004314d223f75d136551132108ccChris Lattner  void dump() const;
275dea73839f69b004314d223f75d136551132108ccChris Lattner
276ce727d0da006ca59bbd8c9ddc86e2fa71217d293Jakob Stoklund Olesen  /// verify - Run the current MachineFunction through the machine code
277ce727d0da006ca59bbd8c9ddc86e2fa71217d293Jakob Stoklund Olesen  /// verifier, useful for debugger use.
27889cab93fe999f6d81b4b99a71ac797b7ecfec277Jakob Stoklund Olesen  void verify(Pass *p = NULL, const char *Banner = NULL) const;
279ce727d0da006ca59bbd8c9ddc86e2fa71217d293Jakob Stoklund Olesen
280d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  // Provide accessors for the MachineBasicBlock list...
281d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  typedef BasicBlockListType::iterator iterator;
282d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  typedef BasicBlockListType::const_iterator const_iterator;
283d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
284d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  typedef std::reverse_iterator<iterator>             reverse_iterator;
285d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner
286998e125a87d49f28c714d8223a37746850401057Bob Wilson  /// addLiveIn - Add the specified physical register as a live-in value and
287998e125a87d49f28c714d8223a37746850401057Bob Wilson  /// create a corresponding virtual register for it.
28868e6beeccc0b9ac2e8d3687a8a5b7d4b172edca1Devang Patel  unsigned addLiveIn(unsigned PReg, const TargetRegisterClass *RC);
289998e125a87d49f28c714d8223a37746850401057Bob Wilson
290d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  //===--------------------------------------------------------------------===//
2918e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  // BasicBlock accessor functions.
292d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  //
293d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  iterator                 begin()       { return BasicBlocks.begin(); }
294d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const_iterator           begin() const { return BasicBlocks.begin(); }
295d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  iterator                 end  ()       { return BasicBlocks.end();   }
296d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const_iterator           end  () const { return BasicBlocks.end();   }
297d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner
298d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  reverse_iterator        rbegin()       { return BasicBlocks.rbegin(); }
299d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const_reverse_iterator  rbegin() const { return BasicBlocks.rbegin(); }
300d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  reverse_iterator        rend  ()       { return BasicBlocks.rend();   }
301d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const_reverse_iterator  rend  () const { return BasicBlocks.rend();   }
3029c6342d0cc919711ea1024b98b1b387573995922Chris Lattner
30334cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng  unsigned                  size() const { return (unsigned)BasicBlocks.size();}
304d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  bool                     empty() const { return BasicBlocks.empty(); }
305d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner  const MachineBasicBlock &front() const { return BasicBlocks.front(); }
306d0aa0cdbc6fee00f2b2019633a9b9d00d301ac68Chris Lattner        MachineBasicBlock &front()       { return BasicBlocks.front(); }
307d5806ffb40899aca4f3c23442645ed0ef4fa390fMisha Brukman  const MachineBasicBlock & back() const { return BasicBlocks.back(); }
308d5806ffb40899aca4f3c23442645ed0ef4fa390fMisha Brukman        MachineBasicBlock & back()       { return BasicBlocks.back(); }
30925d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner
3108e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void push_back (MachineBasicBlock *MBB) { BasicBlocks.push_back (MBB); }
3118e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void push_front(MachineBasicBlock *MBB) { BasicBlocks.push_front(MBB); }
3128e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void insert(iterator MBBI, MachineBasicBlock *MBB) {
3138e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman    BasicBlocks.insert(MBBI, MBB);
3148e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  }
3158e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void splice(iterator InsertPt, iterator MBBI) {
3168e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman    BasicBlocks.splice(InsertPt, BasicBlocks, MBBI);
3178e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  }
318b68d67caf3d8e73e92df932f46b67c87e7eb17c2Dan Gohman  void splice(iterator InsertPt, iterator MBBI, iterator MBBE) {
319b68d67caf3d8e73e92df932f46b67c87e7eb17c2Dan Gohman    BasicBlocks.splice(InsertPt, BasicBlocks, MBBI, MBBE);
320b68d67caf3d8e73e92df932f46b67c87e7eb17c2Dan Gohman  }
3218e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
3228e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void remove(iterator MBBI) {
3238e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman    BasicBlocks.remove(MBBI);
3248e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  }
3258e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void erase(iterator MBBI) {
3268e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman    BasicBlocks.erase(MBBI);
3278e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  }
3288e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
32925d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  //===--------------------------------------------------------------------===//
33025d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  // Internal functions used to automatically number MachineBasicBlocks
33125d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  //
33225d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner
33325d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// getNextMBBNumber - Returns the next unique number to be assigned
33425d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// to a MachineBasicBlock in this MachineFunction.
33525d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  ///
33625d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  unsigned addToMBBNumbering(MachineBasicBlock *MBB) {
33725d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner    MBBNumbering.push_back(MBB);
33834cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng    return (unsigned)MBBNumbering.size()-1;
33925d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  }
34025d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner
34125d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// removeFromMBBNumbering - Remove the specific machine basic block from our
34225d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// tracker, this is only really to be used by the MachineBasicBlock
34325d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  /// implementation.
34425d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  void removeFromMBBNumbering(unsigned N) {
34525d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner    assert(N < MBBNumbering.size() && "Illegal basic block #");
34625d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner    MBBNumbering[N] = 0;
34725d8039bd6bdb53330c2d0968a5505e42d568048Chris Lattner  }
3488e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
3498e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// CreateMachineInstr - Allocate a new MachineInstr. Use this instead
3508e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// of `new MachineInstr'.
3518e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  ///
352e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng  MachineInstr *CreateMachineInstr(const MCInstrDesc &MCID,
3539bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling                                   DebugLoc DL,
3548e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman                                   bool NoImp = false);
3558e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
3568e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// CloneMachineInstr - Create a new MachineInstr which is a copy of the
357f451cb870efcf9e0302d25ed05f4cac6bb494e42Dan Gohman  /// 'Orig' instruction, identical in all ways except the instruction
3588e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// has no parent, prev, or next.
3598e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  ///
360d1862037f04954f00cd6e6066ee213cfdc292877Jakob Stoklund Olesen  /// See also TargetInstrInfo::duplicate() for target-specific fixes to cloned
361d1862037f04954f00cd6e6066ee213cfdc292877Jakob Stoklund Olesen  /// instructions.
3628e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineInstr *CloneMachineInstr(const MachineInstr *Orig);
3638e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
3648e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// DeleteMachineInstr - Delete the given MachineInstr.
3658e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  ///
3668e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void DeleteMachineInstr(MachineInstr *MI);
3678e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
3688e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// CreateMachineBasicBlock - Allocate a new MachineBasicBlock. Use this
3698e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// instead of `new MachineBasicBlock'.
3708e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  ///
3718e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  MachineBasicBlock *CreateMachineBasicBlock(const BasicBlock *bb = 0);
3728e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman
3738e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  /// DeleteMachineBasicBlock - Delete the given MachineBasicBlock.
3748e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  ///
3758e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman  void DeleteMachineBasicBlock(MachineBasicBlock *MBB);
376d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng
377c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// getMachineMemOperand - Allocate a new MachineMemOperand.
378c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// MachineMemOperands are owned by the MachineFunction and need not be
379c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// explicitly deallocated.
380da39c3964423744b4d79aebef8bece3e9141d5fcChris Lattner  MachineMemOperand *getMachineMemOperand(MachinePointerInfo PtrInfo,
381da39c3964423744b4d79aebef8bece3e9141d5fcChris Lattner                                          unsigned f, uint64_t s,
382f96e4bd2a3b11928af75fb7472288930d16fec0bDan Gohman                                          unsigned base_alignment,
38395d594cac3737ae1594a391276942a443cac426bRafael Espindola                                          const MDNode *TBAAInfo = 0,
38495d594cac3737ae1594a391276942a443cac426bRafael Espindola                                          const MDNode *Ranges = 0);
385da39c3964423744b4d79aebef8bece3e9141d5fcChris Lattner
386c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// getMachineMemOperand - Allocate a new MachineMemOperand by copying
38791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  /// an existing one, adjusting by an offset and using the given size.
388c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// MachineMemOperands are owned by the MachineFunction and need not be
389c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// explicitly deallocated.
390c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  MachineMemOperand *getMachineMemOperand(const MachineMemOperand *MMO,
391c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman                                          int64_t Offset, uint64_t Size);
392c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
393c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// allocateMemRefsArray - Allocate an array to hold MachineMemOperand
394c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  /// pointers.  This array is owned by the MachineFunction.
395c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman  MachineInstr::mmo_iterator allocateMemRefsArray(unsigned long Num);
396c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman
39791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  /// extractLoadMemRefs - Allocate an array and populate it with just the
39891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  /// load information from the given MachineMemOperand sequence.
39991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  std::pair<MachineInstr::mmo_iterator,
40091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman            MachineInstr::mmo_iterator>
40191e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    extractLoadMemRefs(MachineInstr::mmo_iterator Begin,
40291e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                       MachineInstr::mmo_iterator End);
40391e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman
40491e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  /// extractStoreMemRefs - Allocate an array and populate it with just the
40591e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  /// store information from the given MachineMemOperand sequence.
40691e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman  std::pair<MachineInstr::mmo_iterator,
40791e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman            MachineInstr::mmo_iterator>
40891e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman    extractStoreMemRefs(MachineInstr::mmo_iterator Begin,
40991e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman                        MachineInstr::mmo_iterator End);
41091e69c37153eb7d8cd149d9c2484c3115027b90fDan Gohman
411d0adbb5b7da2d1238fdf1a30734a001a0103aab0Evan Cheng  //===--------------------------------------------------------------------===//
412589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  // Label Manipulation.
413589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  //
414589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner
415589c6f620e8dcf3d59af1ae0e15372c934647c82Chris Lattner  /// getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
41607d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling  /// If isLinkerPrivate is specified, an 'l' label is returned, otherwise a
41707d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling  /// normal 'L' label is returned.
41807d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling  MCSymbol *getJTISymbol(unsigned JTI, MCContext &Ctx,
41907d317711781d8c9268f7d6afcf1ba7eadf1d127Bill Wendling                         bool isLinkerPrivate = false) const;
420142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner
421142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner  /// getPICBaseSymbol - Return a function-local symbol to represent the PIC
422142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner  /// base.
423142b531e024c7b814df74951b378b9e3e11d0d42Chris Lattner  MCSymbol *getPICBaseSymbol() const;
424f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner};
425f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner
42671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos//===--------------------------------------------------------------------===//
42771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// GraphTraits specializations for function basic block graphs (CFGs)
42871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos//===--------------------------------------------------------------------===//
42971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
43071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// Provide specializations of GraphTraits to be able to treat a
43171bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// machine function as a graph of machine basic blocks... these are
43271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// the same as the machine basic block iterators, except that the root
43371bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// node is implicitly the first node of the function.
43471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos//
43571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenostemplate <> struct GraphTraits<MachineFunction*> :
43671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  public GraphTraits<MachineBasicBlock*> {
43771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  static NodeType *getEntryNode(MachineFunction *F) {
43871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos    return &F->front();
43971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  }
44071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
44171bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
44271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  typedef MachineFunction::iterator nodes_iterator;
44371bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  static nodes_iterator nodes_begin(MachineFunction *F) { return F->begin(); }
44471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  static nodes_iterator nodes_end  (MachineFunction *F) { return F->end(); }
445e15402f92b6949d2474cc82648239fe22e5a2209Anna Zaks  static unsigned       size       (MachineFunction *F) { return F->size(); }
44671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos};
44771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenostemplate <> struct GraphTraits<const MachineFunction*> :
44871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  public GraphTraits<const MachineBasicBlock*> {
44971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  static NodeType *getEntryNode(const MachineFunction *F) {
45071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos    return &F->front();
45171bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  }
45271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
45371bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
45471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  typedef MachineFunction::const_iterator nodes_iterator;
455c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  static nodes_iterator nodes_begin(const MachineFunction *F) {
456c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif    return F->begin();
457c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  }
458c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  static nodes_iterator nodes_end  (const MachineFunction *F) {
459c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif    return F->end();
460c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif  }
461e15402f92b6949d2474cc82648239fe22e5a2209Anna Zaks  static unsigned       size       (const MachineFunction *F)  {
462e15402f92b6949d2474cc82648239fe22e5a2209Anna Zaks    return F->size();
463e15402f92b6949d2474cc82648239fe22e5a2209Anna Zaks  }
46471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos};
46571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
46671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
467ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// Provide specializations of GraphTraits to be able to treat a function as a
46871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// graph of basic blocks... and to walk it in inverse order.  Inverse order for
46971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// a function is considered to be when traversing the predecessor edges of a BB
47071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos// instead of the successor edges.
47171bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos//
47271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenostemplate <> struct GraphTraits<Inverse<MachineFunction*> > :
47371bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  public GraphTraits<Inverse<MachineBasicBlock*> > {
47471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  static NodeType *getEntryNode(Inverse<MachineFunction*> G) {
47571bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos    return &G.Graph->front();
47671bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  }
47771bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos};
47871bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenostemplate <> struct GraphTraits<Inverse<const MachineFunction*> > :
47971bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  public GraphTraits<Inverse<const MachineBasicBlock*> > {
48071bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  static NodeType *getEntryNode(Inverse<const MachineFunction *> G) {
48171bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos    return &G.Graph->front();
48271bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos  }
48371bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos};
48471bf404e9b69122c276ad7ce66f38bf1e57cafebAlkis Evlogimenos
485d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace
486d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
487f2868ce228ca20f72d1c6fbe241de01975cfe609Chris Lattner#endif
488