1*0b57cec5SDimitry Andric //===- Function.cpp - Implement the Global object classes -----------------===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric // 9*0b57cec5SDimitry Andric // This file implements the Function class for the IR library. 10*0b57cec5SDimitry Andric // 11*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric #include "llvm/IR/Function.h" 14*0b57cec5SDimitry Andric #include "SymbolTableListTraitsImpl.h" 15*0b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h" 16*0b57cec5SDimitry Andric #include "llvm/ADT/DenseSet.h" 17*0b57cec5SDimitry Andric #include "llvm/ADT/None.h" 18*0b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h" 19*0b57cec5SDimitry Andric #include "llvm/ADT/SmallString.h" 20*0b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h" 21*0b57cec5SDimitry Andric #include "llvm/ADT/StringExtras.h" 22*0b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 23*0b57cec5SDimitry Andric #include "llvm/IR/Argument.h" 24*0b57cec5SDimitry Andric #include "llvm/IR/Attributes.h" 25*0b57cec5SDimitry Andric #include "llvm/IR/BasicBlock.h" 26*0b57cec5SDimitry Andric #include "llvm/IR/Constant.h" 27*0b57cec5SDimitry Andric #include "llvm/IR/Constants.h" 28*0b57cec5SDimitry Andric #include "llvm/IR/DerivedTypes.h" 29*0b57cec5SDimitry Andric #include "llvm/IR/GlobalValue.h" 30*0b57cec5SDimitry Andric #include "llvm/IR/InstIterator.h" 31*0b57cec5SDimitry Andric #include "llvm/IR/Instruction.h" 32*0b57cec5SDimitry Andric #include "llvm/IR/Instructions.h" 33*0b57cec5SDimitry Andric #include "llvm/IR/IntrinsicInst.h" 34*0b57cec5SDimitry Andric #include "llvm/IR/Intrinsics.h" 35*0b57cec5SDimitry Andric #include "llvm/IR/LLVMContext.h" 36*0b57cec5SDimitry Andric #include "llvm/IR/MDBuilder.h" 37*0b57cec5SDimitry Andric #include "llvm/IR/Metadata.h" 38*0b57cec5SDimitry Andric #include "llvm/IR/Module.h" 39*0b57cec5SDimitry Andric #include "llvm/IR/SymbolTableListTraits.h" 40*0b57cec5SDimitry Andric #include "llvm/IR/Type.h" 41*0b57cec5SDimitry Andric #include "llvm/IR/Use.h" 42*0b57cec5SDimitry Andric #include "llvm/IR/User.h" 43*0b57cec5SDimitry Andric #include "llvm/IR/Value.h" 44*0b57cec5SDimitry Andric #include "llvm/IR/ValueSymbolTable.h" 45*0b57cec5SDimitry Andric #include "llvm/Support/Casting.h" 46*0b57cec5SDimitry Andric #include "llvm/Support/Compiler.h" 47*0b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 48*0b57cec5SDimitry Andric #include <algorithm> 49*0b57cec5SDimitry Andric #include <cassert> 50*0b57cec5SDimitry Andric #include <cstddef> 51*0b57cec5SDimitry Andric #include <cstdint> 52*0b57cec5SDimitry Andric #include <cstring> 53*0b57cec5SDimitry Andric #include <string> 54*0b57cec5SDimitry Andric 55*0b57cec5SDimitry Andric using namespace llvm; 56*0b57cec5SDimitry Andric using ProfileCount = Function::ProfileCount; 57*0b57cec5SDimitry Andric 58*0b57cec5SDimitry Andric // Explicit instantiations of SymbolTableListTraits since some of the methods 59*0b57cec5SDimitry Andric // are not in the public header file... 60*0b57cec5SDimitry Andric template class llvm::SymbolTableListTraits<BasicBlock>; 61*0b57cec5SDimitry Andric 62*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 63*0b57cec5SDimitry Andric // Argument Implementation 64*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 65*0b57cec5SDimitry Andric 66*0b57cec5SDimitry Andric Argument::Argument(Type *Ty, const Twine &Name, Function *Par, unsigned ArgNo) 67*0b57cec5SDimitry Andric : Value(Ty, Value::ArgumentVal), Parent(Par), ArgNo(ArgNo) { 68*0b57cec5SDimitry Andric setName(Name); 69*0b57cec5SDimitry Andric } 70*0b57cec5SDimitry Andric 71*0b57cec5SDimitry Andric void Argument::setParent(Function *parent) { 72*0b57cec5SDimitry Andric Parent = parent; 73*0b57cec5SDimitry Andric } 74*0b57cec5SDimitry Andric 75*0b57cec5SDimitry Andric bool Argument::hasNonNullAttr() const { 76*0b57cec5SDimitry Andric if (!getType()->isPointerTy()) return false; 77*0b57cec5SDimitry Andric if (getParent()->hasParamAttribute(getArgNo(), Attribute::NonNull)) 78*0b57cec5SDimitry Andric return true; 79*0b57cec5SDimitry Andric else if (getDereferenceableBytes() > 0 && 80*0b57cec5SDimitry Andric !NullPointerIsDefined(getParent(), 81*0b57cec5SDimitry Andric getType()->getPointerAddressSpace())) 82*0b57cec5SDimitry Andric return true; 83*0b57cec5SDimitry Andric return false; 84*0b57cec5SDimitry Andric } 85*0b57cec5SDimitry Andric 86*0b57cec5SDimitry Andric bool Argument::hasByValAttr() const { 87*0b57cec5SDimitry Andric if (!getType()->isPointerTy()) return false; 88*0b57cec5SDimitry Andric return hasAttribute(Attribute::ByVal); 89*0b57cec5SDimitry Andric } 90*0b57cec5SDimitry Andric 91*0b57cec5SDimitry Andric bool Argument::hasSwiftSelfAttr() const { 92*0b57cec5SDimitry Andric return getParent()->hasParamAttribute(getArgNo(), Attribute::SwiftSelf); 93*0b57cec5SDimitry Andric } 94*0b57cec5SDimitry Andric 95*0b57cec5SDimitry Andric bool Argument::hasSwiftErrorAttr() const { 96*0b57cec5SDimitry Andric return getParent()->hasParamAttribute(getArgNo(), Attribute::SwiftError); 97*0b57cec5SDimitry Andric } 98*0b57cec5SDimitry Andric 99*0b57cec5SDimitry Andric bool Argument::hasInAllocaAttr() const { 100*0b57cec5SDimitry Andric if (!getType()->isPointerTy()) return false; 101*0b57cec5SDimitry Andric return hasAttribute(Attribute::InAlloca); 102*0b57cec5SDimitry Andric } 103*0b57cec5SDimitry Andric 104*0b57cec5SDimitry Andric bool Argument::hasByValOrInAllocaAttr() const { 105*0b57cec5SDimitry Andric if (!getType()->isPointerTy()) return false; 106*0b57cec5SDimitry Andric AttributeList Attrs = getParent()->getAttributes(); 107*0b57cec5SDimitry Andric return Attrs.hasParamAttribute(getArgNo(), Attribute::ByVal) || 108*0b57cec5SDimitry Andric Attrs.hasParamAttribute(getArgNo(), Attribute::InAlloca); 109*0b57cec5SDimitry Andric } 110*0b57cec5SDimitry Andric 111*0b57cec5SDimitry Andric unsigned Argument::getParamAlignment() const { 112*0b57cec5SDimitry Andric assert(getType()->isPointerTy() && "Only pointers have alignments"); 113*0b57cec5SDimitry Andric return getParent()->getParamAlignment(getArgNo()); 114*0b57cec5SDimitry Andric } 115*0b57cec5SDimitry Andric 116*0b57cec5SDimitry Andric Type *Argument::getParamByValType() const { 117*0b57cec5SDimitry Andric assert(getType()->isPointerTy() && "Only pointers have byval types"); 118*0b57cec5SDimitry Andric return getParent()->getParamByValType(getArgNo()); 119*0b57cec5SDimitry Andric } 120*0b57cec5SDimitry Andric 121*0b57cec5SDimitry Andric uint64_t Argument::getDereferenceableBytes() const { 122*0b57cec5SDimitry Andric assert(getType()->isPointerTy() && 123*0b57cec5SDimitry Andric "Only pointers have dereferenceable bytes"); 124*0b57cec5SDimitry Andric return getParent()->getParamDereferenceableBytes(getArgNo()); 125*0b57cec5SDimitry Andric } 126*0b57cec5SDimitry Andric 127*0b57cec5SDimitry Andric uint64_t Argument::getDereferenceableOrNullBytes() const { 128*0b57cec5SDimitry Andric assert(getType()->isPointerTy() && 129*0b57cec5SDimitry Andric "Only pointers have dereferenceable bytes"); 130*0b57cec5SDimitry Andric return getParent()->getParamDereferenceableOrNullBytes(getArgNo()); 131*0b57cec5SDimitry Andric } 132*0b57cec5SDimitry Andric 133*0b57cec5SDimitry Andric bool Argument::hasNestAttr() const { 134*0b57cec5SDimitry Andric if (!getType()->isPointerTy()) return false; 135*0b57cec5SDimitry Andric return hasAttribute(Attribute::Nest); 136*0b57cec5SDimitry Andric } 137*0b57cec5SDimitry Andric 138*0b57cec5SDimitry Andric bool Argument::hasNoAliasAttr() const { 139*0b57cec5SDimitry Andric if (!getType()->isPointerTy()) return false; 140*0b57cec5SDimitry Andric return hasAttribute(Attribute::NoAlias); 141*0b57cec5SDimitry Andric } 142*0b57cec5SDimitry Andric 143*0b57cec5SDimitry Andric bool Argument::hasNoCaptureAttr() const { 144*0b57cec5SDimitry Andric if (!getType()->isPointerTy()) return false; 145*0b57cec5SDimitry Andric return hasAttribute(Attribute::NoCapture); 146*0b57cec5SDimitry Andric } 147*0b57cec5SDimitry Andric 148*0b57cec5SDimitry Andric bool Argument::hasStructRetAttr() const { 149*0b57cec5SDimitry Andric if (!getType()->isPointerTy()) return false; 150*0b57cec5SDimitry Andric return hasAttribute(Attribute::StructRet); 151*0b57cec5SDimitry Andric } 152*0b57cec5SDimitry Andric 153*0b57cec5SDimitry Andric bool Argument::hasInRegAttr() const { 154*0b57cec5SDimitry Andric return hasAttribute(Attribute::InReg); 155*0b57cec5SDimitry Andric } 156*0b57cec5SDimitry Andric 157*0b57cec5SDimitry Andric bool Argument::hasReturnedAttr() const { 158*0b57cec5SDimitry Andric return hasAttribute(Attribute::Returned); 159*0b57cec5SDimitry Andric } 160*0b57cec5SDimitry Andric 161*0b57cec5SDimitry Andric bool Argument::hasZExtAttr() const { 162*0b57cec5SDimitry Andric return hasAttribute(Attribute::ZExt); 163*0b57cec5SDimitry Andric } 164*0b57cec5SDimitry Andric 165*0b57cec5SDimitry Andric bool Argument::hasSExtAttr() const { 166*0b57cec5SDimitry Andric return hasAttribute(Attribute::SExt); 167*0b57cec5SDimitry Andric } 168*0b57cec5SDimitry Andric 169*0b57cec5SDimitry Andric bool Argument::onlyReadsMemory() const { 170*0b57cec5SDimitry Andric AttributeList Attrs = getParent()->getAttributes(); 171*0b57cec5SDimitry Andric return Attrs.hasParamAttribute(getArgNo(), Attribute::ReadOnly) || 172*0b57cec5SDimitry Andric Attrs.hasParamAttribute(getArgNo(), Attribute::ReadNone); 173*0b57cec5SDimitry Andric } 174*0b57cec5SDimitry Andric 175*0b57cec5SDimitry Andric void Argument::addAttrs(AttrBuilder &B) { 176*0b57cec5SDimitry Andric AttributeList AL = getParent()->getAttributes(); 177*0b57cec5SDimitry Andric AL = AL.addParamAttributes(Parent->getContext(), getArgNo(), B); 178*0b57cec5SDimitry Andric getParent()->setAttributes(AL); 179*0b57cec5SDimitry Andric } 180*0b57cec5SDimitry Andric 181*0b57cec5SDimitry Andric void Argument::addAttr(Attribute::AttrKind Kind) { 182*0b57cec5SDimitry Andric getParent()->addParamAttr(getArgNo(), Kind); 183*0b57cec5SDimitry Andric } 184*0b57cec5SDimitry Andric 185*0b57cec5SDimitry Andric void Argument::addAttr(Attribute Attr) { 186*0b57cec5SDimitry Andric getParent()->addParamAttr(getArgNo(), Attr); 187*0b57cec5SDimitry Andric } 188*0b57cec5SDimitry Andric 189*0b57cec5SDimitry Andric void Argument::removeAttr(Attribute::AttrKind Kind) { 190*0b57cec5SDimitry Andric getParent()->removeParamAttr(getArgNo(), Kind); 191*0b57cec5SDimitry Andric } 192*0b57cec5SDimitry Andric 193*0b57cec5SDimitry Andric bool Argument::hasAttribute(Attribute::AttrKind Kind) const { 194*0b57cec5SDimitry Andric return getParent()->hasParamAttribute(getArgNo(), Kind); 195*0b57cec5SDimitry Andric } 196*0b57cec5SDimitry Andric 197*0b57cec5SDimitry Andric Attribute Argument::getAttribute(Attribute::AttrKind Kind) const { 198*0b57cec5SDimitry Andric return getParent()->getParamAttribute(getArgNo(), Kind); 199*0b57cec5SDimitry Andric } 200*0b57cec5SDimitry Andric 201*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 202*0b57cec5SDimitry Andric // Helper Methods in Function 203*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 204*0b57cec5SDimitry Andric 205*0b57cec5SDimitry Andric LLVMContext &Function::getContext() const { 206*0b57cec5SDimitry Andric return getType()->getContext(); 207*0b57cec5SDimitry Andric } 208*0b57cec5SDimitry Andric 209*0b57cec5SDimitry Andric unsigned Function::getInstructionCount() const { 210*0b57cec5SDimitry Andric unsigned NumInstrs = 0; 211*0b57cec5SDimitry Andric for (const BasicBlock &BB : BasicBlocks) 212*0b57cec5SDimitry Andric NumInstrs += std::distance(BB.instructionsWithoutDebug().begin(), 213*0b57cec5SDimitry Andric BB.instructionsWithoutDebug().end()); 214*0b57cec5SDimitry Andric return NumInstrs; 215*0b57cec5SDimitry Andric } 216*0b57cec5SDimitry Andric 217*0b57cec5SDimitry Andric Function *Function::Create(FunctionType *Ty, LinkageTypes Linkage, 218*0b57cec5SDimitry Andric const Twine &N, Module &M) { 219*0b57cec5SDimitry Andric return Create(Ty, Linkage, M.getDataLayout().getProgramAddressSpace(), N, &M); 220*0b57cec5SDimitry Andric } 221*0b57cec5SDimitry Andric 222*0b57cec5SDimitry Andric void Function::removeFromParent() { 223*0b57cec5SDimitry Andric getParent()->getFunctionList().remove(getIterator()); 224*0b57cec5SDimitry Andric } 225*0b57cec5SDimitry Andric 226*0b57cec5SDimitry Andric void Function::eraseFromParent() { 227*0b57cec5SDimitry Andric getParent()->getFunctionList().erase(getIterator()); 228*0b57cec5SDimitry Andric } 229*0b57cec5SDimitry Andric 230*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 231*0b57cec5SDimitry Andric // Function Implementation 232*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 233*0b57cec5SDimitry Andric 234*0b57cec5SDimitry Andric static unsigned computeAddrSpace(unsigned AddrSpace, Module *M) { 235*0b57cec5SDimitry Andric // If AS == -1 and we are passed a valid module pointer we place the function 236*0b57cec5SDimitry Andric // in the program address space. Otherwise we default to AS0. 237*0b57cec5SDimitry Andric if (AddrSpace == static_cast<unsigned>(-1)) 238*0b57cec5SDimitry Andric return M ? M->getDataLayout().getProgramAddressSpace() : 0; 239*0b57cec5SDimitry Andric return AddrSpace; 240*0b57cec5SDimitry Andric } 241*0b57cec5SDimitry Andric 242*0b57cec5SDimitry Andric Function::Function(FunctionType *Ty, LinkageTypes Linkage, unsigned AddrSpace, 243*0b57cec5SDimitry Andric const Twine &name, Module *ParentModule) 244*0b57cec5SDimitry Andric : GlobalObject(Ty, Value::FunctionVal, 245*0b57cec5SDimitry Andric OperandTraits<Function>::op_begin(this), 0, Linkage, name, 246*0b57cec5SDimitry Andric computeAddrSpace(AddrSpace, ParentModule)), 247*0b57cec5SDimitry Andric NumArgs(Ty->getNumParams()) { 248*0b57cec5SDimitry Andric assert(FunctionType::isValidReturnType(getReturnType()) && 249*0b57cec5SDimitry Andric "invalid return type"); 250*0b57cec5SDimitry Andric setGlobalObjectSubClassData(0); 251*0b57cec5SDimitry Andric 252*0b57cec5SDimitry Andric // We only need a symbol table for a function if the context keeps value names 253*0b57cec5SDimitry Andric if (!getContext().shouldDiscardValueNames()) 254*0b57cec5SDimitry Andric SymTab = make_unique<ValueSymbolTable>(); 255*0b57cec5SDimitry Andric 256*0b57cec5SDimitry Andric // If the function has arguments, mark them as lazily built. 257*0b57cec5SDimitry Andric if (Ty->getNumParams()) 258*0b57cec5SDimitry Andric setValueSubclassData(1); // Set the "has lazy arguments" bit. 259*0b57cec5SDimitry Andric 260*0b57cec5SDimitry Andric if (ParentModule) 261*0b57cec5SDimitry Andric ParentModule->getFunctionList().push_back(this); 262*0b57cec5SDimitry Andric 263*0b57cec5SDimitry Andric HasLLVMReservedName = getName().startswith("llvm."); 264*0b57cec5SDimitry Andric // Ensure intrinsics have the right parameter attributes. 265*0b57cec5SDimitry Andric // Note, the IntID field will have been set in Value::setName if this function 266*0b57cec5SDimitry Andric // name is a valid intrinsic ID. 267*0b57cec5SDimitry Andric if (IntID) 268*0b57cec5SDimitry Andric setAttributes(Intrinsic::getAttributes(getContext(), IntID)); 269*0b57cec5SDimitry Andric } 270*0b57cec5SDimitry Andric 271*0b57cec5SDimitry Andric Function::~Function() { 272*0b57cec5SDimitry Andric dropAllReferences(); // After this it is safe to delete instructions. 273*0b57cec5SDimitry Andric 274*0b57cec5SDimitry Andric // Delete all of the method arguments and unlink from symbol table... 275*0b57cec5SDimitry Andric if (Arguments) 276*0b57cec5SDimitry Andric clearArguments(); 277*0b57cec5SDimitry Andric 278*0b57cec5SDimitry Andric // Remove the function from the on-the-side GC table. 279*0b57cec5SDimitry Andric clearGC(); 280*0b57cec5SDimitry Andric } 281*0b57cec5SDimitry Andric 282*0b57cec5SDimitry Andric void Function::BuildLazyArguments() const { 283*0b57cec5SDimitry Andric // Create the arguments vector, all arguments start out unnamed. 284*0b57cec5SDimitry Andric auto *FT = getFunctionType(); 285*0b57cec5SDimitry Andric if (NumArgs > 0) { 286*0b57cec5SDimitry Andric Arguments = std::allocator<Argument>().allocate(NumArgs); 287*0b57cec5SDimitry Andric for (unsigned i = 0, e = NumArgs; i != e; ++i) { 288*0b57cec5SDimitry Andric Type *ArgTy = FT->getParamType(i); 289*0b57cec5SDimitry Andric assert(!ArgTy->isVoidTy() && "Cannot have void typed arguments!"); 290*0b57cec5SDimitry Andric new (Arguments + i) Argument(ArgTy, "", const_cast<Function *>(this), i); 291*0b57cec5SDimitry Andric } 292*0b57cec5SDimitry Andric } 293*0b57cec5SDimitry Andric 294*0b57cec5SDimitry Andric // Clear the lazy arguments bit. 295*0b57cec5SDimitry Andric unsigned SDC = getSubclassDataFromValue(); 296*0b57cec5SDimitry Andric const_cast<Function*>(this)->setValueSubclassData(SDC &= ~(1<<0)); 297*0b57cec5SDimitry Andric assert(!hasLazyArguments()); 298*0b57cec5SDimitry Andric } 299*0b57cec5SDimitry Andric 300*0b57cec5SDimitry Andric static MutableArrayRef<Argument> makeArgArray(Argument *Args, size_t Count) { 301*0b57cec5SDimitry Andric return MutableArrayRef<Argument>(Args, Count); 302*0b57cec5SDimitry Andric } 303*0b57cec5SDimitry Andric 304*0b57cec5SDimitry Andric void Function::clearArguments() { 305*0b57cec5SDimitry Andric for (Argument &A : makeArgArray(Arguments, NumArgs)) { 306*0b57cec5SDimitry Andric A.setName(""); 307*0b57cec5SDimitry Andric A.~Argument(); 308*0b57cec5SDimitry Andric } 309*0b57cec5SDimitry Andric std::allocator<Argument>().deallocate(Arguments, NumArgs); 310*0b57cec5SDimitry Andric Arguments = nullptr; 311*0b57cec5SDimitry Andric } 312*0b57cec5SDimitry Andric 313*0b57cec5SDimitry Andric void Function::stealArgumentListFrom(Function &Src) { 314*0b57cec5SDimitry Andric assert(isDeclaration() && "Expected no references to current arguments"); 315*0b57cec5SDimitry Andric 316*0b57cec5SDimitry Andric // Drop the current arguments, if any, and set the lazy argument bit. 317*0b57cec5SDimitry Andric if (!hasLazyArguments()) { 318*0b57cec5SDimitry Andric assert(llvm::all_of(makeArgArray(Arguments, NumArgs), 319*0b57cec5SDimitry Andric [](const Argument &A) { return A.use_empty(); }) && 320*0b57cec5SDimitry Andric "Expected arguments to be unused in declaration"); 321*0b57cec5SDimitry Andric clearArguments(); 322*0b57cec5SDimitry Andric setValueSubclassData(getSubclassDataFromValue() | (1 << 0)); 323*0b57cec5SDimitry Andric } 324*0b57cec5SDimitry Andric 325*0b57cec5SDimitry Andric // Nothing to steal if Src has lazy arguments. 326*0b57cec5SDimitry Andric if (Src.hasLazyArguments()) 327*0b57cec5SDimitry Andric return; 328*0b57cec5SDimitry Andric 329*0b57cec5SDimitry Andric // Steal arguments from Src, and fix the lazy argument bits. 330*0b57cec5SDimitry Andric assert(arg_size() == Src.arg_size()); 331*0b57cec5SDimitry Andric Arguments = Src.Arguments; 332*0b57cec5SDimitry Andric Src.Arguments = nullptr; 333*0b57cec5SDimitry Andric for (Argument &A : makeArgArray(Arguments, NumArgs)) { 334*0b57cec5SDimitry Andric // FIXME: This does the work of transferNodesFromList inefficiently. 335*0b57cec5SDimitry Andric SmallString<128> Name; 336*0b57cec5SDimitry Andric if (A.hasName()) 337*0b57cec5SDimitry Andric Name = A.getName(); 338*0b57cec5SDimitry Andric if (!Name.empty()) 339*0b57cec5SDimitry Andric A.setName(""); 340*0b57cec5SDimitry Andric A.setParent(this); 341*0b57cec5SDimitry Andric if (!Name.empty()) 342*0b57cec5SDimitry Andric A.setName(Name); 343*0b57cec5SDimitry Andric } 344*0b57cec5SDimitry Andric 345*0b57cec5SDimitry Andric setValueSubclassData(getSubclassDataFromValue() & ~(1 << 0)); 346*0b57cec5SDimitry Andric assert(!hasLazyArguments()); 347*0b57cec5SDimitry Andric Src.setValueSubclassData(Src.getSubclassDataFromValue() | (1 << 0)); 348*0b57cec5SDimitry Andric } 349*0b57cec5SDimitry Andric 350*0b57cec5SDimitry Andric // dropAllReferences() - This function causes all the subinstructions to "let 351*0b57cec5SDimitry Andric // go" of all references that they are maintaining. This allows one to 352*0b57cec5SDimitry Andric // 'delete' a whole class at a time, even though there may be circular 353*0b57cec5SDimitry Andric // references... first all references are dropped, and all use counts go to 354*0b57cec5SDimitry Andric // zero. Then everything is deleted for real. Note that no operations are 355*0b57cec5SDimitry Andric // valid on an object that has "dropped all references", except operator 356*0b57cec5SDimitry Andric // delete. 357*0b57cec5SDimitry Andric // 358*0b57cec5SDimitry Andric void Function::dropAllReferences() { 359*0b57cec5SDimitry Andric setIsMaterializable(false); 360*0b57cec5SDimitry Andric 361*0b57cec5SDimitry Andric for (BasicBlock &BB : *this) 362*0b57cec5SDimitry Andric BB.dropAllReferences(); 363*0b57cec5SDimitry Andric 364*0b57cec5SDimitry Andric // Delete all basic blocks. They are now unused, except possibly by 365*0b57cec5SDimitry Andric // blockaddresses, but BasicBlock's destructor takes care of those. 366*0b57cec5SDimitry Andric while (!BasicBlocks.empty()) 367*0b57cec5SDimitry Andric BasicBlocks.begin()->eraseFromParent(); 368*0b57cec5SDimitry Andric 369*0b57cec5SDimitry Andric // Drop uses of any optional data (real or placeholder). 370*0b57cec5SDimitry Andric if (getNumOperands()) { 371*0b57cec5SDimitry Andric User::dropAllReferences(); 372*0b57cec5SDimitry Andric setNumHungOffUseOperands(0); 373*0b57cec5SDimitry Andric setValueSubclassData(getSubclassDataFromValue() & ~0xe); 374*0b57cec5SDimitry Andric } 375*0b57cec5SDimitry Andric 376*0b57cec5SDimitry Andric // Metadata is stored in a side-table. 377*0b57cec5SDimitry Andric clearMetadata(); 378*0b57cec5SDimitry Andric } 379*0b57cec5SDimitry Andric 380*0b57cec5SDimitry Andric void Function::addAttribute(unsigned i, Attribute::AttrKind Kind) { 381*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 382*0b57cec5SDimitry Andric PAL = PAL.addAttribute(getContext(), i, Kind); 383*0b57cec5SDimitry Andric setAttributes(PAL); 384*0b57cec5SDimitry Andric } 385*0b57cec5SDimitry Andric 386*0b57cec5SDimitry Andric void Function::addAttribute(unsigned i, Attribute Attr) { 387*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 388*0b57cec5SDimitry Andric PAL = PAL.addAttribute(getContext(), i, Attr); 389*0b57cec5SDimitry Andric setAttributes(PAL); 390*0b57cec5SDimitry Andric } 391*0b57cec5SDimitry Andric 392*0b57cec5SDimitry Andric void Function::addAttributes(unsigned i, const AttrBuilder &Attrs) { 393*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 394*0b57cec5SDimitry Andric PAL = PAL.addAttributes(getContext(), i, Attrs); 395*0b57cec5SDimitry Andric setAttributes(PAL); 396*0b57cec5SDimitry Andric } 397*0b57cec5SDimitry Andric 398*0b57cec5SDimitry Andric void Function::addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) { 399*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 400*0b57cec5SDimitry Andric PAL = PAL.addParamAttribute(getContext(), ArgNo, Kind); 401*0b57cec5SDimitry Andric setAttributes(PAL); 402*0b57cec5SDimitry Andric } 403*0b57cec5SDimitry Andric 404*0b57cec5SDimitry Andric void Function::addParamAttr(unsigned ArgNo, Attribute Attr) { 405*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 406*0b57cec5SDimitry Andric PAL = PAL.addParamAttribute(getContext(), ArgNo, Attr); 407*0b57cec5SDimitry Andric setAttributes(PAL); 408*0b57cec5SDimitry Andric } 409*0b57cec5SDimitry Andric 410*0b57cec5SDimitry Andric void Function::addParamAttrs(unsigned ArgNo, const AttrBuilder &Attrs) { 411*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 412*0b57cec5SDimitry Andric PAL = PAL.addParamAttributes(getContext(), ArgNo, Attrs); 413*0b57cec5SDimitry Andric setAttributes(PAL); 414*0b57cec5SDimitry Andric } 415*0b57cec5SDimitry Andric 416*0b57cec5SDimitry Andric void Function::removeAttribute(unsigned i, Attribute::AttrKind Kind) { 417*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 418*0b57cec5SDimitry Andric PAL = PAL.removeAttribute(getContext(), i, Kind); 419*0b57cec5SDimitry Andric setAttributes(PAL); 420*0b57cec5SDimitry Andric } 421*0b57cec5SDimitry Andric 422*0b57cec5SDimitry Andric void Function::removeAttribute(unsigned i, StringRef Kind) { 423*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 424*0b57cec5SDimitry Andric PAL = PAL.removeAttribute(getContext(), i, Kind); 425*0b57cec5SDimitry Andric setAttributes(PAL); 426*0b57cec5SDimitry Andric } 427*0b57cec5SDimitry Andric 428*0b57cec5SDimitry Andric void Function::removeAttributes(unsigned i, const AttrBuilder &Attrs) { 429*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 430*0b57cec5SDimitry Andric PAL = PAL.removeAttributes(getContext(), i, Attrs); 431*0b57cec5SDimitry Andric setAttributes(PAL); 432*0b57cec5SDimitry Andric } 433*0b57cec5SDimitry Andric 434*0b57cec5SDimitry Andric void Function::removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) { 435*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 436*0b57cec5SDimitry Andric PAL = PAL.removeParamAttribute(getContext(), ArgNo, Kind); 437*0b57cec5SDimitry Andric setAttributes(PAL); 438*0b57cec5SDimitry Andric } 439*0b57cec5SDimitry Andric 440*0b57cec5SDimitry Andric void Function::removeParamAttr(unsigned ArgNo, StringRef Kind) { 441*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 442*0b57cec5SDimitry Andric PAL = PAL.removeParamAttribute(getContext(), ArgNo, Kind); 443*0b57cec5SDimitry Andric setAttributes(PAL); 444*0b57cec5SDimitry Andric } 445*0b57cec5SDimitry Andric 446*0b57cec5SDimitry Andric void Function::removeParamAttrs(unsigned ArgNo, const AttrBuilder &Attrs) { 447*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 448*0b57cec5SDimitry Andric PAL = PAL.removeParamAttributes(getContext(), ArgNo, Attrs); 449*0b57cec5SDimitry Andric setAttributes(PAL); 450*0b57cec5SDimitry Andric } 451*0b57cec5SDimitry Andric 452*0b57cec5SDimitry Andric void Function::addDereferenceableAttr(unsigned i, uint64_t Bytes) { 453*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 454*0b57cec5SDimitry Andric PAL = PAL.addDereferenceableAttr(getContext(), i, Bytes); 455*0b57cec5SDimitry Andric setAttributes(PAL); 456*0b57cec5SDimitry Andric } 457*0b57cec5SDimitry Andric 458*0b57cec5SDimitry Andric void Function::addDereferenceableParamAttr(unsigned ArgNo, uint64_t Bytes) { 459*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 460*0b57cec5SDimitry Andric PAL = PAL.addDereferenceableParamAttr(getContext(), ArgNo, Bytes); 461*0b57cec5SDimitry Andric setAttributes(PAL); 462*0b57cec5SDimitry Andric } 463*0b57cec5SDimitry Andric 464*0b57cec5SDimitry Andric void Function::addDereferenceableOrNullAttr(unsigned i, uint64_t Bytes) { 465*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 466*0b57cec5SDimitry Andric PAL = PAL.addDereferenceableOrNullAttr(getContext(), i, Bytes); 467*0b57cec5SDimitry Andric setAttributes(PAL); 468*0b57cec5SDimitry Andric } 469*0b57cec5SDimitry Andric 470*0b57cec5SDimitry Andric void Function::addDereferenceableOrNullParamAttr(unsigned ArgNo, 471*0b57cec5SDimitry Andric uint64_t Bytes) { 472*0b57cec5SDimitry Andric AttributeList PAL = getAttributes(); 473*0b57cec5SDimitry Andric PAL = PAL.addDereferenceableOrNullParamAttr(getContext(), ArgNo, Bytes); 474*0b57cec5SDimitry Andric setAttributes(PAL); 475*0b57cec5SDimitry Andric } 476*0b57cec5SDimitry Andric 477*0b57cec5SDimitry Andric const std::string &Function::getGC() const { 478*0b57cec5SDimitry Andric assert(hasGC() && "Function has no collector"); 479*0b57cec5SDimitry Andric return getContext().getGC(*this); 480*0b57cec5SDimitry Andric } 481*0b57cec5SDimitry Andric 482*0b57cec5SDimitry Andric void Function::setGC(std::string Str) { 483*0b57cec5SDimitry Andric setValueSubclassDataBit(14, !Str.empty()); 484*0b57cec5SDimitry Andric getContext().setGC(*this, std::move(Str)); 485*0b57cec5SDimitry Andric } 486*0b57cec5SDimitry Andric 487*0b57cec5SDimitry Andric void Function::clearGC() { 488*0b57cec5SDimitry Andric if (!hasGC()) 489*0b57cec5SDimitry Andric return; 490*0b57cec5SDimitry Andric getContext().deleteGC(*this); 491*0b57cec5SDimitry Andric setValueSubclassDataBit(14, false); 492*0b57cec5SDimitry Andric } 493*0b57cec5SDimitry Andric 494*0b57cec5SDimitry Andric /// Copy all additional attributes (those not needed to create a Function) from 495*0b57cec5SDimitry Andric /// the Function Src to this one. 496*0b57cec5SDimitry Andric void Function::copyAttributesFrom(const Function *Src) { 497*0b57cec5SDimitry Andric GlobalObject::copyAttributesFrom(Src); 498*0b57cec5SDimitry Andric setCallingConv(Src->getCallingConv()); 499*0b57cec5SDimitry Andric setAttributes(Src->getAttributes()); 500*0b57cec5SDimitry Andric if (Src->hasGC()) 501*0b57cec5SDimitry Andric setGC(Src->getGC()); 502*0b57cec5SDimitry Andric else 503*0b57cec5SDimitry Andric clearGC(); 504*0b57cec5SDimitry Andric if (Src->hasPersonalityFn()) 505*0b57cec5SDimitry Andric setPersonalityFn(Src->getPersonalityFn()); 506*0b57cec5SDimitry Andric if (Src->hasPrefixData()) 507*0b57cec5SDimitry Andric setPrefixData(Src->getPrefixData()); 508*0b57cec5SDimitry Andric if (Src->hasPrologueData()) 509*0b57cec5SDimitry Andric setPrologueData(Src->getPrologueData()); 510*0b57cec5SDimitry Andric } 511*0b57cec5SDimitry Andric 512*0b57cec5SDimitry Andric /// Table of string intrinsic names indexed by enum value. 513*0b57cec5SDimitry Andric static const char * const IntrinsicNameTable[] = { 514*0b57cec5SDimitry Andric "not_intrinsic", 515*0b57cec5SDimitry Andric #define GET_INTRINSIC_NAME_TABLE 516*0b57cec5SDimitry Andric #include "llvm/IR/IntrinsicImpl.inc" 517*0b57cec5SDimitry Andric #undef GET_INTRINSIC_NAME_TABLE 518*0b57cec5SDimitry Andric }; 519*0b57cec5SDimitry Andric 520*0b57cec5SDimitry Andric /// Table of per-target intrinsic name tables. 521*0b57cec5SDimitry Andric #define GET_INTRINSIC_TARGET_DATA 522*0b57cec5SDimitry Andric #include "llvm/IR/IntrinsicImpl.inc" 523*0b57cec5SDimitry Andric #undef GET_INTRINSIC_TARGET_DATA 524*0b57cec5SDimitry Andric 525*0b57cec5SDimitry Andric /// Find the segment of \c IntrinsicNameTable for intrinsics with the same 526*0b57cec5SDimitry Andric /// target as \c Name, or the generic table if \c Name is not target specific. 527*0b57cec5SDimitry Andric /// 528*0b57cec5SDimitry Andric /// Returns the relevant slice of \c IntrinsicNameTable 529*0b57cec5SDimitry Andric static ArrayRef<const char *> findTargetSubtable(StringRef Name) { 530*0b57cec5SDimitry Andric assert(Name.startswith("llvm.")); 531*0b57cec5SDimitry Andric 532*0b57cec5SDimitry Andric ArrayRef<IntrinsicTargetInfo> Targets(TargetInfos); 533*0b57cec5SDimitry Andric // Drop "llvm." and take the first dotted component. That will be the target 534*0b57cec5SDimitry Andric // if this is target specific. 535*0b57cec5SDimitry Andric StringRef Target = Name.drop_front(5).split('.').first; 536*0b57cec5SDimitry Andric auto It = partition_point( 537*0b57cec5SDimitry Andric Targets, [=](const IntrinsicTargetInfo &TI) { return TI.Name < Target; }); 538*0b57cec5SDimitry Andric // We've either found the target or just fall back to the generic set, which 539*0b57cec5SDimitry Andric // is always first. 540*0b57cec5SDimitry Andric const auto &TI = It != Targets.end() && It->Name == Target ? *It : Targets[0]; 541*0b57cec5SDimitry Andric return makeArrayRef(&IntrinsicNameTable[1] + TI.Offset, TI.Count); 542*0b57cec5SDimitry Andric } 543*0b57cec5SDimitry Andric 544*0b57cec5SDimitry Andric /// This does the actual lookup of an intrinsic ID which 545*0b57cec5SDimitry Andric /// matches the given function name. 546*0b57cec5SDimitry Andric Intrinsic::ID Function::lookupIntrinsicID(StringRef Name) { 547*0b57cec5SDimitry Andric ArrayRef<const char *> NameTable = findTargetSubtable(Name); 548*0b57cec5SDimitry Andric int Idx = Intrinsic::lookupLLVMIntrinsicByName(NameTable, Name); 549*0b57cec5SDimitry Andric if (Idx == -1) 550*0b57cec5SDimitry Andric return Intrinsic::not_intrinsic; 551*0b57cec5SDimitry Andric 552*0b57cec5SDimitry Andric // Intrinsic IDs correspond to the location in IntrinsicNameTable, but we have 553*0b57cec5SDimitry Andric // an index into a sub-table. 554*0b57cec5SDimitry Andric int Adjust = NameTable.data() - IntrinsicNameTable; 555*0b57cec5SDimitry Andric Intrinsic::ID ID = static_cast<Intrinsic::ID>(Idx + Adjust); 556*0b57cec5SDimitry Andric 557*0b57cec5SDimitry Andric // If the intrinsic is not overloaded, require an exact match. If it is 558*0b57cec5SDimitry Andric // overloaded, require either exact or prefix match. 559*0b57cec5SDimitry Andric const auto MatchSize = strlen(NameTable[Idx]); 560*0b57cec5SDimitry Andric assert(Name.size() >= MatchSize && "Expected either exact or prefix match"); 561*0b57cec5SDimitry Andric bool IsExactMatch = Name.size() == MatchSize; 562*0b57cec5SDimitry Andric return IsExactMatch || isOverloaded(ID) ? ID : Intrinsic::not_intrinsic; 563*0b57cec5SDimitry Andric } 564*0b57cec5SDimitry Andric 565*0b57cec5SDimitry Andric void Function::recalculateIntrinsicID() { 566*0b57cec5SDimitry Andric StringRef Name = getName(); 567*0b57cec5SDimitry Andric if (!Name.startswith("llvm.")) { 568*0b57cec5SDimitry Andric HasLLVMReservedName = false; 569*0b57cec5SDimitry Andric IntID = Intrinsic::not_intrinsic; 570*0b57cec5SDimitry Andric return; 571*0b57cec5SDimitry Andric } 572*0b57cec5SDimitry Andric HasLLVMReservedName = true; 573*0b57cec5SDimitry Andric IntID = lookupIntrinsicID(Name); 574*0b57cec5SDimitry Andric } 575*0b57cec5SDimitry Andric 576*0b57cec5SDimitry Andric /// Returns a stable mangling for the type specified for use in the name 577*0b57cec5SDimitry Andric /// mangling scheme used by 'any' types in intrinsic signatures. The mangling 578*0b57cec5SDimitry Andric /// of named types is simply their name. Manglings for unnamed types consist 579*0b57cec5SDimitry Andric /// of a prefix ('p' for pointers, 'a' for arrays, 'f_' for functions) 580*0b57cec5SDimitry Andric /// combined with the mangling of their component types. A vararg function 581*0b57cec5SDimitry Andric /// type will have a suffix of 'vararg'. Since function types can contain 582*0b57cec5SDimitry Andric /// other function types, we close a function type mangling with suffix 'f' 583*0b57cec5SDimitry Andric /// which can't be confused with it's prefix. This ensures we don't have 584*0b57cec5SDimitry Andric /// collisions between two unrelated function types. Otherwise, you might 585*0b57cec5SDimitry Andric /// parse ffXX as f(fXX) or f(fX)X. (X is a placeholder for any other type.) 586*0b57cec5SDimitry Andric /// 587*0b57cec5SDimitry Andric static std::string getMangledTypeStr(Type* Ty) { 588*0b57cec5SDimitry Andric std::string Result; 589*0b57cec5SDimitry Andric if (PointerType* PTyp = dyn_cast<PointerType>(Ty)) { 590*0b57cec5SDimitry Andric Result += "p" + utostr(PTyp->getAddressSpace()) + 591*0b57cec5SDimitry Andric getMangledTypeStr(PTyp->getElementType()); 592*0b57cec5SDimitry Andric } else if (ArrayType* ATyp = dyn_cast<ArrayType>(Ty)) { 593*0b57cec5SDimitry Andric Result += "a" + utostr(ATyp->getNumElements()) + 594*0b57cec5SDimitry Andric getMangledTypeStr(ATyp->getElementType()); 595*0b57cec5SDimitry Andric } else if (StructType *STyp = dyn_cast<StructType>(Ty)) { 596*0b57cec5SDimitry Andric if (!STyp->isLiteral()) { 597*0b57cec5SDimitry Andric Result += "s_"; 598*0b57cec5SDimitry Andric Result += STyp->getName(); 599*0b57cec5SDimitry Andric } else { 600*0b57cec5SDimitry Andric Result += "sl_"; 601*0b57cec5SDimitry Andric for (auto Elem : STyp->elements()) 602*0b57cec5SDimitry Andric Result += getMangledTypeStr(Elem); 603*0b57cec5SDimitry Andric } 604*0b57cec5SDimitry Andric // Ensure nested structs are distinguishable. 605*0b57cec5SDimitry Andric Result += "s"; 606*0b57cec5SDimitry Andric } else if (FunctionType *FT = dyn_cast<FunctionType>(Ty)) { 607*0b57cec5SDimitry Andric Result += "f_" + getMangledTypeStr(FT->getReturnType()); 608*0b57cec5SDimitry Andric for (size_t i = 0; i < FT->getNumParams(); i++) 609*0b57cec5SDimitry Andric Result += getMangledTypeStr(FT->getParamType(i)); 610*0b57cec5SDimitry Andric if (FT->isVarArg()) 611*0b57cec5SDimitry Andric Result += "vararg"; 612*0b57cec5SDimitry Andric // Ensure nested function types are distinguishable. 613*0b57cec5SDimitry Andric Result += "f"; 614*0b57cec5SDimitry Andric } else if (isa<VectorType>(Ty)) { 615*0b57cec5SDimitry Andric Result += "v" + utostr(Ty->getVectorNumElements()) + 616*0b57cec5SDimitry Andric getMangledTypeStr(Ty->getVectorElementType()); 617*0b57cec5SDimitry Andric } else if (Ty) { 618*0b57cec5SDimitry Andric switch (Ty->getTypeID()) { 619*0b57cec5SDimitry Andric default: llvm_unreachable("Unhandled type"); 620*0b57cec5SDimitry Andric case Type::VoidTyID: Result += "isVoid"; break; 621*0b57cec5SDimitry Andric case Type::MetadataTyID: Result += "Metadata"; break; 622*0b57cec5SDimitry Andric case Type::HalfTyID: Result += "f16"; break; 623*0b57cec5SDimitry Andric case Type::FloatTyID: Result += "f32"; break; 624*0b57cec5SDimitry Andric case Type::DoubleTyID: Result += "f64"; break; 625*0b57cec5SDimitry Andric case Type::X86_FP80TyID: Result += "f80"; break; 626*0b57cec5SDimitry Andric case Type::FP128TyID: Result += "f128"; break; 627*0b57cec5SDimitry Andric case Type::PPC_FP128TyID: Result += "ppcf128"; break; 628*0b57cec5SDimitry Andric case Type::X86_MMXTyID: Result += "x86mmx"; break; 629*0b57cec5SDimitry Andric case Type::IntegerTyID: 630*0b57cec5SDimitry Andric Result += "i" + utostr(cast<IntegerType>(Ty)->getBitWidth()); 631*0b57cec5SDimitry Andric break; 632*0b57cec5SDimitry Andric } 633*0b57cec5SDimitry Andric } 634*0b57cec5SDimitry Andric return Result; 635*0b57cec5SDimitry Andric } 636*0b57cec5SDimitry Andric 637*0b57cec5SDimitry Andric StringRef Intrinsic::getName(ID id) { 638*0b57cec5SDimitry Andric assert(id < num_intrinsics && "Invalid intrinsic ID!"); 639*0b57cec5SDimitry Andric assert(!isOverloaded(id) && 640*0b57cec5SDimitry Andric "This version of getName does not support overloading"); 641*0b57cec5SDimitry Andric return IntrinsicNameTable[id]; 642*0b57cec5SDimitry Andric } 643*0b57cec5SDimitry Andric 644*0b57cec5SDimitry Andric std::string Intrinsic::getName(ID id, ArrayRef<Type*> Tys) { 645*0b57cec5SDimitry Andric assert(id < num_intrinsics && "Invalid intrinsic ID!"); 646*0b57cec5SDimitry Andric std::string Result(IntrinsicNameTable[id]); 647*0b57cec5SDimitry Andric for (Type *Ty : Tys) { 648*0b57cec5SDimitry Andric Result += "." + getMangledTypeStr(Ty); 649*0b57cec5SDimitry Andric } 650*0b57cec5SDimitry Andric return Result; 651*0b57cec5SDimitry Andric } 652*0b57cec5SDimitry Andric 653*0b57cec5SDimitry Andric /// IIT_Info - These are enumerators that describe the entries returned by the 654*0b57cec5SDimitry Andric /// getIntrinsicInfoTableEntries function. 655*0b57cec5SDimitry Andric /// 656*0b57cec5SDimitry Andric /// NOTE: This must be kept in synch with the copy in TblGen/IntrinsicEmitter! 657*0b57cec5SDimitry Andric enum IIT_Info { 658*0b57cec5SDimitry Andric // Common values should be encoded with 0-15. 659*0b57cec5SDimitry Andric IIT_Done = 0, 660*0b57cec5SDimitry Andric IIT_I1 = 1, 661*0b57cec5SDimitry Andric IIT_I8 = 2, 662*0b57cec5SDimitry Andric IIT_I16 = 3, 663*0b57cec5SDimitry Andric IIT_I32 = 4, 664*0b57cec5SDimitry Andric IIT_I64 = 5, 665*0b57cec5SDimitry Andric IIT_F16 = 6, 666*0b57cec5SDimitry Andric IIT_F32 = 7, 667*0b57cec5SDimitry Andric IIT_F64 = 8, 668*0b57cec5SDimitry Andric IIT_V2 = 9, 669*0b57cec5SDimitry Andric IIT_V4 = 10, 670*0b57cec5SDimitry Andric IIT_V8 = 11, 671*0b57cec5SDimitry Andric IIT_V16 = 12, 672*0b57cec5SDimitry Andric IIT_V32 = 13, 673*0b57cec5SDimitry Andric IIT_PTR = 14, 674*0b57cec5SDimitry Andric IIT_ARG = 15, 675*0b57cec5SDimitry Andric 676*0b57cec5SDimitry Andric // Values from 16+ are only encodable with the inefficient encoding. 677*0b57cec5SDimitry Andric IIT_V64 = 16, 678*0b57cec5SDimitry Andric IIT_MMX = 17, 679*0b57cec5SDimitry Andric IIT_TOKEN = 18, 680*0b57cec5SDimitry Andric IIT_METADATA = 19, 681*0b57cec5SDimitry Andric IIT_EMPTYSTRUCT = 20, 682*0b57cec5SDimitry Andric IIT_STRUCT2 = 21, 683*0b57cec5SDimitry Andric IIT_STRUCT3 = 22, 684*0b57cec5SDimitry Andric IIT_STRUCT4 = 23, 685*0b57cec5SDimitry Andric IIT_STRUCT5 = 24, 686*0b57cec5SDimitry Andric IIT_EXTEND_ARG = 25, 687*0b57cec5SDimitry Andric IIT_TRUNC_ARG = 26, 688*0b57cec5SDimitry Andric IIT_ANYPTR = 27, 689*0b57cec5SDimitry Andric IIT_V1 = 28, 690*0b57cec5SDimitry Andric IIT_VARARG = 29, 691*0b57cec5SDimitry Andric IIT_HALF_VEC_ARG = 30, 692*0b57cec5SDimitry Andric IIT_SAME_VEC_WIDTH_ARG = 31, 693*0b57cec5SDimitry Andric IIT_PTR_TO_ARG = 32, 694*0b57cec5SDimitry Andric IIT_PTR_TO_ELT = 33, 695*0b57cec5SDimitry Andric IIT_VEC_OF_ANYPTRS_TO_ELT = 34, 696*0b57cec5SDimitry Andric IIT_I128 = 35, 697*0b57cec5SDimitry Andric IIT_V512 = 36, 698*0b57cec5SDimitry Andric IIT_V1024 = 37, 699*0b57cec5SDimitry Andric IIT_STRUCT6 = 38, 700*0b57cec5SDimitry Andric IIT_STRUCT7 = 39, 701*0b57cec5SDimitry Andric IIT_STRUCT8 = 40, 702*0b57cec5SDimitry Andric IIT_F128 = 41, 703*0b57cec5SDimitry Andric IIT_VEC_ELEMENT = 42 704*0b57cec5SDimitry Andric }; 705*0b57cec5SDimitry Andric 706*0b57cec5SDimitry Andric static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos, 707*0b57cec5SDimitry Andric SmallVectorImpl<Intrinsic::IITDescriptor> &OutputTable) { 708*0b57cec5SDimitry Andric using namespace Intrinsic; 709*0b57cec5SDimitry Andric 710*0b57cec5SDimitry Andric IIT_Info Info = IIT_Info(Infos[NextElt++]); 711*0b57cec5SDimitry Andric unsigned StructElts = 2; 712*0b57cec5SDimitry Andric 713*0b57cec5SDimitry Andric switch (Info) { 714*0b57cec5SDimitry Andric case IIT_Done: 715*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Void, 0)); 716*0b57cec5SDimitry Andric return; 717*0b57cec5SDimitry Andric case IIT_VARARG: 718*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::VarArg, 0)); 719*0b57cec5SDimitry Andric return; 720*0b57cec5SDimitry Andric case IIT_MMX: 721*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::MMX, 0)); 722*0b57cec5SDimitry Andric return; 723*0b57cec5SDimitry Andric case IIT_TOKEN: 724*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Token, 0)); 725*0b57cec5SDimitry Andric return; 726*0b57cec5SDimitry Andric case IIT_METADATA: 727*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Metadata, 0)); 728*0b57cec5SDimitry Andric return; 729*0b57cec5SDimitry Andric case IIT_F16: 730*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Half, 0)); 731*0b57cec5SDimitry Andric return; 732*0b57cec5SDimitry Andric case IIT_F32: 733*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Float, 0)); 734*0b57cec5SDimitry Andric return; 735*0b57cec5SDimitry Andric case IIT_F64: 736*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Double, 0)); 737*0b57cec5SDimitry Andric return; 738*0b57cec5SDimitry Andric case IIT_F128: 739*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Quad, 0)); 740*0b57cec5SDimitry Andric return; 741*0b57cec5SDimitry Andric case IIT_I1: 742*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 1)); 743*0b57cec5SDimitry Andric return; 744*0b57cec5SDimitry Andric case IIT_I8: 745*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 8)); 746*0b57cec5SDimitry Andric return; 747*0b57cec5SDimitry Andric case IIT_I16: 748*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer,16)); 749*0b57cec5SDimitry Andric return; 750*0b57cec5SDimitry Andric case IIT_I32: 751*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 32)); 752*0b57cec5SDimitry Andric return; 753*0b57cec5SDimitry Andric case IIT_I64: 754*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 64)); 755*0b57cec5SDimitry Andric return; 756*0b57cec5SDimitry Andric case IIT_I128: 757*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Integer, 128)); 758*0b57cec5SDimitry Andric return; 759*0b57cec5SDimitry Andric case IIT_V1: 760*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 1)); 761*0b57cec5SDimitry Andric DecodeIITType(NextElt, Infos, OutputTable); 762*0b57cec5SDimitry Andric return; 763*0b57cec5SDimitry Andric case IIT_V2: 764*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 2)); 765*0b57cec5SDimitry Andric DecodeIITType(NextElt, Infos, OutputTable); 766*0b57cec5SDimitry Andric return; 767*0b57cec5SDimitry Andric case IIT_V4: 768*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 4)); 769*0b57cec5SDimitry Andric DecodeIITType(NextElt, Infos, OutputTable); 770*0b57cec5SDimitry Andric return; 771*0b57cec5SDimitry Andric case IIT_V8: 772*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 8)); 773*0b57cec5SDimitry Andric DecodeIITType(NextElt, Infos, OutputTable); 774*0b57cec5SDimitry Andric return; 775*0b57cec5SDimitry Andric case IIT_V16: 776*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 16)); 777*0b57cec5SDimitry Andric DecodeIITType(NextElt, Infos, OutputTable); 778*0b57cec5SDimitry Andric return; 779*0b57cec5SDimitry Andric case IIT_V32: 780*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 32)); 781*0b57cec5SDimitry Andric DecodeIITType(NextElt, Infos, OutputTable); 782*0b57cec5SDimitry Andric return; 783*0b57cec5SDimitry Andric case IIT_V64: 784*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 64)); 785*0b57cec5SDimitry Andric DecodeIITType(NextElt, Infos, OutputTable); 786*0b57cec5SDimitry Andric return; 787*0b57cec5SDimitry Andric case IIT_V512: 788*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 512)); 789*0b57cec5SDimitry Andric DecodeIITType(NextElt, Infos, OutputTable); 790*0b57cec5SDimitry Andric return; 791*0b57cec5SDimitry Andric case IIT_V1024: 792*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Vector, 1024)); 793*0b57cec5SDimitry Andric DecodeIITType(NextElt, Infos, OutputTable); 794*0b57cec5SDimitry Andric return; 795*0b57cec5SDimitry Andric case IIT_PTR: 796*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 0)); 797*0b57cec5SDimitry Andric DecodeIITType(NextElt, Infos, OutputTable); 798*0b57cec5SDimitry Andric return; 799*0b57cec5SDimitry Andric case IIT_ANYPTR: { // [ANYPTR addrspace, subtype] 800*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Pointer, 801*0b57cec5SDimitry Andric Infos[NextElt++])); 802*0b57cec5SDimitry Andric DecodeIITType(NextElt, Infos, OutputTable); 803*0b57cec5SDimitry Andric return; 804*0b57cec5SDimitry Andric } 805*0b57cec5SDimitry Andric case IIT_ARG: { 806*0b57cec5SDimitry Andric unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 807*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Argument, ArgInfo)); 808*0b57cec5SDimitry Andric return; 809*0b57cec5SDimitry Andric } 810*0b57cec5SDimitry Andric case IIT_EXTEND_ARG: { 811*0b57cec5SDimitry Andric unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 812*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::ExtendArgument, 813*0b57cec5SDimitry Andric ArgInfo)); 814*0b57cec5SDimitry Andric return; 815*0b57cec5SDimitry Andric } 816*0b57cec5SDimitry Andric case IIT_TRUNC_ARG: { 817*0b57cec5SDimitry Andric unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 818*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::TruncArgument, 819*0b57cec5SDimitry Andric ArgInfo)); 820*0b57cec5SDimitry Andric return; 821*0b57cec5SDimitry Andric } 822*0b57cec5SDimitry Andric case IIT_HALF_VEC_ARG: { 823*0b57cec5SDimitry Andric unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 824*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::HalfVecArgument, 825*0b57cec5SDimitry Andric ArgInfo)); 826*0b57cec5SDimitry Andric return; 827*0b57cec5SDimitry Andric } 828*0b57cec5SDimitry Andric case IIT_SAME_VEC_WIDTH_ARG: { 829*0b57cec5SDimitry Andric unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 830*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::SameVecWidthArgument, 831*0b57cec5SDimitry Andric ArgInfo)); 832*0b57cec5SDimitry Andric return; 833*0b57cec5SDimitry Andric } 834*0b57cec5SDimitry Andric case IIT_PTR_TO_ARG: { 835*0b57cec5SDimitry Andric unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 836*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::PtrToArgument, 837*0b57cec5SDimitry Andric ArgInfo)); 838*0b57cec5SDimitry Andric return; 839*0b57cec5SDimitry Andric } 840*0b57cec5SDimitry Andric case IIT_PTR_TO_ELT: { 841*0b57cec5SDimitry Andric unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 842*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::PtrToElt, ArgInfo)); 843*0b57cec5SDimitry Andric return; 844*0b57cec5SDimitry Andric } 845*0b57cec5SDimitry Andric case IIT_VEC_OF_ANYPTRS_TO_ELT: { 846*0b57cec5SDimitry Andric unsigned short ArgNo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 847*0b57cec5SDimitry Andric unsigned short RefNo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 848*0b57cec5SDimitry Andric OutputTable.push_back( 849*0b57cec5SDimitry Andric IITDescriptor::get(IITDescriptor::VecOfAnyPtrsToElt, ArgNo, RefNo)); 850*0b57cec5SDimitry Andric return; 851*0b57cec5SDimitry Andric } 852*0b57cec5SDimitry Andric case IIT_EMPTYSTRUCT: 853*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Struct, 0)); 854*0b57cec5SDimitry Andric return; 855*0b57cec5SDimitry Andric case IIT_STRUCT8: ++StructElts; LLVM_FALLTHROUGH; 856*0b57cec5SDimitry Andric case IIT_STRUCT7: ++StructElts; LLVM_FALLTHROUGH; 857*0b57cec5SDimitry Andric case IIT_STRUCT6: ++StructElts; LLVM_FALLTHROUGH; 858*0b57cec5SDimitry Andric case IIT_STRUCT5: ++StructElts; LLVM_FALLTHROUGH; 859*0b57cec5SDimitry Andric case IIT_STRUCT4: ++StructElts; LLVM_FALLTHROUGH; 860*0b57cec5SDimitry Andric case IIT_STRUCT3: ++StructElts; LLVM_FALLTHROUGH; 861*0b57cec5SDimitry Andric case IIT_STRUCT2: { 862*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::Struct,StructElts)); 863*0b57cec5SDimitry Andric 864*0b57cec5SDimitry Andric for (unsigned i = 0; i != StructElts; ++i) 865*0b57cec5SDimitry Andric DecodeIITType(NextElt, Infos, OutputTable); 866*0b57cec5SDimitry Andric return; 867*0b57cec5SDimitry Andric } 868*0b57cec5SDimitry Andric case IIT_VEC_ELEMENT: { 869*0b57cec5SDimitry Andric unsigned ArgInfo = (NextElt == Infos.size() ? 0 : Infos[NextElt++]); 870*0b57cec5SDimitry Andric OutputTable.push_back(IITDescriptor::get(IITDescriptor::VecElementArgument, 871*0b57cec5SDimitry Andric ArgInfo)); 872*0b57cec5SDimitry Andric return; 873*0b57cec5SDimitry Andric } 874*0b57cec5SDimitry Andric } 875*0b57cec5SDimitry Andric llvm_unreachable("unhandled"); 876*0b57cec5SDimitry Andric } 877*0b57cec5SDimitry Andric 878*0b57cec5SDimitry Andric #define GET_INTRINSIC_GENERATOR_GLOBAL 879*0b57cec5SDimitry Andric #include "llvm/IR/IntrinsicImpl.inc" 880*0b57cec5SDimitry Andric #undef GET_INTRINSIC_GENERATOR_GLOBAL 881*0b57cec5SDimitry Andric 882*0b57cec5SDimitry Andric void Intrinsic::getIntrinsicInfoTableEntries(ID id, 883*0b57cec5SDimitry Andric SmallVectorImpl<IITDescriptor> &T){ 884*0b57cec5SDimitry Andric // Check to see if the intrinsic's type was expressible by the table. 885*0b57cec5SDimitry Andric unsigned TableVal = IIT_Table[id-1]; 886*0b57cec5SDimitry Andric 887*0b57cec5SDimitry Andric // Decode the TableVal into an array of IITValues. 888*0b57cec5SDimitry Andric SmallVector<unsigned char, 8> IITValues; 889*0b57cec5SDimitry Andric ArrayRef<unsigned char> IITEntries; 890*0b57cec5SDimitry Andric unsigned NextElt = 0; 891*0b57cec5SDimitry Andric if ((TableVal >> 31) != 0) { 892*0b57cec5SDimitry Andric // This is an offset into the IIT_LongEncodingTable. 893*0b57cec5SDimitry Andric IITEntries = IIT_LongEncodingTable; 894*0b57cec5SDimitry Andric 895*0b57cec5SDimitry Andric // Strip sentinel bit. 896*0b57cec5SDimitry Andric NextElt = (TableVal << 1) >> 1; 897*0b57cec5SDimitry Andric } else { 898*0b57cec5SDimitry Andric // Decode the TableVal into an array of IITValues. If the entry was encoded 899*0b57cec5SDimitry Andric // into a single word in the table itself, decode it now. 900*0b57cec5SDimitry Andric do { 901*0b57cec5SDimitry Andric IITValues.push_back(TableVal & 0xF); 902*0b57cec5SDimitry Andric TableVal >>= 4; 903*0b57cec5SDimitry Andric } while (TableVal); 904*0b57cec5SDimitry Andric 905*0b57cec5SDimitry Andric IITEntries = IITValues; 906*0b57cec5SDimitry Andric NextElt = 0; 907*0b57cec5SDimitry Andric } 908*0b57cec5SDimitry Andric 909*0b57cec5SDimitry Andric // Okay, decode the table into the output vector of IITDescriptors. 910*0b57cec5SDimitry Andric DecodeIITType(NextElt, IITEntries, T); 911*0b57cec5SDimitry Andric while (NextElt != IITEntries.size() && IITEntries[NextElt] != 0) 912*0b57cec5SDimitry Andric DecodeIITType(NextElt, IITEntries, T); 913*0b57cec5SDimitry Andric } 914*0b57cec5SDimitry Andric 915*0b57cec5SDimitry Andric static Type *DecodeFixedType(ArrayRef<Intrinsic::IITDescriptor> &Infos, 916*0b57cec5SDimitry Andric ArrayRef<Type*> Tys, LLVMContext &Context) { 917*0b57cec5SDimitry Andric using namespace Intrinsic; 918*0b57cec5SDimitry Andric 919*0b57cec5SDimitry Andric IITDescriptor D = Infos.front(); 920*0b57cec5SDimitry Andric Infos = Infos.slice(1); 921*0b57cec5SDimitry Andric 922*0b57cec5SDimitry Andric switch (D.Kind) { 923*0b57cec5SDimitry Andric case IITDescriptor::Void: return Type::getVoidTy(Context); 924*0b57cec5SDimitry Andric case IITDescriptor::VarArg: return Type::getVoidTy(Context); 925*0b57cec5SDimitry Andric case IITDescriptor::MMX: return Type::getX86_MMXTy(Context); 926*0b57cec5SDimitry Andric case IITDescriptor::Token: return Type::getTokenTy(Context); 927*0b57cec5SDimitry Andric case IITDescriptor::Metadata: return Type::getMetadataTy(Context); 928*0b57cec5SDimitry Andric case IITDescriptor::Half: return Type::getHalfTy(Context); 929*0b57cec5SDimitry Andric case IITDescriptor::Float: return Type::getFloatTy(Context); 930*0b57cec5SDimitry Andric case IITDescriptor::Double: return Type::getDoubleTy(Context); 931*0b57cec5SDimitry Andric case IITDescriptor::Quad: return Type::getFP128Ty(Context); 932*0b57cec5SDimitry Andric 933*0b57cec5SDimitry Andric case IITDescriptor::Integer: 934*0b57cec5SDimitry Andric return IntegerType::get(Context, D.Integer_Width); 935*0b57cec5SDimitry Andric case IITDescriptor::Vector: 936*0b57cec5SDimitry Andric return VectorType::get(DecodeFixedType(Infos, Tys, Context),D.Vector_Width); 937*0b57cec5SDimitry Andric case IITDescriptor::Pointer: 938*0b57cec5SDimitry Andric return PointerType::get(DecodeFixedType(Infos, Tys, Context), 939*0b57cec5SDimitry Andric D.Pointer_AddressSpace); 940*0b57cec5SDimitry Andric case IITDescriptor::Struct: { 941*0b57cec5SDimitry Andric SmallVector<Type *, 8> Elts; 942*0b57cec5SDimitry Andric for (unsigned i = 0, e = D.Struct_NumElements; i != e; ++i) 943*0b57cec5SDimitry Andric Elts.push_back(DecodeFixedType(Infos, Tys, Context)); 944*0b57cec5SDimitry Andric return StructType::get(Context, Elts); 945*0b57cec5SDimitry Andric } 946*0b57cec5SDimitry Andric case IITDescriptor::Argument: 947*0b57cec5SDimitry Andric return Tys[D.getArgumentNumber()]; 948*0b57cec5SDimitry Andric case IITDescriptor::ExtendArgument: { 949*0b57cec5SDimitry Andric Type *Ty = Tys[D.getArgumentNumber()]; 950*0b57cec5SDimitry Andric if (VectorType *VTy = dyn_cast<VectorType>(Ty)) 951*0b57cec5SDimitry Andric return VectorType::getExtendedElementVectorType(VTy); 952*0b57cec5SDimitry Andric 953*0b57cec5SDimitry Andric return IntegerType::get(Context, 2 * cast<IntegerType>(Ty)->getBitWidth()); 954*0b57cec5SDimitry Andric } 955*0b57cec5SDimitry Andric case IITDescriptor::TruncArgument: { 956*0b57cec5SDimitry Andric Type *Ty = Tys[D.getArgumentNumber()]; 957*0b57cec5SDimitry Andric if (VectorType *VTy = dyn_cast<VectorType>(Ty)) 958*0b57cec5SDimitry Andric return VectorType::getTruncatedElementVectorType(VTy); 959*0b57cec5SDimitry Andric 960*0b57cec5SDimitry Andric IntegerType *ITy = cast<IntegerType>(Ty); 961*0b57cec5SDimitry Andric assert(ITy->getBitWidth() % 2 == 0); 962*0b57cec5SDimitry Andric return IntegerType::get(Context, ITy->getBitWidth() / 2); 963*0b57cec5SDimitry Andric } 964*0b57cec5SDimitry Andric case IITDescriptor::HalfVecArgument: 965*0b57cec5SDimitry Andric return VectorType::getHalfElementsVectorType(cast<VectorType>( 966*0b57cec5SDimitry Andric Tys[D.getArgumentNumber()])); 967*0b57cec5SDimitry Andric case IITDescriptor::SameVecWidthArgument: { 968*0b57cec5SDimitry Andric Type *EltTy = DecodeFixedType(Infos, Tys, Context); 969*0b57cec5SDimitry Andric Type *Ty = Tys[D.getArgumentNumber()]; 970*0b57cec5SDimitry Andric if (auto *VTy = dyn_cast<VectorType>(Ty)) 971*0b57cec5SDimitry Andric return VectorType::get(EltTy, VTy->getNumElements()); 972*0b57cec5SDimitry Andric return EltTy; 973*0b57cec5SDimitry Andric } 974*0b57cec5SDimitry Andric case IITDescriptor::PtrToArgument: { 975*0b57cec5SDimitry Andric Type *Ty = Tys[D.getArgumentNumber()]; 976*0b57cec5SDimitry Andric return PointerType::getUnqual(Ty); 977*0b57cec5SDimitry Andric } 978*0b57cec5SDimitry Andric case IITDescriptor::PtrToElt: { 979*0b57cec5SDimitry Andric Type *Ty = Tys[D.getArgumentNumber()]; 980*0b57cec5SDimitry Andric VectorType *VTy = dyn_cast<VectorType>(Ty); 981*0b57cec5SDimitry Andric if (!VTy) 982*0b57cec5SDimitry Andric llvm_unreachable("Expected an argument of Vector Type"); 983*0b57cec5SDimitry Andric Type *EltTy = VTy->getVectorElementType(); 984*0b57cec5SDimitry Andric return PointerType::getUnqual(EltTy); 985*0b57cec5SDimitry Andric } 986*0b57cec5SDimitry Andric case IITDescriptor::VecElementArgument: { 987*0b57cec5SDimitry Andric Type *Ty = Tys[D.getArgumentNumber()]; 988*0b57cec5SDimitry Andric if (VectorType *VTy = dyn_cast<VectorType>(Ty)) 989*0b57cec5SDimitry Andric return VTy->getElementType(); 990*0b57cec5SDimitry Andric llvm_unreachable("Expected an argument of Vector Type"); 991*0b57cec5SDimitry Andric } 992*0b57cec5SDimitry Andric case IITDescriptor::VecOfAnyPtrsToElt: 993*0b57cec5SDimitry Andric // Return the overloaded type (which determines the pointers address space) 994*0b57cec5SDimitry Andric return Tys[D.getOverloadArgNumber()]; 995*0b57cec5SDimitry Andric } 996*0b57cec5SDimitry Andric llvm_unreachable("unhandled"); 997*0b57cec5SDimitry Andric } 998*0b57cec5SDimitry Andric 999*0b57cec5SDimitry Andric FunctionType *Intrinsic::getType(LLVMContext &Context, 1000*0b57cec5SDimitry Andric ID id, ArrayRef<Type*> Tys) { 1001*0b57cec5SDimitry Andric SmallVector<IITDescriptor, 8> Table; 1002*0b57cec5SDimitry Andric getIntrinsicInfoTableEntries(id, Table); 1003*0b57cec5SDimitry Andric 1004*0b57cec5SDimitry Andric ArrayRef<IITDescriptor> TableRef = Table; 1005*0b57cec5SDimitry Andric Type *ResultTy = DecodeFixedType(TableRef, Tys, Context); 1006*0b57cec5SDimitry Andric 1007*0b57cec5SDimitry Andric SmallVector<Type*, 8> ArgTys; 1008*0b57cec5SDimitry Andric while (!TableRef.empty()) 1009*0b57cec5SDimitry Andric ArgTys.push_back(DecodeFixedType(TableRef, Tys, Context)); 1010*0b57cec5SDimitry Andric 1011*0b57cec5SDimitry Andric // DecodeFixedType returns Void for IITDescriptor::Void and IITDescriptor::VarArg 1012*0b57cec5SDimitry Andric // If we see void type as the type of the last argument, it is vararg intrinsic 1013*0b57cec5SDimitry Andric if (!ArgTys.empty() && ArgTys.back()->isVoidTy()) { 1014*0b57cec5SDimitry Andric ArgTys.pop_back(); 1015*0b57cec5SDimitry Andric return FunctionType::get(ResultTy, ArgTys, true); 1016*0b57cec5SDimitry Andric } 1017*0b57cec5SDimitry Andric return FunctionType::get(ResultTy, ArgTys, false); 1018*0b57cec5SDimitry Andric } 1019*0b57cec5SDimitry Andric 1020*0b57cec5SDimitry Andric bool Intrinsic::isOverloaded(ID id) { 1021*0b57cec5SDimitry Andric #define GET_INTRINSIC_OVERLOAD_TABLE 1022*0b57cec5SDimitry Andric #include "llvm/IR/IntrinsicImpl.inc" 1023*0b57cec5SDimitry Andric #undef GET_INTRINSIC_OVERLOAD_TABLE 1024*0b57cec5SDimitry Andric } 1025*0b57cec5SDimitry Andric 1026*0b57cec5SDimitry Andric bool Intrinsic::isLeaf(ID id) { 1027*0b57cec5SDimitry Andric switch (id) { 1028*0b57cec5SDimitry Andric default: 1029*0b57cec5SDimitry Andric return true; 1030*0b57cec5SDimitry Andric 1031*0b57cec5SDimitry Andric case Intrinsic::experimental_gc_statepoint: 1032*0b57cec5SDimitry Andric case Intrinsic::experimental_patchpoint_void: 1033*0b57cec5SDimitry Andric case Intrinsic::experimental_patchpoint_i64: 1034*0b57cec5SDimitry Andric return false; 1035*0b57cec5SDimitry Andric } 1036*0b57cec5SDimitry Andric } 1037*0b57cec5SDimitry Andric 1038*0b57cec5SDimitry Andric /// This defines the "Intrinsic::getAttributes(ID id)" method. 1039*0b57cec5SDimitry Andric #define GET_INTRINSIC_ATTRIBUTES 1040*0b57cec5SDimitry Andric #include "llvm/IR/IntrinsicImpl.inc" 1041*0b57cec5SDimitry Andric #undef GET_INTRINSIC_ATTRIBUTES 1042*0b57cec5SDimitry Andric 1043*0b57cec5SDimitry Andric Function *Intrinsic::getDeclaration(Module *M, ID id, ArrayRef<Type*> Tys) { 1044*0b57cec5SDimitry Andric // There can never be multiple globals with the same name of different types, 1045*0b57cec5SDimitry Andric // because intrinsics must be a specific type. 1046*0b57cec5SDimitry Andric return cast<Function>( 1047*0b57cec5SDimitry Andric M->getOrInsertFunction(getName(id, Tys), 1048*0b57cec5SDimitry Andric getType(M->getContext(), id, Tys)) 1049*0b57cec5SDimitry Andric .getCallee()); 1050*0b57cec5SDimitry Andric } 1051*0b57cec5SDimitry Andric 1052*0b57cec5SDimitry Andric // This defines the "Intrinsic::getIntrinsicForGCCBuiltin()" method. 1053*0b57cec5SDimitry Andric #define GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN 1054*0b57cec5SDimitry Andric #include "llvm/IR/IntrinsicImpl.inc" 1055*0b57cec5SDimitry Andric #undef GET_LLVM_INTRINSIC_FOR_GCC_BUILTIN 1056*0b57cec5SDimitry Andric 1057*0b57cec5SDimitry Andric // This defines the "Intrinsic::getIntrinsicForMSBuiltin()" method. 1058*0b57cec5SDimitry Andric #define GET_LLVM_INTRINSIC_FOR_MS_BUILTIN 1059*0b57cec5SDimitry Andric #include "llvm/IR/IntrinsicImpl.inc" 1060*0b57cec5SDimitry Andric #undef GET_LLVM_INTRINSIC_FOR_MS_BUILTIN 1061*0b57cec5SDimitry Andric 1062*0b57cec5SDimitry Andric using DeferredIntrinsicMatchPair = 1063*0b57cec5SDimitry Andric std::pair<Type *, ArrayRef<Intrinsic::IITDescriptor>>; 1064*0b57cec5SDimitry Andric 1065*0b57cec5SDimitry Andric static bool matchIntrinsicType( 1066*0b57cec5SDimitry Andric Type *Ty, ArrayRef<Intrinsic::IITDescriptor> &Infos, 1067*0b57cec5SDimitry Andric SmallVectorImpl<Type *> &ArgTys, 1068*0b57cec5SDimitry Andric SmallVectorImpl<DeferredIntrinsicMatchPair> &DeferredChecks, 1069*0b57cec5SDimitry Andric bool IsDeferredCheck) { 1070*0b57cec5SDimitry Andric using namespace Intrinsic; 1071*0b57cec5SDimitry Andric 1072*0b57cec5SDimitry Andric // If we ran out of descriptors, there are too many arguments. 1073*0b57cec5SDimitry Andric if (Infos.empty()) return true; 1074*0b57cec5SDimitry Andric 1075*0b57cec5SDimitry Andric // Do this before slicing off the 'front' part 1076*0b57cec5SDimitry Andric auto InfosRef = Infos; 1077*0b57cec5SDimitry Andric auto DeferCheck = [&DeferredChecks, &InfosRef](Type *T) { 1078*0b57cec5SDimitry Andric DeferredChecks.emplace_back(T, InfosRef); 1079*0b57cec5SDimitry Andric return false; 1080*0b57cec5SDimitry Andric }; 1081*0b57cec5SDimitry Andric 1082*0b57cec5SDimitry Andric IITDescriptor D = Infos.front(); 1083*0b57cec5SDimitry Andric Infos = Infos.slice(1); 1084*0b57cec5SDimitry Andric 1085*0b57cec5SDimitry Andric switch (D.Kind) { 1086*0b57cec5SDimitry Andric case IITDescriptor::Void: return !Ty->isVoidTy(); 1087*0b57cec5SDimitry Andric case IITDescriptor::VarArg: return true; 1088*0b57cec5SDimitry Andric case IITDescriptor::MMX: return !Ty->isX86_MMXTy(); 1089*0b57cec5SDimitry Andric case IITDescriptor::Token: return !Ty->isTokenTy(); 1090*0b57cec5SDimitry Andric case IITDescriptor::Metadata: return !Ty->isMetadataTy(); 1091*0b57cec5SDimitry Andric case IITDescriptor::Half: return !Ty->isHalfTy(); 1092*0b57cec5SDimitry Andric case IITDescriptor::Float: return !Ty->isFloatTy(); 1093*0b57cec5SDimitry Andric case IITDescriptor::Double: return !Ty->isDoubleTy(); 1094*0b57cec5SDimitry Andric case IITDescriptor::Quad: return !Ty->isFP128Ty(); 1095*0b57cec5SDimitry Andric case IITDescriptor::Integer: return !Ty->isIntegerTy(D.Integer_Width); 1096*0b57cec5SDimitry Andric case IITDescriptor::Vector: { 1097*0b57cec5SDimitry Andric VectorType *VT = dyn_cast<VectorType>(Ty); 1098*0b57cec5SDimitry Andric return !VT || VT->getNumElements() != D.Vector_Width || 1099*0b57cec5SDimitry Andric matchIntrinsicType(VT->getElementType(), Infos, ArgTys, 1100*0b57cec5SDimitry Andric DeferredChecks, IsDeferredCheck); 1101*0b57cec5SDimitry Andric } 1102*0b57cec5SDimitry Andric case IITDescriptor::Pointer: { 1103*0b57cec5SDimitry Andric PointerType *PT = dyn_cast<PointerType>(Ty); 1104*0b57cec5SDimitry Andric return !PT || PT->getAddressSpace() != D.Pointer_AddressSpace || 1105*0b57cec5SDimitry Andric matchIntrinsicType(PT->getElementType(), Infos, ArgTys, 1106*0b57cec5SDimitry Andric DeferredChecks, IsDeferredCheck); 1107*0b57cec5SDimitry Andric } 1108*0b57cec5SDimitry Andric 1109*0b57cec5SDimitry Andric case IITDescriptor::Struct: { 1110*0b57cec5SDimitry Andric StructType *ST = dyn_cast<StructType>(Ty); 1111*0b57cec5SDimitry Andric if (!ST || ST->getNumElements() != D.Struct_NumElements) 1112*0b57cec5SDimitry Andric return true; 1113*0b57cec5SDimitry Andric 1114*0b57cec5SDimitry Andric for (unsigned i = 0, e = D.Struct_NumElements; i != e; ++i) 1115*0b57cec5SDimitry Andric if (matchIntrinsicType(ST->getElementType(i), Infos, ArgTys, 1116*0b57cec5SDimitry Andric DeferredChecks, IsDeferredCheck)) 1117*0b57cec5SDimitry Andric return true; 1118*0b57cec5SDimitry Andric return false; 1119*0b57cec5SDimitry Andric } 1120*0b57cec5SDimitry Andric 1121*0b57cec5SDimitry Andric case IITDescriptor::Argument: 1122*0b57cec5SDimitry Andric // If this is the second occurrence of an argument, 1123*0b57cec5SDimitry Andric // verify that the later instance matches the previous instance. 1124*0b57cec5SDimitry Andric if (D.getArgumentNumber() < ArgTys.size()) 1125*0b57cec5SDimitry Andric return Ty != ArgTys[D.getArgumentNumber()]; 1126*0b57cec5SDimitry Andric 1127*0b57cec5SDimitry Andric if (D.getArgumentNumber() > ArgTys.size() || 1128*0b57cec5SDimitry Andric D.getArgumentKind() == IITDescriptor::AK_MatchType) 1129*0b57cec5SDimitry Andric return IsDeferredCheck || DeferCheck(Ty); 1130*0b57cec5SDimitry Andric 1131*0b57cec5SDimitry Andric assert(D.getArgumentNumber() == ArgTys.size() && !IsDeferredCheck && 1132*0b57cec5SDimitry Andric "Table consistency error"); 1133*0b57cec5SDimitry Andric ArgTys.push_back(Ty); 1134*0b57cec5SDimitry Andric 1135*0b57cec5SDimitry Andric switch (D.getArgumentKind()) { 1136*0b57cec5SDimitry Andric case IITDescriptor::AK_Any: return false; // Success 1137*0b57cec5SDimitry Andric case IITDescriptor::AK_AnyInteger: return !Ty->isIntOrIntVectorTy(); 1138*0b57cec5SDimitry Andric case IITDescriptor::AK_AnyFloat: return !Ty->isFPOrFPVectorTy(); 1139*0b57cec5SDimitry Andric case IITDescriptor::AK_AnyVector: return !isa<VectorType>(Ty); 1140*0b57cec5SDimitry Andric case IITDescriptor::AK_AnyPointer: return !isa<PointerType>(Ty); 1141*0b57cec5SDimitry Andric default: break; 1142*0b57cec5SDimitry Andric } 1143*0b57cec5SDimitry Andric llvm_unreachable("all argument kinds not covered"); 1144*0b57cec5SDimitry Andric 1145*0b57cec5SDimitry Andric case IITDescriptor::ExtendArgument: { 1146*0b57cec5SDimitry Andric // If this is a forward reference, defer the check for later. 1147*0b57cec5SDimitry Andric if (D.getArgumentNumber() >= ArgTys.size()) 1148*0b57cec5SDimitry Andric return IsDeferredCheck || DeferCheck(Ty); 1149*0b57cec5SDimitry Andric 1150*0b57cec5SDimitry Andric Type *NewTy = ArgTys[D.getArgumentNumber()]; 1151*0b57cec5SDimitry Andric if (VectorType *VTy = dyn_cast<VectorType>(NewTy)) 1152*0b57cec5SDimitry Andric NewTy = VectorType::getExtendedElementVectorType(VTy); 1153*0b57cec5SDimitry Andric else if (IntegerType *ITy = dyn_cast<IntegerType>(NewTy)) 1154*0b57cec5SDimitry Andric NewTy = IntegerType::get(ITy->getContext(), 2 * ITy->getBitWidth()); 1155*0b57cec5SDimitry Andric else 1156*0b57cec5SDimitry Andric return true; 1157*0b57cec5SDimitry Andric 1158*0b57cec5SDimitry Andric return Ty != NewTy; 1159*0b57cec5SDimitry Andric } 1160*0b57cec5SDimitry Andric case IITDescriptor::TruncArgument: { 1161*0b57cec5SDimitry Andric // If this is a forward reference, defer the check for later. 1162*0b57cec5SDimitry Andric if (D.getArgumentNumber() >= ArgTys.size()) 1163*0b57cec5SDimitry Andric return IsDeferredCheck || DeferCheck(Ty); 1164*0b57cec5SDimitry Andric 1165*0b57cec5SDimitry Andric Type *NewTy = ArgTys[D.getArgumentNumber()]; 1166*0b57cec5SDimitry Andric if (VectorType *VTy = dyn_cast<VectorType>(NewTy)) 1167*0b57cec5SDimitry Andric NewTy = VectorType::getTruncatedElementVectorType(VTy); 1168*0b57cec5SDimitry Andric else if (IntegerType *ITy = dyn_cast<IntegerType>(NewTy)) 1169*0b57cec5SDimitry Andric NewTy = IntegerType::get(ITy->getContext(), ITy->getBitWidth() / 2); 1170*0b57cec5SDimitry Andric else 1171*0b57cec5SDimitry Andric return true; 1172*0b57cec5SDimitry Andric 1173*0b57cec5SDimitry Andric return Ty != NewTy; 1174*0b57cec5SDimitry Andric } 1175*0b57cec5SDimitry Andric case IITDescriptor::HalfVecArgument: 1176*0b57cec5SDimitry Andric // If this is a forward reference, defer the check for later. 1177*0b57cec5SDimitry Andric return D.getArgumentNumber() >= ArgTys.size() || 1178*0b57cec5SDimitry Andric !isa<VectorType>(ArgTys[D.getArgumentNumber()]) || 1179*0b57cec5SDimitry Andric VectorType::getHalfElementsVectorType( 1180*0b57cec5SDimitry Andric cast<VectorType>(ArgTys[D.getArgumentNumber()])) != Ty; 1181*0b57cec5SDimitry Andric case IITDescriptor::SameVecWidthArgument: { 1182*0b57cec5SDimitry Andric if (D.getArgumentNumber() >= ArgTys.size()) { 1183*0b57cec5SDimitry Andric // Defer check and subsequent check for the vector element type. 1184*0b57cec5SDimitry Andric Infos = Infos.slice(1); 1185*0b57cec5SDimitry Andric return IsDeferredCheck || DeferCheck(Ty); 1186*0b57cec5SDimitry Andric } 1187*0b57cec5SDimitry Andric auto *ReferenceType = dyn_cast<VectorType>(ArgTys[D.getArgumentNumber()]); 1188*0b57cec5SDimitry Andric auto *ThisArgType = dyn_cast<VectorType>(Ty); 1189*0b57cec5SDimitry Andric // Both must be vectors of the same number of elements or neither. 1190*0b57cec5SDimitry Andric if ((ReferenceType != nullptr) != (ThisArgType != nullptr)) 1191*0b57cec5SDimitry Andric return true; 1192*0b57cec5SDimitry Andric Type *EltTy = Ty; 1193*0b57cec5SDimitry Andric if (ThisArgType) { 1194*0b57cec5SDimitry Andric if (ReferenceType->getVectorNumElements() != 1195*0b57cec5SDimitry Andric ThisArgType->getVectorNumElements()) 1196*0b57cec5SDimitry Andric return true; 1197*0b57cec5SDimitry Andric EltTy = ThisArgType->getVectorElementType(); 1198*0b57cec5SDimitry Andric } 1199*0b57cec5SDimitry Andric return matchIntrinsicType(EltTy, Infos, ArgTys, DeferredChecks, 1200*0b57cec5SDimitry Andric IsDeferredCheck); 1201*0b57cec5SDimitry Andric } 1202*0b57cec5SDimitry Andric case IITDescriptor::PtrToArgument: { 1203*0b57cec5SDimitry Andric if (D.getArgumentNumber() >= ArgTys.size()) 1204*0b57cec5SDimitry Andric return IsDeferredCheck || DeferCheck(Ty); 1205*0b57cec5SDimitry Andric Type * ReferenceType = ArgTys[D.getArgumentNumber()]; 1206*0b57cec5SDimitry Andric PointerType *ThisArgType = dyn_cast<PointerType>(Ty); 1207*0b57cec5SDimitry Andric return (!ThisArgType || ThisArgType->getElementType() != ReferenceType); 1208*0b57cec5SDimitry Andric } 1209*0b57cec5SDimitry Andric case IITDescriptor::PtrToElt: { 1210*0b57cec5SDimitry Andric if (D.getArgumentNumber() >= ArgTys.size()) 1211*0b57cec5SDimitry Andric return IsDeferredCheck || DeferCheck(Ty); 1212*0b57cec5SDimitry Andric VectorType * ReferenceType = 1213*0b57cec5SDimitry Andric dyn_cast<VectorType> (ArgTys[D.getArgumentNumber()]); 1214*0b57cec5SDimitry Andric PointerType *ThisArgType = dyn_cast<PointerType>(Ty); 1215*0b57cec5SDimitry Andric 1216*0b57cec5SDimitry Andric return (!ThisArgType || !ReferenceType || 1217*0b57cec5SDimitry Andric ThisArgType->getElementType() != ReferenceType->getElementType()); 1218*0b57cec5SDimitry Andric } 1219*0b57cec5SDimitry Andric case IITDescriptor::VecOfAnyPtrsToElt: { 1220*0b57cec5SDimitry Andric unsigned RefArgNumber = D.getRefArgNumber(); 1221*0b57cec5SDimitry Andric if (RefArgNumber >= ArgTys.size()) { 1222*0b57cec5SDimitry Andric if (IsDeferredCheck) 1223*0b57cec5SDimitry Andric return true; 1224*0b57cec5SDimitry Andric // If forward referencing, already add the pointer-vector type and 1225*0b57cec5SDimitry Andric // defer the checks for later. 1226*0b57cec5SDimitry Andric ArgTys.push_back(Ty); 1227*0b57cec5SDimitry Andric return DeferCheck(Ty); 1228*0b57cec5SDimitry Andric } 1229*0b57cec5SDimitry Andric 1230*0b57cec5SDimitry Andric if (!IsDeferredCheck){ 1231*0b57cec5SDimitry Andric assert(D.getOverloadArgNumber() == ArgTys.size() && 1232*0b57cec5SDimitry Andric "Table consistency error"); 1233*0b57cec5SDimitry Andric ArgTys.push_back(Ty); 1234*0b57cec5SDimitry Andric } 1235*0b57cec5SDimitry Andric 1236*0b57cec5SDimitry Andric // Verify the overloaded type "matches" the Ref type. 1237*0b57cec5SDimitry Andric // i.e. Ty is a vector with the same width as Ref. 1238*0b57cec5SDimitry Andric // Composed of pointers to the same element type as Ref. 1239*0b57cec5SDimitry Andric VectorType *ReferenceType = dyn_cast<VectorType>(ArgTys[RefArgNumber]); 1240*0b57cec5SDimitry Andric VectorType *ThisArgVecTy = dyn_cast<VectorType>(Ty); 1241*0b57cec5SDimitry Andric if (!ThisArgVecTy || !ReferenceType || 1242*0b57cec5SDimitry Andric (ReferenceType->getVectorNumElements() != 1243*0b57cec5SDimitry Andric ThisArgVecTy->getVectorNumElements())) 1244*0b57cec5SDimitry Andric return true; 1245*0b57cec5SDimitry Andric PointerType *ThisArgEltTy = 1246*0b57cec5SDimitry Andric dyn_cast<PointerType>(ThisArgVecTy->getVectorElementType()); 1247*0b57cec5SDimitry Andric if (!ThisArgEltTy) 1248*0b57cec5SDimitry Andric return true; 1249*0b57cec5SDimitry Andric return ThisArgEltTy->getElementType() != 1250*0b57cec5SDimitry Andric ReferenceType->getVectorElementType(); 1251*0b57cec5SDimitry Andric } 1252*0b57cec5SDimitry Andric case IITDescriptor::VecElementArgument: { 1253*0b57cec5SDimitry Andric if (D.getArgumentNumber() >= ArgTys.size()) 1254*0b57cec5SDimitry Andric return IsDeferredCheck ? true : DeferCheck(Ty); 1255*0b57cec5SDimitry Andric auto *ReferenceType = dyn_cast<VectorType>(ArgTys[D.getArgumentNumber()]); 1256*0b57cec5SDimitry Andric return !ReferenceType || Ty != ReferenceType->getElementType(); 1257*0b57cec5SDimitry Andric } 1258*0b57cec5SDimitry Andric } 1259*0b57cec5SDimitry Andric llvm_unreachable("unhandled"); 1260*0b57cec5SDimitry Andric } 1261*0b57cec5SDimitry Andric 1262*0b57cec5SDimitry Andric Intrinsic::MatchIntrinsicTypesResult 1263*0b57cec5SDimitry Andric Intrinsic::matchIntrinsicSignature(FunctionType *FTy, 1264*0b57cec5SDimitry Andric ArrayRef<Intrinsic::IITDescriptor> &Infos, 1265*0b57cec5SDimitry Andric SmallVectorImpl<Type *> &ArgTys) { 1266*0b57cec5SDimitry Andric SmallVector<DeferredIntrinsicMatchPair, 2> DeferredChecks; 1267*0b57cec5SDimitry Andric if (matchIntrinsicType(FTy->getReturnType(), Infos, ArgTys, DeferredChecks, 1268*0b57cec5SDimitry Andric false)) 1269*0b57cec5SDimitry Andric return MatchIntrinsicTypes_NoMatchRet; 1270*0b57cec5SDimitry Andric 1271*0b57cec5SDimitry Andric unsigned NumDeferredReturnChecks = DeferredChecks.size(); 1272*0b57cec5SDimitry Andric 1273*0b57cec5SDimitry Andric for (auto Ty : FTy->params()) 1274*0b57cec5SDimitry Andric if (matchIntrinsicType(Ty, Infos, ArgTys, DeferredChecks, false)) 1275*0b57cec5SDimitry Andric return MatchIntrinsicTypes_NoMatchArg; 1276*0b57cec5SDimitry Andric 1277*0b57cec5SDimitry Andric for (unsigned I = 0, E = DeferredChecks.size(); I != E; ++I) { 1278*0b57cec5SDimitry Andric DeferredIntrinsicMatchPair &Check = DeferredChecks[I]; 1279*0b57cec5SDimitry Andric if (matchIntrinsicType(Check.first, Check.second, ArgTys, DeferredChecks, 1280*0b57cec5SDimitry Andric true)) 1281*0b57cec5SDimitry Andric return I < NumDeferredReturnChecks ? MatchIntrinsicTypes_NoMatchRet 1282*0b57cec5SDimitry Andric : MatchIntrinsicTypes_NoMatchArg; 1283*0b57cec5SDimitry Andric } 1284*0b57cec5SDimitry Andric 1285*0b57cec5SDimitry Andric return MatchIntrinsicTypes_Match; 1286*0b57cec5SDimitry Andric } 1287*0b57cec5SDimitry Andric 1288*0b57cec5SDimitry Andric bool 1289*0b57cec5SDimitry Andric Intrinsic::matchIntrinsicVarArg(bool isVarArg, 1290*0b57cec5SDimitry Andric ArrayRef<Intrinsic::IITDescriptor> &Infos) { 1291*0b57cec5SDimitry Andric // If there are no descriptors left, then it can't be a vararg. 1292*0b57cec5SDimitry Andric if (Infos.empty()) 1293*0b57cec5SDimitry Andric return isVarArg; 1294*0b57cec5SDimitry Andric 1295*0b57cec5SDimitry Andric // There should be only one descriptor remaining at this point. 1296*0b57cec5SDimitry Andric if (Infos.size() != 1) 1297*0b57cec5SDimitry Andric return true; 1298*0b57cec5SDimitry Andric 1299*0b57cec5SDimitry Andric // Check and verify the descriptor. 1300*0b57cec5SDimitry Andric IITDescriptor D = Infos.front(); 1301*0b57cec5SDimitry Andric Infos = Infos.slice(1); 1302*0b57cec5SDimitry Andric if (D.Kind == IITDescriptor::VarArg) 1303*0b57cec5SDimitry Andric return !isVarArg; 1304*0b57cec5SDimitry Andric 1305*0b57cec5SDimitry Andric return true; 1306*0b57cec5SDimitry Andric } 1307*0b57cec5SDimitry Andric 1308*0b57cec5SDimitry Andric Optional<Function*> Intrinsic::remangleIntrinsicFunction(Function *F) { 1309*0b57cec5SDimitry Andric Intrinsic::ID ID = F->getIntrinsicID(); 1310*0b57cec5SDimitry Andric if (!ID) 1311*0b57cec5SDimitry Andric return None; 1312*0b57cec5SDimitry Andric 1313*0b57cec5SDimitry Andric FunctionType *FTy = F->getFunctionType(); 1314*0b57cec5SDimitry Andric // Accumulate an array of overloaded types for the given intrinsic 1315*0b57cec5SDimitry Andric SmallVector<Type *, 4> ArgTys; 1316*0b57cec5SDimitry Andric { 1317*0b57cec5SDimitry Andric SmallVector<Intrinsic::IITDescriptor, 8> Table; 1318*0b57cec5SDimitry Andric getIntrinsicInfoTableEntries(ID, Table); 1319*0b57cec5SDimitry Andric ArrayRef<Intrinsic::IITDescriptor> TableRef = Table; 1320*0b57cec5SDimitry Andric 1321*0b57cec5SDimitry Andric if (Intrinsic::matchIntrinsicSignature(FTy, TableRef, ArgTys)) 1322*0b57cec5SDimitry Andric return None; 1323*0b57cec5SDimitry Andric if (Intrinsic::matchIntrinsicVarArg(FTy->isVarArg(), TableRef)) 1324*0b57cec5SDimitry Andric return None; 1325*0b57cec5SDimitry Andric } 1326*0b57cec5SDimitry Andric 1327*0b57cec5SDimitry Andric StringRef Name = F->getName(); 1328*0b57cec5SDimitry Andric if (Name == Intrinsic::getName(ID, ArgTys)) 1329*0b57cec5SDimitry Andric return None; 1330*0b57cec5SDimitry Andric 1331*0b57cec5SDimitry Andric auto NewDecl = Intrinsic::getDeclaration(F->getParent(), ID, ArgTys); 1332*0b57cec5SDimitry Andric NewDecl->setCallingConv(F->getCallingConv()); 1333*0b57cec5SDimitry Andric assert(NewDecl->getFunctionType() == FTy && "Shouldn't change the signature"); 1334*0b57cec5SDimitry Andric return NewDecl; 1335*0b57cec5SDimitry Andric } 1336*0b57cec5SDimitry Andric 1337*0b57cec5SDimitry Andric /// hasAddressTaken - returns true if there are any uses of this function 1338*0b57cec5SDimitry Andric /// other than direct calls or invokes to it. 1339*0b57cec5SDimitry Andric bool Function::hasAddressTaken(const User* *PutOffender) const { 1340*0b57cec5SDimitry Andric for (const Use &U : uses()) { 1341*0b57cec5SDimitry Andric const User *FU = U.getUser(); 1342*0b57cec5SDimitry Andric if (isa<BlockAddress>(FU)) 1343*0b57cec5SDimitry Andric continue; 1344*0b57cec5SDimitry Andric const auto *Call = dyn_cast<CallBase>(FU); 1345*0b57cec5SDimitry Andric if (!Call) { 1346*0b57cec5SDimitry Andric if (PutOffender) 1347*0b57cec5SDimitry Andric *PutOffender = FU; 1348*0b57cec5SDimitry Andric return true; 1349*0b57cec5SDimitry Andric } 1350*0b57cec5SDimitry Andric if (!Call->isCallee(&U)) { 1351*0b57cec5SDimitry Andric if (PutOffender) 1352*0b57cec5SDimitry Andric *PutOffender = FU; 1353*0b57cec5SDimitry Andric return true; 1354*0b57cec5SDimitry Andric } 1355*0b57cec5SDimitry Andric } 1356*0b57cec5SDimitry Andric return false; 1357*0b57cec5SDimitry Andric } 1358*0b57cec5SDimitry Andric 1359*0b57cec5SDimitry Andric bool Function::isDefTriviallyDead() const { 1360*0b57cec5SDimitry Andric // Check the linkage 1361*0b57cec5SDimitry Andric if (!hasLinkOnceLinkage() && !hasLocalLinkage() && 1362*0b57cec5SDimitry Andric !hasAvailableExternallyLinkage()) 1363*0b57cec5SDimitry Andric return false; 1364*0b57cec5SDimitry Andric 1365*0b57cec5SDimitry Andric // Check if the function is used by anything other than a blockaddress. 1366*0b57cec5SDimitry Andric for (const User *U : users()) 1367*0b57cec5SDimitry Andric if (!isa<BlockAddress>(U)) 1368*0b57cec5SDimitry Andric return false; 1369*0b57cec5SDimitry Andric 1370*0b57cec5SDimitry Andric return true; 1371*0b57cec5SDimitry Andric } 1372*0b57cec5SDimitry Andric 1373*0b57cec5SDimitry Andric /// callsFunctionThatReturnsTwice - Return true if the function has a call to 1374*0b57cec5SDimitry Andric /// setjmp or other function that gcc recognizes as "returning twice". 1375*0b57cec5SDimitry Andric bool Function::callsFunctionThatReturnsTwice() const { 1376*0b57cec5SDimitry Andric for (const Instruction &I : instructions(this)) 1377*0b57cec5SDimitry Andric if (const auto *Call = dyn_cast<CallBase>(&I)) 1378*0b57cec5SDimitry Andric if (Call->hasFnAttr(Attribute::ReturnsTwice)) 1379*0b57cec5SDimitry Andric return true; 1380*0b57cec5SDimitry Andric 1381*0b57cec5SDimitry Andric return false; 1382*0b57cec5SDimitry Andric } 1383*0b57cec5SDimitry Andric 1384*0b57cec5SDimitry Andric Constant *Function::getPersonalityFn() const { 1385*0b57cec5SDimitry Andric assert(hasPersonalityFn() && getNumOperands()); 1386*0b57cec5SDimitry Andric return cast<Constant>(Op<0>()); 1387*0b57cec5SDimitry Andric } 1388*0b57cec5SDimitry Andric 1389*0b57cec5SDimitry Andric void Function::setPersonalityFn(Constant *Fn) { 1390*0b57cec5SDimitry Andric setHungoffOperand<0>(Fn); 1391*0b57cec5SDimitry Andric setValueSubclassDataBit(3, Fn != nullptr); 1392*0b57cec5SDimitry Andric } 1393*0b57cec5SDimitry Andric 1394*0b57cec5SDimitry Andric Constant *Function::getPrefixData() const { 1395*0b57cec5SDimitry Andric assert(hasPrefixData() && getNumOperands()); 1396*0b57cec5SDimitry Andric return cast<Constant>(Op<1>()); 1397*0b57cec5SDimitry Andric } 1398*0b57cec5SDimitry Andric 1399*0b57cec5SDimitry Andric void Function::setPrefixData(Constant *PrefixData) { 1400*0b57cec5SDimitry Andric setHungoffOperand<1>(PrefixData); 1401*0b57cec5SDimitry Andric setValueSubclassDataBit(1, PrefixData != nullptr); 1402*0b57cec5SDimitry Andric } 1403*0b57cec5SDimitry Andric 1404*0b57cec5SDimitry Andric Constant *Function::getPrologueData() const { 1405*0b57cec5SDimitry Andric assert(hasPrologueData() && getNumOperands()); 1406*0b57cec5SDimitry Andric return cast<Constant>(Op<2>()); 1407*0b57cec5SDimitry Andric } 1408*0b57cec5SDimitry Andric 1409*0b57cec5SDimitry Andric void Function::setPrologueData(Constant *PrologueData) { 1410*0b57cec5SDimitry Andric setHungoffOperand<2>(PrologueData); 1411*0b57cec5SDimitry Andric setValueSubclassDataBit(2, PrologueData != nullptr); 1412*0b57cec5SDimitry Andric } 1413*0b57cec5SDimitry Andric 1414*0b57cec5SDimitry Andric void Function::allocHungoffUselist() { 1415*0b57cec5SDimitry Andric // If we've already allocated a uselist, stop here. 1416*0b57cec5SDimitry Andric if (getNumOperands()) 1417*0b57cec5SDimitry Andric return; 1418*0b57cec5SDimitry Andric 1419*0b57cec5SDimitry Andric allocHungoffUses(3, /*IsPhi=*/ false); 1420*0b57cec5SDimitry Andric setNumHungOffUseOperands(3); 1421*0b57cec5SDimitry Andric 1422*0b57cec5SDimitry Andric // Initialize the uselist with placeholder operands to allow traversal. 1423*0b57cec5SDimitry Andric auto *CPN = ConstantPointerNull::get(Type::getInt1PtrTy(getContext(), 0)); 1424*0b57cec5SDimitry Andric Op<0>().set(CPN); 1425*0b57cec5SDimitry Andric Op<1>().set(CPN); 1426*0b57cec5SDimitry Andric Op<2>().set(CPN); 1427*0b57cec5SDimitry Andric } 1428*0b57cec5SDimitry Andric 1429*0b57cec5SDimitry Andric template <int Idx> 1430*0b57cec5SDimitry Andric void Function::setHungoffOperand(Constant *C) { 1431*0b57cec5SDimitry Andric if (C) { 1432*0b57cec5SDimitry Andric allocHungoffUselist(); 1433*0b57cec5SDimitry Andric Op<Idx>().set(C); 1434*0b57cec5SDimitry Andric } else if (getNumOperands()) { 1435*0b57cec5SDimitry Andric Op<Idx>().set( 1436*0b57cec5SDimitry Andric ConstantPointerNull::get(Type::getInt1PtrTy(getContext(), 0))); 1437*0b57cec5SDimitry Andric } 1438*0b57cec5SDimitry Andric } 1439*0b57cec5SDimitry Andric 1440*0b57cec5SDimitry Andric void Function::setValueSubclassDataBit(unsigned Bit, bool On) { 1441*0b57cec5SDimitry Andric assert(Bit < 16 && "SubclassData contains only 16 bits"); 1442*0b57cec5SDimitry Andric if (On) 1443*0b57cec5SDimitry Andric setValueSubclassData(getSubclassDataFromValue() | (1 << Bit)); 1444*0b57cec5SDimitry Andric else 1445*0b57cec5SDimitry Andric setValueSubclassData(getSubclassDataFromValue() & ~(1 << Bit)); 1446*0b57cec5SDimitry Andric } 1447*0b57cec5SDimitry Andric 1448*0b57cec5SDimitry Andric void Function::setEntryCount(ProfileCount Count, 1449*0b57cec5SDimitry Andric const DenseSet<GlobalValue::GUID> *S) { 1450*0b57cec5SDimitry Andric assert(Count.hasValue()); 1451*0b57cec5SDimitry Andric #if !defined(NDEBUG) 1452*0b57cec5SDimitry Andric auto PrevCount = getEntryCount(); 1453*0b57cec5SDimitry Andric assert(!PrevCount.hasValue() || PrevCount.getType() == Count.getType()); 1454*0b57cec5SDimitry Andric #endif 1455*0b57cec5SDimitry Andric MDBuilder MDB(getContext()); 1456*0b57cec5SDimitry Andric setMetadata( 1457*0b57cec5SDimitry Andric LLVMContext::MD_prof, 1458*0b57cec5SDimitry Andric MDB.createFunctionEntryCount(Count.getCount(), Count.isSynthetic(), S)); 1459*0b57cec5SDimitry Andric } 1460*0b57cec5SDimitry Andric 1461*0b57cec5SDimitry Andric void Function::setEntryCount(uint64_t Count, Function::ProfileCountType Type, 1462*0b57cec5SDimitry Andric const DenseSet<GlobalValue::GUID> *Imports) { 1463*0b57cec5SDimitry Andric setEntryCount(ProfileCount(Count, Type), Imports); 1464*0b57cec5SDimitry Andric } 1465*0b57cec5SDimitry Andric 1466*0b57cec5SDimitry Andric ProfileCount Function::getEntryCount(bool AllowSynthetic) const { 1467*0b57cec5SDimitry Andric MDNode *MD = getMetadata(LLVMContext::MD_prof); 1468*0b57cec5SDimitry Andric if (MD && MD->getOperand(0)) 1469*0b57cec5SDimitry Andric if (MDString *MDS = dyn_cast<MDString>(MD->getOperand(0))) { 1470*0b57cec5SDimitry Andric if (MDS->getString().equals("function_entry_count")) { 1471*0b57cec5SDimitry Andric ConstantInt *CI = mdconst::extract<ConstantInt>(MD->getOperand(1)); 1472*0b57cec5SDimitry Andric uint64_t Count = CI->getValue().getZExtValue(); 1473*0b57cec5SDimitry Andric // A value of -1 is used for SamplePGO when there were no samples. 1474*0b57cec5SDimitry Andric // Treat this the same as unknown. 1475*0b57cec5SDimitry Andric if (Count == (uint64_t)-1) 1476*0b57cec5SDimitry Andric return ProfileCount::getInvalid(); 1477*0b57cec5SDimitry Andric return ProfileCount(Count, PCT_Real); 1478*0b57cec5SDimitry Andric } else if (AllowSynthetic && 1479*0b57cec5SDimitry Andric MDS->getString().equals("synthetic_function_entry_count")) { 1480*0b57cec5SDimitry Andric ConstantInt *CI = mdconst::extract<ConstantInt>(MD->getOperand(1)); 1481*0b57cec5SDimitry Andric uint64_t Count = CI->getValue().getZExtValue(); 1482*0b57cec5SDimitry Andric return ProfileCount(Count, PCT_Synthetic); 1483*0b57cec5SDimitry Andric } 1484*0b57cec5SDimitry Andric } 1485*0b57cec5SDimitry Andric return ProfileCount::getInvalid(); 1486*0b57cec5SDimitry Andric } 1487*0b57cec5SDimitry Andric 1488*0b57cec5SDimitry Andric DenseSet<GlobalValue::GUID> Function::getImportGUIDs() const { 1489*0b57cec5SDimitry Andric DenseSet<GlobalValue::GUID> R; 1490*0b57cec5SDimitry Andric if (MDNode *MD = getMetadata(LLVMContext::MD_prof)) 1491*0b57cec5SDimitry Andric if (MDString *MDS = dyn_cast<MDString>(MD->getOperand(0))) 1492*0b57cec5SDimitry Andric if (MDS->getString().equals("function_entry_count")) 1493*0b57cec5SDimitry Andric for (unsigned i = 2; i < MD->getNumOperands(); i++) 1494*0b57cec5SDimitry Andric R.insert(mdconst::extract<ConstantInt>(MD->getOperand(i)) 1495*0b57cec5SDimitry Andric ->getValue() 1496*0b57cec5SDimitry Andric .getZExtValue()); 1497*0b57cec5SDimitry Andric return R; 1498*0b57cec5SDimitry Andric } 1499*0b57cec5SDimitry Andric 1500*0b57cec5SDimitry Andric void Function::setSectionPrefix(StringRef Prefix) { 1501*0b57cec5SDimitry Andric MDBuilder MDB(getContext()); 1502*0b57cec5SDimitry Andric setMetadata(LLVMContext::MD_section_prefix, 1503*0b57cec5SDimitry Andric MDB.createFunctionSectionPrefix(Prefix)); 1504*0b57cec5SDimitry Andric } 1505*0b57cec5SDimitry Andric 1506*0b57cec5SDimitry Andric Optional<StringRef> Function::getSectionPrefix() const { 1507*0b57cec5SDimitry Andric if (MDNode *MD = getMetadata(LLVMContext::MD_section_prefix)) { 1508*0b57cec5SDimitry Andric assert(cast<MDString>(MD->getOperand(0)) 1509*0b57cec5SDimitry Andric ->getString() 1510*0b57cec5SDimitry Andric .equals("function_section_prefix") && 1511*0b57cec5SDimitry Andric "Metadata not match"); 1512*0b57cec5SDimitry Andric return cast<MDString>(MD->getOperand(1))->getString(); 1513*0b57cec5SDimitry Andric } 1514*0b57cec5SDimitry Andric return None; 1515*0b57cec5SDimitry Andric } 1516*0b57cec5SDimitry Andric 1517*0b57cec5SDimitry Andric bool Function::nullPointerIsDefined() const { 1518*0b57cec5SDimitry Andric return getFnAttribute("null-pointer-is-valid") 1519*0b57cec5SDimitry Andric .getValueAsString() 1520*0b57cec5SDimitry Andric .equals("true"); 1521*0b57cec5SDimitry Andric } 1522*0b57cec5SDimitry Andric 1523*0b57cec5SDimitry Andric bool llvm::NullPointerIsDefined(const Function *F, unsigned AS) { 1524*0b57cec5SDimitry Andric if (F && F->nullPointerIsDefined()) 1525*0b57cec5SDimitry Andric return true; 1526*0b57cec5SDimitry Andric 1527*0b57cec5SDimitry Andric if (AS != 0) 1528*0b57cec5SDimitry Andric return true; 1529*0b57cec5SDimitry Andric 1530*0b57cec5SDimitry Andric return false; 1531*0b57cec5SDimitry Andric } 1532