1a42414bcf6c04da34da107dd20c88f6f1965ad40Chris Lattner//===-- llvm/Function.h - Class to represent a single function --*- C++ -*-===// 29769ab22265b313171d201b5928688524a01bd87Misha 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. 79769ab22265b313171d201b5928688524a01bd87Misha Brukman// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 9009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 109769ab22265b313171d201b5928688524a01bd87Misha Brukman// This file contains the declaration of the Function class, which represents a 11a42414bcf6c04da34da107dd20c88f6f1965ad40Chris Lattner// single function/procedure in LLVM. 12009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 13a42414bcf6c04da34da107dd20c88f6f1965ad40Chris Lattner// A function basically consists of a list of basic blocks, a list of arguments, 14a42414bcf6c04da34da107dd20c88f6f1965ad40Chris Lattner// and a symbol table. 15009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 16009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===----------------------------------------------------------------------===// 17009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 18674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_IR_FUNCTION_H 19674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_IR_FUNCTION_H 20009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Argument.h" 220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Attributes.h" 230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/BasicBlock.h" 240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/CallingConv.h" 250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/GlobalValue.h" 265415127330d3b3ccb91cc6fef196f066563740a9Chris Lattner#include "llvm/Support/Compiler.h" 27009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 300edcc41253410eb3bdafa8e341704f4be5bef552Chris Lattnerclass FunctionType; 3112ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramerclass LLVMContext; 32009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 331f3bd7a2ee3e866d7196aca10d334777bb99f677Gabor Greif// Traits for intrusive list of basic blocks... 3418961504fc2b299578dba817900a0696cf3ccc4dChris Lattnertemplate<> struct ilist_traits<BasicBlock> 3517fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattner : public SymbolTableListTraits<BasicBlock, Function> { 3618961504fc2b299578dba817900a0696cf3ccc4dChris Lattner 37abd6f28a74e74303725ec123bdfe9202617115c8Gabor Greif // createSentinel is used to get hold of the node that marks the end of the 38abd6f28a74e74303725ec123bdfe9202617115c8Gabor Greif // list... (same trick used here as in ilist_traits<Instruction>) 39abd6f28a74e74303725ec123bdfe9202617115c8Gabor Greif BasicBlock *createSentinel() const { 401012919ed8b3e2cd4b421c104ce9d8f4e20ced9dGabor Greif return static_cast<BasicBlock*>(&Sentinel); 41abd6f28a74e74303725ec123bdfe9202617115c8Gabor Greif } 42abd6f28a74e74303725ec123bdfe9202617115c8Gabor Greif static void destroySentinel(BasicBlock*) {} 43c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif 44c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif BasicBlock *provideInitialHead() const { return createSentinel(); } 45c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif BasicBlock *ensureHead(BasicBlock*) const { return createSentinel(); } 46f3841fcbd587c31aa9842b3f33bd57de40c9f443Gabor Greif static void noteHead(BasicBlock*, BasicBlock*) {} 47c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif 4817fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattner static ValueSymbolTable *getSymTab(Function *ItemParent); 49abd6f28a74e74303725ec123bdfe9202617115c8Gabor Greifprivate: 507309be6735666143bd9835b275dc8501617a2591Gabor Greif mutable ilist_half_node<BasicBlock> Sentinel; 5118961504fc2b299578dba817900a0696cf3ccc4dChris Lattner}; 5218961504fc2b299578dba817900a0696cf3ccc4dChris Lattner 5318961504fc2b299578dba817900a0696cf3ccc4dChris Lattnertemplate<> struct ilist_traits<Argument> 5417fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattner : public SymbolTableListTraits<Argument, Function> { 5518961504fc2b299578dba817900a0696cf3ccc4dChris Lattner 565e7d4d643d691f6169eaaf60b13dc54ba2b69232Gabor Greif Argument *createSentinel() const { 571012919ed8b3e2cd4b421c104ce9d8f4e20ced9dGabor Greif return static_cast<Argument*>(&Sentinel); 585e7d4d643d691f6169eaaf60b13dc54ba2b69232Gabor Greif } 595e7d4d643d691f6169eaaf60b13dc54ba2b69232Gabor Greif static void destroySentinel(Argument*) {} 60c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif 61c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif Argument *provideInitialHead() const { return createSentinel(); } 62c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif Argument *ensureHead(Argument*) const { return createSentinel(); } 63f3841fcbd587c31aa9842b3f33bd57de40c9f443Gabor Greif static void noteHead(Argument*, Argument*) {} 64c23b8719ef9d6b1220e854b37d40e9e1c48a82bcGabor Greif 6517fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattner static ValueSymbolTable *getSymTab(Function *ItemParent); 665e7d4d643d691f6169eaaf60b13dc54ba2b69232Gabor Greifprivate: 677309be6735666143bd9835b275dc8501617a2591Gabor Greif mutable ilist_half_node<Argument> Sentinel; 6818961504fc2b299578dba817900a0696cf3ccc4dChris Lattner}; 6918961504fc2b299578dba817900a0696cf3ccc4dChris Lattner 70ad2afc2a421a0e41603d5eee412d4d8c77e9bc1cDan Gohmanclass Function : public GlobalValue, 71fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman public ilist_node<Function> { 72009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerpublic: 7318961504fc2b299578dba817900a0696cf3ccc4dChris Lattner typedef iplist<Argument> ArgumentListType; 7418961504fc2b299578dba817900a0696cf3ccc4dChris Lattner typedef iplist<BasicBlock> BasicBlockListType; 751020b3982c9eae15844c5612b0cf251917931b1dChris Lattner 761020b3982c9eae15844c5612b0cf251917931b1dChris Lattner // BasicBlock iterators... 7718961504fc2b299578dba817900a0696cf3ccc4dChris Lattner typedef BasicBlockListType::iterator iterator; 7818961504fc2b299578dba817900a0696cf3ccc4dChris Lattner typedef BasicBlockListType::const_iterator const_iterator; 791020b3982c9eae15844c5612b0cf251917931b1dChris Lattner 802427c9dfb3d76f7c71fcc7e9291464d8e6eb1cc2Chris Lattner typedef ArgumentListType::iterator arg_iterator; 812427c9dfb3d76f7c71fcc7e9291464d8e6eb1cc2Chris Lattner typedef ArgumentListType::const_iterator const_arg_iterator; 8218961504fc2b299578dba817900a0696cf3ccc4dChris Lattner 83009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerprivate: 848c310c75489a94c6e02b779ae0f611dfd3d63619Chris Lattner // Important things that make up a function! 850162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner BasicBlockListType BasicBlocks; ///< The basic blocks 860162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner mutable ArgumentListType ArgumentList; ///< The formal arguments 870162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner ValueSymbolTable *SymTab; ///< Symbol table of args/instructions 88e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling AttributeSet AttributeSets; ///< Parameter attributes 8921dbb99964f0568d2d3d3fc7e2bd5967e7577bd1Devang Patel 90cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner // HasLazyArguments is stored in Value::SubclassData. 91cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner /*bool HasLazyArguments;*/ 92f3ceaff6395afe9a62db08b483742b0416f63a1aMichael Ilseman 9318feb92e917a029b72a338e91b5b93f74d26f406Chris Lattner // The Calling Convention is stored in Value::SubclassData. 9465c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel /*CallingConv::ID CallingConvention;*/ 959769ab22265b313171d201b5928688524a01bd87Misha Brukman 9617fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattner friend class SymbolTableListTraits<Function, Module>; 9718961504fc2b299578dba817900a0696cf3ccc4dChris Lattner 98009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner void setParent(Module *parent); 99a80e1181b78183dc36ec6568559d38faa86981f0Anton Korobeynikov 1000162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner /// hasLazyArguments/CheckLazyArguments - The argument list of a function is 1010162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner /// built on demand, so that the list isn't allocated until the first client 1020162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner /// needs it. The hasLazyArguments predicate returns true if the arg list 1030162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner /// hasn't been set up yet. 1040162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner bool hasLazyArguments() const { 105cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner return getSubclassDataFromValue() & 1; 1060162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner } 1070162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner void CheckLazyArguments() const { 1080162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner if (hasLazyArguments()) 1090162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner BuildLazyArguments(); 1100162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner } 1110162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner void BuildLazyArguments() const; 1129f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper 1139f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper Function(const Function&) LLVM_DELETED_FUNCTION; 1149f9ce61972871efcf794bdc6125835c2c32cd863Craig Topper void operator=(const Function&) LLVM_DELETED_FUNCTION; 115051a950000e21935165db56695e35bade668193bGabor Greif 1164c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman /// Do the actual lookup of an intrinsic ID when the query could not be 1174c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman /// answered from the cache. 1184c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman unsigned lookupIntrinsicID() const LLVM_READONLY; 1194c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman 120a42414bcf6c04da34da107dd20c88f6f1965ad40Chris Lattner /// Function ctor - If the (optional) Module argument is specified, the 121a42414bcf6c04da34da107dd20c88f6f1965ad40Chris Lattner /// function is automatically inserted into the end of the function list for 122a42414bcf6c04da34da107dd20c88f6f1965ad40Chris Lattner /// the module. 123a42414bcf6c04da34da107dd20c88f6f1965ad40Chris Lattner /// 124db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Function(FunctionType *Ty, LinkageTypes Linkage, 1256e0d1cb30957a636c53158d3089e6fb88348a57aDaniel Dunbar const Twine &N = "", Module *M = 0); 126051a950000e21935165db56695e35bade668193bGabor Greif 127051a950000e21935165db56695e35bade668193bGabor Greifpublic: 128db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner static Function *Create(FunctionType *Ty, LinkageTypes Linkage, 1296e0d1cb30957a636c53158d3089e6fb88348a57aDaniel Dunbar const Twine &N = "", Module *M = 0) { 130051a950000e21935165db56695e35bade668193bGabor Greif return new(0) Function(Ty, Linkage, N, M); 131051a950000e21935165db56695e35bade668193bGabor Greif } 132051a950000e21935165db56695e35bade668193bGabor Greif 133afba8fe662d65b25b4baf46bb26cc18e1f9cc0a5Gordon Henriksen ~Function(); 134009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 1351afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner Type *getReturnType() const; // Return the type of the ret val 1361afcace3a3a138b1b18e5c6270caa8dae2261ae2Chris Lattner FunctionType *getFunctionType() const; // Return the FunctionType for me 137009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 138f3ceaff6395afe9a62db08b483742b0416f63a1aMichael Ilseman /// getContext - Return a pointer to the LLVMContext associated with this 13962fabf5faba70c507c8fbe298260e9b3749fdd79Owen Anderson /// function, or NULL if this function is not bound to a context yet. 140e922c0201916e0b980ab3cfe91e1413e68d55647Owen Anderson LLVMContext &getContext() const; 14162fabf5faba70c507c8fbe298260e9b3749fdd79Owen Anderson 142fe59d36c4510b9b3df6deab2fe269ef19db4d193Chris Lattner /// isVarArg - Return true if this function takes a variable number of 143fe59d36c4510b9b3df6deab2fe269ef19db4d193Chris Lattner /// arguments. 144fe59d36c4510b9b3df6deab2fe269ef19db4d193Chris Lattner bool isVarArg() const; 145fe59d36c4510b9b3df6deab2fe269ef19db4d193Chris Lattner 1464804824047a7a3b87022541eb143063fffad7ddcChris Lattner /// getIntrinsicID - This method returns the ID number of the specified 147d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke /// function, or Intrinsic::not_intrinsic if the function is not an 1484c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman /// intrinsic, or if the pointer is null. This value is always defined to be 1494804824047a7a3b87022541eb143063fffad7ddcChris Lattner /// zero to allow easy checking for whether a function is intrinsic or not. 1504804824047a7a3b87022541eb143063fffad7ddcChris Lattner /// The particular intrinsic functions which correspond to this value are 1514c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman /// defined in llvm/Intrinsics.h. Results are cached in the LLVM context, 1524c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman /// subsequent requests for the same ID return results much faster from the 1534c8e74f0b75cb10820c45c86399fbd02e4a8832aMichael Ilseman /// cache. 1544804824047a7a3b87022541eb143063fffad7ddcChris Lattner /// 15575c0d8e0d8f4e10587985b950f2c0752e45e099eDaniel Dunbar unsigned getIntrinsicID() const LLVM_READONLY; 156f846f16c92590379e900d01812e828e83b759ceeMichael Ilseman bool isIntrinsic() const { return getName().startswith("llvm."); } 1574804824047a7a3b87022541eb143063fffad7ddcChris Lattner 15865c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel /// getCallingConv()/setCallingConv(CC) - These method get and set the 1593340ffe85431f705e91aa4d4b64207f80d0d8c2fChris Lattner /// calling convention of this function. The enum values for the known 1603340ffe85431f705e91aa4d4b64207f80d0d8c2fChris Lattner /// calling conventions are defined in CallingConv.h. 16165c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel CallingConv::ID getCallingConv() const { 162cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner return static_cast<CallingConv::ID>(getSubclassDataFromValue() >> 1); 16365c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel } 16465c3c8f323198b99b88b109654194540cf9b3fa5Sandeep Patel void setCallingConv(CallingConv::ID CC) { 165cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner setValueSubclassData((getSubclassDataFromValue() & 1) | 166cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner (static_cast<unsigned>(CC) << 1)); 1670162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner } 168f3ceaff6395afe9a62db08b483742b0416f63a1aMichael Ilseman 169e940f3e6bbce1575d137df97f26e4df00a3877b7Chris Lattner /// getAttributes - Return the attribute list for this Function. 170041221c0972ff575b07f76808c504833d629ae1fChris Lattner /// 171e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling AttributeSet getAttributes() const { return AttributeSets; } 17258d74910c6b82e622ecbb57d6644d48fec5a5c0fChris Lattner 173e940f3e6bbce1575d137df97f26e4df00a3877b7Chris Lattner /// setAttributes - Set the attribute list for this Function. 174041221c0972ff575b07f76808c504833d629ae1fChris Lattner /// 175e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling void setAttributes(AttributeSet attrs) { AttributeSets = attrs; } 176dc024674ff96820d6020757b48d47f46d4c07db2Duncan Sands 177e940f3e6bbce1575d137df97f26e4df00a3877b7Chris Lattner /// addFnAttr - Add function attributes to this function. 17821dbb99964f0568d2d3d3fc7e2bd5967e7577bd1Devang Patel /// 179629fb82419d9bfff6ae475363bcce66192dfcc8eBill Wendling void addFnAttr(Attribute::AttrKind N) { 180e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling setAttributes(AttributeSets.addAttribute(getContext(), 18170d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling AttributeSet::FunctionIndex, N)); 182d9b4a5f859188cbb168c223071b413e58c53c925Devang Patel } 18321dbb99964f0568d2d3d3fc7e2bd5967e7577bd1Devang Patel 1849106f73246168fb30d26fb14085c0b3d81fcd350Reed Kotler /// addFnAttr - Add function attributes to this function. 1859106f73246168fb30d26fb14085c0b3d81fcd350Reed Kotler /// 1869106f73246168fb30d26fb14085c0b3d81fcd350Reed Kotler void addFnAttr(StringRef Kind) { 1879106f73246168fb30d26fb14085c0b3d81fcd350Reed Kotler setAttributes( 1889106f73246168fb30d26fb14085c0b3d81fcd350Reed Kotler AttributeSets.addAttribute(getContext(), 1899106f73246168fb30d26fb14085c0b3d81fcd350Reed Kotler AttributeSet::FunctionIndex, Kind)); 1909106f73246168fb30d26fb14085c0b3d81fcd350Reed Kotler } 1919106f73246168fb30d26fb14085c0b3d81fcd350Reed Kotler 1925b0a8d9ca6602ba22d20a5ed7cbf50e5f5f2b369Bill Wendling /// \brief Return true if the function has the attribute. 1935b0a8d9ca6602ba22d20a5ed7cbf50e5f5f2b369Bill Wendling bool hasFnAttribute(Attribute::AttrKind Kind) const { 1945b0a8d9ca6602ba22d20a5ed7cbf50e5f5f2b369Bill Wendling return AttributeSets.hasAttribute(AttributeSet::FunctionIndex, Kind); 1955b0a8d9ca6602ba22d20a5ed7cbf50e5f5f2b369Bill Wendling } 1965b0a8d9ca6602ba22d20a5ed7cbf50e5f5f2b369Bill Wendling bool hasFnAttribute(StringRef Kind) const { 1975b0a8d9ca6602ba22d20a5ed7cbf50e5f5f2b369Bill Wendling return AttributeSets.hasAttribute(AttributeSet::FunctionIndex, Kind); 1985b0a8d9ca6602ba22d20a5ed7cbf50e5f5f2b369Bill Wendling } 1995b0a8d9ca6602ba22d20a5ed7cbf50e5f5f2b369Bill Wendling 2005eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen /// hasGC/getGC/setGC/clearGC - The name of the garbage collection algorithm 2015eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen /// to use during code generation. 2025eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen bool hasGC() const; 2035eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen const char *getGC() const; 2045eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen void setGC(const char *Str); 2055eca075b74d62c621b160aa216b4cd50829a2cc7Gordon Henriksen void clearGC(); 20680a75bfae980df96f969f1c05b0c4a80ce975240Gordon Henriksen 20770d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling /// @brief adds the attribute to the list of attributes. 20870d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling void addAttribute(unsigned i, Attribute::AttrKind attr); 209f3ceaff6395afe9a62db08b483742b0416f63a1aMichael Ilseman 21070d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling /// @brief adds the attributes to the list of attributes. 21170d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling void addAttributes(unsigned i, AttributeSet attrs); 21270d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling 21370d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling /// @brief removes the attributes from the list of attributes. 2148246df61f6de716acf1f8c64fac3c19970a2c174Bill Wendling void removeAttributes(unsigned i, AttributeSet attr); 215cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands 21608e78b18b8ef2c939ee95469662c98e23846d860Dale Johannesen /// @brief Extract the alignment for a call or parameter (0=unknown). 217d5d94df73f2af639a4cffc7e4f3491001817df08Chris Lattner unsigned getParamAlignment(unsigned i) const { 218e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling return AttributeSets.getParamAlignment(i); 219d5d94df73f2af639a4cffc7e4f3491001817df08Chris Lattner } 22008e78b18b8ef2c939ee95469662c98e23846d860Dale Johannesen 221a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands /// @brief Determine if the function does not access memory. 222d5d94df73f2af639a4cffc7e4f3491001817df08Chris Lattner bool doesNotAccessMemory() const { 223e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling return AttributeSets.hasAttribute(AttributeSet::FunctionIndex, 224831737d329a727f53a1fb0572f7b7a8127208881Bill Wendling Attribute::ReadNone); 225d5d94df73f2af639a4cffc7e4f3491001817df08Chris Lattner } 226f5e6d70f8c8f21e744a10fd463cdeddae31cbab5Bill Wendling void setDoesNotAccessMemory() { 227034b94b17006f51722886b0f2283fb6fb19aca1fBill Wendling addFnAttr(Attribute::ReadNone); 228cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands } 229a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands 230a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands /// @brief Determine if the function does not access or only reads memory. 231d5d94df73f2af639a4cffc7e4f3491001817df08Chris Lattner bool onlyReadsMemory() const { 2326765834754cbb3cb0f15b4b15e98c5e73fa50066Bill Wendling return doesNotAccessMemory() || 233e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling AttributeSets.hasAttribute(AttributeSet::FunctionIndex, 234831737d329a727f53a1fb0572f7b7a8127208881Bill Wendling Attribute::ReadOnly); 235d5d94df73f2af639a4cffc7e4f3491001817df08Chris Lattner } 236f5e6d70f8c8f21e744a10fd463cdeddae31cbab5Bill Wendling void setOnlyReadsMemory() { 237034b94b17006f51722886b0f2283fb6fb19aca1fBill Wendling addFnAttr(Attribute::ReadOnly); 238cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands } 239cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands 240cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands /// @brief Determine if the function cannot return. 241cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands bool doesNotReturn() const { 242e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling return AttributeSets.hasAttribute(AttributeSet::FunctionIndex, 243831737d329a727f53a1fb0572f7b7a8127208881Bill Wendling Attribute::NoReturn); 244cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands } 245f5e6d70f8c8f21e744a10fd463cdeddae31cbab5Bill Wendling void setDoesNotReturn() { 246034b94b17006f51722886b0f2283fb6fb19aca1fBill Wendling addFnAttr(Attribute::NoReturn); 247cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands } 248cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands 249cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands /// @brief Determine if the function cannot unwind. 250cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands bool doesNotThrow() const { 251e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling return AttributeSets.hasAttribute(AttributeSet::FunctionIndex, 252831737d329a727f53a1fb0572f7b7a8127208881Bill Wendling Attribute::NoUnwind); 253cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands } 254f5e6d70f8c8f21e744a10fd463cdeddae31cbab5Bill Wendling void setDoesNotThrow() { 255034b94b17006f51722886b0f2283fb6fb19aca1fBill Wendling addFnAttr(Attribute::NoUnwind); 256cfa3c236b23aff80e48df11ef5833b7e63fab802Duncan Sands } 257a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands 25867ae13575900e8efd056672987249fd0adbf5e73James Molloy /// @brief Determine if the call cannot be duplicated. 25967ae13575900e8efd056672987249fd0adbf5e73James Molloy bool cannotDuplicate() const { 260e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling return AttributeSets.hasAttribute(AttributeSet::FunctionIndex, 261831737d329a727f53a1fb0572f7b7a8127208881Bill Wendling Attribute::NoDuplicate); 26267ae13575900e8efd056672987249fd0adbf5e73James Molloy } 26367ae13575900e8efd056672987249fd0adbf5e73James Molloy void setCannotDuplicate() { 26467ae13575900e8efd056672987249fd0adbf5e73James Molloy addFnAttr(Attribute::NoDuplicate); 26567ae13575900e8efd056672987249fd0adbf5e73James Molloy } 26667ae13575900e8efd056672987249fd0adbf5e73James Molloy 26752f6a4de951edf890c3988c92318b13e45fd3b85Rafael Espindola /// @brief True if the ABI mandates (or the user requested) that this 26852f6a4de951edf890c3988c92318b13e45fd3b85Rafael Espindola /// function be in a unwind table. 269fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola bool hasUWTable() const { 270e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling return AttributeSets.hasAttribute(AttributeSet::FunctionIndex, 271831737d329a727f53a1fb0572f7b7a8127208881Bill Wendling Attribute::UWTable); 272fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola } 273f5e6d70f8c8f21e744a10fd463cdeddae31cbab5Bill Wendling void setHasUWTable() { 274034b94b17006f51722886b0f2283fb6fb19aca1fBill Wendling addFnAttr(Attribute::UWTable); 275fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola } 276fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola 27752f6a4de951edf890c3988c92318b13e45fd3b85Rafael Espindola /// @brief True if this function needs an unwind table. 278fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola bool needsUnwindTableEntry() const { 279fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola return hasUWTable() || !doesNotThrow(); 280fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola } 281fc2bb8c4448fa884d79e437cc2d2627a7d7740a8Rafael Espindola 282f3ceaff6395afe9a62db08b483742b0416f63a1aMichael Ilseman /// @brief Determine if the function returns a structure through first 28341e2397b720bc5d917ef614a7a6c257e8a3c8e42Devang Patel /// pointer argument. 284d5d94df73f2af639a4cffc7e4f3491001817df08Chris Lattner bool hasStructRetAttr() const { 285e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling return AttributeSets.hasAttribute(1, Attribute::StructRet); 286d5d94df73f2af639a4cffc7e4f3491001817df08Chris Lattner } 2874746ecf16eeb5ff920672fdff1c0dd85594437edReid Spencer 28830b64129f5bf03521665115023c9a360a4e67218Nick Lewycky /// @brief Determine if the parameter does not alias other parameters. 28930b64129f5bf03521665115023c9a360a4e67218Nick Lewycky /// @param n The parameter to check. 1 is the first parameter, 0 is the return 29030b64129f5bf03521665115023c9a360a4e67218Nick Lewycky bool doesNotAlias(unsigned n) const { 291e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling return AttributeSets.hasAttribute(n, Attribute::NoAlias); 29230b64129f5bf03521665115023c9a360a4e67218Nick Lewycky } 29311d00420e42ba88c3b48cab997965a7be79315e2Bill Wendling void setDoesNotAlias(unsigned n) { 29470d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling addAttribute(n, Attribute::NoAlias); 29530b64129f5bf03521665115023c9a360a4e67218Nick Lewycky } 29630b64129f5bf03521665115023c9a360a4e67218Nick Lewycky 29730b64129f5bf03521665115023c9a360a4e67218Nick Lewycky /// @brief Determine if the parameter can be captured. 29830b64129f5bf03521665115023c9a360a4e67218Nick Lewycky /// @param n The parameter to check. 1 is the first parameter, 0 is the return 29930b64129f5bf03521665115023c9a360a4e67218Nick Lewycky bool doesNotCapture(unsigned n) const { 300e3db2048ea2ce2743acce76a6bb22214a197c364Bill Wendling return AttributeSets.hasAttribute(n, Attribute::NoCapture); 30130b64129f5bf03521665115023c9a360a4e67218Nick Lewycky } 30211d00420e42ba88c3b48cab997965a7be79315e2Bill Wendling void setDoesNotCapture(unsigned n) { 30370d2ca0725b05a2d372e4dc3336e8ea350093e98Bill Wendling addAttribute(n, Attribute::NoCapture); 30430b64129f5bf03521665115023c9a360a4e67218Nick Lewycky } 30530b64129f5bf03521665115023c9a360a4e67218Nick Lewycky 30628c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands /// copyAttributesFrom - copy all additional attributes (those not needed to 30728c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands /// create a Function) from the Function Src to this one. 30828c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands void copyAttributesFrom(const GlobalValue *Src); 30928c3cff8250b3fe2adc6479306fe7dbdb48a1bdbDuncan Sands 3100c448e58d346201d91767ee27423931101132c9dChris Lattner /// deleteBody - This method deletes the body of the function, and converts 3110c448e58d346201d91767ee27423931101132c9dChris Lattner /// the linkage to external. 31258ae9c7290ff7a639a55784f2362f1e52626c2eeMisha Brukman /// 3130c448e58d346201d91767ee27423931101132c9dChris Lattner void deleteBody() { 3140c448e58d346201d91767ee27423931101132c9dChris Lattner dropAllReferences(); 3150c448e58d346201d91767ee27423931101132c9dChris Lattner setLinkage(ExternalLinkage); 3160c448e58d346201d91767ee27423931101132c9dChris Lattner } 3170c448e58d346201d91767ee27423931101132c9dChris Lattner 318b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner /// removeFromParent - This method unlinks 'this' from the containing module, 319b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner /// but does not delete it. 320b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner /// 32171c8c175fb2a477b90efe745aaf48ed9265300a9Daniel Dunbar virtual void removeFromParent(); 322b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner 323b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner /// eraseFromParent - This method unlinks 'this' from the containing module 324b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner /// and deletes it. 325b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner /// 32671c8c175fb2a477b90efe745aaf48ed9265300a9Daniel Dunbar virtual void eraseFromParent(); 327b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner 328b92f50fe6091a7a12f54f9884529b1127b1a14e5Chris Lattner 329fbe3ecdb2cabae81525db3ad8d2d88d584b73fb2Chris Lattner /// Get the underlying elements of the Function... the basic block list is 330fbe3ecdb2cabae81525db3ad8d2d88d584b73fb2Chris Lattner /// empty for external functions. 33126199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 3320162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner const ArgumentListType &getArgumentList() const { 3330162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner CheckLazyArguments(); 3340162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner return ArgumentList; 3350162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner } 3360162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner ArgumentListType &getArgumentList() { 3370162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner CheckLazyArguments(); 3380162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner return ArgumentList; 3390162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner } 340b547a181005cc255fa57c61c1c0dbafca5375fb4Gabor Greif static iplist<Argument> Function::*getSublistAccess(Argument*) { 341b547a181005cc255fa57c61c1c0dbafca5375fb4Gabor Greif return &Function::ArgumentList; 342b547a181005cc255fa57c61c1c0dbafca5375fb4Gabor Greif } 3431020b3982c9eae15844c5612b0cf251917931b1dChris Lattner 34418961504fc2b299578dba817900a0696cf3ccc4dChris Lattner const BasicBlockListType &getBasicBlockList() const { return BasicBlocks; } 34518961504fc2b299578dba817900a0696cf3ccc4dChris Lattner BasicBlockListType &getBasicBlockList() { return BasicBlocks; } 346b547a181005cc255fa57c61c1c0dbafca5375fb4Gabor Greif static iplist<BasicBlock> Function::*getSublistAccess(BasicBlock*) { 347b547a181005cc255fa57c61c1c0dbafca5375fb4Gabor Greif return &Function::BasicBlocks; 348b547a181005cc255fa57c61c1c0dbafca5375fb4Gabor Greif } 349009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 350894707117e718b38cdd5fbbf7b2d2ccfcbafe98bChris Lattner const BasicBlock &getEntryBlock() const { return front(); } 351894707117e718b38cdd5fbbf7b2d2ccfcbafe98bChris Lattner BasicBlock &getEntryBlock() { return front(); } 3528c310c75489a94c6e02b779ae0f611dfd3d63619Chris Lattner 3538c310c75489a94c6e02b779ae0f611dfd3d63619Chris Lattner //===--------------------------------------------------------------------===// 3548c310c75489a94c6e02b779ae0f611dfd3d63619Chris Lattner // Symbol Table Accessing functions... 3558c310c75489a94c6e02b779ae0f611dfd3d63619Chris Lattner 3562c08dcc276e218193beffbddf2a30f4d88e8af58Chris Lattner /// getSymbolTable() - Return the symbol table... 35726199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 358ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer inline ValueSymbolTable &getValueSymbolTable() { return *SymTab; } 359ef9b9a793949469cdaa4ab6d0173136229dcab7bReid Spencer inline const ValueSymbolTable &getValueSymbolTable() const { return *SymTab; } 3608c310c75489a94c6e02b779ae0f611dfd3d63619Chris Lattner 3619769ab22265b313171d201b5928688524a01bd87Misha Brukman 3621020b3982c9eae15844c5612b0cf251917931b1dChris Lattner //===--------------------------------------------------------------------===// 3631020b3982c9eae15844c5612b0cf251917931b1dChris Lattner // BasicBlock iterator forwarding functions 3641020b3982c9eae15844c5612b0cf251917931b1dChris Lattner // 36518961504fc2b299578dba817900a0696cf3ccc4dChris Lattner iterator begin() { return BasicBlocks.begin(); } 36618961504fc2b299578dba817900a0696cf3ccc4dChris Lattner const_iterator begin() const { return BasicBlocks.begin(); } 36718961504fc2b299578dba817900a0696cf3ccc4dChris Lattner iterator end () { return BasicBlocks.end(); } 36818961504fc2b299578dba817900a0696cf3ccc4dChris Lattner const_iterator end () const { return BasicBlocks.end(); } 36918961504fc2b299578dba817900a0696cf3ccc4dChris Lattner 370c063502e326fe0206942192773b263a3d88d93f5Chris Lattner size_t size() const { return BasicBlocks.size(); } 37118961504fc2b299578dba817900a0696cf3ccc4dChris Lattner bool empty() const { return BasicBlocks.empty(); } 37218961504fc2b299578dba817900a0696cf3ccc4dChris Lattner const BasicBlock &front() const { return BasicBlocks.front(); } 37318961504fc2b299578dba817900a0696cf3ccc4dChris Lattner BasicBlock &front() { return BasicBlocks.front(); } 3747e302d2f5f6c9b53d0c5017ac3325420b1c8e3d9Misha Brukman const BasicBlock &back() const { return BasicBlocks.back(); } 3757e302d2f5f6c9b53d0c5017ac3325420b1c8e3d9Misha Brukman BasicBlock &back() { return BasicBlocks.back(); } 37618961504fc2b299578dba817900a0696cf3ccc4dChris Lattner 37718961504fc2b299578dba817900a0696cf3ccc4dChris Lattner //===--------------------------------------------------------------------===// 37818961504fc2b299578dba817900a0696cf3ccc4dChris Lattner // Argument iterator forwarding functions 37918961504fc2b299578dba817900a0696cf3ccc4dChris Lattner // 3800162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner arg_iterator arg_begin() { 3810162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner CheckLazyArguments(); 3820162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner return ArgumentList.begin(); 3830162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner } 3840162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner const_arg_iterator arg_begin() const { 3850162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner CheckLazyArguments(); 3860162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner return ArgumentList.begin(); 3870162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner } 3880162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner arg_iterator arg_end() { 3890162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner CheckLazyArguments(); 3900162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner return ArgumentList.end(); 3910162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner } 3920162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner const_arg_iterator arg_end() const { 3930162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner CheckLazyArguments(); 3940162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner return ArgumentList.end(); 3950162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner } 3962427c9dfb3d76f7c71fcc7e9291464d8e6eb1cc2Chris Lattner 3970162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner size_t arg_size() const; 3980162c1815e5a1b33750d313c49f707bc446ea946Chris Lattner bool arg_empty() const; 3992427c9dfb3d76f7c71fcc7e9291464d8e6eb1cc2Chris Lattner 400c149c47d1f98afe504ad69c3456a4de6803015efChris Lattner /// viewCFG - This function is meant for use from the debugger. You can just 401c149c47d1f98afe504ad69c3456a4de6803015efChris Lattner /// say 'call F->viewCFG()' and a ghostview window should pop up from the 402c149c47d1f98afe504ad69c3456a4de6803015efChris Lattner /// program, displaying the CFG of the current function with the code for each 403c149c47d1f98afe504ad69c3456a4de6803015efChris Lattner /// basic block inside. This depends on there being a 'dot' and 'gv' program 404c149c47d1f98afe504ad69c3456a4de6803015efChris Lattner /// in your path. 405c149c47d1f98afe504ad69c3456a4de6803015efChris Lattner /// 406c149c47d1f98afe504ad69c3456a4de6803015efChris Lattner void viewCFG() const; 4079769ab22265b313171d201b5928688524a01bd87Misha Brukman 408c149c47d1f98afe504ad69c3456a4de6803015efChris Lattner /// viewCFGOnly - This function is meant for use from the debugger. It works 409c149c47d1f98afe504ad69c3456a4de6803015efChris Lattner /// just like viewCFG, but it does not include the contents of basic blocks 41058ae9c7290ff7a639a55784f2362f1e52626c2eeMisha Brukman /// into the nodes, just the label. If you are only interested in the CFG 41158ae9c7290ff7a639a55784f2362f1e52626c2eeMisha Brukman /// this can make the graph smaller. 412c149c47d1f98afe504ad69c3456a4de6803015efChris Lattner /// 413c149c47d1f98afe504ad69c3456a4de6803015efChris Lattner void viewCFGOnly() const; 414c149c47d1f98afe504ad69c3456a4de6803015efChris Lattner 41526199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// Methods for support type inquiry through isa, cast, and dyn_cast: 416b00c582b6d40e6b9ff2d1ed4f5eaf7930e792aceChris Lattner static inline bool classof(const Value *V) { 417a1a702cdd23221e6e3f36632be91150138958e9dDan Gohman return V->getValueID() == Value::FunctionVal; 4189636a91649f168f41b477cba705287665e054f79Chris Lattner } 419009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 4200c448e58d346201d91767ee27423931101132c9dChris Lattner /// dropAllReferences() - This method causes all the subinstructions to "let 42126199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// go" of all references that they are maintaining. This allows one to 4220c448e58d346201d91767ee27423931101132c9dChris Lattner /// 'delete' a whole module at a time, even though there may be circular 42326199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// references... first all references are dropped, and all use counts go to 42458ae9c7290ff7a639a55784f2362f1e52626c2eeMisha Brukman /// zero. Then everything is deleted for real. Note that no operations are 4259769ab22265b313171d201b5928688524a01bd87Misha Brukman /// valid on an object that has "dropped all references", except operator 42626199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// delete. 42726199059268a05739c84ebf465fcdbf7ded861dfChris Lattner /// 4280c448e58d346201d91767ee27423931101132c9dChris Lattner /// Since no other object in the module can have references into the body of a 4290c448e58d346201d91767ee27423931101132c9dChris Lattner /// function, dropping all references deletes the entire body of the function, 4300c448e58d346201d91767ee27423931101132c9dChris Lattner /// including any contained basic blocks. 4310c448e58d346201d91767ee27423931101132c9dChris Lattner /// 432009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner void dropAllReferences(); 433757068f3bad425fb126fe16ab7b8a82a636e6bbdJay Foad 434757068f3bad425fb126fe16ab7b8a82a636e6bbdJay Foad /// hasAddressTaken - returns true if there are any uses of this function 435b7454fd9df0b477e3daf2fce6e1d5e1b241562dfJay Foad /// other than direct calls or invokes to it, or blockaddress expressions. 436b7454fd9df0b477e3daf2fce6e1d5e1b241562dfJay Foad /// Optionally passes back an offending user for diagnostic purposes. 437c9f7500d1752feac7cece26d20007a99d21f677cGabor Greif /// 438c9f7500d1752feac7cece26d20007a99d21f677cGabor Greif bool hasAddressTaken(const User** = 0) const; 439c9f7500d1752feac7cece26d20007a99d21f677cGabor Greif 440c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman /// isDefTriviallyDead - Return true if it is trivially safe to remove 441c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman /// this function definition from the module (because it isn't externally 442c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman /// visible, does not have its address taken, and has no callers). To make 443c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman /// this more accurate, call removeDeadConstantUsers first. 444c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman bool isDefTriviallyDead() const; 445c66330504c3f433430a28cd7f7f981e555c51bceEli Friedman 4463c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendling /// callsFunctionThatReturnsTwice - Return true if the function has a call to 4473c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendling /// setjmp or other function that gcc recognizes as "returning twice". 4483c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendling bool callsFunctionThatReturnsTwice() const; 4493c5e60994f53eef2808a33b5ca6c3dffc2168054Bill Wendling 450cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattnerprivate: 451cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner // Shadow Value::setValueSubclassData with a private forwarding method so that 452cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner // subclasses cannot accidentally use it. 453cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner void setValueSubclassData(unsigned short D) { 454cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner Value::setValueSubclassData(D); 455cafe9bba32aeed16e8e3db28b4cd4ff13160438fChris Lattner } 4563ff4387113d7e74a8aa73f80c3518cb95f09a64bChris Lattner}; 4573ff4387113d7e74a8aa73f80c3518cb95f09a64bChris Lattner 45817fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattnerinline ValueSymbolTable * 45917fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattnerilist_traits<BasicBlock>::getSymTab(Function *F) { 46017fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattner return F ? &F->getValueSymbolTable() : 0; 46117fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattner} 46217fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattner 46317fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattnerinline ValueSymbolTable * 46417fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattnerilist_traits<Argument>::getSymTab(Function *F) { 46517fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattner return F ? &F->getValueSymbolTable() : 0; 46617fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattner} 46717fcdd5e1b78b829068ca657c97357a39d6e768bChris Lattner 468d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 469d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 470009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#endif 471