blob: d8bff3211a3ae539c488b6fe188234b1b6a58794 [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 Henriksen76a03742007-09-18 03:18:57 +000054
55typedef enum {
Gordon Henriksenc23b66c2007-09-26 20:56:12 +000056 LLVMVoidTypeKind, /* type with no size */
Gordon Henriksen76a03742007-09-18 03:18:57 +000057 LLVMFloatTypeKind, /* 32 bit floating point type */
58 LLVMDoubleTypeKind, /* 64 bit floating point type */
59 LLVMX86_FP80TypeKind, /* 80 bit floating point type (X87) */
60 LLVMFP128TypeKind, /* 128 bit floating point type (112-bit mantissa) */
61 LLVMPPC_FP128TypeKind, /* 128 bit floating point type (two 64-bits) */
62 LLVMLabelTypeKind, /* Labels */
63 LLVMIntegerTypeKind, /* Arbitrary bit width integers */
64 LLVMFunctionTypeKind, /* Functions */
65 LLVMStructTypeKind, /* Structures */
66 LLVMArrayTypeKind, /* Arrays */
67 LLVMPointerTypeKind, /* Pointers */
68 LLVMOpaqueTypeKind, /* Opaque: type with unknown structure */
69 LLVMVectorTypeKind /* SIMD 'packed' format, or other vector type */
70} LLVMTypeKind;
71
72typedef enum {
Gordon Henriksenc23b66c2007-09-26 20:56:12 +000073 LLVMExternalLinkage, /* Externally visible function */
Gordon Henriksen76a03742007-09-18 03:18:57 +000074 LLVMLinkOnceLinkage, /* Keep one copy of function when linking (inline) */
75 LLVMWeakLinkage, /* Keep one copy of function when linking (weak) */
76 LLVMAppendingLinkage, /* Special purpose, only applies to global arrays */
77 LLVMInternalLinkage, /* Rename collisions when linking (static functions)*/
78 LLVMDLLImportLinkage, /* Function to be imported from DLL */
79 LLVMDLLExportLinkage, /* Function to be accessible from DLL */
80 LLVMExternalWeakLinkage,/* ExternalWeak linkage description */
81 LLVMGhostLinkage /* Stand-in functions for streaming fns from bitcode*/
82} LLVMLinkage;
83
84typedef enum {
Gordon Henriksenc23b66c2007-09-26 20:56:12 +000085 LLVMDefaultVisibility, /* The GV is visible */
86 LLVMHiddenVisibility, /* The GV is hidden */
87 LLVMProtectedVisibility /* The GV is protected */
Gordon Henriksen76a03742007-09-18 03:18:57 +000088} LLVMVisibility;
89
Gordon Henriksenc23b66c2007-09-26 20:56:12 +000090typedef enum {
91 LLVMCCallConv = 0,
92 LLVMFastCallConv = 8,
93 LLVMColdCallConv = 9,
94 LLVMX86StdcallCallConv = 64,
95 LLVMX86FastcallCallConv = 65
96} LLVMCallConv;
97
98typedef enum {
99 LLVMIntEQ = 32, /* equal */
100 LLVMIntNE, /* not equal */
101 LLVMIntUGT, /* unsigned greater than */
102 LLVMIntUGE, /* unsigned greater or equal */
103 LLVMIntULT, /* unsigned less than */
104 LLVMIntULE, /* unsigned less or equal */
105 LLVMIntSGT, /* signed greater than */
106 LLVMIntSGE, /* signed greater or equal */
107 LLVMIntSLT, /* signed less than */
108 LLVMIntSLE /* signed less or equal */
109} LLVMIntPredicate;
110
111typedef enum {
112 LLVMRealPredicateFalse, /* Always false (always folded) */
113 LLVMRealOEQ, /* True if ordered and equal */
114 LLVMRealOGT, /* True if ordered and greater than */
115 LLVMRealOGE, /* True if ordered and greater than or equal */
116 LLVMRealOLT, /* True if ordered and less than */
117 LLVMRealOLE, /* True if ordered and less than or equal */
118 LLVMRealONE, /* True if ordered and operands are unequal */
119 LLVMRealORD, /* True if ordered (no nans) */
120 LLVMRealUNO, /* True if unordered: isnan(X) | isnan(Y) */
121 LLVMRealUEQ, /* True if unordered or equal */
122 LLVMRealUGT, /* True if unordered or greater than */
123 LLVMRealUGE, /* True if unordered, greater than, or equal */
124 LLVMRealULT, /* True if unordered or less than */
125 LLVMRealULE, /* True if unordered, less than, or equal */
126 LLVMRealUNE, /* True if unordered or not equal */
127 LLVMRealPredicateTrue /* Always true (always folded) */
128} LLVMRealPredicate;
129
Gordon Henriksen76a03742007-09-18 03:18:57 +0000130
131/*===-- Modules -----------------------------------------------------------===*/
132
133/* Create and destroy modules. */
134LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
135void LLVMDisposeModule(LLVMModuleRef M);
136
137/* Same as Module::addTypeName. */
138int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000139void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000140
141
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000142/*===-- Types -------------------------------------------------------------===*/
Gordon Henriksen76a03742007-09-18 03:18:57 +0000143
144/* LLVM types conform to the following hierarchy:
145 *
146 * types:
147 * integer type
148 * real type
149 * function type
150 * sequence types:
151 * array type
152 * pointer type
153 * vector type
154 * void type
155 * label type
156 * opaque type
157 */
158
159LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty);
160void LLVMRefineAbstractType(LLVMTypeRef AbstractType, LLVMTypeRef ConcreteType);
161
162/* Operations on integer types */
163LLVMTypeRef LLVMInt1Type();
164LLVMTypeRef LLVMInt8Type();
165LLVMTypeRef LLVMInt16Type();
166LLVMTypeRef LLVMInt32Type();
167LLVMTypeRef LLVMInt64Type();
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000168LLVMTypeRef LLVMIntType(unsigned NumBits);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000169unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000170
171/* Operations on real types */
172LLVMTypeRef LLVMFloatType();
173LLVMTypeRef LLVMDoubleType();
174LLVMTypeRef LLVMX86FP80Type();
175LLVMTypeRef LLVMFP128Type();
176LLVMTypeRef LLVMPPCFP128Type();
177
178/* Operations on function types */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000179LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
180 LLVMTypeRef *ParamTypes, unsigned ParamCount,
181 int IsVarArg);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000182int LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000183LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy);
184unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy);
185void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000186
187/* Operations on struct types */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000188LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
189 int Packed);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000190unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000191void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
192int LLVMIsPackedStruct(LLVMTypeRef StructTy);
193
194/* Operations on array, pointer, and vector types (sequence types) */
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000195LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
196LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType);
197LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000198
199LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
200unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy);
201unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
202
203/* Operations on other types */
204LLVMTypeRef LLVMVoidType();
205LLVMTypeRef LLVMLabelType();
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000206LLVMTypeRef LLVMOpaqueType();
Gordon Henriksen76a03742007-09-18 03:18:57 +0000207
Gordon Henriksenffb48762007-10-07 00:13:35 +0000208/* Operations on type handles */
209LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy);
210void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy);
211LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle);
212void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle);
213
Gordon Henriksen76a03742007-09-18 03:18:57 +0000214
215/*===-- Values ------------------------------------------------------------===*/
216
217/* The bulk of LLVM's object model consists of values, which comprise a very
218 * rich type hierarchy.
219 *
220 * values:
221 * constants:
222 * scalar constants
223 * composite contants
224 * globals:
225 * global variable
226 * function
227 * alias
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000228 * basic blocks
Gordon Henriksen76a03742007-09-18 03:18:57 +0000229 */
230
231/* Operations on all values */
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000232LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000233const char *LLVMGetValueName(LLVMValueRef Val);
234void LLVMSetValueName(LLVMValueRef Val, const char *Name);
Gordon Henriksen1d0d24c2007-10-06 00:08:49 +0000235void LLVMDumpValue(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000236
237/* Operations on constants of any type */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000238LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
239LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
Gordon Henriksen76a03742007-09-18 03:18:57 +0000240LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000241int LLVMIsConstant(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000242int LLVMIsNull(LLVMValueRef Val);
Gordon Henriksendc88c062007-09-18 18:07:51 +0000243int LLVMIsUndef(LLVMValueRef Val);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000244
245/* Operations on scalar constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000246LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
247 int SignExtend);
248LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000249
250/* Operations on composite constants */
Gordon Henriksen1046c732007-10-06 15:11:06 +0000251LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
252 int DontNullTerminate);
253LLVMValueRef LLVMConstArray(LLVMTypeRef ArrayTy,
254 LLVMValueRef *ConstantVals, unsigned Length);
255LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
256 int packed);
257LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000258
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000259/* Constant expressions */
260LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
261LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
262LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
263LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
264LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
265LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
266LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
267LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
268LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
269LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
270LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
271LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
272LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
273LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
274LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
275LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
276 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
277LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
278 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
279LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
280LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
281LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
282LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
283 LLVMValueRef *ConstantIndices, unsigned NumIndices);
284LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
285LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
286LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
287LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
288LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
289LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
290LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
291LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
292LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
293LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
294LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
295LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
296LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
297 LLVMValueRef ConstantIfTrue,
298 LLVMValueRef ConstantIfFalse);
299LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
300 LLVMValueRef IndexConstant);
301LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
302 LLVMValueRef ElementValueConstant,
303 LLVMValueRef IndexConstant);
304LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
305 LLVMValueRef VectorBConstant,
306 LLVMValueRef MaskConstant);
307
Gordon Henriksen76a03742007-09-18 03:18:57 +0000308/* Operations on global variables, functions, and aliases (globals) */
309int LLVMIsDeclaration(LLVMValueRef Global);
310LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
311void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
312const char *LLVMGetSection(LLVMValueRef Global);
313void LLVMSetSection(LLVMValueRef Global, const char *Section);
314LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
315void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
316unsigned LLVMGetAlignment(LLVMValueRef Global);
317void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
318
319/* Operations on global variables */
320LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000321LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000322void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
323int LLVMHasInitializer(LLVMValueRef GlobalVar);
324LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
325void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
326int LLVMIsThreadLocal(LLVMValueRef GlobalVar);
327void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal);
Gordon Henriksen751ebf72007-10-07 17:31:42 +0000328int LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
329void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000330
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000331/* Operations on functions */
332LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
333 LLVMTypeRef FunctionTy);
Gordon Henriksen783f7bb2007-10-08 03:45:09 +0000334LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000335void LLVMDeleteFunction(LLVMValueRef Fn);
336unsigned LLVMCountParams(LLVMValueRef Fn);
337void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
338LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
339unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
340unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
341void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
342
343/* Operations on basic blocks */
344LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef Bb);
345int LLVMValueIsBasicBlock(LLVMValueRef Val);
346LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
347unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
348void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
349LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
350LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
351LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
352 const char *Name);
353void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
354
355
356/*===-- Instruction builders ----------------------------------------------===*/
357
358/* An instruction builder represents a point within a basic block, and is the
359 * exclusive means of building instructions using the C interface.
360 */
361
362LLVMBuilderRef LLVMCreateBuilder();
363void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
364void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
365void LLVMDisposeBuilder(LLVMBuilderRef Builder);
366
367/* Terminators */
368LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
369LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
370LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
371LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
372 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
373LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
374 LLVMBasicBlockRef Else, unsigned NumCases);
375LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
376 LLVMValueRef *Args, unsigned NumArgs,
377 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
378 const char *Name);
379LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef);
380LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
381
382/* Arithmetic */
383LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
384 const char *Name);
385LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
386 const char *Name);
387LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
388 const char *Name);
389LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
390 const char *Name);
391LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
392 const char *Name);
393LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
394 const char *Name);
395LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
396 const char *Name);
397LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
398 const char *Name);
399LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
400 const char *Name);
401LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
402 const char *Name);
403LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
404 const char *Name);
405LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
406 const char *Name);
407LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
408 const char *Name);
409LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
410 const char *Name);
411LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
412 const char *Name);
413LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
414LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
415
416/* Memory */
417LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
418LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
419 LLVMValueRef Val, const char *Name);
420LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
421LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
422 LLVMValueRef Val, const char *Name);
423LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
424LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
425 const char *Name);
426LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
427LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
428 LLVMValueRef *Indices, unsigned NumIndices,
429 const char *Name);
430
431/* Casts */
432LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
433 LLVMTypeRef DestTy, const char *Name);
434LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
435 LLVMTypeRef DestTy, const char *Name);
436LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
437 LLVMTypeRef DestTy, const char *Name);
438LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
439 LLVMTypeRef DestTy, const char *Name);
440LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
441 LLVMTypeRef DestTy, const char *Name);
442LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
443 LLVMTypeRef DestTy, const char *Name);
444LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
445 LLVMTypeRef DestTy, const char *Name);
446LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
447 LLVMTypeRef DestTy, const char *Name);
448LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
449 LLVMTypeRef DestTy, const char *Name);
450LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
451 LLVMTypeRef DestTy, const char *Name);
452LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
453 LLVMTypeRef DestTy, const char *Name);
454LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
455 LLVMTypeRef DestTy, const char *Name);
456
457/* Comparisons */
458LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
459 LLVMValueRef LHS, LLVMValueRef RHS,
460 const char *Name);
461LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
462 LLVMValueRef LHS, LLVMValueRef RHS,
463 const char *Name);
464
465/* Miscellaneous instructions */
466LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
467LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
468 LLVMValueRef *Args, unsigned NumArgs,
469 const char *Name);
470LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
471 LLVMValueRef Then, LLVMValueRef Else,
472 const char *Name);
473LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
474 const char *Name);
475LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
476 LLVMValueRef Index, const char *Name);
477LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
478 LLVMValueRef EltVal, LLVMValueRef Index,
479 const char *Name);
480LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
481 LLVMValueRef V2, LLVMValueRef Mask,
482 const char *Name);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000483
484#ifdef __cplusplus
485}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000486
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000487namespace llvm {
488 /* Opaque module conversions
489 */
490 inline Module *unwrap(LLVMModuleRef M) {
491 return reinterpret_cast<Module*>(M);
492 }
493
494 inline LLVMModuleRef wrap(Module *M) {
495 return reinterpret_cast<LLVMModuleRef>(M);
496 }
497
498 /* Opaque type conversions
499 */
500 inline Type *unwrap(LLVMTypeRef Ty) {
501 return reinterpret_cast<Type*>(Ty);
502 }
503
504 template<typename T>
505 inline T *unwrap(LLVMTypeRef Ty) {
506 return cast<T>(unwrap(Ty));
507 }
508
509 inline Type **unwrap(LLVMTypeRef* Tys) {
510 return reinterpret_cast<Type**>(Tys);
511 }
512
513 inline LLVMTypeRef wrap(const Type *Ty) {
514 return reinterpret_cast<LLVMTypeRef>(const_cast<Type*>(Ty));
515 }
516
517 inline LLVMTypeRef *wrap(const Type **Tys) {
518 return reinterpret_cast<LLVMTypeRef*>(const_cast<Type**>(Tys));
519 }
520
521 /* Opaque value conversions
522 */
523 inline Value *unwrap(LLVMValueRef Val) {
524 return reinterpret_cast<Value*>(Val);
525 }
526
527 template<typename T>
528 inline T *unwrap(LLVMValueRef Val) {
529 return cast<T>(unwrap(Val));
530 }
531
532 inline Value **unwrap(LLVMValueRef *Vals) {
533 return reinterpret_cast<Value**>(Vals);
534 }
535
536 template<typename T>
537 inline T **unwrap(LLVMValueRef *Vals, unsigned Length) {
538 #if DEBUG
539 for (LLVMValueRef *I = Vals, E = Vals + Length; I != E; ++I)
540 cast<T>(*I);
541 #endif
542 return reinterpret_cast<T**>(Vals);
543 }
544
545 inline LLVMValueRef wrap(const Value *Val) {
546 return reinterpret_cast<LLVMValueRef>(const_cast<Value*>(Val));
547 }
548
549 inline LLVMValueRef *wrap(const Value **Vals) {
550 return reinterpret_cast<LLVMValueRef*>(const_cast<Value**>(Vals));
551 }
552
553 /* Basic block conversions
554 */
555 inline BasicBlock *unwrap(LLVMBasicBlockRef BBRef) {
556 return reinterpret_cast<BasicBlock*>(BBRef);
557 }
558
559 inline LLVMBasicBlockRef wrap(const BasicBlock *BB) {
560 return reinterpret_cast<LLVMBasicBlockRef>(const_cast<BasicBlock*>(BB));
561 }
562
563 /* Opaque builder conversions.
564 */
565 inline LLVMBuilder *unwrap(LLVMBuilderRef B) {
566 return reinterpret_cast<LLVMBuilder*>(B);
567 }
568
569 inline LLVMBuilderRef wrap(LLVMBuilder *B) {
570 return reinterpret_cast<LLVMBuilderRef>(B);
571 }
Gordon Henriksenffb48762007-10-07 00:13:35 +0000572
573 /* Opaque type handle conversions.
574 */
575 inline PATypeHolder *unwrap(LLVMTypeHandleRef B) {
576 return reinterpret_cast<PATypeHolder*>(B);
577 }
578
579 inline LLVMTypeHandleRef wrap(PATypeHolder *B) {
580 return reinterpret_cast<LLVMTypeHandleRef>(B);
581 }
Gordon Henriksen7330acd2007-10-05 23:59:36 +0000582}
583
584#endif /* !defined(__cplusplus) */
585
586#endif /* !defined(LLVM_C_CORE_H) */