1*9880d681SAndroid Build Coastguard Worker //===-- llvm/Function.h - Class to represent a single function --*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file contains the declaration of the Function class, which represents a 11*9880d681SAndroid Build Coastguard Worker // single function/procedure in LLVM. 12*9880d681SAndroid Build Coastguard Worker // 13*9880d681SAndroid Build Coastguard Worker // A function basically consists of a list of basic blocks, a list of arguments, 14*9880d681SAndroid Build Coastguard Worker // and a symbol table. 15*9880d681SAndroid Build Coastguard Worker // 16*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_IR_FUNCTION_H 19*9880d681SAndroid Build Coastguard Worker #define LLVM_IR_FUNCTION_H 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/iterator_range.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Argument.h" 23*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Attributes.h" 24*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/BasicBlock.h" 25*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/CallingConv.h" 26*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/GlobalObject.h" 27*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/OperandTraits.h" 28*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Compiler.h" 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker namespace llvm { 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker template <typename T> class Optional; 33*9880d681SAndroid Build Coastguard Worker class FunctionType; 34*9880d681SAndroid Build Coastguard Worker class LLVMContext; 35*9880d681SAndroid Build Coastguard Worker class DISubprogram; 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker template <> 38*9880d681SAndroid Build Coastguard Worker struct SymbolTableListSentinelTraits<Argument> 39*9880d681SAndroid Build Coastguard Worker : public ilist_half_embedded_sentinel_traits<Argument> {}; 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker class Function : public GlobalObject, public ilist_node<Function> { 42*9880d681SAndroid Build Coastguard Worker public: 43*9880d681SAndroid Build Coastguard Worker typedef SymbolTableList<Argument> ArgumentListType; 44*9880d681SAndroid Build Coastguard Worker typedef SymbolTableList<BasicBlock> BasicBlockListType; 45*9880d681SAndroid Build Coastguard Worker 46*9880d681SAndroid Build Coastguard Worker // BasicBlock iterators... 47*9880d681SAndroid Build Coastguard Worker typedef BasicBlockListType::iterator iterator; 48*9880d681SAndroid Build Coastguard Worker typedef BasicBlockListType::const_iterator const_iterator; 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Worker typedef ArgumentListType::iterator arg_iterator; 51*9880d681SAndroid Build Coastguard Worker typedef ArgumentListType::const_iterator const_arg_iterator; 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Worker private: 54*9880d681SAndroid Build Coastguard Worker // Important things that make up a function! 55*9880d681SAndroid Build Coastguard Worker BasicBlockListType BasicBlocks; ///< The basic blocks 56*9880d681SAndroid Build Coastguard Worker mutable ArgumentListType ArgumentList; ///< The formal arguments 57*9880d681SAndroid Build Coastguard Worker ValueSymbolTable *SymTab; ///< Symbol table of args/instructions 58*9880d681SAndroid Build Coastguard Worker AttributeSet AttributeSets; ///< Parameter attributes 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker /* 61*9880d681SAndroid Build Coastguard Worker * Value::SubclassData 62*9880d681SAndroid Build Coastguard Worker * 63*9880d681SAndroid Build Coastguard Worker * bit 0 : HasLazyArguments 64*9880d681SAndroid Build Coastguard Worker * bit 1 : HasPrefixData 65*9880d681SAndroid Build Coastguard Worker * bit 2 : HasPrologueData 66*9880d681SAndroid Build Coastguard Worker * bit 3 : HasPersonalityFn 67*9880d681SAndroid Build Coastguard Worker * bits 4-13 : CallingConvention 68*9880d681SAndroid Build Coastguard Worker * bits 14 : HasGC 69*9880d681SAndroid Build Coastguard Worker * bits 15 : [reserved] 70*9880d681SAndroid Build Coastguard Worker */ 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker /// Bits from GlobalObject::GlobalObjectSubclassData. 73*9880d681SAndroid Build Coastguard Worker enum { 74*9880d681SAndroid Build Coastguard Worker /// Whether this function is materializable. 75*9880d681SAndroid Build Coastguard Worker IsMaterializableBit = 0, 76*9880d681SAndroid Build Coastguard Worker }; 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker friend class SymbolTableListTraits<Function>; 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker void setParent(Module *parent); 81*9880d681SAndroid Build Coastguard Worker 82*9880d681SAndroid Build Coastguard Worker /// hasLazyArguments/CheckLazyArguments - The argument list of a function is 83*9880d681SAndroid Build Coastguard Worker /// built on demand, so that the list isn't allocated until the first client 84*9880d681SAndroid Build Coastguard Worker /// needs it. The hasLazyArguments predicate returns true if the arg list 85*9880d681SAndroid Build Coastguard Worker /// hasn't been set up yet. 86*9880d681SAndroid Build Coastguard Worker public: 87*9880d681SAndroid Build Coastguard Worker bool hasLazyArguments() const { 88*9880d681SAndroid Build Coastguard Worker return getSubclassDataFromValue() & (1<<0); 89*9880d681SAndroid Build Coastguard Worker } 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker private: 92*9880d681SAndroid Build Coastguard Worker void CheckLazyArguments() const { 93*9880d681SAndroid Build Coastguard Worker if (hasLazyArguments()) 94*9880d681SAndroid Build Coastguard Worker BuildLazyArguments(); 95*9880d681SAndroid Build Coastguard Worker } 96*9880d681SAndroid Build Coastguard Worker void BuildLazyArguments() const; 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker Function(const Function&) = delete; 99*9880d681SAndroid Build Coastguard Worker void operator=(const Function&) = delete; 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker /// Function ctor - If the (optional) Module argument is specified, the 102*9880d681SAndroid Build Coastguard Worker /// function is automatically inserted into the end of the function list for 103*9880d681SAndroid Build Coastguard Worker /// the module. 104*9880d681SAndroid Build Coastguard Worker /// 105*9880d681SAndroid Build Coastguard Worker Function(FunctionType *Ty, LinkageTypes Linkage, 106*9880d681SAndroid Build Coastguard Worker const Twine &N = "", Module *M = nullptr); 107*9880d681SAndroid Build Coastguard Worker 108*9880d681SAndroid Build Coastguard Worker public: 109*9880d681SAndroid Build Coastguard Worker static Function *Create(FunctionType *Ty, LinkageTypes Linkage, 110*9880d681SAndroid Build Coastguard Worker const Twine &N = "", Module *M = nullptr) { 111*9880d681SAndroid Build Coastguard Worker return new Function(Ty, Linkage, N, M); 112*9880d681SAndroid Build Coastguard Worker } 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker ~Function() override; 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker /// \brief Provide fast operand accessors 117*9880d681SAndroid Build Coastguard Worker DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value); 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker Type *getReturnType() const; // Return the type of the ret val 120*9880d681SAndroid Build Coastguard Worker FunctionType *getFunctionType() const; // Return the FunctionType for me 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker /// getContext - Return a reference to the LLVMContext associated with this 123*9880d681SAndroid Build Coastguard Worker /// function. 124*9880d681SAndroid Build Coastguard Worker LLVMContext &getContext() const; 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker /// isVarArg - Return true if this function takes a variable number of 127*9880d681SAndroid Build Coastguard Worker /// arguments. 128*9880d681SAndroid Build Coastguard Worker bool isVarArg() const; 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker bool isMaterializable() const; 131*9880d681SAndroid Build Coastguard Worker void setIsMaterializable(bool V); 132*9880d681SAndroid Build Coastguard Worker 133*9880d681SAndroid Build Coastguard Worker /// getIntrinsicID - This method returns the ID number of the specified 134*9880d681SAndroid Build Coastguard Worker /// function, or Intrinsic::not_intrinsic if the function is not an 135*9880d681SAndroid Build Coastguard Worker /// intrinsic, or if the pointer is null. This value is always defined to be 136*9880d681SAndroid Build Coastguard Worker /// zero to allow easy checking for whether a function is intrinsic or not. 137*9880d681SAndroid Build Coastguard Worker /// The particular intrinsic functions which correspond to this value are 138*9880d681SAndroid Build Coastguard Worker /// defined in llvm/Intrinsics.h. 139*9880d681SAndroid Build Coastguard Worker Intrinsic::ID getIntrinsicID() const LLVM_READONLY { return IntID; } 140*9880d681SAndroid Build Coastguard Worker bool isIntrinsic() const { return getName().startswith("llvm."); } 141*9880d681SAndroid Build Coastguard Worker 142*9880d681SAndroid Build Coastguard Worker /// \brief Recalculate the ID for this function if it is an Intrinsic defined 143*9880d681SAndroid Build Coastguard Worker /// in llvm/Intrinsics.h. Sets the intrinsic ID to Intrinsic::not_intrinsic 144*9880d681SAndroid Build Coastguard Worker /// if the name of this function does not match an intrinsic in that header. 145*9880d681SAndroid Build Coastguard Worker /// Note, this method does not need to be called directly, as it is called 146*9880d681SAndroid Build Coastguard Worker /// from Value::setName() whenever the name of this function changes. 147*9880d681SAndroid Build Coastguard Worker void recalculateIntrinsicID(); 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker /// getCallingConv()/setCallingConv(CC) - These method get and set the 150*9880d681SAndroid Build Coastguard Worker /// calling convention of this function. The enum values for the known 151*9880d681SAndroid Build Coastguard Worker /// calling conventions are defined in CallingConv.h. 152*9880d681SAndroid Build Coastguard Worker CallingConv::ID getCallingConv() const { 153*9880d681SAndroid Build Coastguard Worker return static_cast<CallingConv::ID>((getSubclassDataFromValue() >> 4) & 154*9880d681SAndroid Build Coastguard Worker CallingConv::MaxID); 155*9880d681SAndroid Build Coastguard Worker } 156*9880d681SAndroid Build Coastguard Worker void setCallingConv(CallingConv::ID CC) { 157*9880d681SAndroid Build Coastguard Worker auto ID = static_cast<unsigned>(CC); 158*9880d681SAndroid Build Coastguard Worker assert(!(ID & ~CallingConv::MaxID) && "Unsupported calling convention"); 159*9880d681SAndroid Build Coastguard Worker setValueSubclassData((getSubclassDataFromValue() & 0xc00f) | (ID << 4)); 160*9880d681SAndroid Build Coastguard Worker } 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker /// @brief Return the attribute list for this Function. 163*9880d681SAndroid Build Coastguard Worker AttributeSet getAttributes() const { return AttributeSets; } 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker /// @brief Set the attribute list for this Function. 166*9880d681SAndroid Build Coastguard Worker void setAttributes(AttributeSet Attrs) { AttributeSets = Attrs; } 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker /// @brief Add function attributes to this function. 169*9880d681SAndroid Build Coastguard Worker void addFnAttr(Attribute::AttrKind N) { 170*9880d681SAndroid Build Coastguard Worker setAttributes(AttributeSets.addAttribute(getContext(), 171*9880d681SAndroid Build Coastguard Worker AttributeSet::FunctionIndex, N)); 172*9880d681SAndroid Build Coastguard Worker } 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Worker /// @brief Remove function attributes from this function. 175*9880d681SAndroid Build Coastguard Worker void removeFnAttr(Attribute::AttrKind Kind) { 176*9880d681SAndroid Build Coastguard Worker setAttributes(AttributeSets.removeAttribute( 177*9880d681SAndroid Build Coastguard Worker getContext(), AttributeSet::FunctionIndex, Kind)); 178*9880d681SAndroid Build Coastguard Worker } 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Worker /// @brief Add function attributes to this function. 181*9880d681SAndroid Build Coastguard Worker void addFnAttr(StringRef Kind) { 182*9880d681SAndroid Build Coastguard Worker setAttributes( 183*9880d681SAndroid Build Coastguard Worker AttributeSets.addAttribute(getContext(), 184*9880d681SAndroid Build Coastguard Worker AttributeSet::FunctionIndex, Kind)); 185*9880d681SAndroid Build Coastguard Worker } 186*9880d681SAndroid Build Coastguard Worker void addFnAttr(StringRef Kind, StringRef Value) { 187*9880d681SAndroid Build Coastguard Worker setAttributes( 188*9880d681SAndroid Build Coastguard Worker AttributeSets.addAttribute(getContext(), 189*9880d681SAndroid Build Coastguard Worker AttributeSet::FunctionIndex, Kind, Value)); 190*9880d681SAndroid Build Coastguard Worker } 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker /// Set the entry count for this function. 193*9880d681SAndroid Build Coastguard Worker void setEntryCount(uint64_t Count); 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Worker /// Get the entry count for this function. 196*9880d681SAndroid Build Coastguard Worker Optional<uint64_t> getEntryCount() const; 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker /// @brief Return true if the function has the attribute. 199*9880d681SAndroid Build Coastguard Worker bool hasFnAttribute(Attribute::AttrKind Kind) const { 200*9880d681SAndroid Build Coastguard Worker return AttributeSets.hasFnAttribute(Kind); 201*9880d681SAndroid Build Coastguard Worker } 202*9880d681SAndroid Build Coastguard Worker bool hasFnAttribute(StringRef Kind) const { 203*9880d681SAndroid Build Coastguard Worker return AttributeSets.hasAttribute(AttributeSet::FunctionIndex, Kind); 204*9880d681SAndroid Build Coastguard Worker } 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker /// @brief Return the attribute for the given attribute kind. 207*9880d681SAndroid Build Coastguard Worker Attribute getFnAttribute(Attribute::AttrKind Kind) const { 208*9880d681SAndroid Build Coastguard Worker return getAttribute(AttributeSet::FunctionIndex, Kind); 209*9880d681SAndroid Build Coastguard Worker } 210*9880d681SAndroid Build Coastguard Worker Attribute getFnAttribute(StringRef Kind) const { 211*9880d681SAndroid Build Coastguard Worker return getAttribute(AttributeSet::FunctionIndex, Kind); 212*9880d681SAndroid Build Coastguard Worker } 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Worker /// \brief Return the stack alignment for the function. 215*9880d681SAndroid Build Coastguard Worker unsigned getFnStackAlignment() const { 216*9880d681SAndroid Build Coastguard Worker if (!hasFnAttribute(Attribute::StackAlignment)) 217*9880d681SAndroid Build Coastguard Worker return 0; 218*9880d681SAndroid Build Coastguard Worker return AttributeSets.getStackAlignment(AttributeSet::FunctionIndex); 219*9880d681SAndroid Build Coastguard Worker } 220*9880d681SAndroid Build Coastguard Worker 221*9880d681SAndroid Build Coastguard Worker /// hasGC/getGC/setGC/clearGC - The name of the garbage collection algorithm 222*9880d681SAndroid Build Coastguard Worker /// to use during code generation. 223*9880d681SAndroid Build Coastguard Worker bool hasGC() const { 224*9880d681SAndroid Build Coastguard Worker return getSubclassDataFromValue() & (1<<14); 225*9880d681SAndroid Build Coastguard Worker } 226*9880d681SAndroid Build Coastguard Worker const std::string &getGC() const; 227*9880d681SAndroid Build Coastguard Worker void setGC(std::string Str); 228*9880d681SAndroid Build Coastguard Worker void clearGC(); 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker /// @brief adds the attribute to the list of attributes. 231*9880d681SAndroid Build Coastguard Worker void addAttribute(unsigned i, Attribute::AttrKind Kind); 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Worker /// @brief adds the attribute to the list of attributes. 234*9880d681SAndroid Build Coastguard Worker void addAttribute(unsigned i, Attribute Attr); 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker /// @brief adds the attributes to the list of attributes. 237*9880d681SAndroid Build Coastguard Worker void addAttributes(unsigned i, AttributeSet Attrs); 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Worker /// @brief removes the attribute from the list of attributes. 240*9880d681SAndroid Build Coastguard Worker void removeAttribute(unsigned i, Attribute::AttrKind Kind); 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Worker /// @brief removes the attribute from the list of attributes. 243*9880d681SAndroid Build Coastguard Worker void removeAttribute(unsigned i, StringRef Kind); 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker /// @brief removes the attributes from the list of attributes. 246*9880d681SAndroid Build Coastguard Worker void removeAttributes(unsigned i, AttributeSet Attrs); 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Worker /// @brief check if an attributes is in the list of attributes. 249*9880d681SAndroid Build Coastguard Worker bool hasAttribute(unsigned i, Attribute::AttrKind Kind) const { 250*9880d681SAndroid Build Coastguard Worker return getAttributes().hasAttribute(i, Kind); 251*9880d681SAndroid Build Coastguard Worker } 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Worker Attribute getAttribute(unsigned i, Attribute::AttrKind Kind) const { 254*9880d681SAndroid Build Coastguard Worker return AttributeSets.getAttribute(i, Kind); 255*9880d681SAndroid Build Coastguard Worker } 256*9880d681SAndroid Build Coastguard Worker 257*9880d681SAndroid Build Coastguard Worker Attribute getAttribute(unsigned i, StringRef Kind) const { 258*9880d681SAndroid Build Coastguard Worker return AttributeSets.getAttribute(i, Kind); 259*9880d681SAndroid Build Coastguard Worker } 260*9880d681SAndroid Build Coastguard Worker 261*9880d681SAndroid Build Coastguard Worker /// @brief adds the dereferenceable attribute to the list of attributes. 262*9880d681SAndroid Build Coastguard Worker void addDereferenceableAttr(unsigned i, uint64_t Bytes); 263*9880d681SAndroid Build Coastguard Worker 264*9880d681SAndroid Build Coastguard Worker /// @brief adds the dereferenceable_or_null attribute to the list of 265*9880d681SAndroid Build Coastguard Worker /// attributes. 266*9880d681SAndroid Build Coastguard Worker void addDereferenceableOrNullAttr(unsigned i, uint64_t Bytes); 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Worker /// @brief Extract the alignment for a call or parameter (0=unknown). 269*9880d681SAndroid Build Coastguard Worker unsigned getParamAlignment(unsigned i) const { 270*9880d681SAndroid Build Coastguard Worker return AttributeSets.getParamAlignment(i); 271*9880d681SAndroid Build Coastguard Worker } 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Worker /// @brief Extract the number of dereferenceable bytes for a call or 274*9880d681SAndroid Build Coastguard Worker /// parameter (0=unknown). 275*9880d681SAndroid Build Coastguard Worker uint64_t getDereferenceableBytes(unsigned i) const { 276*9880d681SAndroid Build Coastguard Worker return AttributeSets.getDereferenceableBytes(i); 277*9880d681SAndroid Build Coastguard Worker } 278*9880d681SAndroid Build Coastguard Worker 279*9880d681SAndroid Build Coastguard Worker /// @brief Extract the number of dereferenceable_or_null bytes for a call or 280*9880d681SAndroid Build Coastguard Worker /// parameter (0=unknown). 281*9880d681SAndroid Build Coastguard Worker uint64_t getDereferenceableOrNullBytes(unsigned i) const { 282*9880d681SAndroid Build Coastguard Worker return AttributeSets.getDereferenceableOrNullBytes(i); 283*9880d681SAndroid Build Coastguard Worker } 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Worker /// @brief Determine if the function does not access memory. 286*9880d681SAndroid Build Coastguard Worker bool doesNotAccessMemory() const { 287*9880d681SAndroid Build Coastguard Worker return hasFnAttribute(Attribute::ReadNone); 288*9880d681SAndroid Build Coastguard Worker } 289*9880d681SAndroid Build Coastguard Worker void setDoesNotAccessMemory() { 290*9880d681SAndroid Build Coastguard Worker addFnAttr(Attribute::ReadNone); 291*9880d681SAndroid Build Coastguard Worker } 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Worker /// @brief Determine if the function does not access or only reads memory. 294*9880d681SAndroid Build Coastguard Worker bool onlyReadsMemory() const { 295*9880d681SAndroid Build Coastguard Worker return doesNotAccessMemory() || hasFnAttribute(Attribute::ReadOnly); 296*9880d681SAndroid Build Coastguard Worker } 297*9880d681SAndroid Build Coastguard Worker void setOnlyReadsMemory() { 298*9880d681SAndroid Build Coastguard Worker addFnAttr(Attribute::ReadOnly); 299*9880d681SAndroid Build Coastguard Worker } 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Worker /// @brief Determine if the function does not access or only writes memory. 302*9880d681SAndroid Build Coastguard Worker bool doesNotReadMemory() const { 303*9880d681SAndroid Build Coastguard Worker return doesNotAccessMemory() || hasFnAttribute(Attribute::WriteOnly); 304*9880d681SAndroid Build Coastguard Worker } 305*9880d681SAndroid Build Coastguard Worker void setDoesNotReadMemory() { 306*9880d681SAndroid Build Coastguard Worker addFnAttr(Attribute::WriteOnly); 307*9880d681SAndroid Build Coastguard Worker } 308*9880d681SAndroid Build Coastguard Worker 309*9880d681SAndroid Build Coastguard Worker /// @brief Determine if the call can access memmory only using pointers based 310*9880d681SAndroid Build Coastguard Worker /// on its arguments. 311*9880d681SAndroid Build Coastguard Worker bool onlyAccessesArgMemory() const { 312*9880d681SAndroid Build Coastguard Worker return hasFnAttribute(Attribute::ArgMemOnly); 313*9880d681SAndroid Build Coastguard Worker } 314*9880d681SAndroid Build Coastguard Worker void setOnlyAccessesArgMemory() { addFnAttr(Attribute::ArgMemOnly); } 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker /// @brief Determine if the function may only access memory that is 317*9880d681SAndroid Build Coastguard Worker /// inaccessible from the IR. 318*9880d681SAndroid Build Coastguard Worker bool onlyAccessesInaccessibleMemory() const { 319*9880d681SAndroid Build Coastguard Worker return hasFnAttribute(Attribute::InaccessibleMemOnly); 320*9880d681SAndroid Build Coastguard Worker } 321*9880d681SAndroid Build Coastguard Worker void setOnlyAccessesInaccessibleMemory() { 322*9880d681SAndroid Build Coastguard Worker addFnAttr(Attribute::InaccessibleMemOnly); 323*9880d681SAndroid Build Coastguard Worker } 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker /// @brief Determine if the function may only access memory that is 326*9880d681SAndroid Build Coastguard Worker // either inaccessible from the IR or pointed to by its arguments. 327*9880d681SAndroid Build Coastguard Worker bool onlyAccessesInaccessibleMemOrArgMem() const { 328*9880d681SAndroid Build Coastguard Worker return hasFnAttribute(Attribute::InaccessibleMemOrArgMemOnly); 329*9880d681SAndroid Build Coastguard Worker } 330*9880d681SAndroid Build Coastguard Worker void setOnlyAccessesInaccessibleMemOrArgMem() { 331*9880d681SAndroid Build Coastguard Worker addFnAttr(Attribute::InaccessibleMemOrArgMemOnly); 332*9880d681SAndroid Build Coastguard Worker } 333*9880d681SAndroid Build Coastguard Worker 334*9880d681SAndroid Build Coastguard Worker /// @brief Determine if the function cannot return. 335*9880d681SAndroid Build Coastguard Worker bool doesNotReturn() const { 336*9880d681SAndroid Build Coastguard Worker return hasFnAttribute(Attribute::NoReturn); 337*9880d681SAndroid Build Coastguard Worker } 338*9880d681SAndroid Build Coastguard Worker void setDoesNotReturn() { 339*9880d681SAndroid Build Coastguard Worker addFnAttr(Attribute::NoReturn); 340*9880d681SAndroid Build Coastguard Worker } 341*9880d681SAndroid Build Coastguard Worker 342*9880d681SAndroid Build Coastguard Worker /// @brief Determine if the function cannot unwind. 343*9880d681SAndroid Build Coastguard Worker bool doesNotThrow() const { 344*9880d681SAndroid Build Coastguard Worker return hasFnAttribute(Attribute::NoUnwind); 345*9880d681SAndroid Build Coastguard Worker } 346*9880d681SAndroid Build Coastguard Worker void setDoesNotThrow() { 347*9880d681SAndroid Build Coastguard Worker addFnAttr(Attribute::NoUnwind); 348*9880d681SAndroid Build Coastguard Worker } 349*9880d681SAndroid Build Coastguard Worker 350*9880d681SAndroid Build Coastguard Worker /// @brief Determine if the call cannot be duplicated. 351*9880d681SAndroid Build Coastguard Worker bool cannotDuplicate() const { 352*9880d681SAndroid Build Coastguard Worker return hasFnAttribute(Attribute::NoDuplicate); 353*9880d681SAndroid Build Coastguard Worker } 354*9880d681SAndroid Build Coastguard Worker void setCannotDuplicate() { 355*9880d681SAndroid Build Coastguard Worker addFnAttr(Attribute::NoDuplicate); 356*9880d681SAndroid Build Coastguard Worker } 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Worker /// @brief Determine if the call is convergent. 359*9880d681SAndroid Build Coastguard Worker bool isConvergent() const { 360*9880d681SAndroid Build Coastguard Worker return hasFnAttribute(Attribute::Convergent); 361*9880d681SAndroid Build Coastguard Worker } 362*9880d681SAndroid Build Coastguard Worker void setConvergent() { 363*9880d681SAndroid Build Coastguard Worker addFnAttr(Attribute::Convergent); 364*9880d681SAndroid Build Coastguard Worker } 365*9880d681SAndroid Build Coastguard Worker void setNotConvergent() { 366*9880d681SAndroid Build Coastguard Worker removeFnAttr(Attribute::Convergent); 367*9880d681SAndroid Build Coastguard Worker } 368*9880d681SAndroid Build Coastguard Worker 369*9880d681SAndroid Build Coastguard Worker /// Determine if the function is known not to recurse, directly or 370*9880d681SAndroid Build Coastguard Worker /// indirectly. 371*9880d681SAndroid Build Coastguard Worker bool doesNotRecurse() const { 372*9880d681SAndroid Build Coastguard Worker return hasFnAttribute(Attribute::NoRecurse); 373*9880d681SAndroid Build Coastguard Worker } 374*9880d681SAndroid Build Coastguard Worker void setDoesNotRecurse() { 375*9880d681SAndroid Build Coastguard Worker addFnAttr(Attribute::NoRecurse); 376*9880d681SAndroid Build Coastguard Worker } 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Worker /// @brief True if the ABI mandates (or the user requested) that this 379*9880d681SAndroid Build Coastguard Worker /// function be in a unwind table. 380*9880d681SAndroid Build Coastguard Worker bool hasUWTable() const { 381*9880d681SAndroid Build Coastguard Worker return hasFnAttribute(Attribute::UWTable); 382*9880d681SAndroid Build Coastguard Worker } 383*9880d681SAndroid Build Coastguard Worker void setHasUWTable() { 384*9880d681SAndroid Build Coastguard Worker addFnAttr(Attribute::UWTable); 385*9880d681SAndroid Build Coastguard Worker } 386*9880d681SAndroid Build Coastguard Worker 387*9880d681SAndroid Build Coastguard Worker /// @brief True if this function needs an unwind table. 388*9880d681SAndroid Build Coastguard Worker bool needsUnwindTableEntry() const { 389*9880d681SAndroid Build Coastguard Worker return hasUWTable() || !doesNotThrow(); 390*9880d681SAndroid Build Coastguard Worker } 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Worker /// @brief Determine if the function returns a structure through first 393*9880d681SAndroid Build Coastguard Worker /// pointer argument. 394*9880d681SAndroid Build Coastguard Worker bool hasStructRetAttr() const { 395*9880d681SAndroid Build Coastguard Worker return AttributeSets.hasAttribute(1, Attribute::StructRet) || 396*9880d681SAndroid Build Coastguard Worker AttributeSets.hasAttribute(2, Attribute::StructRet); 397*9880d681SAndroid Build Coastguard Worker } 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Worker /// @brief Determine if the parameter or return value is marked with NoAlias 400*9880d681SAndroid Build Coastguard Worker /// attribute. 401*9880d681SAndroid Build Coastguard Worker /// @param n The parameter to check. 1 is the first parameter, 0 is the return 402*9880d681SAndroid Build Coastguard Worker bool doesNotAlias(unsigned n) const { 403*9880d681SAndroid Build Coastguard Worker return AttributeSets.hasAttribute(n, Attribute::NoAlias); 404*9880d681SAndroid Build Coastguard Worker } 405*9880d681SAndroid Build Coastguard Worker void setDoesNotAlias(unsigned n) { 406*9880d681SAndroid Build Coastguard Worker addAttribute(n, Attribute::NoAlias); 407*9880d681SAndroid Build Coastguard Worker } 408*9880d681SAndroid Build Coastguard Worker 409*9880d681SAndroid Build Coastguard Worker /// @brief Determine if the parameter can be captured. 410*9880d681SAndroid Build Coastguard Worker /// @param n The parameter to check. 1 is the first parameter, 0 is the return 411*9880d681SAndroid Build Coastguard Worker bool doesNotCapture(unsigned n) const { 412*9880d681SAndroid Build Coastguard Worker return AttributeSets.hasAttribute(n, Attribute::NoCapture); 413*9880d681SAndroid Build Coastguard Worker } 414*9880d681SAndroid Build Coastguard Worker void setDoesNotCapture(unsigned n) { 415*9880d681SAndroid Build Coastguard Worker addAttribute(n, Attribute::NoCapture); 416*9880d681SAndroid Build Coastguard Worker } 417*9880d681SAndroid Build Coastguard Worker 418*9880d681SAndroid Build Coastguard Worker bool doesNotAccessMemory(unsigned n) const { 419*9880d681SAndroid Build Coastguard Worker return AttributeSets.hasAttribute(n, Attribute::ReadNone); 420*9880d681SAndroid Build Coastguard Worker } 421*9880d681SAndroid Build Coastguard Worker void setDoesNotAccessMemory(unsigned n) { 422*9880d681SAndroid Build Coastguard Worker addAttribute(n, Attribute::ReadNone); 423*9880d681SAndroid Build Coastguard Worker } 424*9880d681SAndroid Build Coastguard Worker 425*9880d681SAndroid Build Coastguard Worker bool onlyReadsMemory(unsigned n) const { 426*9880d681SAndroid Build Coastguard Worker return doesNotAccessMemory(n) || 427*9880d681SAndroid Build Coastguard Worker AttributeSets.hasAttribute(n, Attribute::ReadOnly); 428*9880d681SAndroid Build Coastguard Worker } 429*9880d681SAndroid Build Coastguard Worker void setOnlyReadsMemory(unsigned n) { 430*9880d681SAndroid Build Coastguard Worker addAttribute(n, Attribute::ReadOnly); 431*9880d681SAndroid Build Coastguard Worker } 432*9880d681SAndroid Build Coastguard Worker 433*9880d681SAndroid Build Coastguard Worker /// Optimize this function for minimum size (-Oz). 434*9880d681SAndroid Build Coastguard Worker bool optForMinSize() const { return hasFnAttribute(Attribute::MinSize); }; 435*9880d681SAndroid Build Coastguard Worker 436*9880d681SAndroid Build Coastguard Worker /// Optimize this function for size (-Os) or minimum size (-Oz). 437*9880d681SAndroid Build Coastguard Worker bool optForSize() const { 438*9880d681SAndroid Build Coastguard Worker return hasFnAttribute(Attribute::OptimizeForSize) || optForMinSize(); 439*9880d681SAndroid Build Coastguard Worker } 440*9880d681SAndroid Build Coastguard Worker 441*9880d681SAndroid Build Coastguard Worker /// copyAttributesFrom - copy all additional attributes (those not needed to 442*9880d681SAndroid Build Coastguard Worker /// create a Function) from the Function Src to this one. 443*9880d681SAndroid Build Coastguard Worker void copyAttributesFrom(const GlobalValue *Src) override; 444*9880d681SAndroid Build Coastguard Worker 445*9880d681SAndroid Build Coastguard Worker /// deleteBody - This method deletes the body of the function, and converts 446*9880d681SAndroid Build Coastguard Worker /// the linkage to external. 447*9880d681SAndroid Build Coastguard Worker /// 448*9880d681SAndroid Build Coastguard Worker void deleteBody() { 449*9880d681SAndroid Build Coastguard Worker dropAllReferences(); 450*9880d681SAndroid Build Coastguard Worker setLinkage(ExternalLinkage); 451*9880d681SAndroid Build Coastguard Worker } 452*9880d681SAndroid Build Coastguard Worker 453*9880d681SAndroid Build Coastguard Worker /// removeFromParent - This method unlinks 'this' from the containing module, 454*9880d681SAndroid Build Coastguard Worker /// but does not delete it. 455*9880d681SAndroid Build Coastguard Worker /// 456*9880d681SAndroid Build Coastguard Worker void removeFromParent() override; 457*9880d681SAndroid Build Coastguard Worker 458*9880d681SAndroid Build Coastguard Worker /// eraseFromParent - This method unlinks 'this' from the containing module 459*9880d681SAndroid Build Coastguard Worker /// and deletes it. 460*9880d681SAndroid Build Coastguard Worker /// 461*9880d681SAndroid Build Coastguard Worker void eraseFromParent() override; 462*9880d681SAndroid Build Coastguard Worker 463*9880d681SAndroid Build Coastguard Worker /// Steal arguments from another function. 464*9880d681SAndroid Build Coastguard Worker /// 465*9880d681SAndroid Build Coastguard Worker /// Drop this function's arguments and splice in the ones from \c Src. 466*9880d681SAndroid Build Coastguard Worker /// Requires that this has no function body. 467*9880d681SAndroid Build Coastguard Worker void stealArgumentListFrom(Function &Src); 468*9880d681SAndroid Build Coastguard Worker 469*9880d681SAndroid Build Coastguard Worker /// Get the underlying elements of the Function... the basic block list is 470*9880d681SAndroid Build Coastguard Worker /// empty for external functions. 471*9880d681SAndroid Build Coastguard Worker /// 472*9880d681SAndroid Build Coastguard Worker const ArgumentListType &getArgumentList() const { 473*9880d681SAndroid Build Coastguard Worker CheckLazyArguments(); 474*9880d681SAndroid Build Coastguard Worker return ArgumentList; 475*9880d681SAndroid Build Coastguard Worker } 476*9880d681SAndroid Build Coastguard Worker ArgumentListType &getArgumentList() { 477*9880d681SAndroid Build Coastguard Worker CheckLazyArguments(); 478*9880d681SAndroid Build Coastguard Worker return ArgumentList; 479*9880d681SAndroid Build Coastguard Worker } 480*9880d681SAndroid Build Coastguard Worker static ArgumentListType Function::*getSublistAccess(Argument*) { 481*9880d681SAndroid Build Coastguard Worker return &Function::ArgumentList; 482*9880d681SAndroid Build Coastguard Worker } 483*9880d681SAndroid Build Coastguard Worker 484*9880d681SAndroid Build Coastguard Worker const BasicBlockListType &getBasicBlockList() const { return BasicBlocks; } 485*9880d681SAndroid Build Coastguard Worker BasicBlockListType &getBasicBlockList() { return BasicBlocks; } 486*9880d681SAndroid Build Coastguard Worker static BasicBlockListType Function::*getSublistAccess(BasicBlock*) { 487*9880d681SAndroid Build Coastguard Worker return &Function::BasicBlocks; 488*9880d681SAndroid Build Coastguard Worker } 489*9880d681SAndroid Build Coastguard Worker 490*9880d681SAndroid Build Coastguard Worker const BasicBlock &getEntryBlock() const { return front(); } 491*9880d681SAndroid Build Coastguard Worker BasicBlock &getEntryBlock() { return front(); } 492*9880d681SAndroid Build Coastguard Worker 493*9880d681SAndroid Build Coastguard Worker //===--------------------------------------------------------------------===// 494*9880d681SAndroid Build Coastguard Worker // Symbol Table Accessing functions... 495*9880d681SAndroid Build Coastguard Worker 496*9880d681SAndroid Build Coastguard Worker /// getSymbolTable() - Return the symbol table... 497*9880d681SAndroid Build Coastguard Worker /// 498*9880d681SAndroid Build Coastguard Worker inline ValueSymbolTable &getValueSymbolTable() { return *SymTab; } 499*9880d681SAndroid Build Coastguard Worker inline const ValueSymbolTable &getValueSymbolTable() const { return *SymTab; } 500*9880d681SAndroid Build Coastguard Worker 501*9880d681SAndroid Build Coastguard Worker //===--------------------------------------------------------------------===// 502*9880d681SAndroid Build Coastguard Worker // BasicBlock iterator forwarding functions 503*9880d681SAndroid Build Coastguard Worker // 504*9880d681SAndroid Build Coastguard Worker iterator begin() { return BasicBlocks.begin(); } 505*9880d681SAndroid Build Coastguard Worker const_iterator begin() const { return BasicBlocks.begin(); } 506*9880d681SAndroid Build Coastguard Worker iterator end () { return BasicBlocks.end(); } 507*9880d681SAndroid Build Coastguard Worker const_iterator end () const { return BasicBlocks.end(); } 508*9880d681SAndroid Build Coastguard Worker 509*9880d681SAndroid Build Coastguard Worker size_t size() const { return BasicBlocks.size(); } 510*9880d681SAndroid Build Coastguard Worker bool empty() const { return BasicBlocks.empty(); } 511*9880d681SAndroid Build Coastguard Worker const BasicBlock &front() const { return BasicBlocks.front(); } 512*9880d681SAndroid Build Coastguard Worker BasicBlock &front() { return BasicBlocks.front(); } 513*9880d681SAndroid Build Coastguard Worker const BasicBlock &back() const { return BasicBlocks.back(); } 514*9880d681SAndroid Build Coastguard Worker BasicBlock &back() { return BasicBlocks.back(); } 515*9880d681SAndroid Build Coastguard Worker 516*9880d681SAndroid Build Coastguard Worker /// @name Function Argument Iteration 517*9880d681SAndroid Build Coastguard Worker /// @{ 518*9880d681SAndroid Build Coastguard Worker 519*9880d681SAndroid Build Coastguard Worker arg_iterator arg_begin() { 520*9880d681SAndroid Build Coastguard Worker CheckLazyArguments(); 521*9880d681SAndroid Build Coastguard Worker return ArgumentList.begin(); 522*9880d681SAndroid Build Coastguard Worker } 523*9880d681SAndroid Build Coastguard Worker const_arg_iterator arg_begin() const { 524*9880d681SAndroid Build Coastguard Worker CheckLazyArguments(); 525*9880d681SAndroid Build Coastguard Worker return ArgumentList.begin(); 526*9880d681SAndroid Build Coastguard Worker } 527*9880d681SAndroid Build Coastguard Worker arg_iterator arg_end() { 528*9880d681SAndroid Build Coastguard Worker CheckLazyArguments(); 529*9880d681SAndroid Build Coastguard Worker return ArgumentList.end(); 530*9880d681SAndroid Build Coastguard Worker } 531*9880d681SAndroid Build Coastguard Worker const_arg_iterator arg_end() const { 532*9880d681SAndroid Build Coastguard Worker CheckLazyArguments(); 533*9880d681SAndroid Build Coastguard Worker return ArgumentList.end(); 534*9880d681SAndroid Build Coastguard Worker } 535*9880d681SAndroid Build Coastguard Worker 536*9880d681SAndroid Build Coastguard Worker iterator_range<arg_iterator> args() { 537*9880d681SAndroid Build Coastguard Worker return make_range(arg_begin(), arg_end()); 538*9880d681SAndroid Build Coastguard Worker } 539*9880d681SAndroid Build Coastguard Worker 540*9880d681SAndroid Build Coastguard Worker iterator_range<const_arg_iterator> args() const { 541*9880d681SAndroid Build Coastguard Worker return make_range(arg_begin(), arg_end()); 542*9880d681SAndroid Build Coastguard Worker } 543*9880d681SAndroid Build Coastguard Worker 544*9880d681SAndroid Build Coastguard Worker /// @} 545*9880d681SAndroid Build Coastguard Worker 546*9880d681SAndroid Build Coastguard Worker size_t arg_size() const; 547*9880d681SAndroid Build Coastguard Worker bool arg_empty() const; 548*9880d681SAndroid Build Coastguard Worker 549*9880d681SAndroid Build Coastguard Worker /// \brief Check whether this function has a personality function. 550*9880d681SAndroid Build Coastguard Worker bool hasPersonalityFn() const { 551*9880d681SAndroid Build Coastguard Worker return getSubclassDataFromValue() & (1<<3); 552*9880d681SAndroid Build Coastguard Worker } 553*9880d681SAndroid Build Coastguard Worker 554*9880d681SAndroid Build Coastguard Worker /// \brief Get the personality function associated with this function. 555*9880d681SAndroid Build Coastguard Worker Constant *getPersonalityFn() const; 556*9880d681SAndroid Build Coastguard Worker void setPersonalityFn(Constant *Fn); 557*9880d681SAndroid Build Coastguard Worker 558*9880d681SAndroid Build Coastguard Worker /// \brief Check whether this function has prefix data. 559*9880d681SAndroid Build Coastguard Worker bool hasPrefixData() const { 560*9880d681SAndroid Build Coastguard Worker return getSubclassDataFromValue() & (1<<1); 561*9880d681SAndroid Build Coastguard Worker } 562*9880d681SAndroid Build Coastguard Worker 563*9880d681SAndroid Build Coastguard Worker /// \brief Get the prefix data associated with this function. 564*9880d681SAndroid Build Coastguard Worker Constant *getPrefixData() const; 565*9880d681SAndroid Build Coastguard Worker void setPrefixData(Constant *PrefixData); 566*9880d681SAndroid Build Coastguard Worker 567*9880d681SAndroid Build Coastguard Worker /// \brief Check whether this function has prologue data. 568*9880d681SAndroid Build Coastguard Worker bool hasPrologueData() const { 569*9880d681SAndroid Build Coastguard Worker return getSubclassDataFromValue() & (1<<2); 570*9880d681SAndroid Build Coastguard Worker } 571*9880d681SAndroid Build Coastguard Worker 572*9880d681SAndroid Build Coastguard Worker /// \brief Get the prologue data associated with this function. 573*9880d681SAndroid Build Coastguard Worker Constant *getPrologueData() const; 574*9880d681SAndroid Build Coastguard Worker void setPrologueData(Constant *PrologueData); 575*9880d681SAndroid Build Coastguard Worker 576*9880d681SAndroid Build Coastguard Worker /// Print the function to an output stream with an optional 577*9880d681SAndroid Build Coastguard Worker /// AssemblyAnnotationWriter. 578*9880d681SAndroid Build Coastguard Worker void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW = nullptr, 579*9880d681SAndroid Build Coastguard Worker bool ShouldPreserveUseListOrder = false, 580*9880d681SAndroid Build Coastguard Worker bool IsForDebug = false) const; 581*9880d681SAndroid Build Coastguard Worker 582*9880d681SAndroid Build Coastguard Worker /// viewCFG - This function is meant for use from the debugger. You can just 583*9880d681SAndroid Build Coastguard Worker /// say 'call F->viewCFG()' and a ghostview window should pop up from the 584*9880d681SAndroid Build Coastguard Worker /// program, displaying the CFG of the current function with the code for each 585*9880d681SAndroid Build Coastguard Worker /// basic block inside. This depends on there being a 'dot' and 'gv' program 586*9880d681SAndroid Build Coastguard Worker /// in your path. 587*9880d681SAndroid Build Coastguard Worker /// 588*9880d681SAndroid Build Coastguard Worker void viewCFG() const; 589*9880d681SAndroid Build Coastguard Worker 590*9880d681SAndroid Build Coastguard Worker /// viewCFGOnly - This function is meant for use from the debugger. It works 591*9880d681SAndroid Build Coastguard Worker /// just like viewCFG, but it does not include the contents of basic blocks 592*9880d681SAndroid Build Coastguard Worker /// into the nodes, just the label. If you are only interested in the CFG 593*9880d681SAndroid Build Coastguard Worker /// this can make the graph smaller. 594*9880d681SAndroid Build Coastguard Worker /// 595*9880d681SAndroid Build Coastguard Worker void viewCFGOnly() const; 596*9880d681SAndroid Build Coastguard Worker 597*9880d681SAndroid Build Coastguard Worker /// Methods for support type inquiry through isa, cast, and dyn_cast: 598*9880d681SAndroid Build Coastguard Worker static inline bool classof(const Value *V) { 599*9880d681SAndroid Build Coastguard Worker return V->getValueID() == Value::FunctionVal; 600*9880d681SAndroid Build Coastguard Worker } 601*9880d681SAndroid Build Coastguard Worker 602*9880d681SAndroid Build Coastguard Worker /// dropAllReferences() - This method causes all the subinstructions to "let 603*9880d681SAndroid Build Coastguard Worker /// go" of all references that they are maintaining. This allows one to 604*9880d681SAndroid Build Coastguard Worker /// 'delete' a whole module at a time, even though there may be circular 605*9880d681SAndroid Build Coastguard Worker /// references... first all references are dropped, and all use counts go to 606*9880d681SAndroid Build Coastguard Worker /// zero. Then everything is deleted for real. Note that no operations are 607*9880d681SAndroid Build Coastguard Worker /// valid on an object that has "dropped all references", except operator 608*9880d681SAndroid Build Coastguard Worker /// delete. 609*9880d681SAndroid Build Coastguard Worker /// 610*9880d681SAndroid Build Coastguard Worker /// Since no other object in the module can have references into the body of a 611*9880d681SAndroid Build Coastguard Worker /// function, dropping all references deletes the entire body of the function, 612*9880d681SAndroid Build Coastguard Worker /// including any contained basic blocks. 613*9880d681SAndroid Build Coastguard Worker /// 614*9880d681SAndroid Build Coastguard Worker void dropAllReferences(); 615*9880d681SAndroid Build Coastguard Worker 616*9880d681SAndroid Build Coastguard Worker /// hasAddressTaken - returns true if there are any uses of this function 617*9880d681SAndroid Build Coastguard Worker /// other than direct calls or invokes to it, or blockaddress expressions. 618*9880d681SAndroid Build Coastguard Worker /// Optionally passes back an offending user for diagnostic purposes. 619*9880d681SAndroid Build Coastguard Worker /// 620*9880d681SAndroid Build Coastguard Worker bool hasAddressTaken(const User** = nullptr) const; 621*9880d681SAndroid Build Coastguard Worker 622*9880d681SAndroid Build Coastguard Worker /// isDefTriviallyDead - Return true if it is trivially safe to remove 623*9880d681SAndroid Build Coastguard Worker /// this function definition from the module (because it isn't externally 624*9880d681SAndroid Build Coastguard Worker /// visible, does not have its address taken, and has no callers). To make 625*9880d681SAndroid Build Coastguard Worker /// this more accurate, call removeDeadConstantUsers first. 626*9880d681SAndroid Build Coastguard Worker bool isDefTriviallyDead() const; 627*9880d681SAndroid Build Coastguard Worker 628*9880d681SAndroid Build Coastguard Worker /// callsFunctionThatReturnsTwice - Return true if the function has a call to 629*9880d681SAndroid Build Coastguard Worker /// setjmp or other function that gcc recognizes as "returning twice". 630*9880d681SAndroid Build Coastguard Worker bool callsFunctionThatReturnsTwice() const; 631*9880d681SAndroid Build Coastguard Worker 632*9880d681SAndroid Build Coastguard Worker /// \brief Set the attached subprogram. 633*9880d681SAndroid Build Coastguard Worker /// 634*9880d681SAndroid Build Coastguard Worker /// Calls \a setMetadata() with \a LLVMContext::MD_dbg. 635*9880d681SAndroid Build Coastguard Worker void setSubprogram(DISubprogram *SP); 636*9880d681SAndroid Build Coastguard Worker 637*9880d681SAndroid Build Coastguard Worker /// \brief Get the attached subprogram. 638*9880d681SAndroid Build Coastguard Worker /// 639*9880d681SAndroid Build Coastguard Worker /// Calls \a getMetadata() with \a LLVMContext::MD_dbg and casts the result 640*9880d681SAndroid Build Coastguard Worker /// to \a DISubprogram. 641*9880d681SAndroid Build Coastguard Worker DISubprogram *getSubprogram() const; 642*9880d681SAndroid Build Coastguard Worker 643*9880d681SAndroid Build Coastguard Worker private: 644*9880d681SAndroid Build Coastguard Worker void allocHungoffUselist(); 645*9880d681SAndroid Build Coastguard Worker template<int Idx> void setHungoffOperand(Constant *C); 646*9880d681SAndroid Build Coastguard Worker 647*9880d681SAndroid Build Coastguard Worker // Shadow Value::setValueSubclassData with a private forwarding method so that 648*9880d681SAndroid Build Coastguard Worker // subclasses cannot accidentally use it. 649*9880d681SAndroid Build Coastguard Worker void setValueSubclassData(unsigned short D) { 650*9880d681SAndroid Build Coastguard Worker Value::setValueSubclassData(D); 651*9880d681SAndroid Build Coastguard Worker } 652*9880d681SAndroid Build Coastguard Worker void setValueSubclassDataBit(unsigned Bit, bool On); 653*9880d681SAndroid Build Coastguard Worker }; 654*9880d681SAndroid Build Coastguard Worker 655*9880d681SAndroid Build Coastguard Worker template <> 656*9880d681SAndroid Build Coastguard Worker struct OperandTraits<Function> : public HungoffOperandTraits<3> {}; 657*9880d681SAndroid Build Coastguard Worker 658*9880d681SAndroid Build Coastguard Worker DEFINE_TRANSPARENT_OPERAND_ACCESSORS(Function, Value) 659*9880d681SAndroid Build Coastguard Worker 660*9880d681SAndroid Build Coastguard Worker } // End llvm namespace 661*9880d681SAndroid Build Coastguard Worker 662*9880d681SAndroid Build Coastguard Worker #endif 663