12df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens//===-- llvm/Instrinsics.h - LLVM Intrinsic Function Handling ---*- C++ -*-===//
22df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens//
32df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens//                     The LLVM Compiler Infrastructure
42df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens//
52df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// This file is distributed under the University of Illinois Open Source
62df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// License. See LICENSE.TXT for details.
72df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens//
82df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens//===----------------------------------------------------------------------===//
92df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens//
102df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// This file defines a set of enums which allow processing of intrinsic
112df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// functions.  Values of these enum types are returned by
122df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens// Function::getIntrinsicID.
132df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens//
142df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens//===----------------------------------------------------------------------===//
152df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
162df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#ifndef LLVM_IR_INTRINSICS_H
172df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#define LLVM_IR_INTRINSICS_H
182df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
192df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/ADT/ArrayRef.h"
202df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/ADT/None.h"
212df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/ADT/Optional.h"
222df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include <string>
232df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
242df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensnamespace llvm {
252df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
262df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass Type;
272df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass FunctionType;
282df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass Function;
292df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass LLVMContext;
302df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass Module;
312df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensclass AttributeSet;
322df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
332df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens/// This namespace contains an enum with a value for every intrinsic/builtin
342df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens/// function known by LLVM. The enum values are returned by
352df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens/// Function::getIntrinsicID().
362df178997d17474042e8c3704cc93ab2db6619bfNicolas Capensnamespace Intrinsic {
372df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  enum ID : unsigned {
382df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    not_intrinsic = 0,   // Must be zero
392df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
402df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    // Get the intrinsic enums generated from Intrinsics.td
412df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#define GET_INTRINSIC_ENUM_VALUES
422df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#include "llvm/IR/Intrinsics.gen"
432df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#undef GET_INTRINSIC_ENUM_VALUES
442df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    , num_intrinsics
452df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  };
462df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
472df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx".
482df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Note, this version is for intrinsics with no overloads.  Use the other
492df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// version of getName if overloads are required.
502df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  StringRef getName(ID id);
512df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
522df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Return the LLVM name for an intrinsic, such as "llvm.ppc.altivec.lvx".
532df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Note, this version of getName supports overloads, but is less efficient
542df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// than the StringRef version of this function.  If no overloads are
552df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// requried, it is safe to use this version, but better to use the StringRef
562df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// version.
572df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  std::string getName(ID id, ArrayRef<Type*> Tys);
582df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
592df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Return the function type for an intrinsic.
602df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  FunctionType *getType(LLVMContext &Context, ID id,
612df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens                        ArrayRef<Type*> Tys = None);
622df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
632df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Returns true if the intrinsic can be overloaded.
642df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  bool isOverloaded(ID id);
652df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
662df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Returns true if the intrinsic is a leaf, i.e. it does not make any calls
672df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// itself.  Most intrinsics are leafs, the exceptions being the patchpoint
682df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// and statepoint intrinsics. These call (or invoke) their "target" argument.
692df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  bool isLeaf(ID id);
702df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
712df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Return the attributes for an intrinsic.
722df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  AttributeSet getAttributes(LLVMContext &C, ID id);
732df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
742df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Create or insert an LLVM Function declaration for an intrinsic, and return
752df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// it.
762df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  ///
772df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// The Tys parameter is for intrinsics with overloaded types (e.g., those
782df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// using iAny, fAny, vAny, or iPTRAny).  For a declaration of an overloaded
792df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// intrinsic, Tys must provide exactly one type for each overloaded type in
802df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// the intrinsic.
812df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  Function *getDeclaration(Module *M, ID id, ArrayRef<Type*> Tys = None);
822df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
832df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Looks up Name in NameTable via binary search. NameTable must be sorted
842df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// and all entries must start with "llvm.".  If NameTable contains an exact
852df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// match for Name or a prefix of Name followed by a dot, its index in
862df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// NameTable is returned. Otherwise, -1 is returned.
872df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  int lookupLLVMIntrinsicByName(ArrayRef<const char *> NameTable,
882df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens                                StringRef Name);
892df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
902df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Map a GCC builtin name to an intrinsic ID.
912df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  ID getIntrinsicForGCCBuiltin(const char *Prefix, StringRef BuiltinName);
922df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
932df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Map a MS builtin name to an intrinsic ID.
942df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  ID getIntrinsicForMSBuiltin(const char *Prefix, StringRef BuiltinName);
952df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
962df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// This is a type descriptor which explains the type requirements of an
972df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// intrinsic. This is returned by getIntrinsicInfoTableEntries.
982df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  struct IITDescriptor {
992df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    enum IITDescriptorKind {
1002df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      Void, VarArg, MMX, Token, Metadata, Half, Float, Double,
1012df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      Integer, Vector, Pointer, Struct,
1022df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      Argument, ExtendArgument, TruncArgument, HalfVecArgument,
1032df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      SameVecWidthArgument, PtrToArgument, PtrToElt, VecOfPtrsToElt
1042df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    } Kind;
1052df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
1062df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    union {
1072df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      unsigned Integer_Width;
1082df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      unsigned Float_Width;
1092df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      unsigned Vector_Width;
1102df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      unsigned Pointer_AddressSpace;
1112df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      unsigned Struct_NumElements;
1122df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      unsigned Argument_Info;
1132df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    };
1142df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
1152df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    enum ArgKind {
1162df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      AK_Any,
1172df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      AK_AnyInteger,
1182df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      AK_AnyFloat,
1192df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      AK_AnyVector,
1202df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      AK_AnyPointer
1212df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    };
1222df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    unsigned getArgumentNumber() const {
1232df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      assert(Kind == Argument || Kind == ExtendArgument ||
1242df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens             Kind == TruncArgument || Kind == HalfVecArgument ||
1252df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens             Kind == SameVecWidthArgument || Kind == PtrToArgument ||
1262df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens             Kind == PtrToElt || Kind == VecOfPtrsToElt);
1272df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      return Argument_Info >> 3;
1282df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    }
1292df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    ArgKind getArgumentKind() const {
1302df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      assert(Kind == Argument || Kind == ExtendArgument ||
1312df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens             Kind == TruncArgument || Kind == HalfVecArgument ||
1322df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens             Kind == SameVecWidthArgument || Kind == PtrToArgument ||
1332df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens             Kind == VecOfPtrsToElt);
1342df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      return (ArgKind)(Argument_Info & 7);
1352df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    }
1362df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
1372df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    static IITDescriptor get(IITDescriptorKind K, unsigned Field) {
1382df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      IITDescriptor Result = { K, { Field } };
1392df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens      return Result;
1402df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens    }
1412df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  };
1422df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
1432df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Return the IIT table descriptor for the specified intrinsic into an array
1442df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// of IITDescriptors.
1452df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  void getIntrinsicInfoTableEntries(ID id, SmallVectorImpl<IITDescriptor> &T);
1462df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
1472df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Match the specified type (which comes from an intrinsic argument or return
1482df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// value) with the type constraints specified by the .td file. If the given
1492df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// type is an overloaded type it is pushed to the ArgTys vector.
1502df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  ///
1512df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Returns false if the given type matches with the constraints, true
1522df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// otherwise.
1532df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  bool matchIntrinsicType(Type *Ty, ArrayRef<IITDescriptor> &Infos,
1542df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens                          SmallVectorImpl<Type*> &ArgTys);
1552df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
1562df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// Verify if the intrinsic has variable arguments. This method is intended to
1572df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// be called after all the fixed arguments have been matched first.
1582df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  ///
1592df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  /// This method returns true on error.
1602df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  bool matchIntrinsicVarArg(bool isVarArg, ArrayRef<IITDescriptor> &Infos);
1612df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
1622df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  // Checks if the intrinsic name matches with its signature and if not
1632df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  // returns the declaration with the same signature and remangled name.
1642df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens  llvm::Optional<Function*> remangleIntrinsicFunction(Function *F);
1652df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
1662df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens} // End Intrinsic namespace
1672df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
1682df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens} // End llvm namespace
1692df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens
1702df178997d17474042e8c3704cc93ab2db6619bfNicolas Capens#endif
171