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