blob: e2165721534610da7369c2c5356db14257651e03 [file] [log] [blame]
Gordon Henriksen76a03742007-09-18 03:18:57 +00001/*===-- llvm-c/Core.h - Core Library C Interface ------------------*- C -*-===*\
2|* *|
3|* The LLVM Compiler Infrastructure *|
4|* *|
5|* This file was developed by Gordon Henriksen and is distributed under the *|
6|* University of Illinois Open Source License. See LICENSE.TXT for details. *|
7|* *|
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 Henriksen7330acd2007-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 Henriksen76a03742007-09-18 03:18:57 +000031\*===----------------------------------------------------------------------===*/
32
33#ifndef LLVM_C_CORE_H
34#define LLVM_C_CORE_H
35
36#ifdef __cplusplus
Gordon Henriksen7330acd2007-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 Henriksen76a03742007-09-18 03:18:57 +000043extern "C" {
44#endif
45
46
47/* Opaque types. */
48typedef struct LLVMOpaqueModule *LLVMModuleRef;
49typedef struct LLVMOpaqueType *LLVMTypeRef;
Gordon Henriksenffb48762007-10-07 00:13:35 +000050typedef struct LLVMOpaqueTypeHandle *LLVMTypeHandleRef;
Gordon Henriksen76a03742007-09-18 03:18:57 +000051typedef struct LLVMOpaqueValue *LLVMValueRef;
Gordon Henriksenc23b66c2007-09-26 20:56:12 +000052typedef struct LLVMOpaqueBasicBlock *LLVMBasicBlockRef;
53typedef struct LLVMOpaqueBuilder *LLVMBuilderRef;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000054
55/* Used to provide a module to JIT or interpreter.
56 * See the llvm::ModuleProvider class.
57 */
Gordon Henriksen0a68fe22007-12-12 01:04:30 +000058typedef struct LLVMOpaqueModuleProvider *LLVMModuleProviderRef;
Gordon Henriksen76a03742007-09-18 03:18:57 +000059
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000060/* Used to provide a module to JIT or interpreter.
61 * See the llvm::MemoryBuffer class.
62 */
63typedef struct LLVMOpaqueMemoryBuffer *LLVMMemoryBufferRef;
64
Gordon Henriksen76a03742007-09-18 03:18:57 +000065typedef enum {
Gordon Henriksenc23b66c2007-09-26 20:56:12 +000066 LLVMVoidTypeKind, /* type with no size */
Gordon Henriksen76a03742007-09-18 03:18:57 +000067 LLVMFloatTypeKind, /* 32 bit floating point type */
68 LLVMDoubleTypeKind, /* 64 bit floating point type */
69 LLVMX86_FP80TypeKind, /* 80 bit floating point type (X87) */
70 LLVMFP128TypeKind, /* 128 bit floating point type (112-bit mantissa) */
71 LLVMPPC_FP128TypeKind, /* 128 bit floating point type (two 64-bits) */
72 LLVMLabelTypeKind, /* Labels */
73 LLVMIntegerTypeKind, /* Arbitrary bit width integers */
74 LLVMFunctionTypeKind, /* Functions */
75 LLVMStructTypeKind, /* Structures */
76 LLVMArrayTypeKind, /* Arrays */
77 LLVMPointerTypeKind, /* Pointers */
78 LLVMOpaqueTypeKind, /* Opaque: type with unknown structure */
79 LLVMVectorTypeKind /* SIMD 'packed' format, or other vector type */
80} LLVMTypeKind;
81
82typedef enum {
Gordon Henriksenc23b66c2007-09-26 20:56:12 +000083 LLVMExternalLinkage, /* Externally visible function */
Gordon Henriksen76a03742007-09-18 03:18:57 +000084 LLVMLinkOnceLinkage, /* Keep one copy of function when linking (inline) */
85 LLVMWeakLinkage, /* Keep one copy of function when linking (weak) */
86 LLVMAppendingLinkage, /* Special purpose, only applies to global arrays */
87 LLVMInternalLinkage, /* Rename collisions when linking (static functions)*/
88 LLVMDLLImportLinkage, /* Function to be imported from DLL */
89 LLVMDLLExportLinkage, /* Function to be accessible from DLL */
90 LLVMExternalWeakLinkage,/* ExternalWeak linkage description */
91 LLVMGhostLinkage /* Stand-in functions for streaming fns from bitcode*/
92} LLVMLinkage;
93
94typedef enum {
Gordon Henriksenc23b66c2007-09-26 20:56:12 +000095 LLVMDefaultVisibility, /* The GV is visible */
96 LLVMHiddenVisibility, /* The GV is hidden */
97 LLVMProtectedVisibility /* The GV is protected */
Gordon Henriksen76a03742007-09-18 03:18:57 +000098} LLVMVisibility;
99
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000100typedef enum {
101 LLVMCCallConv = 0,
102 LLVMFastCallConv = 8,
103 LLVMColdCallConv = 9,
104 LLVMX86StdcallCallConv = 64,
105 LLVMX86FastcallCallConv = 65
106} LLVMCallConv;
107
108typedef enum {
109 LLVMIntEQ = 32, /* equal */
110 LLVMIntNE, /* not equal */
111 LLVMIntUGT, /* unsigned greater than */
112 LLVMIntUGE, /* unsigned greater or equal */
113 LLVMIntULT, /* unsigned less than */
114 LLVMIntULE, /* unsigned less or equal */
115 LLVMIntSGT, /* signed greater than */
116 LLVMIntSGE, /* signed greater or equal */
117 LLVMIntSLT, /* signed less than */
118 LLVMIntSLE /* signed less or equal */
119} LLVMIntPredicate;
120
121typedef enum {
122 LLVMRealPredicateFalse, /* Always false (always folded) */
123 LLVMRealOEQ, /* True if ordered and equal */
124 LLVMRealOGT, /* True if ordered and greater than */
125 LLVMRealOGE, /* True if ordered and greater than or equal */
126 LLVMRealOLT, /* True if ordered and less than */
127 LLVMRealOLE, /* True if ordered and less than or equal */
128 LLVMRealONE, /* True if ordered and operands are unequal */
129 LLVMRealORD, /* True if ordered (no nans) */
130 LLVMRealUNO, /* True if unordered: isnan(X) | isnan(Y) */
131 LLVMRealUEQ, /* True if unordered or equal */
132 LLVMRealUGT, /* True if unordered or greater than */
133 LLVMRealUGE, /* True if unordered, greater than, or equal */
134 LLVMRealULT, /* True if unordered or less than */
135 LLVMRealULE, /* True if unordered, less than, or equal */
136 LLVMRealUNE, /* True if unordered or not equal */
137 LLVMRealPredicateTrue /* Always true (always folded) */
138} LLVMRealPredicate;
139
Gordon Henriksen76a03742007-09-18 03:18:57 +0000140
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000141/*===-- Error handling ----------------------------------------------------===*/
142
143void LLVMDisposeMessage(char *Message);
144
145
Gordon Henriksen76a03742007-09-18 03:18:57 +0000146/*===-- Modules -----------------------------------------------------------===*/
147
148/* Create and destroy modules. */
149LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
150void LLVMDisposeModule(LLVMModuleRef M);
151
152/* Same as Module::addTypeName. */
153int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000154void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000155
156
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000157/*===-- Types -------------------------------------------------------------===*/
Gordon Henriksen76a03742007-09-18 03:18:57 +0000158
159/* LLVM types conform to the following hierarchy:
160 *
161 * types:
162 * integer type
163 * real type
164 * function type
165 * sequence types:
166 * array type
167 * pointer type
168 * vector type
169 * void type
170 * label type
171 * opaque type
172 */
173
174LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty);
175void LLVMRefineAbstractType(LLVMTypeRef AbstractType, LLVMTypeRef ConcreteType);
176
177/* Operations on integer types */
178LLVMTypeRef LLVMInt1Type();
179LLVMTypeRef LLVMInt8Type();
180LLVMTypeRef LLVMInt16Type();
181LLVMTypeRef LLVMInt32Type();
182LLVMTypeRef LLVMInt64Type();
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000183LLVMTypeRef LLVMIntType(unsigned NumBits);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000184unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000185
186/* Operations on real types */
187LLVMTypeRef LLVMFloatType();
188LLVMTypeRef LLVMDoubleType();
189LLVMTypeRef LLVMX86FP80Type();
190LLVMTypeRef LLVMFP128Type();
191LLVMTypeRef LLVMPPCFP128Type();
192
193/* Operations on function types */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000194LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
195 LLVMTypeRef *ParamTypes, unsigned ParamCount,
196 int IsVarArg);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000197int LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000198LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy);
199unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy);
200void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000201
202/* Operations on struct types */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000203LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
204 int Packed);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000205unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000206void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
207int LLVMIsPackedStruct(LLVMTypeRef StructTy);
208
209/* Operations on array, pointer, and vector types (sequence types) */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000210LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000211LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace);
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000212LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000213
214LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
215unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy);
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000216unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000217unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
218
219/* Operations on other types */
220LLVMTypeRef LLVMVoidType();
221LLVMTypeRef LLVMLabelType();
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000222LLVMTypeRef LLVMOpaqueType();
Gordon Henriksen76a03742007-09-18 03:18:57 +0000223
Gordon Henriksenffb48762007-10-07 00:13:35 +0000224/* Operations on type handles */
225LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy);
226void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy);
227LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle);
228void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle);
229
Gordon Henriksen76a03742007-09-18 03:18:57 +0000230
231/*===-- Values ------------------------------------------------------------===*/
232
233/* The bulk of LLVM's object model consists of values, which comprise a very
234 * rich type hierarchy.
235 *
236 * values:
237 * constants:
238 * scalar constants
239 * composite contants
240 * globals:
241 * global variable
242 * function
243 * alias
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000244 * basic blocks
Gordon Henriksen76a03742007-09-18 03:18:57 +0000245 */
246
247/* Operations on all values */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000248LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000249const char *LLVMGetValueName(LLVMValueRef Val);
250void LLVMSetValueName(LLVMValueRef Val, const char *Name);
Gordon Henriksen1d0d24c2007-10-06 00:08:49 +0000251void LLVMDumpValue(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000252
253/* Operations on constants of any type */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000254LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
255LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000256LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000257int LLVMIsConstant(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000258int LLVMIsNull(LLVMValueRef Val);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000259int LLVMIsUndef(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000260
261/* Operations on scalar constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000262LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
263 int SignExtend);
264LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000265
266/* Operations on composite constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000267LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
268 int DontNullTerminate);
269LLVMValueRef LLVMConstArray(LLVMTypeRef ArrayTy,
270 LLVMValueRef *ConstantVals, unsigned Length);
271LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
272 int packed);
273LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000274
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000275/* Constant expressions */
276LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
277LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
278LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
279LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
280LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
281LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
282LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
283LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
284LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
285LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
286LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
287LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
288LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
289LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
290LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
291LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
292 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
293LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
294 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
295LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
296LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
297LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
298LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
299 LLVMValueRef *ConstantIndices, unsigned NumIndices);
300LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
301LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
302LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
303LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
304LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
305LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
306LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
307LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
308LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
309LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
310LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
311LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
312LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
313 LLVMValueRef ConstantIfTrue,
314 LLVMValueRef ConstantIfFalse);
315LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
316 LLVMValueRef IndexConstant);
317LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
318 LLVMValueRef ElementValueConstant,
319 LLVMValueRef IndexConstant);
320LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
321 LLVMValueRef VectorBConstant,
322 LLVMValueRef MaskConstant);
323
Gordon Henriksen76a03742007-09-18 03:18:57 +0000324/* Operations on global variables, functions, and aliases (globals) */
325int LLVMIsDeclaration(LLVMValueRef Global);
326LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
327void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
328const char *LLVMGetSection(LLVMValueRef Global);
329void LLVMSetSection(LLVMValueRef Global, const char *Section);
330LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
331void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
332unsigned LLVMGetAlignment(LLVMValueRef Global);
333void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
334
335/* Operations on global variables */
336LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000337LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000338void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
339int LLVMHasInitializer(LLVMValueRef GlobalVar);
340LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
341void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
342int LLVMIsThreadLocal(LLVMValueRef GlobalVar);
343void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal);
Gordon Henriksen751ebf72007-10-07 17:31:42 +0000344int LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
345void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000346
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000347/* Operations on functions */
348LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
349 LLVMTypeRef FunctionTy);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000350LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000351void LLVMDeleteFunction(LLVMValueRef Fn);
352unsigned LLVMCountParams(LLVMValueRef Fn);
353void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
354LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
355unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
356unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
357void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
Gordon Henriksen71183b62007-12-10 03:18:06 +0000358const char *LLVMGetCollector(LLVMValueRef Fn);
359void LLVMSetCollector(LLVMValueRef Fn, const char *Coll);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000360
361/* Operations on basic blocks */
362LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef Bb);
363int LLVMValueIsBasicBlock(LLVMValueRef Val);
364LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
365unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
366void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
367LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
368LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
369LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
370 const char *Name);
371void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
372
Gordon Henriksen44dd8fb2007-10-08 18:14:39 +0000373/* Operations on phi nodes */
374void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
375 LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
376unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
377LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
378LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000379
380/*===-- Instruction builders ----------------------------------------------===*/
381
382/* An instruction builder represents a point within a basic block, and is the
383 * exclusive means of building instructions using the C interface.
384 */
385
386LLVMBuilderRef LLVMCreateBuilder();
387void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
388void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
389void LLVMDisposeBuilder(LLVMBuilderRef Builder);
390
391/* Terminators */
392LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
393LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
394LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
395LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
396 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
397LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
398 LLVMBasicBlockRef Else, unsigned NumCases);
399LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
400 LLVMValueRef *Args, unsigned NumArgs,
401 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
402 const char *Name);
403LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef);
404LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
405
406/* Arithmetic */
407LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
408 const char *Name);
409LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
410 const char *Name);
411LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
412 const char *Name);
413LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
414 const char *Name);
415LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
416 const char *Name);
417LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
418 const char *Name);
419LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
420 const char *Name);
421LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
422 const char *Name);
423LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
424 const char *Name);
425LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
426 const char *Name);
427LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
428 const char *Name);
429LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
430 const char *Name);
431LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
432 const char *Name);
433LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
434 const char *Name);
435LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
436 const char *Name);
437LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
438LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
439
440/* Memory */
441LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
442LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
443 LLVMValueRef Val, const char *Name);
444LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
445LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
446 LLVMValueRef Val, const char *Name);
447LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
448LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
449 const char *Name);
450LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
451LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
452 LLVMValueRef *Indices, unsigned NumIndices,
453 const char *Name);
454
455/* Casts */
456LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
457 LLVMTypeRef DestTy, const char *Name);
458LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
459 LLVMTypeRef DestTy, const char *Name);
460LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
461 LLVMTypeRef DestTy, const char *Name);
462LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
463 LLVMTypeRef DestTy, const char *Name);
464LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
465 LLVMTypeRef DestTy, const char *Name);
466LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
467 LLVMTypeRef DestTy, const char *Name);
468LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
469 LLVMTypeRef DestTy, const char *Name);
470LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
471 LLVMTypeRef DestTy, const char *Name);
472LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
473 LLVMTypeRef DestTy, const char *Name);
474LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
475 LLVMTypeRef DestTy, const char *Name);
476LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
477 LLVMTypeRef DestTy, const char *Name);
478LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
479 LLVMTypeRef DestTy, const char *Name);
480
481/* Comparisons */
482LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
483 LLVMValueRef LHS, LLVMValueRef RHS,
484 const char *Name);
485LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
486 LLVMValueRef LHS, LLVMValueRef RHS,
487 const char *Name);
488
489/* Miscellaneous instructions */
490LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
491LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
492 LLVMValueRef *Args, unsigned NumArgs,
493 const char *Name);
494LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
495 LLVMValueRef Then, LLVMValueRef Else,
496 const char *Name);
497LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
498 const char *Name);
499LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
500 LLVMValueRef Index, const char *Name);
501LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
502 LLVMValueRef EltVal, LLVMValueRef Index,
503 const char *Name);
504LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
505 LLVMValueRef V2, LLVMValueRef Mask,
506 const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000507
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000508
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000509/*===-- Module providers --------------------------------------------------===*/
510
511/* Encapsulates the module M in a module provider, taking ownership of the
512 * module.
513 * See the constructor llvm::ExistingModuleProvider::ExistingModuleProvider.
514 */
515LLVMModuleProviderRef
516LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
517
518/* Destroys the module provider MP as well as the contained module.
519 * See the destructor llvm::ModuleProvider::~ModuleProvider.
520 */
521void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP);
522
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000523
524/*===-- Memory buffers ----------------------------------------------------===*/
525
526int LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
527 LLVMMemoryBufferRef *OutMemBuf,
528 char **OutMessage);
529int LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
530 char **OutMessage);
531void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
532
Gordon Henriksen76a03742007-09-18 03:18:57 +0000533#ifdef __cplusplus
534}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000535
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000536namespace llvm {
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000537 class ModuleProvider;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000538 class MemoryBuffer;
Gordon Henriksen0a68fe22007-12-12 01:04:30 +0000539
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000540 #define DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ty, ref) \
541 inline ty *unwrap(ref P) { \
542 return reinterpret_cast<ty*>(P); \
543 } \
544 \
545 inline ref wrap(const ty *P) { \
546 return reinterpret_cast<ref>(const_cast<ty*>(P)); \
547 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000548
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000549 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Type, LLVMTypeRef )
550 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Value, LLVMValueRef )
551 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(Module, LLVMModuleRef )
552 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(BasicBlock, LLVMBasicBlockRef )
553 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(LLVMBuilder, LLVMBuilderRef )
554 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(PATypeHolder, LLVMTypeHandleRef )
555 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(ModuleProvider, LLVMModuleProviderRef)
556 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(MemoryBuffer, LLVMMemoryBufferRef )
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000557
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000558 #undef DEFINE_SIMPLE_CONVERSION_FUNCTIONS
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000559
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000560 /* Specialized opaque type conversions.
561 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000562 template<typename T>
563 inline T *unwrap(LLVMTypeRef Ty) {
564 return cast<T>(unwrap(Ty));
565 }
566
567 inline Type **unwrap(LLVMTypeRef* Tys) {
568 return reinterpret_cast<Type**>(Tys);
569 }
570
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000571 inline LLVMTypeRef *wrap(const Type **Tys) {
572 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
573 }
574
Gordon Henriksen34eb6d82007-12-19 22:30:40 +0000575 /* Specialized opaque value conversions.
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000576 */
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000577 template<typename T>
578 inline T *unwrap(LLVMValueRef Val) {
579 return cast<T>(unwrap(Val));
580 }
581
582 inline Value **unwrap(LLVMValueRef *Vals) {
583 return reinterpret_cast<Value**>(Vals);
584 }
585
586 template<typename T>
587 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
588 #if DEBUG
589 for (LLVMValueRef *I = Vals, E = Vals + Length; I != E; ++I)
590 cast<T>(*I);
591 #endif
592 return reinterpret_cast<T**>(Vals);
593 }
594
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000595 inline LLVMValueRef *wrap(const Value **Vals) {
596 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
597 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000598}
599
600#endif /* !defined(__cplusplus) */
601
602#endif /* !defined(LLVM_C_CORE_H) */