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