|  | //===-- llvm/Instrinsics.h - LLVM Intrinsic Function Handling ---*- C++ -*-===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file defines a set of enums which allow processing of intrinsic | 
|  | // functions.  Values of these enum types are returned by | 
|  | // Function::getIntrinsicID. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #ifndef LLVM_IR_INTRINSICS_H | 
|  | #define LLVM_IR_INTRINSICS_H | 
|  |  | 
|  | #include "llvm/ADT/ArrayRef.h" | 
|  | #include "llvm/ADT/None.h" | 
|  | #include "llvm/ADT/Optional.h" | 
|  | #include <string> | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | class Type; | 
|  | class FunctionType; | 
|  | class Function; | 
|  | class LLVMContext; | 
|  | class Module; | 
|  | class AttributeSet; | 
|  |  | 
|  | /// This namespace contains an enum with a value for every intrinsic/builtin | 
|  | /// function known by LLVM. The enum values are returned by | 
|  | /// Function::getIntrinsicID(). | 
|  | namespace Intrinsic { | 
|  | enum ID : unsigned { | 
|  | not_intrinsic = 0,   // Must be zero | 
|  |  | 
|  | // Get the intrinsic enums generated from Intrinsics.td | 
|  | #define GET_INTRINSIC_ENUM_VALUES | 
|  | #include "llvm/IR/Intrinsics.gen" | 
|  | #undef GET_INTRINSIC_ENUM_VALUES | 
|  | , num_intrinsics | 
|  | }; | 
|  |  | 
|  | /// Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx". | 
|  | /// Note, this version is for intrinsics with no overloads.  Use the other | 
|  | /// version of getName if overloads are required. | 
|  | StringRef getName(ID id); | 
|  |  | 
|  | /// Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx". | 
|  | /// Note, this version of getName supports overloads, but is less efficient | 
|  | /// than the StringRef version of this function.  If no overloads are | 
|  | /// requried, it is safe to use this version, but better to use the StringRef | 
|  | /// version. | 
|  | std::string getName(ID id, ArrayRef<Type*> Tys); | 
|  |  | 
|  | /// Return the function type for an intrinsic. | 
|  | FunctionType *getType(LLVMContext &Context, ID id, | 
|  | ArrayRef<Type*> Tys = None); | 
|  |  | 
|  | /// Returns true if the intrinsic can be overloaded. | 
|  | bool isOverloaded(ID id); | 
|  |  | 
|  | /// Returns true if the intrinsic is a leaf, i.e. it does not make any calls | 
|  | /// itself.  Most intrinsics are leafs, the exceptions being the patchpoint | 
|  | /// and statepoint intrinsics. These call (or invoke) their "target" argument. | 
|  | bool isLeaf(ID id); | 
|  |  | 
|  | /// Return the attributes for an intrinsic. | 
|  | AttributeSet getAttributes(LLVMContext &C, ID id); | 
|  |  | 
|  | /// Create or insert an LLVM Function declaration for an intrinsic, and return | 
|  | /// it. | 
|  | /// | 
|  | /// The Tys parameter is for intrinsics with overloaded types (e.g., those | 
|  | /// using iAny, fAny, vAny, or iPTRAny).  For a declaration of an overloaded | 
|  | /// intrinsic, Tys must provide exactly one type for each overloaded type in | 
|  | /// the intrinsic. | 
|  | Function *getDeclaration(Module *M, ID id, ArrayRef<Type*> Tys = None); | 
|  |  | 
|  | /// Looks up Name in NameTable via binary search. NameTable must be sorted | 
|  | /// and all entries must start with "llvm.".  If NameTable contains an exact | 
|  | /// match for Name or a prefix of Name followed by a dot, its index in | 
|  | /// NameTable is returned. Otherwise, -1 is returned. | 
|  | int lookupLLVMIntrinsicByName(ArrayRef<const char *> NameTable, | 
|  | StringRef Name); | 
|  |  | 
|  | /// Map a GCC builtin name to an intrinsic ID. | 
|  | ID getIntrinsicForGCCBuiltin(const char *Prefix, StringRef BuiltinName); | 
|  |  | 
|  | /// Map a MS builtin name to an intrinsic ID. | 
|  | ID getIntrinsicForMSBuiltin(const char *Prefix, StringRef BuiltinName); | 
|  |  | 
|  | /// This is a type descriptor which explains the type requirements of an | 
|  | /// intrinsic. This is returned by getIntrinsicInfoTableEntries. | 
|  | struct IITDescriptor { | 
|  | enum IITDescriptorKind { | 
|  | Void, VarArg, MMX, Token, Metadata, Half, Float, Double, | 
|  | Integer, Vector, Pointer, Struct, | 
|  | Argument, ExtendArgument, TruncArgument, HalfVecArgument, | 
|  | SameVecWidthArgument, PtrToArgument, PtrToElt, VecOfPtrsToElt | 
|  | } Kind; | 
|  |  | 
|  | union { | 
|  | unsigned Integer_Width; | 
|  | unsigned Float_Width; | 
|  | unsigned Vector_Width; | 
|  | unsigned Pointer_AddressSpace; | 
|  | unsigned Struct_NumElements; | 
|  | unsigned Argument_Info; | 
|  | }; | 
|  |  | 
|  | enum ArgKind { | 
|  | AK_Any, | 
|  | AK_AnyInteger, | 
|  | AK_AnyFloat, | 
|  | AK_AnyVector, | 
|  | AK_AnyPointer | 
|  | }; | 
|  | unsigned getArgumentNumber() const { | 
|  | assert(Kind == Argument || Kind == ExtendArgument || | 
|  | Kind == TruncArgument || Kind == HalfVecArgument || | 
|  | Kind == SameVecWidthArgument || Kind == PtrToArgument || | 
|  | Kind == PtrToElt || Kind == VecOfPtrsToElt); | 
|  | return Argument_Info >> 3; | 
|  | } | 
|  | ArgKind getArgumentKind() const { | 
|  | assert(Kind == Argument || Kind == ExtendArgument || | 
|  | Kind == TruncArgument || Kind == HalfVecArgument || | 
|  | Kind == SameVecWidthArgument || Kind == PtrToArgument || | 
|  | Kind == VecOfPtrsToElt); | 
|  | return (ArgKind)(Argument_Info & 7); | 
|  | } | 
|  |  | 
|  | static IITDescriptor get(IITDescriptorKind K, unsigned Field) { | 
|  | IITDescriptor Result = { K, { Field } }; | 
|  | return Result; | 
|  | } | 
|  | }; | 
|  |  | 
|  | /// Return the IIT table descriptor for the specified intrinsic into an array | 
|  | /// of IITDescriptors. | 
|  | void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl<IITDescriptor> &T); | 
|  |  | 
|  | /// Match the specified type (which comes from an intrinsic argument or return | 
|  | /// value) with the type constraints specified by the .td file. If the given | 
|  | /// type is an overloaded type it is pushed to the ArgTys vector. | 
|  | /// | 
|  | /// Returns false if the given type matches with the constraints, true | 
|  | /// otherwise. | 
|  | bool matchIntrinsicType(Type *Ty, ArrayRef<IITDescriptor> &Infos, | 
|  | SmallVectorImpl<Type*> &ArgTys); | 
|  |  | 
|  | /// Verify if the intrinsic has variable arguments. This method is intended to | 
|  | /// be called after all the fixed arguments have been matched first. | 
|  | /// | 
|  | /// This method returns true on error. | 
|  | bool matchIntrinsicVarArg(bool isVarArg, ArrayRef<IITDescriptor> &Infos); | 
|  |  | 
|  | // Checks if the intrinsic name matches with its signature and if not | 
|  | // returns the declaration with the same signature and remangled name. | 
|  | llvm::Optional<Function*> remangleIntrinsicFunction(Function *F); | 
|  |  | 
|  | } // End Intrinsic namespace | 
|  |  | 
|  | } // End llvm namespace | 
|  |  | 
|  | #endif |