1249259Sdim//===-- llvm/Instrinsics.h - LLVM Intrinsic Function Handling ---*- C++ -*-===// 2249259Sdim// 3249259Sdim// The LLVM Compiler Infrastructure 4249259Sdim// 5249259Sdim// This file is distributed under the University of Illinois Open Source 6249259Sdim// License. See LICENSE.TXT for details. 7249259Sdim// 8249259Sdim//===----------------------------------------------------------------------===// 9249259Sdim// 10249259Sdim// This file defines a set of enums which allow processing of intrinsic 11249259Sdim// functions. Values of these enum types are returned by 12249259Sdim// Function::getIntrinsicID. 13249259Sdim// 14249259Sdim//===----------------------------------------------------------------------===// 15249259Sdim 16249259Sdim#ifndef LLVM_IR_INTRINSICS_H 17249259Sdim#define LLVM_IR_INTRINSICS_H 18249259Sdim 19249259Sdim#include "llvm/ADT/ArrayRef.h" 20249259Sdim#include <string> 21249259Sdim 22249259Sdimnamespace llvm { 23249259Sdim 24249259Sdimclass Type; 25249259Sdimclass FunctionType; 26249259Sdimclass Function; 27249259Sdimclass LLVMContext; 28249259Sdimclass Module; 29249259Sdimclass AttributeSet; 30249259Sdim 31249259Sdim/// Intrinsic Namespace - This namespace contains an enum with a value for 32249259Sdim/// every intrinsic/builtin function known by LLVM. These enum values are 33249259Sdim/// returned by Function::getIntrinsicID(). 34249259Sdim/// 35249259Sdimnamespace Intrinsic { 36249259Sdim enum ID { 37249259Sdim not_intrinsic = 0, // Must be zero 38249259Sdim 39249259Sdim // Get the intrinsic enums generated from Intrinsics.td 40249259Sdim#define GET_INTRINSIC_ENUM_VALUES 41249259Sdim#include "llvm/IR/Intrinsics.gen" 42249259Sdim#undef GET_INTRINSIC_ENUM_VALUES 43249259Sdim , num_intrinsics 44249259Sdim }; 45249259Sdim 46249259Sdim /// Intrinsic::getName(ID) - Return the LLVM name for an intrinsic, such as 47249259Sdim /// "llvm.ppc.altivec.lvx". 48251662Sdim std::string getName(ID id, ArrayRef<Type*> Tys = None); 49251662Sdim 50249259Sdim /// Intrinsic::getType(ID) - Return the function type for an intrinsic. 51249259Sdim /// 52249259Sdim FunctionType *getType(LLVMContext &Context, ID id, 53251662Sdim ArrayRef<Type*> Tys = None); 54249259Sdim 55249259Sdim /// Intrinsic::isOverloaded(ID) - Returns true if the intrinsic can be 56249259Sdim /// overloaded. 57249259Sdim bool isOverloaded(ID id); 58249259Sdim 59249259Sdim /// Intrinsic::getAttributes(ID) - Return the attributes for an intrinsic. 60249259Sdim /// 61249259Sdim AttributeSet getAttributes(LLVMContext &C, ID id); 62249259Sdim 63249259Sdim /// Intrinsic::getDeclaration(M, ID) - Create or insert an LLVM Function 64249259Sdim /// declaration for an intrinsic, and return it. 65249259Sdim /// 66251662Sdim /// The Tys parameter is for intrinsics with overloaded types (e.g., those 67251662Sdim /// using iAny, fAny, vAny, or iPTRAny). For a declaration of an overloaded 68251662Sdim /// intrinsic, Tys must provide exactly one type for each overloaded type in 69251662Sdim /// the intrinsic. 70251662Sdim Function *getDeclaration(Module *M, ID id, ArrayRef<Type*> Tys = None); 71251662Sdim 72249259Sdim /// Map a GCC builtin name to an intrinsic ID. 73249259Sdim ID getIntrinsicForGCCBuiltin(const char *Prefix, const char *BuiltinName); 74249259Sdim 75249259Sdim /// IITDescriptor - This is a type descriptor which explains the type 76249259Sdim /// requirements of an intrinsic. This is returned by 77249259Sdim /// getIntrinsicInfoTableEntries. 78249259Sdim struct IITDescriptor { 79249259Sdim enum IITDescriptorKind { 80263508Sdim Void, VarArg, MMX, Metadata, Half, Float, Double, 81249259Sdim Integer, Vector, Pointer, Struct, 82249259Sdim Argument, ExtendVecArgument, TruncVecArgument 83249259Sdim } Kind; 84249259Sdim 85249259Sdim union { 86249259Sdim unsigned Integer_Width; 87249259Sdim unsigned Float_Width; 88249259Sdim unsigned Vector_Width; 89249259Sdim unsigned Pointer_AddressSpace; 90249259Sdim unsigned Struct_NumElements; 91249259Sdim unsigned Argument_Info; 92249259Sdim }; 93249259Sdim 94249259Sdim enum ArgKind { 95249259Sdim AK_AnyInteger, 96249259Sdim AK_AnyFloat, 97249259Sdim AK_AnyVector, 98249259Sdim AK_AnyPointer 99249259Sdim }; 100249259Sdim unsigned getArgumentNumber() const { 101249259Sdim assert(Kind == Argument || Kind == ExtendVecArgument || 102249259Sdim Kind == TruncVecArgument); 103249259Sdim return Argument_Info >> 2; 104249259Sdim } 105249259Sdim ArgKind getArgumentKind() const { 106249259Sdim assert(Kind == Argument || Kind == ExtendVecArgument || 107249259Sdim Kind == TruncVecArgument); 108249259Sdim return (ArgKind)(Argument_Info&3); 109249259Sdim } 110249259Sdim 111249259Sdim static IITDescriptor get(IITDescriptorKind K, unsigned Field) { 112249259Sdim IITDescriptor Result = { K, { Field } }; 113249259Sdim return Result; 114249259Sdim } 115249259Sdim }; 116249259Sdim 117249259Sdim /// getIntrinsicInfoTableEntries - Return the IIT table descriptor for the 118249259Sdim /// specified intrinsic into an array of IITDescriptors. 119249259Sdim /// 120249259Sdim void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl<IITDescriptor> &T); 121249259Sdim 122249259Sdim} // End Intrinsic namespace 123249259Sdim 124249259Sdim} // End llvm namespace 125249259Sdim 126249259Sdim#endif 127