1 //===-- llvm/Instrinsics.h - LLVM Intrinsic Function Handling ---*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines a set of enums which allow processing of intrinsic 11 // functions. Values of these enum types are returned by 12 // Function::getIntrinsicID. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #ifndef LLVM_INTRINSICS_H 17 #define LLVM_INTRINSICS_H 18 19 #include "llvm/ADT/ArrayRef.h" 20 #include <string> 21 22 namespace llvm { 23 24 class Type; 25 class FunctionType; 26 class Function; 27 class LLVMContext; 28 class Module; 29 class AttrListPtr; 30 31 /// Intrinsic Namespace - This namespace contains an enum with a value for 32 /// every intrinsic/builtin function known by LLVM. These enum values are 33 /// returned by Function::getIntrinsicID(). 34 /// 35 namespace Intrinsic { 36 enum ID { 37 not_intrinsic = 0, // Must be zero 38 39 // Get the intrinsic enums generated from Intrinsics.td 40 #define GET_INTRINSIC_ENUM_VALUES 41 #include "llvm/Intrinsics.gen" 42 #undef GET_INTRINSIC_ENUM_VALUES 43 , num_intrinsics 44 }; 45 46 /// Intrinsic::getName(ID) - Return the LLVM name for an intrinsic, such as 47 /// "llvm.ppc.altivec.lvx". 48 std::string getName(ID id, ArrayRef<Type*> Tys = ArrayRef<Type*>()); 49 50 /// Intrinsic::getType(ID) - Return the function type for an intrinsic. 51 /// 52 FunctionType *getType(LLVMContext &Context, ID id, 53 ArrayRef<Type*> Tys = ArrayRef<Type*>()); 54 55 /// Intrinsic::isOverloaded(ID) - Returns true if the intrinsic can be 56 /// overloaded. 57 bool isOverloaded(ID id); 58 59 /// Intrinsic::getAttributes(ID) - Return the attributes for an intrinsic. 60 /// 61 AttrListPtr getAttributes(ID id); 62 63 /// Intrinsic::getDeclaration(M, ID) - Create or insert an LLVM Function 64 /// declaration for an intrinsic, and return it. 65 /// 66 /// The Tys and numTys parameters are for intrinsics with overloaded types 67 /// (e.g., those using iAny, fAny, vAny, or iPTRAny). For a declaration for an 68 /// overloaded intrinsic, Tys should point to an array of numTys pointers to 69 /// Type, and must provide exactly one type for each overloaded type in the 70 /// intrinsic. 71 Function *getDeclaration(Module *M, ID id, 72 ArrayRef<Type*> Tys = ArrayRef<Type*>()); 73 74 /// Map a GCC builtin name to an intrinsic ID. 75 ID getIntrinsicForGCCBuiltin(const char *Prefix, const char *BuiltinName); 76 77 /// IITDescriptor - This is a type descriptor which explains the type 78 /// requirements of an intrinsic. This is returned by 79 /// getIntrinsicInfoTableEntries. 80 struct IITDescriptor { 81 enum IITDescriptorKind { 82 Void, MMX, Metadata, Float, Double, 83 Integer, Vector, Pointer, Struct, 84 Argument, ExtendVecArgument, TruncVecArgument 85 } Kind; 86 87 union { 88 unsigned Integer_Width; 89 unsigned Float_Width; 90 unsigned Vector_Width; 91 unsigned Pointer_AddressSpace; 92 unsigned Struct_NumElements; 93 unsigned Argument_Info; 94 }; 95 96 enum ArgKind { 97 AK_AnyInteger, 98 AK_AnyFloat, 99 AK_AnyVector, 100 AK_AnyPointer 101 }; getArgumentNumberIITDescriptor102 unsigned getArgumentNumber() const { 103 assert(Kind == Argument || Kind == ExtendVecArgument || 104 Kind == TruncVecArgument); 105 return Argument_Info >> 2; 106 } getArgumentKindIITDescriptor107 ArgKind getArgumentKind() const { 108 assert(Kind == Argument || Kind == ExtendVecArgument || 109 Kind == TruncVecArgument); 110 return (ArgKind)(Argument_Info&3); 111 } 112 getIITDescriptor113 static IITDescriptor get(IITDescriptorKind K, unsigned Field) { 114 IITDescriptor Result = { K, { Field } }; 115 return Result; 116 } 117 }; 118 119 /// getIntrinsicInfoTableEntries - Return the IIT table descriptor for the 120 /// specified intrinsic into an array of IITDescriptors. 121 /// 122 void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl<IITDescriptor> &T); 123 124 } // End Intrinsic namespace 125 126 } // End llvm namespace 127 128 #endif 129