12df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens//===-- llvm/Instrinsics.h - LLVM Intrinsic Function Handling ---*- C++ -*-===// 22df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// 32df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// The LLVM Compiler Infrastructure 42df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// 52df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// This file is distributed under the University of Illinois Open Source 62df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// License. See LICENSE.TXT for details. 72df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// 82df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens//===----------------------------------------------------------------------===// 92df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// 102df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// This file defines a set of enums which allow processing of intrinsic 112df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// functions. Values of these enum types are returned by 122df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// Function::getIntrinsicID. 132df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// 142df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens//===----------------------------------------------------------------------===// 152df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 162df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#ifndef LLVM_IR_INTRINSICS_H 172df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#define LLVM_IR_INTRINSICS_H 182df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 192df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/ADT/ArrayRef.h" 202df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/ADT/None.h" 212df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/ADT/Optional.h" 222df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include <string> 232df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 242df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensnamespace llvm { 252df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 262df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass Type; 272df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass FunctionType; 282df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass Function; 292df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass LLVMContext; 302df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass Module; 312df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass AttributeSet; 322df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 332df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens/// This namespace contains an enum with a value for every intrinsic/builtin 342df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens/// function known by LLVM. The enum values are returned by 352df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens/// Function::getIntrinsicID(). 362df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensnamespace Intrinsic { 372df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens enum ID : unsigned { 382df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens not_intrinsic = 0, // Must be zero 392df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 402df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens // Get the intrinsic enums generated from Intrinsics.td 412df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#define GET_INTRINSIC_ENUM_VALUES 422df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/IR/Intrinsics.gen" 432df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#undef GET_INTRINSIC_ENUM_VALUES 442df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens , num_intrinsics 452df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens }; 462df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 472df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx". 482df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Note, this version is for intrinsics with no overloads. Use the other 492df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// version of getName if overloads are required. 502df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens StringRef getName(ID id); 512df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 522df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx". 532df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Note, this version of getName supports overloads, but is less efficient 542df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// than the StringRef version of this function. If no overloads are 552df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// requried, it is safe to use this version, but better to use the StringRef 562df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// version. 572df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens std::string getName(ID id, ArrayRef<Type*> Tys); 582df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 592df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Return the function type for an intrinsic. 602df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens FunctionType *getType(LLVMContext &Context, ID id, 612df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens ArrayRef<Type*> Tys = None); 622df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 632df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Returns true if the intrinsic can be overloaded. 642df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens bool isOverloaded(ID id); 652df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 662df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Returns true if the intrinsic is a leaf, i.e. it does not make any calls 672df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// itself. Most intrinsics are leafs, the exceptions being the patchpoint 682df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// and statepoint intrinsics. These call (or invoke) their "target" argument. 692df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens bool isLeaf(ID id); 702df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 712df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Return the attributes for an intrinsic. 722df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens AttributeSet getAttributes(LLVMContext &C, ID id); 732df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 742df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Create or insert an LLVM Function declaration for an intrinsic, and return 752df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// it. 762df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// 772df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// The Tys parameter is for intrinsics with overloaded types (e.g., those 782df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// using iAny, fAny, vAny, or iPTRAny). For a declaration of an overloaded 792df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// intrinsic, Tys must provide exactly one type for each overloaded type in 802df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// the intrinsic. 812df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens Function *getDeclaration(Module *M, ID id, ArrayRef<Type*> Tys = None); 822df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 832df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Looks up Name in NameTable via binary search. NameTable must be sorted 842df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// and all entries must start with "llvm.". If NameTable contains an exact 852df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// match for Name or a prefix of Name followed by a dot, its index in 862df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// NameTable is returned. Otherwise, -1 is returned. 872df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens int lookupLLVMIntrinsicByName(ArrayRef<const char *> NameTable, 882df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens StringRef Name); 892df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 902df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Map a GCC builtin name to an intrinsic ID. 912df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens ID getIntrinsicForGCCBuiltin(const char *Prefix, StringRef BuiltinName); 922df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 932df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Map a MS builtin name to an intrinsic ID. 942df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens ID getIntrinsicForMSBuiltin(const char *Prefix, StringRef BuiltinName); 952df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 962df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// This is a type descriptor which explains the type requirements of an 972df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// intrinsic. This is returned by getIntrinsicInfoTableEntries. 982df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens struct IITDescriptor { 992df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens enum IITDescriptorKind { 1002df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens Void, VarArg, MMX, Token, Metadata, Half, Float, Double, 1012df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens Integer, Vector, Pointer, Struct, 1022df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens Argument, ExtendArgument, TruncArgument, HalfVecArgument, 1032df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens SameVecWidthArgument, PtrToArgument, PtrToElt, VecOfPtrsToElt 1042df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } Kind; 1052df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1062df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens union { 1072df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens unsigned Integer_Width; 1082df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens unsigned Float_Width; 1092df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens unsigned Vector_Width; 1102df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens unsigned Pointer_AddressSpace; 1112df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens unsigned Struct_NumElements; 1122df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens unsigned Argument_Info; 1132df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens }; 1142df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1152df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens enum ArgKind { 1162df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens AK_Any, 1172df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens AK_AnyInteger, 1182df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens AK_AnyFloat, 1192df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens AK_AnyVector, 1202df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens AK_AnyPointer 1212df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens }; 1222df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens unsigned getArgumentNumber() const { 1232df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens assert(Kind == Argument || Kind == ExtendArgument || 1242df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens Kind == TruncArgument || Kind == HalfVecArgument || 1252df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens Kind == SameVecWidthArgument || Kind == PtrToArgument || 1262df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens Kind == PtrToElt || Kind == VecOfPtrsToElt); 1272df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return Argument_Info >> 3; 1282df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 1292df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens ArgKind getArgumentKind() const { 1302df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens assert(Kind == Argument || Kind == ExtendArgument || 1312df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens Kind == TruncArgument || Kind == HalfVecArgument || 1322df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens Kind == SameVecWidthArgument || Kind == PtrToArgument || 1332df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens Kind == VecOfPtrsToElt); 1342df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return (ArgKind)(Argument_Info & 7); 1352df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 1362df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1372df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens static IITDescriptor get(IITDescriptorKind K, unsigned Field) { 1382df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens IITDescriptor Result = { K, { Field } }; 1392df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens return Result; 1402df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens } 1412df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens }; 1422df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1432df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Return the IIT table descriptor for the specified intrinsic into an array 1442df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// of IITDescriptors. 1452df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl<IITDescriptor> &T); 1462df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1472df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Match the specified type (which comes from an intrinsic argument or return 1482df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// value) with the type constraints specified by the .td file. If the given 1492df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// type is an overloaded type it is pushed to the ArgTys vector. 1502df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// 1512df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Returns false if the given type matches with the constraints, true 1522df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// otherwise. 1532df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens bool matchIntrinsicType(Type *Ty, ArrayRef<IITDescriptor> &Infos, 1542df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens SmallVectorImpl<Type*> &ArgTys); 1552df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1562df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// Verify if the intrinsic has variable arguments. This method is intended to 1572df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// be called after all the fixed arguments have been matched first. 1582df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// 1592df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens /// This method returns true on error. 1602df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens bool matchIntrinsicVarArg(bool isVarArg, ArrayRef<IITDescriptor> &Infos); 1612df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1622df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens // Checks if the intrinsic name matches with its signature and if not 1632df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens // returns the declaration with the same signature and remangled name. 1642df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens llvm::Optional<Function*> remangleIntrinsicFunction(Function *F); 1652df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1662df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens} // End Intrinsic namespace 1672df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1682df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens} // End llvm namespace 1692df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens 1702df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#endif 171