Intrinsics.h revision 296417
1198090Srdivacky//===-- llvm/Instrinsics.h - LLVM Intrinsic Function Handling ---*- C++ -*-===// 2198090Srdivacky// 3198090Srdivacky// The LLVM Compiler Infrastructure 4198090Srdivacky// 5198090Srdivacky// This file is distributed under the University of Illinois Open Source 6198090Srdivacky// License. See LICENSE.TXT for details. 7198090Srdivacky// 8198090Srdivacky//===----------------------------------------------------------------------===// 9198090Srdivacky// 10198090Srdivacky// This file defines a set of enums which allow processing of intrinsic 11198090Srdivacky// functions. Values of these enum types are returned by 12198090Srdivacky// Function::getIntrinsicID. 13198090Srdivacky// 14198090Srdivacky//===----------------------------------------------------------------------===// 15198090Srdivacky 16198090Srdivacky#ifndef LLVM_IR_INTRINSICS_H 17198090Srdivacky#define LLVM_IR_INTRINSICS_H 18200581Srdivacky 19198090Srdivacky#include "llvm/ADT/ArrayRef.h" 20198090Srdivacky#include <string> 21198090Srdivacky 22198090Srdivackynamespace llvm { 23198090Srdivacky 24198090Srdivackyclass Type; 25198090Srdivackyclass FunctionType; 26198090Srdivackyclass Function; 27198090Srdivackyclass LLVMContext; 28198090Srdivackyclass Module; 29198090Srdivackyclass AttributeSet; 30198090Srdivacky 31198090Srdivacky/// This namespace contains an enum with a value for every intrinsic/builtin 32198090Srdivacky/// function known by LLVM. The enum values are returned by 33198090Srdivacky/// Function::getIntrinsicID(). 34243830Sdimnamespace Intrinsic { 35198090Srdivacky enum ID : unsigned { 36198090Srdivacky not_intrinsic = 0, // Must be zero 37198090Srdivacky 38198090Srdivacky // Get the intrinsic enums generated from Intrinsics.td 39243830Sdim#define GET_INTRINSIC_ENUM_VALUES 40198090Srdivacky#include "llvm/IR/Intrinsics.gen" 41198090Srdivacky#undef GET_INTRINSIC_ENUM_VALUES 42198090Srdivacky , num_intrinsics 43198090Srdivacky }; 44198090Srdivacky 45198090Srdivacky /// Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx". 46198090Srdivacky std::string getName(ID id, ArrayRef<Type*> Tys = None); 47198090Srdivacky 48198090Srdivacky /// Return the function type for an intrinsic. 49198090Srdivacky FunctionType *getType(LLVMContext &Context, ID id, 50198090Srdivacky ArrayRef<Type*> Tys = None); 51198090Srdivacky 52198090Srdivacky /// Returns true if the intrinsic can be overloaded. 53198090Srdivacky bool isOverloaded(ID id); 54226633Sdim 55198090Srdivacky /// Returns true if the intrinsic is a leaf, i.e. it does not make any calls 56198090Srdivacky /// itself. Most intrinsics are leafs, the exceptions being the patchpoint 57198090Srdivacky /// and statepoint intrinsics. These call (or invoke) their "target" argument. 58198090Srdivacky bool isLeaf(ID id); 59198090Srdivacky 60198090Srdivacky /// Return the attributes for an intrinsic. 61198090Srdivacky AttributeSet getAttributes(LLVMContext &C, ID id); 62234353Sdim 63198090Srdivacky /// Create or insert an LLVM Function declaration for an intrinsic, and return 64226633Sdim /// it. 65198090Srdivacky /// 66198090Srdivacky /// The Tys parameter is for intrinsics with overloaded types (e.g., those 67198090Srdivacky /// using iAny, fAny, vAny, or iPTRAny). For a declaration of an overloaded 68198090Srdivacky /// intrinsic, Tys must provide exactly one type for each overloaded type in 69198090Srdivacky /// the intrinsic. 70198090Srdivacky Function *getDeclaration(Module *M, ID id, ArrayRef<Type*> Tys = None); 71198090Srdivacky 72198090Srdivacky /// Map a GCC builtin name to an intrinsic ID. 73198090Srdivacky ID getIntrinsicForGCCBuiltin(const char *Prefix, const char *BuiltinName); 74198090Srdivacky 75198396Srdivacky /// Map a MS builtin name to an intrinsic ID. 76198090Srdivacky ID getIntrinsicForMSBuiltin(const char *Prefix, const char *BuiltinName); 77198090Srdivacky 78198090Srdivacky /// This is a type descriptor which explains the type requirements of an 79198090Srdivacky /// intrinsic. This is returned by getIntrinsicInfoTableEntries. 80198090Srdivacky struct IITDescriptor { 81198090Srdivacky enum IITDescriptorKind { 82198090Srdivacky Void, VarArg, MMX, Token, Metadata, Half, Float, Double, 83198090Srdivacky Integer, Vector, Pointer, Struct, 84198090Srdivacky Argument, ExtendArgument, TruncArgument, HalfVecArgument, 85198090Srdivacky SameVecWidthArgument, PtrToArgument, VecOfPtrsToElt 86198090Srdivacky } Kind; 87198396Srdivacky 88198090Srdivacky union { 89198090Srdivacky unsigned Integer_Width; 90198090Srdivacky unsigned Float_Width; 91198090Srdivacky unsigned Vector_Width; 92198090Srdivacky unsigned Pointer_AddressSpace; 93198090Srdivacky unsigned Struct_NumElements; 94198090Srdivacky unsigned Argument_Info; 95207618Srdivacky }; 96207618Srdivacky 97207618Srdivacky enum ArgKind { 98207618Srdivacky AK_Any, 99226633Sdim AK_AnyInteger, 100207618Srdivacky AK_AnyFloat, 101207618Srdivacky AK_AnyVector, 102207618Srdivacky AK_AnyPointer 103207618Srdivacky }; 104207618Srdivacky unsigned getArgumentNumber() const { 105218893Sdim assert(Kind == Argument || Kind == ExtendArgument || 106218893Sdim Kind == TruncArgument || Kind == HalfVecArgument || 107218893Sdim Kind == SameVecWidthArgument || Kind == PtrToArgument || 108243830Sdim Kind == VecOfPtrsToElt); 109218893Sdim return Argument_Info >> 3; 110218893Sdim } 111218893Sdim ArgKind getArgumentKind() const { 112226633Sdim assert(Kind == Argument || Kind == ExtendArgument || 113218893Sdim Kind == TruncArgument || Kind == HalfVecArgument || 114218893Sdim Kind == SameVecWidthArgument || Kind == PtrToArgument || 115218893Sdim Kind == VecOfPtrsToElt); 116218893Sdim return (ArgKind)(Argument_Info & 7); 117218893Sdim } 118218893Sdim 119202878Srdivacky static IITDescriptor get(IITDescriptorKind K, unsigned Field) { 120202878Srdivacky IITDescriptor Result = { K, { Field } }; 121202878Srdivacky return Result; 122202878Srdivacky } 123202878Srdivacky }; 124226633Sdim 125202878Srdivacky /// Return the IIT table descriptor for the specified intrinsic into an array 126202878Srdivacky /// of IITDescriptors. 127202878Srdivacky void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl<IITDescriptor> &T); 128202878Srdivacky 129202878Srdivacky} // End Intrinsic namespace 130202878Srdivacky 131202878Srdivacky} // End llvm namespace 132198090Srdivacky 133198090Srdivacky#endif 134198090Srdivacky