//
// The LLVM Compiler Infrastructure
//
-// This file was developed by the LLVM research group and is distributed under
-// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
#ifndef LLVM_INTRINSICS_H
#define LLVM_INTRINSICS_H
+#include <string>
+
namespace llvm {
+class Type;
+class FunctionType;
+class Function;
+class LLVMContext;
+class Module;
+class AttrListPtr;
+
/// Intrinsic Namespace - This namespace contains an enum with a value for
/// every intrinsic/builtin function known by LLVM. These enum values are
/// returned by Function::getIntrinsicID().
enum ID {
not_intrinsic = 0, // Must be zero
- // Varargs handling intrinsics.
- vastart, // Used to implement the va_start macro in C
- vaend, // Used to implement the va_end macro in C
- vacopy, // Used to implement the va_copy macro in C
-
- // Code generator intrinsics.
- returnaddress, // Yields the return address of a dynamic call frame
- frameaddress, // Yields the frame address of a dynamic call frame
- prefetch, // Prefetch a value into the cache
- pcmarker, // Export a PC from near the marker
-
- // setjmp/longjmp intrinsics.
- setjmp, // Used to represent a setjmp call in C
- longjmp, // Used to represent a longjmp call in C
- sigsetjmp, // Used to represent a sigsetjmp call in C
- siglongjmp, // Used to represent a siglongjmp call in C
-
- // Garbage Collection intrinsics.
- gcroot, // Defines a new GC root on the stack
- gcread, // Defines a read of a heap object (for read barriers)
- gcwrite, // Defines a write to a heap object (for write barriers)
-
- // Debugging intrinsics.
- dbg_stoppoint, // Represents source lines and breakpointable places
- dbg_region_start, // Start of a region
- dbg_region_end, // End of a region
- dbg_func_start, // Start of a function
- dbg_declare, // Declare a local object
-
-
- // Standard libc functions.
- memcpy, // Copy non-overlapping memory blocks
- memmove, // Copy potentially overlapping memory blocks
- memset, // Fill memory with a byte value
+ // Get the intrinsic enums generated from Intrinsics.td
+#define GET_INTRINSIC_ENUM_VALUES
+#include "llvm/Intrinsics.gen"
+#undef GET_INTRINSIC_ENUM_VALUES
+ , num_intrinsics
+ };
+
+ /// Intrinsic::getName(ID) - Return the LLVM name for an intrinsic, such as
+ /// "llvm.ppc.altivec.lvx".
+ std::string getName(ID id, const Type **Tys = 0, unsigned numTys = 0);
+
+ /// Intrinsic::getType(ID) - Return the function type for an intrinsic.
+ ///
+ const FunctionType *getType(LLVMContext &Context, ID id,
+ const Type **Tys = 0, unsigned numTys = 0);
- // libm related functions.
- isunordered, // Return true if either argument is a NaN
- sqrt,
+ /// Intrinsic::isOverloaded(ID) - Returns true if the intrinsic can be
+ /// overloaded.
+ bool isOverloaded(ID id);
- // Input/Output intrinsics.
- readport,
- writeport,
- readio,
- writeio
- };
+ /// Intrinsic::getAttributes(ID) - Return the attributes for an intrinsic.
+ ///
+ AttrListPtr getAttributes(ID id);
+ /// Intrinsic::getDeclaration(M, ID) - Create or insert an LLVM Function
+ /// declaration for an intrinsic, and return it.
+ ///
+ /// The Tys and numTys parameters are for intrinsics with overloaded types
+ /// (e.g., those using iAny, fAny, vAny, or iPTRAny). For a declaration for an
+ /// overloaded intrinsic, Tys should point to an array of numTys pointers to
+ /// Type, and must provide exactly one type for each overloaded type in the
+ /// intrinsic.
+ Function *getDeclaration(Module *M, ID id, const Type **Tys = 0,
+ unsigned numTys = 0);
+
+ /// Map a GCC builtin name to an intrinsic ID.
+ ID getIntrinsicForGCCBuiltin(const char *Prefix, const char *BuiltinName);
+
} // End Intrinsic namespace
} // End llvm namespace