1eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner//===-- llvm/Instrinsics.h - LLVM Intrinsic Function Handling ---*- C++ -*-===// 29769ab22265b313171d201b5928688524a01bd87Misha Brukman// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 79769ab22265b313171d201b5928688524a01bd87Misha Brukman// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 9eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner// 10eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner// This file defines a set of enums which allow processing of intrinsic 11eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner// functions. Values of these enum types are returned by 12eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner// Function::getIntrinsicID. 13eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner// 14eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner//===----------------------------------------------------------------------===// 15eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner 16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_IR_INTRINSICS_H 17674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_IR_INTRINSICS_H 18eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner 19eb9a85f09e18b3fe88499710404b38d3a9128f62Benjamin Kramer#include "llvm/ADT/ArrayRef.h" 20deae48ee99699aeedc0696a0edb73b60d585ded8Chris Lattner#include <string> 21deae48ee99699aeedc0696a0edb73b60d585ded8Chris Lattner 22d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 24d4d68ba4b80d0ef48409d822617e345adc855287Reid Spencerclass Type; 2595af592a631f403e1458ec1155f89fc31011572cJim Laskeyclass FunctionType; 2695af592a631f403e1458ec1155f89fc31011572cJim Laskeyclass Function; 2712ddd409535b52a7fa5157ded9a4cedd161fedb6Benjamin Kramerclass LLVMContext; 2895af592a631f403e1458ec1155f89fc31011572cJim Laskeyclass Module; 2999faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendlingclass AttributeSet; 3095af592a631f403e1458ec1155f89fc31011572cJim Laskey 31d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke/// Intrinsic Namespace - This namespace contains an enum with a value for 320519bdcd3d19063cd3640cabc9f25f6f11cbffb2Chris Lattner/// every intrinsic/builtin function known by LLVM. These enum values are 330519bdcd3d19063cd3640cabc9f25f6f11cbffb2Chris Lattner/// returned by Function::getIntrinsicID(). 340519bdcd3d19063cd3640cabc9f25f6f11cbffb2Chris Lattner/// 35d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace Intrinsic { 36eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner enum ID { 37eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner not_intrinsic = 0, // Must be zero 38c436b37262fd1552fd591f50e14a7ff0067465e2Chris Lattner 3968b67ff3db2c89909b0a37078bf2cf4a80ef1d53Chris Lattner // Get the intrinsic enums generated from Intrinsics.td 4068b67ff3db2c89909b0a37078bf2cf4a80ef1d53Chris Lattner#define GET_INTRINSIC_ENUM_VALUES 41351ba145a7db32b457f118ecc4d873765ac2a16bChandler Carruth#include "llvm/IR/Intrinsics.gen" 4268b67ff3db2c89909b0a37078bf2cf4a80ef1d53Chris Lattner#undef GET_INTRINSIC_ENUM_VALUES 43e42dbed53ae145bd1b9b88c1903f0360904fea4eChris Lattner , num_intrinsics 44eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner }; 45e42dbed53ae145bd1b9b88c1903f0360904fea4eChris Lattner 46e42dbed53ae145bd1b9b88c1903f0360904fea4eChris Lattner /// Intrinsic::getName(ID) - Return the LLVM name for an intrinsic, such as 47e42dbed53ae145bd1b9b88c1903f0360904fea4eChris Lattner /// "llvm.ppc.altivec.lvx". 485c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko std::string getName(ID id, ArrayRef<Type*> Tys = None); 495c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko 5095af592a631f403e1458ec1155f89fc31011572cJim Laskey /// Intrinsic::getType(ID) - Return the function type for an intrinsic. 5195af592a631f403e1458ec1155f89fc31011572cJim Laskey /// 52db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner FunctionType *getType(LLVMContext &Context, ID id, 535c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko ArrayRef<Type*> Tys = None); 5495af592a631f403e1458ec1155f89fc31011572cJim Laskey 550d52ff1f7b993750a74a5d4432273092de9af069Mon P Wang /// Intrinsic::isOverloaded(ID) - Returns true if the intrinsic can be 560d52ff1f7b993750a74a5d4432273092de9af069Mon P Wang /// overloaded. 570d52ff1f7b993750a74a5d4432273092de9af069Mon P Wang bool isOverloaded(ID id); 580d52ff1f7b993750a74a5d4432273092de9af069Mon P Wang 590598866c052147c31b808391f58434ce3dbfb838Devang Patel /// Intrinsic::getAttributes(ID) - Return the attributes for an intrinsic. 60a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands /// 6199faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling AttributeSet getAttributes(LLVMContext &C, ID id); 62a3355ffb3d30d19d226bbb75707991c60f236e37Duncan Sands 6395af592a631f403e1458ec1155f89fc31011572cJim Laskey /// Intrinsic::getDeclaration(M, ID) - Create or insert an LLVM Function 6495af592a631f403e1458ec1155f89fc31011572cJim Laskey /// declaration for an intrinsic, and return it. 659d4879f364ddbde899e81f96891ddc9819ba3be5Dan Gohman /// 668c3a54998bcbdd10e1997519ba1c17b7f0850709Duncan Sands /// The Tys parameter is for intrinsics with overloaded types (e.g., those 678c3a54998bcbdd10e1997519ba1c17b7f0850709Duncan Sands /// using iAny, fAny, vAny, or iPTRAny). For a declaration of an overloaded 688c3a54998bcbdd10e1997519ba1c17b7f0850709Duncan Sands /// intrinsic, Tys must provide exactly one type for each overloaded type in 698c3a54998bcbdd10e1997519ba1c17b7f0850709Duncan Sands /// the intrinsic. 705c332dbd30d9398ed25b30c3080506f7b8e92290Dmitri Gribenko Function *getDeclaration(Module *M, ID id, ArrayRef<Type*> Tys = None); 718c3a54998bcbdd10e1997519ba1c17b7f0850709Duncan Sands 7249de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// Map a GCC builtin name to an intrinsic ID. 7349de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen ID getIntrinsicForGCCBuiltin(const char *Prefix, const char *BuiltinName); 74cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines 75cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines /// Map a MS builtin name to an intrinsic ID. 76cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines ID getIntrinsicForMSBuiltin(const char *Prefix, const char *BuiltinName); 7795af592a631f403e1458ec1155f89fc31011572cJim Laskey 78908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner /// IITDescriptor - This is a type descriptor which explains the type 79908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner /// requirements of an intrinsic. This is returned by 80908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner /// getIntrinsicInfoTableEntries. 81908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner struct IITDescriptor { 82908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner enum IITDescriptorKind { 832e50b8a08d40ce72ae35c73528140d3ee25209e0Andrew Trick Void, VarArg, MMX, Metadata, Half, Float, Double, 84908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner Integer, Vector, Pointer, Struct, 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Argument, ExtendArgument, TruncArgument, HalfVecArgument 86908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner } Kind; 87908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 88908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner union { 89908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned Integer_Width; 90908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned Float_Width; 91908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned Vector_Width; 92908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned Pointer_AddressSpace; 93908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned Struct_NumElements; 94908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned Argument_Info; 95908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner }; 96908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 97908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner enum ArgKind { 98908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner AK_AnyInteger, 99908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner AK_AnyFloat, 100908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner AK_AnyVector, 101908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner AK_AnyPointer 102908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner }; 103908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned getArgumentNumber() const { 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Argument || Kind == ExtendArgument || 10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Kind == TruncArgument || Kind == HalfVecArgument); 106908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return Argument_Info >> 2; 107908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner } 108908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner ArgKind getArgumentKind() const { 10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(Kind == Argument || Kind == ExtendArgument || 11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Kind == TruncArgument || Kind == HalfVecArgument); 111908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return (ArgKind)(Argument_Info&3); 112908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner } 113908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 114908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner static IITDescriptor get(IITDescriptorKind K, unsigned Field) { 115908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner IITDescriptor Result = { K, { Field } }; 116908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return Result; 117908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner } 118908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner }; 119908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 120908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner /// getIntrinsicInfoTableEntries - Return the IIT table descriptor for the 121908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner /// specified intrinsic into an array of IITDescriptors. 122908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner /// 123908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl<IITDescriptor> &T); 124908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 125d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End Intrinsic namespace 126d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 127d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 128eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner 129eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner#endif 130