xref: /freebsd-src/contrib/llvm-project/llvm/include/llvm-c/Core.h (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric /*===-- llvm-c/Core.h - Core Library C Interface ------------------*- C -*-===*\
20b57cec5SDimitry Andric |*                                                                            *|
30b57cec5SDimitry Andric |* Part of the LLVM Project, under the Apache License v2.0 with LLVM          *|
40b57cec5SDimitry Andric |* Exceptions.                                                                *|
50b57cec5SDimitry Andric |* See https://llvm.org/LICENSE.txt for license information.                  *|
60b57cec5SDimitry Andric |* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception                    *|
70b57cec5SDimitry Andric |*                                                                            *|
80b57cec5SDimitry Andric |*===----------------------------------------------------------------------===*|
90b57cec5SDimitry Andric |*                                                                            *|
100b57cec5SDimitry Andric |* This header declares the C interface to libLLVMCore.a, which implements    *|
110b57cec5SDimitry Andric |* the LLVM intermediate representation.                                      *|
120b57cec5SDimitry Andric |*                                                                            *|
130b57cec5SDimitry Andric \*===----------------------------------------------------------------------===*/
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric #ifndef LLVM_C_CORE_H
160b57cec5SDimitry Andric #define LLVM_C_CORE_H
170b57cec5SDimitry Andric 
180eae32dcSDimitry Andric #include "llvm-c/Deprecated.h"
190b57cec5SDimitry Andric #include "llvm-c/ErrorHandling.h"
20480093f4SDimitry Andric #include "llvm-c/ExternC.h"
211fd87a68SDimitry Andric 
220b57cec5SDimitry Andric #include "llvm-c/Types.h"
230b57cec5SDimitry Andric 
24480093f4SDimitry Andric LLVM_C_EXTERN_C_BEGIN
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric /**
270b57cec5SDimitry Andric  * @defgroup LLVMC LLVM-C: C interface to LLVM
280b57cec5SDimitry Andric  *
290b57cec5SDimitry Andric  * This module exposes parts of the LLVM library as a C API.
300b57cec5SDimitry Andric  *
310b57cec5SDimitry Andric  * @{
320b57cec5SDimitry Andric  */
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric /**
350b57cec5SDimitry Andric  * @defgroup LLVMCTransforms Transforms
360b57cec5SDimitry Andric  */
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric /**
390b57cec5SDimitry Andric  * @defgroup LLVMCCore Core
400b57cec5SDimitry Andric  *
410b57cec5SDimitry Andric  * This modules provide an interface to libLLVMCore, which implements
420b57cec5SDimitry Andric  * the LLVM intermediate representation as well as other related types
430b57cec5SDimitry Andric  * and utilities.
440b57cec5SDimitry Andric  *
450b57cec5SDimitry Andric  * Many exotic languages can interoperate with C code but have a harder time
460b57cec5SDimitry Andric  * with C++ due to name mangling. So in addition to C, this interface enables
470b57cec5SDimitry Andric  * tools written in such languages.
480b57cec5SDimitry Andric  *
490b57cec5SDimitry Andric  * @{
500b57cec5SDimitry Andric  */
510b57cec5SDimitry Andric 
520b57cec5SDimitry Andric /**
530b57cec5SDimitry Andric  * @defgroup LLVMCCoreTypes Types and Enumerations
540b57cec5SDimitry Andric  *
550b57cec5SDimitry Andric  * @{
560b57cec5SDimitry Andric  */
570b57cec5SDimitry Andric 
580b57cec5SDimitry Andric /// External users depend on the following values being stable. It is not safe
590b57cec5SDimitry Andric /// to reorder them.
600b57cec5SDimitry Andric typedef enum {
610b57cec5SDimitry Andric   /* Terminator Instructions */
620b57cec5SDimitry Andric   LLVMRet            = 1,
630b57cec5SDimitry Andric   LLVMBr             = 2,
640b57cec5SDimitry Andric   LLVMSwitch         = 3,
650b57cec5SDimitry Andric   LLVMIndirectBr     = 4,
660b57cec5SDimitry Andric   LLVMInvoke         = 5,
670b57cec5SDimitry Andric   /* removed 6 due to API changes */
680b57cec5SDimitry Andric   LLVMUnreachable    = 7,
690b57cec5SDimitry Andric   LLVMCallBr         = 67,
700b57cec5SDimitry Andric 
710b57cec5SDimitry Andric   /* Standard Unary Operators */
720b57cec5SDimitry Andric   LLVMFNeg           = 66,
730b57cec5SDimitry Andric 
740b57cec5SDimitry Andric   /* Standard Binary Operators */
750b57cec5SDimitry Andric   LLVMAdd            = 8,
760b57cec5SDimitry Andric   LLVMFAdd           = 9,
770b57cec5SDimitry Andric   LLVMSub            = 10,
780b57cec5SDimitry Andric   LLVMFSub           = 11,
790b57cec5SDimitry Andric   LLVMMul            = 12,
800b57cec5SDimitry Andric   LLVMFMul           = 13,
810b57cec5SDimitry Andric   LLVMUDiv           = 14,
820b57cec5SDimitry Andric   LLVMSDiv           = 15,
830b57cec5SDimitry Andric   LLVMFDiv           = 16,
840b57cec5SDimitry Andric   LLVMURem           = 17,
850b57cec5SDimitry Andric   LLVMSRem           = 18,
860b57cec5SDimitry Andric   LLVMFRem           = 19,
870b57cec5SDimitry Andric 
880b57cec5SDimitry Andric   /* Logical Operators */
890b57cec5SDimitry Andric   LLVMShl            = 20,
900b57cec5SDimitry Andric   LLVMLShr           = 21,
910b57cec5SDimitry Andric   LLVMAShr           = 22,
920b57cec5SDimitry Andric   LLVMAnd            = 23,
930b57cec5SDimitry Andric   LLVMOr             = 24,
940b57cec5SDimitry Andric   LLVMXor            = 25,
950b57cec5SDimitry Andric 
960b57cec5SDimitry Andric   /* Memory Operators */
970b57cec5SDimitry Andric   LLVMAlloca         = 26,
980b57cec5SDimitry Andric   LLVMLoad           = 27,
990b57cec5SDimitry Andric   LLVMStore          = 28,
1000b57cec5SDimitry Andric   LLVMGetElementPtr  = 29,
1010b57cec5SDimitry Andric 
1020b57cec5SDimitry Andric   /* Cast Operators */
1030b57cec5SDimitry Andric   LLVMTrunc          = 30,
1040b57cec5SDimitry Andric   LLVMZExt           = 31,
1050b57cec5SDimitry Andric   LLVMSExt           = 32,
1060b57cec5SDimitry Andric   LLVMFPToUI         = 33,
1070b57cec5SDimitry Andric   LLVMFPToSI         = 34,
1080b57cec5SDimitry Andric   LLVMUIToFP         = 35,
1090b57cec5SDimitry Andric   LLVMSIToFP         = 36,
1100b57cec5SDimitry Andric   LLVMFPTrunc        = 37,
1110b57cec5SDimitry Andric   LLVMFPExt          = 38,
1120b57cec5SDimitry Andric   LLVMPtrToInt       = 39,
1130b57cec5SDimitry Andric   LLVMIntToPtr       = 40,
1140b57cec5SDimitry Andric   LLVMBitCast        = 41,
1150b57cec5SDimitry Andric   LLVMAddrSpaceCast  = 60,
1160b57cec5SDimitry Andric 
1170b57cec5SDimitry Andric   /* Other Operators */
1180b57cec5SDimitry Andric   LLVMICmp           = 42,
1190b57cec5SDimitry Andric   LLVMFCmp           = 43,
1200b57cec5SDimitry Andric   LLVMPHI            = 44,
1210b57cec5SDimitry Andric   LLVMCall           = 45,
1220b57cec5SDimitry Andric   LLVMSelect         = 46,
1230b57cec5SDimitry Andric   LLVMUserOp1        = 47,
1240b57cec5SDimitry Andric   LLVMUserOp2        = 48,
1250b57cec5SDimitry Andric   LLVMVAArg          = 49,
1260b57cec5SDimitry Andric   LLVMExtractElement = 50,
1270b57cec5SDimitry Andric   LLVMInsertElement  = 51,
1280b57cec5SDimitry Andric   LLVMShuffleVector  = 52,
1290b57cec5SDimitry Andric   LLVMExtractValue   = 53,
1300b57cec5SDimitry Andric   LLVMInsertValue    = 54,
131480093f4SDimitry Andric   LLVMFreeze         = 68,
1320b57cec5SDimitry Andric 
1330b57cec5SDimitry Andric   /* Atomic operators */
1340b57cec5SDimitry Andric   LLVMFence          = 55,
1350b57cec5SDimitry Andric   LLVMAtomicCmpXchg  = 56,
1360b57cec5SDimitry Andric   LLVMAtomicRMW      = 57,
1370b57cec5SDimitry Andric 
1380b57cec5SDimitry Andric   /* Exception Handling Operators */
1390b57cec5SDimitry Andric   LLVMResume         = 58,
1400b57cec5SDimitry Andric   LLVMLandingPad     = 59,
1410b57cec5SDimitry Andric   LLVMCleanupRet     = 61,
1420b57cec5SDimitry Andric   LLVMCatchRet       = 62,
1430b57cec5SDimitry Andric   LLVMCatchPad       = 63,
1440b57cec5SDimitry Andric   LLVMCleanupPad     = 64,
1450b57cec5SDimitry Andric   LLVMCatchSwitch    = 65
1460b57cec5SDimitry Andric } LLVMOpcode;
1470b57cec5SDimitry Andric 
1480b57cec5SDimitry Andric typedef enum {
1490b57cec5SDimitry Andric   LLVMVoidTypeKind,      /**< type with no size */
1500b57cec5SDimitry Andric   LLVMHalfTypeKind,      /**< 16 bit floating point type */
1510b57cec5SDimitry Andric   LLVMFloatTypeKind,     /**< 32 bit floating point type */
1520b57cec5SDimitry Andric   LLVMDoubleTypeKind,    /**< 64 bit floating point type */
1530b57cec5SDimitry Andric   LLVMX86_FP80TypeKind,  /**< 80 bit floating point type (X87) */
1540b57cec5SDimitry Andric   LLVMFP128TypeKind,     /**< 128 bit floating point type (112-bit mantissa)*/
1550b57cec5SDimitry Andric   LLVMPPC_FP128TypeKind, /**< 128 bit floating point type (two 64-bits) */
1560b57cec5SDimitry Andric   LLVMLabelTypeKind,     /**< Labels */
1570b57cec5SDimitry Andric   LLVMIntegerTypeKind,   /**< Arbitrary bit width integers */
1580b57cec5SDimitry Andric   LLVMFunctionTypeKind,  /**< Functions */
1590b57cec5SDimitry Andric   LLVMStructTypeKind,    /**< Structures */
1600b57cec5SDimitry Andric   LLVMArrayTypeKind,     /**< Arrays */
1610b57cec5SDimitry Andric   LLVMPointerTypeKind,   /**< Pointers */
1625ffd83dbSDimitry Andric   LLVMVectorTypeKind,    /**< Fixed width SIMD vector type */
1630b57cec5SDimitry Andric   LLVMMetadataTypeKind,  /**< Metadata */
1640b57cec5SDimitry Andric   LLVMX86_MMXTypeKind,   /**< X86 MMX */
1655ffd83dbSDimitry Andric   LLVMTokenTypeKind,     /**< Tokens */
1665ffd83dbSDimitry Andric   LLVMScalableVectorTypeKind, /**< Scalable SIMD vector type */
167d409305fSDimitry Andric   LLVMBFloatTypeKind,    /**< 16 bit brain floating point type */
168bdd1243dSDimitry Andric   LLVMX86_AMXTypeKind,   /**< X86 AMX */
169bdd1243dSDimitry Andric   LLVMTargetExtTypeKind, /**< Target extension type */
1700b57cec5SDimitry Andric } LLVMTypeKind;
1710b57cec5SDimitry Andric 
1720b57cec5SDimitry Andric typedef enum {
1730b57cec5SDimitry Andric   LLVMExternalLinkage,    /**< Externally visible function */
1740b57cec5SDimitry Andric   LLVMAvailableExternallyLinkage,
1750b57cec5SDimitry Andric   LLVMLinkOnceAnyLinkage, /**< Keep one copy of function when linking (inline)*/
1760b57cec5SDimitry Andric   LLVMLinkOnceODRLinkage, /**< Same, but only replaced by something
1770b57cec5SDimitry Andric                             equivalent. */
1780b57cec5SDimitry Andric   LLVMLinkOnceODRAutoHideLinkage, /**< Obsolete */
1790b57cec5SDimitry Andric   LLVMWeakAnyLinkage,     /**< Keep one copy of function when linking (weak) */
1800b57cec5SDimitry Andric   LLVMWeakODRLinkage,     /**< Same, but only replaced by something
1810b57cec5SDimitry Andric                             equivalent. */
1820b57cec5SDimitry Andric   LLVMAppendingLinkage,   /**< Special purpose, only applies to global arrays */
1830b57cec5SDimitry Andric   LLVMInternalLinkage,    /**< Rename collisions when linking (static
1840b57cec5SDimitry Andric                                functions) */
1850b57cec5SDimitry Andric   LLVMPrivateLinkage,     /**< Like Internal, but omit from symbol table */
1860b57cec5SDimitry Andric   LLVMDLLImportLinkage,   /**< Obsolete */
1870b57cec5SDimitry Andric   LLVMDLLExportLinkage,   /**< Obsolete */
1880b57cec5SDimitry Andric   LLVMExternalWeakLinkage,/**< ExternalWeak linkage description */
1890b57cec5SDimitry Andric   LLVMGhostLinkage,       /**< Obsolete */
1900b57cec5SDimitry Andric   LLVMCommonLinkage,      /**< Tentative definitions */
1910b57cec5SDimitry Andric   LLVMLinkerPrivateLinkage, /**< Like Private, but linker removes. */
1920b57cec5SDimitry Andric   LLVMLinkerPrivateWeakLinkage /**< Like LinkerPrivate, but is weak. */
1930b57cec5SDimitry Andric } LLVMLinkage;
1940b57cec5SDimitry Andric 
1950b57cec5SDimitry Andric typedef enum {
1960b57cec5SDimitry Andric   LLVMDefaultVisibility,  /**< The GV is visible */
1970b57cec5SDimitry Andric   LLVMHiddenVisibility,   /**< The GV is hidden */
1980b57cec5SDimitry Andric   LLVMProtectedVisibility /**< The GV is protected */
1990b57cec5SDimitry Andric } LLVMVisibility;
2000b57cec5SDimitry Andric 
2010b57cec5SDimitry Andric typedef enum {
2020b57cec5SDimitry Andric   LLVMNoUnnamedAddr,    /**< Address of the GV is significant. */
2030b57cec5SDimitry Andric   LLVMLocalUnnamedAddr, /**< Address of the GV is locally insignificant. */
2040b57cec5SDimitry Andric   LLVMGlobalUnnamedAddr /**< Address of the GV is globally insignificant. */
2050b57cec5SDimitry Andric } LLVMUnnamedAddr;
2060b57cec5SDimitry Andric 
2070b57cec5SDimitry Andric typedef enum {
2080b57cec5SDimitry Andric   LLVMDefaultStorageClass   = 0,
2090b57cec5SDimitry Andric   LLVMDLLImportStorageClass = 1, /**< Function to be imported from DLL. */
2100b57cec5SDimitry Andric   LLVMDLLExportStorageClass = 2  /**< Function to be accessible from DLL. */
2110b57cec5SDimitry Andric } LLVMDLLStorageClass;
2120b57cec5SDimitry Andric 
2130b57cec5SDimitry Andric typedef enum {
2140b57cec5SDimitry Andric   LLVMCCallConv             = 0,
2150b57cec5SDimitry Andric   LLVMFastCallConv          = 8,
2160b57cec5SDimitry Andric   LLVMColdCallConv          = 9,
2170b57cec5SDimitry Andric   LLVMGHCCallConv           = 10,
2180b57cec5SDimitry Andric   LLVMHiPECallConv          = 11,
2190b57cec5SDimitry Andric   LLVMAnyRegCallConv        = 13,
2200b57cec5SDimitry Andric   LLVMPreserveMostCallConv  = 14,
2210b57cec5SDimitry Andric   LLVMPreserveAllCallConv   = 15,
2220b57cec5SDimitry Andric   LLVMSwiftCallConv         = 16,
2230b57cec5SDimitry Andric   LLVMCXXFASTTLSCallConv    = 17,
2240b57cec5SDimitry Andric   LLVMX86StdcallCallConv    = 64,
2250b57cec5SDimitry Andric   LLVMX86FastcallCallConv   = 65,
2260b57cec5SDimitry Andric   LLVMARMAPCSCallConv       = 66,
2270b57cec5SDimitry Andric   LLVMARMAAPCSCallConv      = 67,
2280b57cec5SDimitry Andric   LLVMARMAAPCSVFPCallConv   = 68,
2290b57cec5SDimitry Andric   LLVMMSP430INTRCallConv    = 69,
2300b57cec5SDimitry Andric   LLVMX86ThisCallCallConv   = 70,
2310b57cec5SDimitry Andric   LLVMPTXKernelCallConv     = 71,
2320b57cec5SDimitry Andric   LLVMPTXDeviceCallConv     = 72,
2330b57cec5SDimitry Andric   LLVMSPIRFUNCCallConv      = 75,
2340b57cec5SDimitry Andric   LLVMSPIRKERNELCallConv    = 76,
2350b57cec5SDimitry Andric   LLVMIntelOCLBICallConv    = 77,
2360b57cec5SDimitry Andric   LLVMX8664SysVCallConv     = 78,
2370b57cec5SDimitry Andric   LLVMWin64CallConv         = 79,
2380b57cec5SDimitry Andric   LLVMX86VectorCallCallConv = 80,
2390b57cec5SDimitry Andric   LLVMHHVMCallConv          = 81,
2400b57cec5SDimitry Andric   LLVMHHVMCCallConv         = 82,
2410b57cec5SDimitry Andric   LLVMX86INTRCallConv       = 83,
2420b57cec5SDimitry Andric   LLVMAVRINTRCallConv       = 84,
2430b57cec5SDimitry Andric   LLVMAVRSIGNALCallConv     = 85,
2440b57cec5SDimitry Andric   LLVMAVRBUILTINCallConv    = 86,
2450b57cec5SDimitry Andric   LLVMAMDGPUVSCallConv      = 87,
2460b57cec5SDimitry Andric   LLVMAMDGPUGSCallConv      = 88,
2470b57cec5SDimitry Andric   LLVMAMDGPUPSCallConv      = 89,
2480b57cec5SDimitry Andric   LLVMAMDGPUCSCallConv      = 90,
2490b57cec5SDimitry Andric   LLVMAMDGPUKERNELCallConv  = 91,
2500b57cec5SDimitry Andric   LLVMX86RegCallCallConv    = 92,
2510b57cec5SDimitry Andric   LLVMAMDGPUHSCallConv      = 93,
2520b57cec5SDimitry Andric   LLVMMSP430BUILTINCallConv = 94,
2530b57cec5SDimitry Andric   LLVMAMDGPULSCallConv      = 95,
2540b57cec5SDimitry Andric   LLVMAMDGPUESCallConv      = 96
2550b57cec5SDimitry Andric } LLVMCallConv;
2560b57cec5SDimitry Andric 
2570b57cec5SDimitry Andric typedef enum {
2580b57cec5SDimitry Andric   LLVMArgumentValueKind,
2590b57cec5SDimitry Andric   LLVMBasicBlockValueKind,
2600b57cec5SDimitry Andric   LLVMMemoryUseValueKind,
2610b57cec5SDimitry Andric   LLVMMemoryDefValueKind,
2620b57cec5SDimitry Andric   LLVMMemoryPhiValueKind,
2630b57cec5SDimitry Andric 
2640b57cec5SDimitry Andric   LLVMFunctionValueKind,
2650b57cec5SDimitry Andric   LLVMGlobalAliasValueKind,
2660b57cec5SDimitry Andric   LLVMGlobalIFuncValueKind,
2670b57cec5SDimitry Andric   LLVMGlobalVariableValueKind,
2680b57cec5SDimitry Andric   LLVMBlockAddressValueKind,
2690b57cec5SDimitry Andric   LLVMConstantExprValueKind,
2700b57cec5SDimitry Andric   LLVMConstantArrayValueKind,
2710b57cec5SDimitry Andric   LLVMConstantStructValueKind,
2720b57cec5SDimitry Andric   LLVMConstantVectorValueKind,
2730b57cec5SDimitry Andric 
2740b57cec5SDimitry Andric   LLVMUndefValueValueKind,
2750b57cec5SDimitry Andric   LLVMConstantAggregateZeroValueKind,
2760b57cec5SDimitry Andric   LLVMConstantDataArrayValueKind,
2770b57cec5SDimitry Andric   LLVMConstantDataVectorValueKind,
2780b57cec5SDimitry Andric   LLVMConstantIntValueKind,
2790b57cec5SDimitry Andric   LLVMConstantFPValueKind,
2800b57cec5SDimitry Andric   LLVMConstantPointerNullValueKind,
2810b57cec5SDimitry Andric   LLVMConstantTokenNoneValueKind,
2820b57cec5SDimitry Andric 
2830b57cec5SDimitry Andric   LLVMMetadataAsValueValueKind,
2840b57cec5SDimitry Andric   LLVMInlineAsmValueKind,
2850b57cec5SDimitry Andric 
2860b57cec5SDimitry Andric   LLVMInstructionValueKind,
287bdd1243dSDimitry Andric   LLVMPoisonValueValueKind,
288bdd1243dSDimitry Andric   LLVMConstantTargetNoneValueKind,
289*0fca6ea1SDimitry Andric   LLVMConstantPtrAuthValueKind,
2900b57cec5SDimitry Andric } LLVMValueKind;
2910b57cec5SDimitry Andric 
2920b57cec5SDimitry Andric typedef enum {
2930b57cec5SDimitry Andric   LLVMIntEQ = 32, /**< equal */
2940b57cec5SDimitry Andric   LLVMIntNE,      /**< not equal */
2950b57cec5SDimitry Andric   LLVMIntUGT,     /**< unsigned greater than */
2960b57cec5SDimitry Andric   LLVMIntUGE,     /**< unsigned greater or equal */
2970b57cec5SDimitry Andric   LLVMIntULT,     /**< unsigned less than */
2980b57cec5SDimitry Andric   LLVMIntULE,     /**< unsigned less or equal */
2990b57cec5SDimitry Andric   LLVMIntSGT,     /**< signed greater than */
3000b57cec5SDimitry Andric   LLVMIntSGE,     /**< signed greater or equal */
3010b57cec5SDimitry Andric   LLVMIntSLT,     /**< signed less than */
3020b57cec5SDimitry Andric   LLVMIntSLE      /**< signed less or equal */
3030b57cec5SDimitry Andric } LLVMIntPredicate;
3040b57cec5SDimitry Andric 
3050b57cec5SDimitry Andric typedef enum {
3060b57cec5SDimitry Andric   LLVMRealPredicateFalse, /**< Always false (always folded) */
3070b57cec5SDimitry Andric   LLVMRealOEQ,            /**< True if ordered and equal */
3080b57cec5SDimitry Andric   LLVMRealOGT,            /**< True if ordered and greater than */
3090b57cec5SDimitry Andric   LLVMRealOGE,            /**< True if ordered and greater than or equal */
3100b57cec5SDimitry Andric   LLVMRealOLT,            /**< True if ordered and less than */
3110b57cec5SDimitry Andric   LLVMRealOLE,            /**< True if ordered and less than or equal */
3120b57cec5SDimitry Andric   LLVMRealONE,            /**< True if ordered and operands are unequal */
3130b57cec5SDimitry Andric   LLVMRealORD,            /**< True if ordered (no nans) */
3140b57cec5SDimitry Andric   LLVMRealUNO,            /**< True if unordered: isnan(X) | isnan(Y) */
3150b57cec5SDimitry Andric   LLVMRealUEQ,            /**< True if unordered or equal */
3160b57cec5SDimitry Andric   LLVMRealUGT,            /**< True if unordered or greater than */
3170b57cec5SDimitry Andric   LLVMRealUGE,            /**< True if unordered, greater than, or equal */
3180b57cec5SDimitry Andric   LLVMRealULT,            /**< True if unordered or less than */
3190b57cec5SDimitry Andric   LLVMRealULE,            /**< True if unordered, less than, or equal */
3200b57cec5SDimitry Andric   LLVMRealUNE,            /**< True if unordered or not equal */
3210b57cec5SDimitry Andric   LLVMRealPredicateTrue   /**< Always true (always folded) */
3220b57cec5SDimitry Andric } LLVMRealPredicate;
3230b57cec5SDimitry Andric 
3240b57cec5SDimitry Andric typedef enum {
3250b57cec5SDimitry Andric   LLVMLandingPadCatch,    /**< A catch clause   */
3260b57cec5SDimitry Andric   LLVMLandingPadFilter    /**< A filter clause  */
3270b57cec5SDimitry Andric } LLVMLandingPadClauseTy;
3280b57cec5SDimitry Andric 
3290b57cec5SDimitry Andric typedef enum {
3300b57cec5SDimitry Andric   LLVMNotThreadLocal = 0,
3310b57cec5SDimitry Andric   LLVMGeneralDynamicTLSModel,
3320b57cec5SDimitry Andric   LLVMLocalDynamicTLSModel,
3330b57cec5SDimitry Andric   LLVMInitialExecTLSModel,
3340b57cec5SDimitry Andric   LLVMLocalExecTLSModel
3350b57cec5SDimitry Andric } LLVMThreadLocalMode;
3360b57cec5SDimitry Andric 
3370b57cec5SDimitry Andric typedef enum {
3380b57cec5SDimitry Andric   LLVMAtomicOrderingNotAtomic = 0, /**< A load or store which is not atomic */
3390b57cec5SDimitry Andric   LLVMAtomicOrderingUnordered = 1, /**< Lowest level of atomicity, guarantees
3400b57cec5SDimitry Andric                                      somewhat sane results, lock free. */
3410b57cec5SDimitry Andric   LLVMAtomicOrderingMonotonic = 2, /**< guarantees that if you take all the
3420b57cec5SDimitry Andric                                      operations affecting a specific address,
3430b57cec5SDimitry Andric                                      a consistent ordering exists */
3440b57cec5SDimitry Andric   LLVMAtomicOrderingAcquire = 4, /**< Acquire provides a barrier of the sort
3450b57cec5SDimitry Andric                                    necessary to acquire a lock to access other
3460b57cec5SDimitry Andric                                    memory with normal loads and stores. */
3470b57cec5SDimitry Andric   LLVMAtomicOrderingRelease = 5, /**< Release is similar to Acquire, but with
3480b57cec5SDimitry Andric                                    a barrier of the sort necessary to release
3490b57cec5SDimitry Andric                                    a lock. */
3500b57cec5SDimitry Andric   LLVMAtomicOrderingAcquireRelease = 6, /**< provides both an Acquire and a
3510b57cec5SDimitry Andric                                           Release barrier (for fences and
3520b57cec5SDimitry Andric                                           operations which both read and write
3530b57cec5SDimitry Andric                                            memory). */
3540b57cec5SDimitry Andric   LLVMAtomicOrderingSequentiallyConsistent = 7 /**< provides Acquire semantics
3550b57cec5SDimitry Andric                                                  for loads and Release
3560b57cec5SDimitry Andric                                                  semantics for stores.
3570b57cec5SDimitry Andric                                                  Additionally, it guarantees
3580b57cec5SDimitry Andric                                                  that a total ordering exists
3590b57cec5SDimitry Andric                                                  between all
3600b57cec5SDimitry Andric                                                  SequentiallyConsistent
3610b57cec5SDimitry Andric                                                  operations. */
3620b57cec5SDimitry Andric } LLVMAtomicOrdering;
3630b57cec5SDimitry Andric 
3640b57cec5SDimitry Andric typedef enum {
3650b57cec5SDimitry Andric   LLVMAtomicRMWBinOpXchg, /**< Set the new value and return the one old */
3660b57cec5SDimitry Andric   LLVMAtomicRMWBinOpAdd,  /**< Add a value and return the old one */
3670b57cec5SDimitry Andric   LLVMAtomicRMWBinOpSub,  /**< Subtract a value and return the old one */
3680b57cec5SDimitry Andric   LLVMAtomicRMWBinOpAnd,  /**< And a value and return the old one */
3690b57cec5SDimitry Andric   LLVMAtomicRMWBinOpNand, /**< Not-And a value and return the old one */
3700b57cec5SDimitry Andric   LLVMAtomicRMWBinOpOr,   /**< OR a value and return the old one */
3710b57cec5SDimitry Andric   LLVMAtomicRMWBinOpXor,  /**< Xor a value and return the old one */
3720b57cec5SDimitry Andric   LLVMAtomicRMWBinOpMax,  /**< Sets the value if it's greater than the
3730b57cec5SDimitry Andric                             original using a signed comparison and return
3740b57cec5SDimitry Andric                             the old one */
3750b57cec5SDimitry Andric   LLVMAtomicRMWBinOpMin,  /**< Sets the value if it's Smaller than the
3760b57cec5SDimitry Andric                             original using a signed comparison and return
3770b57cec5SDimitry Andric                             the old one */
3780b57cec5SDimitry Andric   LLVMAtomicRMWBinOpUMax, /**< Sets the value if it's greater than the
3790b57cec5SDimitry Andric                            original using an unsigned comparison and return
3800b57cec5SDimitry Andric                            the old one */
3818bcb0991SDimitry Andric   LLVMAtomicRMWBinOpUMin, /**< Sets the value if it's greater than the
3820b57cec5SDimitry Andric                             original using an unsigned comparison and return
3830b57cec5SDimitry Andric                             the old one */
3848bcb0991SDimitry Andric   LLVMAtomicRMWBinOpFAdd, /**< Add a floating point value and return the
3858bcb0991SDimitry Andric                             old one */
386753f127fSDimitry Andric   LLVMAtomicRMWBinOpFSub, /**< Subtract a floating point value and return the
3878bcb0991SDimitry Andric                           old one */
388753f127fSDimitry Andric   LLVMAtomicRMWBinOpFMax, /**< Sets the value if it's greater than the
389753f127fSDimitry Andric                            original using an floating point comparison and
390753f127fSDimitry Andric                            return the old one */
391753f127fSDimitry Andric   LLVMAtomicRMWBinOpFMin, /**< Sets the value if it's smaller than the
392753f127fSDimitry Andric                            original using an floating point comparison and
393753f127fSDimitry Andric                            return the old one */
394*0fca6ea1SDimitry Andric   LLVMAtomicRMWBinOpUIncWrap, /**< Increments the value, wrapping back to zero
395*0fca6ea1SDimitry Andric                                when incremented above input value */
396*0fca6ea1SDimitry Andric   LLVMAtomicRMWBinOpUDecWrap, /**< Decrements the value, wrapping back to
397*0fca6ea1SDimitry Andric                                the input value when decremented below zero */
3980b57cec5SDimitry Andric } LLVMAtomicRMWBinOp;
3990b57cec5SDimitry Andric 
4000b57cec5SDimitry Andric typedef enum {
4010b57cec5SDimitry Andric     LLVMDSError,
4020b57cec5SDimitry Andric     LLVMDSWarning,
4030b57cec5SDimitry Andric     LLVMDSRemark,
4040b57cec5SDimitry Andric     LLVMDSNote
4050b57cec5SDimitry Andric } LLVMDiagnosticSeverity;
4060b57cec5SDimitry Andric 
4070b57cec5SDimitry Andric typedef enum {
4080b57cec5SDimitry Andric   LLVMInlineAsmDialectATT,
4090b57cec5SDimitry Andric   LLVMInlineAsmDialectIntel
4100b57cec5SDimitry Andric } LLVMInlineAsmDialect;
4110b57cec5SDimitry Andric 
4120b57cec5SDimitry Andric typedef enum {
4130b57cec5SDimitry Andric   /**
4140b57cec5SDimitry Andric    * Emits an error if two values disagree, otherwise the resulting value is
4150b57cec5SDimitry Andric    * that of the operands.
4160b57cec5SDimitry Andric    *
4170b57cec5SDimitry Andric    * @see Module::ModFlagBehavior::Error
4180b57cec5SDimitry Andric    */
4190b57cec5SDimitry Andric   LLVMModuleFlagBehaviorError,
4200b57cec5SDimitry Andric   /**
4210b57cec5SDimitry Andric    * Emits a warning if two values disagree. The result value will be the
4220b57cec5SDimitry Andric    * operand for the flag from the first module being linked.
4230b57cec5SDimitry Andric    *
4240b57cec5SDimitry Andric    * @see Module::ModFlagBehavior::Warning
4250b57cec5SDimitry Andric    */
4260b57cec5SDimitry Andric   LLVMModuleFlagBehaviorWarning,
4270b57cec5SDimitry Andric   /**
4280b57cec5SDimitry Andric    * Adds a requirement that another module flag be present and have a
4290b57cec5SDimitry Andric    * specified value after linking is performed. The value must be a metadata
4300b57cec5SDimitry Andric    * pair, where the first element of the pair is the ID of the module flag
4310b57cec5SDimitry Andric    * to be restricted, and the second element of the pair is the value the
4320b57cec5SDimitry Andric    * module flag should be restricted to. This behavior can be used to
4330b57cec5SDimitry Andric    * restrict the allowable results (via triggering of an error) of linking
4340b57cec5SDimitry Andric    * IDs with the **Override** behavior.
4350b57cec5SDimitry Andric    *
4360b57cec5SDimitry Andric    * @see Module::ModFlagBehavior::Require
4370b57cec5SDimitry Andric    */
4380b57cec5SDimitry Andric   LLVMModuleFlagBehaviorRequire,
4390b57cec5SDimitry Andric   /**
4400b57cec5SDimitry Andric    * Uses the specified value, regardless of the behavior or value of the
4410b57cec5SDimitry Andric    * other module. If both modules specify **Override**, but the values
4420b57cec5SDimitry Andric    * differ, an error will be emitted.
4430b57cec5SDimitry Andric    *
4440b57cec5SDimitry Andric    * @see Module::ModFlagBehavior::Override
4450b57cec5SDimitry Andric    */
4460b57cec5SDimitry Andric   LLVMModuleFlagBehaviorOverride,
4470b57cec5SDimitry Andric   /**
4480b57cec5SDimitry Andric    * Appends the two values, which are required to be metadata nodes.
4490b57cec5SDimitry Andric    *
4500b57cec5SDimitry Andric    * @see Module::ModFlagBehavior::Append
4510b57cec5SDimitry Andric    */
4520b57cec5SDimitry Andric   LLVMModuleFlagBehaviorAppend,
4530b57cec5SDimitry Andric   /**
4540b57cec5SDimitry Andric    * Appends the two values, which are required to be metadata
4550b57cec5SDimitry Andric    * nodes. However, duplicate entries in the second list are dropped
4560b57cec5SDimitry Andric    * during the append operation.
4570b57cec5SDimitry Andric    *
4580b57cec5SDimitry Andric    * @see Module::ModFlagBehavior::AppendUnique
4590b57cec5SDimitry Andric    */
4600b57cec5SDimitry Andric   LLVMModuleFlagBehaviorAppendUnique,
4610b57cec5SDimitry Andric } LLVMModuleFlagBehavior;
4620b57cec5SDimitry Andric 
4630b57cec5SDimitry Andric /**
4640b57cec5SDimitry Andric  * Attribute index are either LLVMAttributeReturnIndex,
4650b57cec5SDimitry Andric  * LLVMAttributeFunctionIndex or a parameter number from 1 to N.
4660b57cec5SDimitry Andric  */
4670b57cec5SDimitry Andric enum {
4680b57cec5SDimitry Andric   LLVMAttributeReturnIndex = 0U,
4690b57cec5SDimitry Andric   // ISO C restricts enumerator values to range of 'int'
4700b57cec5SDimitry Andric   // (4294967295 is too large)
4710b57cec5SDimitry Andric   // LLVMAttributeFunctionIndex = ~0U,
4720b57cec5SDimitry Andric   LLVMAttributeFunctionIndex = -1,
4730b57cec5SDimitry Andric };
4740b57cec5SDimitry Andric 
475*0fca6ea1SDimitry Andric typedef unsigned LLVMAttributeIndex;
476*0fca6ea1SDimitry Andric 
4775f757f3fSDimitry Andric /**
4785f757f3fSDimitry Andric  * Tail call kind for LLVMSetTailCallKind and LLVMGetTailCallKind.
4795f757f3fSDimitry Andric  *
4805f757f3fSDimitry Andric  * Note that 'musttail' implies 'tail'.
4815f757f3fSDimitry Andric  *
4825f757f3fSDimitry Andric  * @see CallInst::TailCallKind
4835f757f3fSDimitry Andric  */
4845f757f3fSDimitry Andric typedef enum {
4855f757f3fSDimitry Andric   LLVMTailCallKindNone = 0,
4865f757f3fSDimitry Andric   LLVMTailCallKindTail = 1,
4875f757f3fSDimitry Andric   LLVMTailCallKindMustTail = 2,
4885f757f3fSDimitry Andric   LLVMTailCallKindNoTail = 3,
4895f757f3fSDimitry Andric } LLVMTailCallKind;
4905f757f3fSDimitry Andric 
4915f757f3fSDimitry Andric enum {
4925f757f3fSDimitry Andric   LLVMFastMathAllowReassoc = (1 << 0),
4935f757f3fSDimitry Andric   LLVMFastMathNoNaNs = (1 << 1),
4945f757f3fSDimitry Andric   LLVMFastMathNoInfs = (1 << 2),
4955f757f3fSDimitry Andric   LLVMFastMathNoSignedZeros = (1 << 3),
4965f757f3fSDimitry Andric   LLVMFastMathAllowReciprocal = (1 << 4),
4975f757f3fSDimitry Andric   LLVMFastMathAllowContract = (1 << 5),
4985f757f3fSDimitry Andric   LLVMFastMathApproxFunc = (1 << 6),
4995f757f3fSDimitry Andric   LLVMFastMathNone = 0,
5005f757f3fSDimitry Andric   LLVMFastMathAll = LLVMFastMathAllowReassoc | LLVMFastMathNoNaNs |
5015f757f3fSDimitry Andric                     LLVMFastMathNoInfs | LLVMFastMathNoSignedZeros |
5025f757f3fSDimitry Andric                     LLVMFastMathAllowReciprocal | LLVMFastMathAllowContract |
5035f757f3fSDimitry Andric                     LLVMFastMathApproxFunc,
5045f757f3fSDimitry Andric };
5055f757f3fSDimitry Andric 
5065f757f3fSDimitry Andric /**
5075f757f3fSDimitry Andric  * Flags to indicate what fast-math-style optimizations are allowed
5085f757f3fSDimitry Andric  * on operations.
5095f757f3fSDimitry Andric  *
5105f757f3fSDimitry Andric  * See https://llvm.org/docs/LangRef.html#fast-math-flags
5115f757f3fSDimitry Andric  */
5125f757f3fSDimitry Andric typedef unsigned LLVMFastMathFlags;
5135f757f3fSDimitry Andric 
514*0fca6ea1SDimitry Andric enum {
515*0fca6ea1SDimitry Andric   LLVMGEPFlagInBounds = (1 << 0),
516*0fca6ea1SDimitry Andric   LLVMGEPFlagNUSW = (1 << 1),
517*0fca6ea1SDimitry Andric   LLVMGEPFlagNUW = (1 << 2),
518*0fca6ea1SDimitry Andric };
519*0fca6ea1SDimitry Andric 
520*0fca6ea1SDimitry Andric /**
521*0fca6ea1SDimitry Andric  * Flags that constrain the allowed wrap semantics of a getelementptr
522*0fca6ea1SDimitry Andric  * instruction.
523*0fca6ea1SDimitry Andric  *
524*0fca6ea1SDimitry Andric  * See https://llvm.org/docs/LangRef.html#getelementptr-instruction
525*0fca6ea1SDimitry Andric  */
526*0fca6ea1SDimitry Andric typedef unsigned LLVMGEPNoWrapFlags;
527*0fca6ea1SDimitry Andric 
5280b57cec5SDimitry Andric /**
5290b57cec5SDimitry Andric  * @}
5300b57cec5SDimitry Andric  */
5310b57cec5SDimitry Andric 
5320b57cec5SDimitry Andric /** Deallocate and destroy all ManagedStatic variables.
5330b57cec5SDimitry Andric     @see llvm::llvm_shutdown
5340b57cec5SDimitry Andric     @see ManagedStatic */
5350b57cec5SDimitry Andric void LLVMShutdown(void);
5360b57cec5SDimitry Andric 
537bdd1243dSDimitry Andric /*===-- Version query -----------------------------------------------------===*/
538bdd1243dSDimitry Andric 
539bdd1243dSDimitry Andric /**
540bdd1243dSDimitry Andric  * Return the major, minor, and patch version of LLVM
541bdd1243dSDimitry Andric  *
542bdd1243dSDimitry Andric  * The version components are returned via the function's three output
543bdd1243dSDimitry Andric  * parameters or skipped if a NULL pointer was supplied.
544bdd1243dSDimitry Andric  */
545bdd1243dSDimitry Andric void LLVMGetVersion(unsigned *Major, unsigned *Minor, unsigned *Patch);
546bdd1243dSDimitry Andric 
5470b57cec5SDimitry Andric /*===-- Error handling ----------------------------------------------------===*/
5480b57cec5SDimitry Andric 
5490b57cec5SDimitry Andric char *LLVMCreateMessage(const char *Message);
5500b57cec5SDimitry Andric void LLVMDisposeMessage(char *Message);
5510b57cec5SDimitry Andric 
5520b57cec5SDimitry Andric /**
5530b57cec5SDimitry Andric  * @defgroup LLVMCCoreContext Contexts
5540b57cec5SDimitry Andric  *
5550b57cec5SDimitry Andric  * Contexts are execution states for the core LLVM IR system.
5560b57cec5SDimitry Andric  *
5570b57cec5SDimitry Andric  * Most types are tied to a context instance. Multiple contexts can
5580b57cec5SDimitry Andric  * exist simultaneously. A single context is not thread safe. However,
5590b57cec5SDimitry Andric  * different contexts can execute on different threads simultaneously.
5600b57cec5SDimitry Andric  *
5610b57cec5SDimitry Andric  * @{
5620b57cec5SDimitry Andric  */
5630b57cec5SDimitry Andric 
5640b57cec5SDimitry Andric typedef void (*LLVMDiagnosticHandler)(LLVMDiagnosticInfoRef, void *);
5650b57cec5SDimitry Andric typedef void (*LLVMYieldCallback)(LLVMContextRef, void *);
5660b57cec5SDimitry Andric 
5670b57cec5SDimitry Andric /**
5680b57cec5SDimitry Andric  * Create a new context.
5690b57cec5SDimitry Andric  *
5700b57cec5SDimitry Andric  * Every call to this function should be paired with a call to
5710b57cec5SDimitry Andric  * LLVMContextDispose() or the context will leak memory.
5720b57cec5SDimitry Andric  */
5730b57cec5SDimitry Andric LLVMContextRef LLVMContextCreate(void);
5740b57cec5SDimitry Andric 
5750b57cec5SDimitry Andric /**
5760b57cec5SDimitry Andric  * Obtain the global context instance.
5770b57cec5SDimitry Andric  */
5780b57cec5SDimitry Andric LLVMContextRef LLVMGetGlobalContext(void);
5790b57cec5SDimitry Andric 
5800b57cec5SDimitry Andric /**
5810b57cec5SDimitry Andric  * Set the diagnostic handler for this context.
5820b57cec5SDimitry Andric  */
5830b57cec5SDimitry Andric void LLVMContextSetDiagnosticHandler(LLVMContextRef C,
5840b57cec5SDimitry Andric                                      LLVMDiagnosticHandler Handler,
5850b57cec5SDimitry Andric                                      void *DiagnosticContext);
5860b57cec5SDimitry Andric 
5870b57cec5SDimitry Andric /**
5880b57cec5SDimitry Andric  * Get the diagnostic handler of this context.
5890b57cec5SDimitry Andric  */
5900b57cec5SDimitry Andric LLVMDiagnosticHandler LLVMContextGetDiagnosticHandler(LLVMContextRef C);
5910b57cec5SDimitry Andric 
5920b57cec5SDimitry Andric /**
5930b57cec5SDimitry Andric  * Get the diagnostic context of this context.
5940b57cec5SDimitry Andric  */
5950b57cec5SDimitry Andric void *LLVMContextGetDiagnosticContext(LLVMContextRef C);
5960b57cec5SDimitry Andric 
5970b57cec5SDimitry Andric /**
5980b57cec5SDimitry Andric  * Set the yield callback function for this context.
5990b57cec5SDimitry Andric  *
6000b57cec5SDimitry Andric  * @see LLVMContext::setYieldCallback()
6010b57cec5SDimitry Andric  */
6020b57cec5SDimitry Andric void LLVMContextSetYieldCallback(LLVMContextRef C, LLVMYieldCallback Callback,
6030b57cec5SDimitry Andric                                  void *OpaqueHandle);
6040b57cec5SDimitry Andric 
6050b57cec5SDimitry Andric /**
6060b57cec5SDimitry Andric  * Retrieve whether the given context is set to discard all value names.
6070b57cec5SDimitry Andric  *
6080b57cec5SDimitry Andric  * @see LLVMContext::shouldDiscardValueNames()
6090b57cec5SDimitry Andric  */
6100b57cec5SDimitry Andric LLVMBool LLVMContextShouldDiscardValueNames(LLVMContextRef C);
6110b57cec5SDimitry Andric 
6120b57cec5SDimitry Andric /**
6130b57cec5SDimitry Andric  * Set whether the given context discards all value names.
6140b57cec5SDimitry Andric  *
6150b57cec5SDimitry Andric  * If true, only the names of GlobalValue objects will be available in the IR.
6160b57cec5SDimitry Andric  * This can be used to save memory and runtime, especially in release mode.
6170b57cec5SDimitry Andric  *
6180b57cec5SDimitry Andric  * @see LLVMContext::setDiscardValueNames()
6190b57cec5SDimitry Andric  */
6200b57cec5SDimitry Andric void LLVMContextSetDiscardValueNames(LLVMContextRef C, LLVMBool Discard);
6210b57cec5SDimitry Andric 
6220b57cec5SDimitry Andric /**
6230b57cec5SDimitry Andric  * Destroy a context instance.
6240b57cec5SDimitry Andric  *
6250b57cec5SDimitry Andric  * This should be called for every call to LLVMContextCreate() or memory
6260b57cec5SDimitry Andric  * will be leaked.
6270b57cec5SDimitry Andric  */
6280b57cec5SDimitry Andric void LLVMContextDispose(LLVMContextRef C);
6290b57cec5SDimitry Andric 
6300b57cec5SDimitry Andric /**
6310b57cec5SDimitry Andric  * Return a string representation of the DiagnosticInfo. Use
6320b57cec5SDimitry Andric  * LLVMDisposeMessage to free the string.
6330b57cec5SDimitry Andric  *
6340b57cec5SDimitry Andric  * @see DiagnosticInfo::print()
6350b57cec5SDimitry Andric  */
6360b57cec5SDimitry Andric char *LLVMGetDiagInfoDescription(LLVMDiagnosticInfoRef DI);
6370b57cec5SDimitry Andric 
6380b57cec5SDimitry Andric /**
6390b57cec5SDimitry Andric  * Return an enum LLVMDiagnosticSeverity.
6400b57cec5SDimitry Andric  *
6410b57cec5SDimitry Andric  * @see DiagnosticInfo::getSeverity()
6420b57cec5SDimitry Andric  */
6430b57cec5SDimitry Andric LLVMDiagnosticSeverity LLVMGetDiagInfoSeverity(LLVMDiagnosticInfoRef DI);
6440b57cec5SDimitry Andric 
6450b57cec5SDimitry Andric unsigned LLVMGetMDKindIDInContext(LLVMContextRef C, const char *Name,
6460b57cec5SDimitry Andric                                   unsigned SLen);
6470b57cec5SDimitry Andric unsigned LLVMGetMDKindID(const char *Name, unsigned SLen);
6480b57cec5SDimitry Andric 
6490b57cec5SDimitry Andric /**
6500b57cec5SDimitry Andric  * Return an unique id given the name of a enum attribute,
6510b57cec5SDimitry Andric  * or 0 if no attribute by that name exists.
6520b57cec5SDimitry Andric  *
6530b57cec5SDimitry Andric  * See http://llvm.org/docs/LangRef.html#parameter-attributes
6540b57cec5SDimitry Andric  * and http://llvm.org/docs/LangRef.html#function-attributes
6550b57cec5SDimitry Andric  * for the list of available attributes.
6560b57cec5SDimitry Andric  *
6570b57cec5SDimitry Andric  * NB: Attribute names and/or id are subject to change without
6580b57cec5SDimitry Andric  * going through the C API deprecation cycle.
6590b57cec5SDimitry Andric  */
6600b57cec5SDimitry Andric unsigned LLVMGetEnumAttributeKindForName(const char *Name, size_t SLen);
6610b57cec5SDimitry Andric unsigned LLVMGetLastEnumAttributeKind(void);
6620b57cec5SDimitry Andric 
6630b57cec5SDimitry Andric /**
6640b57cec5SDimitry Andric  * Create an enum attribute.
6650b57cec5SDimitry Andric  */
6660b57cec5SDimitry Andric LLVMAttributeRef LLVMCreateEnumAttribute(LLVMContextRef C, unsigned KindID,
6670b57cec5SDimitry Andric                                          uint64_t Val);
6680b57cec5SDimitry Andric 
6690b57cec5SDimitry Andric /**
6700b57cec5SDimitry Andric  * Get the unique id corresponding to the enum attribute
6710b57cec5SDimitry Andric  * passed as argument.
6720b57cec5SDimitry Andric  */
6730b57cec5SDimitry Andric unsigned LLVMGetEnumAttributeKind(LLVMAttributeRef A);
6740b57cec5SDimitry Andric 
6750b57cec5SDimitry Andric /**
6760b57cec5SDimitry Andric  * Get the enum attribute's value. 0 is returned if none exists.
6770b57cec5SDimitry Andric  */
6780b57cec5SDimitry Andric uint64_t LLVMGetEnumAttributeValue(LLVMAttributeRef A);
6790b57cec5SDimitry Andric 
6800b57cec5SDimitry Andric /**
6814652422eSDimitry Andric  * Create a type attribute
6824652422eSDimitry Andric  */
6834652422eSDimitry Andric LLVMAttributeRef LLVMCreateTypeAttribute(LLVMContextRef C, unsigned KindID,
6844652422eSDimitry Andric                                          LLVMTypeRef type_ref);
6854652422eSDimitry Andric 
6864652422eSDimitry Andric /**
6874652422eSDimitry Andric  * Get the type attribute's value.
6884652422eSDimitry Andric  */
6894652422eSDimitry Andric LLVMTypeRef LLVMGetTypeAttributeValue(LLVMAttributeRef A);
6904652422eSDimitry Andric 
6914652422eSDimitry Andric /**
692*0fca6ea1SDimitry Andric  * Create a ConstantRange attribute.
693*0fca6ea1SDimitry Andric  *
694*0fca6ea1SDimitry Andric  * LowerWords and UpperWords need to be NumBits divided by 64 rounded up
695*0fca6ea1SDimitry Andric  * elements long.
696*0fca6ea1SDimitry Andric  */
697*0fca6ea1SDimitry Andric LLVMAttributeRef LLVMCreateConstantRangeAttribute(LLVMContextRef C,
698*0fca6ea1SDimitry Andric                                                   unsigned KindID,
699*0fca6ea1SDimitry Andric                                                   unsigned NumBits,
700*0fca6ea1SDimitry Andric                                                   const uint64_t LowerWords[],
701*0fca6ea1SDimitry Andric                                                   const uint64_t UpperWords[]);
702*0fca6ea1SDimitry Andric 
703*0fca6ea1SDimitry Andric /**
7040b57cec5SDimitry Andric  * Create a string attribute.
7050b57cec5SDimitry Andric  */
7060b57cec5SDimitry Andric LLVMAttributeRef LLVMCreateStringAttribute(LLVMContextRef C,
7070b57cec5SDimitry Andric                                            const char *K, unsigned KLength,
7080b57cec5SDimitry Andric                                            const char *V, unsigned VLength);
7090b57cec5SDimitry Andric 
7100b57cec5SDimitry Andric /**
7110b57cec5SDimitry Andric  * Get the string attribute's kind.
7120b57cec5SDimitry Andric  */
7130b57cec5SDimitry Andric const char *LLVMGetStringAttributeKind(LLVMAttributeRef A, unsigned *Length);
7140b57cec5SDimitry Andric 
7150b57cec5SDimitry Andric /**
7160b57cec5SDimitry Andric  * Get the string attribute's value.
7170b57cec5SDimitry Andric  */
7180b57cec5SDimitry Andric const char *LLVMGetStringAttributeValue(LLVMAttributeRef A, unsigned *Length);
7190b57cec5SDimitry Andric 
7200b57cec5SDimitry Andric /**
7210b57cec5SDimitry Andric  * Check for the different types of attributes.
7220b57cec5SDimitry Andric  */
7230b57cec5SDimitry Andric LLVMBool LLVMIsEnumAttribute(LLVMAttributeRef A);
7240b57cec5SDimitry Andric LLVMBool LLVMIsStringAttribute(LLVMAttributeRef A);
7254652422eSDimitry Andric LLVMBool LLVMIsTypeAttribute(LLVMAttributeRef A);
7260b57cec5SDimitry Andric 
7270b57cec5SDimitry Andric /**
728e8d8bef9SDimitry Andric  * Obtain a Type from a context by its registered name.
729e8d8bef9SDimitry Andric  */
730e8d8bef9SDimitry Andric LLVMTypeRef LLVMGetTypeByName2(LLVMContextRef C, const char *Name);
731e8d8bef9SDimitry Andric 
732e8d8bef9SDimitry Andric /**
7330b57cec5SDimitry Andric  * @}
7340b57cec5SDimitry Andric  */
7350b57cec5SDimitry Andric 
7360b57cec5SDimitry Andric /**
7370b57cec5SDimitry Andric  * @defgroup LLVMCCoreModule Modules
7380b57cec5SDimitry Andric  *
7390b57cec5SDimitry Andric  * Modules represent the top-level structure in an LLVM program. An LLVM
7400b57cec5SDimitry Andric  * module is effectively a translation unit or a collection of
7410b57cec5SDimitry Andric  * translation units merged together.
7420b57cec5SDimitry Andric  *
7430b57cec5SDimitry Andric  * @{
7440b57cec5SDimitry Andric  */
7450b57cec5SDimitry Andric 
7460b57cec5SDimitry Andric /**
7470b57cec5SDimitry Andric  * Create a new, empty module in the global context.
7480b57cec5SDimitry Andric  *
7490b57cec5SDimitry Andric  * This is equivalent to calling LLVMModuleCreateWithNameInContext with
7500b57cec5SDimitry Andric  * LLVMGetGlobalContext() as the context parameter.
7510b57cec5SDimitry Andric  *
7520b57cec5SDimitry Andric  * Every invocation should be paired with LLVMDisposeModule() or memory
7530b57cec5SDimitry Andric  * will be leaked.
7540b57cec5SDimitry Andric  */
7550b57cec5SDimitry Andric LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
7560b57cec5SDimitry Andric 
7570b57cec5SDimitry Andric /**
7580b57cec5SDimitry Andric  * Create a new, empty module in a specific context.
7590b57cec5SDimitry Andric  *
7600b57cec5SDimitry Andric  * Every invocation should be paired with LLVMDisposeModule() or memory
7610b57cec5SDimitry Andric  * will be leaked.
7620b57cec5SDimitry Andric  */
7630b57cec5SDimitry Andric LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID,
7640b57cec5SDimitry Andric                                                 LLVMContextRef C);
7650b57cec5SDimitry Andric /**
7660b57cec5SDimitry Andric  * Return an exact copy of the specified module.
7670b57cec5SDimitry Andric  */
7680b57cec5SDimitry Andric LLVMModuleRef LLVMCloneModule(LLVMModuleRef M);
7690b57cec5SDimitry Andric 
7700b57cec5SDimitry Andric /**
7710b57cec5SDimitry Andric  * Destroy a module instance.
7720b57cec5SDimitry Andric  *
7730b57cec5SDimitry Andric  * This must be called for every created module or memory will be
7740b57cec5SDimitry Andric  * leaked.
7750b57cec5SDimitry Andric  */
7760b57cec5SDimitry Andric void LLVMDisposeModule(LLVMModuleRef M);
7770b57cec5SDimitry Andric 
7780b57cec5SDimitry Andric /**
779*0fca6ea1SDimitry Andric  * Soon to be deprecated.
780*0fca6ea1SDimitry Andric  * See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes
781*0fca6ea1SDimitry Andric  *
782*0fca6ea1SDimitry Andric  * Returns true if the module is in the new debug info mode which uses
783*0fca6ea1SDimitry Andric  * non-instruction debug records instead of debug intrinsics for variable
784*0fca6ea1SDimitry Andric  * location tracking.
785*0fca6ea1SDimitry Andric  */
786*0fca6ea1SDimitry Andric LLVMBool LLVMIsNewDbgInfoFormat(LLVMModuleRef M);
787*0fca6ea1SDimitry Andric 
788*0fca6ea1SDimitry Andric /**
789*0fca6ea1SDimitry Andric  * Soon to be deprecated.
790*0fca6ea1SDimitry Andric  * See https://llvm.org/docs/RemoveDIsDebugInfo.html#c-api-changes
791*0fca6ea1SDimitry Andric  *
792*0fca6ea1SDimitry Andric  * Convert module into desired debug info format.
793*0fca6ea1SDimitry Andric  */
794*0fca6ea1SDimitry Andric void LLVMSetIsNewDbgInfoFormat(LLVMModuleRef M, LLVMBool UseNewFormat);
795*0fca6ea1SDimitry Andric 
796*0fca6ea1SDimitry Andric /**
7970b57cec5SDimitry Andric  * Obtain the identifier of a module.
7980b57cec5SDimitry Andric  *
7990b57cec5SDimitry Andric  * @param M Module to obtain identifier of
8000b57cec5SDimitry Andric  * @param Len Out parameter which holds the length of the returned string.
8010b57cec5SDimitry Andric  * @return The identifier of M.
8020b57cec5SDimitry Andric  * @see Module::getModuleIdentifier()
8030b57cec5SDimitry Andric  */
8040b57cec5SDimitry Andric const char *LLVMGetModuleIdentifier(LLVMModuleRef M, size_t *Len);
8050b57cec5SDimitry Andric 
8060b57cec5SDimitry Andric /**
8070b57cec5SDimitry Andric  * Set the identifier of a module to a string Ident with length Len.
8080b57cec5SDimitry Andric  *
8090b57cec5SDimitry Andric  * @param M The module to set identifier
8100b57cec5SDimitry Andric  * @param Ident The string to set M's identifier to
8110b57cec5SDimitry Andric  * @param Len Length of Ident
8120b57cec5SDimitry Andric  * @see Module::setModuleIdentifier()
8130b57cec5SDimitry Andric  */
8140b57cec5SDimitry Andric void LLVMSetModuleIdentifier(LLVMModuleRef M, const char *Ident, size_t Len);
8150b57cec5SDimitry Andric 
8160b57cec5SDimitry Andric /**
8170b57cec5SDimitry Andric  * Obtain the module's original source file name.
8180b57cec5SDimitry Andric  *
8190b57cec5SDimitry Andric  * @param M Module to obtain the name of
8200b57cec5SDimitry Andric  * @param Len Out parameter which holds the length of the returned string
8210b57cec5SDimitry Andric  * @return The original source file name of M
8220b57cec5SDimitry Andric  * @see Module::getSourceFileName()
8230b57cec5SDimitry Andric  */
8240b57cec5SDimitry Andric const char *LLVMGetSourceFileName(LLVMModuleRef M, size_t *Len);
8250b57cec5SDimitry Andric 
8260b57cec5SDimitry Andric /**
8270b57cec5SDimitry Andric  * Set the original source file name of a module to a string Name with length
8280b57cec5SDimitry Andric  * Len.
8290b57cec5SDimitry Andric  *
8300b57cec5SDimitry Andric  * @param M The module to set the source file name of
8310b57cec5SDimitry Andric  * @param Name The string to set M's source file name to
8320b57cec5SDimitry Andric  * @param Len Length of Name
8330b57cec5SDimitry Andric  * @see Module::setSourceFileName()
8340b57cec5SDimitry Andric  */
8350b57cec5SDimitry Andric void LLVMSetSourceFileName(LLVMModuleRef M, const char *Name, size_t Len);
8360b57cec5SDimitry Andric 
8370b57cec5SDimitry Andric /**
8380b57cec5SDimitry Andric  * Obtain the data layout for a module.
8390b57cec5SDimitry Andric  *
8400b57cec5SDimitry Andric  * @see Module::getDataLayoutStr()
8410b57cec5SDimitry Andric  *
8420b57cec5SDimitry Andric  * LLVMGetDataLayout is DEPRECATED, as the name is not only incorrect,
8430b57cec5SDimitry Andric  * but match the name of another method on the module. Prefer the use
8440b57cec5SDimitry Andric  * of LLVMGetDataLayoutStr, which is not ambiguous.
8450b57cec5SDimitry Andric  */
8460b57cec5SDimitry Andric const char *LLVMGetDataLayoutStr(LLVMModuleRef M);
8470b57cec5SDimitry Andric const char *LLVMGetDataLayout(LLVMModuleRef M);
8480b57cec5SDimitry Andric 
8490b57cec5SDimitry Andric /**
8500b57cec5SDimitry Andric  * Set the data layout for a module.
8510b57cec5SDimitry Andric  *
8520b57cec5SDimitry Andric  * @see Module::setDataLayout()
8530b57cec5SDimitry Andric  */
8540b57cec5SDimitry Andric void LLVMSetDataLayout(LLVMModuleRef M, const char *DataLayoutStr);
8550b57cec5SDimitry Andric 
8560b57cec5SDimitry Andric /**
8570b57cec5SDimitry Andric  * Obtain the target triple for a module.
8580b57cec5SDimitry Andric  *
8590b57cec5SDimitry Andric  * @see Module::getTargetTriple()
8600b57cec5SDimitry Andric  */
8610b57cec5SDimitry Andric const char *LLVMGetTarget(LLVMModuleRef M);
8620b57cec5SDimitry Andric 
8630b57cec5SDimitry Andric /**
8640b57cec5SDimitry Andric  * Set the target triple for a module.
8650b57cec5SDimitry Andric  *
8660b57cec5SDimitry Andric  * @see Module::setTargetTriple()
8670b57cec5SDimitry Andric  */
8680b57cec5SDimitry Andric void LLVMSetTarget(LLVMModuleRef M, const char *Triple);
8690b57cec5SDimitry Andric 
8700b57cec5SDimitry Andric /**
8710b57cec5SDimitry Andric  * Returns the module flags as an array of flag-key-value triples.  The caller
8720b57cec5SDimitry Andric  * is responsible for freeing this array by calling
8730b57cec5SDimitry Andric  * \c LLVMDisposeModuleFlagsMetadata.
8740b57cec5SDimitry Andric  *
8750b57cec5SDimitry Andric  * @see Module::getModuleFlagsMetadata()
8760b57cec5SDimitry Andric  */
8770b57cec5SDimitry Andric LLVMModuleFlagEntry *LLVMCopyModuleFlagsMetadata(LLVMModuleRef M, size_t *Len);
8780b57cec5SDimitry Andric 
8790b57cec5SDimitry Andric /**
8800b57cec5SDimitry Andric  * Destroys module flags metadata entries.
8810b57cec5SDimitry Andric  */
8820b57cec5SDimitry Andric void LLVMDisposeModuleFlagsMetadata(LLVMModuleFlagEntry *Entries);
8830b57cec5SDimitry Andric 
8840b57cec5SDimitry Andric /**
8850b57cec5SDimitry Andric  * Returns the flag behavior for a module flag entry at a specific index.
8860b57cec5SDimitry Andric  *
8870b57cec5SDimitry Andric  * @see Module::ModuleFlagEntry::Behavior
8880b57cec5SDimitry Andric  */
8890b57cec5SDimitry Andric LLVMModuleFlagBehavior
8900b57cec5SDimitry Andric LLVMModuleFlagEntriesGetFlagBehavior(LLVMModuleFlagEntry *Entries,
8910b57cec5SDimitry Andric                                      unsigned Index);
8920b57cec5SDimitry Andric 
8930b57cec5SDimitry Andric /**
8940b57cec5SDimitry Andric  * Returns the key for a module flag entry at a specific index.
8950b57cec5SDimitry Andric  *
8960b57cec5SDimitry Andric  * @see Module::ModuleFlagEntry::Key
8970b57cec5SDimitry Andric  */
8980b57cec5SDimitry Andric const char *LLVMModuleFlagEntriesGetKey(LLVMModuleFlagEntry *Entries,
8990b57cec5SDimitry Andric                                         unsigned Index, size_t *Len);
9000b57cec5SDimitry Andric 
9010b57cec5SDimitry Andric /**
9020b57cec5SDimitry Andric  * Returns the metadata for a module flag entry at a specific index.
9030b57cec5SDimitry Andric  *
9040b57cec5SDimitry Andric  * @see Module::ModuleFlagEntry::Val
9050b57cec5SDimitry Andric  */
9060b57cec5SDimitry Andric LLVMMetadataRef LLVMModuleFlagEntriesGetMetadata(LLVMModuleFlagEntry *Entries,
9070b57cec5SDimitry Andric                                                  unsigned Index);
9080b57cec5SDimitry Andric 
9090b57cec5SDimitry Andric /**
9100b57cec5SDimitry Andric  * Add a module-level flag to the module-level flags metadata if it doesn't
9110b57cec5SDimitry Andric  * already exist.
9120b57cec5SDimitry Andric  *
9130b57cec5SDimitry Andric  * @see Module::getModuleFlag()
9140b57cec5SDimitry Andric  */
9150b57cec5SDimitry Andric LLVMMetadataRef LLVMGetModuleFlag(LLVMModuleRef M,
9160b57cec5SDimitry Andric                                   const char *Key, size_t KeyLen);
9170b57cec5SDimitry Andric 
9180b57cec5SDimitry Andric /**
9190b57cec5SDimitry Andric  * Add a module-level flag to the module-level flags metadata if it doesn't
9200b57cec5SDimitry Andric  * already exist.
9210b57cec5SDimitry Andric  *
9220b57cec5SDimitry Andric  * @see Module::addModuleFlag()
9230b57cec5SDimitry Andric  */
9240b57cec5SDimitry Andric void LLVMAddModuleFlag(LLVMModuleRef M, LLVMModuleFlagBehavior Behavior,
9250b57cec5SDimitry Andric                        const char *Key, size_t KeyLen,
9260b57cec5SDimitry Andric                        LLVMMetadataRef Val);
9270b57cec5SDimitry Andric 
9280b57cec5SDimitry Andric /**
9290b57cec5SDimitry Andric  * Dump a representation of a module to stderr.
9300b57cec5SDimitry Andric  *
9310b57cec5SDimitry Andric  * @see Module::dump()
9320b57cec5SDimitry Andric  */
9330b57cec5SDimitry Andric void LLVMDumpModule(LLVMModuleRef M);
9340b57cec5SDimitry Andric 
9350b57cec5SDimitry Andric /**
9360b57cec5SDimitry Andric  * Print a representation of a module to a file. The ErrorMessage needs to be
9370b57cec5SDimitry Andric  * disposed with LLVMDisposeMessage. Returns 0 on success, 1 otherwise.
9380b57cec5SDimitry Andric  *
9390b57cec5SDimitry Andric  * @see Module::print()
9400b57cec5SDimitry Andric  */
9410b57cec5SDimitry Andric LLVMBool LLVMPrintModuleToFile(LLVMModuleRef M, const char *Filename,
9420b57cec5SDimitry Andric                                char **ErrorMessage);
9430b57cec5SDimitry Andric 
9440b57cec5SDimitry Andric /**
9450b57cec5SDimitry Andric  * Return a string representation of the module. Use
9460b57cec5SDimitry Andric  * LLVMDisposeMessage to free the string.
9470b57cec5SDimitry Andric  *
9480b57cec5SDimitry Andric  * @see Module::print()
9490b57cec5SDimitry Andric  */
9500b57cec5SDimitry Andric char *LLVMPrintModuleToString(LLVMModuleRef M);
9510b57cec5SDimitry Andric 
9520b57cec5SDimitry Andric /**
9530b57cec5SDimitry Andric  * Get inline assembly for a module.
9540b57cec5SDimitry Andric  *
9550b57cec5SDimitry Andric  * @see Module::getModuleInlineAsm()
9560b57cec5SDimitry Andric  */
9570b57cec5SDimitry Andric const char *LLVMGetModuleInlineAsm(LLVMModuleRef M, size_t *Len);
9580b57cec5SDimitry Andric 
9590b57cec5SDimitry Andric /**
9600b57cec5SDimitry Andric  * Set inline assembly for a module.
9610b57cec5SDimitry Andric  *
9620b57cec5SDimitry Andric  * @see Module::setModuleInlineAsm()
9630b57cec5SDimitry Andric  */
9640b57cec5SDimitry Andric void LLVMSetModuleInlineAsm2(LLVMModuleRef M, const char *Asm, size_t Len);
9650b57cec5SDimitry Andric 
9660b57cec5SDimitry Andric /**
9670b57cec5SDimitry Andric  * Append inline assembly to a module.
9680b57cec5SDimitry Andric  *
9690b57cec5SDimitry Andric  * @see Module::appendModuleInlineAsm()
9700b57cec5SDimitry Andric  */
9710b57cec5SDimitry Andric void LLVMAppendModuleInlineAsm(LLVMModuleRef M, const char *Asm, size_t Len);
9720b57cec5SDimitry Andric 
9730b57cec5SDimitry Andric /**
9740b57cec5SDimitry Andric  * Create the specified uniqued inline asm string.
9750b57cec5SDimitry Andric  *
9760b57cec5SDimitry Andric  * @see InlineAsm::get()
9770b57cec5SDimitry Andric  */
9785f757f3fSDimitry Andric LLVMValueRef LLVMGetInlineAsm(LLVMTypeRef Ty, const char *AsmString,
9795f757f3fSDimitry Andric                               size_t AsmStringSize, const char *Constraints,
980fe6060f1SDimitry Andric                               size_t ConstraintsSize, LLVMBool HasSideEffects,
981fe6060f1SDimitry Andric                               LLVMBool IsAlignStack,
982fe6060f1SDimitry Andric                               LLVMInlineAsmDialect Dialect, LLVMBool CanThrow);
9830b57cec5SDimitry Andric 
9840b57cec5SDimitry Andric /**
9855f757f3fSDimitry Andric  * Get the template string used for an inline assembly snippet
9865f757f3fSDimitry Andric  *
9875f757f3fSDimitry Andric  */
9885f757f3fSDimitry Andric const char *LLVMGetInlineAsmAsmString(LLVMValueRef InlineAsmVal, size_t *Len);
9895f757f3fSDimitry Andric 
9905f757f3fSDimitry Andric /**
9915f757f3fSDimitry Andric  * Get the raw constraint string for an inline assembly snippet
9925f757f3fSDimitry Andric  *
9935f757f3fSDimitry Andric  */
9945f757f3fSDimitry Andric const char *LLVMGetInlineAsmConstraintString(LLVMValueRef InlineAsmVal,
9955f757f3fSDimitry Andric                                              size_t *Len);
9965f757f3fSDimitry Andric 
9975f757f3fSDimitry Andric /**
9985f757f3fSDimitry Andric  * Get the dialect used by the inline asm snippet
9995f757f3fSDimitry Andric  *
10005f757f3fSDimitry Andric  */
10015f757f3fSDimitry Andric LLVMInlineAsmDialect LLVMGetInlineAsmDialect(LLVMValueRef InlineAsmVal);
10025f757f3fSDimitry Andric 
10035f757f3fSDimitry Andric /**
10045f757f3fSDimitry Andric  * Get the function type of the inline assembly snippet. The same type that
10055f757f3fSDimitry Andric  * was passed into LLVMGetInlineAsm originally
10065f757f3fSDimitry Andric  *
10075f757f3fSDimitry Andric  * @see LLVMGetInlineAsm
10085f757f3fSDimitry Andric  *
10095f757f3fSDimitry Andric  */
10105f757f3fSDimitry Andric LLVMTypeRef LLVMGetInlineAsmFunctionType(LLVMValueRef InlineAsmVal);
10115f757f3fSDimitry Andric 
10125f757f3fSDimitry Andric /**
10135f757f3fSDimitry Andric  * Get if the inline asm snippet has side effects
10145f757f3fSDimitry Andric  *
10155f757f3fSDimitry Andric  */
10165f757f3fSDimitry Andric LLVMBool LLVMGetInlineAsmHasSideEffects(LLVMValueRef InlineAsmVal);
10175f757f3fSDimitry Andric 
10185f757f3fSDimitry Andric /**
10195f757f3fSDimitry Andric  * Get if the inline asm snippet needs an aligned stack
10205f757f3fSDimitry Andric  *
10215f757f3fSDimitry Andric  */
10225f757f3fSDimitry Andric LLVMBool LLVMGetInlineAsmNeedsAlignedStack(LLVMValueRef InlineAsmVal);
10235f757f3fSDimitry Andric 
10245f757f3fSDimitry Andric /**
10255f757f3fSDimitry Andric  * Get if the inline asm snippet may unwind the stack
10265f757f3fSDimitry Andric  *
10275f757f3fSDimitry Andric  */
10285f757f3fSDimitry Andric LLVMBool LLVMGetInlineAsmCanUnwind(LLVMValueRef InlineAsmVal);
10295f757f3fSDimitry Andric 
10305f757f3fSDimitry Andric /**
10310b57cec5SDimitry Andric  * Obtain the context to which this module is associated.
10320b57cec5SDimitry Andric  *
10330b57cec5SDimitry Andric  * @see Module::getContext()
10340b57cec5SDimitry Andric  */
10350b57cec5SDimitry Andric LLVMContextRef LLVMGetModuleContext(LLVMModuleRef M);
10360b57cec5SDimitry Andric 
1037e8d8bef9SDimitry Andric /** Deprecated: Use LLVMGetTypeByName2 instead. */
10380b57cec5SDimitry Andric LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name);
10390b57cec5SDimitry Andric 
10400b57cec5SDimitry Andric /**
10410b57cec5SDimitry Andric  * Obtain an iterator to the first NamedMDNode in a Module.
10420b57cec5SDimitry Andric  *
10430b57cec5SDimitry Andric  * @see llvm::Module::named_metadata_begin()
10440b57cec5SDimitry Andric  */
10450b57cec5SDimitry Andric LLVMNamedMDNodeRef LLVMGetFirstNamedMetadata(LLVMModuleRef M);
10460b57cec5SDimitry Andric 
10470b57cec5SDimitry Andric /**
10480b57cec5SDimitry Andric  * Obtain an iterator to the last NamedMDNode in a Module.
10490b57cec5SDimitry Andric  *
10500b57cec5SDimitry Andric  * @see llvm::Module::named_metadata_end()
10510b57cec5SDimitry Andric  */
10520b57cec5SDimitry Andric LLVMNamedMDNodeRef LLVMGetLastNamedMetadata(LLVMModuleRef M);
10530b57cec5SDimitry Andric 
10540b57cec5SDimitry Andric /**
10550b57cec5SDimitry Andric  * Advance a NamedMDNode iterator to the next NamedMDNode.
10560b57cec5SDimitry Andric  *
10570b57cec5SDimitry Andric  * Returns NULL if the iterator was already at the end and there are no more
10580b57cec5SDimitry Andric  * named metadata nodes.
10590b57cec5SDimitry Andric  */
10600b57cec5SDimitry Andric LLVMNamedMDNodeRef LLVMGetNextNamedMetadata(LLVMNamedMDNodeRef NamedMDNode);
10610b57cec5SDimitry Andric 
10620b57cec5SDimitry Andric /**
10630b57cec5SDimitry Andric  * Decrement a NamedMDNode iterator to the previous NamedMDNode.
10640b57cec5SDimitry Andric  *
10650b57cec5SDimitry Andric  * Returns NULL if the iterator was already at the beginning and there are
10660b57cec5SDimitry Andric  * no previous named metadata nodes.
10670b57cec5SDimitry Andric  */
10680b57cec5SDimitry Andric LLVMNamedMDNodeRef LLVMGetPreviousNamedMetadata(LLVMNamedMDNodeRef NamedMDNode);
10690b57cec5SDimitry Andric 
10700b57cec5SDimitry Andric /**
10710b57cec5SDimitry Andric  * Retrieve a NamedMDNode with the given name, returning NULL if no such
10720b57cec5SDimitry Andric  * node exists.
10730b57cec5SDimitry Andric  *
10740b57cec5SDimitry Andric  * @see llvm::Module::getNamedMetadata()
10750b57cec5SDimitry Andric  */
10760b57cec5SDimitry Andric LLVMNamedMDNodeRef LLVMGetNamedMetadata(LLVMModuleRef M,
10770b57cec5SDimitry Andric                                         const char *Name, size_t NameLen);
10780b57cec5SDimitry Andric 
10790b57cec5SDimitry Andric /**
10800b57cec5SDimitry Andric  * Retrieve a NamedMDNode with the given name, creating a new node if no such
10810b57cec5SDimitry Andric  * node exists.
10820b57cec5SDimitry Andric  *
10830b57cec5SDimitry Andric  * @see llvm::Module::getOrInsertNamedMetadata()
10840b57cec5SDimitry Andric  */
10850b57cec5SDimitry Andric LLVMNamedMDNodeRef LLVMGetOrInsertNamedMetadata(LLVMModuleRef M,
10860b57cec5SDimitry Andric                                                 const char *Name,
10870b57cec5SDimitry Andric                                                 size_t NameLen);
10880b57cec5SDimitry Andric 
10890b57cec5SDimitry Andric /**
10900b57cec5SDimitry Andric  * Retrieve the name of a NamedMDNode.
10910b57cec5SDimitry Andric  *
10920b57cec5SDimitry Andric  * @see llvm::NamedMDNode::getName()
10930b57cec5SDimitry Andric  */
10940b57cec5SDimitry Andric const char *LLVMGetNamedMetadataName(LLVMNamedMDNodeRef NamedMD,
10950b57cec5SDimitry Andric                                      size_t *NameLen);
10960b57cec5SDimitry Andric 
10970b57cec5SDimitry Andric /**
10980b57cec5SDimitry Andric  * Obtain the number of operands for named metadata in a module.
10990b57cec5SDimitry Andric  *
11000b57cec5SDimitry Andric  * @see llvm::Module::getNamedMetadata()
11010b57cec5SDimitry Andric  */
11020b57cec5SDimitry Andric unsigned LLVMGetNamedMetadataNumOperands(LLVMModuleRef M, const char *Name);
11030b57cec5SDimitry Andric 
11040b57cec5SDimitry Andric /**
11050b57cec5SDimitry Andric  * Obtain the named metadata operands for a module.
11060b57cec5SDimitry Andric  *
11070b57cec5SDimitry Andric  * The passed LLVMValueRef pointer should refer to an array of
11080b57cec5SDimitry Andric  * LLVMValueRef at least LLVMGetNamedMetadataNumOperands long. This
11090b57cec5SDimitry Andric  * array will be populated with the LLVMValueRef instances. Each
11100b57cec5SDimitry Andric  * instance corresponds to a llvm::MDNode.
11110b57cec5SDimitry Andric  *
11120b57cec5SDimitry Andric  * @see llvm::Module::getNamedMetadata()
11130b57cec5SDimitry Andric  * @see llvm::MDNode::getOperand()
11140b57cec5SDimitry Andric  */
11150b57cec5SDimitry Andric void LLVMGetNamedMetadataOperands(LLVMModuleRef M, const char *Name,
11160b57cec5SDimitry Andric                                   LLVMValueRef *Dest);
11170b57cec5SDimitry Andric 
11180b57cec5SDimitry Andric /**
11190b57cec5SDimitry Andric  * Add an operand to named metadata.
11200b57cec5SDimitry Andric  *
11210b57cec5SDimitry Andric  * @see llvm::Module::getNamedMetadata()
11220b57cec5SDimitry Andric  * @see llvm::MDNode::addOperand()
11230b57cec5SDimitry Andric  */
11240b57cec5SDimitry Andric void LLVMAddNamedMetadataOperand(LLVMModuleRef M, const char *Name,
11250b57cec5SDimitry Andric                                  LLVMValueRef Val);
11260b57cec5SDimitry Andric 
11270b57cec5SDimitry Andric /**
11280b57cec5SDimitry Andric  * Return the directory of the debug location for this value, which must be
11290b57cec5SDimitry Andric  * an llvm::Instruction, llvm::GlobalVariable, or llvm::Function.
11300b57cec5SDimitry Andric  *
11310b57cec5SDimitry Andric  * @see llvm::Instruction::getDebugLoc()
11320b57cec5SDimitry Andric  * @see llvm::GlobalVariable::getDebugInfo()
11330b57cec5SDimitry Andric  * @see llvm::Function::getSubprogram()
11340b57cec5SDimitry Andric  */
11350b57cec5SDimitry Andric const char *LLVMGetDebugLocDirectory(LLVMValueRef Val, unsigned *Length);
11360b57cec5SDimitry Andric 
11370b57cec5SDimitry Andric /**
11380b57cec5SDimitry Andric  * Return the filename of the debug location for this value, which must be
11390b57cec5SDimitry Andric  * an llvm::Instruction, llvm::GlobalVariable, or llvm::Function.
11400b57cec5SDimitry Andric  *
11410b57cec5SDimitry Andric  * @see llvm::Instruction::getDebugLoc()
11420b57cec5SDimitry Andric  * @see llvm::GlobalVariable::getDebugInfo()
11430b57cec5SDimitry Andric  * @see llvm::Function::getSubprogram()
11440b57cec5SDimitry Andric  */
11450b57cec5SDimitry Andric const char *LLVMGetDebugLocFilename(LLVMValueRef Val, unsigned *Length);
11460b57cec5SDimitry Andric 
11470b57cec5SDimitry Andric /**
11480b57cec5SDimitry Andric  * Return the line number of the debug location for this value, which must be
11490b57cec5SDimitry Andric  * an llvm::Instruction, llvm::GlobalVariable, or llvm::Function.
11500b57cec5SDimitry Andric  *
11510b57cec5SDimitry Andric  * @see llvm::Instruction::getDebugLoc()
11520b57cec5SDimitry Andric  * @see llvm::GlobalVariable::getDebugInfo()
11530b57cec5SDimitry Andric  * @see llvm::Function::getSubprogram()
11540b57cec5SDimitry Andric  */
11550b57cec5SDimitry Andric unsigned LLVMGetDebugLocLine(LLVMValueRef Val);
11560b57cec5SDimitry Andric 
11570b57cec5SDimitry Andric /**
11580b57cec5SDimitry Andric  * Return the column number of the debug location for this value, which must be
11590b57cec5SDimitry Andric  * an llvm::Instruction.
11600b57cec5SDimitry Andric  *
11610b57cec5SDimitry Andric  * @see llvm::Instruction::getDebugLoc()
11620b57cec5SDimitry Andric  */
11630b57cec5SDimitry Andric unsigned LLVMGetDebugLocColumn(LLVMValueRef Val);
11640b57cec5SDimitry Andric 
11650b57cec5SDimitry Andric /**
11660b57cec5SDimitry Andric  * Add a function to a module under a specified name.
11670b57cec5SDimitry Andric  *
11680b57cec5SDimitry Andric  * @see llvm::Function::Create()
11690b57cec5SDimitry Andric  */
11700b57cec5SDimitry Andric LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
11710b57cec5SDimitry Andric                              LLVMTypeRef FunctionTy);
11720b57cec5SDimitry Andric 
11730b57cec5SDimitry Andric /**
11740b57cec5SDimitry Andric  * Obtain a Function value from a Module by its name.
11750b57cec5SDimitry Andric  *
11760b57cec5SDimitry Andric  * The returned value corresponds to a llvm::Function value.
11770b57cec5SDimitry Andric  *
11780b57cec5SDimitry Andric  * @see llvm::Module::getFunction()
11790b57cec5SDimitry Andric  */
11800b57cec5SDimitry Andric LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
11810b57cec5SDimitry Andric 
11820b57cec5SDimitry Andric /**
11830b57cec5SDimitry Andric  * Obtain an iterator to the first Function in a Module.
11840b57cec5SDimitry Andric  *
11850b57cec5SDimitry Andric  * @see llvm::Module::begin()
11860b57cec5SDimitry Andric  */
11870b57cec5SDimitry Andric LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M);
11880b57cec5SDimitry Andric 
11890b57cec5SDimitry Andric /**
11900b57cec5SDimitry Andric  * Obtain an iterator to the last Function in a Module.
11910b57cec5SDimitry Andric  *
11920b57cec5SDimitry Andric  * @see llvm::Module::end()
11930b57cec5SDimitry Andric  */
11940b57cec5SDimitry Andric LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M);
11950b57cec5SDimitry Andric 
11960b57cec5SDimitry Andric /**
11970b57cec5SDimitry Andric  * Advance a Function iterator to the next Function.
11980b57cec5SDimitry Andric  *
11990b57cec5SDimitry Andric  * Returns NULL if the iterator was already at the end and there are no more
12000b57cec5SDimitry Andric  * functions.
12010b57cec5SDimitry Andric  */
12020b57cec5SDimitry Andric LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn);
12030b57cec5SDimitry Andric 
12040b57cec5SDimitry Andric /**
12050b57cec5SDimitry Andric  * Decrement a Function iterator to the previous Function.
12060b57cec5SDimitry Andric  *
12070b57cec5SDimitry Andric  * Returns NULL if the iterator was already at the beginning and there are
12080b57cec5SDimitry Andric  * no previous functions.
12090b57cec5SDimitry Andric  */
12100b57cec5SDimitry Andric LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn);
12110b57cec5SDimitry Andric 
12120b57cec5SDimitry Andric /** Deprecated: Use LLVMSetModuleInlineAsm2 instead. */
12130b57cec5SDimitry Andric void LLVMSetModuleInlineAsm(LLVMModuleRef M, const char *Asm);
12140b57cec5SDimitry Andric 
12150b57cec5SDimitry Andric /**
12160b57cec5SDimitry Andric  * @}
12170b57cec5SDimitry Andric  */
12180b57cec5SDimitry Andric 
12190b57cec5SDimitry Andric /**
12200b57cec5SDimitry Andric  * @defgroup LLVMCCoreType Types
12210b57cec5SDimitry Andric  *
12220b57cec5SDimitry Andric  * Types represent the type of a value.
12230b57cec5SDimitry Andric  *
12240b57cec5SDimitry Andric  * Types are associated with a context instance. The context internally
12250b57cec5SDimitry Andric  * deduplicates types so there is only 1 instance of a specific type
12260b57cec5SDimitry Andric  * alive at a time. In other words, a unique type is shared among all
12270b57cec5SDimitry Andric  * consumers within a context.
12280b57cec5SDimitry Andric  *
12290b57cec5SDimitry Andric  * A Type in the C API corresponds to llvm::Type.
12300b57cec5SDimitry Andric  *
12310b57cec5SDimitry Andric  * Types have the following hierarchy:
12320b57cec5SDimitry Andric  *
12330b57cec5SDimitry Andric  *   types:
12340b57cec5SDimitry Andric  *     integer type
12350b57cec5SDimitry Andric  *     real type
12360b57cec5SDimitry Andric  *     function type
12370b57cec5SDimitry Andric  *     sequence types:
12380b57cec5SDimitry Andric  *       array type
12390b57cec5SDimitry Andric  *       pointer type
12400b57cec5SDimitry Andric  *       vector type
12410b57cec5SDimitry Andric  *     void type
12420b57cec5SDimitry Andric  *     label type
12430b57cec5SDimitry Andric  *     opaque type
12440b57cec5SDimitry Andric  *
12450b57cec5SDimitry Andric  * @{
12460b57cec5SDimitry Andric  */
12470b57cec5SDimitry Andric 
12480b57cec5SDimitry Andric /**
12490b57cec5SDimitry Andric  * Obtain the enumerated type of a Type instance.
12500b57cec5SDimitry Andric  *
12510b57cec5SDimitry Andric  * @see llvm::Type:getTypeID()
12520b57cec5SDimitry Andric  */
12530b57cec5SDimitry Andric LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty);
12540b57cec5SDimitry Andric 
12550b57cec5SDimitry Andric /**
12560b57cec5SDimitry Andric  * Whether the type has a known size.
12570b57cec5SDimitry Andric  *
12580b57cec5SDimitry Andric  * Things that don't have a size are abstract types, labels, and void.a
12590b57cec5SDimitry Andric  *
12600b57cec5SDimitry Andric  * @see llvm::Type::isSized()
12610b57cec5SDimitry Andric  */
12620b57cec5SDimitry Andric LLVMBool LLVMTypeIsSized(LLVMTypeRef Ty);
12630b57cec5SDimitry Andric 
12640b57cec5SDimitry Andric /**
12650b57cec5SDimitry Andric  * Obtain the context to which this type instance is associated.
12660b57cec5SDimitry Andric  *
12670b57cec5SDimitry Andric  * @see llvm::Type::getContext()
12680b57cec5SDimitry Andric  */
12690b57cec5SDimitry Andric LLVMContextRef LLVMGetTypeContext(LLVMTypeRef Ty);
12700b57cec5SDimitry Andric 
12710b57cec5SDimitry Andric /**
12720b57cec5SDimitry Andric  * Dump a representation of a type to stderr.
12730b57cec5SDimitry Andric  *
12740b57cec5SDimitry Andric  * @see llvm::Type::dump()
12750b57cec5SDimitry Andric  */
12760b57cec5SDimitry Andric void LLVMDumpType(LLVMTypeRef Val);
12770b57cec5SDimitry Andric 
12780b57cec5SDimitry Andric /**
12790b57cec5SDimitry Andric  * Return a string representation of the type. Use
12800b57cec5SDimitry Andric  * LLVMDisposeMessage to free the string.
12810b57cec5SDimitry Andric  *
12820b57cec5SDimitry Andric  * @see llvm::Type::print()
12830b57cec5SDimitry Andric  */
12840b57cec5SDimitry Andric char *LLVMPrintTypeToString(LLVMTypeRef Val);
12850b57cec5SDimitry Andric 
12860b57cec5SDimitry Andric /**
12870b57cec5SDimitry Andric  * @defgroup LLVMCCoreTypeInt Integer Types
12880b57cec5SDimitry Andric  *
12890b57cec5SDimitry Andric  * Functions in this section operate on integer types.
12900b57cec5SDimitry Andric  *
12910b57cec5SDimitry Andric  * @{
12920b57cec5SDimitry Andric  */
12930b57cec5SDimitry Andric 
12940b57cec5SDimitry Andric /**
12950b57cec5SDimitry Andric  * Obtain an integer type from a context with specified bit width.
12960b57cec5SDimitry Andric  */
12970b57cec5SDimitry Andric LLVMTypeRef LLVMInt1TypeInContext(LLVMContextRef C);
12980b57cec5SDimitry Andric LLVMTypeRef LLVMInt8TypeInContext(LLVMContextRef C);
12990b57cec5SDimitry Andric LLVMTypeRef LLVMInt16TypeInContext(LLVMContextRef C);
13000b57cec5SDimitry Andric LLVMTypeRef LLVMInt32TypeInContext(LLVMContextRef C);
13010b57cec5SDimitry Andric LLVMTypeRef LLVMInt64TypeInContext(LLVMContextRef C);
13020b57cec5SDimitry Andric LLVMTypeRef LLVMInt128TypeInContext(LLVMContextRef C);
13030b57cec5SDimitry Andric LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits);
13040b57cec5SDimitry Andric 
13050b57cec5SDimitry Andric /**
13060b57cec5SDimitry Andric  * Obtain an integer type from the global context with a specified bit
13070b57cec5SDimitry Andric  * width.
13080b57cec5SDimitry Andric  */
13090b57cec5SDimitry Andric LLVMTypeRef LLVMInt1Type(void);
13100b57cec5SDimitry Andric LLVMTypeRef LLVMInt8Type(void);
13110b57cec5SDimitry Andric LLVMTypeRef LLVMInt16Type(void);
13120b57cec5SDimitry Andric LLVMTypeRef LLVMInt32Type(void);
13130b57cec5SDimitry Andric LLVMTypeRef LLVMInt64Type(void);
13140b57cec5SDimitry Andric LLVMTypeRef LLVMInt128Type(void);
13150b57cec5SDimitry Andric LLVMTypeRef LLVMIntType(unsigned NumBits);
13160b57cec5SDimitry Andric unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
13170b57cec5SDimitry Andric 
13180b57cec5SDimitry Andric /**
13190b57cec5SDimitry Andric  * @}
13200b57cec5SDimitry Andric  */
13210b57cec5SDimitry Andric 
13220b57cec5SDimitry Andric /**
13230b57cec5SDimitry Andric  * @defgroup LLVMCCoreTypeFloat Floating Point Types
13240b57cec5SDimitry Andric  *
13250b57cec5SDimitry Andric  * @{
13260b57cec5SDimitry Andric  */
13270b57cec5SDimitry Andric 
13280b57cec5SDimitry Andric /**
13290b57cec5SDimitry Andric  * Obtain a 16-bit floating point type from a context.
13300b57cec5SDimitry Andric  */
13310b57cec5SDimitry Andric LLVMTypeRef LLVMHalfTypeInContext(LLVMContextRef C);
13320b57cec5SDimitry Andric 
13330b57cec5SDimitry Andric /**
13345ffd83dbSDimitry Andric  * Obtain a 16-bit brain floating point type from a context.
13355ffd83dbSDimitry Andric  */
13365ffd83dbSDimitry Andric LLVMTypeRef LLVMBFloatTypeInContext(LLVMContextRef C);
13375ffd83dbSDimitry Andric 
13385ffd83dbSDimitry Andric /**
13390b57cec5SDimitry Andric  * Obtain a 32-bit floating point type from a context.
13400b57cec5SDimitry Andric  */
13410b57cec5SDimitry Andric LLVMTypeRef LLVMFloatTypeInContext(LLVMContextRef C);
13420b57cec5SDimitry Andric 
13430b57cec5SDimitry Andric /**
13440b57cec5SDimitry Andric  * Obtain a 64-bit floating point type from a context.
13450b57cec5SDimitry Andric  */
13460b57cec5SDimitry Andric LLVMTypeRef LLVMDoubleTypeInContext(LLVMContextRef C);
13470b57cec5SDimitry Andric 
13480b57cec5SDimitry Andric /**
13490b57cec5SDimitry Andric  * Obtain a 80-bit floating point type (X87) from a context.
13500b57cec5SDimitry Andric  */
13510b57cec5SDimitry Andric LLVMTypeRef LLVMX86FP80TypeInContext(LLVMContextRef C);
13520b57cec5SDimitry Andric 
13530b57cec5SDimitry Andric /**
13540b57cec5SDimitry Andric  * Obtain a 128-bit floating point type (112-bit mantissa) from a
13550b57cec5SDimitry Andric  * context.
13560b57cec5SDimitry Andric  */
13570b57cec5SDimitry Andric LLVMTypeRef LLVMFP128TypeInContext(LLVMContextRef C);
13580b57cec5SDimitry Andric 
13590b57cec5SDimitry Andric /**
13600b57cec5SDimitry Andric  * Obtain a 128-bit floating point type (two 64-bits) from a context.
13610b57cec5SDimitry Andric  */
13620b57cec5SDimitry Andric LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C);
13630b57cec5SDimitry Andric 
13640b57cec5SDimitry Andric /**
13650b57cec5SDimitry Andric  * Obtain a floating point type from the global context.
13660b57cec5SDimitry Andric  *
13670b57cec5SDimitry Andric  * These map to the functions in this group of the same name.
13680b57cec5SDimitry Andric  */
13690b57cec5SDimitry Andric LLVMTypeRef LLVMHalfType(void);
13705ffd83dbSDimitry Andric LLVMTypeRef LLVMBFloatType(void);
13710b57cec5SDimitry Andric LLVMTypeRef LLVMFloatType(void);
13720b57cec5SDimitry Andric LLVMTypeRef LLVMDoubleType(void);
13730b57cec5SDimitry Andric LLVMTypeRef LLVMX86FP80Type(void);
13740b57cec5SDimitry Andric LLVMTypeRef LLVMFP128Type(void);
13750b57cec5SDimitry Andric LLVMTypeRef LLVMPPCFP128Type(void);
13760b57cec5SDimitry Andric 
13770b57cec5SDimitry Andric /**
13780b57cec5SDimitry Andric  * @}
13790b57cec5SDimitry Andric  */
13800b57cec5SDimitry Andric 
13810b57cec5SDimitry Andric /**
13820b57cec5SDimitry Andric  * @defgroup LLVMCCoreTypeFunction Function Types
13830b57cec5SDimitry Andric  *
13840b57cec5SDimitry Andric  * @{
13850b57cec5SDimitry Andric  */
13860b57cec5SDimitry Andric 
13870b57cec5SDimitry Andric /**
13880b57cec5SDimitry Andric  * Obtain a function type consisting of a specified signature.
13890b57cec5SDimitry Andric  *
13900b57cec5SDimitry Andric  * The function is defined as a tuple of a return Type, a list of
13910b57cec5SDimitry Andric  * parameter types, and whether the function is variadic.
13920b57cec5SDimitry Andric  */
13930b57cec5SDimitry Andric LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
13940b57cec5SDimitry Andric                              LLVMTypeRef *ParamTypes, unsigned ParamCount,
13950b57cec5SDimitry Andric                              LLVMBool IsVarArg);
13960b57cec5SDimitry Andric 
13970b57cec5SDimitry Andric /**
13980b57cec5SDimitry Andric  * Returns whether a function type is variadic.
13990b57cec5SDimitry Andric  */
14000b57cec5SDimitry Andric LLVMBool LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy);
14010b57cec5SDimitry Andric 
14020b57cec5SDimitry Andric /**
14030b57cec5SDimitry Andric  * Obtain the Type this function Type returns.
14040b57cec5SDimitry Andric  */
14050b57cec5SDimitry Andric LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy);
14060b57cec5SDimitry Andric 
14070b57cec5SDimitry Andric /**
14080b57cec5SDimitry Andric  * Obtain the number of parameters this function accepts.
14090b57cec5SDimitry Andric  */
14100b57cec5SDimitry Andric unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy);
14110b57cec5SDimitry Andric 
14120b57cec5SDimitry Andric /**
14130b57cec5SDimitry Andric  * Obtain the types of a function's parameters.
14140b57cec5SDimitry Andric  *
14150b57cec5SDimitry Andric  * The Dest parameter should point to a pre-allocated array of
14160b57cec5SDimitry Andric  * LLVMTypeRef at least LLVMCountParamTypes() large. On return, the
14170b57cec5SDimitry Andric  * first LLVMCountParamTypes() entries in the array will be populated
14180b57cec5SDimitry Andric  * with LLVMTypeRef instances.
14190b57cec5SDimitry Andric  *
14200b57cec5SDimitry Andric  * @param FunctionTy The function type to operate on.
14210b57cec5SDimitry Andric  * @param Dest Memory address of an array to be filled with result.
14220b57cec5SDimitry Andric  */
14230b57cec5SDimitry Andric void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest);
14240b57cec5SDimitry Andric 
14250b57cec5SDimitry Andric /**
14260b57cec5SDimitry Andric  * @}
14270b57cec5SDimitry Andric  */
14280b57cec5SDimitry Andric 
14290b57cec5SDimitry Andric /**
14300b57cec5SDimitry Andric  * @defgroup LLVMCCoreTypeStruct Structure Types
14310b57cec5SDimitry Andric  *
14320b57cec5SDimitry Andric  * These functions relate to LLVMTypeRef instances.
14330b57cec5SDimitry Andric  *
14340b57cec5SDimitry Andric  * @see llvm::StructType
14350b57cec5SDimitry Andric  *
14360b57cec5SDimitry Andric  * @{
14370b57cec5SDimitry Andric  */
14380b57cec5SDimitry Andric 
14390b57cec5SDimitry Andric /**
14400b57cec5SDimitry Andric  * Create a new structure type in a context.
14410b57cec5SDimitry Andric  *
14420b57cec5SDimitry Andric  * A structure is specified by a list of inner elements/types and
14430b57cec5SDimitry Andric  * whether these can be packed together.
14440b57cec5SDimitry Andric  *
14450b57cec5SDimitry Andric  * @see llvm::StructType::create()
14460b57cec5SDimitry Andric  */
14470b57cec5SDimitry Andric LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
14480b57cec5SDimitry Andric                                     unsigned ElementCount, LLVMBool Packed);
14490b57cec5SDimitry Andric 
14500b57cec5SDimitry Andric /**
14510b57cec5SDimitry Andric  * Create a new structure type in the global context.
14520b57cec5SDimitry Andric  *
14530b57cec5SDimitry Andric  * @see llvm::StructType::create()
14540b57cec5SDimitry Andric  */
14550b57cec5SDimitry Andric LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
14560b57cec5SDimitry Andric                            LLVMBool Packed);
14570b57cec5SDimitry Andric 
14580b57cec5SDimitry Andric /**
14590b57cec5SDimitry Andric  * Create an empty structure in a context having a specified name.
14600b57cec5SDimitry Andric  *
14610b57cec5SDimitry Andric  * @see llvm::StructType::create()
14620b57cec5SDimitry Andric  */
14630b57cec5SDimitry Andric LLVMTypeRef LLVMStructCreateNamed(LLVMContextRef C, const char *Name);
14640b57cec5SDimitry Andric 
14650b57cec5SDimitry Andric /**
14660b57cec5SDimitry Andric  * Obtain the name of a structure.
14670b57cec5SDimitry Andric  *
14680b57cec5SDimitry Andric  * @see llvm::StructType::getName()
14690b57cec5SDimitry Andric  */
14700b57cec5SDimitry Andric const char *LLVMGetStructName(LLVMTypeRef Ty);
14710b57cec5SDimitry Andric 
14720b57cec5SDimitry Andric /**
14730b57cec5SDimitry Andric  * Set the contents of a structure type.
14740b57cec5SDimitry Andric  *
14750b57cec5SDimitry Andric  * @see llvm::StructType::setBody()
14760b57cec5SDimitry Andric  */
14770b57cec5SDimitry Andric void LLVMStructSetBody(LLVMTypeRef StructTy, LLVMTypeRef *ElementTypes,
14780b57cec5SDimitry Andric                        unsigned ElementCount, LLVMBool Packed);
14790b57cec5SDimitry Andric 
14800b57cec5SDimitry Andric /**
14810b57cec5SDimitry Andric  * Get the number of elements defined inside the structure.
14820b57cec5SDimitry Andric  *
14830b57cec5SDimitry Andric  * @see llvm::StructType::getNumElements()
14840b57cec5SDimitry Andric  */
14850b57cec5SDimitry Andric unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
14860b57cec5SDimitry Andric 
14870b57cec5SDimitry Andric /**
14880b57cec5SDimitry Andric  * Get the elements within a structure.
14890b57cec5SDimitry Andric  *
14900b57cec5SDimitry Andric  * The function is passed the address of a pre-allocated array of
14910b57cec5SDimitry Andric  * LLVMTypeRef at least LLVMCountStructElementTypes() long. After
14920b57cec5SDimitry Andric  * invocation, this array will be populated with the structure's
14930b57cec5SDimitry Andric  * elements. The objects in the destination array will have a lifetime
14940b57cec5SDimitry Andric  * of the structure type itself, which is the lifetime of the context it
14950b57cec5SDimitry Andric  * is contained in.
14960b57cec5SDimitry Andric  */
14970b57cec5SDimitry Andric void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
14980b57cec5SDimitry Andric 
14990b57cec5SDimitry Andric /**
15000b57cec5SDimitry Andric  * Get the type of the element at a given index in the structure.
15010b57cec5SDimitry Andric  *
15020b57cec5SDimitry Andric  * @see llvm::StructType::getTypeAtIndex()
15030b57cec5SDimitry Andric  */
15040b57cec5SDimitry Andric LLVMTypeRef LLVMStructGetTypeAtIndex(LLVMTypeRef StructTy, unsigned i);
15050b57cec5SDimitry Andric 
15060b57cec5SDimitry Andric /**
15070b57cec5SDimitry Andric  * Determine whether a structure is packed.
15080b57cec5SDimitry Andric  *
15090b57cec5SDimitry Andric  * @see llvm::StructType::isPacked()
15100b57cec5SDimitry Andric  */
15110b57cec5SDimitry Andric LLVMBool LLVMIsPackedStruct(LLVMTypeRef StructTy);
15120b57cec5SDimitry Andric 
15130b57cec5SDimitry Andric /**
15140b57cec5SDimitry Andric  * Determine whether a structure is opaque.
15150b57cec5SDimitry Andric  *
15160b57cec5SDimitry Andric  * @see llvm::StructType::isOpaque()
15170b57cec5SDimitry Andric  */
15180b57cec5SDimitry Andric LLVMBool LLVMIsOpaqueStruct(LLVMTypeRef StructTy);
15190b57cec5SDimitry Andric 
15200b57cec5SDimitry Andric /**
15210b57cec5SDimitry Andric  * Determine whether a structure is literal.
15220b57cec5SDimitry Andric  *
15230b57cec5SDimitry Andric  * @see llvm::StructType::isLiteral()
15240b57cec5SDimitry Andric  */
15250b57cec5SDimitry Andric LLVMBool LLVMIsLiteralStruct(LLVMTypeRef StructTy);
15260b57cec5SDimitry Andric 
15270b57cec5SDimitry Andric /**
15280b57cec5SDimitry Andric  * @}
15290b57cec5SDimitry Andric  */
15300b57cec5SDimitry Andric 
15310b57cec5SDimitry Andric /**
15320b57cec5SDimitry Andric  * @defgroup LLVMCCoreTypeSequential Sequential Types
15330b57cec5SDimitry Andric  *
15340b57cec5SDimitry Andric  * Sequential types represents "arrays" of types. This is a super class
15350b57cec5SDimitry Andric  * for array, vector, and pointer types.
15360b57cec5SDimitry Andric  *
15370b57cec5SDimitry Andric  * @{
15380b57cec5SDimitry Andric  */
15390b57cec5SDimitry Andric 
15400b57cec5SDimitry Andric /**
154181ad6265SDimitry Andric  * Obtain the element type of an array or vector type.
15420b57cec5SDimitry Andric  *
15430b57cec5SDimitry Andric  * @see llvm::SequentialType::getElementType()
15440b57cec5SDimitry Andric  */
15450b57cec5SDimitry Andric LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
15460b57cec5SDimitry Andric 
15470b57cec5SDimitry Andric /**
15480b57cec5SDimitry Andric  * Returns type's subtypes
15490b57cec5SDimitry Andric  *
15500b57cec5SDimitry Andric  * @see llvm::Type::subtypes()
15510b57cec5SDimitry Andric  */
15520b57cec5SDimitry Andric void LLVMGetSubtypes(LLVMTypeRef Tp, LLVMTypeRef *Arr);
15530b57cec5SDimitry Andric 
15540b57cec5SDimitry Andric /**
15550b57cec5SDimitry Andric  *  Return the number of types in the derived type.
15560b57cec5SDimitry Andric  *
15570b57cec5SDimitry Andric  * @see llvm::Type::getNumContainedTypes()
15580b57cec5SDimitry Andric  */
15590b57cec5SDimitry Andric unsigned LLVMGetNumContainedTypes(LLVMTypeRef Tp);
15600b57cec5SDimitry Andric 
15610b57cec5SDimitry Andric /**
15620b57cec5SDimitry Andric  * Create a fixed size array type that refers to a specific type.
15630b57cec5SDimitry Andric  *
15640b57cec5SDimitry Andric  * The created type will exist in the context that its element type
15650b57cec5SDimitry Andric  * exists in.
15660b57cec5SDimitry Andric  *
156706c3fb27SDimitry Andric  * @deprecated LLVMArrayType is deprecated in favor of the API accurate
156806c3fb27SDimitry Andric  * LLVMArrayType2
15690b57cec5SDimitry Andric  * @see llvm::ArrayType::get()
15700b57cec5SDimitry Andric  */
15710b57cec5SDimitry Andric LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
15720b57cec5SDimitry Andric 
15730b57cec5SDimitry Andric /**
157406c3fb27SDimitry Andric  * Create a fixed size array type that refers to a specific type.
157506c3fb27SDimitry Andric  *
157606c3fb27SDimitry Andric  * The created type will exist in the context that its element type
157706c3fb27SDimitry Andric  * exists in.
157806c3fb27SDimitry Andric  *
157906c3fb27SDimitry Andric  * @see llvm::ArrayType::get()
158006c3fb27SDimitry Andric  */
158106c3fb27SDimitry Andric LLVMTypeRef LLVMArrayType2(LLVMTypeRef ElementType, uint64_t ElementCount);
158206c3fb27SDimitry Andric 
158306c3fb27SDimitry Andric /**
158406c3fb27SDimitry Andric  * Obtain the length of an array type.
158506c3fb27SDimitry Andric  *
158606c3fb27SDimitry Andric  * This only works on types that represent arrays.
158706c3fb27SDimitry Andric  *
158806c3fb27SDimitry Andric  * @deprecated LLVMGetArrayLength is deprecated in favor of the API accurate
158906c3fb27SDimitry Andric  * LLVMGetArrayLength2
159006c3fb27SDimitry Andric  * @see llvm::ArrayType::getNumElements()
159106c3fb27SDimitry Andric  */
159206c3fb27SDimitry Andric unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy);
159306c3fb27SDimitry Andric 
159406c3fb27SDimitry Andric /**
15950b57cec5SDimitry Andric  * Obtain the length of an array type.
15960b57cec5SDimitry Andric  *
15970b57cec5SDimitry Andric  * This only works on types that represent arrays.
15980b57cec5SDimitry Andric  *
15990b57cec5SDimitry Andric  * @see llvm::ArrayType::getNumElements()
16000b57cec5SDimitry Andric  */
160106c3fb27SDimitry Andric uint64_t LLVMGetArrayLength2(LLVMTypeRef ArrayTy);
16020b57cec5SDimitry Andric 
16030b57cec5SDimitry Andric /**
16040b57cec5SDimitry Andric  * Create a pointer type that points to a defined type.
16050b57cec5SDimitry Andric  *
16060b57cec5SDimitry Andric  * The created type will exist in the context that its pointee type
16070b57cec5SDimitry Andric  * exists in.
16080b57cec5SDimitry Andric  *
16090b57cec5SDimitry Andric  * @see llvm::PointerType::get()
16100b57cec5SDimitry Andric  */
16110b57cec5SDimitry Andric LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace);
16120b57cec5SDimitry Andric 
16130b57cec5SDimitry Andric /**
161481ad6265SDimitry Andric  * Determine whether a pointer is opaque.
161581ad6265SDimitry Andric  *
161681ad6265SDimitry Andric  * True if this is an instance of an opaque PointerType.
161781ad6265SDimitry Andric  *
161881ad6265SDimitry Andric  * @see llvm::Type::isOpaquePointerTy()
161981ad6265SDimitry Andric  */
162081ad6265SDimitry Andric LLVMBool LLVMPointerTypeIsOpaque(LLVMTypeRef Ty);
162181ad6265SDimitry Andric 
162281ad6265SDimitry Andric /**
162381ad6265SDimitry Andric  * Create an opaque pointer type in a context.
162481ad6265SDimitry Andric  *
162581ad6265SDimitry Andric  * @see llvm::PointerType::get()
162681ad6265SDimitry Andric  */
162781ad6265SDimitry Andric LLVMTypeRef LLVMPointerTypeInContext(LLVMContextRef C, unsigned AddressSpace);
162881ad6265SDimitry Andric 
162981ad6265SDimitry Andric /**
16300b57cec5SDimitry Andric  * Obtain the address space of a pointer type.
16310b57cec5SDimitry Andric  *
16320b57cec5SDimitry Andric  * This only works on types that represent pointers.
16330b57cec5SDimitry Andric  *
16340b57cec5SDimitry Andric  * @see llvm::PointerType::getAddressSpace()
16350b57cec5SDimitry Andric  */
16360b57cec5SDimitry Andric unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy);
16370b57cec5SDimitry Andric 
16380b57cec5SDimitry Andric /**
16390b57cec5SDimitry Andric  * Create a vector type that contains a defined type and has a specific
16400b57cec5SDimitry Andric  * number of elements.
16410b57cec5SDimitry Andric  *
16420b57cec5SDimitry Andric  * The created type will exist in the context thats its element type
16430b57cec5SDimitry Andric  * exists in.
16440b57cec5SDimitry Andric  *
16450b57cec5SDimitry Andric  * @see llvm::VectorType::get()
16460b57cec5SDimitry Andric  */
16470b57cec5SDimitry Andric LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount);
16480b57cec5SDimitry Andric 
16490b57cec5SDimitry Andric /**
1650e8d8bef9SDimitry Andric  * Create a vector type that contains a defined type and has a scalable
1651e8d8bef9SDimitry Andric  * number of elements.
16520b57cec5SDimitry Andric  *
1653e8d8bef9SDimitry Andric  * The created type will exist in the context thats its element type
1654e8d8bef9SDimitry Andric  * exists in.
1655e8d8bef9SDimitry Andric  *
1656e8d8bef9SDimitry Andric  * @see llvm::ScalableVectorType::get()
1657e8d8bef9SDimitry Andric  */
1658e8d8bef9SDimitry Andric LLVMTypeRef LLVMScalableVectorType(LLVMTypeRef ElementType,
1659e8d8bef9SDimitry Andric                                    unsigned ElementCount);
1660e8d8bef9SDimitry Andric 
1661e8d8bef9SDimitry Andric /**
1662e8d8bef9SDimitry Andric  * Obtain the (possibly scalable) number of elements in a vector type.
1663e8d8bef9SDimitry Andric  *
1664e8d8bef9SDimitry Andric  * This only works on types that represent vectors (fixed or scalable).
16650b57cec5SDimitry Andric  *
16660b57cec5SDimitry Andric  * @see llvm::VectorType::getNumElements()
16670b57cec5SDimitry Andric  */
16680b57cec5SDimitry Andric unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
16690b57cec5SDimitry Andric 
16700b57cec5SDimitry Andric /**
1671*0fca6ea1SDimitry Andric  * Get the pointer value for the associated ConstantPtrAuth constant.
1672*0fca6ea1SDimitry Andric  *
1673*0fca6ea1SDimitry Andric  * @see llvm::ConstantPtrAuth::getPointer
1674*0fca6ea1SDimitry Andric  */
1675*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetConstantPtrAuthPointer(LLVMValueRef PtrAuth);
1676*0fca6ea1SDimitry Andric 
1677*0fca6ea1SDimitry Andric /**
1678*0fca6ea1SDimitry Andric  * Get the key value for the associated ConstantPtrAuth constant.
1679*0fca6ea1SDimitry Andric  *
1680*0fca6ea1SDimitry Andric  * @see llvm::ConstantPtrAuth::getKey
1681*0fca6ea1SDimitry Andric  */
1682*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetConstantPtrAuthKey(LLVMValueRef PtrAuth);
1683*0fca6ea1SDimitry Andric 
1684*0fca6ea1SDimitry Andric /**
1685*0fca6ea1SDimitry Andric  * Get the discriminator value for the associated ConstantPtrAuth constant.
1686*0fca6ea1SDimitry Andric  *
1687*0fca6ea1SDimitry Andric  * @see llvm::ConstantPtrAuth::getDiscriminator
1688*0fca6ea1SDimitry Andric  */
1689*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetConstantPtrAuthDiscriminator(LLVMValueRef PtrAuth);
1690*0fca6ea1SDimitry Andric 
1691*0fca6ea1SDimitry Andric /**
1692*0fca6ea1SDimitry Andric  * Get the address discriminator value for the associated ConstantPtrAuth
1693*0fca6ea1SDimitry Andric  * constant.
1694*0fca6ea1SDimitry Andric  *
1695*0fca6ea1SDimitry Andric  * @see llvm::ConstantPtrAuth::getAddrDiscriminator
1696*0fca6ea1SDimitry Andric  */
1697*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetConstantPtrAuthAddrDiscriminator(LLVMValueRef PtrAuth);
1698*0fca6ea1SDimitry Andric 
1699*0fca6ea1SDimitry Andric /**
17000b57cec5SDimitry Andric  * @}
17010b57cec5SDimitry Andric  */
17020b57cec5SDimitry Andric 
17030b57cec5SDimitry Andric /**
17040b57cec5SDimitry Andric  * @defgroup LLVMCCoreTypeOther Other Types
17050b57cec5SDimitry Andric  *
17060b57cec5SDimitry Andric  * @{
17070b57cec5SDimitry Andric  */
17080b57cec5SDimitry Andric 
17090b57cec5SDimitry Andric /**
17100b57cec5SDimitry Andric  * Create a void type in a context.
17110b57cec5SDimitry Andric  */
17120b57cec5SDimitry Andric LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C);
17130b57cec5SDimitry Andric 
17140b57cec5SDimitry Andric /**
17150b57cec5SDimitry Andric  * Create a label type in a context.
17160b57cec5SDimitry Andric  */
17170b57cec5SDimitry Andric LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C);
17180b57cec5SDimitry Andric 
17190b57cec5SDimitry Andric /**
17200b57cec5SDimitry Andric  * Create a X86 MMX type in a context.
17210b57cec5SDimitry Andric  */
17220b57cec5SDimitry Andric LLVMTypeRef LLVMX86MMXTypeInContext(LLVMContextRef C);
17230b57cec5SDimitry Andric 
17240b57cec5SDimitry Andric /**
1725e8d8bef9SDimitry Andric  * Create a X86 AMX type in a context.
1726e8d8bef9SDimitry Andric  */
1727e8d8bef9SDimitry Andric LLVMTypeRef LLVMX86AMXTypeInContext(LLVMContextRef C);
1728e8d8bef9SDimitry Andric 
1729e8d8bef9SDimitry Andric /**
17300b57cec5SDimitry Andric  * Create a token type in a context.
17310b57cec5SDimitry Andric  */
17320b57cec5SDimitry Andric LLVMTypeRef LLVMTokenTypeInContext(LLVMContextRef C);
17330b57cec5SDimitry Andric 
17340b57cec5SDimitry Andric /**
17350b57cec5SDimitry Andric  * Create a metadata type in a context.
17360b57cec5SDimitry Andric  */
17370b57cec5SDimitry Andric LLVMTypeRef LLVMMetadataTypeInContext(LLVMContextRef C);
17380b57cec5SDimitry Andric 
17390b57cec5SDimitry Andric /**
17400b57cec5SDimitry Andric  * These are similar to the above functions except they operate on the
17410b57cec5SDimitry Andric  * global context.
17420b57cec5SDimitry Andric  */
17430b57cec5SDimitry Andric LLVMTypeRef LLVMVoidType(void);
17440b57cec5SDimitry Andric LLVMTypeRef LLVMLabelType(void);
17450b57cec5SDimitry Andric LLVMTypeRef LLVMX86MMXType(void);
1746e8d8bef9SDimitry Andric LLVMTypeRef LLVMX86AMXType(void);
17470b57cec5SDimitry Andric 
17480b57cec5SDimitry Andric /**
1749bdd1243dSDimitry Andric  * Create a target extension type in LLVM context.
1750bdd1243dSDimitry Andric  */
1751bdd1243dSDimitry Andric LLVMTypeRef LLVMTargetExtTypeInContext(LLVMContextRef C, const char *Name,
1752bdd1243dSDimitry Andric                                        LLVMTypeRef *TypeParams,
1753bdd1243dSDimitry Andric                                        unsigned TypeParamCount,
1754bdd1243dSDimitry Andric                                        unsigned *IntParams,
1755bdd1243dSDimitry Andric                                        unsigned IntParamCount);
1756bdd1243dSDimitry Andric 
1757bdd1243dSDimitry Andric /**
1758*0fca6ea1SDimitry Andric  * Obtain the name for this target extension type.
1759*0fca6ea1SDimitry Andric  *
1760*0fca6ea1SDimitry Andric  * @see llvm::TargetExtType::getName()
1761*0fca6ea1SDimitry Andric  */
1762*0fca6ea1SDimitry Andric const char *LLVMGetTargetExtTypeName(LLVMTypeRef TargetExtTy);
1763*0fca6ea1SDimitry Andric 
1764*0fca6ea1SDimitry Andric /**
1765*0fca6ea1SDimitry Andric  * Obtain the number of type parameters for this target extension type.
1766*0fca6ea1SDimitry Andric  *
1767*0fca6ea1SDimitry Andric  * @see llvm::TargetExtType::getNumTypeParameters()
1768*0fca6ea1SDimitry Andric  */
1769*0fca6ea1SDimitry Andric unsigned LLVMGetTargetExtTypeNumTypeParams(LLVMTypeRef TargetExtTy);
1770*0fca6ea1SDimitry Andric 
1771*0fca6ea1SDimitry Andric /**
1772*0fca6ea1SDimitry Andric  * Get the type parameter at the given index for the target extension type.
1773*0fca6ea1SDimitry Andric  *
1774*0fca6ea1SDimitry Andric  * @see llvm::TargetExtType::getTypeParameter()
1775*0fca6ea1SDimitry Andric  */
1776*0fca6ea1SDimitry Andric LLVMTypeRef LLVMGetTargetExtTypeTypeParam(LLVMTypeRef TargetExtTy,
1777*0fca6ea1SDimitry Andric                                           unsigned Idx);
1778*0fca6ea1SDimitry Andric 
1779*0fca6ea1SDimitry Andric /**
1780*0fca6ea1SDimitry Andric  * Obtain the number of int parameters for this target extension type.
1781*0fca6ea1SDimitry Andric  *
1782*0fca6ea1SDimitry Andric  * @see llvm::TargetExtType::getNumIntParameters()
1783*0fca6ea1SDimitry Andric  */
1784*0fca6ea1SDimitry Andric unsigned LLVMGetTargetExtTypeNumIntParams(LLVMTypeRef TargetExtTy);
1785*0fca6ea1SDimitry Andric 
1786*0fca6ea1SDimitry Andric /**
1787*0fca6ea1SDimitry Andric  * Get the int parameter at the given index for the target extension type.
1788*0fca6ea1SDimitry Andric  *
1789*0fca6ea1SDimitry Andric  * @see llvm::TargetExtType::getIntParameter()
1790*0fca6ea1SDimitry Andric  */
1791*0fca6ea1SDimitry Andric unsigned LLVMGetTargetExtTypeIntParam(LLVMTypeRef TargetExtTy, unsigned Idx);
1792*0fca6ea1SDimitry Andric 
1793*0fca6ea1SDimitry Andric /**
17940b57cec5SDimitry Andric  * @}
17950b57cec5SDimitry Andric  */
17960b57cec5SDimitry Andric 
17970b57cec5SDimitry Andric /**
17980b57cec5SDimitry Andric  * @}
17990b57cec5SDimitry Andric  */
18000b57cec5SDimitry Andric 
18010b57cec5SDimitry Andric /**
18020b57cec5SDimitry Andric  * @defgroup LLVMCCoreValues Values
18030b57cec5SDimitry Andric  *
18040b57cec5SDimitry Andric  * The bulk of LLVM's object model consists of values, which comprise a very
18050b57cec5SDimitry Andric  * rich type hierarchy.
18060b57cec5SDimitry Andric  *
18070b57cec5SDimitry Andric  * LLVMValueRef essentially represents llvm::Value. There is a rich
18080b57cec5SDimitry Andric  * hierarchy of classes within this type. Depending on the instance
18090b57cec5SDimitry Andric  * obtained, not all APIs are available.
18100b57cec5SDimitry Andric  *
18110b57cec5SDimitry Andric  * Callers can determine the type of an LLVMValueRef by calling the
18120b57cec5SDimitry Andric  * LLVMIsA* family of functions (e.g. LLVMIsAArgument()). These
18130b57cec5SDimitry Andric  * functions are defined by a macro, so it isn't obvious which are
18140b57cec5SDimitry Andric  * available by looking at the Doxygen source code. Instead, look at the
18150b57cec5SDimitry Andric  * source definition of LLVM_FOR_EACH_VALUE_SUBCLASS and note the list
18160b57cec5SDimitry Andric  * of value names given. These value names also correspond to classes in
18170b57cec5SDimitry Andric  * the llvm::Value hierarchy.
18180b57cec5SDimitry Andric  *
18190b57cec5SDimitry Andric  * @{
18200b57cec5SDimitry Andric  */
18210b57cec5SDimitry Andric 
1822*0fca6ea1SDimitry Andric // Currently, clang-format tries to format the LLVM_FOR_EACH_VALUE_SUBCLASS
1823*0fca6ea1SDimitry Andric // macro in a progressively-indented fashion, which is not desired
1824*0fca6ea1SDimitry Andric // clang-format off
1825*0fca6ea1SDimitry Andric 
18260b57cec5SDimitry Andric #define LLVM_FOR_EACH_VALUE_SUBCLASS(macro) \
18270b57cec5SDimitry Andric   macro(Argument)                           \
18280b57cec5SDimitry Andric   macro(BasicBlock)                         \
18290b57cec5SDimitry Andric   macro(InlineAsm)                          \
18300b57cec5SDimitry Andric   macro(User)                               \
18310b57cec5SDimitry Andric     macro(Constant)                         \
18320b57cec5SDimitry Andric       macro(BlockAddress)                   \
18330b57cec5SDimitry Andric       macro(ConstantAggregateZero)          \
18340b57cec5SDimitry Andric       macro(ConstantArray)                  \
18350b57cec5SDimitry Andric       macro(ConstantDataSequential)         \
18360b57cec5SDimitry Andric         macro(ConstantDataArray)            \
18370b57cec5SDimitry Andric         macro(ConstantDataVector)           \
18380b57cec5SDimitry Andric       macro(ConstantExpr)                   \
18390b57cec5SDimitry Andric       macro(ConstantFP)                     \
18400b57cec5SDimitry Andric       macro(ConstantInt)                    \
18410b57cec5SDimitry Andric       macro(ConstantPointerNull)            \
18420b57cec5SDimitry Andric       macro(ConstantStruct)                 \
18430b57cec5SDimitry Andric       macro(ConstantTokenNone)              \
18440b57cec5SDimitry Andric       macro(ConstantVector)                 \
1845*0fca6ea1SDimitry Andric       macro(ConstantPtrAuth)                \
18460b57cec5SDimitry Andric       macro(GlobalValue)                    \
18470b57cec5SDimitry Andric         macro(GlobalAlias)                  \
18480b57cec5SDimitry Andric         macro(GlobalObject)                 \
18490b57cec5SDimitry Andric           macro(Function)                   \
18500b57cec5SDimitry Andric           macro(GlobalVariable)             \
1851349cc55cSDimitry Andric           macro(GlobalIFunc)                \
18520b57cec5SDimitry Andric       macro(UndefValue)                     \
1853e8d8bef9SDimitry Andric       macro(PoisonValue)                    \
18540b57cec5SDimitry Andric     macro(Instruction)                      \
18558bcb0991SDimitry Andric       macro(UnaryOperator)                  \
18560b57cec5SDimitry Andric       macro(BinaryOperator)                 \
18570b57cec5SDimitry Andric       macro(CallInst)                       \
18580b57cec5SDimitry Andric         macro(IntrinsicInst)                \
18590b57cec5SDimitry Andric           macro(DbgInfoIntrinsic)           \
18600b57cec5SDimitry Andric             macro(DbgVariableIntrinsic)     \
18610b57cec5SDimitry Andric               macro(DbgDeclareInst)         \
18620b57cec5SDimitry Andric             macro(DbgLabelInst)             \
18630b57cec5SDimitry Andric           macro(MemIntrinsic)               \
18640b57cec5SDimitry Andric             macro(MemCpyInst)               \
18650b57cec5SDimitry Andric             macro(MemMoveInst)              \
18660b57cec5SDimitry Andric             macro(MemSetInst)               \
18670b57cec5SDimitry Andric       macro(CmpInst)                        \
18680b57cec5SDimitry Andric         macro(FCmpInst)                     \
18690b57cec5SDimitry Andric         macro(ICmpInst)                     \
18700b57cec5SDimitry Andric       macro(ExtractElementInst)             \
18710b57cec5SDimitry Andric       macro(GetElementPtrInst)              \
18720b57cec5SDimitry Andric       macro(InsertElementInst)              \
18730b57cec5SDimitry Andric       macro(InsertValueInst)                \
18740b57cec5SDimitry Andric       macro(LandingPadInst)                 \
18750b57cec5SDimitry Andric       macro(PHINode)                        \
18760b57cec5SDimitry Andric       macro(SelectInst)                     \
18770b57cec5SDimitry Andric       macro(ShuffleVectorInst)              \
18780b57cec5SDimitry Andric       macro(StoreInst)                      \
18790b57cec5SDimitry Andric       macro(BranchInst)                     \
18800b57cec5SDimitry Andric       macro(IndirectBrInst)                 \
18810b57cec5SDimitry Andric       macro(InvokeInst)                     \
18820b57cec5SDimitry Andric       macro(ReturnInst)                     \
18830b57cec5SDimitry Andric       macro(SwitchInst)                     \
18840b57cec5SDimitry Andric       macro(UnreachableInst)                \
18850b57cec5SDimitry Andric       macro(ResumeInst)                     \
18860b57cec5SDimitry Andric       macro(CleanupReturnInst)              \
18870b57cec5SDimitry Andric       macro(CatchReturnInst)                \
18888bcb0991SDimitry Andric       macro(CatchSwitchInst)                \
18898bcb0991SDimitry Andric       macro(CallBrInst)                     \
18900b57cec5SDimitry Andric       macro(FuncletPadInst)                 \
18910b57cec5SDimitry Andric         macro(CatchPadInst)                 \
18920b57cec5SDimitry Andric         macro(CleanupPadInst)               \
18930b57cec5SDimitry Andric       macro(UnaryInstruction)               \
18940b57cec5SDimitry Andric         macro(AllocaInst)                   \
18950b57cec5SDimitry Andric         macro(CastInst)                     \
18960b57cec5SDimitry Andric           macro(AddrSpaceCastInst)          \
18970b57cec5SDimitry Andric           macro(BitCastInst)                \
18980b57cec5SDimitry Andric           macro(FPExtInst)                  \
18990b57cec5SDimitry Andric           macro(FPToSIInst)                 \
19000b57cec5SDimitry Andric           macro(FPToUIInst)                 \
19010b57cec5SDimitry Andric           macro(FPTruncInst)                \
19020b57cec5SDimitry Andric           macro(IntToPtrInst)               \
19030b57cec5SDimitry Andric           macro(PtrToIntInst)               \
19040b57cec5SDimitry Andric           macro(SExtInst)                   \
19050b57cec5SDimitry Andric           macro(SIToFPInst)                 \
19060b57cec5SDimitry Andric           macro(TruncInst)                  \
19070b57cec5SDimitry Andric           macro(UIToFPInst)                 \
19080b57cec5SDimitry Andric           macro(ZExtInst)                   \
19090b57cec5SDimitry Andric         macro(ExtractValueInst)             \
19100b57cec5SDimitry Andric         macro(LoadInst)                     \
19118bcb0991SDimitry Andric         macro(VAArgInst)                    \
1912480093f4SDimitry Andric         macro(FreezeInst)                   \
19138bcb0991SDimitry Andric       macro(AtomicCmpXchgInst)              \
19148bcb0991SDimitry Andric       macro(AtomicRMWInst)                  \
19158bcb0991SDimitry Andric       macro(FenceInst)
19160b57cec5SDimitry Andric 
1917*0fca6ea1SDimitry Andric // clang-format on
1918*0fca6ea1SDimitry Andric 
19190b57cec5SDimitry Andric /**
19200b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueGeneral General APIs
19210b57cec5SDimitry Andric  *
19220b57cec5SDimitry Andric  * Functions in this section work on all LLVMValueRef instances,
19230b57cec5SDimitry Andric  * regardless of their sub-type. They correspond to functions available
19240b57cec5SDimitry Andric  * on llvm::Value.
19250b57cec5SDimitry Andric  *
19260b57cec5SDimitry Andric  * @{
19270b57cec5SDimitry Andric  */
19280b57cec5SDimitry Andric 
19290b57cec5SDimitry Andric /**
19300b57cec5SDimitry Andric  * Obtain the type of a value.
19310b57cec5SDimitry Andric  *
19320b57cec5SDimitry Andric  * @see llvm::Value::getType()
19330b57cec5SDimitry Andric  */
19340b57cec5SDimitry Andric LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
19350b57cec5SDimitry Andric 
19360b57cec5SDimitry Andric /**
19370b57cec5SDimitry Andric  * Obtain the enumerated type of a Value instance.
19380b57cec5SDimitry Andric  *
19390b57cec5SDimitry Andric  * @see llvm::Value::getValueID()
19400b57cec5SDimitry Andric  */
19410b57cec5SDimitry Andric LLVMValueKind LLVMGetValueKind(LLVMValueRef Val);
19420b57cec5SDimitry Andric 
19430b57cec5SDimitry Andric /**
19440b57cec5SDimitry Andric  * Obtain the string name of a value.
19450b57cec5SDimitry Andric  *
19460b57cec5SDimitry Andric  * @see llvm::Value::getName()
19470b57cec5SDimitry Andric  */
19480b57cec5SDimitry Andric const char *LLVMGetValueName2(LLVMValueRef Val, size_t *Length);
19490b57cec5SDimitry Andric 
19500b57cec5SDimitry Andric /**
19510b57cec5SDimitry Andric  * Set the string name of a value.
19520b57cec5SDimitry Andric  *
19530b57cec5SDimitry Andric  * @see llvm::Value::setName()
19540b57cec5SDimitry Andric  */
19550b57cec5SDimitry Andric void LLVMSetValueName2(LLVMValueRef Val, const char *Name, size_t NameLen);
19560b57cec5SDimitry Andric 
19570b57cec5SDimitry Andric /**
19580b57cec5SDimitry Andric  * Dump a representation of a value to stderr.
19590b57cec5SDimitry Andric  *
19600b57cec5SDimitry Andric  * @see llvm::Value::dump()
19610b57cec5SDimitry Andric  */
19620b57cec5SDimitry Andric void LLVMDumpValue(LLVMValueRef Val);
19630b57cec5SDimitry Andric 
19640b57cec5SDimitry Andric /**
19650b57cec5SDimitry Andric  * Return a string representation of the value. Use
19660b57cec5SDimitry Andric  * LLVMDisposeMessage to free the string.
19670b57cec5SDimitry Andric  *
19680b57cec5SDimitry Andric  * @see llvm::Value::print()
19690b57cec5SDimitry Andric  */
19700b57cec5SDimitry Andric char *LLVMPrintValueToString(LLVMValueRef Val);
19710b57cec5SDimitry Andric 
19720b57cec5SDimitry Andric /**
1973*0fca6ea1SDimitry Andric  * Return a string representation of the DbgRecord. Use
1974*0fca6ea1SDimitry Andric  * LLVMDisposeMessage to free the string.
1975*0fca6ea1SDimitry Andric  *
1976*0fca6ea1SDimitry Andric  * @see llvm::DbgRecord::print()
1977*0fca6ea1SDimitry Andric  */
1978*0fca6ea1SDimitry Andric char *LLVMPrintDbgRecordToString(LLVMDbgRecordRef Record);
1979*0fca6ea1SDimitry Andric 
1980*0fca6ea1SDimitry Andric /**
19810b57cec5SDimitry Andric  * Replace all uses of a value with another one.
19820b57cec5SDimitry Andric  *
19830b57cec5SDimitry Andric  * @see llvm::Value::replaceAllUsesWith()
19840b57cec5SDimitry Andric  */
19850b57cec5SDimitry Andric void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal);
19860b57cec5SDimitry Andric 
19870b57cec5SDimitry Andric /**
19880b57cec5SDimitry Andric  * Determine whether the specified value instance is constant.
19890b57cec5SDimitry Andric  */
19900b57cec5SDimitry Andric LLVMBool LLVMIsConstant(LLVMValueRef Val);
19910b57cec5SDimitry Andric 
19920b57cec5SDimitry Andric /**
19930b57cec5SDimitry Andric  * Determine whether a value instance is undefined.
19940b57cec5SDimitry Andric  */
19950b57cec5SDimitry Andric LLVMBool LLVMIsUndef(LLVMValueRef Val);
19960b57cec5SDimitry Andric 
19970b57cec5SDimitry Andric /**
1998e8d8bef9SDimitry Andric  * Determine whether a value instance is poisonous.
1999e8d8bef9SDimitry Andric  */
2000e8d8bef9SDimitry Andric LLVMBool LLVMIsPoison(LLVMValueRef Val);
2001e8d8bef9SDimitry Andric 
2002e8d8bef9SDimitry Andric /**
20030b57cec5SDimitry Andric  * Convert value instances between types.
20040b57cec5SDimitry Andric  *
20050b57cec5SDimitry Andric  * Internally, an LLVMValueRef is "pinned" to a specific type. This
20060b57cec5SDimitry Andric  * series of functions allows you to cast an instance to a specific
20070b57cec5SDimitry Andric  * type.
20080b57cec5SDimitry Andric  *
20090b57cec5SDimitry Andric  * If the cast is not valid for the specified type, NULL is returned.
20100b57cec5SDimitry Andric  *
20110b57cec5SDimitry Andric  * @see llvm::dyn_cast_or_null<>
20120b57cec5SDimitry Andric  */
20130b57cec5SDimitry Andric #define LLVM_DECLARE_VALUE_CAST(name) \
20140b57cec5SDimitry Andric   LLVMValueRef LLVMIsA##name(LLVMValueRef Val);
20150b57cec5SDimitry Andric LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DECLARE_VALUE_CAST)
20160b57cec5SDimitry Andric 
20170b57cec5SDimitry Andric LLVMValueRef LLVMIsAMDNode(LLVMValueRef Val);
201806c3fb27SDimitry Andric LLVMValueRef LLVMIsAValueAsMetadata(LLVMValueRef Val);
20190b57cec5SDimitry Andric LLVMValueRef LLVMIsAMDString(LLVMValueRef Val);
20200b57cec5SDimitry Andric 
20210b57cec5SDimitry Andric /** Deprecated: Use LLVMGetValueName2 instead. */
20220b57cec5SDimitry Andric const char *LLVMGetValueName(LLVMValueRef Val);
20230b57cec5SDimitry Andric /** Deprecated: Use LLVMSetValueName2 instead. */
20240b57cec5SDimitry Andric void LLVMSetValueName(LLVMValueRef Val, const char *Name);
20250b57cec5SDimitry Andric 
20260b57cec5SDimitry Andric /**
20270b57cec5SDimitry Andric  * @}
20280b57cec5SDimitry Andric  */
20290b57cec5SDimitry Andric 
20300b57cec5SDimitry Andric /**
20310b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueUses Usage
20320b57cec5SDimitry Andric  *
20330b57cec5SDimitry Andric  * This module defines functions that allow you to inspect the uses of a
20340b57cec5SDimitry Andric  * LLVMValueRef.
20350b57cec5SDimitry Andric  *
20360b57cec5SDimitry Andric  * It is possible to obtain an LLVMUseRef for any LLVMValueRef instance.
20370b57cec5SDimitry Andric  * Each LLVMUseRef (which corresponds to a llvm::Use instance) holds a
20380b57cec5SDimitry Andric  * llvm::User and llvm::Value.
20390b57cec5SDimitry Andric  *
20400b57cec5SDimitry Andric  * @{
20410b57cec5SDimitry Andric  */
20420b57cec5SDimitry Andric 
20430b57cec5SDimitry Andric /**
20440b57cec5SDimitry Andric  * Obtain the first use of a value.
20450b57cec5SDimitry Andric  *
20460b57cec5SDimitry Andric  * Uses are obtained in an iterator fashion. First, call this function
20470b57cec5SDimitry Andric  * to obtain a reference to the first use. Then, call LLVMGetNextUse()
20480b57cec5SDimitry Andric  * on that instance and all subsequently obtained instances until
20490b57cec5SDimitry Andric  * LLVMGetNextUse() returns NULL.
20500b57cec5SDimitry Andric  *
20510b57cec5SDimitry Andric  * @see llvm::Value::use_begin()
20520b57cec5SDimitry Andric  */
20530b57cec5SDimitry Andric LLVMUseRef LLVMGetFirstUse(LLVMValueRef Val);
20540b57cec5SDimitry Andric 
20550b57cec5SDimitry Andric /**
20560b57cec5SDimitry Andric  * Obtain the next use of a value.
20570b57cec5SDimitry Andric  *
20580b57cec5SDimitry Andric  * This effectively advances the iterator. It returns NULL if you are on
20590b57cec5SDimitry Andric  * the final use and no more are available.
20600b57cec5SDimitry Andric  */
20610b57cec5SDimitry Andric LLVMUseRef LLVMGetNextUse(LLVMUseRef U);
20620b57cec5SDimitry Andric 
20630b57cec5SDimitry Andric /**
20640b57cec5SDimitry Andric  * Obtain the user value for a user.
20650b57cec5SDimitry Andric  *
20660b57cec5SDimitry Andric  * The returned value corresponds to a llvm::User type.
20670b57cec5SDimitry Andric  *
20680b57cec5SDimitry Andric  * @see llvm::Use::getUser()
20690b57cec5SDimitry Andric  */
20700b57cec5SDimitry Andric LLVMValueRef LLVMGetUser(LLVMUseRef U);
20710b57cec5SDimitry Andric 
20720b57cec5SDimitry Andric /**
20730b57cec5SDimitry Andric  * Obtain the value this use corresponds to.
20740b57cec5SDimitry Andric  *
20750b57cec5SDimitry Andric  * @see llvm::Use::get().
20760b57cec5SDimitry Andric  */
20770b57cec5SDimitry Andric LLVMValueRef LLVMGetUsedValue(LLVMUseRef U);
20780b57cec5SDimitry Andric 
20790b57cec5SDimitry Andric /**
20800b57cec5SDimitry Andric  * @}
20810b57cec5SDimitry Andric  */
20820b57cec5SDimitry Andric 
20830b57cec5SDimitry Andric /**
20840b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueUser User value
20850b57cec5SDimitry Andric  *
20860b57cec5SDimitry Andric  * Function in this group pertain to LLVMValueRef instances that descent
20870b57cec5SDimitry Andric  * from llvm::User. This includes constants, instructions, and
20880b57cec5SDimitry Andric  * operators.
20890b57cec5SDimitry Andric  *
20900b57cec5SDimitry Andric  * @{
20910b57cec5SDimitry Andric  */
20920b57cec5SDimitry Andric 
20930b57cec5SDimitry Andric /**
20940b57cec5SDimitry Andric  * Obtain an operand at a specific index in a llvm::User value.
20950b57cec5SDimitry Andric  *
20960b57cec5SDimitry Andric  * @see llvm::User::getOperand()
20970b57cec5SDimitry Andric  */
20980b57cec5SDimitry Andric LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index);
20990b57cec5SDimitry Andric 
21000b57cec5SDimitry Andric /**
21010b57cec5SDimitry Andric  * Obtain the use of an operand at a specific index in a llvm::User value.
21020b57cec5SDimitry Andric  *
21030b57cec5SDimitry Andric  * @see llvm::User::getOperandUse()
21040b57cec5SDimitry Andric  */
21050b57cec5SDimitry Andric LLVMUseRef LLVMGetOperandUse(LLVMValueRef Val, unsigned Index);
21060b57cec5SDimitry Andric 
21070b57cec5SDimitry Andric /**
21080b57cec5SDimitry Andric  * Set an operand at a specific index in a llvm::User value.
21090b57cec5SDimitry Andric  *
21100b57cec5SDimitry Andric  * @see llvm::User::setOperand()
21110b57cec5SDimitry Andric  */
21120b57cec5SDimitry Andric void LLVMSetOperand(LLVMValueRef User, unsigned Index, LLVMValueRef Val);
21130b57cec5SDimitry Andric 
21140b57cec5SDimitry Andric /**
21150b57cec5SDimitry Andric  * Obtain the number of operands in a llvm::User value.
21160b57cec5SDimitry Andric  *
21170b57cec5SDimitry Andric  * @see llvm::User::getNumOperands()
21180b57cec5SDimitry Andric  */
21190b57cec5SDimitry Andric int LLVMGetNumOperands(LLVMValueRef Val);
21200b57cec5SDimitry Andric 
21210b57cec5SDimitry Andric /**
21220b57cec5SDimitry Andric  * @}
21230b57cec5SDimitry Andric  */
21240b57cec5SDimitry Andric 
21250b57cec5SDimitry Andric /**
21260b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueConstant Constants
21270b57cec5SDimitry Andric  *
21280b57cec5SDimitry Andric  * This section contains APIs for interacting with LLVMValueRef that
21290b57cec5SDimitry Andric  * correspond to llvm::Constant instances.
21300b57cec5SDimitry Andric  *
21310b57cec5SDimitry Andric  * These functions will work for any LLVMValueRef in the llvm::Constant
21320b57cec5SDimitry Andric  * class hierarchy.
21330b57cec5SDimitry Andric  *
21340b57cec5SDimitry Andric  * @{
21350b57cec5SDimitry Andric  */
21360b57cec5SDimitry Andric 
21370b57cec5SDimitry Andric /**
21380b57cec5SDimitry Andric  * Obtain a constant value referring to the null instance of a type.
21390b57cec5SDimitry Andric  *
21400b57cec5SDimitry Andric  * @see llvm::Constant::getNullValue()
21410b57cec5SDimitry Andric  */
21420b57cec5SDimitry Andric LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
21430b57cec5SDimitry Andric 
21440b57cec5SDimitry Andric /**
21450b57cec5SDimitry Andric  * Obtain a constant value referring to the instance of a type
21460b57cec5SDimitry Andric  * consisting of all ones.
21470b57cec5SDimitry Andric  *
21480b57cec5SDimitry Andric  * This is only valid for integer types.
21490b57cec5SDimitry Andric  *
21500b57cec5SDimitry Andric  * @see llvm::Constant::getAllOnesValue()
21510b57cec5SDimitry Andric  */
21520b57cec5SDimitry Andric LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty);
21530b57cec5SDimitry Andric 
21540b57cec5SDimitry Andric /**
21550b57cec5SDimitry Andric  * Obtain a constant value referring to an undefined value of a type.
21560b57cec5SDimitry Andric  *
21570b57cec5SDimitry Andric  * @see llvm::UndefValue::get()
21580b57cec5SDimitry Andric  */
21590b57cec5SDimitry Andric LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
21600b57cec5SDimitry Andric 
21610b57cec5SDimitry Andric /**
2162e8d8bef9SDimitry Andric  * Obtain a constant value referring to a poison value of a type.
2163e8d8bef9SDimitry Andric  *
2164e8d8bef9SDimitry Andric  * @see llvm::PoisonValue::get()
2165e8d8bef9SDimitry Andric  */
2166e8d8bef9SDimitry Andric LLVMValueRef LLVMGetPoison(LLVMTypeRef Ty);
2167e8d8bef9SDimitry Andric 
2168e8d8bef9SDimitry Andric /**
21690b57cec5SDimitry Andric  * Determine whether a value instance is null.
21700b57cec5SDimitry Andric  *
21710b57cec5SDimitry Andric  * @see llvm::Constant::isNullValue()
21720b57cec5SDimitry Andric  */
21730b57cec5SDimitry Andric LLVMBool LLVMIsNull(LLVMValueRef Val);
21740b57cec5SDimitry Andric 
21750b57cec5SDimitry Andric /**
21760b57cec5SDimitry Andric  * Obtain a constant that is a constant pointer pointing to NULL for a
21770b57cec5SDimitry Andric  * specified type.
21780b57cec5SDimitry Andric  */
21790b57cec5SDimitry Andric LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty);
21800b57cec5SDimitry Andric 
21810b57cec5SDimitry Andric /**
21820b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueConstantScalar Scalar constants
21830b57cec5SDimitry Andric  *
21840b57cec5SDimitry Andric  * Functions in this group model LLVMValueRef instances that correspond
21850b57cec5SDimitry Andric  * to constants referring to scalar types.
21860b57cec5SDimitry Andric  *
21870b57cec5SDimitry Andric  * For integer types, the LLVMTypeRef parameter should correspond to a
21880b57cec5SDimitry Andric  * llvm::IntegerType instance and the returned LLVMValueRef will
21890b57cec5SDimitry Andric  * correspond to a llvm::ConstantInt.
21900b57cec5SDimitry Andric  *
21910b57cec5SDimitry Andric  * For floating point types, the LLVMTypeRef returned corresponds to a
21920b57cec5SDimitry Andric  * llvm::ConstantFP.
21930b57cec5SDimitry Andric  *
21940b57cec5SDimitry Andric  * @{
21950b57cec5SDimitry Andric  */
21960b57cec5SDimitry Andric 
21970b57cec5SDimitry Andric /**
21980b57cec5SDimitry Andric  * Obtain a constant value for an integer type.
21990b57cec5SDimitry Andric  *
22000b57cec5SDimitry Andric  * The returned value corresponds to a llvm::ConstantInt.
22010b57cec5SDimitry Andric  *
22020b57cec5SDimitry Andric  * @see llvm::ConstantInt::get()
22030b57cec5SDimitry Andric  *
22040b57cec5SDimitry Andric  * @param IntTy Integer type to obtain value of.
22050b57cec5SDimitry Andric  * @param N The value the returned instance should refer to.
22060b57cec5SDimitry Andric  * @param SignExtend Whether to sign extend the produced value.
22070b57cec5SDimitry Andric  */
22080b57cec5SDimitry Andric LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
22090b57cec5SDimitry Andric                           LLVMBool SignExtend);
22100b57cec5SDimitry Andric 
22110b57cec5SDimitry Andric /**
22120b57cec5SDimitry Andric  * Obtain a constant value for an integer of arbitrary precision.
22130b57cec5SDimitry Andric  *
22140b57cec5SDimitry Andric  * @see llvm::ConstantInt::get()
22150b57cec5SDimitry Andric  */
22160b57cec5SDimitry Andric LLVMValueRef LLVMConstIntOfArbitraryPrecision(LLVMTypeRef IntTy,
22170b57cec5SDimitry Andric                                               unsigned NumWords,
22180b57cec5SDimitry Andric                                               const uint64_t Words[]);
22190b57cec5SDimitry Andric 
22200b57cec5SDimitry Andric /**
22210b57cec5SDimitry Andric  * Obtain a constant value for an integer parsed from a string.
22220b57cec5SDimitry Andric  *
22230b57cec5SDimitry Andric  * A similar API, LLVMConstIntOfStringAndSize is also available. If the
22240b57cec5SDimitry Andric  * string's length is available, it is preferred to call that function
22250b57cec5SDimitry Andric  * instead.
22260b57cec5SDimitry Andric  *
22270b57cec5SDimitry Andric  * @see llvm::ConstantInt::get()
22280b57cec5SDimitry Andric  */
22290b57cec5SDimitry Andric LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char *Text,
22300b57cec5SDimitry Andric                                   uint8_t Radix);
22310b57cec5SDimitry Andric 
22320b57cec5SDimitry Andric /**
22330b57cec5SDimitry Andric  * Obtain a constant value for an integer parsed from a string with
22340b57cec5SDimitry Andric  * specified length.
22350b57cec5SDimitry Andric  *
22360b57cec5SDimitry Andric  * @see llvm::ConstantInt::get()
22370b57cec5SDimitry Andric  */
22380b57cec5SDimitry Andric LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char *Text,
22390b57cec5SDimitry Andric                                          unsigned SLen, uint8_t Radix);
22400b57cec5SDimitry Andric 
22410b57cec5SDimitry Andric /**
22420b57cec5SDimitry Andric  * Obtain a constant value referring to a double floating point value.
22430b57cec5SDimitry Andric  */
22440b57cec5SDimitry Andric LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
22450b57cec5SDimitry Andric 
22460b57cec5SDimitry Andric /**
22470b57cec5SDimitry Andric  * Obtain a constant for a floating point value parsed from a string.
22480b57cec5SDimitry Andric  *
22490b57cec5SDimitry Andric  * A similar API, LLVMConstRealOfStringAndSize is also available. It
22500b57cec5SDimitry Andric  * should be used if the input string's length is known.
22510b57cec5SDimitry Andric  */
22520b57cec5SDimitry Andric LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text);
22530b57cec5SDimitry Andric 
22540b57cec5SDimitry Andric /**
22550b57cec5SDimitry Andric  * Obtain a constant for a floating point value parsed from a string.
22560b57cec5SDimitry Andric  */
22570b57cec5SDimitry Andric LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char *Text,
22580b57cec5SDimitry Andric                                           unsigned SLen);
22590b57cec5SDimitry Andric 
22600b57cec5SDimitry Andric /**
22610b57cec5SDimitry Andric  * Obtain the zero extended value for an integer constant value.
22620b57cec5SDimitry Andric  *
22630b57cec5SDimitry Andric  * @see llvm::ConstantInt::getZExtValue()
22640b57cec5SDimitry Andric  */
22650b57cec5SDimitry Andric unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal);
22660b57cec5SDimitry Andric 
22670b57cec5SDimitry Andric /**
22680b57cec5SDimitry Andric  * Obtain the sign extended value for an integer constant value.
22690b57cec5SDimitry Andric  *
22700b57cec5SDimitry Andric  * @see llvm::ConstantInt::getSExtValue()
22710b57cec5SDimitry Andric  */
22720b57cec5SDimitry Andric long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal);
22730b57cec5SDimitry Andric 
22740b57cec5SDimitry Andric /**
22750b57cec5SDimitry Andric  * Obtain the double value for an floating point constant value.
22760b57cec5SDimitry Andric  * losesInfo indicates if some precision was lost in the conversion.
22770b57cec5SDimitry Andric  *
22780b57cec5SDimitry Andric  * @see llvm::ConstantFP::getDoubleValue
22790b57cec5SDimitry Andric  */
22800b57cec5SDimitry Andric double LLVMConstRealGetDouble(LLVMValueRef ConstantVal, LLVMBool *losesInfo);
22810b57cec5SDimitry Andric 
22820b57cec5SDimitry Andric /**
22830b57cec5SDimitry Andric  * @}
22840b57cec5SDimitry Andric  */
22850b57cec5SDimitry Andric 
22860b57cec5SDimitry Andric /**
22870b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueConstantComposite Composite Constants
22880b57cec5SDimitry Andric  *
22890b57cec5SDimitry Andric  * Functions in this group operate on composite constants.
22900b57cec5SDimitry Andric  *
22910b57cec5SDimitry Andric  * @{
22920b57cec5SDimitry Andric  */
22930b57cec5SDimitry Andric 
22940b57cec5SDimitry Andric /**
22950b57cec5SDimitry Andric  * Create a ConstantDataSequential and initialize it with a string.
22960b57cec5SDimitry Andric  *
2297*0fca6ea1SDimitry Andric  * @deprecated LLVMConstStringInContext is deprecated in favor of the API
2298*0fca6ea1SDimitry Andric  * accurate LLVMConstStringInContext2
22990b57cec5SDimitry Andric  * @see llvm::ConstantDataArray::getString()
23000b57cec5SDimitry Andric  */
23010b57cec5SDimitry Andric LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
23020b57cec5SDimitry Andric                                       unsigned Length, LLVMBool DontNullTerminate);
23030b57cec5SDimitry Andric 
23040b57cec5SDimitry Andric /**
2305*0fca6ea1SDimitry Andric  * Create a ConstantDataSequential and initialize it with a string.
2306*0fca6ea1SDimitry Andric  *
2307*0fca6ea1SDimitry Andric  * @see llvm::ConstantDataArray::getString()
2308*0fca6ea1SDimitry Andric  */
2309*0fca6ea1SDimitry Andric LLVMValueRef LLVMConstStringInContext2(LLVMContextRef C, const char *Str,
2310*0fca6ea1SDimitry Andric                                        size_t Length,
2311*0fca6ea1SDimitry Andric                                        LLVMBool DontNullTerminate);
2312*0fca6ea1SDimitry Andric 
2313*0fca6ea1SDimitry Andric /**
23140b57cec5SDimitry Andric  * Create a ConstantDataSequential with string content in the global context.
23150b57cec5SDimitry Andric  *
23160b57cec5SDimitry Andric  * This is the same as LLVMConstStringInContext except it operates on the
23170b57cec5SDimitry Andric  * global context.
23180b57cec5SDimitry Andric  *
23190b57cec5SDimitry Andric  * @see LLVMConstStringInContext()
23200b57cec5SDimitry Andric  * @see llvm::ConstantDataArray::getString()
23210b57cec5SDimitry Andric  */
23220b57cec5SDimitry Andric LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
23230b57cec5SDimitry Andric                              LLVMBool DontNullTerminate);
23240b57cec5SDimitry Andric 
23250b57cec5SDimitry Andric /**
23260b57cec5SDimitry Andric  * Returns true if the specified constant is an array of i8.
23270b57cec5SDimitry Andric  *
23280b57cec5SDimitry Andric  * @see ConstantDataSequential::getAsString()
23290b57cec5SDimitry Andric  */
23300b57cec5SDimitry Andric LLVMBool LLVMIsConstantString(LLVMValueRef c);
23310b57cec5SDimitry Andric 
23320b57cec5SDimitry Andric /**
23330b57cec5SDimitry Andric  * Get the given constant data sequential as a string.
23340b57cec5SDimitry Andric  *
23350b57cec5SDimitry Andric  * @see ConstantDataSequential::getAsString()
23360b57cec5SDimitry Andric  */
23370b57cec5SDimitry Andric const char *LLVMGetAsString(LLVMValueRef c, size_t *Length);
23380b57cec5SDimitry Andric 
23390b57cec5SDimitry Andric /**
23400b57cec5SDimitry Andric  * Create an anonymous ConstantStruct with the specified values.
23410b57cec5SDimitry Andric  *
23420b57cec5SDimitry Andric  * @see llvm::ConstantStruct::getAnon()
23430b57cec5SDimitry Andric  */
23440b57cec5SDimitry Andric LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
23450b57cec5SDimitry Andric                                       LLVMValueRef *ConstantVals,
23460b57cec5SDimitry Andric                                       unsigned Count, LLVMBool Packed);
23470b57cec5SDimitry Andric 
23480b57cec5SDimitry Andric /**
23490b57cec5SDimitry Andric  * Create a ConstantStruct in the global Context.
23500b57cec5SDimitry Andric  *
23510b57cec5SDimitry Andric  * This is the same as LLVMConstStructInContext except it operates on the
23520b57cec5SDimitry Andric  * global Context.
23530b57cec5SDimitry Andric  *
23540b57cec5SDimitry Andric  * @see LLVMConstStructInContext()
23550b57cec5SDimitry Andric  */
23560b57cec5SDimitry Andric LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
23570b57cec5SDimitry Andric                              LLVMBool Packed);
23580b57cec5SDimitry Andric 
23590b57cec5SDimitry Andric /**
23600b57cec5SDimitry Andric  * Create a ConstantArray from values.
23610b57cec5SDimitry Andric  *
236206c3fb27SDimitry Andric  * @deprecated LLVMConstArray is deprecated in favor of the API accurate
236306c3fb27SDimitry Andric  * LLVMConstArray2
23640b57cec5SDimitry Andric  * @see llvm::ConstantArray::get()
23650b57cec5SDimitry Andric  */
23660b57cec5SDimitry Andric LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
23670b57cec5SDimitry Andric                             LLVMValueRef *ConstantVals, unsigned Length);
23680b57cec5SDimitry Andric 
23690b57cec5SDimitry Andric /**
237006c3fb27SDimitry Andric  * Create a ConstantArray from values.
237106c3fb27SDimitry Andric  *
237206c3fb27SDimitry Andric  * @see llvm::ConstantArray::get()
237306c3fb27SDimitry Andric  */
237406c3fb27SDimitry Andric LLVMValueRef LLVMConstArray2(LLVMTypeRef ElementTy, LLVMValueRef *ConstantVals,
237506c3fb27SDimitry Andric                              uint64_t Length);
237606c3fb27SDimitry Andric 
237706c3fb27SDimitry Andric /**
23780b57cec5SDimitry Andric  * Create a non-anonymous ConstantStruct from values.
23790b57cec5SDimitry Andric  *
23800b57cec5SDimitry Andric  * @see llvm::ConstantStruct::get()
23810b57cec5SDimitry Andric  */
23820b57cec5SDimitry Andric LLVMValueRef LLVMConstNamedStruct(LLVMTypeRef StructTy,
23830b57cec5SDimitry Andric                                   LLVMValueRef *ConstantVals,
23840b57cec5SDimitry Andric                                   unsigned Count);
23850b57cec5SDimitry Andric 
23860b57cec5SDimitry Andric /**
238781ad6265SDimitry Andric  * Get element of a constant aggregate (struct, array or vector) at the
238881ad6265SDimitry Andric  * specified index. Returns null if the index is out of range, or it's not
238981ad6265SDimitry Andric  * possible to determine the element (e.g., because the constant is a
239081ad6265SDimitry Andric  * constant expression.)
239181ad6265SDimitry Andric  *
239281ad6265SDimitry Andric  * @see llvm::Constant::getAggregateElement()
239381ad6265SDimitry Andric  */
239481ad6265SDimitry Andric LLVMValueRef LLVMGetAggregateElement(LLVMValueRef C, unsigned Idx);
239581ad6265SDimitry Andric 
239681ad6265SDimitry Andric /**
23970b57cec5SDimitry Andric  * Get an element at specified index as a constant.
23980b57cec5SDimitry Andric  *
23990b57cec5SDimitry Andric  * @see ConstantDataSequential::getElementAsConstant()
24000b57cec5SDimitry Andric  */
240181ad6265SDimitry Andric LLVM_ATTRIBUTE_C_DEPRECATED(
240281ad6265SDimitry Andric     LLVMValueRef LLVMGetElementAsConstant(LLVMValueRef C, unsigned idx),
240381ad6265SDimitry Andric     "Use LLVMGetAggregateElement instead");
24040b57cec5SDimitry Andric 
24050b57cec5SDimitry Andric /**
24060b57cec5SDimitry Andric  * Create a ConstantVector from values.
24070b57cec5SDimitry Andric  *
24080b57cec5SDimitry Andric  * @see llvm::ConstantVector::get()
24090b57cec5SDimitry Andric  */
24100b57cec5SDimitry Andric LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
24110b57cec5SDimitry Andric 
24120b57cec5SDimitry Andric /**
2413*0fca6ea1SDimitry Andric  * Create a ConstantPtrAuth constant with the given values.
2414*0fca6ea1SDimitry Andric  *
2415*0fca6ea1SDimitry Andric  * @see llvm::ConstantPtrAuth::get()
2416*0fca6ea1SDimitry Andric  */
2417*0fca6ea1SDimitry Andric LLVMValueRef LLVMConstantPtrAuth(LLVMValueRef Ptr, LLVMValueRef Key,
2418*0fca6ea1SDimitry Andric                                  LLVMValueRef Disc, LLVMValueRef AddrDisc);
2419*0fca6ea1SDimitry Andric 
2420*0fca6ea1SDimitry Andric /**
24210b57cec5SDimitry Andric  * @}
24220b57cec5SDimitry Andric  */
24230b57cec5SDimitry Andric 
24240b57cec5SDimitry Andric /**
24250b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueConstantExpressions Constant Expressions
24260b57cec5SDimitry Andric  *
24270b57cec5SDimitry Andric  * Functions in this group correspond to APIs on llvm::ConstantExpr.
24280b57cec5SDimitry Andric  *
24290b57cec5SDimitry Andric  * @see llvm::ConstantExpr.
24300b57cec5SDimitry Andric  *
24310b57cec5SDimitry Andric  * @{
24320b57cec5SDimitry Andric  */
24330b57cec5SDimitry Andric LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal);
24340b57cec5SDimitry Andric LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty);
24350b57cec5SDimitry Andric LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
24360b57cec5SDimitry Andric LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
24370b57cec5SDimitry Andric LLVMValueRef LLVMConstNSWNeg(LLVMValueRef ConstantVal);
2438*0fca6ea1SDimitry Andric LLVM_ATTRIBUTE_C_DEPRECATED(
2439*0fca6ea1SDimitry Andric     LLVMValueRef LLVMConstNUWNeg(LLVMValueRef ConstantVal),
2440*0fca6ea1SDimitry Andric     "Use LLVMConstNull instead.");
24410b57cec5SDimitry Andric LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
24420b57cec5SDimitry Andric LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
24430b57cec5SDimitry Andric LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
24440b57cec5SDimitry Andric LLVMValueRef LLVMConstNUWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
24450b57cec5SDimitry Andric LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
24460b57cec5SDimitry Andric LLVMValueRef LLVMConstNSWSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
24470b57cec5SDimitry Andric LLVMValueRef LLVMConstNUWSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
24480b57cec5SDimitry Andric LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
24490b57cec5SDimitry Andric LLVMValueRef LLVMConstNSWMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
24500b57cec5SDimitry Andric LLVMValueRef LLVMConstNUWMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
24510b57cec5SDimitry Andric LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
24520b57cec5SDimitry Andric LLVMValueRef LLVMConstGEP2(LLVMTypeRef Ty, LLVMValueRef ConstantVal,
24530b57cec5SDimitry Andric                            LLVMValueRef *ConstantIndices, unsigned NumIndices);
24540b57cec5SDimitry Andric LLVMValueRef LLVMConstInBoundsGEP2(LLVMTypeRef Ty, LLVMValueRef ConstantVal,
24550b57cec5SDimitry Andric                                    LLVMValueRef *ConstantIndices,
24560b57cec5SDimitry Andric                                    unsigned NumIndices);
2457*0fca6ea1SDimitry Andric /**
2458*0fca6ea1SDimitry Andric  * Creates a constant GetElementPtr expression. Similar to LLVMConstGEP2, but
2459*0fca6ea1SDimitry Andric  * allows specifying the no-wrap flags.
2460*0fca6ea1SDimitry Andric  *
2461*0fca6ea1SDimitry Andric  * @see llvm::ConstantExpr::getGetElementPtr()
2462*0fca6ea1SDimitry Andric  */
2463*0fca6ea1SDimitry Andric LLVMValueRef LLVMConstGEPWithNoWrapFlags(LLVMTypeRef Ty,
2464*0fca6ea1SDimitry Andric                                          LLVMValueRef ConstantVal,
2465*0fca6ea1SDimitry Andric                                          LLVMValueRef *ConstantIndices,
2466*0fca6ea1SDimitry Andric                                          unsigned NumIndices,
2467*0fca6ea1SDimitry Andric                                          LLVMGEPNoWrapFlags NoWrapFlags);
24680b57cec5SDimitry Andric LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
24690b57cec5SDimitry Andric LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
24700b57cec5SDimitry Andric LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
24710b57cec5SDimitry Andric LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
24720b57cec5SDimitry Andric LLVMValueRef LLVMConstAddrSpaceCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
24730b57cec5SDimitry Andric LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
24740b57cec5SDimitry Andric                                      LLVMTypeRef ToType);
24750b57cec5SDimitry Andric LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
24760b57cec5SDimitry Andric                                   LLVMTypeRef ToType);
24770b57cec5SDimitry Andric LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
24780b57cec5SDimitry Andric                                      LLVMValueRef IndexConstant);
24790b57cec5SDimitry Andric LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
24800b57cec5SDimitry Andric                                     LLVMValueRef ElementValueConstant,
24810b57cec5SDimitry Andric                                     LLVMValueRef IndexConstant);
24820b57cec5SDimitry Andric LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
24830b57cec5SDimitry Andric                                     LLVMValueRef VectorBConstant,
24840b57cec5SDimitry Andric                                     LLVMValueRef MaskConstant);
24850b57cec5SDimitry Andric LLVMValueRef LLVMBlockAddress(LLVMValueRef F, LLVMBasicBlockRef BB);
24860b57cec5SDimitry Andric 
2487*0fca6ea1SDimitry Andric /**
2488*0fca6ea1SDimitry Andric  * Gets the function associated with a given BlockAddress constant value.
2489*0fca6ea1SDimitry Andric  */
2490*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetBlockAddressFunction(LLVMValueRef BlockAddr);
2491*0fca6ea1SDimitry Andric 
2492*0fca6ea1SDimitry Andric /**
2493*0fca6ea1SDimitry Andric  * Gets the basic block associated with a given BlockAddress constant value.
2494*0fca6ea1SDimitry Andric  */
2495*0fca6ea1SDimitry Andric LLVMBasicBlockRef LLVMGetBlockAddressBasicBlock(LLVMValueRef BlockAddr);
2496*0fca6ea1SDimitry Andric 
24970b57cec5SDimitry Andric /** Deprecated: Use LLVMGetInlineAsm instead. */
24980b57cec5SDimitry Andric LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty,
24990b57cec5SDimitry Andric                                 const char *AsmString, const char *Constraints,
25000b57cec5SDimitry Andric                                 LLVMBool HasSideEffects, LLVMBool IsAlignStack);
25010b57cec5SDimitry Andric 
25020b57cec5SDimitry Andric /**
25030b57cec5SDimitry Andric  * @}
25040b57cec5SDimitry Andric  */
25050b57cec5SDimitry Andric 
25060b57cec5SDimitry Andric /**
25070b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueConstantGlobals Global Values
25080b57cec5SDimitry Andric  *
25090b57cec5SDimitry Andric  * This group contains functions that operate on global values. Functions in
25100b57cec5SDimitry Andric  * this group relate to functions in the llvm::GlobalValue class tree.
25110b57cec5SDimitry Andric  *
25120b57cec5SDimitry Andric  * @see llvm::GlobalValue
25130b57cec5SDimitry Andric  *
25140b57cec5SDimitry Andric  * @{
25150b57cec5SDimitry Andric  */
25160b57cec5SDimitry Andric 
25170b57cec5SDimitry Andric LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
25180b57cec5SDimitry Andric LLVMBool LLVMIsDeclaration(LLVMValueRef Global);
25190b57cec5SDimitry Andric LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
25200b57cec5SDimitry Andric void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
25210b57cec5SDimitry Andric const char *LLVMGetSection(LLVMValueRef Global);
25220b57cec5SDimitry Andric void LLVMSetSection(LLVMValueRef Global, const char *Section);
25230b57cec5SDimitry Andric LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
25240b57cec5SDimitry Andric void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
25250b57cec5SDimitry Andric LLVMDLLStorageClass LLVMGetDLLStorageClass(LLVMValueRef Global);
25260b57cec5SDimitry Andric void LLVMSetDLLStorageClass(LLVMValueRef Global, LLVMDLLStorageClass Class);
25270b57cec5SDimitry Andric LLVMUnnamedAddr LLVMGetUnnamedAddress(LLVMValueRef Global);
25280b57cec5SDimitry Andric void LLVMSetUnnamedAddress(LLVMValueRef Global, LLVMUnnamedAddr UnnamedAddr);
25290b57cec5SDimitry Andric 
25300b57cec5SDimitry Andric /**
25310b57cec5SDimitry Andric  * Returns the "value type" of a global value.  This differs from the formal
25320b57cec5SDimitry Andric  * type of a global value which is always a pointer type.
25330b57cec5SDimitry Andric  *
25340b57cec5SDimitry Andric  * @see llvm::GlobalValue::getValueType()
25350b57cec5SDimitry Andric  */
25360b57cec5SDimitry Andric LLVMTypeRef LLVMGlobalGetValueType(LLVMValueRef Global);
25370b57cec5SDimitry Andric 
25380b57cec5SDimitry Andric /** Deprecated: Use LLVMGetUnnamedAddress instead. */
25390b57cec5SDimitry Andric LLVMBool LLVMHasUnnamedAddr(LLVMValueRef Global);
25400b57cec5SDimitry Andric /** Deprecated: Use LLVMSetUnnamedAddress instead. */
25410b57cec5SDimitry Andric void LLVMSetUnnamedAddr(LLVMValueRef Global, LLVMBool HasUnnamedAddr);
25420b57cec5SDimitry Andric 
25430b57cec5SDimitry Andric /**
25440b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueWithAlignment Values with alignment
25450b57cec5SDimitry Andric  *
25460b57cec5SDimitry Andric  * Functions in this group only apply to values with alignment, i.e.
25470b57cec5SDimitry Andric  * global variables, load and store instructions.
25480b57cec5SDimitry Andric  */
25490b57cec5SDimitry Andric 
25500b57cec5SDimitry Andric /**
25510b57cec5SDimitry Andric  * Obtain the preferred alignment of the value.
25520b57cec5SDimitry Andric  * @see llvm::AllocaInst::getAlignment()
25530b57cec5SDimitry Andric  * @see llvm::LoadInst::getAlignment()
25540b57cec5SDimitry Andric  * @see llvm::StoreInst::getAlignment()
2555fe6060f1SDimitry Andric  * @see llvm::AtomicRMWInst::setAlignment()
2556fe6060f1SDimitry Andric  * @see llvm::AtomicCmpXchgInst::setAlignment()
25570b57cec5SDimitry Andric  * @see llvm::GlobalValue::getAlignment()
25580b57cec5SDimitry Andric  */
25590b57cec5SDimitry Andric unsigned LLVMGetAlignment(LLVMValueRef V);
25600b57cec5SDimitry Andric 
25610b57cec5SDimitry Andric /**
25620b57cec5SDimitry Andric  * Set the preferred alignment of the value.
25630b57cec5SDimitry Andric  * @see llvm::AllocaInst::setAlignment()
25640b57cec5SDimitry Andric  * @see llvm::LoadInst::setAlignment()
25650b57cec5SDimitry Andric  * @see llvm::StoreInst::setAlignment()
2566fe6060f1SDimitry Andric  * @see llvm::AtomicRMWInst::setAlignment()
2567fe6060f1SDimitry Andric  * @see llvm::AtomicCmpXchgInst::setAlignment()
25680b57cec5SDimitry Andric  * @see llvm::GlobalValue::setAlignment()
25690b57cec5SDimitry Andric  */
25700b57cec5SDimitry Andric void LLVMSetAlignment(LLVMValueRef V, unsigned Bytes);
25710b57cec5SDimitry Andric 
25720b57cec5SDimitry Andric /**
25730b57cec5SDimitry Andric  * Sets a metadata attachment, erasing the existing metadata attachment if
25740b57cec5SDimitry Andric  * it already exists for the given kind.
25750b57cec5SDimitry Andric  *
25760b57cec5SDimitry Andric  * @see llvm::GlobalObject::setMetadata()
25770b57cec5SDimitry Andric  */
25780b57cec5SDimitry Andric void LLVMGlobalSetMetadata(LLVMValueRef Global, unsigned Kind,
25790b57cec5SDimitry Andric                            LLVMMetadataRef MD);
25800b57cec5SDimitry Andric 
25810b57cec5SDimitry Andric /**
25820b57cec5SDimitry Andric  * Erases a metadata attachment of the given kind if it exists.
25830b57cec5SDimitry Andric  *
25840b57cec5SDimitry Andric  * @see llvm::GlobalObject::eraseMetadata()
25850b57cec5SDimitry Andric  */
25860b57cec5SDimitry Andric void LLVMGlobalEraseMetadata(LLVMValueRef Global, unsigned Kind);
25870b57cec5SDimitry Andric 
25880b57cec5SDimitry Andric /**
25890b57cec5SDimitry Andric  * Removes all metadata attachments from this value.
25900b57cec5SDimitry Andric  *
25910b57cec5SDimitry Andric  * @see llvm::GlobalObject::clearMetadata()
25920b57cec5SDimitry Andric  */
25930b57cec5SDimitry Andric void LLVMGlobalClearMetadata(LLVMValueRef Global);
25940b57cec5SDimitry Andric 
25950b57cec5SDimitry Andric /**
25960b57cec5SDimitry Andric  * Retrieves an array of metadata entries representing the metadata attached to
25970b57cec5SDimitry Andric  * this value. The caller is responsible for freeing this array by calling
25980b57cec5SDimitry Andric  * \c LLVMDisposeValueMetadataEntries.
25990b57cec5SDimitry Andric  *
26000b57cec5SDimitry Andric  * @see llvm::GlobalObject::getAllMetadata()
26010b57cec5SDimitry Andric  */
26020b57cec5SDimitry Andric LLVMValueMetadataEntry *LLVMGlobalCopyAllMetadata(LLVMValueRef Value,
26030b57cec5SDimitry Andric                                                   size_t *NumEntries);
26040b57cec5SDimitry Andric 
26050b57cec5SDimitry Andric /**
26060b57cec5SDimitry Andric  * Destroys value metadata entries.
26070b57cec5SDimitry Andric  */
26080b57cec5SDimitry Andric void LLVMDisposeValueMetadataEntries(LLVMValueMetadataEntry *Entries);
26090b57cec5SDimitry Andric 
26100b57cec5SDimitry Andric /**
26110b57cec5SDimitry Andric  * Returns the kind of a value metadata entry at a specific index.
26120b57cec5SDimitry Andric  */
26130b57cec5SDimitry Andric unsigned LLVMValueMetadataEntriesGetKind(LLVMValueMetadataEntry *Entries,
26140b57cec5SDimitry Andric                                          unsigned Index);
26150b57cec5SDimitry Andric 
26160b57cec5SDimitry Andric /**
26170b57cec5SDimitry Andric  * Returns the underlying metadata node of a value metadata entry at a
26180b57cec5SDimitry Andric  * specific index.
26190b57cec5SDimitry Andric  */
26200b57cec5SDimitry Andric LLVMMetadataRef
26210b57cec5SDimitry Andric LLVMValueMetadataEntriesGetMetadata(LLVMValueMetadataEntry *Entries,
26220b57cec5SDimitry Andric                                     unsigned Index);
26230b57cec5SDimitry Andric 
26240b57cec5SDimitry Andric /**
26250b57cec5SDimitry Andric  * @}
26260b57cec5SDimitry Andric  */
26270b57cec5SDimitry Andric 
26280b57cec5SDimitry Andric /**
26290b57cec5SDimitry Andric  * @defgroup LLVMCoreValueConstantGlobalVariable Global Variables
26300b57cec5SDimitry Andric  *
26310b57cec5SDimitry Andric  * This group contains functions that operate on global variable values.
26320b57cec5SDimitry Andric  *
26330b57cec5SDimitry Andric  * @see llvm::GlobalVariable
26340b57cec5SDimitry Andric  *
26350b57cec5SDimitry Andric  * @{
26360b57cec5SDimitry Andric  */
26370b57cec5SDimitry Andric LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
26380b57cec5SDimitry Andric LLVMValueRef LLVMAddGlobalInAddressSpace(LLVMModuleRef M, LLVMTypeRef Ty,
26390b57cec5SDimitry Andric                                          const char *Name,
26400b57cec5SDimitry Andric                                          unsigned AddressSpace);
26410b57cec5SDimitry Andric LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
26420b57cec5SDimitry Andric LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M);
26430b57cec5SDimitry Andric LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M);
26440b57cec5SDimitry Andric LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar);
26450b57cec5SDimitry Andric LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar);
26460b57cec5SDimitry Andric void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
26470b57cec5SDimitry Andric LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
26480b57cec5SDimitry Andric void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
26490b57cec5SDimitry Andric LLVMBool LLVMIsThreadLocal(LLVMValueRef GlobalVar);
26500b57cec5SDimitry Andric void LLVMSetThreadLocal(LLVMValueRef GlobalVar, LLVMBool IsThreadLocal);
26510b57cec5SDimitry Andric LLVMBool LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
26520b57cec5SDimitry Andric void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, LLVMBool IsConstant);
26530b57cec5SDimitry Andric LLVMThreadLocalMode LLVMGetThreadLocalMode(LLVMValueRef GlobalVar);
26540b57cec5SDimitry Andric void LLVMSetThreadLocalMode(LLVMValueRef GlobalVar, LLVMThreadLocalMode Mode);
26550b57cec5SDimitry Andric LLVMBool LLVMIsExternallyInitialized(LLVMValueRef GlobalVar);
26560b57cec5SDimitry Andric void LLVMSetExternallyInitialized(LLVMValueRef GlobalVar, LLVMBool IsExtInit);
26570b57cec5SDimitry Andric 
26580b57cec5SDimitry Andric /**
26590b57cec5SDimitry Andric  * @}
26600b57cec5SDimitry Andric  */
26610b57cec5SDimitry Andric 
26620b57cec5SDimitry Andric /**
26630b57cec5SDimitry Andric  * @defgroup LLVMCoreValueConstantGlobalAlias Global Aliases
26640b57cec5SDimitry Andric  *
26650b57cec5SDimitry Andric  * This group contains function that operate on global alias values.
26660b57cec5SDimitry Andric  *
26670b57cec5SDimitry Andric  * @see llvm::GlobalAlias
26680b57cec5SDimitry Andric  *
26690b57cec5SDimitry Andric  * @{
26700b57cec5SDimitry Andric  */
26714824e7fdSDimitry Andric 
26720b57cec5SDimitry Andric /**
26734824e7fdSDimitry Andric  * Add a GlobalAlias with the given value type, address space and aliasee.
26744824e7fdSDimitry Andric  *
26754824e7fdSDimitry Andric  * @see llvm::GlobalAlias::create()
26764824e7fdSDimitry Andric  */
26774824e7fdSDimitry Andric LLVMValueRef LLVMAddAlias2(LLVMModuleRef M, LLVMTypeRef ValueTy,
26784824e7fdSDimitry Andric                            unsigned AddrSpace, LLVMValueRef Aliasee,
26794824e7fdSDimitry Andric                            const char *Name);
26804824e7fdSDimitry Andric 
26814824e7fdSDimitry Andric /**
26820b57cec5SDimitry Andric  * Obtain a GlobalAlias value from a Module by its name.
26830b57cec5SDimitry Andric  *
26840b57cec5SDimitry Andric  * The returned value corresponds to a llvm::GlobalAlias value.
26850b57cec5SDimitry Andric  *
26860b57cec5SDimitry Andric  * @see llvm::Module::getNamedAlias()
26870b57cec5SDimitry Andric  */
26880b57cec5SDimitry Andric LLVMValueRef LLVMGetNamedGlobalAlias(LLVMModuleRef M,
26890b57cec5SDimitry Andric                                      const char *Name, size_t NameLen);
26900b57cec5SDimitry Andric 
26910b57cec5SDimitry Andric /**
26920b57cec5SDimitry Andric  * Obtain an iterator to the first GlobalAlias in a Module.
26930b57cec5SDimitry Andric  *
26940b57cec5SDimitry Andric  * @see llvm::Module::alias_begin()
26950b57cec5SDimitry Andric  */
26960b57cec5SDimitry Andric LLVMValueRef LLVMGetFirstGlobalAlias(LLVMModuleRef M);
26970b57cec5SDimitry Andric 
26980b57cec5SDimitry Andric /**
26990b57cec5SDimitry Andric  * Obtain an iterator to the last GlobalAlias in a Module.
27000b57cec5SDimitry Andric  *
27010b57cec5SDimitry Andric  * @see llvm::Module::alias_end()
27020b57cec5SDimitry Andric  */
27030b57cec5SDimitry Andric LLVMValueRef LLVMGetLastGlobalAlias(LLVMModuleRef M);
27040b57cec5SDimitry Andric 
27050b57cec5SDimitry Andric /**
27060b57cec5SDimitry Andric  * Advance a GlobalAlias iterator to the next GlobalAlias.
27070b57cec5SDimitry Andric  *
27080b57cec5SDimitry Andric  * Returns NULL if the iterator was already at the end and there are no more
27090b57cec5SDimitry Andric  * global aliases.
27100b57cec5SDimitry Andric  */
27110b57cec5SDimitry Andric LLVMValueRef LLVMGetNextGlobalAlias(LLVMValueRef GA);
27120b57cec5SDimitry Andric 
27130b57cec5SDimitry Andric /**
27140b57cec5SDimitry Andric  * Decrement a GlobalAlias iterator to the previous GlobalAlias.
27150b57cec5SDimitry Andric  *
27160b57cec5SDimitry Andric  * Returns NULL if the iterator was already at the beginning and there are
27170b57cec5SDimitry Andric  * no previous global aliases.
27180b57cec5SDimitry Andric  */
27190b57cec5SDimitry Andric LLVMValueRef LLVMGetPreviousGlobalAlias(LLVMValueRef GA);
27200b57cec5SDimitry Andric 
27210b57cec5SDimitry Andric /**
27220b57cec5SDimitry Andric  * Retrieve the target value of an alias.
27230b57cec5SDimitry Andric  */
27240b57cec5SDimitry Andric LLVMValueRef LLVMAliasGetAliasee(LLVMValueRef Alias);
27250b57cec5SDimitry Andric 
27260b57cec5SDimitry Andric /**
27270b57cec5SDimitry Andric  * Set the target value of an alias.
27280b57cec5SDimitry Andric  */
27290b57cec5SDimitry Andric void LLVMAliasSetAliasee(LLVMValueRef Alias, LLVMValueRef Aliasee);
27300b57cec5SDimitry Andric 
27310b57cec5SDimitry Andric /**
27320b57cec5SDimitry Andric  * @}
27330b57cec5SDimitry Andric  */
27340b57cec5SDimitry Andric 
27350b57cec5SDimitry Andric /**
27360b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueFunction Function values
27370b57cec5SDimitry Andric  *
27380b57cec5SDimitry Andric  * Functions in this group operate on LLVMValueRef instances that
27390b57cec5SDimitry Andric  * correspond to llvm::Function instances.
27400b57cec5SDimitry Andric  *
27410b57cec5SDimitry Andric  * @see llvm::Function
27420b57cec5SDimitry Andric  *
27430b57cec5SDimitry Andric  * @{
27440b57cec5SDimitry Andric  */
27450b57cec5SDimitry Andric 
27460b57cec5SDimitry Andric /**
27470b57cec5SDimitry Andric  * Remove a function from its containing module and deletes it.
27480b57cec5SDimitry Andric  *
27490b57cec5SDimitry Andric  * @see llvm::Function::eraseFromParent()
27500b57cec5SDimitry Andric  */
27510b57cec5SDimitry Andric void LLVMDeleteFunction(LLVMValueRef Fn);
27520b57cec5SDimitry Andric 
27530b57cec5SDimitry Andric /**
27540b57cec5SDimitry Andric  * Check whether the given function has a personality function.
27550b57cec5SDimitry Andric  *
27560b57cec5SDimitry Andric  * @see llvm::Function::hasPersonalityFn()
27570b57cec5SDimitry Andric  */
27580b57cec5SDimitry Andric LLVMBool LLVMHasPersonalityFn(LLVMValueRef Fn);
27590b57cec5SDimitry Andric 
27600b57cec5SDimitry Andric /**
27610b57cec5SDimitry Andric  * Obtain the personality function attached to the function.
27620b57cec5SDimitry Andric  *
27630b57cec5SDimitry Andric  * @see llvm::Function::getPersonalityFn()
27640b57cec5SDimitry Andric  */
27650b57cec5SDimitry Andric LLVMValueRef LLVMGetPersonalityFn(LLVMValueRef Fn);
27660b57cec5SDimitry Andric 
27670b57cec5SDimitry Andric /**
27680b57cec5SDimitry Andric  * Set the personality function attached to the function.
27690b57cec5SDimitry Andric  *
27700b57cec5SDimitry Andric  * @see llvm::Function::setPersonalityFn()
27710b57cec5SDimitry Andric  */
27720b57cec5SDimitry Andric void LLVMSetPersonalityFn(LLVMValueRef Fn, LLVMValueRef PersonalityFn);
27730b57cec5SDimitry Andric 
27740b57cec5SDimitry Andric /**
27750b57cec5SDimitry Andric  * Obtain the intrinsic ID number which matches the given function name.
27760b57cec5SDimitry Andric  *
27770b57cec5SDimitry Andric  * @see llvm::Function::lookupIntrinsicID()
27780b57cec5SDimitry Andric  */
27790b57cec5SDimitry Andric unsigned LLVMLookupIntrinsicID(const char *Name, size_t NameLen);
27800b57cec5SDimitry Andric 
27810b57cec5SDimitry Andric /**
27820b57cec5SDimitry Andric  * Obtain the ID number from a function instance.
27830b57cec5SDimitry Andric  *
27840b57cec5SDimitry Andric  * @see llvm::Function::getIntrinsicID()
27850b57cec5SDimitry Andric  */
27860b57cec5SDimitry Andric unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
27870b57cec5SDimitry Andric 
27880b57cec5SDimitry Andric /**
27890b57cec5SDimitry Andric  * Create or insert the declaration of an intrinsic.  For overloaded intrinsics,
27900b57cec5SDimitry Andric  * parameter types must be provided to uniquely identify an overload.
27910b57cec5SDimitry Andric  *
27920b57cec5SDimitry Andric  * @see llvm::Intrinsic::getDeclaration()
27930b57cec5SDimitry Andric  */
27940b57cec5SDimitry Andric LLVMValueRef LLVMGetIntrinsicDeclaration(LLVMModuleRef Mod,
27950b57cec5SDimitry Andric                                          unsigned ID,
27960b57cec5SDimitry Andric                                          LLVMTypeRef *ParamTypes,
27970b57cec5SDimitry Andric                                          size_t ParamCount);
27980b57cec5SDimitry Andric 
27990b57cec5SDimitry Andric /**
28000b57cec5SDimitry Andric  * Retrieves the type of an intrinsic.  For overloaded intrinsics, parameter
28010b57cec5SDimitry Andric  * types must be provided to uniquely identify an overload.
28020b57cec5SDimitry Andric  *
28030b57cec5SDimitry Andric  * @see llvm::Intrinsic::getType()
28040b57cec5SDimitry Andric  */
28050b57cec5SDimitry Andric LLVMTypeRef LLVMIntrinsicGetType(LLVMContextRef Ctx, unsigned ID,
28060b57cec5SDimitry Andric                                  LLVMTypeRef *ParamTypes, size_t ParamCount);
28070b57cec5SDimitry Andric 
28080b57cec5SDimitry Andric /**
28090b57cec5SDimitry Andric  * Retrieves the name of an intrinsic.
28100b57cec5SDimitry Andric  *
28110b57cec5SDimitry Andric  * @see llvm::Intrinsic::getName()
28120b57cec5SDimitry Andric  */
28130b57cec5SDimitry Andric const char *LLVMIntrinsicGetName(unsigned ID, size_t *NameLength);
28140b57cec5SDimitry Andric 
2815fe6060f1SDimitry Andric /** Deprecated: Use LLVMIntrinsicCopyOverloadedName2 instead. */
2816fe6060f1SDimitry Andric const char *LLVMIntrinsicCopyOverloadedName(unsigned ID,
2817fe6060f1SDimitry Andric                                             LLVMTypeRef *ParamTypes,
2818fe6060f1SDimitry Andric                                             size_t ParamCount,
2819fe6060f1SDimitry Andric                                             size_t *NameLength);
2820fe6060f1SDimitry Andric 
28210b57cec5SDimitry Andric /**
28220b57cec5SDimitry Andric  * Copies the name of an overloaded intrinsic identified by a given list of
28230b57cec5SDimitry Andric  * parameter types.
28240b57cec5SDimitry Andric  *
28250b57cec5SDimitry Andric  * Unlike LLVMIntrinsicGetName, the caller is responsible for freeing the
28260b57cec5SDimitry Andric  * returned string.
28270b57cec5SDimitry Andric  *
2828fe6060f1SDimitry Andric  * This version also supports unnamed types.
2829fe6060f1SDimitry Andric  *
28300b57cec5SDimitry Andric  * @see llvm::Intrinsic::getName()
28310b57cec5SDimitry Andric  */
2832fe6060f1SDimitry Andric const char *LLVMIntrinsicCopyOverloadedName2(LLVMModuleRef Mod, unsigned ID,
28330b57cec5SDimitry Andric                                              LLVMTypeRef *ParamTypes,
28340b57cec5SDimitry Andric                                              size_t ParamCount,
28350b57cec5SDimitry Andric                                              size_t *NameLength);
28360b57cec5SDimitry Andric 
28370b57cec5SDimitry Andric /**
28380b57cec5SDimitry Andric  * Obtain if the intrinsic identified by the given ID is overloaded.
28390b57cec5SDimitry Andric  *
28400b57cec5SDimitry Andric  * @see llvm::Intrinsic::isOverloaded()
28410b57cec5SDimitry Andric  */
28420b57cec5SDimitry Andric LLVMBool LLVMIntrinsicIsOverloaded(unsigned ID);
28430b57cec5SDimitry Andric 
28440b57cec5SDimitry Andric /**
28450b57cec5SDimitry Andric  * Obtain the calling function of a function.
28460b57cec5SDimitry Andric  *
28470b57cec5SDimitry Andric  * The returned value corresponds to the LLVMCallConv enumeration.
28480b57cec5SDimitry Andric  *
28490b57cec5SDimitry Andric  * @see llvm::Function::getCallingConv()
28500b57cec5SDimitry Andric  */
28510b57cec5SDimitry Andric unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
28520b57cec5SDimitry Andric 
28530b57cec5SDimitry Andric /**
28540b57cec5SDimitry Andric  * Set the calling convention of a function.
28550b57cec5SDimitry Andric  *
28560b57cec5SDimitry Andric  * @see llvm::Function::setCallingConv()
28570b57cec5SDimitry Andric  *
28580b57cec5SDimitry Andric  * @param Fn Function to operate on
28590b57cec5SDimitry Andric  * @param CC LLVMCallConv to set calling convention to
28600b57cec5SDimitry Andric  */
28610b57cec5SDimitry Andric void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
28620b57cec5SDimitry Andric 
28630b57cec5SDimitry Andric /**
28640b57cec5SDimitry Andric  * Obtain the name of the garbage collector to use during code
28650b57cec5SDimitry Andric  * generation.
28660b57cec5SDimitry Andric  *
28670b57cec5SDimitry Andric  * @see llvm::Function::getGC()
28680b57cec5SDimitry Andric  */
28690b57cec5SDimitry Andric const char *LLVMGetGC(LLVMValueRef Fn);
28700b57cec5SDimitry Andric 
28710b57cec5SDimitry Andric /**
28720b57cec5SDimitry Andric  * Define the garbage collector to use during code generation.
28730b57cec5SDimitry Andric  *
28740b57cec5SDimitry Andric  * @see llvm::Function::setGC()
28750b57cec5SDimitry Andric  */
28760b57cec5SDimitry Andric void LLVMSetGC(LLVMValueRef Fn, const char *Name);
28770b57cec5SDimitry Andric 
28780b57cec5SDimitry Andric /**
2879*0fca6ea1SDimitry Andric  * Gets the prefix data associated with a function. Only valid on functions, and
2880*0fca6ea1SDimitry Andric  * only if LLVMHasPrefixData returns true.
2881*0fca6ea1SDimitry Andric  * See https://llvm.org/docs/LangRef.html#prefix-data
2882*0fca6ea1SDimitry Andric  */
2883*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetPrefixData(LLVMValueRef Fn);
2884*0fca6ea1SDimitry Andric 
2885*0fca6ea1SDimitry Andric /**
2886*0fca6ea1SDimitry Andric  * Check if a given function has prefix data. Only valid on functions.
2887*0fca6ea1SDimitry Andric  * See https://llvm.org/docs/LangRef.html#prefix-data
2888*0fca6ea1SDimitry Andric  */
2889*0fca6ea1SDimitry Andric LLVMBool LLVMHasPrefixData(LLVMValueRef Fn);
2890*0fca6ea1SDimitry Andric 
2891*0fca6ea1SDimitry Andric /**
2892*0fca6ea1SDimitry Andric  * Sets the prefix data for the function. Only valid on functions.
2893*0fca6ea1SDimitry Andric  * See https://llvm.org/docs/LangRef.html#prefix-data
2894*0fca6ea1SDimitry Andric  */
2895*0fca6ea1SDimitry Andric void LLVMSetPrefixData(LLVMValueRef Fn, LLVMValueRef prefixData);
2896*0fca6ea1SDimitry Andric 
2897*0fca6ea1SDimitry Andric /**
2898*0fca6ea1SDimitry Andric  * Gets the prologue data associated with a function. Only valid on functions,
2899*0fca6ea1SDimitry Andric  * and only if LLVMHasPrologueData returns true.
2900*0fca6ea1SDimitry Andric  * See https://llvm.org/docs/LangRef.html#prologue-data
2901*0fca6ea1SDimitry Andric  */
2902*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetPrologueData(LLVMValueRef Fn);
2903*0fca6ea1SDimitry Andric 
2904*0fca6ea1SDimitry Andric /**
2905*0fca6ea1SDimitry Andric  * Check if a given function has prologue data. Only valid on functions.
2906*0fca6ea1SDimitry Andric  * See https://llvm.org/docs/LangRef.html#prologue-data
2907*0fca6ea1SDimitry Andric  */
2908*0fca6ea1SDimitry Andric LLVMBool LLVMHasPrologueData(LLVMValueRef Fn);
2909*0fca6ea1SDimitry Andric 
2910*0fca6ea1SDimitry Andric /**
2911*0fca6ea1SDimitry Andric  * Sets the prologue data for the function. Only valid on functions.
2912*0fca6ea1SDimitry Andric  * See https://llvm.org/docs/LangRef.html#prologue-data
2913*0fca6ea1SDimitry Andric  */
2914*0fca6ea1SDimitry Andric void LLVMSetPrologueData(LLVMValueRef Fn, LLVMValueRef prologueData);
2915*0fca6ea1SDimitry Andric 
2916*0fca6ea1SDimitry Andric /**
29170b57cec5SDimitry Andric  * Add an attribute to a function.
29180b57cec5SDimitry Andric  *
29190b57cec5SDimitry Andric  * @see llvm::Function::addAttribute()
29200b57cec5SDimitry Andric  */
29210b57cec5SDimitry Andric void LLVMAddAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx,
29220b57cec5SDimitry Andric                              LLVMAttributeRef A);
29230b57cec5SDimitry Andric unsigned LLVMGetAttributeCountAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx);
29240b57cec5SDimitry Andric void LLVMGetAttributesAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx,
29250b57cec5SDimitry Andric                               LLVMAttributeRef *Attrs);
29260b57cec5SDimitry Andric LLVMAttributeRef LLVMGetEnumAttributeAtIndex(LLVMValueRef F,
29270b57cec5SDimitry Andric                                              LLVMAttributeIndex Idx,
29280b57cec5SDimitry Andric                                              unsigned KindID);
29290b57cec5SDimitry Andric LLVMAttributeRef LLVMGetStringAttributeAtIndex(LLVMValueRef F,
29300b57cec5SDimitry Andric                                                LLVMAttributeIndex Idx,
29310b57cec5SDimitry Andric                                                const char *K, unsigned KLen);
29320b57cec5SDimitry Andric void LLVMRemoveEnumAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx,
29330b57cec5SDimitry Andric                                     unsigned KindID);
29340b57cec5SDimitry Andric void LLVMRemoveStringAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx,
29350b57cec5SDimitry Andric                                       const char *K, unsigned KLen);
29360b57cec5SDimitry Andric 
29370b57cec5SDimitry Andric /**
29380b57cec5SDimitry Andric  * Add a target-dependent attribute to a function
29390b57cec5SDimitry Andric  * @see llvm::AttrBuilder::addAttribute()
29400b57cec5SDimitry Andric  */
29410b57cec5SDimitry Andric void LLVMAddTargetDependentFunctionAttr(LLVMValueRef Fn, const char *A,
29420b57cec5SDimitry Andric                                         const char *V);
29430b57cec5SDimitry Andric 
29440b57cec5SDimitry Andric /**
29450b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueFunctionParameters Function Parameters
29460b57cec5SDimitry Andric  *
29470b57cec5SDimitry Andric  * Functions in this group relate to arguments/parameters on functions.
29480b57cec5SDimitry Andric  *
29490b57cec5SDimitry Andric  * Functions in this group expect LLVMValueRef instances that correspond
29500b57cec5SDimitry Andric  * to llvm::Function instances.
29510b57cec5SDimitry Andric  *
29520b57cec5SDimitry Andric  * @{
29530b57cec5SDimitry Andric  */
29540b57cec5SDimitry Andric 
29550b57cec5SDimitry Andric /**
29560b57cec5SDimitry Andric  * Obtain the number of parameters in a function.
29570b57cec5SDimitry Andric  *
29580b57cec5SDimitry Andric  * @see llvm::Function::arg_size()
29590b57cec5SDimitry Andric  */
29600b57cec5SDimitry Andric unsigned LLVMCountParams(LLVMValueRef Fn);
29610b57cec5SDimitry Andric 
29620b57cec5SDimitry Andric /**
29630b57cec5SDimitry Andric  * Obtain the parameters in a function.
29640b57cec5SDimitry Andric  *
29650b57cec5SDimitry Andric  * The takes a pointer to a pre-allocated array of LLVMValueRef that is
29660b57cec5SDimitry Andric  * at least LLVMCountParams() long. This array will be filled with
29670b57cec5SDimitry Andric  * LLVMValueRef instances which correspond to the parameters the
29680b57cec5SDimitry Andric  * function receives. Each LLVMValueRef corresponds to a llvm::Argument
29690b57cec5SDimitry Andric  * instance.
29700b57cec5SDimitry Andric  *
29710b57cec5SDimitry Andric  * @see llvm::Function::arg_begin()
29720b57cec5SDimitry Andric  */
29730b57cec5SDimitry Andric void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
29740b57cec5SDimitry Andric 
29750b57cec5SDimitry Andric /**
29760b57cec5SDimitry Andric  * Obtain the parameter at the specified index.
29770b57cec5SDimitry Andric  *
29780b57cec5SDimitry Andric  * Parameters are indexed from 0.
29790b57cec5SDimitry Andric  *
29800b57cec5SDimitry Andric  * @see llvm::Function::arg_begin()
29810b57cec5SDimitry Andric  */
29820b57cec5SDimitry Andric LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
29830b57cec5SDimitry Andric 
29840b57cec5SDimitry Andric /**
29850b57cec5SDimitry Andric  * Obtain the function to which this argument belongs.
29860b57cec5SDimitry Andric  *
29870b57cec5SDimitry Andric  * Unlike other functions in this group, this one takes an LLVMValueRef
29880b57cec5SDimitry Andric  * that corresponds to a llvm::Attribute.
29890b57cec5SDimitry Andric  *
29900b57cec5SDimitry Andric  * The returned LLVMValueRef is the llvm::Function to which this
29910b57cec5SDimitry Andric  * argument belongs.
29920b57cec5SDimitry Andric  */
29930b57cec5SDimitry Andric LLVMValueRef LLVMGetParamParent(LLVMValueRef Inst);
29940b57cec5SDimitry Andric 
29950b57cec5SDimitry Andric /**
29960b57cec5SDimitry Andric  * Obtain the first parameter to a function.
29970b57cec5SDimitry Andric  *
29980b57cec5SDimitry Andric  * @see llvm::Function::arg_begin()
29990b57cec5SDimitry Andric  */
30000b57cec5SDimitry Andric LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn);
30010b57cec5SDimitry Andric 
30020b57cec5SDimitry Andric /**
30030b57cec5SDimitry Andric  * Obtain the last parameter to a function.
30040b57cec5SDimitry Andric  *
30050b57cec5SDimitry Andric  * @see llvm::Function::arg_end()
30060b57cec5SDimitry Andric  */
30070b57cec5SDimitry Andric LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn);
30080b57cec5SDimitry Andric 
30090b57cec5SDimitry Andric /**
30100b57cec5SDimitry Andric  * Obtain the next parameter to a function.
30110b57cec5SDimitry Andric  *
30120b57cec5SDimitry Andric  * This takes an LLVMValueRef obtained from LLVMGetFirstParam() (which is
30130b57cec5SDimitry Andric  * actually a wrapped iterator) and obtains the next parameter from the
30140b57cec5SDimitry Andric  * underlying iterator.
30150b57cec5SDimitry Andric  */
30160b57cec5SDimitry Andric LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg);
30170b57cec5SDimitry Andric 
30180b57cec5SDimitry Andric /**
30190b57cec5SDimitry Andric  * Obtain the previous parameter to a function.
30200b57cec5SDimitry Andric  *
30210b57cec5SDimitry Andric  * This is the opposite of LLVMGetNextParam().
30220b57cec5SDimitry Andric  */
30230b57cec5SDimitry Andric LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg);
30240b57cec5SDimitry Andric 
30250b57cec5SDimitry Andric /**
30260b57cec5SDimitry Andric  * Set the alignment for a function parameter.
30270b57cec5SDimitry Andric  *
30280b57cec5SDimitry Andric  * @see llvm::Argument::addAttr()
30290b57cec5SDimitry Andric  * @see llvm::AttrBuilder::addAlignmentAttr()
30300b57cec5SDimitry Andric  */
30310b57cec5SDimitry Andric void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned Align);
30320b57cec5SDimitry Andric 
30330b57cec5SDimitry Andric /**
30340b57cec5SDimitry Andric  * @}
30350b57cec5SDimitry Andric  */
30360b57cec5SDimitry Andric 
30370b57cec5SDimitry Andric /**
30380b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueGlobalIFunc IFuncs
30390b57cec5SDimitry Andric  *
30400b57cec5SDimitry Andric  * Functions in this group relate to indirect functions.
30410b57cec5SDimitry Andric  *
30420b57cec5SDimitry Andric  * Functions in this group expect LLVMValueRef instances that correspond
30430b57cec5SDimitry Andric  * to llvm::GlobalIFunc instances.
30440b57cec5SDimitry Andric  *
30450b57cec5SDimitry Andric  * @{
30460b57cec5SDimitry Andric  */
30470b57cec5SDimitry Andric 
30480b57cec5SDimitry Andric /**
30490b57cec5SDimitry Andric  * Add a global indirect function to a module under a specified name.
30500b57cec5SDimitry Andric  *
30510b57cec5SDimitry Andric  * @see llvm::GlobalIFunc::create()
30520b57cec5SDimitry Andric  */
30530b57cec5SDimitry Andric LLVMValueRef LLVMAddGlobalIFunc(LLVMModuleRef M,
30540b57cec5SDimitry Andric                                 const char *Name, size_t NameLen,
30550b57cec5SDimitry Andric                                 LLVMTypeRef Ty, unsigned AddrSpace,
30560b57cec5SDimitry Andric                                 LLVMValueRef Resolver);
30570b57cec5SDimitry Andric 
30580b57cec5SDimitry Andric /**
30590b57cec5SDimitry Andric  * Obtain a GlobalIFunc value from a Module by its name.
30600b57cec5SDimitry Andric  *
30610b57cec5SDimitry Andric  * The returned value corresponds to a llvm::GlobalIFunc value.
30620b57cec5SDimitry Andric  *
30630b57cec5SDimitry Andric  * @see llvm::Module::getNamedIFunc()
30640b57cec5SDimitry Andric  */
30650b57cec5SDimitry Andric LLVMValueRef LLVMGetNamedGlobalIFunc(LLVMModuleRef M,
30660b57cec5SDimitry Andric                                      const char *Name, size_t NameLen);
30670b57cec5SDimitry Andric 
30680b57cec5SDimitry Andric /**
30690b57cec5SDimitry Andric  * Obtain an iterator to the first GlobalIFunc in a Module.
30700b57cec5SDimitry Andric  *
30710b57cec5SDimitry Andric  * @see llvm::Module::ifunc_begin()
30720b57cec5SDimitry Andric  */
30730b57cec5SDimitry Andric LLVMValueRef LLVMGetFirstGlobalIFunc(LLVMModuleRef M);
30740b57cec5SDimitry Andric 
30750b57cec5SDimitry Andric /**
30760b57cec5SDimitry Andric  * Obtain an iterator to the last GlobalIFunc in a Module.
30770b57cec5SDimitry Andric  *
30780b57cec5SDimitry Andric  * @see llvm::Module::ifunc_end()
30790b57cec5SDimitry Andric  */
30800b57cec5SDimitry Andric LLVMValueRef LLVMGetLastGlobalIFunc(LLVMModuleRef M);
30810b57cec5SDimitry Andric 
30820b57cec5SDimitry Andric /**
30830b57cec5SDimitry Andric  * Advance a GlobalIFunc iterator to the next GlobalIFunc.
30840b57cec5SDimitry Andric  *
30850b57cec5SDimitry Andric  * Returns NULL if the iterator was already at the end and there are no more
30860b57cec5SDimitry Andric  * global aliases.
30870b57cec5SDimitry Andric  */
30880b57cec5SDimitry Andric LLVMValueRef LLVMGetNextGlobalIFunc(LLVMValueRef IFunc);
30890b57cec5SDimitry Andric 
30900b57cec5SDimitry Andric /**
30910b57cec5SDimitry Andric  * Decrement a GlobalIFunc iterator to the previous GlobalIFunc.
30920b57cec5SDimitry Andric  *
30930b57cec5SDimitry Andric  * Returns NULL if the iterator was already at the beginning and there are
30940b57cec5SDimitry Andric  * no previous global aliases.
30950b57cec5SDimitry Andric  */
30960b57cec5SDimitry Andric LLVMValueRef LLVMGetPreviousGlobalIFunc(LLVMValueRef IFunc);
30970b57cec5SDimitry Andric 
30980b57cec5SDimitry Andric /**
30990b57cec5SDimitry Andric  * Retrieves the resolver function associated with this indirect function, or
31000b57cec5SDimitry Andric  * NULL if it doesn't not exist.
31010b57cec5SDimitry Andric  *
31020b57cec5SDimitry Andric  * @see llvm::GlobalIFunc::getResolver()
31030b57cec5SDimitry Andric  */
31040b57cec5SDimitry Andric LLVMValueRef LLVMGetGlobalIFuncResolver(LLVMValueRef IFunc);
31050b57cec5SDimitry Andric 
31060b57cec5SDimitry Andric /**
31070b57cec5SDimitry Andric  * Sets the resolver function associated with this indirect function.
31080b57cec5SDimitry Andric  *
31090b57cec5SDimitry Andric  * @see llvm::GlobalIFunc::setResolver()
31100b57cec5SDimitry Andric  */
31110b57cec5SDimitry Andric void LLVMSetGlobalIFuncResolver(LLVMValueRef IFunc, LLVMValueRef Resolver);
31120b57cec5SDimitry Andric 
31130b57cec5SDimitry Andric /**
31140b57cec5SDimitry Andric  * Remove a global indirect function from its parent module and delete it.
31150b57cec5SDimitry Andric  *
31160b57cec5SDimitry Andric  * @see llvm::GlobalIFunc::eraseFromParent()
31170b57cec5SDimitry Andric  */
31180b57cec5SDimitry Andric void LLVMEraseGlobalIFunc(LLVMValueRef IFunc);
31190b57cec5SDimitry Andric 
31200b57cec5SDimitry Andric /**
31210b57cec5SDimitry Andric  * Remove a global indirect function from its parent module.
31220b57cec5SDimitry Andric  *
31230b57cec5SDimitry Andric  * This unlinks the global indirect function from its containing module but
31240b57cec5SDimitry Andric  * keeps it alive.
31250b57cec5SDimitry Andric  *
31260b57cec5SDimitry Andric  * @see llvm::GlobalIFunc::removeFromParent()
31270b57cec5SDimitry Andric  */
31280b57cec5SDimitry Andric void LLVMRemoveGlobalIFunc(LLVMValueRef IFunc);
31290b57cec5SDimitry Andric 
31300b57cec5SDimitry Andric /**
31310b57cec5SDimitry Andric  * @}
31320b57cec5SDimitry Andric  */
31330b57cec5SDimitry Andric 
31340b57cec5SDimitry Andric /**
31350b57cec5SDimitry Andric  * @}
31360b57cec5SDimitry Andric  */
31370b57cec5SDimitry Andric 
31380b57cec5SDimitry Andric /**
31390b57cec5SDimitry Andric  * @}
31400b57cec5SDimitry Andric  */
31410b57cec5SDimitry Andric 
31420b57cec5SDimitry Andric /**
31430b57cec5SDimitry Andric  * @}
31440b57cec5SDimitry Andric  */
31450b57cec5SDimitry Andric 
31460b57cec5SDimitry Andric /**
31470b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueMetadata Metadata
31480b57cec5SDimitry Andric  *
31490b57cec5SDimitry Andric  * @{
31500b57cec5SDimitry Andric  */
31510b57cec5SDimitry Andric 
31520b57cec5SDimitry Andric /**
31530b57cec5SDimitry Andric  * Create an MDString value from a given string value.
31540b57cec5SDimitry Andric  *
31550b57cec5SDimitry Andric  * The MDString value does not take ownership of the given string, it remains
31560b57cec5SDimitry Andric  * the responsibility of the caller to free it.
31570b57cec5SDimitry Andric  *
31580b57cec5SDimitry Andric  * @see llvm::MDString::get()
31590b57cec5SDimitry Andric  */
31600b57cec5SDimitry Andric LLVMMetadataRef LLVMMDStringInContext2(LLVMContextRef C, const char *Str,
31610b57cec5SDimitry Andric                                        size_t SLen);
31620b57cec5SDimitry Andric 
31630b57cec5SDimitry Andric /**
31640b57cec5SDimitry Andric  * Create an MDNode value with the given array of operands.
31650b57cec5SDimitry Andric  *
31660b57cec5SDimitry Andric  * @see llvm::MDNode::get()
31670b57cec5SDimitry Andric  */
31680b57cec5SDimitry Andric LLVMMetadataRef LLVMMDNodeInContext2(LLVMContextRef C, LLVMMetadataRef *MDs,
31690b57cec5SDimitry Andric                                      size_t Count);
31700b57cec5SDimitry Andric 
31710b57cec5SDimitry Andric /**
31720b57cec5SDimitry Andric  * Obtain a Metadata as a Value.
31730b57cec5SDimitry Andric  */
31740b57cec5SDimitry Andric LLVMValueRef LLVMMetadataAsValue(LLVMContextRef C, LLVMMetadataRef MD);
31750b57cec5SDimitry Andric 
31760b57cec5SDimitry Andric /**
31770b57cec5SDimitry Andric  * Obtain a Value as a Metadata.
31780b57cec5SDimitry Andric  */
31790b57cec5SDimitry Andric LLVMMetadataRef LLVMValueAsMetadata(LLVMValueRef Val);
31800b57cec5SDimitry Andric 
31810b57cec5SDimitry Andric /**
31820b57cec5SDimitry Andric  * Obtain the underlying string from a MDString value.
31830b57cec5SDimitry Andric  *
31840b57cec5SDimitry Andric  * @param V Instance to obtain string from.
31850b57cec5SDimitry Andric  * @param Length Memory address which will hold length of returned string.
31860b57cec5SDimitry Andric  * @return String data in MDString.
31870b57cec5SDimitry Andric  */
31880b57cec5SDimitry Andric const char *LLVMGetMDString(LLVMValueRef V, unsigned *Length);
31890b57cec5SDimitry Andric 
31900b57cec5SDimitry Andric /**
31910b57cec5SDimitry Andric  * Obtain the number of operands from an MDNode value.
31920b57cec5SDimitry Andric  *
31930b57cec5SDimitry Andric  * @param V MDNode to get number of operands from.
31940b57cec5SDimitry Andric  * @return Number of operands of the MDNode.
31950b57cec5SDimitry Andric  */
31960b57cec5SDimitry Andric unsigned LLVMGetMDNodeNumOperands(LLVMValueRef V);
31970b57cec5SDimitry Andric 
31980b57cec5SDimitry Andric /**
31990b57cec5SDimitry Andric  * Obtain the given MDNode's operands.
32000b57cec5SDimitry Andric  *
32010b57cec5SDimitry Andric  * The passed LLVMValueRef pointer should point to enough memory to hold all of
32020b57cec5SDimitry Andric  * the operands of the given MDNode (see LLVMGetMDNodeNumOperands) as
32030b57cec5SDimitry Andric  * LLVMValueRefs. This memory will be populated with the LLVMValueRefs of the
32040b57cec5SDimitry Andric  * MDNode's operands.
32050b57cec5SDimitry Andric  *
32060b57cec5SDimitry Andric  * @param V MDNode to get the operands from.
32070b57cec5SDimitry Andric  * @param Dest Destination array for operands.
32080b57cec5SDimitry Andric  */
32090b57cec5SDimitry Andric void LLVMGetMDNodeOperands(LLVMValueRef V, LLVMValueRef *Dest);
32100b57cec5SDimitry Andric 
321106c3fb27SDimitry Andric /**
321206c3fb27SDimitry Andric  * Replace an operand at a specific index in a llvm::MDNode value.
321306c3fb27SDimitry Andric  *
321406c3fb27SDimitry Andric  * @see llvm::MDNode::replaceOperandWith()
321506c3fb27SDimitry Andric  */
321606c3fb27SDimitry Andric void LLVMReplaceMDNodeOperandWith(LLVMValueRef V, unsigned Index,
321706c3fb27SDimitry Andric                                   LLVMMetadataRef Replacement);
321806c3fb27SDimitry Andric 
32190b57cec5SDimitry Andric /** Deprecated: Use LLVMMDStringInContext2 instead. */
32200b57cec5SDimitry Andric LLVMValueRef LLVMMDStringInContext(LLVMContextRef C, const char *Str,
32210b57cec5SDimitry Andric                                    unsigned SLen);
32220b57cec5SDimitry Andric /** Deprecated: Use LLVMMDStringInContext2 instead. */
32230b57cec5SDimitry Andric LLVMValueRef LLVMMDString(const char *Str, unsigned SLen);
32240b57cec5SDimitry Andric /** Deprecated: Use LLVMMDNodeInContext2 instead. */
32250b57cec5SDimitry Andric LLVMValueRef LLVMMDNodeInContext(LLVMContextRef C, LLVMValueRef *Vals,
32260b57cec5SDimitry Andric                                  unsigned Count);
32270b57cec5SDimitry Andric /** Deprecated: Use LLVMMDNodeInContext2 instead. */
32280b57cec5SDimitry Andric LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count);
32290b57cec5SDimitry Andric 
32300b57cec5SDimitry Andric /**
32310b57cec5SDimitry Andric  * @}
32320b57cec5SDimitry Andric  */
32330b57cec5SDimitry Andric 
32340b57cec5SDimitry Andric /**
32355f757f3fSDimitry Andric  * @defgroup LLVMCCoreOperandBundle Operand Bundles
32365f757f3fSDimitry Andric  *
32375f757f3fSDimitry Andric  * Functions in this group operate on LLVMOperandBundleRef instances that
32385f757f3fSDimitry Andric  * correspond to llvm::OperandBundleDef instances.
32395f757f3fSDimitry Andric  *
32405f757f3fSDimitry Andric  * @see llvm::OperandBundleDef
32415f757f3fSDimitry Andric  *
32425f757f3fSDimitry Andric  * @{
32435f757f3fSDimitry Andric  */
32445f757f3fSDimitry Andric 
32455f757f3fSDimitry Andric /**
32465f757f3fSDimitry Andric  * Create a new operand bundle.
32475f757f3fSDimitry Andric  *
32485f757f3fSDimitry Andric  * Every invocation should be paired with LLVMDisposeOperandBundle() or memory
32495f757f3fSDimitry Andric  * will be leaked.
32505f757f3fSDimitry Andric  *
32515f757f3fSDimitry Andric  * @param Tag Tag name of the operand bundle
32525f757f3fSDimitry Andric  * @param TagLen Length of Tag
32535f757f3fSDimitry Andric  * @param Args Memory address of an array of bundle operands
32545f757f3fSDimitry Andric  * @param NumArgs Length of Args
32555f757f3fSDimitry Andric  */
32565f757f3fSDimitry Andric LLVMOperandBundleRef LLVMCreateOperandBundle(const char *Tag, size_t TagLen,
32575f757f3fSDimitry Andric                                              LLVMValueRef *Args,
32585f757f3fSDimitry Andric                                              unsigned NumArgs);
32595f757f3fSDimitry Andric 
32605f757f3fSDimitry Andric /**
32615f757f3fSDimitry Andric  * Destroy an operand bundle.
32625f757f3fSDimitry Andric  *
32635f757f3fSDimitry Andric  * This must be called for every created operand bundle or memory will be
32645f757f3fSDimitry Andric  * leaked.
32655f757f3fSDimitry Andric  */
32665f757f3fSDimitry Andric void LLVMDisposeOperandBundle(LLVMOperandBundleRef Bundle);
32675f757f3fSDimitry Andric 
32685f757f3fSDimitry Andric /**
32695f757f3fSDimitry Andric  * Obtain the tag of an operand bundle as a string.
32705f757f3fSDimitry Andric  *
32715f757f3fSDimitry Andric  * @param Bundle Operand bundle to obtain tag of.
32725f757f3fSDimitry Andric  * @param Len Out parameter which holds the length of the returned string.
32735f757f3fSDimitry Andric  * @return The tag name of Bundle.
32745f757f3fSDimitry Andric  * @see OperandBundleDef::getTag()
32755f757f3fSDimitry Andric  */
32765f757f3fSDimitry Andric const char *LLVMGetOperandBundleTag(LLVMOperandBundleRef Bundle, size_t *Len);
32775f757f3fSDimitry Andric 
32785f757f3fSDimitry Andric /**
32795f757f3fSDimitry Andric  * Obtain the number of operands for an operand bundle.
32805f757f3fSDimitry Andric  *
32815f757f3fSDimitry Andric  * @param Bundle Operand bundle to obtain operand count of.
32825f757f3fSDimitry Andric  * @return The number of operands.
32835f757f3fSDimitry Andric  * @see OperandBundleDef::input_size()
32845f757f3fSDimitry Andric  */
32855f757f3fSDimitry Andric unsigned LLVMGetNumOperandBundleArgs(LLVMOperandBundleRef Bundle);
32865f757f3fSDimitry Andric 
32875f757f3fSDimitry Andric /**
32885f757f3fSDimitry Andric  * Obtain the operand for an operand bundle at the given index.
32895f757f3fSDimitry Andric  *
32905f757f3fSDimitry Andric  * @param Bundle Operand bundle to obtain operand of.
32915f757f3fSDimitry Andric  * @param Index An operand index, must be less than
32925f757f3fSDimitry Andric  * LLVMGetNumOperandBundleArgs().
32935f757f3fSDimitry Andric  * @return The operand.
32945f757f3fSDimitry Andric  */
32955f757f3fSDimitry Andric LLVMValueRef LLVMGetOperandBundleArgAtIndex(LLVMOperandBundleRef Bundle,
32965f757f3fSDimitry Andric                                             unsigned Index);
32975f757f3fSDimitry Andric 
32985f757f3fSDimitry Andric /**
32995f757f3fSDimitry Andric  * @}
33005f757f3fSDimitry Andric  */
33015f757f3fSDimitry Andric 
33025f757f3fSDimitry Andric /**
33030b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueBasicBlock Basic Block
33040b57cec5SDimitry Andric  *
33050b57cec5SDimitry Andric  * A basic block represents a single entry single exit section of code.
33060b57cec5SDimitry Andric  * Basic blocks contain a list of instructions which form the body of
33070b57cec5SDimitry Andric  * the block.
33080b57cec5SDimitry Andric  *
33090b57cec5SDimitry Andric  * Basic blocks belong to functions. They have the type of label.
33100b57cec5SDimitry Andric  *
33110b57cec5SDimitry Andric  * Basic blocks are themselves values. However, the C API models them as
33120b57cec5SDimitry Andric  * LLVMBasicBlockRef.
33130b57cec5SDimitry Andric  *
33140b57cec5SDimitry Andric  * @see llvm::BasicBlock
33150b57cec5SDimitry Andric  *
33160b57cec5SDimitry Andric  * @{
33170b57cec5SDimitry Andric  */
33180b57cec5SDimitry Andric 
33190b57cec5SDimitry Andric /**
33200b57cec5SDimitry Andric  * Convert a basic block instance to a value type.
33210b57cec5SDimitry Andric  */
33220b57cec5SDimitry Andric LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB);
33230b57cec5SDimitry Andric 
33240b57cec5SDimitry Andric /**
33250b57cec5SDimitry Andric  * Determine whether an LLVMValueRef is itself a basic block.
33260b57cec5SDimitry Andric  */
33270b57cec5SDimitry Andric LLVMBool LLVMValueIsBasicBlock(LLVMValueRef Val);
33280b57cec5SDimitry Andric 
33290b57cec5SDimitry Andric /**
33300b57cec5SDimitry Andric  * Convert an LLVMValueRef to an LLVMBasicBlockRef instance.
33310b57cec5SDimitry Andric  */
33320b57cec5SDimitry Andric LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
33330b57cec5SDimitry Andric 
33340b57cec5SDimitry Andric /**
33350b57cec5SDimitry Andric  * Obtain the string name of a basic block.
33360b57cec5SDimitry Andric  */
33370b57cec5SDimitry Andric const char *LLVMGetBasicBlockName(LLVMBasicBlockRef BB);
33380b57cec5SDimitry Andric 
33390b57cec5SDimitry Andric /**
33400b57cec5SDimitry Andric  * Obtain the function to which a basic block belongs.
33410b57cec5SDimitry Andric  *
33420b57cec5SDimitry Andric  * @see llvm::BasicBlock::getParent()
33430b57cec5SDimitry Andric  */
33440b57cec5SDimitry Andric LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB);
33450b57cec5SDimitry Andric 
33460b57cec5SDimitry Andric /**
33470b57cec5SDimitry Andric  * Obtain the terminator instruction for a basic block.
33480b57cec5SDimitry Andric  *
33490b57cec5SDimitry Andric  * If the basic block does not have a terminator (it is not well-formed
33500b57cec5SDimitry Andric  * if it doesn't), then NULL is returned.
33510b57cec5SDimitry Andric  *
33520b57cec5SDimitry Andric  * The returned LLVMValueRef corresponds to an llvm::Instruction.
33530b57cec5SDimitry Andric  *
33540b57cec5SDimitry Andric  * @see llvm::BasicBlock::getTerminator()
33550b57cec5SDimitry Andric  */
33560b57cec5SDimitry Andric LLVMValueRef LLVMGetBasicBlockTerminator(LLVMBasicBlockRef BB);
33570b57cec5SDimitry Andric 
33580b57cec5SDimitry Andric /**
33590b57cec5SDimitry Andric  * Obtain the number of basic blocks in a function.
33600b57cec5SDimitry Andric  *
33610b57cec5SDimitry Andric  * @param Fn Function value to operate on.
33620b57cec5SDimitry Andric  */
33630b57cec5SDimitry Andric unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
33640b57cec5SDimitry Andric 
33650b57cec5SDimitry Andric /**
33660b57cec5SDimitry Andric  * Obtain all of the basic blocks in a function.
33670b57cec5SDimitry Andric  *
33680b57cec5SDimitry Andric  * This operates on a function value. The BasicBlocks parameter is a
33690b57cec5SDimitry Andric  * pointer to a pre-allocated array of LLVMBasicBlockRef of at least
33700b57cec5SDimitry Andric  * LLVMCountBasicBlocks() in length. This array is populated with
33710b57cec5SDimitry Andric  * LLVMBasicBlockRef instances.
33720b57cec5SDimitry Andric  */
33730b57cec5SDimitry Andric void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
33740b57cec5SDimitry Andric 
33750b57cec5SDimitry Andric /**
33760b57cec5SDimitry Andric  * Obtain the first basic block in a function.
33770b57cec5SDimitry Andric  *
33780b57cec5SDimitry Andric  * The returned basic block can be used as an iterator. You will likely
33790b57cec5SDimitry Andric  * eventually call into LLVMGetNextBasicBlock() with it.
33800b57cec5SDimitry Andric  *
33810b57cec5SDimitry Andric  * @see llvm::Function::begin()
33820b57cec5SDimitry Andric  */
33830b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn);
33840b57cec5SDimitry Andric 
33850b57cec5SDimitry Andric /**
33860b57cec5SDimitry Andric  * Obtain the last basic block in a function.
33870b57cec5SDimitry Andric  *
33880b57cec5SDimitry Andric  * @see llvm::Function::end()
33890b57cec5SDimitry Andric  */
33900b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn);
33910b57cec5SDimitry Andric 
33920b57cec5SDimitry Andric /**
33930b57cec5SDimitry Andric  * Advance a basic block iterator.
33940b57cec5SDimitry Andric  */
33950b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB);
33960b57cec5SDimitry Andric 
33970b57cec5SDimitry Andric /**
33980b57cec5SDimitry Andric  * Go backwards in a basic block iterator.
33990b57cec5SDimitry Andric  */
34000b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB);
34010b57cec5SDimitry Andric 
34020b57cec5SDimitry Andric /**
34030b57cec5SDimitry Andric  * Obtain the basic block that corresponds to the entry point of a
34040b57cec5SDimitry Andric  * function.
34050b57cec5SDimitry Andric  *
34060b57cec5SDimitry Andric  * @see llvm::Function::getEntryBlock()
34070b57cec5SDimitry Andric  */
34080b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
34090b57cec5SDimitry Andric 
34100b57cec5SDimitry Andric /**
34110b57cec5SDimitry Andric  * Insert the given basic block after the insertion point of the given builder.
34120b57cec5SDimitry Andric  *
34130b57cec5SDimitry Andric  * The insertion point must be valid.
34140b57cec5SDimitry Andric  *
34150b57cec5SDimitry Andric  * @see llvm::Function::BasicBlockListType::insertAfter()
34160b57cec5SDimitry Andric  */
34170b57cec5SDimitry Andric void LLVMInsertExistingBasicBlockAfterInsertBlock(LLVMBuilderRef Builder,
34180b57cec5SDimitry Andric                                                   LLVMBasicBlockRef BB);
34190b57cec5SDimitry Andric 
34200b57cec5SDimitry Andric /**
34210b57cec5SDimitry Andric  * Append the given basic block to the basic block list of the given function.
34220b57cec5SDimitry Andric  *
34230b57cec5SDimitry Andric  * @see llvm::Function::BasicBlockListType::push_back()
34240b57cec5SDimitry Andric  */
34250b57cec5SDimitry Andric void LLVMAppendExistingBasicBlock(LLVMValueRef Fn,
34260b57cec5SDimitry Andric                                   LLVMBasicBlockRef BB);
34270b57cec5SDimitry Andric 
34280b57cec5SDimitry Andric /**
34290b57cec5SDimitry Andric  * Create a new basic block without inserting it into a function.
34300b57cec5SDimitry Andric  *
34310b57cec5SDimitry Andric  * @see llvm::BasicBlock::Create()
34320b57cec5SDimitry Andric  */
34330b57cec5SDimitry Andric LLVMBasicBlockRef LLVMCreateBasicBlockInContext(LLVMContextRef C,
34340b57cec5SDimitry Andric                                                 const char *Name);
34350b57cec5SDimitry Andric 
34360b57cec5SDimitry Andric /**
34370b57cec5SDimitry Andric  * Append a basic block to the end of a function.
34380b57cec5SDimitry Andric  *
34390b57cec5SDimitry Andric  * @see llvm::BasicBlock::Create()
34400b57cec5SDimitry Andric  */
34410b57cec5SDimitry Andric LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
34420b57cec5SDimitry Andric                                                 LLVMValueRef Fn,
34430b57cec5SDimitry Andric                                                 const char *Name);
34440b57cec5SDimitry Andric 
34450b57cec5SDimitry Andric /**
34460b57cec5SDimitry Andric  * Append a basic block to the end of a function using the global
34470b57cec5SDimitry Andric  * context.
34480b57cec5SDimitry Andric  *
34490b57cec5SDimitry Andric  * @see llvm::BasicBlock::Create()
34500b57cec5SDimitry Andric  */
34510b57cec5SDimitry Andric LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
34520b57cec5SDimitry Andric 
34530b57cec5SDimitry Andric /**
34540b57cec5SDimitry Andric  * Insert a basic block in a function before another basic block.
34550b57cec5SDimitry Andric  *
34560b57cec5SDimitry Andric  * The function to add to is determined by the function of the
34570b57cec5SDimitry Andric  * passed basic block.
34580b57cec5SDimitry Andric  *
34590b57cec5SDimitry Andric  * @see llvm::BasicBlock::Create()
34600b57cec5SDimitry Andric  */
34610b57cec5SDimitry Andric LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
34620b57cec5SDimitry Andric                                                 LLVMBasicBlockRef BB,
34630b57cec5SDimitry Andric                                                 const char *Name);
34640b57cec5SDimitry Andric 
34650b57cec5SDimitry Andric /**
34660b57cec5SDimitry Andric  * Insert a basic block in a function using the global context.
34670b57cec5SDimitry Andric  *
34680b57cec5SDimitry Andric  * @see llvm::BasicBlock::Create()
34690b57cec5SDimitry Andric  */
34700b57cec5SDimitry Andric LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
34710b57cec5SDimitry Andric                                        const char *Name);
34720b57cec5SDimitry Andric 
34730b57cec5SDimitry Andric /**
34740b57cec5SDimitry Andric  * Remove a basic block from a function and delete it.
34750b57cec5SDimitry Andric  *
34760b57cec5SDimitry Andric  * This deletes the basic block from its containing function and deletes
34770b57cec5SDimitry Andric  * the basic block itself.
34780b57cec5SDimitry Andric  *
34790b57cec5SDimitry Andric  * @see llvm::BasicBlock::eraseFromParent()
34800b57cec5SDimitry Andric  */
34810b57cec5SDimitry Andric void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
34820b57cec5SDimitry Andric 
34830b57cec5SDimitry Andric /**
34840b57cec5SDimitry Andric  * Remove a basic block from a function.
34850b57cec5SDimitry Andric  *
34860b57cec5SDimitry Andric  * This deletes the basic block from its containing function but keep
34870b57cec5SDimitry Andric  * the basic block alive.
34880b57cec5SDimitry Andric  *
34890b57cec5SDimitry Andric  * @see llvm::BasicBlock::removeFromParent()
34900b57cec5SDimitry Andric  */
34910b57cec5SDimitry Andric void LLVMRemoveBasicBlockFromParent(LLVMBasicBlockRef BB);
34920b57cec5SDimitry Andric 
34930b57cec5SDimitry Andric /**
34940b57cec5SDimitry Andric  * Move a basic block to before another one.
34950b57cec5SDimitry Andric  *
34960b57cec5SDimitry Andric  * @see llvm::BasicBlock::moveBefore()
34970b57cec5SDimitry Andric  */
34980b57cec5SDimitry Andric void LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos);
34990b57cec5SDimitry Andric 
35000b57cec5SDimitry Andric /**
35010b57cec5SDimitry Andric  * Move a basic block to after another one.
35020b57cec5SDimitry Andric  *
35030b57cec5SDimitry Andric  * @see llvm::BasicBlock::moveAfter()
35040b57cec5SDimitry Andric  */
35050b57cec5SDimitry Andric void LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos);
35060b57cec5SDimitry Andric 
35070b57cec5SDimitry Andric /**
35080b57cec5SDimitry Andric  * Obtain the first instruction in a basic block.
35090b57cec5SDimitry Andric  *
35100b57cec5SDimitry Andric  * The returned LLVMValueRef corresponds to a llvm::Instruction
35110b57cec5SDimitry Andric  * instance.
35120b57cec5SDimitry Andric  */
35130b57cec5SDimitry Andric LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB);
35140b57cec5SDimitry Andric 
35150b57cec5SDimitry Andric /**
35160b57cec5SDimitry Andric  * Obtain the last instruction in a basic block.
35170b57cec5SDimitry Andric  *
35180b57cec5SDimitry Andric  * The returned LLVMValueRef corresponds to an LLVM:Instruction.
35190b57cec5SDimitry Andric  */
35200b57cec5SDimitry Andric LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB);
35210b57cec5SDimitry Andric 
35220b57cec5SDimitry Andric /**
35230b57cec5SDimitry Andric  * @}
35240b57cec5SDimitry Andric  */
35250b57cec5SDimitry Andric 
35260b57cec5SDimitry Andric /**
35270b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueInstruction Instructions
35280b57cec5SDimitry Andric  *
35290b57cec5SDimitry Andric  * Functions in this group relate to the inspection and manipulation of
35300b57cec5SDimitry Andric  * individual instructions.
35310b57cec5SDimitry Andric  *
35320b57cec5SDimitry Andric  * In the C++ API, an instruction is modeled by llvm::Instruction. This
35330b57cec5SDimitry Andric  * class has a large number of descendents. llvm::Instruction is a
35340b57cec5SDimitry Andric  * llvm::Value and in the C API, instructions are modeled by
35350b57cec5SDimitry Andric  * LLVMValueRef.
35360b57cec5SDimitry Andric  *
35370b57cec5SDimitry Andric  * This group also contains sub-groups which operate on specific
35380b57cec5SDimitry Andric  * llvm::Instruction types, e.g. llvm::CallInst.
35390b57cec5SDimitry Andric  *
35400b57cec5SDimitry Andric  * @{
35410b57cec5SDimitry Andric  */
35420b57cec5SDimitry Andric 
35430b57cec5SDimitry Andric /**
35440b57cec5SDimitry Andric  * Determine whether an instruction has any metadata attached.
35450b57cec5SDimitry Andric  */
35460b57cec5SDimitry Andric int LLVMHasMetadata(LLVMValueRef Val);
35470b57cec5SDimitry Andric 
35480b57cec5SDimitry Andric /**
35490b57cec5SDimitry Andric  * Return metadata associated with an instruction value.
35500b57cec5SDimitry Andric  */
35510b57cec5SDimitry Andric LLVMValueRef LLVMGetMetadata(LLVMValueRef Val, unsigned KindID);
35520b57cec5SDimitry Andric 
35530b57cec5SDimitry Andric /**
35540b57cec5SDimitry Andric  * Set metadata associated with an instruction value.
35550b57cec5SDimitry Andric  */
35560b57cec5SDimitry Andric void LLVMSetMetadata(LLVMValueRef Val, unsigned KindID, LLVMValueRef Node);
35570b57cec5SDimitry Andric 
35580b57cec5SDimitry Andric /**
35590b57cec5SDimitry Andric  * Returns the metadata associated with an instruction value, but filters out
35600b57cec5SDimitry Andric  * all the debug locations.
35610b57cec5SDimitry Andric  *
35620b57cec5SDimitry Andric  * @see llvm::Instruction::getAllMetadataOtherThanDebugLoc()
35630b57cec5SDimitry Andric  */
35640b57cec5SDimitry Andric LLVMValueMetadataEntry *
35650b57cec5SDimitry Andric LLVMInstructionGetAllMetadataOtherThanDebugLoc(LLVMValueRef Instr,
35660b57cec5SDimitry Andric                                                size_t *NumEntries);
35670b57cec5SDimitry Andric 
35680b57cec5SDimitry Andric /**
35690b57cec5SDimitry Andric  * Obtain the basic block to which an instruction belongs.
35700b57cec5SDimitry Andric  *
35710b57cec5SDimitry Andric  * @see llvm::Instruction::getParent()
35720b57cec5SDimitry Andric  */
35730b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst);
35740b57cec5SDimitry Andric 
35750b57cec5SDimitry Andric /**
35760b57cec5SDimitry Andric  * Obtain the instruction that occurs after the one specified.
35770b57cec5SDimitry Andric  *
35780b57cec5SDimitry Andric  * The next instruction will be from the same basic block.
35790b57cec5SDimitry Andric  *
35800b57cec5SDimitry Andric  * If this is the last instruction in a basic block, NULL will be
35810b57cec5SDimitry Andric  * returned.
35820b57cec5SDimitry Andric  */
35830b57cec5SDimitry Andric LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
35840b57cec5SDimitry Andric 
35850b57cec5SDimitry Andric /**
35860b57cec5SDimitry Andric  * Obtain the instruction that occurred before this one.
35870b57cec5SDimitry Andric  *
35880b57cec5SDimitry Andric  * If the instruction is the first instruction in a basic block, NULL
35890b57cec5SDimitry Andric  * will be returned.
35900b57cec5SDimitry Andric  */
35910b57cec5SDimitry Andric LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
35920b57cec5SDimitry Andric 
35930b57cec5SDimitry Andric /**
3594753f127fSDimitry Andric  * Remove an instruction.
35950b57cec5SDimitry Andric  *
35960b57cec5SDimitry Andric  * The instruction specified is removed from its containing building
35970b57cec5SDimitry Andric  * block but is kept alive.
35980b57cec5SDimitry Andric  *
35990b57cec5SDimitry Andric  * @see llvm::Instruction::removeFromParent()
36000b57cec5SDimitry Andric  */
36010b57cec5SDimitry Andric void LLVMInstructionRemoveFromParent(LLVMValueRef Inst);
36020b57cec5SDimitry Andric 
36030b57cec5SDimitry Andric /**
36040b57cec5SDimitry Andric  * Remove and delete an instruction.
36050b57cec5SDimitry Andric  *
36060b57cec5SDimitry Andric  * The instruction specified is removed from its containing building
36070b57cec5SDimitry Andric  * block and then deleted.
36080b57cec5SDimitry Andric  *
36090b57cec5SDimitry Andric  * @see llvm::Instruction::eraseFromParent()
36100b57cec5SDimitry Andric  */
36110b57cec5SDimitry Andric void LLVMInstructionEraseFromParent(LLVMValueRef Inst);
36120b57cec5SDimitry Andric 
36130b57cec5SDimitry Andric /**
3614753f127fSDimitry Andric  * Delete an instruction.
3615753f127fSDimitry Andric  *
3616753f127fSDimitry Andric  * The instruction specified is deleted. It must have previously been
3617753f127fSDimitry Andric  * removed from its containing building block.
3618753f127fSDimitry Andric  *
3619753f127fSDimitry Andric  * @see llvm::Value::deleteValue()
3620753f127fSDimitry Andric  */
3621753f127fSDimitry Andric void LLVMDeleteInstruction(LLVMValueRef Inst);
3622753f127fSDimitry Andric 
3623753f127fSDimitry Andric /**
36240b57cec5SDimitry Andric  * Obtain the code opcode for an individual instruction.
36250b57cec5SDimitry Andric  *
36260b57cec5SDimitry Andric  * @see llvm::Instruction::getOpCode()
36270b57cec5SDimitry Andric  */
36280b57cec5SDimitry Andric LLVMOpcode LLVMGetInstructionOpcode(LLVMValueRef Inst);
36290b57cec5SDimitry Andric 
36300b57cec5SDimitry Andric /**
36310b57cec5SDimitry Andric  * Obtain the predicate of an instruction.
36320b57cec5SDimitry Andric  *
3633*0fca6ea1SDimitry Andric  * This is only valid for instructions that correspond to llvm::ICmpInst.
36340b57cec5SDimitry Andric  *
36350b57cec5SDimitry Andric  * @see llvm::ICmpInst::getPredicate()
36360b57cec5SDimitry Andric  */
36370b57cec5SDimitry Andric LLVMIntPredicate LLVMGetICmpPredicate(LLVMValueRef Inst);
36380b57cec5SDimitry Andric 
36390b57cec5SDimitry Andric /**
36400b57cec5SDimitry Andric  * Obtain the float predicate of an instruction.
36410b57cec5SDimitry Andric  *
3642*0fca6ea1SDimitry Andric  * This is only valid for instructions that correspond to llvm::FCmpInst.
36430b57cec5SDimitry Andric  *
36440b57cec5SDimitry Andric  * @see llvm::FCmpInst::getPredicate()
36450b57cec5SDimitry Andric  */
36460b57cec5SDimitry Andric LLVMRealPredicate LLVMGetFCmpPredicate(LLVMValueRef Inst);
36470b57cec5SDimitry Andric 
36480b57cec5SDimitry Andric /**
36490b57cec5SDimitry Andric  * Create a copy of 'this' instruction that is identical in all ways
36500b57cec5SDimitry Andric  * except the following:
36510b57cec5SDimitry Andric  *   * The instruction has no parent
36520b57cec5SDimitry Andric  *   * The instruction has no name
36530b57cec5SDimitry Andric  *
36540b57cec5SDimitry Andric  * @see llvm::Instruction::clone()
36550b57cec5SDimitry Andric  */
36560b57cec5SDimitry Andric LLVMValueRef LLVMInstructionClone(LLVMValueRef Inst);
36570b57cec5SDimitry Andric 
36580b57cec5SDimitry Andric /**
36590b57cec5SDimitry Andric  * Determine whether an instruction is a terminator. This routine is named to
36600b57cec5SDimitry Andric  * be compatible with historical functions that did this by querying the
36610b57cec5SDimitry Andric  * underlying C++ type.
36620b57cec5SDimitry Andric  *
36630b57cec5SDimitry Andric  * @see llvm::Instruction::isTerminator()
36640b57cec5SDimitry Andric  */
36650b57cec5SDimitry Andric LLVMValueRef LLVMIsATerminatorInst(LLVMValueRef Inst);
36660b57cec5SDimitry Andric 
36670b57cec5SDimitry Andric /**
36680b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueInstructionCall Call Sites and Invocations
36690b57cec5SDimitry Andric  *
36700b57cec5SDimitry Andric  * Functions in this group apply to instructions that refer to call
36710b57cec5SDimitry Andric  * sites and invocations. These correspond to C++ types in the
36720b57cec5SDimitry Andric  * llvm::CallInst class tree.
36730b57cec5SDimitry Andric  *
36740b57cec5SDimitry Andric  * @{
36750b57cec5SDimitry Andric  */
36760b57cec5SDimitry Andric 
36770b57cec5SDimitry Andric /**
36780b57cec5SDimitry Andric  * Obtain the argument count for a call instruction.
36790b57cec5SDimitry Andric  *
36800b57cec5SDimitry Andric  * This expects an LLVMValueRef that corresponds to a llvm::CallInst,
36810b57cec5SDimitry Andric  * llvm::InvokeInst, or llvm:FuncletPadInst.
36820b57cec5SDimitry Andric  *
36830b57cec5SDimitry Andric  * @see llvm::CallInst::getNumArgOperands()
36840b57cec5SDimitry Andric  * @see llvm::InvokeInst::getNumArgOperands()
36850b57cec5SDimitry Andric  * @see llvm::FuncletPadInst::getNumArgOperands()
36860b57cec5SDimitry Andric  */
36870b57cec5SDimitry Andric unsigned LLVMGetNumArgOperands(LLVMValueRef Instr);
36880b57cec5SDimitry Andric 
36890b57cec5SDimitry Andric /**
36900b57cec5SDimitry Andric  * Set the calling convention for a call instruction.
36910b57cec5SDimitry Andric  *
36920b57cec5SDimitry Andric  * This expects an LLVMValueRef that corresponds to a llvm::CallInst or
36930b57cec5SDimitry Andric  * llvm::InvokeInst.
36940b57cec5SDimitry Andric  *
36950b57cec5SDimitry Andric  * @see llvm::CallInst::setCallingConv()
36960b57cec5SDimitry Andric  * @see llvm::InvokeInst::setCallingConv()
36970b57cec5SDimitry Andric  */
36980b57cec5SDimitry Andric void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
36990b57cec5SDimitry Andric 
37000b57cec5SDimitry Andric /**
37010b57cec5SDimitry Andric  * Obtain the calling convention for a call instruction.
37020b57cec5SDimitry Andric  *
37030b57cec5SDimitry Andric  * This is the opposite of LLVMSetInstructionCallConv(). Reads its
37040b57cec5SDimitry Andric  * usage.
37050b57cec5SDimitry Andric  *
37060b57cec5SDimitry Andric  * @see LLVMSetInstructionCallConv()
37070b57cec5SDimitry Andric  */
37080b57cec5SDimitry Andric unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
37090b57cec5SDimitry Andric 
3710349cc55cSDimitry Andric void LLVMSetInstrParamAlignment(LLVMValueRef Instr, LLVMAttributeIndex Idx,
37110b57cec5SDimitry Andric                                 unsigned Align);
37120b57cec5SDimitry Andric 
37130b57cec5SDimitry Andric void LLVMAddCallSiteAttribute(LLVMValueRef C, LLVMAttributeIndex Idx,
37140b57cec5SDimitry Andric                               LLVMAttributeRef A);
37150b57cec5SDimitry Andric unsigned LLVMGetCallSiteAttributeCount(LLVMValueRef C, LLVMAttributeIndex Idx);
37160b57cec5SDimitry Andric void LLVMGetCallSiteAttributes(LLVMValueRef C, LLVMAttributeIndex Idx,
37170b57cec5SDimitry Andric                                LLVMAttributeRef *Attrs);
37180b57cec5SDimitry Andric LLVMAttributeRef LLVMGetCallSiteEnumAttribute(LLVMValueRef C,
37190b57cec5SDimitry Andric                                               LLVMAttributeIndex Idx,
37200b57cec5SDimitry Andric                                               unsigned KindID);
37210b57cec5SDimitry Andric LLVMAttributeRef LLVMGetCallSiteStringAttribute(LLVMValueRef C,
37220b57cec5SDimitry Andric                                                 LLVMAttributeIndex Idx,
37230b57cec5SDimitry Andric                                                 const char *K, unsigned KLen);
37240b57cec5SDimitry Andric void LLVMRemoveCallSiteEnumAttribute(LLVMValueRef C, LLVMAttributeIndex Idx,
37250b57cec5SDimitry Andric                                      unsigned KindID);
37260b57cec5SDimitry Andric void LLVMRemoveCallSiteStringAttribute(LLVMValueRef C, LLVMAttributeIndex Idx,
37270b57cec5SDimitry Andric                                        const char *K, unsigned KLen);
37280b57cec5SDimitry Andric 
37290b57cec5SDimitry Andric /**
37300b57cec5SDimitry Andric  * Obtain the function type called by this instruction.
37310b57cec5SDimitry Andric  *
37320b57cec5SDimitry Andric  * @see llvm::CallBase::getFunctionType()
37330b57cec5SDimitry Andric  */
37340b57cec5SDimitry Andric LLVMTypeRef LLVMGetCalledFunctionType(LLVMValueRef C);
37350b57cec5SDimitry Andric 
37360b57cec5SDimitry Andric /**
37370b57cec5SDimitry Andric  * Obtain the pointer to the function invoked by this instruction.
37380b57cec5SDimitry Andric  *
37390b57cec5SDimitry Andric  * This expects an LLVMValueRef that corresponds to a llvm::CallInst or
37400b57cec5SDimitry Andric  * llvm::InvokeInst.
37410b57cec5SDimitry Andric  *
37425ffd83dbSDimitry Andric  * @see llvm::CallInst::getCalledOperand()
37435ffd83dbSDimitry Andric  * @see llvm::InvokeInst::getCalledOperand()
37440b57cec5SDimitry Andric  */
37450b57cec5SDimitry Andric LLVMValueRef LLVMGetCalledValue(LLVMValueRef Instr);
37460b57cec5SDimitry Andric 
37470b57cec5SDimitry Andric /**
37485f757f3fSDimitry Andric  * Obtain the number of operand bundles attached to this instruction.
37495f757f3fSDimitry Andric  *
37505f757f3fSDimitry Andric  * This only works on llvm::CallInst and llvm::InvokeInst instructions.
37515f757f3fSDimitry Andric  *
37525f757f3fSDimitry Andric  * @see llvm::CallBase::getNumOperandBundles()
37535f757f3fSDimitry Andric  */
37545f757f3fSDimitry Andric unsigned LLVMGetNumOperandBundles(LLVMValueRef C);
37555f757f3fSDimitry Andric 
37565f757f3fSDimitry Andric /**
37575f757f3fSDimitry Andric  * Obtain the operand bundle attached to this instruction at the given index.
37585f757f3fSDimitry Andric  * Use LLVMDisposeOperandBundle to free the operand bundle.
37595f757f3fSDimitry Andric  *
37605f757f3fSDimitry Andric  * This only works on llvm::CallInst and llvm::InvokeInst instructions.
37615f757f3fSDimitry Andric  */
37625f757f3fSDimitry Andric LLVMOperandBundleRef LLVMGetOperandBundleAtIndex(LLVMValueRef C,
37635f757f3fSDimitry Andric                                                  unsigned Index);
37645f757f3fSDimitry Andric 
37655f757f3fSDimitry Andric /**
37660b57cec5SDimitry Andric  * Obtain whether a call instruction is a tail call.
37670b57cec5SDimitry Andric  *
37680b57cec5SDimitry Andric  * This only works on llvm::CallInst instructions.
37690b57cec5SDimitry Andric  *
37700b57cec5SDimitry Andric  * @see llvm::CallInst::isTailCall()
37710b57cec5SDimitry Andric  */
37720b57cec5SDimitry Andric LLVMBool LLVMIsTailCall(LLVMValueRef CallInst);
37730b57cec5SDimitry Andric 
37740b57cec5SDimitry Andric /**
37750b57cec5SDimitry Andric  * Set whether a call instruction is a tail call.
37760b57cec5SDimitry Andric  *
37770b57cec5SDimitry Andric  * This only works on llvm::CallInst instructions.
37780b57cec5SDimitry Andric  *
37790b57cec5SDimitry Andric  * @see llvm::CallInst::setTailCall()
37800b57cec5SDimitry Andric  */
37810b57cec5SDimitry Andric void LLVMSetTailCall(LLVMValueRef CallInst, LLVMBool IsTailCall);
37820b57cec5SDimitry Andric 
37830b57cec5SDimitry Andric /**
37845f757f3fSDimitry Andric  * Obtain a tail call kind of the call instruction.
37855f757f3fSDimitry Andric  *
37865f757f3fSDimitry Andric  * @see llvm::CallInst::setTailCallKind()
37875f757f3fSDimitry Andric  */
37885f757f3fSDimitry Andric LLVMTailCallKind LLVMGetTailCallKind(LLVMValueRef CallInst);
37895f757f3fSDimitry Andric 
37905f757f3fSDimitry Andric /**
37915f757f3fSDimitry Andric  * Set the call kind of the call instruction.
37925f757f3fSDimitry Andric  *
37935f757f3fSDimitry Andric  * @see llvm::CallInst::getTailCallKind()
37945f757f3fSDimitry Andric  */
37955f757f3fSDimitry Andric void LLVMSetTailCallKind(LLVMValueRef CallInst, LLVMTailCallKind kind);
37965f757f3fSDimitry Andric 
37975f757f3fSDimitry Andric /**
37980b57cec5SDimitry Andric  * Return the normal destination basic block.
37990b57cec5SDimitry Andric  *
38000b57cec5SDimitry Andric  * This only works on llvm::InvokeInst instructions.
38010b57cec5SDimitry Andric  *
38020b57cec5SDimitry Andric  * @see llvm::InvokeInst::getNormalDest()
38030b57cec5SDimitry Andric  */
38040b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetNormalDest(LLVMValueRef InvokeInst);
38050b57cec5SDimitry Andric 
38060b57cec5SDimitry Andric /**
38070b57cec5SDimitry Andric  * Return the unwind destination basic block.
38080b57cec5SDimitry Andric  *
38090b57cec5SDimitry Andric  * Works on llvm::InvokeInst, llvm::CleanupReturnInst, and
38100b57cec5SDimitry Andric  * llvm::CatchSwitchInst instructions.
38110b57cec5SDimitry Andric  *
38120b57cec5SDimitry Andric  * @see llvm::InvokeInst::getUnwindDest()
38130b57cec5SDimitry Andric  * @see llvm::CleanupReturnInst::getUnwindDest()
38140b57cec5SDimitry Andric  * @see llvm::CatchSwitchInst::getUnwindDest()
38150b57cec5SDimitry Andric  */
38160b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetUnwindDest(LLVMValueRef InvokeInst);
38170b57cec5SDimitry Andric 
38180b57cec5SDimitry Andric /**
38190b57cec5SDimitry Andric  * Set the normal destination basic block.
38200b57cec5SDimitry Andric  *
38210b57cec5SDimitry Andric  * This only works on llvm::InvokeInst instructions.
38220b57cec5SDimitry Andric  *
38230b57cec5SDimitry Andric  * @see llvm::InvokeInst::setNormalDest()
38240b57cec5SDimitry Andric  */
38250b57cec5SDimitry Andric void LLVMSetNormalDest(LLVMValueRef InvokeInst, LLVMBasicBlockRef B);
38260b57cec5SDimitry Andric 
38270b57cec5SDimitry Andric /**
38280b57cec5SDimitry Andric  * Set the unwind destination basic block.
38290b57cec5SDimitry Andric  *
38300b57cec5SDimitry Andric  * Works on llvm::InvokeInst, llvm::CleanupReturnInst, and
38310b57cec5SDimitry Andric  * llvm::CatchSwitchInst instructions.
38320b57cec5SDimitry Andric  *
38330b57cec5SDimitry Andric  * @see llvm::InvokeInst::setUnwindDest()
38340b57cec5SDimitry Andric  * @see llvm::CleanupReturnInst::setUnwindDest()
38350b57cec5SDimitry Andric  * @see llvm::CatchSwitchInst::setUnwindDest()
38360b57cec5SDimitry Andric  */
38370b57cec5SDimitry Andric void LLVMSetUnwindDest(LLVMValueRef InvokeInst, LLVMBasicBlockRef B);
38380b57cec5SDimitry Andric 
38390b57cec5SDimitry Andric /**
3840*0fca6ea1SDimitry Andric  * Get the default destination of a CallBr instruction.
3841*0fca6ea1SDimitry Andric  *
3842*0fca6ea1SDimitry Andric  * @see llvm::CallBrInst::getDefaultDest()
3843*0fca6ea1SDimitry Andric  */
3844*0fca6ea1SDimitry Andric LLVMBasicBlockRef LLVMGetCallBrDefaultDest(LLVMValueRef CallBr);
3845*0fca6ea1SDimitry Andric 
3846*0fca6ea1SDimitry Andric /**
3847*0fca6ea1SDimitry Andric  * Get the number of indirect destinations of a CallBr instruction.
3848*0fca6ea1SDimitry Andric  *
3849*0fca6ea1SDimitry Andric  * @see llvm::CallBrInst::getNumIndirectDests()
3850*0fca6ea1SDimitry Andric 
3851*0fca6ea1SDimitry Andric  */
3852*0fca6ea1SDimitry Andric unsigned LLVMGetCallBrNumIndirectDests(LLVMValueRef CallBr);
3853*0fca6ea1SDimitry Andric 
3854*0fca6ea1SDimitry Andric /**
3855*0fca6ea1SDimitry Andric  * Get the indirect destination of a CallBr instruction at the given index.
3856*0fca6ea1SDimitry Andric  *
3857*0fca6ea1SDimitry Andric  * @see llvm::CallBrInst::getIndirectDest()
3858*0fca6ea1SDimitry Andric  */
3859*0fca6ea1SDimitry Andric LLVMBasicBlockRef LLVMGetCallBrIndirectDest(LLVMValueRef CallBr, unsigned Idx);
3860*0fca6ea1SDimitry Andric 
3861*0fca6ea1SDimitry Andric /**
38620b57cec5SDimitry Andric  * @}
38630b57cec5SDimitry Andric  */
38640b57cec5SDimitry Andric 
38650b57cec5SDimitry Andric /**
38660b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueInstructionTerminator Terminators
38670b57cec5SDimitry Andric  *
38680b57cec5SDimitry Andric  * Functions in this group only apply to instructions for which
38690b57cec5SDimitry Andric  * LLVMIsATerminatorInst returns true.
38700b57cec5SDimitry Andric  *
38710b57cec5SDimitry Andric  * @{
38720b57cec5SDimitry Andric  */
38730b57cec5SDimitry Andric 
38740b57cec5SDimitry Andric /**
38750b57cec5SDimitry Andric  * Return the number of successors that this terminator has.
38760b57cec5SDimitry Andric  *
38770b57cec5SDimitry Andric  * @see llvm::Instruction::getNumSuccessors
38780b57cec5SDimitry Andric  */
38790b57cec5SDimitry Andric unsigned LLVMGetNumSuccessors(LLVMValueRef Term);
38800b57cec5SDimitry Andric 
38810b57cec5SDimitry Andric /**
38820b57cec5SDimitry Andric  * Return the specified successor.
38830b57cec5SDimitry Andric  *
38840b57cec5SDimitry Andric  * @see llvm::Instruction::getSuccessor
38850b57cec5SDimitry Andric  */
38860b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetSuccessor(LLVMValueRef Term, unsigned i);
38870b57cec5SDimitry Andric 
38880b57cec5SDimitry Andric /**
38890b57cec5SDimitry Andric  * Update the specified successor to point at the provided block.
38900b57cec5SDimitry Andric  *
38910b57cec5SDimitry Andric  * @see llvm::Instruction::setSuccessor
38920b57cec5SDimitry Andric  */
38930b57cec5SDimitry Andric void LLVMSetSuccessor(LLVMValueRef Term, unsigned i, LLVMBasicBlockRef block);
38940b57cec5SDimitry Andric 
38950b57cec5SDimitry Andric /**
38960b57cec5SDimitry Andric  * Return if a branch is conditional.
38970b57cec5SDimitry Andric  *
38980b57cec5SDimitry Andric  * This only works on llvm::BranchInst instructions.
38990b57cec5SDimitry Andric  *
39000b57cec5SDimitry Andric  * @see llvm::BranchInst::isConditional
39010b57cec5SDimitry Andric  */
39020b57cec5SDimitry Andric LLVMBool LLVMIsConditional(LLVMValueRef Branch);
39030b57cec5SDimitry Andric 
39040b57cec5SDimitry Andric /**
39050b57cec5SDimitry Andric  * Return the condition of a branch instruction.
39060b57cec5SDimitry Andric  *
39070b57cec5SDimitry Andric  * This only works on llvm::BranchInst instructions.
39080b57cec5SDimitry Andric  *
39090b57cec5SDimitry Andric  * @see llvm::BranchInst::getCondition
39100b57cec5SDimitry Andric  */
39110b57cec5SDimitry Andric LLVMValueRef LLVMGetCondition(LLVMValueRef Branch);
39120b57cec5SDimitry Andric 
39130b57cec5SDimitry Andric /**
39140b57cec5SDimitry Andric  * Set the condition of a branch instruction.
39150b57cec5SDimitry Andric  *
39160b57cec5SDimitry Andric  * This only works on llvm::BranchInst instructions.
39170b57cec5SDimitry Andric  *
39180b57cec5SDimitry Andric  * @see llvm::BranchInst::setCondition
39190b57cec5SDimitry Andric  */
39200b57cec5SDimitry Andric void LLVMSetCondition(LLVMValueRef Branch, LLVMValueRef Cond);
39210b57cec5SDimitry Andric 
39220b57cec5SDimitry Andric /**
39230b57cec5SDimitry Andric  * Obtain the default destination basic block of a switch instruction.
39240b57cec5SDimitry Andric  *
39250b57cec5SDimitry Andric  * This only works on llvm::SwitchInst instructions.
39260b57cec5SDimitry Andric  *
39270b57cec5SDimitry Andric  * @see llvm::SwitchInst::getDefaultDest()
39280b57cec5SDimitry Andric  */
39290b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetSwitchDefaultDest(LLVMValueRef SwitchInstr);
39300b57cec5SDimitry Andric 
39310b57cec5SDimitry Andric /**
39320b57cec5SDimitry Andric  * @}
39330b57cec5SDimitry Andric  */
39340b57cec5SDimitry Andric 
39350b57cec5SDimitry Andric /**
39360b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueInstructionAlloca Allocas
39370b57cec5SDimitry Andric  *
39380b57cec5SDimitry Andric  * Functions in this group only apply to instructions that map to
39390b57cec5SDimitry Andric  * llvm::AllocaInst instances.
39400b57cec5SDimitry Andric  *
39410b57cec5SDimitry Andric  * @{
39420b57cec5SDimitry Andric  */
39430b57cec5SDimitry Andric 
39440b57cec5SDimitry Andric /**
39450b57cec5SDimitry Andric  * Obtain the type that is being allocated by the alloca instruction.
39460b57cec5SDimitry Andric  */
39470b57cec5SDimitry Andric LLVMTypeRef LLVMGetAllocatedType(LLVMValueRef Alloca);
39480b57cec5SDimitry Andric 
39490b57cec5SDimitry Andric /**
39500b57cec5SDimitry Andric  * @}
39510b57cec5SDimitry Andric  */
39520b57cec5SDimitry Andric 
39530b57cec5SDimitry Andric /**
39540b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueInstructionGetElementPointer GEPs
39550b57cec5SDimitry Andric  *
39560b57cec5SDimitry Andric  * Functions in this group only apply to instructions that map to
39570b57cec5SDimitry Andric  * llvm::GetElementPtrInst instances.
39580b57cec5SDimitry Andric  *
39590b57cec5SDimitry Andric  * @{
39600b57cec5SDimitry Andric  */
39610b57cec5SDimitry Andric 
39620b57cec5SDimitry Andric /**
39630eae32dcSDimitry Andric  * Check whether the given GEP operator is inbounds.
39640b57cec5SDimitry Andric  */
39650b57cec5SDimitry Andric LLVMBool LLVMIsInBounds(LLVMValueRef GEP);
39660b57cec5SDimitry Andric 
39670b57cec5SDimitry Andric /**
39680b57cec5SDimitry Andric  * Set the given GEP instruction to be inbounds or not.
39690b57cec5SDimitry Andric  */
39700b57cec5SDimitry Andric void LLVMSetIsInBounds(LLVMValueRef GEP, LLVMBool InBounds);
39710b57cec5SDimitry Andric 
39720b57cec5SDimitry Andric /**
39730eae32dcSDimitry Andric  * Get the source element type of the given GEP operator.
39740eae32dcSDimitry Andric  */
39750eae32dcSDimitry Andric LLVMTypeRef LLVMGetGEPSourceElementType(LLVMValueRef GEP);
39760eae32dcSDimitry Andric 
39770eae32dcSDimitry Andric /**
3978*0fca6ea1SDimitry Andric  * Get the no-wrap related flags for the given GEP instruction.
3979*0fca6ea1SDimitry Andric  *
3980*0fca6ea1SDimitry Andric  * @see llvm::GetElementPtrInst::getNoWrapFlags
3981*0fca6ea1SDimitry Andric  */
3982*0fca6ea1SDimitry Andric LLVMGEPNoWrapFlags LLVMGEPGetNoWrapFlags(LLVMValueRef GEP);
3983*0fca6ea1SDimitry Andric 
3984*0fca6ea1SDimitry Andric /**
3985*0fca6ea1SDimitry Andric  * Set the no-wrap related flags for the given GEP instruction.
3986*0fca6ea1SDimitry Andric  *
3987*0fca6ea1SDimitry Andric  * @see llvm::GetElementPtrInst::setNoWrapFlags
3988*0fca6ea1SDimitry Andric  */
3989*0fca6ea1SDimitry Andric void LLVMGEPSetNoWrapFlags(LLVMValueRef GEP, LLVMGEPNoWrapFlags NoWrapFlags);
3990*0fca6ea1SDimitry Andric 
3991*0fca6ea1SDimitry Andric /**
39920b57cec5SDimitry Andric  * @}
39930b57cec5SDimitry Andric  */
39940b57cec5SDimitry Andric 
39950b57cec5SDimitry Andric /**
39960b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueInstructionPHINode PHI Nodes
39970b57cec5SDimitry Andric  *
39980b57cec5SDimitry Andric  * Functions in this group only apply to instructions that map to
39990b57cec5SDimitry Andric  * llvm::PHINode instances.
40000b57cec5SDimitry Andric  *
40010b57cec5SDimitry Andric  * @{
40020b57cec5SDimitry Andric  */
40030b57cec5SDimitry Andric 
40040b57cec5SDimitry Andric /**
40050b57cec5SDimitry Andric  * Add an incoming value to the end of a PHI list.
40060b57cec5SDimitry Andric  */
40070b57cec5SDimitry Andric void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
40080b57cec5SDimitry Andric                      LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
40090b57cec5SDimitry Andric 
40100b57cec5SDimitry Andric /**
40110b57cec5SDimitry Andric  * Obtain the number of incoming basic blocks to a PHI node.
40120b57cec5SDimitry Andric  */
40130b57cec5SDimitry Andric unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
40140b57cec5SDimitry Andric 
40150b57cec5SDimitry Andric /**
40160b57cec5SDimitry Andric  * Obtain an incoming value to a PHI node as an LLVMValueRef.
40170b57cec5SDimitry Andric  */
40180b57cec5SDimitry Andric LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
40190b57cec5SDimitry Andric 
40200b57cec5SDimitry Andric /**
40210b57cec5SDimitry Andric  * Obtain an incoming value to a PHI node as an LLVMBasicBlockRef.
40220b57cec5SDimitry Andric  */
40230b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
40240b57cec5SDimitry Andric 
40250b57cec5SDimitry Andric /**
40260b57cec5SDimitry Andric  * @}
40270b57cec5SDimitry Andric  */
40280b57cec5SDimitry Andric 
40290b57cec5SDimitry Andric /**
40300b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueInstructionExtractValue ExtractValue
40310b57cec5SDimitry Andric  * @defgroup LLVMCCoreValueInstructionInsertValue InsertValue
40320b57cec5SDimitry Andric  *
40330b57cec5SDimitry Andric  * Functions in this group only apply to instructions that map to
40340b57cec5SDimitry Andric  * llvm::ExtractValue and llvm::InsertValue instances.
40350b57cec5SDimitry Andric  *
40360b57cec5SDimitry Andric  * @{
40370b57cec5SDimitry Andric  */
40380b57cec5SDimitry Andric 
40390b57cec5SDimitry Andric /**
40400b57cec5SDimitry Andric  * Obtain the number of indices.
40410eae32dcSDimitry Andric  * NB: This also works on GEP operators.
40420b57cec5SDimitry Andric  */
40430b57cec5SDimitry Andric unsigned LLVMGetNumIndices(LLVMValueRef Inst);
40440b57cec5SDimitry Andric 
40450b57cec5SDimitry Andric /**
40460b57cec5SDimitry Andric  * Obtain the indices as an array.
40470b57cec5SDimitry Andric  */
40480b57cec5SDimitry Andric const unsigned *LLVMGetIndices(LLVMValueRef Inst);
40490b57cec5SDimitry Andric 
40500b57cec5SDimitry Andric /**
40510b57cec5SDimitry Andric  * @}
40520b57cec5SDimitry Andric  */
40530b57cec5SDimitry Andric 
40540b57cec5SDimitry Andric /**
40550b57cec5SDimitry Andric  * @}
40560b57cec5SDimitry Andric  */
40570b57cec5SDimitry Andric 
40580b57cec5SDimitry Andric /**
40590b57cec5SDimitry Andric  * @}
40600b57cec5SDimitry Andric  */
40610b57cec5SDimitry Andric 
40620b57cec5SDimitry Andric /**
40630b57cec5SDimitry Andric  * @defgroup LLVMCCoreInstructionBuilder Instruction Builders
40640b57cec5SDimitry Andric  *
40650b57cec5SDimitry Andric  * An instruction builder represents a point within a basic block and is
40660b57cec5SDimitry Andric  * the exclusive means of building instructions using the C interface.
40670b57cec5SDimitry Andric  *
40680b57cec5SDimitry Andric  * @{
40690b57cec5SDimitry Andric  */
40700b57cec5SDimitry Andric 
40710b57cec5SDimitry Andric LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C);
40720b57cec5SDimitry Andric LLVMBuilderRef LLVMCreateBuilder(void);
4073*0fca6ea1SDimitry Andric /**
4074*0fca6ea1SDimitry Andric  * Set the builder position before Instr but after any attached debug records,
4075*0fca6ea1SDimitry Andric  * or if Instr is null set the position to the end of Block.
4076*0fca6ea1SDimitry Andric  */
40770b57cec5SDimitry Andric void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
40780b57cec5SDimitry Andric                          LLVMValueRef Instr);
4079*0fca6ea1SDimitry Andric /**
4080*0fca6ea1SDimitry Andric  * Set the builder position before Instr and any attached debug records,
4081*0fca6ea1SDimitry Andric  * or if Instr is null set the position to the end of Block.
4082*0fca6ea1SDimitry Andric  */
4083*0fca6ea1SDimitry Andric void LLVMPositionBuilderBeforeDbgRecords(LLVMBuilderRef Builder,
4084*0fca6ea1SDimitry Andric                                          LLVMBasicBlockRef Block,
4085*0fca6ea1SDimitry Andric                                          LLVMValueRef Inst);
4086*0fca6ea1SDimitry Andric /**
4087*0fca6ea1SDimitry Andric  * Set the builder position before Instr but after any attached debug records.
4088*0fca6ea1SDimitry Andric  */
40890b57cec5SDimitry Andric void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
4090*0fca6ea1SDimitry Andric /**
4091*0fca6ea1SDimitry Andric  * Set the builder position before Instr and any attached debug records.
4092*0fca6ea1SDimitry Andric  */
4093*0fca6ea1SDimitry Andric void LLVMPositionBuilderBeforeInstrAndDbgRecords(LLVMBuilderRef Builder,
4094*0fca6ea1SDimitry Andric                                                  LLVMValueRef Instr);
40950b57cec5SDimitry Andric void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
40960b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder);
40970b57cec5SDimitry Andric void LLVMClearInsertionPosition(LLVMBuilderRef Builder);
40980b57cec5SDimitry Andric void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr);
40990b57cec5SDimitry Andric void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
41000b57cec5SDimitry Andric                                    const char *Name);
41010b57cec5SDimitry Andric void LLVMDisposeBuilder(LLVMBuilderRef Builder);
41020b57cec5SDimitry Andric 
41030b57cec5SDimitry Andric /* Metadata */
41040b57cec5SDimitry Andric 
41050b57cec5SDimitry Andric /**
41060b57cec5SDimitry Andric  * Get location information used by debugging information.
41070b57cec5SDimitry Andric  *
41080b57cec5SDimitry Andric  * @see llvm::IRBuilder::getCurrentDebugLocation()
41090b57cec5SDimitry Andric  */
41100b57cec5SDimitry Andric LLVMMetadataRef LLVMGetCurrentDebugLocation2(LLVMBuilderRef Builder);
41110b57cec5SDimitry Andric 
41120b57cec5SDimitry Andric /**
41130b57cec5SDimitry Andric  * Set location information used by debugging information.
41140b57cec5SDimitry Andric  *
41150b57cec5SDimitry Andric  * To clear the location metadata of the given instruction, pass NULL to \p Loc.
41160b57cec5SDimitry Andric  *
41170b57cec5SDimitry Andric  * @see llvm::IRBuilder::SetCurrentDebugLocation()
41180b57cec5SDimitry Andric  */
41190b57cec5SDimitry Andric void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Builder, LLVMMetadataRef Loc);
41200b57cec5SDimitry Andric 
41210b57cec5SDimitry Andric /**
41220b57cec5SDimitry Andric  * Attempts to set the debug location for the given instruction using the
41230b57cec5SDimitry Andric  * current debug location for the given builder.  If the builder has no current
41240b57cec5SDimitry Andric  * debug location, this function is a no-op.
41250b57cec5SDimitry Andric  *
4126349cc55cSDimitry Andric  * @deprecated LLVMSetInstDebugLocation is deprecated in favor of the more general
4127349cc55cSDimitry Andric  *             LLVMAddMetadataToInst.
4128349cc55cSDimitry Andric  *
41290b57cec5SDimitry Andric  * @see llvm::IRBuilder::SetInstDebugLocation()
41300b57cec5SDimitry Andric  */
41310b57cec5SDimitry Andric void LLVMSetInstDebugLocation(LLVMBuilderRef Builder, LLVMValueRef Inst);
41320b57cec5SDimitry Andric 
41330b57cec5SDimitry Andric /**
4134349cc55cSDimitry Andric  * Adds the metadata registered with the given builder to the given instruction.
4135349cc55cSDimitry Andric  *
4136349cc55cSDimitry Andric  * @see llvm::IRBuilder::AddMetadataToInst()
4137349cc55cSDimitry Andric  */
4138349cc55cSDimitry Andric void LLVMAddMetadataToInst(LLVMBuilderRef Builder, LLVMValueRef Inst);
4139349cc55cSDimitry Andric 
4140349cc55cSDimitry Andric /**
41410b57cec5SDimitry Andric  * Get the dafult floating-point math metadata for a given builder.
41420b57cec5SDimitry Andric  *
41430b57cec5SDimitry Andric  * @see llvm::IRBuilder::getDefaultFPMathTag()
41440b57cec5SDimitry Andric  */
41450b57cec5SDimitry Andric LLVMMetadataRef LLVMBuilderGetDefaultFPMathTag(LLVMBuilderRef Builder);
41460b57cec5SDimitry Andric 
41470b57cec5SDimitry Andric /**
41480b57cec5SDimitry Andric  * Set the default floating-point math metadata for the given builder.
41490b57cec5SDimitry Andric  *
41500b57cec5SDimitry Andric  * To clear the metadata, pass NULL to \p FPMathTag.
41510b57cec5SDimitry Andric  *
41520b57cec5SDimitry Andric  * @see llvm::IRBuilder::setDefaultFPMathTag()
41530b57cec5SDimitry Andric  */
41540b57cec5SDimitry Andric void LLVMBuilderSetDefaultFPMathTag(LLVMBuilderRef Builder,
41550b57cec5SDimitry Andric                                     LLVMMetadataRef FPMathTag);
41560b57cec5SDimitry Andric 
41570b57cec5SDimitry Andric /**
41580b57cec5SDimitry Andric  * Deprecated: Passing the NULL location will crash.
41590b57cec5SDimitry Andric  * Use LLVMGetCurrentDebugLocation2 instead.
41600b57cec5SDimitry Andric  */
41610b57cec5SDimitry Andric void LLVMSetCurrentDebugLocation(LLVMBuilderRef Builder, LLVMValueRef L);
41620b57cec5SDimitry Andric /**
41630b57cec5SDimitry Andric  * Deprecated: Returning the NULL location will crash.
41640b57cec5SDimitry Andric  * Use LLVMGetCurrentDebugLocation2 instead.
41650b57cec5SDimitry Andric  */
41660b57cec5SDimitry Andric LLVMValueRef LLVMGetCurrentDebugLocation(LLVMBuilderRef Builder);
41670b57cec5SDimitry Andric 
41680b57cec5SDimitry Andric /* Terminators */
41690b57cec5SDimitry Andric LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
41700b57cec5SDimitry Andric LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
41710b57cec5SDimitry Andric LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef, LLVMValueRef *RetVals,
41720b57cec5SDimitry Andric                                    unsigned N);
41730b57cec5SDimitry Andric LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
41740b57cec5SDimitry Andric LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
41750b57cec5SDimitry Andric                              LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
41760b57cec5SDimitry Andric LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
41770b57cec5SDimitry Andric                              LLVMBasicBlockRef Else, unsigned NumCases);
41780b57cec5SDimitry Andric LLVMValueRef LLVMBuildIndirectBr(LLVMBuilderRef B, LLVMValueRef Addr,
41790b57cec5SDimitry Andric                                  unsigned NumDests);
4180*0fca6ea1SDimitry Andric LLVMValueRef LLVMBuildCallBr(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Fn,
4181*0fca6ea1SDimitry Andric                              LLVMBasicBlockRef DefaultDest,
4182*0fca6ea1SDimitry Andric                              LLVMBasicBlockRef *IndirectDests,
4183*0fca6ea1SDimitry Andric                              unsigned NumIndirectDests, LLVMValueRef *Args,
4184*0fca6ea1SDimitry Andric                              unsigned NumArgs, LLVMOperandBundleRef *Bundles,
4185*0fca6ea1SDimitry Andric                              unsigned NumBundles, const char *Name);
41860b57cec5SDimitry Andric LLVMValueRef LLVMBuildInvoke2(LLVMBuilderRef, LLVMTypeRef Ty, LLVMValueRef Fn,
41870b57cec5SDimitry Andric                               LLVMValueRef *Args, unsigned NumArgs,
41880b57cec5SDimitry Andric                               LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
41890b57cec5SDimitry Andric                               const char *Name);
41905f757f3fSDimitry Andric LLVMValueRef LLVMBuildInvokeWithOperandBundles(
41915f757f3fSDimitry Andric     LLVMBuilderRef, LLVMTypeRef Ty, LLVMValueRef Fn, LLVMValueRef *Args,
41925f757f3fSDimitry Andric     unsigned NumArgs, LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
41935f757f3fSDimitry Andric     LLVMOperandBundleRef *Bundles, unsigned NumBundles, const char *Name);
41940b57cec5SDimitry Andric LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
41950b57cec5SDimitry Andric 
41960b57cec5SDimitry Andric /* Exception Handling */
41970b57cec5SDimitry Andric LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn);
41980b57cec5SDimitry Andric LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty,
41990b57cec5SDimitry Andric                                  LLVMValueRef PersFn, unsigned NumClauses,
42000b57cec5SDimitry Andric                                  const char *Name);
42010b57cec5SDimitry Andric LLVMValueRef LLVMBuildCleanupRet(LLVMBuilderRef B, LLVMValueRef CatchPad,
42020b57cec5SDimitry Andric                                  LLVMBasicBlockRef BB);
42030b57cec5SDimitry Andric LLVMValueRef LLVMBuildCatchRet(LLVMBuilderRef B, LLVMValueRef CatchPad,
42040b57cec5SDimitry Andric                                LLVMBasicBlockRef BB);
42050b57cec5SDimitry Andric LLVMValueRef LLVMBuildCatchPad(LLVMBuilderRef B, LLVMValueRef ParentPad,
42060b57cec5SDimitry Andric                                LLVMValueRef *Args, unsigned NumArgs,
42070b57cec5SDimitry Andric                                const char *Name);
42080b57cec5SDimitry Andric LLVMValueRef LLVMBuildCleanupPad(LLVMBuilderRef B, LLVMValueRef ParentPad,
42090b57cec5SDimitry Andric                                  LLVMValueRef *Args, unsigned NumArgs,
42100b57cec5SDimitry Andric                                  const char *Name);
42110b57cec5SDimitry Andric LLVMValueRef LLVMBuildCatchSwitch(LLVMBuilderRef B, LLVMValueRef ParentPad,
42120b57cec5SDimitry Andric                                   LLVMBasicBlockRef UnwindBB,
42130b57cec5SDimitry Andric                                   unsigned NumHandlers, const char *Name);
42140b57cec5SDimitry Andric 
42150b57cec5SDimitry Andric /* Add a case to the switch instruction */
42160b57cec5SDimitry Andric void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
42170b57cec5SDimitry Andric                  LLVMBasicBlockRef Dest);
42180b57cec5SDimitry Andric 
42190b57cec5SDimitry Andric /* Add a destination to the indirectbr instruction */
42200b57cec5SDimitry Andric void LLVMAddDestination(LLVMValueRef IndirectBr, LLVMBasicBlockRef Dest);
42210b57cec5SDimitry Andric 
42220b57cec5SDimitry Andric /* Get the number of clauses on the landingpad instruction */
42230b57cec5SDimitry Andric unsigned LLVMGetNumClauses(LLVMValueRef LandingPad);
42240b57cec5SDimitry Andric 
42258833aad7SDimitry Andric /* Get the value of the clause at index Idx on the landingpad instruction */
42260b57cec5SDimitry Andric LLVMValueRef LLVMGetClause(LLVMValueRef LandingPad, unsigned Idx);
42270b57cec5SDimitry Andric 
42280b57cec5SDimitry Andric /* Add a catch or filter clause to the landingpad instruction */
42290b57cec5SDimitry Andric void LLVMAddClause(LLVMValueRef LandingPad, LLVMValueRef ClauseVal);
42300b57cec5SDimitry Andric 
42310b57cec5SDimitry Andric /* Get the 'cleanup' flag in the landingpad instruction */
42320b57cec5SDimitry Andric LLVMBool LLVMIsCleanup(LLVMValueRef LandingPad);
42330b57cec5SDimitry Andric 
42340b57cec5SDimitry Andric /* Set the 'cleanup' flag in the landingpad instruction */
42350b57cec5SDimitry Andric void LLVMSetCleanup(LLVMValueRef LandingPad, LLVMBool Val);
42360b57cec5SDimitry Andric 
42370b57cec5SDimitry Andric /* Add a destination to the catchswitch instruction */
42380b57cec5SDimitry Andric void LLVMAddHandler(LLVMValueRef CatchSwitch, LLVMBasicBlockRef Dest);
42390b57cec5SDimitry Andric 
42400b57cec5SDimitry Andric /* Get the number of handlers on the catchswitch instruction */
42410b57cec5SDimitry Andric unsigned LLVMGetNumHandlers(LLVMValueRef CatchSwitch);
42420b57cec5SDimitry Andric 
42430b57cec5SDimitry Andric /**
42440b57cec5SDimitry Andric  * Obtain the basic blocks acting as handlers for a catchswitch instruction.
42450b57cec5SDimitry Andric  *
42460b57cec5SDimitry Andric  * The Handlers parameter should point to a pre-allocated array of
42470b57cec5SDimitry Andric  * LLVMBasicBlockRefs at least LLVMGetNumHandlers() large. On return, the
42480b57cec5SDimitry Andric  * first LLVMGetNumHandlers() entries in the array will be populated
42490b57cec5SDimitry Andric  * with LLVMBasicBlockRef instances.
42500b57cec5SDimitry Andric  *
42510b57cec5SDimitry Andric  * @param CatchSwitch The catchswitch instruction to operate on.
42520b57cec5SDimitry Andric  * @param Handlers Memory address of an array to be filled with basic blocks.
42530b57cec5SDimitry Andric  */
42540b57cec5SDimitry Andric void LLVMGetHandlers(LLVMValueRef CatchSwitch, LLVMBasicBlockRef *Handlers);
42550b57cec5SDimitry Andric 
42560b57cec5SDimitry Andric /* Funclets */
42570b57cec5SDimitry Andric 
42580b57cec5SDimitry Andric /* Get the number of funcletpad arguments. */
42590b57cec5SDimitry Andric LLVMValueRef LLVMGetArgOperand(LLVMValueRef Funclet, unsigned i);
42600b57cec5SDimitry Andric 
42610b57cec5SDimitry Andric /* Set a funcletpad argument at the given index. */
42620b57cec5SDimitry Andric void LLVMSetArgOperand(LLVMValueRef Funclet, unsigned i, LLVMValueRef value);
42630b57cec5SDimitry Andric 
42640b57cec5SDimitry Andric /**
42650b57cec5SDimitry Andric  * Get the parent catchswitch instruction of a catchpad instruction.
42660b57cec5SDimitry Andric  *
42670b57cec5SDimitry Andric  * This only works on llvm::CatchPadInst instructions.
42680b57cec5SDimitry Andric  *
42690b57cec5SDimitry Andric  * @see llvm::CatchPadInst::getCatchSwitch()
42700b57cec5SDimitry Andric  */
42710b57cec5SDimitry Andric LLVMValueRef LLVMGetParentCatchSwitch(LLVMValueRef CatchPad);
42720b57cec5SDimitry Andric 
42730b57cec5SDimitry Andric /**
42740b57cec5SDimitry Andric  * Set the parent catchswitch instruction of a catchpad instruction.
42750b57cec5SDimitry Andric  *
42760b57cec5SDimitry Andric  * This only works on llvm::CatchPadInst instructions.
42770b57cec5SDimitry Andric  *
42780b57cec5SDimitry Andric  * @see llvm::CatchPadInst::setCatchSwitch()
42790b57cec5SDimitry Andric  */
42800b57cec5SDimitry Andric void LLVMSetParentCatchSwitch(LLVMValueRef CatchPad, LLVMValueRef CatchSwitch);
42810b57cec5SDimitry Andric 
42820b57cec5SDimitry Andric /* Arithmetic */
42830b57cec5SDimitry Andric LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
42840b57cec5SDimitry Andric                           const char *Name);
42850b57cec5SDimitry Andric LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
42860b57cec5SDimitry Andric                              const char *Name);
42870b57cec5SDimitry Andric LLVMValueRef LLVMBuildNUWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
42880b57cec5SDimitry Andric                              const char *Name);
42890b57cec5SDimitry Andric LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
42900b57cec5SDimitry Andric                            const char *Name);
42910b57cec5SDimitry Andric LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
42920b57cec5SDimitry Andric                           const char *Name);
42930b57cec5SDimitry Andric LLVMValueRef LLVMBuildNSWSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
42940b57cec5SDimitry Andric                              const char *Name);
42950b57cec5SDimitry Andric LLVMValueRef LLVMBuildNUWSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
42960b57cec5SDimitry Andric                              const char *Name);
42970b57cec5SDimitry Andric LLVMValueRef LLVMBuildFSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
42980b57cec5SDimitry Andric                            const char *Name);
42990b57cec5SDimitry Andric LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43000b57cec5SDimitry Andric                           const char *Name);
43010b57cec5SDimitry Andric LLVMValueRef LLVMBuildNSWMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43020b57cec5SDimitry Andric                              const char *Name);
43030b57cec5SDimitry Andric LLVMValueRef LLVMBuildNUWMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43040b57cec5SDimitry Andric                              const char *Name);
43050b57cec5SDimitry Andric LLVMValueRef LLVMBuildFMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43060b57cec5SDimitry Andric                            const char *Name);
43070b57cec5SDimitry Andric LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43080b57cec5SDimitry Andric                            const char *Name);
43090b57cec5SDimitry Andric LLVMValueRef LLVMBuildExactUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43100b57cec5SDimitry Andric                                 const char *Name);
43110b57cec5SDimitry Andric LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43120b57cec5SDimitry Andric                            const char *Name);
43130b57cec5SDimitry Andric LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43140b57cec5SDimitry Andric                                 const char *Name);
43150b57cec5SDimitry Andric LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43160b57cec5SDimitry Andric                            const char *Name);
43170b57cec5SDimitry Andric LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43180b57cec5SDimitry Andric                            const char *Name);
43190b57cec5SDimitry Andric LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43200b57cec5SDimitry Andric                            const char *Name);
43210b57cec5SDimitry Andric LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43220b57cec5SDimitry Andric                            const char *Name);
43230b57cec5SDimitry Andric LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43240b57cec5SDimitry Andric                            const char *Name);
43250b57cec5SDimitry Andric LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43260b57cec5SDimitry Andric                            const char *Name);
43270b57cec5SDimitry Andric LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43280b57cec5SDimitry Andric                            const char *Name);
43290b57cec5SDimitry Andric LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43300b57cec5SDimitry Andric                           const char *Name);
43310b57cec5SDimitry Andric LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43320b57cec5SDimitry Andric                           const char *Name);
43330b57cec5SDimitry Andric LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
43340b57cec5SDimitry Andric                           const char *Name);
43350b57cec5SDimitry Andric LLVMValueRef LLVMBuildBinOp(LLVMBuilderRef B, LLVMOpcode Op,
43360b57cec5SDimitry Andric                             LLVMValueRef LHS, LLVMValueRef RHS,
43370b57cec5SDimitry Andric                             const char *Name);
43380b57cec5SDimitry Andric LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
43390b57cec5SDimitry Andric LLVMValueRef LLVMBuildNSWNeg(LLVMBuilderRef B, LLVMValueRef V,
43400b57cec5SDimitry Andric                              const char *Name);
4341*0fca6ea1SDimitry Andric LLVM_ATTRIBUTE_C_DEPRECATED(LLVMValueRef LLVMBuildNUWNeg(LLVMBuilderRef B,
4342*0fca6ea1SDimitry Andric                                                          LLVMValueRef V,
4343*0fca6ea1SDimitry Andric                                                          const char *Name),
4344*0fca6ea1SDimitry Andric                             "Use LLVMBuildNeg + LLVMSetNUW instead.");
43450b57cec5SDimitry Andric LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
43460b57cec5SDimitry Andric LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
43470b57cec5SDimitry Andric 
434806c3fb27SDimitry Andric LLVMBool LLVMGetNUW(LLVMValueRef ArithInst);
434906c3fb27SDimitry Andric void LLVMSetNUW(LLVMValueRef ArithInst, LLVMBool HasNUW);
435006c3fb27SDimitry Andric LLVMBool LLVMGetNSW(LLVMValueRef ArithInst);
435106c3fb27SDimitry Andric void LLVMSetNSW(LLVMValueRef ArithInst, LLVMBool HasNSW);
435206c3fb27SDimitry Andric LLVMBool LLVMGetExact(LLVMValueRef DivOrShrInst);
435306c3fb27SDimitry Andric void LLVMSetExact(LLVMValueRef DivOrShrInst, LLVMBool IsExact);
435406c3fb27SDimitry Andric 
43555f757f3fSDimitry Andric /**
43565f757f3fSDimitry Andric  * Gets if the instruction has the non-negative flag set.
43575f757f3fSDimitry Andric  * Only valid for zext instructions.
43585f757f3fSDimitry Andric  */
43595f757f3fSDimitry Andric LLVMBool LLVMGetNNeg(LLVMValueRef NonNegInst);
43605f757f3fSDimitry Andric /**
43615f757f3fSDimitry Andric  * Sets the non-negative flag for the instruction.
43625f757f3fSDimitry Andric  * Only valid for zext instructions.
43635f757f3fSDimitry Andric  */
43645f757f3fSDimitry Andric void LLVMSetNNeg(LLVMValueRef NonNegInst, LLVMBool IsNonNeg);
43655f757f3fSDimitry Andric 
43665f757f3fSDimitry Andric /**
43675f757f3fSDimitry Andric  * Get the flags for which fast-math-style optimizations are allowed for this
43685f757f3fSDimitry Andric  * value.
43695f757f3fSDimitry Andric  *
43705f757f3fSDimitry Andric  * Only valid on floating point instructions.
43715f757f3fSDimitry Andric  * @see LLVMCanValueUseFastMathFlags
43725f757f3fSDimitry Andric  */
43735f757f3fSDimitry Andric LLVMFastMathFlags LLVMGetFastMathFlags(LLVMValueRef FPMathInst);
43745f757f3fSDimitry Andric 
43755f757f3fSDimitry Andric /**
43765f757f3fSDimitry Andric  * Sets the flags for which fast-math-style optimizations are allowed for this
43775f757f3fSDimitry Andric  * value.
43785f757f3fSDimitry Andric  *
43795f757f3fSDimitry Andric  * Only valid on floating point instructions.
43805f757f3fSDimitry Andric  * @see LLVMCanValueUseFastMathFlags
43815f757f3fSDimitry Andric  */
43825f757f3fSDimitry Andric void LLVMSetFastMathFlags(LLVMValueRef FPMathInst, LLVMFastMathFlags FMF);
43835f757f3fSDimitry Andric 
43845f757f3fSDimitry Andric /**
43855f757f3fSDimitry Andric  * Check if a given value can potentially have fast math flags.
43865f757f3fSDimitry Andric  *
43875f757f3fSDimitry Andric  * Will return true for floating point arithmetic instructions, and for select,
43885f757f3fSDimitry Andric  * phi, and call instructions whose type is a floating point type, or a vector
43895f757f3fSDimitry Andric  * or array thereof. See https://llvm.org/docs/LangRef.html#fast-math-flags
43905f757f3fSDimitry Andric  */
43915f757f3fSDimitry Andric LLVMBool LLVMCanValueUseFastMathFlags(LLVMValueRef Inst);
43925f757f3fSDimitry Andric 
43935f757f3fSDimitry Andric /**
43945f757f3fSDimitry Andric  * Gets whether the instruction has the disjoint flag set.
43955f757f3fSDimitry Andric  * Only valid for or instructions.
43965f757f3fSDimitry Andric  */
43975f757f3fSDimitry Andric LLVMBool LLVMGetIsDisjoint(LLVMValueRef Inst);
43985f757f3fSDimitry Andric /**
43995f757f3fSDimitry Andric  * Sets the disjoint flag for the instruction.
44005f757f3fSDimitry Andric  * Only valid for or instructions.
44015f757f3fSDimitry Andric  */
44025f757f3fSDimitry Andric void LLVMSetIsDisjoint(LLVMValueRef Inst, LLVMBool IsDisjoint);
44035f757f3fSDimitry Andric 
44040b57cec5SDimitry Andric /* Memory */
44050b57cec5SDimitry Andric LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
44060b57cec5SDimitry Andric LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
44070b57cec5SDimitry Andric                                   LLVMValueRef Val, const char *Name);
44080b57cec5SDimitry Andric 
44090b57cec5SDimitry Andric /**
44100b57cec5SDimitry Andric  * Creates and inserts a memset to the specified pointer and the
44110b57cec5SDimitry Andric  * specified value.
44120b57cec5SDimitry Andric  *
44130b57cec5SDimitry Andric  * @see llvm::IRRBuilder::CreateMemSet()
44140b57cec5SDimitry Andric  */
44150b57cec5SDimitry Andric LLVMValueRef LLVMBuildMemSet(LLVMBuilderRef B, LLVMValueRef Ptr,
44160b57cec5SDimitry Andric                              LLVMValueRef Val, LLVMValueRef Len,
44170b57cec5SDimitry Andric                              unsigned Align);
44180b57cec5SDimitry Andric /**
44190b57cec5SDimitry Andric  * Creates and inserts a memcpy between the specified pointers.
44200b57cec5SDimitry Andric  *
44210b57cec5SDimitry Andric  * @see llvm::IRRBuilder::CreateMemCpy()
44220b57cec5SDimitry Andric  */
44230b57cec5SDimitry Andric LLVMValueRef LLVMBuildMemCpy(LLVMBuilderRef B,
44240b57cec5SDimitry Andric                              LLVMValueRef Dst, unsigned DstAlign,
44250b57cec5SDimitry Andric                              LLVMValueRef Src, unsigned SrcAlign,
44260b57cec5SDimitry Andric                              LLVMValueRef Size);
44270b57cec5SDimitry Andric /**
44280b57cec5SDimitry Andric  * Creates and inserts a memmove between the specified pointers.
44290b57cec5SDimitry Andric  *
44300b57cec5SDimitry Andric  * @see llvm::IRRBuilder::CreateMemMove()
44310b57cec5SDimitry Andric  */
44320b57cec5SDimitry Andric LLVMValueRef LLVMBuildMemMove(LLVMBuilderRef B,
44330b57cec5SDimitry Andric                               LLVMValueRef Dst, unsigned DstAlign,
44340b57cec5SDimitry Andric                               LLVMValueRef Src, unsigned SrcAlign,
44350b57cec5SDimitry Andric                               LLVMValueRef Size);
44360b57cec5SDimitry Andric 
44370b57cec5SDimitry Andric LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
44380b57cec5SDimitry Andric LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
44390b57cec5SDimitry Andric                                   LLVMValueRef Val, const char *Name);
44400b57cec5SDimitry Andric LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
44410b57cec5SDimitry Andric LLVMValueRef LLVMBuildLoad2(LLVMBuilderRef, LLVMTypeRef Ty,
44420b57cec5SDimitry Andric                             LLVMValueRef PointerVal, const char *Name);
44430b57cec5SDimitry Andric LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
44440b57cec5SDimitry Andric LLVMValueRef LLVMBuildGEP2(LLVMBuilderRef B, LLVMTypeRef Ty,
44450b57cec5SDimitry Andric                            LLVMValueRef Pointer, LLVMValueRef *Indices,
44460b57cec5SDimitry Andric                            unsigned NumIndices, const char *Name);
44470b57cec5SDimitry Andric LLVMValueRef LLVMBuildInBoundsGEP2(LLVMBuilderRef B, LLVMTypeRef Ty,
44480b57cec5SDimitry Andric                                    LLVMValueRef Pointer, LLVMValueRef *Indices,
44490b57cec5SDimitry Andric                                    unsigned NumIndices, const char *Name);
4450*0fca6ea1SDimitry Andric /**
4451*0fca6ea1SDimitry Andric  * Creates a GetElementPtr instruction. Similar to LLVMBuildGEP2, but allows
4452*0fca6ea1SDimitry Andric  * specifying the no-wrap flags.
4453*0fca6ea1SDimitry Andric  *
4454*0fca6ea1SDimitry Andric  * @see llvm::IRBuilder::CreateGEP()
4455*0fca6ea1SDimitry Andric  */
4456*0fca6ea1SDimitry Andric LLVMValueRef LLVMBuildGEPWithNoWrapFlags(LLVMBuilderRef B, LLVMTypeRef Ty,
4457*0fca6ea1SDimitry Andric                                          LLVMValueRef Pointer,
4458*0fca6ea1SDimitry Andric                                          LLVMValueRef *Indices,
4459*0fca6ea1SDimitry Andric                                          unsigned NumIndices, const char *Name,
4460*0fca6ea1SDimitry Andric                                          LLVMGEPNoWrapFlags NoWrapFlags);
44610b57cec5SDimitry Andric LLVMValueRef LLVMBuildStructGEP2(LLVMBuilderRef B, LLVMTypeRef Ty,
44620b57cec5SDimitry Andric                                  LLVMValueRef Pointer, unsigned Idx,
44630b57cec5SDimitry Andric                                  const char *Name);
44640b57cec5SDimitry Andric LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
44650b57cec5SDimitry Andric                                    const char *Name);
44660b57cec5SDimitry Andric LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
44670b57cec5SDimitry Andric                                       const char *Name);
44680b57cec5SDimitry Andric LLVMBool LLVMGetVolatile(LLVMValueRef MemoryAccessInst);
44690b57cec5SDimitry Andric void LLVMSetVolatile(LLVMValueRef MemoryAccessInst, LLVMBool IsVolatile);
44708bcb0991SDimitry Andric LLVMBool LLVMGetWeak(LLVMValueRef CmpXchgInst);
44718bcb0991SDimitry Andric void LLVMSetWeak(LLVMValueRef CmpXchgInst, LLVMBool IsWeak);
44720b57cec5SDimitry Andric LLVMAtomicOrdering LLVMGetOrdering(LLVMValueRef MemoryAccessInst);
44730b57cec5SDimitry Andric void LLVMSetOrdering(LLVMValueRef MemoryAccessInst, LLVMAtomicOrdering Ordering);
44748bcb0991SDimitry Andric LLVMAtomicRMWBinOp LLVMGetAtomicRMWBinOp(LLVMValueRef AtomicRMWInst);
44758bcb0991SDimitry Andric void LLVMSetAtomicRMWBinOp(LLVMValueRef AtomicRMWInst, LLVMAtomicRMWBinOp BinOp);
44760b57cec5SDimitry Andric 
44770b57cec5SDimitry Andric /* Casts */
44780b57cec5SDimitry Andric LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
44790b57cec5SDimitry Andric                             LLVMTypeRef DestTy, const char *Name);
44800b57cec5SDimitry Andric LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
44810b57cec5SDimitry Andric                            LLVMTypeRef DestTy, const char *Name);
44820b57cec5SDimitry Andric LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
44830b57cec5SDimitry Andric                            LLVMTypeRef DestTy, const char *Name);
44840b57cec5SDimitry Andric LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
44850b57cec5SDimitry Andric                              LLVMTypeRef DestTy, const char *Name);
44860b57cec5SDimitry Andric LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
44870b57cec5SDimitry Andric                              LLVMTypeRef DestTy, const char *Name);
44880b57cec5SDimitry Andric LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
44890b57cec5SDimitry Andric                              LLVMTypeRef DestTy, const char *Name);
44900b57cec5SDimitry Andric LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
44910b57cec5SDimitry Andric                              LLVMTypeRef DestTy, const char *Name);
44920b57cec5SDimitry Andric LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
44930b57cec5SDimitry Andric                               LLVMTypeRef DestTy, const char *Name);
44940b57cec5SDimitry Andric LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
44950b57cec5SDimitry Andric                             LLVMTypeRef DestTy, const char *Name);
44960b57cec5SDimitry Andric LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
44970b57cec5SDimitry Andric                                LLVMTypeRef DestTy, const char *Name);
44980b57cec5SDimitry Andric LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
44990b57cec5SDimitry Andric                                LLVMTypeRef DestTy, const char *Name);
45000b57cec5SDimitry Andric LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
45010b57cec5SDimitry Andric                               LLVMTypeRef DestTy, const char *Name);
45020b57cec5SDimitry Andric LLVMValueRef LLVMBuildAddrSpaceCast(LLVMBuilderRef, LLVMValueRef Val,
45030b57cec5SDimitry Andric                                     LLVMTypeRef DestTy, const char *Name);
45040b57cec5SDimitry Andric LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
45050b57cec5SDimitry Andric                                     LLVMTypeRef DestTy, const char *Name);
45060b57cec5SDimitry Andric LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
45070b57cec5SDimitry Andric                                     LLVMTypeRef DestTy, const char *Name);
45080b57cec5SDimitry Andric LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
45090b57cec5SDimitry Andric                                      LLVMTypeRef DestTy, const char *Name);
45100b57cec5SDimitry Andric LLVMValueRef LLVMBuildCast(LLVMBuilderRef B, LLVMOpcode Op, LLVMValueRef Val,
45110b57cec5SDimitry Andric                            LLVMTypeRef DestTy, const char *Name);
45120b57cec5SDimitry Andric LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef, LLVMValueRef Val,
45130b57cec5SDimitry Andric                                   LLVMTypeRef DestTy, const char *Name);
45140b57cec5SDimitry Andric LLVMValueRef LLVMBuildIntCast2(LLVMBuilderRef, LLVMValueRef Val,
45150b57cec5SDimitry Andric                                LLVMTypeRef DestTy, LLVMBool IsSigned,
45160b57cec5SDimitry Andric                                const char *Name);
45170b57cec5SDimitry Andric LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef, LLVMValueRef Val,
45180b57cec5SDimitry Andric                              LLVMTypeRef DestTy, const char *Name);
45190b57cec5SDimitry Andric 
45200b57cec5SDimitry Andric /** Deprecated: This cast is always signed. Use LLVMBuildIntCast2 instead. */
45210b57cec5SDimitry Andric LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef, LLVMValueRef Val, /*Signed cast!*/
45220b57cec5SDimitry Andric                               LLVMTypeRef DestTy, const char *Name);
45230b57cec5SDimitry Andric 
452481ad6265SDimitry Andric LLVMOpcode LLVMGetCastOpcode(LLVMValueRef Src, LLVMBool SrcIsSigned,
452581ad6265SDimitry Andric                              LLVMTypeRef DestTy, LLVMBool DestIsSigned);
452681ad6265SDimitry Andric 
45270b57cec5SDimitry Andric /* Comparisons */
45280b57cec5SDimitry Andric LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
45290b57cec5SDimitry Andric                            LLVMValueRef LHS, LLVMValueRef RHS,
45300b57cec5SDimitry Andric                            const char *Name);
45310b57cec5SDimitry Andric LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
45320b57cec5SDimitry Andric                            LLVMValueRef LHS, LLVMValueRef RHS,
45330b57cec5SDimitry Andric                            const char *Name);
45340b57cec5SDimitry Andric 
45350b57cec5SDimitry Andric /* Miscellaneous instructions */
45360b57cec5SDimitry Andric LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
45370b57cec5SDimitry Andric LLVMValueRef LLVMBuildCall2(LLVMBuilderRef, LLVMTypeRef, LLVMValueRef Fn,
45380b57cec5SDimitry Andric                             LLVMValueRef *Args, unsigned NumArgs,
45390b57cec5SDimitry Andric                             const char *Name);
45405f757f3fSDimitry Andric LLVMValueRef
45415f757f3fSDimitry Andric LLVMBuildCallWithOperandBundles(LLVMBuilderRef, LLVMTypeRef, LLVMValueRef Fn,
45425f757f3fSDimitry Andric                                 LLVMValueRef *Args, unsigned NumArgs,
45435f757f3fSDimitry Andric                                 LLVMOperandBundleRef *Bundles,
45445f757f3fSDimitry Andric                                 unsigned NumBundles, const char *Name);
45450b57cec5SDimitry Andric LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
45460b57cec5SDimitry Andric                              LLVMValueRef Then, LLVMValueRef Else,
45470b57cec5SDimitry Andric                              const char *Name);
45480b57cec5SDimitry Andric LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
45490b57cec5SDimitry Andric                             const char *Name);
45500b57cec5SDimitry Andric LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
45510b57cec5SDimitry Andric                                      LLVMValueRef Index, const char *Name);
45520b57cec5SDimitry Andric LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
45530b57cec5SDimitry Andric                                     LLVMValueRef EltVal, LLVMValueRef Index,
45540b57cec5SDimitry Andric                                     const char *Name);
45550b57cec5SDimitry Andric LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
45560b57cec5SDimitry Andric                                     LLVMValueRef V2, LLVMValueRef Mask,
45570b57cec5SDimitry Andric                                     const char *Name);
45580b57cec5SDimitry Andric LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef, LLVMValueRef AggVal,
45590b57cec5SDimitry Andric                                    unsigned Index, const char *Name);
45600b57cec5SDimitry Andric LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef, LLVMValueRef AggVal,
45610b57cec5SDimitry Andric                                   LLVMValueRef EltVal, unsigned Index,
45620b57cec5SDimitry Andric                                   const char *Name);
4563480093f4SDimitry Andric LLVMValueRef LLVMBuildFreeze(LLVMBuilderRef, LLVMValueRef Val,
4564480093f4SDimitry Andric                              const char *Name);
45650b57cec5SDimitry Andric 
45660b57cec5SDimitry Andric LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef, LLVMValueRef Val,
45670b57cec5SDimitry Andric                              const char *Name);
45680b57cec5SDimitry Andric LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef, LLVMValueRef Val,
45690b57cec5SDimitry Andric                                 const char *Name);
457004eeddc0SDimitry Andric LLVMValueRef LLVMBuildPtrDiff2(LLVMBuilderRef, LLVMTypeRef ElemTy,
457104eeddc0SDimitry Andric                                LLVMValueRef LHS, LLVMValueRef RHS,
457204eeddc0SDimitry Andric                                const char *Name);
45730b57cec5SDimitry Andric LLVMValueRef LLVMBuildFence(LLVMBuilderRef B, LLVMAtomicOrdering ordering,
45740b57cec5SDimitry Andric                             LLVMBool singleThread, const char *Name);
45750b57cec5SDimitry Andric LLVMValueRef LLVMBuildAtomicRMW(LLVMBuilderRef B, LLVMAtomicRMWBinOp op,
45760b57cec5SDimitry Andric                                 LLVMValueRef PTR, LLVMValueRef Val,
45770b57cec5SDimitry Andric                                 LLVMAtomicOrdering ordering,
45780b57cec5SDimitry Andric                                 LLVMBool singleThread);
45790b57cec5SDimitry Andric LLVMValueRef LLVMBuildAtomicCmpXchg(LLVMBuilderRef B, LLVMValueRef Ptr,
45800b57cec5SDimitry Andric                                     LLVMValueRef Cmp, LLVMValueRef New,
45810b57cec5SDimitry Andric                                     LLVMAtomicOrdering SuccessOrdering,
45820b57cec5SDimitry Andric                                     LLVMAtomicOrdering FailureOrdering,
45830b57cec5SDimitry Andric                                     LLVMBool SingleThread);
45840b57cec5SDimitry Andric 
45858833aad7SDimitry Andric /**
45868833aad7SDimitry Andric  * Get the number of elements in the mask of a ShuffleVector instruction.
45878833aad7SDimitry Andric  */
45888833aad7SDimitry Andric unsigned LLVMGetNumMaskElements(LLVMValueRef ShuffleVectorInst);
45898833aad7SDimitry Andric 
45908833aad7SDimitry Andric /**
45918833aad7SDimitry Andric  * \returns a constant that specifies that the result of a \c ShuffleVectorInst
45928833aad7SDimitry Andric  * is undefined.
45938833aad7SDimitry Andric  */
45948833aad7SDimitry Andric int LLVMGetUndefMaskElem(void);
45958833aad7SDimitry Andric 
45968833aad7SDimitry Andric /**
45978833aad7SDimitry Andric  * Get the mask value at position Elt in the mask of a ShuffleVector
45988833aad7SDimitry Andric  * instruction.
45998833aad7SDimitry Andric  *
460006c3fb27SDimitry Andric  * \Returns the result of \c LLVMGetUndefMaskElem() if the mask value is
460106c3fb27SDimitry Andric  * poison at that position.
46028833aad7SDimitry Andric  */
46038833aad7SDimitry Andric int LLVMGetMaskValue(LLVMValueRef ShuffleVectorInst, unsigned Elt);
46048833aad7SDimitry Andric 
46050b57cec5SDimitry Andric LLVMBool LLVMIsAtomicSingleThread(LLVMValueRef AtomicInst);
46060b57cec5SDimitry Andric void LLVMSetAtomicSingleThread(LLVMValueRef AtomicInst, LLVMBool SingleThread);
46070b57cec5SDimitry Andric 
46080b57cec5SDimitry Andric LLVMAtomicOrdering LLVMGetCmpXchgSuccessOrdering(LLVMValueRef CmpXchgInst);
46090b57cec5SDimitry Andric void LLVMSetCmpXchgSuccessOrdering(LLVMValueRef CmpXchgInst,
46100b57cec5SDimitry Andric                                    LLVMAtomicOrdering Ordering);
46110b57cec5SDimitry Andric LLVMAtomicOrdering LLVMGetCmpXchgFailureOrdering(LLVMValueRef CmpXchgInst);
46120b57cec5SDimitry Andric void LLVMSetCmpXchgFailureOrdering(LLVMValueRef CmpXchgInst,
46130b57cec5SDimitry Andric                                    LLVMAtomicOrdering Ordering);
46140b57cec5SDimitry Andric 
46150b57cec5SDimitry Andric /**
46160b57cec5SDimitry Andric  * @}
46170b57cec5SDimitry Andric  */
46180b57cec5SDimitry Andric 
46190b57cec5SDimitry Andric /**
46200b57cec5SDimitry Andric  * @defgroup LLVMCCoreModuleProvider Module Providers
46210b57cec5SDimitry Andric  *
46220b57cec5SDimitry Andric  * @{
46230b57cec5SDimitry Andric  */
46240b57cec5SDimitry Andric 
46250b57cec5SDimitry Andric /**
46260b57cec5SDimitry Andric  * Changes the type of M so it can be passed to FunctionPassManagers and the
46270b57cec5SDimitry Andric  * JIT.  They take ModuleProviders for historical reasons.
46280b57cec5SDimitry Andric  */
46290b57cec5SDimitry Andric LLVMModuleProviderRef
46300b57cec5SDimitry Andric LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
46310b57cec5SDimitry Andric 
46320b57cec5SDimitry Andric /**
46330b57cec5SDimitry Andric  * Destroys the module M.
46340b57cec5SDimitry Andric  */
46350b57cec5SDimitry Andric void LLVMDisposeModuleProvider(LLVMModuleProviderRef M);
46360b57cec5SDimitry Andric 
46370b57cec5SDimitry Andric /**
46380b57cec5SDimitry Andric  * @}
46390b57cec5SDimitry Andric  */
46400b57cec5SDimitry Andric 
46410b57cec5SDimitry Andric /**
46420b57cec5SDimitry Andric  * @defgroup LLVMCCoreMemoryBuffers Memory Buffers
46430b57cec5SDimitry Andric  *
46440b57cec5SDimitry Andric  * @{
46450b57cec5SDimitry Andric  */
46460b57cec5SDimitry Andric 
46470b57cec5SDimitry Andric LLVMBool LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
46480b57cec5SDimitry Andric                                                   LLVMMemoryBufferRef *OutMemBuf,
46490b57cec5SDimitry Andric                                                   char **OutMessage);
46500b57cec5SDimitry Andric LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
46510b57cec5SDimitry Andric                                          char **OutMessage);
46520b57cec5SDimitry Andric LLVMMemoryBufferRef LLVMCreateMemoryBufferWithMemoryRange(const char *InputData,
46530b57cec5SDimitry Andric                                                           size_t InputDataLength,
46540b57cec5SDimitry Andric                                                           const char *BufferName,
46550b57cec5SDimitry Andric                                                           LLVMBool RequiresNullTerminator);
46560b57cec5SDimitry Andric LLVMMemoryBufferRef LLVMCreateMemoryBufferWithMemoryRangeCopy(const char *InputData,
46570b57cec5SDimitry Andric                                                               size_t InputDataLength,
46580b57cec5SDimitry Andric                                                               const char *BufferName);
46590b57cec5SDimitry Andric const char *LLVMGetBufferStart(LLVMMemoryBufferRef MemBuf);
46600b57cec5SDimitry Andric size_t LLVMGetBufferSize(LLVMMemoryBufferRef MemBuf);
46610b57cec5SDimitry Andric void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
46620b57cec5SDimitry Andric 
46630b57cec5SDimitry Andric /**
46640b57cec5SDimitry Andric  * @}
46650b57cec5SDimitry Andric  */
46660b57cec5SDimitry Andric 
46670b57cec5SDimitry Andric /**
46680b57cec5SDimitry Andric  * @defgroup LLVMCCorePassManagers Pass Managers
4669349cc55cSDimitry Andric  * @ingroup LLVMCCore
46700b57cec5SDimitry Andric  *
46710b57cec5SDimitry Andric  * @{
46720b57cec5SDimitry Andric  */
46730b57cec5SDimitry Andric 
46740b57cec5SDimitry Andric /** Constructs a new whole-module pass pipeline. This type of pipeline is
46750b57cec5SDimitry Andric     suitable for link-time optimization and whole-module transformations.
46760b57cec5SDimitry Andric     @see llvm::PassManager::PassManager */
46770b57cec5SDimitry Andric LLVMPassManagerRef LLVMCreatePassManager(void);
46780b57cec5SDimitry Andric 
46790b57cec5SDimitry Andric /** Constructs a new function-by-function pass pipeline over the module
46800b57cec5SDimitry Andric     provider. It does not take ownership of the module provider. This type of
46810b57cec5SDimitry Andric     pipeline is suitable for code generation and JIT compilation tasks.
46820b57cec5SDimitry Andric     @see llvm::FunctionPassManager::FunctionPassManager */
46830b57cec5SDimitry Andric LLVMPassManagerRef LLVMCreateFunctionPassManagerForModule(LLVMModuleRef M);
46840b57cec5SDimitry Andric 
46850b57cec5SDimitry Andric /** Deprecated: Use LLVMCreateFunctionPassManagerForModule instead. */
46860b57cec5SDimitry Andric LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef MP);
46870b57cec5SDimitry Andric 
46880b57cec5SDimitry Andric /** Initializes, executes on the provided module, and finalizes all of the
46890b57cec5SDimitry Andric     passes scheduled in the pass manager. Returns 1 if any of the passes
46900b57cec5SDimitry Andric     modified the module, 0 otherwise.
46910b57cec5SDimitry Andric     @see llvm::PassManager::run(Module&) */
46920b57cec5SDimitry Andric LLVMBool LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M);
46930b57cec5SDimitry Andric 
46940b57cec5SDimitry Andric /** Initializes all of the function passes scheduled in the function pass
46950b57cec5SDimitry Andric     manager. Returns 1 if any of the passes modified the module, 0 otherwise.
46960b57cec5SDimitry Andric     @see llvm::FunctionPassManager::doInitialization */
46970b57cec5SDimitry Andric LLVMBool LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM);
46980b57cec5SDimitry Andric 
46990b57cec5SDimitry Andric /** Executes all of the function passes scheduled in the function pass manager
47000b57cec5SDimitry Andric     on the provided function. Returns 1 if any of the passes modified the
47010b57cec5SDimitry Andric     function, false otherwise.
47020b57cec5SDimitry Andric     @see llvm::FunctionPassManager::run(Function&) */
47030b57cec5SDimitry Andric LLVMBool LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F);
47040b57cec5SDimitry Andric 
47050b57cec5SDimitry Andric /** Finalizes all of the function passes scheduled in the function pass
47060b57cec5SDimitry Andric     manager. Returns 1 if any of the passes modified the module, 0 otherwise.
47070b57cec5SDimitry Andric     @see llvm::FunctionPassManager::doFinalization */
47080b57cec5SDimitry Andric LLVMBool LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM);
47090b57cec5SDimitry Andric 
47100b57cec5SDimitry Andric /** Frees the memory of a pass pipeline. For function pipelines, does not free
47110b57cec5SDimitry Andric     the module provider.
47120b57cec5SDimitry Andric     @see llvm::PassManagerBase::~PassManagerBase. */
47130b57cec5SDimitry Andric void LLVMDisposePassManager(LLVMPassManagerRef PM);
47140b57cec5SDimitry Andric 
47150b57cec5SDimitry Andric /**
47160b57cec5SDimitry Andric  * @}
47170b57cec5SDimitry Andric  */
47180b57cec5SDimitry Andric 
47190b57cec5SDimitry Andric /**
47200b57cec5SDimitry Andric  * @defgroup LLVMCCoreThreading Threading
47210b57cec5SDimitry Andric  *
47220b57cec5SDimitry Andric  * Handle the structures needed to make LLVM safe for multithreading.
47230b57cec5SDimitry Andric  *
47240b57cec5SDimitry Andric  * @{
47250b57cec5SDimitry Andric  */
47260b57cec5SDimitry Andric 
47270b57cec5SDimitry Andric /** Deprecated: Multi-threading can only be enabled/disabled with the compile
47280b57cec5SDimitry Andric     time define LLVM_ENABLE_THREADS.  This function always returns
47290b57cec5SDimitry Andric     LLVMIsMultithreaded(). */
47300b57cec5SDimitry Andric LLVMBool LLVMStartMultithreaded(void);
47310b57cec5SDimitry Andric 
47320b57cec5SDimitry Andric /** Deprecated: Multi-threading can only be enabled/disabled with the compile
47330b57cec5SDimitry Andric     time define LLVM_ENABLE_THREADS. */
47340b57cec5SDimitry Andric void LLVMStopMultithreaded(void);
47350b57cec5SDimitry Andric 
47360b57cec5SDimitry Andric /** Check whether LLVM is executing in thread-safe mode or not.
47370b57cec5SDimitry Andric     @see llvm::llvm_is_multithreaded */
47380b57cec5SDimitry Andric LLVMBool LLVMIsMultithreaded(void);
47390b57cec5SDimitry Andric 
47400b57cec5SDimitry Andric /**
47410b57cec5SDimitry Andric  * @}
47420b57cec5SDimitry Andric  */
47430b57cec5SDimitry Andric 
47440b57cec5SDimitry Andric /**
47450b57cec5SDimitry Andric  * @}
47460b57cec5SDimitry Andric  */
47470b57cec5SDimitry Andric 
47480b57cec5SDimitry Andric /**
47490b57cec5SDimitry Andric  * @}
47500b57cec5SDimitry Andric  */
47510b57cec5SDimitry Andric 
4752480093f4SDimitry Andric LLVM_C_EXTERN_C_END
47530b57cec5SDimitry Andric 
47540b57cec5SDimitry Andric #endif /* LLVM_C_CORE_H */
4755