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