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