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". 48eb9a85f09e18b3fe88499710404b38d3a9128f62Benjamin Kramer std::string getName(ID id, ArrayRef<Type*> Tys = ArrayRef<Type*>()); 4995af592a631f403e1458ec1155f89fc31011572cJim Laskey 5095af592a631f403e1458ec1155f89fc31011572cJim Laskey /// Intrinsic::getType(ID) - Return the function type for an intrinsic. 5195af592a631f403e1458ec1155f89fc31011572cJim Laskey /// 52db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner FunctionType *getType(LLVMContext &Context, ID id, 53cb3de0bc800d7920087b19bb12a545d4cc84114eBill Wendling ArrayRef<Type*> Tys = ArrayRef<Type*>()); 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 /// 669d4879f364ddbde899e81f96891ddc9819ba3be5Dan Gohman /// The Tys and numTys parameters are for intrinsics with overloaded types 67c77ccaea14398aaf92d3f2a36d074b77d601edaaDan Gohman /// (e.g., those using iAny, fAny, vAny, or iPTRAny). For a declaration for an 68c77ccaea14398aaf92d3f2a36d074b77d601edaaDan Gohman /// overloaded intrinsic, Tys should point to an array of numTys pointers to 69c77ccaea14398aaf92d3f2a36d074b77d601edaaDan Gohman /// Type, and must provide exactly one type for each overloaded type in the 709d4879f364ddbde899e81f96891ddc9819ba3be5Dan Gohman /// intrinsic. 71eb9a85f09e18b3fe88499710404b38d3a9128f62Benjamin Kramer Function *getDeclaration(Module *M, ID id, 72eb9a85f09e18b3fe88499710404b38d3a9128f62Benjamin Kramer ArrayRef<Type*> Tys = ArrayRef<Type*>()); 7349de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen 7449de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen /// Map a GCC builtin name to an intrinsic ID. 7549de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen ID getIntrinsicForGCCBuiltin(const char *Prefix, const char *BuiltinName); 7695af592a631f403e1458ec1155f89fc31011572cJim Laskey 77908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner /// IITDescriptor - This is a type descriptor which explains the type 78908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner /// requirements of an intrinsic. This is returned by 79908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner /// getIntrinsicInfoTableEntries. 80908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner struct IITDescriptor { 81908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner enum IITDescriptorKind { 824d0b4a45dc724666d5de4f2f7c2d295487e4ca3eMichael Ilseman Void, MMX, Metadata, Half, Float, Double, 83908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner Integer, Vector, Pointer, Struct, 84908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner Argument, ExtendVecArgument, TruncVecArgument 85908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner } Kind; 86908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 87908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner union { 88908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned Integer_Width; 89908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned Float_Width; 90908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned Vector_Width; 91908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned Pointer_AddressSpace; 92908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned Struct_NumElements; 93908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned Argument_Info; 94908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner }; 95908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 96908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner enum ArgKind { 97908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner AK_AnyInteger, 98908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner AK_AnyFloat, 99908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner AK_AnyVector, 100908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner AK_AnyPointer 101908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner }; 102908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner unsigned getArgumentNumber() const { 103ae5c3b9b0f3a08b66c69f6c0005778bde62a2ee2Chris Lattner assert(Kind == Argument || Kind == ExtendVecArgument || 104ae5c3b9b0f3a08b66c69f6c0005778bde62a2ee2Chris Lattner Kind == TruncVecArgument); 105908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return Argument_Info >> 2; 106908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner } 107908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner ArgKind getArgumentKind() const { 108ae5c3b9b0f3a08b66c69f6c0005778bde62a2ee2Chris Lattner assert(Kind == Argument || Kind == ExtendVecArgument || 109ae5c3b9b0f3a08b66c69f6c0005778bde62a2ee2Chris Lattner Kind == TruncVecArgument); 110908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return (ArgKind)(Argument_Info&3); 111908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner } 112908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 113908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner static IITDescriptor get(IITDescriptorKind K, unsigned Field) { 114908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner IITDescriptor Result = { K, { Field } }; 115908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner return Result; 116908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner } 117908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner }; 118908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 119908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner /// getIntrinsicInfoTableEntries - Return the IIT table descriptor for the 120908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner /// specified intrinsic into an array of IITDescriptors. 121908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner /// 122908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl<IITDescriptor> &T); 123908a831a9a1fb043bc4758d6712d78255099ae51Chris Lattner 124d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End Intrinsic namespace 125d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 126d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 127eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner 128eea35433d28e40956b67e5717e7058c30d1cf375Chris Lattner#endif 129