blob: b10e2b721e2b6b7fae2b5271befe507c0466fe2a [file] [log] [blame]
Gordon Henriksen8b94a142007-09-18 03:18:57 +00001/*===-- llvm-c/Core.h - Core Library C Interface ------------------*- C -*-===*\
2|* *|
3|* The LLVM Compiler Infrastructure *|
4|* *|
Chris Lattner7ed47a12007-12-29 19:59:42 +00005|* This file is distributed under the University of Illinois Open Source *|
6|* License. See LICENSE.TXT for details. *|
Gordon Henriksen8b94a142007-09-18 03:18:57 +00007|* *|
8|*===----------------------------------------------------------------------===*|
9|* *|
10|* This header declares the C interface to libLLVMCore.a, which implements *|
11|* the LLVM intermediate representation. *|
12|* *|
13|* LLVM uses a polymorphic type hierarchy which C cannot represent, therefore *|
14|* parameters must be passed as base types. Despite the declared types, most *|
15|* of the functions provided operate only on branches of the type hierarchy. *|
16|* The declared parameter names are descriptive and specify which type is *|
17|* required. Additionally, each type hierarchy is documented along with the *|
18|* functions that operate upon it. For more detail, refer to LLVM's C++ code. *|
19|* If in doubt, refer to Core.cpp, which performs paramter downcasts in the *|
20|* form unwrap<RequiredType>(Param). *|
21|* *|
22|* Many exotic languages can interoperate with C code but have a harder time *|
23|* with C++ due to name mangling. So in addition to C, this interface enables *|
24|* tools written in such languages. *|
25|* *|
Gordon Henriksenacd96192007-10-05 23:59:36 +000026|* When included into a C++ source file, also declares 'wrap' and 'unwrap' *|
27|* helpers to perform opaque reference<-->pointer conversions. These helpers *|
28|* are shorter and more tightly typed than writing the casts by hand when *|
29|* authoring bindings. In assert builds, they will do runtime type checking. *|
30|* *|
Gordon Henriksen8b94a142007-09-18 03:18:57 +000031\*===----------------------------------------------------------------------===*/
32
33#ifndef LLVM_C_CORE_H
34#define LLVM_C_CORE_H
35
36#ifdef __cplusplus
Gordon Henriksenacd96192007-10-05 23:59:36 +000037
38/* Need these includes to support the LLVM 'cast' template for the C++ 'wrap'
39 and 'unwrap' conversion functions. */
40#include "llvm/Module.h"
41#include "llvm/Support/LLVMBuilder.h"
42
Gordon Henriksen8b94a142007-09-18 03:18:57 +000043extern "C" {
44#endif
45
46
47/* Opaque types. */
Gordon Henriksendc2c07a2007-12-30 17:46:33 +000048
49/**
50 * The top-level container for all other LLVM Intermediate Representation (IR)
51 * objects. See the llvm::Module class.
52 */
Gordon Henriksen8b94a142007-09-18 03:18:57 +000053typedef struct LLVMOpaqueModule *LLVMModuleRef;
Gordon Henriksendc2c07a2007-12-30 17:46:33 +000054
55/**
Gordon Henriksenbbf1c512008-03-07 19:13:06 +000056 * Each value in the LLVM IR has a type, an LLVMTypeRef. See the llvm::Type
57 * class.
Gordon Henriksendc2c07a2007-12-30 17:46:33 +000058 */
Gordon Henriksen8b94a142007-09-18 03:18:57 +000059typedef struct LLVMOpaqueType *LLVMTypeRef;
Gordon Henriksendc2c07a2007-12-30 17:46:33 +000060
61/**
Gordon Henriksenbbf1c512008-03-07 19:13:06 +000062 * When building recursive types using LLVMRefineType, LLVMTypeRef values may
63 * become invalid; use LLVMTypeHandleRef to resolve this problem. See the
64 * llvm::AbstractTypeHolder class.
Gordon Henriksendc2c07a2007-12-30 17:46:33 +000065 */
Gordon Henriksen1cf08fd2007-10-07 00:13:35 +000066typedef struct LLVMOpaqueTypeHandle *LLVMTypeHandleRef;
Gordon Henriksendc2c07a2007-12-30 17:46:33 +000067
Gordon Henriksen8b94a142007-09-18 03:18:57 +000068typedef struct LLVMOpaqueValue *LLVMValueRef;
Gordon Henriksen46abf912007-09-26 20:56:12 +000069typedef struct LLVMOpaqueBasicBlock *LLVMBasicBlockRef;
70typedef struct LLVMOpaqueBuilder *LLVMBuilderRef;
Gordon Henriksenda1435f2007-12-19 22:30:40 +000071
72/* Used to provide a module to JIT or interpreter.
73 * See the llvm::ModuleProvider class.
74 */
Gordon Henriksen1ae61352007-12-12 01:04:30 +000075typedef struct LLVMOpaqueModuleProvider *LLVMModuleProviderRef;
Gordon Henriksen8b94a142007-09-18 03:18:57 +000076
Gordon Henriksenda1435f2007-12-19 22:30:40 +000077/* Used to provide a module to JIT or interpreter.
78 * See the llvm::MemoryBuffer class.
79 */
80typedef struct LLVMOpaqueMemoryBuffer *LLVMMemoryBufferRef;
81
Gordon Henriksen8b94a142007-09-18 03:18:57 +000082typedef enum {
Gordon Henriksendc2c07a2007-12-30 17:46:33 +000083 LLVMVoidTypeKind, /**< type with no size */
84 LLVMFloatTypeKind, /**< 32 bit floating point type */
85 LLVMDoubleTypeKind, /**< 64 bit floating point type */
86 LLVMX86_FP80TypeKind, /**< 80 bit floating point type (X87) */
87 LLVMFP128TypeKind, /**< 128 bit floating point type (112-bit mantissa)*/
88 LLVMPPC_FP128TypeKind, /**< 128 bit floating point type (two 64-bits) */
89 LLVMLabelTypeKind, /**< Labels */
90 LLVMIntegerTypeKind, /**< Arbitrary bit width integers */
91 LLVMFunctionTypeKind, /**< Functions */
92 LLVMStructTypeKind, /**< Structures */
93 LLVMArrayTypeKind, /**< Arrays */
94 LLVMPointerTypeKind, /**< Pointers */
95 LLVMOpaqueTypeKind, /**< Opaque: type with unknown structure */
96 LLVMVectorTypeKind /**< SIMD 'packed' format, or other vector type */
Gordon Henriksen8b94a142007-09-18 03:18:57 +000097} LLVMTypeKind;
98
99typedef enum {
Gordon Henriksendc2c07a2007-12-30 17:46:33 +0000100 LLVMExternalLinkage, /**< Externally visible function */
101 LLVMLinkOnceLinkage, /**< Keep one copy of function when linking (inline)*/
102 LLVMWeakLinkage, /**< Keep one copy of function when linking (weak) */
103 LLVMAppendingLinkage, /**< Special purpose, only applies to global arrays */
104 LLVMInternalLinkage, /**< Rename collisions when linking (static
105 functions) */
106 LLVMDLLImportLinkage, /**< Function to be imported from DLL */
107 LLVMDLLExportLinkage, /**< Function to be accessible from DLL */
108 LLVMExternalWeakLinkage,/**< ExternalWeak linkage description */
109 LLVMGhostLinkage /**< Stand-in functions for streaming fns from
110 bitcode */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000111} LLVMLinkage;
112
113typedef enum {
Gordon Henriksendc2c07a2007-12-30 17:46:33 +0000114 LLVMDefaultVisibility, /**< The GV is visible */
115 LLVMHiddenVisibility, /**< The GV is hidden */
116 LLVMProtectedVisibility /**< The GV is protected */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000117} LLVMVisibility;
118
Gordon Henriksen46abf912007-09-26 20:56:12 +0000119typedef enum {
120 LLVMCCallConv = 0,
121 LLVMFastCallConv = 8,
122 LLVMColdCallConv = 9,
123 LLVMX86StdcallCallConv = 64,
124 LLVMX86FastcallCallConv = 65
125} LLVMCallConv;
126
127typedef enum {
Gordon Henriksendc2c07a2007-12-30 17:46:33 +0000128 LLVMIntEQ = 32, /**< equal */
129 LLVMIntNE, /**< not equal */
130 LLVMIntUGT, /**< unsigned greater than */
131 LLVMIntUGE, /**< unsigned greater or equal */
132 LLVMIntULT, /**< unsigned less than */
133 LLVMIntULE, /**< unsigned less or equal */
134 LLVMIntSGT, /**< signed greater than */
135 LLVMIntSGE, /**< signed greater or equal */
136 LLVMIntSLT, /**< signed less than */
137 LLVMIntSLE /**< signed less or equal */
Gordon Henriksen46abf912007-09-26 20:56:12 +0000138} LLVMIntPredicate;
139
140typedef enum {
Gordon Henriksendc2c07a2007-12-30 17:46:33 +0000141 LLVMRealPredicateFalse, /**< Always false (always folded) */
142 LLVMRealOEQ, /**< True if ordered and equal */
143 LLVMRealOGT, /**< True if ordered and greater than */
144 LLVMRealOGE, /**< True if ordered and greater than or equal */
145 LLVMRealOLT, /**< True if ordered and less than */
146 LLVMRealOLE, /**< True if ordered and less than or equal */
147 LLVMRealONE, /**< True if ordered and operands are unequal */
148 LLVMRealORD, /**< True if ordered (no nans) */
149 LLVMRealUNO, /**< True if unordered: isnan(X) | isnan(Y) */
150 LLVMRealUEQ, /**< True if unordered or equal */
151 LLVMRealUGT, /**< True if unordered or greater than */
152 LLVMRealUGE, /**< True if unordered, greater than, or equal */
153 LLVMRealULT, /**< True if unordered or less than */
154 LLVMRealULE, /**< True if unordered, less than, or equal */
155 LLVMRealUNE, /**< True if unordered or not equal */
156 LLVMRealPredicateTrue /**< Always true (always folded) */
Gordon Henriksen46abf912007-09-26 20:56:12 +0000157} LLVMRealPredicate;
158
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000159
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000160/*===-- Error handling ----------------------------------------------------===*/
161
162void LLVMDisposeMessage(char *Message);
163
164
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000165/*===-- Modules -----------------------------------------------------------===*/
166
167/* Create and destroy modules. */
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000168/** See llvm::Module::Module. */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000169LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000170
171/** See llvm::Module::~Module. */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000172void LLVMDisposeModule(LLVMModuleRef M);
173
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000174/** Data layout. See Module::getDataLayout. */
Gordon Henriksena353ffa2007-12-27 20:13:47 +0000175const char *LLVMGetDataLayout(LLVMModuleRef M);
176void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple);
177
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000178/** Target triple. See Module::getTargetTriple. */
Gordon Henriksena353ffa2007-12-27 20:13:47 +0000179const char *LLVMGetTarget(LLVMModuleRef M);
180void LLVMSetTarget(LLVMModuleRef M, const char *Triple);
181
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000182/** See Module::addTypeName. */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000183int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000184void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000185
Gordon Henriksenaf59b102008-03-14 23:58:56 +0000186/** See Module::dump. */
187void LLVMDumpModule(LLVMModuleRef M);
188
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000189
Gordon Henriksen46abf912007-09-26 20:56:12 +0000190/*===-- Types -------------------------------------------------------------===*/
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000191
192/* LLVM types conform to the following hierarchy:
193 *
194 * types:
195 * integer type
196 * real type
197 * function type
198 * sequence types:
199 * array type
200 * pointer type
201 * vector type
202 * void type
203 * label type
204 * opaque type
205 */
206
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000207/** See llvm::LLVMTypeKind::getTypeID. */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000208LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty);
Gordon Henriksenbbf1c512008-03-07 19:13:06 +0000209
210/** See llvm::DerivedType::refineAbstractTypeTo. */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000211void LLVMRefineAbstractType(LLVMTypeRef AbstractType, LLVMTypeRef ConcreteType);
212
213/* Operations on integer types */
214LLVMTypeRef LLVMInt1Type();
215LLVMTypeRef LLVMInt8Type();
216LLVMTypeRef LLVMInt16Type();
217LLVMTypeRef LLVMInt32Type();
218LLVMTypeRef LLVMInt64Type();
Gordon Henriksen81a78812007-10-06 16:05:20 +0000219LLVMTypeRef LLVMIntType(unsigned NumBits);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000220unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000221
222/* Operations on real types */
223LLVMTypeRef LLVMFloatType();
224LLVMTypeRef LLVMDoubleType();
225LLVMTypeRef LLVMX86FP80Type();
226LLVMTypeRef LLVMFP128Type();
227LLVMTypeRef LLVMPPCFP128Type();
228
229/* Operations on function types */
Gordon Henriksen81a78812007-10-06 16:05:20 +0000230LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
231 LLVMTypeRef *ParamTypes, unsigned ParamCount,
232 int IsVarArg);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000233int LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000234LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy);
235unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy);
236void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000237
238/* Operations on struct types */
Gordon Henriksen81a78812007-10-06 16:05:20 +0000239LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
240 int Packed);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000241unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000242void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
243int LLVMIsPackedStruct(LLVMTypeRef StructTy);
244
245/* Operations on array, pointer, and vector types (sequence types) */
Gordon Henriksen81a78812007-10-06 16:05:20 +0000246LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000247LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace);
Gordon Henriksen81a78812007-10-06 16:05:20 +0000248LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000249
250LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
251unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy);
Gordon Henriksen57cebee2007-12-17 16:08:32 +0000252unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000253unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
254
255/* Operations on other types */
256LLVMTypeRef LLVMVoidType();
257LLVMTypeRef LLVMLabelType();
Gordon Henriksen81a78812007-10-06 16:05:20 +0000258LLVMTypeRef LLVMOpaqueType();
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000259
Gordon Henriksen1cf08fd2007-10-07 00:13:35 +0000260/* Operations on type handles */
261LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy);
262void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy);
263LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle);
264void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle);
265
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000266
267/*===-- Values ------------------------------------------------------------===*/
268
269/* The bulk of LLVM's object model consists of values, which comprise a very
270 * rich type hierarchy.
271 *
272 * values:
273 * constants:
274 * scalar constants
275 * composite contants
276 * globals:
277 * global variable
278 * function
279 * alias
Gordon Henriksen46abf912007-09-26 20:56:12 +0000280 * basic blocks
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000281 */
282
283/* Operations on all values */
Gordon Henriksen46abf912007-09-26 20:56:12 +0000284LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000285const char *LLVMGetValueName(LLVMValueRef Val);
286void LLVMSetValueName(LLVMValueRef Val, const char *Name);
Gordon Henriksen88cc6992007-10-06 00:08:49 +0000287void LLVMDumpValue(LLVMValueRef Val);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000288
289/* Operations on constants of any type */
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000290LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
291LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000292LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
Gordon Henriksen344be5f2007-09-18 18:07:51 +0000293int LLVMIsConstant(LLVMValueRef Val);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000294int LLVMIsNull(LLVMValueRef Val);
Gordon Henriksen344be5f2007-09-18 18:07:51 +0000295int LLVMIsUndef(LLVMValueRef Val);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000296
297/* Operations on scalar constants */
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000298LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
299 int SignExtend);
300LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
Gordon Henriksene62a8a32008-02-02 01:07:50 +0000301LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000302
303/* Operations on composite constants */
Gordon Henriksene3b989d2007-10-06 15:11:06 +0000304LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
305 int DontNullTerminate);
306LLVMValueRef LLVMConstArray(LLVMTypeRef ArrayTy,
307 LLVMValueRef *ConstantVals, unsigned Length);
308LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
309 int packed);
310LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000311
Gordon Henriksen46475692007-10-06 14:29:36 +0000312/* Constant expressions */
313LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
314LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
315LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
316LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
317LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
318LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
319LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
320LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
321LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
322LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
323LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
324LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
325LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
326LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
327LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
328LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
329 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
330LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
331 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
332LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
333LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
334LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
335LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
336 LLVMValueRef *ConstantIndices, unsigned NumIndices);
337LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
338LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
339LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
340LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
341LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
342LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
343LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
344LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
345LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
346LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
347LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
348LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
349LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
350 LLVMValueRef ConstantIfTrue,
351 LLVMValueRef ConstantIfFalse);
352LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
353 LLVMValueRef IndexConstant);
354LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
355 LLVMValueRef ElementValueConstant,
356 LLVMValueRef IndexConstant);
357LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
358 LLVMValueRef VectorBConstant,
359 LLVMValueRef MaskConstant);
360
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000361/* Operations on global variables, functions, and aliases (globals) */
362int LLVMIsDeclaration(LLVMValueRef Global);
363LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
364void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
365const char *LLVMGetSection(LLVMValueRef Global);
366void LLVMSetSection(LLVMValueRef Global, const char *Section);
367LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
368void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
369unsigned LLVMGetAlignment(LLVMValueRef Global);
370void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
371
372/* Operations on global variables */
373LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Gordon Henriksen6d6203d2007-10-08 03:45:09 +0000374LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000375void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
376int LLVMHasInitializer(LLVMValueRef GlobalVar);
377LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
378void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
379int LLVMIsThreadLocal(LLVMValueRef GlobalVar);
380void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal);
Gordon Henriksenc84c16b2007-10-07 17:31:42 +0000381int LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
382void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000383
Gordon Henriksen46abf912007-09-26 20:56:12 +0000384/* Operations on functions */
385LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
386 LLVMTypeRef FunctionTy);
Gordon Henriksen6d6203d2007-10-08 03:45:09 +0000387LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000388void LLVMDeleteFunction(LLVMValueRef Fn);
389unsigned LLVMCountParams(LLVMValueRef Fn);
390void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
391LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
392unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
393unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
394void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
Gordon Henriksen80a75bf2007-12-10 03:18:06 +0000395const char *LLVMGetCollector(LLVMValueRef Fn);
396void LLVMSetCollector(LLVMValueRef Fn, const char *Coll);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000397
398/* Operations on basic blocks */
399LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef Bb);
400int LLVMValueIsBasicBlock(LLVMValueRef Val);
401LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
402unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
403void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
404LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
405LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
406LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
407 const char *Name);
408void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
409
Gordon Henriksencc0928f2007-12-29 20:45:00 +0000410/* Operations on call sites */
411void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
412unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
413
Gordon Henriksen2618a6c2007-10-08 18:14:39 +0000414/* Operations on phi nodes */
415void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
416 LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
417unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
418LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
419LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
Gordon Henriksen46abf912007-09-26 20:56:12 +0000420
421/*===-- Instruction builders ----------------------------------------------===*/
422
423/* An instruction builder represents a point within a basic block, and is the
424 * exclusive means of building instructions using the C interface.
425 */
426
427LLVMBuilderRef LLVMCreateBuilder();
428void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
429void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
430void LLVMDisposeBuilder(LLVMBuilderRef Builder);
431
432/* Terminators */
433LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
434LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
435LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
436LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
437 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
438LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
439 LLVMBasicBlockRef Else, unsigned NumCases);
440LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
441 LLVMValueRef *Args, unsigned NumArgs,
442 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
443 const char *Name);
444LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef);
445LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
446
Gordon Henriksenab477cc2008-01-01 05:50:53 +0000447/* Add a case to the switch instruction */
448void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
449 LLVMBasicBlockRef Dest);
450
Gordon Henriksen46abf912007-09-26 20:56:12 +0000451/* Arithmetic */
452LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
453 const char *Name);
454LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
455 const char *Name);
456LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
457 const char *Name);
458LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
459 const char *Name);
460LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
461 const char *Name);
462LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
463 const char *Name);
464LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
465 const char *Name);
466LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
467 const char *Name);
468LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
469 const char *Name);
470LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
471 const char *Name);
472LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
473 const char *Name);
474LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
475 const char *Name);
476LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
477 const char *Name);
478LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
479 const char *Name);
480LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
481 const char *Name);
482LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
483LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
484
485/* Memory */
486LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
487LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
488 LLVMValueRef Val, const char *Name);
489LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
490LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
491 LLVMValueRef Val, const char *Name);
492LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
493LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
494 const char *Name);
495LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
496LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
497 LLVMValueRef *Indices, unsigned NumIndices,
498 const char *Name);
499
500/* Casts */
501LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
502 LLVMTypeRef DestTy, const char *Name);
503LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
504 LLVMTypeRef DestTy, const char *Name);
505LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
506 LLVMTypeRef DestTy, const char *Name);
507LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
508 LLVMTypeRef DestTy, const char *Name);
509LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
510 LLVMTypeRef DestTy, const char *Name);
511LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
512 LLVMTypeRef DestTy, const char *Name);
513LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
514 LLVMTypeRef DestTy, const char *Name);
515LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
516 LLVMTypeRef DestTy, const char *Name);
517LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
518 LLVMTypeRef DestTy, const char *Name);
519LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
520 LLVMTypeRef DestTy, const char *Name);
521LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
522 LLVMTypeRef DestTy, const char *Name);
523LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
524 LLVMTypeRef DestTy, const char *Name);
525
526/* Comparisons */
527LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
528 LLVMValueRef LHS, LLVMValueRef RHS,
529 const char *Name);
530LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
531 LLVMValueRef LHS, LLVMValueRef RHS,
532 const char *Name);
533
534/* Miscellaneous instructions */
535LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
536LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
537 LLVMValueRef *Args, unsigned NumArgs,
538 const char *Name);
539LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
540 LLVMValueRef Then, LLVMValueRef Else,
541 const char *Name);
542LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
543 const char *Name);
544LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
545 LLVMValueRef Index, const char *Name);
546LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
547 LLVMValueRef EltVal, LLVMValueRef Index,
548 const char *Name);
549LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
550 LLVMValueRef V2, LLVMValueRef Mask,
551 const char *Name);
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000552
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000553
Gordon Henriksen1ae61352007-12-12 01:04:30 +0000554/*===-- Module providers --------------------------------------------------===*/
555
556/* Encapsulates the module M in a module provider, taking ownership of the
557 * module.
558 * See the constructor llvm::ExistingModuleProvider::ExistingModuleProvider.
559 */
560LLVMModuleProviderRef
561LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
562
563/* Destroys the module provider MP as well as the contained module.
564 * See the destructor llvm::ModuleProvider::~ModuleProvider.
565 */
566void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP);
567
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000568
569/*===-- Memory buffers ----------------------------------------------------===*/
570
571int LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
572 LLVMMemoryBufferRef *OutMemBuf,
573 char **OutMessage);
574int LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
575 char **OutMessage);
576void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
577
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000578#ifdef __cplusplus
579}
Gordon Henriksen8b94a142007-09-18 03:18:57 +0000580
Gordon Henriksenacd96192007-10-05 23:59:36 +0000581namespace llvm {
Gordon Henriksen1ae61352007-12-12 01:04:30 +0000582 class ModuleProvider;
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000583 class MemoryBuffer;
Gordon Henriksen1ae61352007-12-12 01:04:30 +0000584
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000585 #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
586 inline ty *unwrap(ref P) { \
587 return reinterpret_cast<ty*>(P); \
588 } \
589 \
590 inline ref wrap(const ty *P) { \
591 return reinterpret_cast<ref>(const_cast<ty*>(P)); \
592 }
Gordon Henriksenacd96192007-10-05 23:59:36 +0000593
Gordon Henriksen1d2e49c2007-12-27 18:25:59 +0000594 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Type, LLVMTypeRef )
595 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Value, LLVMValueRef )
596 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
597 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
598 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMFoldingBuilder, LLVMBuilderRef )
599 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PATypeHolder, LLVMTypeHandleRef )
600 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ModuleProvider, LLVMModuleProviderRef)
601 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
Gordon Henriksenacd96192007-10-05 23:59:36 +0000602
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000603 #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
Gordon Henriksenacd96192007-10-05 23:59:36 +0000604
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000605 /* Specialized opaque type conversions.
606 */
Gordon Henriksenacd96192007-10-05 23:59:36 +0000607 template<typename T>
608 inline T *unwrap(LLVMTypeRef Ty) {
609 return cast<T>(unwrap(Ty));
610 }
611
612 inline Type **unwrap(LLVMTypeRef* Tys) {
613 return reinterpret_cast<Type**>(Tys);
614 }
615
Gordon Henriksenacd96192007-10-05 23:59:36 +0000616 inline LLVMTypeRef *wrap(const Type **Tys) {
617 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
618 }
619
Gordon Henriksenda1435f2007-12-19 22:30:40 +0000620 /* Specialized opaque value conversions.
Gordon Henriksenacd96192007-10-05 23:59:36 +0000621 */
Gordon Henriksenacd96192007-10-05 23:59:36 +0000622 template<typename T>
623 inline T *unwrap(LLVMValueRef Val) {
624 return cast<T>(unwrap(Val));
625 }
626
627 inline Value **unwrap(LLVMValueRef *Vals) {
628 return reinterpret_cast<Value**>(Vals);
629 }
630
631 template<typename T>
632 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
633 #if DEBUG
634 for (LLVMValueRef *I = Vals, E = Vals + Length; I != E; ++I)
635 cast<T>(*I);
636 #endif
637 return reinterpret_cast<T**>(Vals);
638 }
639
Gordon Henriksenacd96192007-10-05 23:59:36 +0000640 inline LLVMValueRef *wrap(const Value **Vals) {
641 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
642 }
Gordon Henriksenacd96192007-10-05 23:59:36 +0000643}
644
645#endif /* !defined(__cplusplus) */
646
647#endif /* !defined(LLVM_C_CORE_H) */