blob: 87099a6c4e13799bbce6e6518c7032a3b7cf5753 [file] [log] [blame]
Gordon Henriksen76a03742007-09-18 03:18:57 +00001//===-- Core.cpp ----------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Gordon Henriksen76a03742007-09-18 03:18:57 +00007//
8//===----------------------------------------------------------------------===//
9//
Owen Anderson44621e42010-10-07 19:51:21 +000010// This file implements the common infrastructure (including the C bindings)
11// for libLLVMCore.a, which implements the LLVM intermediate representation.
Gordon Henriksen76a03742007-09-18 03:18:57 +000012//
13//===----------------------------------------------------------------------===//
14
15#include "llvm-c/Core.h"
16#include "llvm/Bitcode/ReaderWriter.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000017#include "llvm/IR/Attributes.h"
Chandler Carruth219b89b2014-03-04 11:01:28 +000018#include "llvm/IR/CallSite.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000019#include "llvm/IR/Constants.h"
Rafael Espindolaa6e9c3e2014-06-12 17:38:55 +000020#include "llvm/IR/DerivedTypes.h"
Tom Stellard1580dc72014-04-16 17:45:04 +000021#include "llvm/IR/DiagnosticInfo.h"
22#include "llvm/IR/DiagnosticPrinter.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000023#include "llvm/IR/GlobalAlias.h"
24#include "llvm/IR/GlobalVariable.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000025#include "llvm/IR/IRBuilder.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000026#include "llvm/IR/InlineAsm.h"
27#include "llvm/IR/IntrinsicInst.h"
28#include "llvm/IR/LLVMContext.h"
Filip Pizlodec20e42013-05-01 20:59:00 +000029#include "llvm/IR/Module.h"
Dan Gohman093b42f2010-08-07 00:43:20 +000030#include "llvm/PassManager.h"
Jeffrey Yasskin091217b2010-01-27 20:34:15 +000031#include "llvm/Support/Debug.h"
Torok Edwin56d06592009-07-11 20:10:48 +000032#include "llvm/Support/ErrorHandling.h"
Benjamin Kramerd59664f2014-04-29 23:26:49 +000033#include "llvm/Support/FileSystem.h"
Duncan Sands1cba0a82013-02-17 16:35:51 +000034#include "llvm/Support/ManagedStatic.h"
Jeffrey Yasskin091217b2010-01-27 20:34:15 +000035#include "llvm/Support/MemoryBuffer.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000036#include "llvm/Support/Threading.h"
Jeffrey Yasskin091217b2010-01-27 20:34:15 +000037#include "llvm/Support/raw_ostream.h"
Gordon Henriksen76a03742007-09-18 03:18:57 +000038#include <cassert>
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000039#include <cstdlib>
Anton Korobeynikov579f0712008-02-20 11:08:44 +000040#include <cstring>
Rafael Espindolaa6e9c3e2014-06-12 17:38:55 +000041#include <system_error>
Gordon Henriksen76a03742007-09-18 03:18:57 +000042
43using namespace llvm;
44
Chandler Carruthe96dd892014-04-21 22:55:11 +000045#define DEBUG_TYPE "ir"
46
Owen Anderson44621e42010-10-07 19:51:21 +000047void llvm::initializeCore(PassRegistry &Registry) {
Chandler Carruth73523022014-01-13 13:07:17 +000048 initializeDominatorTreeWrapperPassPass(Registry);
Chandler Carruth52eef882014-01-12 12:15:39 +000049 initializePrintModulePassWrapperPass(Registry);
50 initializePrintFunctionPassWrapperPass(Registry);
Sergei Larincd1201b2013-02-08 23:37:41 +000051 initializePrintBasicBlockPassPass(Registry);
Chandler Carruth4d356312014-01-20 11:34:08 +000052 initializeVerifierLegacyPassPass(Registry);
Owen Anderson44621e42010-10-07 19:51:21 +000053}
54
55void LLVMInitializeCore(LLVMPassRegistryRef R) {
56 initializeCore(*unwrap(R));
57}
Gordon Henriksen76a03742007-09-18 03:18:57 +000058
Duncan Sands1cba0a82013-02-17 16:35:51 +000059void LLVMShutdown() {
60 llvm_shutdown();
61}
62
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000063/*===-- Error handling ----------------------------------------------------===*/
64
Filip Pizlo3fdbaff2013-05-22 02:46:43 +000065char *LLVMCreateMessage(const char *Message) {
66 return strdup(Message);
67}
68
Gordon Henriksen34eb6d82007-12-19 22:30:40 +000069void LLVMDisposeMessage(char *Message) {
70 free(Message);
71}
72
73
Owen Anderson6773d382009-07-01 16:58:40 +000074/*===-- Operations on contexts --------------------------------------------===*/
75
76LLVMContextRef LLVMContextCreate() {
77 return wrap(new LLVMContext());
78}
79
Owen Andersonf7691d32009-07-02 00:16:38 +000080LLVMContextRef LLVMGetGlobalContext() {
81 return wrap(&getGlobalContext());
82}
83
Tom Stellard1580dc72014-04-16 17:45:04 +000084void LLVMContextSetDiagnosticHandler(LLVMContextRef C,
85 LLVMDiagnosticHandler Handler,
86 void *DiagnosticContext) {
87 unwrap(C)->setDiagnosticHandler(
88 LLVM_EXTENSION reinterpret_cast<LLVMContext::DiagnosticHandlerTy>(Handler),
89 DiagnosticContext);
90}
91
Juergen Ributzka34390c72014-05-16 02:33:15 +000092void LLVMContextSetYieldCallback(LLVMContextRef C, LLVMYieldCallback Callback,
93 void *OpaqueHandle) {
94 auto YieldCallback =
95 LLVM_EXTENSION reinterpret_cast<LLVMContext::YieldCallbackTy>(Callback);
96 unwrap(C)->setYieldCallback(YieldCallback, OpaqueHandle);
97}
98
Owen Anderson6773d382009-07-01 16:58:40 +000099void LLVMContextDispose(LLVMContextRef C) {
100 delete unwrap(C);
101}
102
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000103unsigned LLVMGetMDKindIDInContext(LLVMContextRef C, const char* Name,
104 unsigned SLen) {
105 return unwrap(C)->getMDKindID(StringRef(Name, SLen));
106}
107
108unsigned LLVMGetMDKindID(const char* Name, unsigned SLen) {
109 return LLVMGetMDKindIDInContext(LLVMGetGlobalContext(), Name, SLen);
110}
111
Tom Stellard1580dc72014-04-16 17:45:04 +0000112char *LLVMGetDiagInfoDescription(LLVMDiagnosticInfoRef DI) {
Alp Tokere69170a2014-06-26 22:52:05 +0000113 std::string MsgStorage;
114 raw_string_ostream Stream(MsgStorage);
115 DiagnosticPrinterRawOStream DP(Stream);
116
Tom Stellard1580dc72014-04-16 17:45:04 +0000117 unwrap(DI)->print(DP);
Alp Tokere69170a2014-06-26 22:52:05 +0000118 Stream.flush();
119
120 return LLVMCreateMessage(MsgStorage.c_str());
Tom Stellard1580dc72014-04-16 17:45:04 +0000121}
122
123LLVMDiagnosticSeverity LLVMGetDiagInfoSeverity(LLVMDiagnosticInfoRef DI){
124 LLVMDiagnosticSeverity severity;
125
126 switch(unwrap(DI)->getSeverity()) {
127 default:
128 severity = LLVMDSError;
129 break;
130 case DS_Warning:
131 severity = LLVMDSWarning;
132 break;
133 case DS_Remark:
134 severity = LLVMDSRemark;
135 break;
136 case DS_Note:
137 severity = LLVMDSNote;
138 break;
139 }
140
141 return severity;
142}
143
144
145
Owen Anderson6773d382009-07-01 16:58:40 +0000146
Gordon Henriksen76a03742007-09-18 03:18:57 +0000147/*===-- Operations on modules ---------------------------------------------===*/
148
Owen Anderson31d44e42009-07-02 07:17:57 +0000149LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID) {
150 return wrap(new Module(ModuleID, getGlobalContext()));
151}
152
Andrew Trickdc073ad2013-09-18 23:31:10 +0000153LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID,
Owen Anderson31d44e42009-07-02 07:17:57 +0000154 LLVMContextRef C) {
Owen Anderson1cf085d2009-07-01 21:22:36 +0000155 return wrap(new Module(ModuleID, *unwrap(C)));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000156}
157
158void LLVMDisposeModule(LLVMModuleRef M) {
159 delete unwrap(M);
160}
161
Gordon Henriksen05568bb2007-12-27 20:13:47 +0000162/*--.. Data layout .........................................................--*/
163const char * LLVMGetDataLayout(LLVMModuleRef M) {
Rafael Espindolaf863ee22014-02-25 20:01:08 +0000164 return unwrap(M)->getDataLayoutStr().c_str();
Gordon Henriksen05568bb2007-12-27 20:13:47 +0000165}
166
167void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple) {
168 unwrap(M)->setDataLayout(Triple);
169}
170
171/*--.. Target triple .......................................................--*/
172const char * LLVMGetTarget(LLVMModuleRef M) {
173 return unwrap(M)->getTargetTriple().c_str();
174}
175
176void LLVMSetTarget(LLVMModuleRef M, const char *Triple) {
177 unwrap(M)->setTargetTriple(Triple);
178}
179
Gordon Henriksen6c6075e2008-03-14 23:58:56 +0000180void LLVMDumpModule(LLVMModuleRef M) {
181 unwrap(M)->dump();
182}
183
Hans Wennborgb7ef2fe2012-05-09 16:54:17 +0000184LLVMBool LLVMPrintModuleToFile(LLVMModuleRef M, const char *Filename,
185 char **ErrorMessage) {
186 std::string error;
Rafael Espindola90c7f1c2014-02-24 18:20:12 +0000187 raw_fd_ostream dest(Filename, error, sys::fs::F_Text);
Hans Wennborgb7ef2fe2012-05-09 16:54:17 +0000188 if (!error.empty()) {
189 *ErrorMessage = strdup(error.c_str());
190 return true;
191 }
192
Craig Topperc6207612014-04-09 06:08:46 +0000193 unwrap(M)->print(dest, nullptr);
Hans Wennborgb7ef2fe2012-05-09 16:54:17 +0000194
195 if (!error.empty()) {
196 *ErrorMessage = strdup(error.c_str());
197 return true;
198 }
199 dest.flush();
200 return false;
201}
202
Anders Waldenborg84355db2013-10-16 18:00:54 +0000203char *LLVMPrintModuleToString(LLVMModuleRef M) {
Alp Tokere69170a2014-06-26 22:52:05 +0000204 std::string buf;
205 raw_string_ostream os(buf);
206
Craig Topperc6207612014-04-09 06:08:46 +0000207 unwrap(M)->print(os, nullptr);
Alp Tokere69170a2014-06-26 22:52:05 +0000208 os.flush();
209
210 return strdup(buf.c_str());
Anders Waldenborg84355db2013-10-16 18:00:54 +0000211}
212
Chris Lattner26941452010-04-10 17:52:58 +0000213/*--.. Operations on inline assembler ......................................--*/
214void LLVMSetModuleInlineAsm(LLVMModuleRef M, const char *Asm) {
215 unwrap(M)->setModuleInlineAsm(StringRef(Asm));
216}
217
Gordon Henriksen76a03742007-09-18 03:18:57 +0000218
Chris Lattnera7e04b02010-11-28 20:03:44 +0000219/*--.. Operations on module contexts ......................................--*/
220LLVMContextRef LLVMGetModuleContext(LLVMModuleRef M) {
221 return wrap(&unwrap(M)->getContext());
222}
223
224
Gordon Henriksen76a03742007-09-18 03:18:57 +0000225/*===-- Operations on types -----------------------------------------------===*/
226
227/*--.. Operations on all types (mostly) ....................................--*/
228
229LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty) {
Chris Lattnerdac44ec2009-07-15 22:00:31 +0000230 switch (unwrap(Ty)->getTypeID()) {
231 case Type::VoidTyID:
232 return LLVMVoidTypeKind;
Dan Gohman518cda42011-12-17 00:04:22 +0000233 case Type::HalfTyID:
234 return LLVMHalfTypeKind;
Chris Lattnerdac44ec2009-07-15 22:00:31 +0000235 case Type::FloatTyID:
236 return LLVMFloatTypeKind;
237 case Type::DoubleTyID:
238 return LLVMDoubleTypeKind;
239 case Type::X86_FP80TyID:
240 return LLVMX86_FP80TypeKind;
241 case Type::FP128TyID:
242 return LLVMFP128TypeKind;
243 case Type::PPC_FP128TyID:
244 return LLVMPPC_FP128TypeKind;
245 case Type::LabelTyID:
246 return LLVMLabelTypeKind;
247 case Type::MetadataTyID:
248 return LLVMMetadataTypeKind;
249 case Type::IntegerTyID:
250 return LLVMIntegerTypeKind;
251 case Type::FunctionTyID:
252 return LLVMFunctionTypeKind;
253 case Type::StructTyID:
254 return LLVMStructTypeKind;
255 case Type::ArrayTyID:
256 return LLVMArrayTypeKind;
257 case Type::PointerTyID:
258 return LLVMPointerTypeKind;
Chris Lattnerdac44ec2009-07-15 22:00:31 +0000259 case Type::VectorTyID:
260 return LLVMVectorTypeKind;
Dale Johannesenbaa5d042010-09-10 20:55:01 +0000261 case Type::X86_MMXTyID:
262 return LLVMX86_MMXTypeKind;
Chris Lattnerdac44ec2009-07-15 22:00:31 +0000263 }
Rafael Espindolaba7df702013-12-07 02:27:52 +0000264 llvm_unreachable("Unhandled TypeID.");
Gordon Henriksen76a03742007-09-18 03:18:57 +0000265}
266
Torok Edwin1cd9ade2011-10-06 12:13:28 +0000267LLVMBool LLVMTypeIsSized(LLVMTypeRef Ty)
268{
269 return unwrap(Ty)->isSized();
270}
271
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000272LLVMContextRef LLVMGetTypeContext(LLVMTypeRef Ty) {
273 return wrap(&unwrap(Ty)->getContext());
274}
275
Anders Waldenborgb822cff2013-10-16 21:30:25 +0000276void LLVMDumpType(LLVMTypeRef Ty) {
277 return unwrap(Ty)->dump();
278}
279
Anders Waldenborg47b3bd32013-10-22 06:58:34 +0000280char *LLVMPrintTypeToString(LLVMTypeRef Ty) {
Alp Tokere69170a2014-06-26 22:52:05 +0000281 std::string buf;
282 raw_string_ostream os(buf);
Anders Waldenborg47b3bd32013-10-22 06:58:34 +0000283
Richard Trieuc1485222014-06-21 02:43:02 +0000284 if (unwrap(Ty))
285 unwrap(Ty)->print(os);
286 else
287 os << "Printing <null> Type";
288
Alp Tokere69170a2014-06-26 22:52:05 +0000289 os.flush();
290
291 return strdup(buf.c_str());
Anders Waldenborg47b3bd32013-10-22 06:58:34 +0000292}
293
Gordon Henriksen76a03742007-09-18 03:18:57 +0000294/*--.. Operations on integer types .........................................--*/
295
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000296LLVMTypeRef LLVMInt1TypeInContext(LLVMContextRef C) {
297 return (LLVMTypeRef) Type::getInt1Ty(*unwrap(C));
Owen Anderson55f1c092009-08-13 21:58:54 +0000298}
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000299LLVMTypeRef LLVMInt8TypeInContext(LLVMContextRef C) {
300 return (LLVMTypeRef) Type::getInt8Ty(*unwrap(C));
Owen Anderson55f1c092009-08-13 21:58:54 +0000301}
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000302LLVMTypeRef LLVMInt16TypeInContext(LLVMContextRef C) {
303 return (LLVMTypeRef) Type::getInt16Ty(*unwrap(C));
Owen Anderson55f1c092009-08-13 21:58:54 +0000304}
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000305LLVMTypeRef LLVMInt32TypeInContext(LLVMContextRef C) {
306 return (LLVMTypeRef) Type::getInt32Ty(*unwrap(C));
Owen Anderson55f1c092009-08-13 21:58:54 +0000307}
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000308LLVMTypeRef LLVMInt64TypeInContext(LLVMContextRef C) {
309 return (LLVMTypeRef) Type::getInt64Ty(*unwrap(C));
310}
311LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits) {
312 return wrap(IntegerType::get(*unwrap(C), NumBits));
Owen Anderson55f1c092009-08-13 21:58:54 +0000313}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000314
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000315LLVMTypeRef LLVMInt1Type(void) {
316 return LLVMInt1TypeInContext(LLVMGetGlobalContext());
317}
318LLVMTypeRef LLVMInt8Type(void) {
319 return LLVMInt8TypeInContext(LLVMGetGlobalContext());
320}
321LLVMTypeRef LLVMInt16Type(void) {
322 return LLVMInt16TypeInContext(LLVMGetGlobalContext());
323}
324LLVMTypeRef LLVMInt32Type(void) {
325 return LLVMInt32TypeInContext(LLVMGetGlobalContext());
326}
327LLVMTypeRef LLVMInt64Type(void) {
328 return LLVMInt64TypeInContext(LLVMGetGlobalContext());
329}
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000330LLVMTypeRef LLVMIntType(unsigned NumBits) {
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000331 return LLVMIntTypeInContext(LLVMGetGlobalContext(), NumBits);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000332}
333
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000334unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy) {
Gordon Henriksen76a03742007-09-18 03:18:57 +0000335 return unwrap<IntegerType>(IntegerTy)->getBitWidth();
336}
337
338/*--.. Operations on real types ............................................--*/
339
Dan Gohman518cda42011-12-17 00:04:22 +0000340LLVMTypeRef LLVMHalfTypeInContext(LLVMContextRef C) {
341 return (LLVMTypeRef) Type::getHalfTy(*unwrap(C));
342}
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000343LLVMTypeRef LLVMFloatTypeInContext(LLVMContextRef C) {
344 return (LLVMTypeRef) Type::getFloatTy(*unwrap(C));
345}
346LLVMTypeRef LLVMDoubleTypeInContext(LLVMContextRef C) {
347 return (LLVMTypeRef) Type::getDoubleTy(*unwrap(C));
348}
349LLVMTypeRef LLVMX86FP80TypeInContext(LLVMContextRef C) {
350 return (LLVMTypeRef) Type::getX86_FP80Ty(*unwrap(C));
351}
352LLVMTypeRef LLVMFP128TypeInContext(LLVMContextRef C) {
353 return (LLVMTypeRef) Type::getFP128Ty(*unwrap(C));
354}
355LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C) {
356 return (LLVMTypeRef) Type::getPPC_FP128Ty(*unwrap(C));
357}
Dale Johannesenbaa5d042010-09-10 20:55:01 +0000358LLVMTypeRef LLVMX86MMXTypeInContext(LLVMContextRef C) {
359 return (LLVMTypeRef) Type::getX86_MMXTy(*unwrap(C));
360}
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000361
Dan Gohman518cda42011-12-17 00:04:22 +0000362LLVMTypeRef LLVMHalfType(void) {
363 return LLVMHalfTypeInContext(LLVMGetGlobalContext());
364}
Owen Anderson55f1c092009-08-13 21:58:54 +0000365LLVMTypeRef LLVMFloatType(void) {
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000366 return LLVMFloatTypeInContext(LLVMGetGlobalContext());
Owen Anderson55f1c092009-08-13 21:58:54 +0000367}
368LLVMTypeRef LLVMDoubleType(void) {
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000369 return LLVMDoubleTypeInContext(LLVMGetGlobalContext());
Owen Anderson55f1c092009-08-13 21:58:54 +0000370}
371LLVMTypeRef LLVMX86FP80Type(void) {
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000372 return LLVMX86FP80TypeInContext(LLVMGetGlobalContext());
Owen Anderson55f1c092009-08-13 21:58:54 +0000373}
374LLVMTypeRef LLVMFP128Type(void) {
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000375 return LLVMFP128TypeInContext(LLVMGetGlobalContext());
Owen Anderson55f1c092009-08-13 21:58:54 +0000376}
377LLVMTypeRef LLVMPPCFP128Type(void) {
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000378 return LLVMPPCFP128TypeInContext(LLVMGetGlobalContext());
Owen Anderson55f1c092009-08-13 21:58:54 +0000379}
Dale Johannesenbaa5d042010-09-10 20:55:01 +0000380LLVMTypeRef LLVMX86MMXType(void) {
381 return LLVMX86MMXTypeInContext(LLVMGetGlobalContext());
382}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000383
384/*--.. Operations on function types ........................................--*/
385
Gordon Henriksened7beaa2007-10-06 16:05:20 +0000386LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
387 LLVMTypeRef *ParamTypes, unsigned ParamCount,
Chris Lattner25963c62010-01-09 22:27:07 +0000388 LLVMBool IsVarArg) {
Frits van Bommel78ee70b2011-07-14 11:44:09 +0000389 ArrayRef<Type*> Tys(unwrap(ParamTypes), ParamCount);
Owen Anderson4056ca92009-07-29 22:17:13 +0000390 return wrap(FunctionType::get(unwrap(ReturnType), Tys, IsVarArg != 0));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000391}
392
Chris Lattner25963c62010-01-09 22:27:07 +0000393LLVMBool LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy) {
Gordon Henriksen76a03742007-09-18 03:18:57 +0000394 return unwrap<FunctionType>(FunctionTy)->isVarArg();
395}
396
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000397LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy) {
Gordon Henriksen76a03742007-09-18 03:18:57 +0000398 return wrap(unwrap<FunctionType>(FunctionTy)->getReturnType());
399}
400
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000401unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy) {
Gordon Henriksen76a03742007-09-18 03:18:57 +0000402 return unwrap<FunctionType>(FunctionTy)->getNumParams();
403}
404
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000405void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest) {
Gordon Henriksen76a03742007-09-18 03:18:57 +0000406 FunctionType *Ty = unwrap<FunctionType>(FunctionTy);
407 for (FunctionType::param_iterator I = Ty->param_begin(),
408 E = Ty->param_end(); I != E; ++I)
409 *Dest++ = wrap(*I);
410}
411
412/*--.. Operations on struct types ..........................................--*/
413
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000414LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
Chris Lattner25963c62010-01-09 22:27:07 +0000415 unsigned ElementCount, LLVMBool Packed) {
Frits van Bommel78ee70b2011-07-14 11:44:09 +0000416 ArrayRef<Type*> Tys(unwrap(ElementTypes), ElementCount);
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000417 return wrap(StructType::get(*unwrap(C), Tys, Packed != 0));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000418}
419
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000420LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes,
Chris Lattner25963c62010-01-09 22:27:07 +0000421 unsigned ElementCount, LLVMBool Packed) {
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000422 return LLVMStructTypeInContext(LLVMGetGlobalContext(), ElementTypes,
423 ElementCount, Packed);
424}
425
Chris Lattnere71ccde2011-07-14 05:53:17 +0000426LLVMTypeRef LLVMStructCreateNamed(LLVMContextRef C, const char *Name)
427{
Chris Lattner01beceb2011-08-12 18:07:07 +0000428 return wrap(StructType::create(*unwrap(C), Name));
Chris Lattnere71ccde2011-07-14 05:53:17 +0000429}
430
Torok Edwin0d5f6ae2011-10-06 12:12:50 +0000431const char *LLVMGetStructName(LLVMTypeRef Ty)
432{
Torok Edwin2e9affe2011-10-14 20:37:42 +0000433 StructType *Type = unwrap<StructType>(Ty);
434 if (!Type->hasName())
Craig Topperc6207612014-04-09 06:08:46 +0000435 return nullptr;
Torok Edwin2e9affe2011-10-14 20:37:42 +0000436 return Type->getName().data();
Torok Edwin0d5f6ae2011-10-06 12:12:50 +0000437}
438
Chris Lattnere71ccde2011-07-14 05:53:17 +0000439void LLVMStructSetBody(LLVMTypeRef StructTy, LLVMTypeRef *ElementTypes,
440 unsigned ElementCount, LLVMBool Packed) {
Frits van Bommel78ee70b2011-07-14 11:44:09 +0000441 ArrayRef<Type*> Tys(unwrap(ElementTypes), ElementCount);
Chris Lattnere71ccde2011-07-14 05:53:17 +0000442 unwrap<StructType>(StructTy)->setBody(Tys, Packed != 0);
443}
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000444
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000445unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy) {
Gordon Henriksen76a03742007-09-18 03:18:57 +0000446 return unwrap<StructType>(StructTy)->getNumElements();
447}
448
449void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest) {
450 StructType *Ty = unwrap<StructType>(StructTy);
Nick Lewyckyf735b7b2011-04-20 22:52:37 +0000451 for (StructType::element_iterator I = Ty->element_begin(),
Gordon Henriksen76a03742007-09-18 03:18:57 +0000452 E = Ty->element_end(); I != E; ++I)
453 *Dest++ = wrap(*I);
454}
455
Chris Lattner25963c62010-01-09 22:27:07 +0000456LLVMBool LLVMIsPackedStruct(LLVMTypeRef StructTy) {
Gordon Henriksen76a03742007-09-18 03:18:57 +0000457 return unwrap<StructType>(StructTy)->isPacked();
458}
459
Chris Lattner17cf05b2011-07-14 16:20:28 +0000460LLVMBool LLVMIsOpaqueStruct(LLVMTypeRef StructTy) {
461 return unwrap<StructType>(StructTy)->isOpaque();
462}
463
464LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name) {
465 return wrap(unwrap(M)->getTypeByName(Name));
466}
467
Gordon Henriksen76a03742007-09-18 03:18:57 +0000468/*--.. Operations on array, pointer, and vector types (sequence types) .....--*/
469
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000470LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount) {
Owen Anderson4056ca92009-07-29 22:17:13 +0000471 return wrap(ArrayType::get(unwrap(ElementType), ElementCount));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000472}
473
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000474LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace) {
Owen Anderson4056ca92009-07-29 22:17:13 +0000475 return wrap(PointerType::get(unwrap(ElementType), AddressSpace));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000476}
477
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000478LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount) {
Owen Anderson4056ca92009-07-29 22:17:13 +0000479 return wrap(VectorType::get(unwrap(ElementType), ElementCount));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000480}
481
482LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty) {
483 return wrap(unwrap<SequentialType>(Ty)->getElementType());
484}
485
486unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy) {
487 return unwrap<ArrayType>(ArrayTy)->getNumElements();
488}
489
Gordon Henriksen5a3fe032007-12-17 16:08:32 +0000490unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy) {
491 return unwrap<PointerType>(PointerTy)->getAddressSpace();
492}
493
Gordon Henriksen76a03742007-09-18 03:18:57 +0000494unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy) {
495 return unwrap<VectorType>(VectorTy)->getNumElements();
496}
497
498/*--.. Operations on other types ...........................................--*/
499
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000500LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C) {
501 return wrap(Type::getVoidTy(*unwrap(C)));
Owen Anderson55f1c092009-08-13 21:58:54 +0000502}
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000503LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C) {
504 return wrap(Type::getLabelTy(*unwrap(C)));
505}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000506
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000507LLVMTypeRef LLVMVoidType(void) {
508 return LLVMVoidTypeInContext(LLVMGetGlobalContext());
509}
510LLVMTypeRef LLVMLabelType(void) {
511 return LLVMLabelTypeInContext(LLVMGetGlobalContext());
512}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000513
514/*===-- Operations on values ----------------------------------------------===*/
515
516/*--.. Operations on all values ............................................--*/
517
Gordon Henriksenc23b66c2007-09-26 20:56:12 +0000518LLVMTypeRef LLVMTypeOf(LLVMValueRef Val) {
Gordon Henriksen76a03742007-09-18 03:18:57 +0000519 return wrap(unwrap(Val)->getType());
520}
521
522const char *LLVMGetValueName(LLVMValueRef Val) {
Daniel Dunbar9813b0b2009-07-26 07:49:05 +0000523 return unwrap(Val)->getName().data();
Gordon Henriksen76a03742007-09-18 03:18:57 +0000524}
525
526void LLVMSetValueName(LLVMValueRef Val, const char *Name) {
527 unwrap(Val)->setName(Name);
528}
529
Gordon Henriksen1d0d24c2007-10-06 00:08:49 +0000530void LLVMDumpValue(LLVMValueRef Val) {
531 unwrap(Val)->dump();
532}
533
Peter Zotovcd93b372013-11-06 09:21:01 +0000534char* LLVMPrintValueToString(LLVMValueRef Val) {
Alp Tokere69170a2014-06-26 22:52:05 +0000535 std::string buf;
536 raw_string_ostream os(buf);
Peter Zotovcd93b372013-11-06 09:21:01 +0000537
Richard Trieuc1485222014-06-21 02:43:02 +0000538 if (unwrap(Val))
539 unwrap(Val)->print(os);
540 else
541 os << "Printing <null> Value";
542
Alp Tokere69170a2014-06-26 22:52:05 +0000543 os.flush();
544
545 return strdup(buf.c_str());
Peter Zotovcd93b372013-11-06 09:21:01 +0000546}
547
Chris Lattner40cf28d2009-10-12 04:01:02 +0000548void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal) {
549 unwrap(OldVal)->replaceAllUsesWith(unwrap(NewVal));
550}
Gordon Henriksen29e38942008-12-19 18:39:45 +0000551
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000552int LLVMHasMetadata(LLVMValueRef Inst) {
553 return unwrap<Instruction>(Inst)->hasMetadata();
554}
555
556LLVMValueRef LLVMGetMetadata(LLVMValueRef Inst, unsigned KindID) {
557 return wrap(unwrap<Instruction>(Inst)->getMetadata(KindID));
558}
559
560void LLVMSetMetadata(LLVMValueRef Inst, unsigned KindID, LLVMValueRef MD) {
Craig Topperc6207612014-04-09 06:08:46 +0000561 unwrap<Instruction>(Inst)->setMetadata(KindID,
562 MD ? unwrap<MDNode>(MD) : nullptr);
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000563}
564
Gordon Henriksen29e38942008-12-19 18:39:45 +0000565/*--.. Conversion functions ................................................--*/
566
567#define LLVM_DEFINE_VALUE_CAST(name) \
568 LLVMValueRef LLVMIsA##name(LLVMValueRef Val) { \
569 return wrap(static_cast<Value*>(dyn_cast_or_null<name>(unwrap(Val)))); \
570 }
571
572LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DEFINE_VALUE_CAST)
573
Chris Lattner40cf28d2009-10-12 04:01:02 +0000574/*--.. Operations on Uses ..................................................--*/
Erick Tryzelaar9f9857e2010-03-02 20:32:28 +0000575LLVMUseRef LLVMGetFirstUse(LLVMValueRef Val) {
Chris Lattner40cf28d2009-10-12 04:01:02 +0000576 Value *V = unwrap(Val);
577 Value::use_iterator I = V->use_begin();
578 if (I == V->use_end())
Craig Topperc6207612014-04-09 06:08:46 +0000579 return nullptr;
Chandler Carruthcdf47882014-03-09 03:16:01 +0000580 return wrap(&*I);
Chris Lattner40cf28d2009-10-12 04:01:02 +0000581}
582
Erick Tryzelaar9f9857e2010-03-02 20:32:28 +0000583LLVMUseRef LLVMGetNextUse(LLVMUseRef U) {
584 Use *Next = unwrap(U)->getNext();
585 if (Next)
586 return wrap(Next);
Craig Topperc6207612014-04-09 06:08:46 +0000587 return nullptr;
Chris Lattner40cf28d2009-10-12 04:01:02 +0000588}
589
Erick Tryzelaar9f9857e2010-03-02 20:32:28 +0000590LLVMValueRef LLVMGetUser(LLVMUseRef U) {
591 return wrap(unwrap(U)->getUser());
Chris Lattner40cf28d2009-10-12 04:01:02 +0000592}
593
Erick Tryzelaar9f9857e2010-03-02 20:32:28 +0000594LLVMValueRef LLVMGetUsedValue(LLVMUseRef U) {
595 return wrap(unwrap(U)->get());
Chris Lattner40cf28d2009-10-12 04:01:02 +0000596}
597
598/*--.. Operations on Users .................................................--*/
599LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index) {
Torok Edwinfec812e2011-10-06 12:13:11 +0000600 Value *V = unwrap(Val);
601 if (MDNode *MD = dyn_cast<MDNode>(V))
602 return wrap(MD->getOperand(Index));
603 return wrap(cast<User>(V)->getOperand(Index));
Chris Lattner40cf28d2009-10-12 04:01:02 +0000604}
Gordon Henriksen29e38942008-12-19 18:39:45 +0000605
Erick Tryzelaarb4d48702010-08-20 14:51:22 +0000606void LLVMSetOperand(LLVMValueRef Val, unsigned Index, LLVMValueRef Op) {
607 unwrap<User>(Val)->setOperand(Index, unwrap(Op));
608}
609
610int LLVMGetNumOperands(LLVMValueRef Val) {
Torok Edwinfec812e2011-10-06 12:13:11 +0000611 Value *V = unwrap(Val);
612 if (MDNode *MD = dyn_cast<MDNode>(V))
613 return MD->getNumOperands();
614 return cast<User>(V)->getNumOperands();
Erick Tryzelaarb4d48702010-08-20 14:51:22 +0000615}
616
Gordon Henriksen76a03742007-09-18 03:18:57 +0000617/*--.. Operations on constants of any type .................................--*/
618
Gordon Henriksen1046c732007-10-06 15:11:06 +0000619LLVMValueRef LLVMConstNull(LLVMTypeRef Ty) {
Owen Anderson5a1acd92009-07-31 20:28:14 +0000620 return wrap(Constant::getNullValue(unwrap(Ty)));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000621}
622
Gordon Henriksen1046c732007-10-06 15:11:06 +0000623LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty) {
Owen Anderson5a1acd92009-07-31 20:28:14 +0000624 return wrap(Constant::getAllOnesValue(unwrap(Ty)));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000625}
626
627LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty) {
Owen Andersonb292b8c2009-07-30 23:03:37 +0000628 return wrap(UndefValue::get(unwrap(Ty)));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000629}
630
Chris Lattner25963c62010-01-09 22:27:07 +0000631LLVMBool LLVMIsConstant(LLVMValueRef Ty) {
Gordon Henriksendc88c062007-09-18 18:07:51 +0000632 return isa<Constant>(unwrap(Ty));
633}
634
Chris Lattner25963c62010-01-09 22:27:07 +0000635LLVMBool LLVMIsNull(LLVMValueRef Val) {
Gordon Henriksen76a03742007-09-18 03:18:57 +0000636 if (Constant *C = dyn_cast<Constant>(unwrap(Val)))
637 return C->isNullValue();
638 return false;
639}
640
Chris Lattner25963c62010-01-09 22:27:07 +0000641LLVMBool LLVMIsUndef(LLVMValueRef Val) {
Gordon Henriksendc88c062007-09-18 18:07:51 +0000642 return isa<UndefValue>(unwrap(Val));
643}
644
Chris Lattner7f318242009-07-06 17:29:59 +0000645LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty) {
Owen Anderson8ec8c972009-07-07 21:33:58 +0000646 return
Owen Andersonb292b8c2009-07-30 23:03:37 +0000647 wrap(ConstantPointerNull::get(unwrap<PointerType>(Ty)));
Chris Lattner7f318242009-07-06 17:29:59 +0000648}
649
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000650/*--.. Operations on metadata nodes ........................................--*/
651
652LLVMValueRef LLVMMDStringInContext(LLVMContextRef C, const char *Str,
653 unsigned SLen) {
654 return wrap(MDString::get(*unwrap(C), StringRef(Str, SLen)));
655}
656
657LLVMValueRef LLVMMDString(const char *Str, unsigned SLen) {
658 return LLVMMDStringInContext(LLVMGetGlobalContext(), Str, SLen);
659}
660
661LLVMValueRef LLVMMDNodeInContext(LLVMContextRef C, LLVMValueRef *Vals,
662 unsigned Count) {
Jay Foad5514afe2011-04-21 19:59:31 +0000663 return wrap(MDNode::get(*unwrap(C),
Frits van Bommel717d7ed2011-07-18 12:00:32 +0000664 makeArrayRef(unwrap<Value>(Vals, Count), Count)));
Erick Tryzelaard8531fa2010-02-28 09:45:59 +0000665}
666
667LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count) {
668 return LLVMMDNodeInContext(LLVMGetGlobalContext(), Vals, Count);
669}
670
Torok Edwinfec812e2011-10-06 12:13:11 +0000671const char *LLVMGetMDString(LLVMValueRef V, unsigned* Len) {
Torok Edwin2e9affe2011-10-14 20:37:42 +0000672 if (const MDString *S = dyn_cast<MDString>(unwrap(V))) {
673 *Len = S->getString().size();
674 return S->getString().data();
675 }
676 *Len = 0;
Craig Topperc6207612014-04-09 06:08:46 +0000677 return nullptr;
Torok Edwinfec812e2011-10-06 12:13:11 +0000678}
679
Duncan Sands12ccbe72012-09-19 20:29:39 +0000680unsigned LLVMGetMDNodeNumOperands(LLVMValueRef V)
681{
682 return cast<MDNode>(unwrap(V))->getNumOperands();
683}
684
685void LLVMGetMDNodeOperands(LLVMValueRef V, LLVMValueRef *Dest)
686{
687 const MDNode *N = cast<MDNode>(unwrap(V));
688 const unsigned numOperands = N->getNumOperands();
689 for (unsigned i = 0; i < numOperands; i++)
690 Dest[i] = wrap(N->getOperand(i));
691}
692
Torok Edwinfec812e2011-10-06 12:13:11 +0000693unsigned LLVMGetNamedMetadataNumOperands(LLVMModuleRef M, const char* name)
694{
Torok Edwin2e9affe2011-10-14 20:37:42 +0000695 if (NamedMDNode *N = unwrap(M)->getNamedMetadata(name)) {
696 return N->getNumOperands();
697 }
698 return 0;
Torok Edwinfec812e2011-10-06 12:13:11 +0000699}
700
701void LLVMGetNamedMetadataOperands(LLVMModuleRef M, const char* name, LLVMValueRef *Dest)
702{
Torok Edwin2e9affe2011-10-14 20:37:42 +0000703 NamedMDNode *N = unwrap(M)->getNamedMetadata(name);
704 if (!N)
705 return;
706 for (unsigned i=0;i<N->getNumOperands();i++)
707 Dest[i] = wrap(N->getOperand(i));
Torok Edwinfec812e2011-10-06 12:13:11 +0000708}
709
Devang Patel92245402011-12-20 19:29:36 +0000710void LLVMAddNamedMetadataOperand(LLVMModuleRef M, const char* name,
711 LLVMValueRef Val)
712{
713 NamedMDNode *N = unwrap(M)->getOrInsertNamedMetadata(name);
714 if (!N)
715 return;
Craig Topperc6207612014-04-09 06:08:46 +0000716 MDNode *Op = Val ? unwrap<MDNode>(Val) : nullptr;
Devang Patel92245402011-12-20 19:29:36 +0000717 if (Op)
718 N->addOperand(Op);
719}
720
Gordon Henriksen76a03742007-09-18 03:18:57 +0000721/*--.. Operations on scalar constants ......................................--*/
722
Gordon Henriksen1046c732007-10-06 15:11:06 +0000723LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
Chris Lattner25963c62010-01-09 22:27:07 +0000724 LLVMBool SignExtend) {
Owen Andersonedb4a702009-07-24 23:12:02 +0000725 return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), N, SignExtend != 0));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000726}
727
Chris Lattner4329e072010-11-23 02:47:22 +0000728LLVMValueRef LLVMConstIntOfArbitraryPrecision(LLVMTypeRef IntTy,
729 unsigned NumWords,
730 const uint64_t Words[]) {
731 IntegerType *Ty = unwrap<IntegerType>(IntTy);
732 return wrap(ConstantInt::get(Ty->getContext(),
Jeffrey Yasskin7a162882011-07-18 21:45:40 +0000733 APInt(Ty->getBitWidth(),
734 makeArrayRef(Words, NumWords))));
Chris Lattner4329e072010-11-23 02:47:22 +0000735}
736
Erick Tryzelaardd991352009-08-16 23:36:46 +0000737LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char Str[],
738 uint8_t Radix) {
739 return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str),
740 Radix));
741}
742
743LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char Str[],
744 unsigned SLen, uint8_t Radix) {
745 return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str, SLen),
746 Radix));
Gordon Henriksen931e1212008-02-02 01:07:50 +0000747}
748
Gordon Henriksen1046c732007-10-06 15:11:06 +0000749LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N) {
Erick Tryzelaardd991352009-08-16 23:36:46 +0000750 return wrap(ConstantFP::get(unwrap(RealTy), N));
Gordon Henriksen931e1212008-02-02 01:07:50 +0000751}
752
753LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text) {
Erick Tryzelaardd991352009-08-16 23:36:46 +0000754 return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Text)));
755}
756
757LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char Str[],
758 unsigned SLen) {
759 return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Str, SLen)));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000760}
761
Chris Lattner40cf28d2009-10-12 04:01:02 +0000762unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal) {
763 return unwrap<ConstantInt>(ConstantVal)->getZExtValue();
764}
765
766long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal) {
767 return unwrap<ConstantInt>(ConstantVal)->getSExtValue();
768}
769
Gordon Henriksen76a03742007-09-18 03:18:57 +0000770/*--.. Operations on composite constants ...................................--*/
771
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000772LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
Chris Lattner25963c62010-01-09 22:27:07 +0000773 unsigned Length,
774 LLVMBool DontNullTerminate) {
Gordon Henriksen76a03742007-09-18 03:18:57 +0000775 /* Inverted the sense of AddNull because ', 0)' is a
776 better mnemonic for null termination than ', 1)'. */
Chris Lattnercf9e8f62012-02-05 02:29:43 +0000777 return wrap(ConstantDataArray::getString(*unwrap(C), StringRef(Str, Length),
778 DontNullTerminate == 0));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000779}
Andrew Trickdc073ad2013-09-18 23:31:10 +0000780LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000781 LLVMValueRef *ConstantVals,
Chris Lattner25963c62010-01-09 22:27:07 +0000782 unsigned Count, LLVMBool Packed) {
Chris Lattnercc19efa2011-06-20 04:01:31 +0000783 Constant **Elements = unwrap<Constant>(ConstantVals, Count);
Frits van Bommel717d7ed2011-07-18 12:00:32 +0000784 return wrap(ConstantStruct::getAnon(*unwrap(C), makeArrayRef(Elements, Count),
Chris Lattnercc19efa2011-06-20 04:01:31 +0000785 Packed != 0));
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000786}
Gordon Henriksen76a03742007-09-18 03:18:57 +0000787
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000788LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
Chris Lattner25963c62010-01-09 22:27:07 +0000789 LLVMBool DontNullTerminate) {
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000790 return LLVMConstStringInContext(LLVMGetGlobalContext(), Str, Length,
791 DontNullTerminate);
792}
Gordon Henriksen1046c732007-10-06 15:11:06 +0000793LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
794 LLVMValueRef *ConstantVals, unsigned Length) {
Jay Foad83be3612011-06-22 09:24:39 +0000795 ArrayRef<Constant*> V(unwrap<Constant>(ConstantVals, Length), Length);
796 return wrap(ConstantArray::get(ArrayType::get(unwrap(ElementTy), Length), V));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000797}
Gordon Henriksen1046c732007-10-06 15:11:06 +0000798LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
Chris Lattner25963c62010-01-09 22:27:07 +0000799 LLVMBool Packed) {
Erick Tryzelaar262332f2009-08-14 00:01:31 +0000800 return LLVMConstStructInContext(LLVMGetGlobalContext(), ConstantVals, Count,
801 Packed);
Gordon Henriksen76a03742007-09-18 03:18:57 +0000802}
Rafael Espindola784ad242011-07-14 19:09:08 +0000803
804LLVMValueRef LLVMConstNamedStruct(LLVMTypeRef StructTy,
805 LLVMValueRef *ConstantVals,
806 unsigned Count) {
807 Constant **Elements = unwrap<Constant>(ConstantVals, Count);
Chris Lattner229907c2011-07-18 04:54:35 +0000808 StructType *Ty = cast<StructType>(unwrap(StructTy));
Rafael Espindola784ad242011-07-14 19:09:08 +0000809
Frits van Bommel717d7ed2011-07-18 12:00:32 +0000810 return wrap(ConstantStruct::get(Ty, makeArrayRef(Elements, Count)));
Rafael Espindola784ad242011-07-14 19:09:08 +0000811}
812
Gordon Henriksen1046c732007-10-06 15:11:06 +0000813LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size) {
Frits van Bommel717d7ed2011-07-18 12:00:32 +0000814 return wrap(ConstantVector::get(makeArrayRef(
Chris Lattner69229312011-02-15 00:14:00 +0000815 unwrap<Constant>(ScalarConstantVals, Size), Size)));
Gordon Henriksen76a03742007-09-18 03:18:57 +0000816}
Torok Edwin05dc9d62011-10-06 12:39:34 +0000817
818/*-- Opcode mapping */
819
820static LLVMOpcode map_to_llvmopcode(int opcode)
821{
822 switch (opcode) {
Craig Topperc514b542012-02-05 22:14:15 +0000823 default: llvm_unreachable("Unhandled Opcode.");
Torok Edwin05dc9d62011-10-06 12:39:34 +0000824#define HANDLE_INST(num, opc, clas) case num: return LLVM##opc;
Chandler Carruth9fb823b2013-01-02 11:36:10 +0000825#include "llvm/IR/Instruction.def"
Torok Edwin05dc9d62011-10-06 12:39:34 +0000826#undef HANDLE_INST
Torok Edwin05dc9d62011-10-06 12:39:34 +0000827 }
828}
829
830static int map_from_llvmopcode(LLVMOpcode code)
831{
832 switch (code) {
833#define HANDLE_INST(num, opc, clas) case LLVM##opc: return num;
Chandler Carruth9fb823b2013-01-02 11:36:10 +0000834#include "llvm/IR/Instruction.def"
Torok Edwin05dc9d62011-10-06 12:39:34 +0000835#undef HANDLE_INST
Torok Edwin05dc9d62011-10-06 12:39:34 +0000836 }
David Blaikie486df732012-01-16 23:24:27 +0000837 llvm_unreachable("Unhandled Opcode.");
Torok Edwin05dc9d62011-10-06 12:39:34 +0000838}
839
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000840/*--.. Constant expressions ................................................--*/
841
Chris Lattner40cf28d2009-10-12 04:01:02 +0000842LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal) {
Torok Edwin05dc9d62011-10-06 12:39:34 +0000843 return map_to_llvmopcode(unwrap<ConstantExpr>(ConstantVal)->getOpcode());
Chris Lattner40cf28d2009-10-12 04:01:02 +0000844}
845
Duncan Sandsd334aca2009-05-21 15:52:21 +0000846LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty) {
Owen Anderson487375e2009-07-29 18:55:55 +0000847 return wrap(ConstantExpr::getAlignOf(unwrap(Ty)));
Duncan Sandsd334aca2009-05-21 15:52:21 +0000848}
849
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000850LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty) {
Owen Anderson487375e2009-07-29 18:55:55 +0000851 return wrap(ConstantExpr::getSizeOf(unwrap(Ty)));
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000852}
853
854LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal) {
Chris Lattner69229312011-02-15 00:14:00 +0000855 return wrap(ConstantExpr::getNeg(unwrap<Constant>(ConstantVal)));
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000856}
857
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000858LLVMValueRef LLVMConstNSWNeg(LLVMValueRef ConstantVal) {
Chris Lattner69229312011-02-15 00:14:00 +0000859 return wrap(ConstantExpr::getNSWNeg(unwrap<Constant>(ConstantVal)));
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000860}
861
862LLVMValueRef LLVMConstNUWNeg(LLVMValueRef ConstantVal) {
Chris Lattner69229312011-02-15 00:14:00 +0000863 return wrap(ConstantExpr::getNUWNeg(unwrap<Constant>(ConstantVal)));
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000864}
865
866
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000867LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal) {
Chris Lattner69229312011-02-15 00:14:00 +0000868 return wrap(ConstantExpr::getFNeg(unwrap<Constant>(ConstantVal)));
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000869}
870
871LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal) {
Chris Lattner69229312011-02-15 00:14:00 +0000872 return wrap(ConstantExpr::getNot(unwrap<Constant>(ConstantVal)));
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000873}
874
875LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000876 return wrap(ConstantExpr::getAdd(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000877 unwrap<Constant>(RHSConstant)));
878}
879
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000880LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant,
881 LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000882 return wrap(ConstantExpr::getNSWAdd(unwrap<Constant>(LHSConstant),
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000883 unwrap<Constant>(RHSConstant)));
884}
885
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000886LLVMValueRef LLVMConstNUWAdd(LLVMValueRef LHSConstant,
887 LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000888 return wrap(ConstantExpr::getNUWAdd(unwrap<Constant>(LHSConstant),
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000889 unwrap<Constant>(RHSConstant)));
890}
891
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000892LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000893 return wrap(ConstantExpr::getFAdd(unwrap<Constant>(LHSConstant),
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000894 unwrap<Constant>(RHSConstant)));
895}
896
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000897LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000898 return wrap(ConstantExpr::getSub(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000899 unwrap<Constant>(RHSConstant)));
900}
901
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000902LLVMValueRef LLVMConstNSWSub(LLVMValueRef LHSConstant,
903 LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000904 return wrap(ConstantExpr::getNSWSub(unwrap<Constant>(LHSConstant),
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000905 unwrap<Constant>(RHSConstant)));
906}
907
908LLVMValueRef LLVMConstNUWSub(LLVMValueRef LHSConstant,
909 LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000910 return wrap(ConstantExpr::getNUWSub(unwrap<Constant>(LHSConstant),
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000911 unwrap<Constant>(RHSConstant)));
912}
913
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000914LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
915 return wrap(ConstantExpr::getFSub(unwrap<Constant>(LHSConstant),
916 unwrap<Constant>(RHSConstant)));
917}
918
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000919LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000920 return wrap(ConstantExpr::getMul(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000921 unwrap<Constant>(RHSConstant)));
922}
923
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000924LLVMValueRef LLVMConstNSWMul(LLVMValueRef LHSConstant,
925 LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000926 return wrap(ConstantExpr::getNSWMul(unwrap<Constant>(LHSConstant),
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000927 unwrap<Constant>(RHSConstant)));
928}
929
930LLVMValueRef LLVMConstNUWMul(LLVMValueRef LHSConstant,
931 LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000932 return wrap(ConstantExpr::getNUWMul(unwrap<Constant>(LHSConstant),
Erick Tryzelaar4c340c72010-02-28 05:51:43 +0000933 unwrap<Constant>(RHSConstant)));
934}
935
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000936LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000937 return wrap(ConstantExpr::getFMul(unwrap<Constant>(LHSConstant),
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +0000938 unwrap<Constant>(RHSConstant)));
939}
940
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000941LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000942 return wrap(ConstantExpr::getUDiv(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000943 unwrap<Constant>(RHSConstant)));
944}
945
946LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000947 return wrap(ConstantExpr::getSDiv(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000948 unwrap<Constant>(RHSConstant)));
949}
950
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000951LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant,
952 LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000953 return wrap(ConstantExpr::getExactSDiv(unwrap<Constant>(LHSConstant),
Dan Gohmane4ca02d2009-09-03 23:34:49 +0000954 unwrap<Constant>(RHSConstant)));
955}
956
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000957LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000958 return wrap(ConstantExpr::getFDiv(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000959 unwrap<Constant>(RHSConstant)));
960}
961
962LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000963 return wrap(ConstantExpr::getURem(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000964 unwrap<Constant>(RHSConstant)));
965}
966
967LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000968 return wrap(ConstantExpr::getSRem(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000969 unwrap<Constant>(RHSConstant)));
970}
971
972LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000973 return wrap(ConstantExpr::getFRem(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000974 unwrap<Constant>(RHSConstant)));
975}
976
977LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000978 return wrap(ConstantExpr::getAnd(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000979 unwrap<Constant>(RHSConstant)));
980}
981
982LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000983 return wrap(ConstantExpr::getOr(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000984 unwrap<Constant>(RHSConstant)));
985}
986
987LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +0000988 return wrap(ConstantExpr::getXor(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000989 unwrap<Constant>(RHSConstant)));
990}
991
992LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
993 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Anderson487375e2009-07-29 18:55:55 +0000994 return wrap(ConstantExpr::getICmp(Predicate,
Gordon Henriksen7ce31762007-10-06 14:29:36 +0000995 unwrap<Constant>(LHSConstant),
996 unwrap<Constant>(RHSConstant)));
997}
998
999LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
1000 LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Owen Anderson487375e2009-07-29 18:55:55 +00001001 return wrap(ConstantExpr::getFCmp(Predicate,
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001002 unwrap<Constant>(LHSConstant),
1003 unwrap<Constant>(RHSConstant)));
1004}
1005
1006LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +00001007 return wrap(ConstantExpr::getShl(unwrap<Constant>(LHSConstant),
1008 unwrap<Constant>(RHSConstant)));
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001009}
1010
1011LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +00001012 return wrap(ConstantExpr::getLShr(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001013 unwrap<Constant>(RHSConstant)));
1014}
1015
1016LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
Chris Lattner69229312011-02-15 00:14:00 +00001017 return wrap(ConstantExpr::getAShr(unwrap<Constant>(LHSConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001018 unwrap<Constant>(RHSConstant)));
1019}
1020
1021LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
1022 LLVMValueRef *ConstantIndices, unsigned NumIndices) {
Jay Foaded8db7d2011-07-21 14:31:17 +00001023 ArrayRef<Constant *> IdxList(unwrap<Constant>(ConstantIndices, NumIndices),
1024 NumIndices);
Chris Lattner69229312011-02-15 00:14:00 +00001025 return wrap(ConstantExpr::getGetElementPtr(unwrap<Constant>(ConstantVal),
Jay Foaded8db7d2011-07-21 14:31:17 +00001026 IdxList));
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001027}
1028
Dan Gohmane4ca02d2009-09-03 23:34:49 +00001029LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
1030 LLVMValueRef *ConstantIndices,
1031 unsigned NumIndices) {
1032 Constant* Val = unwrap<Constant>(ConstantVal);
Jay Foaded8db7d2011-07-21 14:31:17 +00001033 ArrayRef<Constant *> IdxList(unwrap<Constant>(ConstantIndices, NumIndices),
1034 NumIndices);
1035 return wrap(ConstantExpr::getInBoundsGetElementPtr(Val, IdxList));
Dan Gohmane4ca02d2009-09-03 23:34:49 +00001036}
1037
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001038LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001039 return wrap(ConstantExpr::getTrunc(unwrap<Constant>(ConstantVal),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001040 unwrap(ToType)));
1041}
1042
1043LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001044 return wrap(ConstantExpr::getSExt(unwrap<Constant>(ConstantVal),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001045 unwrap(ToType)));
1046}
1047
1048LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001049 return wrap(ConstantExpr::getZExt(unwrap<Constant>(ConstantVal),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001050 unwrap(ToType)));
1051}
1052
1053LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001054 return wrap(ConstantExpr::getFPTrunc(unwrap<Constant>(ConstantVal),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001055 unwrap(ToType)));
1056}
1057
1058LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001059 return wrap(ConstantExpr::getFPExtend(unwrap<Constant>(ConstantVal),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001060 unwrap(ToType)));
1061}
1062
1063LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001064 return wrap(ConstantExpr::getUIToFP(unwrap<Constant>(ConstantVal),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001065 unwrap(ToType)));
1066}
1067
1068LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Anderson487375e2009-07-29 18:55:55 +00001069 return wrap(ConstantExpr::getSIToFP(unwrap<Constant>(ConstantVal),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001070 unwrap(ToType)));
1071}
1072
1073LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Owen Anderson487375e2009-07-29 18:55:55 +00001074 return wrap(ConstantExpr::getFPToUI(unwrap<Constant>(ConstantVal),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001075 unwrap(ToType)));
1076}
1077
1078LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001079 return wrap(ConstantExpr::getFPToSI(unwrap<Constant>(ConstantVal),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001080 unwrap(ToType)));
1081}
1082
1083LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001084 return wrap(ConstantExpr::getPtrToInt(unwrap<Constant>(ConstantVal),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001085 unwrap(ToType)));
1086}
1087
1088LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001089 return wrap(ConstantExpr::getIntToPtr(unwrap<Constant>(ConstantVal),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001090 unwrap(ToType)));
1091}
1092
1093LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001094 return wrap(ConstantExpr::getBitCast(unwrap<Constant>(ConstantVal),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001095 unwrap(ToType)));
1096}
1097
Matt Arsenaultb03bd4d2013-11-15 01:34:59 +00001098LLVMValueRef LLVMConstAddrSpaceCast(LLVMValueRef ConstantVal,
1099 LLVMTypeRef ToType) {
1100 return wrap(ConstantExpr::getAddrSpaceCast(unwrap<Constant>(ConstantVal),
1101 unwrap(ToType)));
1102}
1103
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +00001104LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
1105 LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001106 return wrap(ConstantExpr::getZExtOrBitCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +00001107 unwrap(ToType)));
1108}
1109
1110LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
1111 LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001112 return wrap(ConstantExpr::getSExtOrBitCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +00001113 unwrap(ToType)));
1114}
1115
1116LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
1117 LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001118 return wrap(ConstantExpr::getTruncOrBitCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +00001119 unwrap(ToType)));
1120}
1121
1122LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
1123 LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001124 return wrap(ConstantExpr::getPointerCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +00001125 unwrap(ToType)));
1126}
1127
1128LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
Chris Lattner25963c62010-01-09 22:27:07 +00001129 LLVMBool isSigned) {
Chris Lattner69229312011-02-15 00:14:00 +00001130 return wrap(ConstantExpr::getIntegerCast(unwrap<Constant>(ConstantVal),
1131 unwrap(ToType), isSigned));
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +00001132}
1133
1134LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
Chris Lattner69229312011-02-15 00:14:00 +00001135 return wrap(ConstantExpr::getFPCast(unwrap<Constant>(ConstantVal),
Erick Tryzelaar4cc690c2009-08-16 02:20:12 +00001136 unwrap(ToType)));
1137}
1138
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001139LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
1140 LLVMValueRef ConstantIfTrue,
1141 LLVMValueRef ConstantIfFalse) {
Chris Lattner69229312011-02-15 00:14:00 +00001142 return wrap(ConstantExpr::getSelect(unwrap<Constant>(ConstantCondition),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001143 unwrap<Constant>(ConstantIfTrue),
1144 unwrap<Constant>(ConstantIfFalse)));
1145}
1146
1147LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
1148 LLVMValueRef IndexConstant) {
Chris Lattner69229312011-02-15 00:14:00 +00001149 return wrap(ConstantExpr::getExtractElement(unwrap<Constant>(VectorConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001150 unwrap<Constant>(IndexConstant)));
1151}
1152
1153LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
1154 LLVMValueRef ElementValueConstant,
1155 LLVMValueRef IndexConstant) {
Chris Lattner69229312011-02-15 00:14:00 +00001156 return wrap(ConstantExpr::getInsertElement(unwrap<Constant>(VectorConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001157 unwrap<Constant>(ElementValueConstant),
1158 unwrap<Constant>(IndexConstant)));
1159}
1160
1161LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
1162 LLVMValueRef VectorBConstant,
1163 LLVMValueRef MaskConstant) {
Chris Lattner69229312011-02-15 00:14:00 +00001164 return wrap(ConstantExpr::getShuffleVector(unwrap<Constant>(VectorAConstant),
Gordon Henriksen7ce31762007-10-06 14:29:36 +00001165 unwrap<Constant>(VectorBConstant),
1166 unwrap<Constant>(MaskConstant)));
1167}
1168
Dan Gohmand5104a52008-11-03 22:55:43 +00001169LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
1170 unsigned NumIdx) {
Chris Lattner69229312011-02-15 00:14:00 +00001171 return wrap(ConstantExpr::getExtractValue(unwrap<Constant>(AggConstant),
Frits van Bommel717d7ed2011-07-18 12:00:32 +00001172 makeArrayRef(IdxList, NumIdx)));
Dan Gohmand5104a52008-11-03 22:55:43 +00001173}
1174
1175LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
1176 LLVMValueRef ElementValueConstant,
1177 unsigned *IdxList, unsigned NumIdx) {
Chris Lattner69229312011-02-15 00:14:00 +00001178 return wrap(ConstantExpr::getInsertValue(unwrap<Constant>(AggConstant),
Dan Gohmand5104a52008-11-03 22:55:43 +00001179 unwrap<Constant>(ElementValueConstant),
Frits van Bommel717d7ed2011-07-18 12:00:32 +00001180 makeArrayRef(IdxList, NumIdx)));
Dan Gohmand5104a52008-11-03 22:55:43 +00001181}
1182
Chris Lattner25963c62010-01-09 22:27:07 +00001183LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString,
1184 const char *Constraints,
1185 LLVMBool HasSideEffects,
Benjamin Kramer8dd0edc2012-09-10 11:52:00 +00001186 LLVMBool IsAlignStack) {
Chris Lattner25963c62010-01-09 22:27:07 +00001187 return wrap(InlineAsm::get(dyn_cast<FunctionType>(unwrap(Ty)), AsmString,
Benjamin Kramer8dd0edc2012-09-10 11:52:00 +00001188 Constraints, HasSideEffects, IsAlignStack));
Chris Lattner3d1f5522008-12-17 21:39:50 +00001189}
1190
Erick Tryzelaar0fb26ef2010-02-28 09:46:06 +00001191LLVMValueRef LLVMBlockAddress(LLVMValueRef F, LLVMBasicBlockRef BB) {
1192 return wrap(BlockAddress::get(unwrap<Function>(F), unwrap(BB)));
1193}
1194
Gordon Henriksen76a03742007-09-18 03:18:57 +00001195/*--.. Operations on global variables, functions, and aliases (globals) ....--*/
1196
Gordon Henriksen265f7802008-03-19 01:11:35 +00001197LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global) {
1198 return wrap(unwrap<GlobalValue>(Global)->getParent());
1199}
1200
Chris Lattner25963c62010-01-09 22:27:07 +00001201LLVMBool LLVMIsDeclaration(LLVMValueRef Global) {
Gordon Henriksen76a03742007-09-18 03:18:57 +00001202 return unwrap<GlobalValue>(Global)->isDeclaration();
1203}
1204
1205LLVMLinkage LLVMGetLinkage(LLVMValueRef Global) {
Bill Wendling2dd0bf82009-07-20 20:34:46 +00001206 switch (unwrap<GlobalValue>(Global)->getLinkage()) {
Bill Wendling2dd0bf82009-07-20 20:34:46 +00001207 case GlobalValue::ExternalLinkage:
1208 return LLVMExternalLinkage;
1209 case GlobalValue::AvailableExternallyLinkage:
1210 return LLVMAvailableExternallyLinkage;
1211 case GlobalValue::LinkOnceAnyLinkage:
1212 return LLVMLinkOnceAnyLinkage;
1213 case GlobalValue::LinkOnceODRLinkage:
1214 return LLVMLinkOnceODRLinkage;
1215 case GlobalValue::WeakAnyLinkage:
1216 return LLVMWeakAnyLinkage;
1217 case GlobalValue::WeakODRLinkage:
1218 return LLVMWeakODRLinkage;
1219 case GlobalValue::AppendingLinkage:
1220 return LLVMAppendingLinkage;
1221 case GlobalValue::InternalLinkage:
1222 return LLVMInternalLinkage;
1223 case GlobalValue::PrivateLinkage:
1224 return LLVMPrivateLinkage;
Bill Wendling2dd0bf82009-07-20 20:34:46 +00001225 case GlobalValue::ExternalWeakLinkage:
1226 return LLVMExternalWeakLinkage;
Bill Wendling2dd0bf82009-07-20 20:34:46 +00001227 case GlobalValue::CommonLinkage:
1228 return LLVMCommonLinkage;
1229 }
1230
David Blaikiea5708dc2012-01-17 07:00:13 +00001231 llvm_unreachable("Invalid GlobalValue linkage!");
Gordon Henriksen76a03742007-09-18 03:18:57 +00001232}
1233
1234void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage) {
Bill Wendling2dd0bf82009-07-20 20:34:46 +00001235 GlobalValue *GV = unwrap<GlobalValue>(Global);
1236
1237 switch (Linkage) {
Bill Wendling2dd0bf82009-07-20 20:34:46 +00001238 case LLVMExternalLinkage:
1239 GV->setLinkage(GlobalValue::ExternalLinkage);
1240 break;
1241 case LLVMAvailableExternallyLinkage:
1242 GV->setLinkage(GlobalValue::AvailableExternallyLinkage);
1243 break;
1244 case LLVMLinkOnceAnyLinkage:
1245 GV->setLinkage(GlobalValue::LinkOnceAnyLinkage);
1246 break;
1247 case LLVMLinkOnceODRLinkage:
1248 GV->setLinkage(GlobalValue::LinkOnceODRLinkage);
1249 break;
Bill Wendling34bc34e2012-08-17 18:33:14 +00001250 case LLVMLinkOnceODRAutoHideLinkage:
Rafael Espindola716e7402013-11-01 17:09:14 +00001251 DEBUG(errs() << "LLVMSetLinkage(): LLVMLinkOnceODRAutoHideLinkage is no "
1252 "longer supported.");
Bill Wendling34bc34e2012-08-17 18:33:14 +00001253 break;
Bill Wendling2dd0bf82009-07-20 20:34:46 +00001254 case LLVMWeakAnyLinkage:
1255 GV->setLinkage(GlobalValue::WeakAnyLinkage);
1256 break;
1257 case LLVMWeakODRLinkage:
1258 GV->setLinkage(GlobalValue::WeakODRLinkage);
1259 break;
1260 case LLVMAppendingLinkage:
1261 GV->setLinkage(GlobalValue::AppendingLinkage);
1262 break;
1263 case LLVMInternalLinkage:
1264 GV->setLinkage(GlobalValue::InternalLinkage);
1265 break;
1266 case LLVMPrivateLinkage:
1267 GV->setLinkage(GlobalValue::PrivateLinkage);
1268 break;
1269 case LLVMLinkerPrivateLinkage:
Rafael Espindola2fb5bc32014-03-13 23:18:37 +00001270 GV->setLinkage(GlobalValue::PrivateLinkage);
Bill Wendling2dd0bf82009-07-20 20:34:46 +00001271 break;
Bill Wendling03bcd6e2010-07-01 21:55:59 +00001272 case LLVMLinkerPrivateWeakLinkage:
Rafael Espindola2fb5bc32014-03-13 23:18:37 +00001273 GV->setLinkage(GlobalValue::PrivateLinkage);
Bill Wendling03bcd6e2010-07-01 21:55:59 +00001274 break;
Bill Wendling2dd0bf82009-07-20 20:34:46 +00001275 case LLVMDLLImportLinkage:
Nico Rieck7157bb72014-01-14 15:22:47 +00001276 DEBUG(errs()
1277 << "LLVMSetLinkage(): LLVMDLLImportLinkage is no longer supported.");
Bill Wendling2dd0bf82009-07-20 20:34:46 +00001278 break;
1279 case LLVMDLLExportLinkage:
Nico Rieck7157bb72014-01-14 15:22:47 +00001280 DEBUG(errs()
1281 << "LLVMSetLinkage(): LLVMDLLExportLinkage is no longer supported.");
Bill Wendling2dd0bf82009-07-20 20:34:46 +00001282 break;
1283 case LLVMExternalWeakLinkage:
1284 GV->setLinkage(GlobalValue::ExternalWeakLinkage);
1285 break;
1286 case LLVMGhostLinkage:
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00001287 DEBUG(errs()
1288 << "LLVMSetLinkage(): LLVMGhostLinkage is no longer supported.");
Bill Wendling2dd0bf82009-07-20 20:34:46 +00001289 break;
1290 case LLVMCommonLinkage:
1291 GV->setLinkage(GlobalValue::CommonLinkage);
1292 break;
1293 }
Gordon Henriksen76a03742007-09-18 03:18:57 +00001294}
1295
1296const char *LLVMGetSection(LLVMValueRef Global) {
Rafael Espindola64c1e182014-06-03 02:41:57 +00001297 return unwrap<GlobalValue>(Global)->getSection();
Gordon Henriksen76a03742007-09-18 03:18:57 +00001298}
1299
1300void LLVMSetSection(LLVMValueRef Global, const char *Section) {
Rafael Espindola99e05cf2014-05-13 18:45:48 +00001301 unwrap<GlobalObject>(Global)->setSection(Section);
Gordon Henriksen76a03742007-09-18 03:18:57 +00001302}
1303
1304LLVMVisibility LLVMGetVisibility(LLVMValueRef Global) {
1305 return static_cast<LLVMVisibility>(
1306 unwrap<GlobalValue>(Global)->getVisibility());
1307}
1308
1309void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz) {
1310 unwrap<GlobalValue>(Global)
1311 ->setVisibility(static_cast<GlobalValue::VisibilityTypes>(Viz));
1312}
1313
Reid Kleckner2fae26f2014-03-05 02:34:23 +00001314LLVMDLLStorageClass LLVMGetDLLStorageClass(LLVMValueRef Global) {
1315 return static_cast<LLVMDLLStorageClass>(
1316 unwrap<GlobalValue>(Global)->getDLLStorageClass());
1317}
1318
1319void LLVMSetDLLStorageClass(LLVMValueRef Global, LLVMDLLStorageClass Class) {
1320 unwrap<GlobalValue>(Global)->setDLLStorageClass(
1321 static_cast<GlobalValue::DLLStorageClassTypes>(Class));
1322}
1323
Tim Northoverad96d012014-03-10 19:24:35 +00001324LLVMBool LLVMHasUnnamedAddr(LLVMValueRef Global) {
1325 return unwrap<GlobalValue>(Global)->hasUnnamedAddr();
1326}
1327
1328void LLVMSetUnnamedAddr(LLVMValueRef Global, LLVMBool HasUnnamedAddr) {
1329 unwrap<GlobalValue>(Global)->setUnnamedAddr(HasUnnamedAddr);
1330}
1331
Anders Waldenborg213a63f2013-10-29 09:02:02 +00001332/*--.. Operations on global variables, load and store instructions .........--*/
1333
1334unsigned LLVMGetAlignment(LLVMValueRef V) {
1335 Value *P = unwrap<Value>(V);
1336 if (GlobalValue *GV = dyn_cast<GlobalValue>(P))
1337 return GV->getAlignment();
Peter Zotov9f584e62014-03-05 05:05:34 +00001338 if (AllocaInst *AI = dyn_cast<AllocaInst>(P))
1339 return AI->getAlignment();
Anders Waldenborg213a63f2013-10-29 09:02:02 +00001340 if (LoadInst *LI = dyn_cast<LoadInst>(P))
1341 return LI->getAlignment();
1342 if (StoreInst *SI = dyn_cast<StoreInst>(P))
1343 return SI->getAlignment();
1344
Peter Zotov9f584e62014-03-05 05:05:34 +00001345 llvm_unreachable(
1346 "only GlobalValue, AllocaInst, LoadInst and StoreInst have alignment");
Gordon Henriksen76a03742007-09-18 03:18:57 +00001347}
1348
Anders Waldenborg213a63f2013-10-29 09:02:02 +00001349void LLVMSetAlignment(LLVMValueRef V, unsigned Bytes) {
1350 Value *P = unwrap<Value>(V);
Rafael Espindola99e05cf2014-05-13 18:45:48 +00001351 if (GlobalObject *GV = dyn_cast<GlobalObject>(P))
Anders Waldenborg213a63f2013-10-29 09:02:02 +00001352 GV->setAlignment(Bytes);
Peter Zotov9f584e62014-03-05 05:05:34 +00001353 else if (AllocaInst *AI = dyn_cast<AllocaInst>(P))
1354 AI->setAlignment(Bytes);
Anders Waldenborg213a63f2013-10-29 09:02:02 +00001355 else if (LoadInst *LI = dyn_cast<LoadInst>(P))
1356 LI->setAlignment(Bytes);
1357 else if (StoreInst *SI = dyn_cast<StoreInst>(P))
1358 SI->setAlignment(Bytes);
Anders Waldenborga36a7822013-10-29 09:37:28 +00001359 else
Peter Zotov9f584e62014-03-05 05:05:34 +00001360 llvm_unreachable(
1361 "only GlobalValue, AllocaInst, LoadInst and StoreInst have alignment");
Gordon Henriksen76a03742007-09-18 03:18:57 +00001362}
1363
1364/*--.. Operations on global variables ......................................--*/
1365
1366LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name) {
Owen Andersonb17f3292009-07-08 19:03:57 +00001367 return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false,
Craig Topperc6207612014-04-09 06:08:46 +00001368 GlobalValue::ExternalLinkage, nullptr, Name));
Gordon Henriksen76a03742007-09-18 03:18:57 +00001369}
1370
Erick Tryzelaar06894b32010-02-28 09:46:13 +00001371LLVMValueRef LLVMAddGlobalInAddressSpace(LLVMModuleRef M, LLVMTypeRef Ty,
1372 const char *Name,
1373 unsigned AddressSpace) {
1374 return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false,
Craig Topperc6207612014-04-09 06:08:46 +00001375 GlobalValue::ExternalLinkage, nullptr, Name,
1376 nullptr, GlobalVariable::NotThreadLocal,
1377 AddressSpace));
Erick Tryzelaar06894b32010-02-28 09:46:13 +00001378}
1379
Gordon Henriksen783f7bb2007-10-08 03:45:09 +00001380LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name) {
1381 return wrap(unwrap(M)->getNamedGlobal(Name));
1382}
1383
Gordon Henriksen054817c2008-03-19 03:47:18 +00001384LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M) {
1385 Module *Mod = unwrap(M);
1386 Module::global_iterator I = Mod->global_begin();
1387 if (I == Mod->global_end())
Craig Topperc6207612014-04-09 06:08:46 +00001388 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001389 return wrap(I);
1390}
1391
1392LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M) {
1393 Module *Mod = unwrap(M);
1394 Module::global_iterator I = Mod->global_end();
1395 if (I == Mod->global_begin())
Craig Topperc6207612014-04-09 06:08:46 +00001396 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001397 return wrap(--I);
1398}
1399
1400LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar) {
1401 GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
1402 Module::global_iterator I = GV;
1403 if (++I == GV->getParent()->global_end())
Craig Topperc6207612014-04-09 06:08:46 +00001404 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001405 return wrap(I);
1406}
1407
1408LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar) {
1409 GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
1410 Module::global_iterator I = GV;
Gordon Henriksen07a45f42008-03-23 22:21:29 +00001411 if (I == GV->getParent()->global_begin())
Craig Topperc6207612014-04-09 06:08:46 +00001412 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001413 return wrap(--I);
1414}
1415
Gordon Henriksen76a03742007-09-18 03:18:57 +00001416void LLVMDeleteGlobal(LLVMValueRef GlobalVar) {
1417 unwrap<GlobalVariable>(GlobalVar)->eraseFromParent();
1418}
1419
Gordon Henriksen76a03742007-09-18 03:18:57 +00001420LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar) {
Chris Lattner40cf28d2009-10-12 04:01:02 +00001421 GlobalVariable* GV = unwrap<GlobalVariable>(GlobalVar);
1422 if ( !GV->hasInitializer() )
Craig Topperc6207612014-04-09 06:08:46 +00001423 return nullptr;
Chris Lattner40cf28d2009-10-12 04:01:02 +00001424 return wrap(GV->getInitializer());
Gordon Henriksen76a03742007-09-18 03:18:57 +00001425}
1426
1427void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal) {
1428 unwrap<GlobalVariable>(GlobalVar)
1429 ->setInitializer(unwrap<Constant>(ConstantVal));
1430}
1431
Chris Lattner25963c62010-01-09 22:27:07 +00001432LLVMBool LLVMIsThreadLocal(LLVMValueRef GlobalVar) {
Gordon Henriksen76a03742007-09-18 03:18:57 +00001433 return unwrap<GlobalVariable>(GlobalVar)->isThreadLocal();
1434}
1435
Chris Lattner25963c62010-01-09 22:27:07 +00001436void LLVMSetThreadLocal(LLVMValueRef GlobalVar, LLVMBool IsThreadLocal) {
Gordon Henriksen76a03742007-09-18 03:18:57 +00001437 unwrap<GlobalVariable>(GlobalVar)->setThreadLocal(IsThreadLocal != 0);
1438}
1439
Chris Lattner25963c62010-01-09 22:27:07 +00001440LLVMBool LLVMIsGlobalConstant(LLVMValueRef GlobalVar) {
Gordon Henriksen751ebf72007-10-07 17:31:42 +00001441 return unwrap<GlobalVariable>(GlobalVar)->isConstant();
1442}
1443
Chris Lattner25963c62010-01-09 22:27:07 +00001444void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, LLVMBool IsConstant) {
Gordon Henriksen751ebf72007-10-07 17:31:42 +00001445 unwrap<GlobalVariable>(GlobalVar)->setConstant(IsConstant != 0);
1446}
1447
Hans Wennborg5ff71202013-04-16 08:58:59 +00001448LLVMThreadLocalMode LLVMGetThreadLocalMode(LLVMValueRef GlobalVar) {
1449 switch (unwrap<GlobalVariable>(GlobalVar)->getThreadLocalMode()) {
1450 case GlobalVariable::NotThreadLocal:
1451 return LLVMNotThreadLocal;
1452 case GlobalVariable::GeneralDynamicTLSModel:
1453 return LLVMGeneralDynamicTLSModel;
1454 case GlobalVariable::LocalDynamicTLSModel:
1455 return LLVMLocalDynamicTLSModel;
1456 case GlobalVariable::InitialExecTLSModel:
1457 return LLVMInitialExecTLSModel;
1458 case GlobalVariable::LocalExecTLSModel:
1459 return LLVMLocalExecTLSModel;
1460 }
1461
1462 llvm_unreachable("Invalid GlobalVariable thread local mode");
1463}
1464
1465void LLVMSetThreadLocalMode(LLVMValueRef GlobalVar, LLVMThreadLocalMode Mode) {
1466 GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
1467
1468 switch (Mode) {
1469 case LLVMNotThreadLocal:
1470 GV->setThreadLocalMode(GlobalVariable::NotThreadLocal);
1471 break;
1472 case LLVMGeneralDynamicTLSModel:
1473 GV->setThreadLocalMode(GlobalVariable::GeneralDynamicTLSModel);
1474 break;
1475 case LLVMLocalDynamicTLSModel:
1476 GV->setThreadLocalMode(GlobalVariable::LocalDynamicTLSModel);
1477 break;
1478 case LLVMInitialExecTLSModel:
1479 GV->setThreadLocalMode(GlobalVariable::InitialExecTLSModel);
1480 break;
1481 case LLVMLocalExecTLSModel:
1482 GV->setThreadLocalMode(GlobalVariable::LocalExecTLSModel);
1483 break;
1484 }
1485}
1486
1487LLVMBool LLVMIsExternallyInitialized(LLVMValueRef GlobalVar) {
1488 return unwrap<GlobalVariable>(GlobalVar)->isExternallyInitialized();
1489}
1490
1491void LLVMSetExternallyInitialized(LLVMValueRef GlobalVar, LLVMBool IsExtInit) {
1492 unwrap<GlobalVariable>(GlobalVar)->setExternallyInitialized(IsExtInit);
1493}
1494
Chris Lattner3d1f5522008-12-17 21:39:50 +00001495/*--.. Operations on aliases ......................................--*/
1496
1497LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
1498 const char *Name) {
Rafael Espindola4fe00942014-05-16 13:34:04 +00001499 auto *PTy = cast<PointerType>(unwrap(Ty));
Rafael Espindolaf1bedd3742014-05-17 21:29:57 +00001500 return wrap(GlobalAlias::create(PTy->getElementType(), PTy->getAddressSpace(),
1501 GlobalValue::ExternalLinkage, Name,
1502 unwrap<GlobalObject>(Aliasee), unwrap(M)));
Chris Lattner3d1f5522008-12-17 21:39:50 +00001503}
1504
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001505/*--.. Operations on functions .............................................--*/
1506
1507LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
1508 LLVMTypeRef FunctionTy) {
Gabor Greife9ecc682008-04-06 20:25:17 +00001509 return wrap(Function::Create(unwrap<FunctionType>(FunctionTy),
1510 GlobalValue::ExternalLinkage, Name, unwrap(M)));
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001511}
1512
Gordon Henriksen783f7bb2007-10-08 03:45:09 +00001513LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name) {
1514 return wrap(unwrap(M)->getFunction(Name));
1515}
1516
Gordon Henriksen054817c2008-03-19 03:47:18 +00001517LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M) {
1518 Module *Mod = unwrap(M);
1519 Module::iterator I = Mod->begin();
1520 if (I == Mod->end())
Craig Topperc6207612014-04-09 06:08:46 +00001521 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001522 return wrap(I);
1523}
1524
1525LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M) {
1526 Module *Mod = unwrap(M);
1527 Module::iterator I = Mod->end();
1528 if (I == Mod->begin())
Craig Topperc6207612014-04-09 06:08:46 +00001529 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001530 return wrap(--I);
1531}
1532
1533LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn) {
1534 Function *Func = unwrap<Function>(Fn);
1535 Module::iterator I = Func;
1536 if (++I == Func->getParent()->end())
Craig Topperc6207612014-04-09 06:08:46 +00001537 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001538 return wrap(I);
1539}
1540
1541LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn) {
1542 Function *Func = unwrap<Function>(Fn);
1543 Module::iterator I = Func;
Gordon Henriksen07a45f42008-03-23 22:21:29 +00001544 if (I == Func->getParent()->begin())
Craig Topperc6207612014-04-09 06:08:46 +00001545 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001546 return wrap(--I);
1547}
1548
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001549void LLVMDeleteFunction(LLVMValueRef Fn) {
1550 unwrap<Function>(Fn)->eraseFromParent();
1551}
1552
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001553unsigned LLVMGetIntrinsicID(LLVMValueRef Fn) {
1554 if (Function *F = dyn_cast<Function>(unwrap(Fn)))
1555 return F->getIntrinsicID();
1556 return 0;
1557}
1558
1559unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn) {
1560 return unwrap<Function>(Fn)->getCallingConv();
1561}
1562
1563void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC) {
Sandeep Patel68c5f472009-09-02 08:44:58 +00001564 return unwrap<Function>(Fn)->setCallingConv(
1565 static_cast<CallingConv::ID>(CC));
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001566}
1567
Gordon Henriksend930f912008-08-17 18:44:35 +00001568const char *LLVMGetGC(LLVMValueRef Fn) {
Gordon Henriksen71183b62007-12-10 03:18:06 +00001569 Function *F = unwrap<Function>(Fn);
Craig Topperc6207612014-04-09 06:08:46 +00001570 return F->hasGC()? F->getGC() : nullptr;
Gordon Henriksen71183b62007-12-10 03:18:06 +00001571}
1572
Gordon Henriksend930f912008-08-17 18:44:35 +00001573void LLVMSetGC(LLVMValueRef Fn, const char *GC) {
Gordon Henriksen71183b62007-12-10 03:18:06 +00001574 Function *F = unwrap<Function>(Fn);
Gordon Henriksend930f912008-08-17 18:44:35 +00001575 if (GC)
1576 F->setGC(GC);
Gordon Henriksen71183b62007-12-10 03:18:06 +00001577 else
Gordon Henriksend930f912008-08-17 18:44:35 +00001578 F->clearGC();
Gordon Henriksen71183b62007-12-10 03:18:06 +00001579}
1580
Duncan Sands7374a012009-05-06 12:21:17 +00001581void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
1582 Function *Func = unwrap<Function>(Fn);
Bill Wendlinge94d8432012-12-07 23:16:57 +00001583 const AttributeSet PAL = Func->getAttributes();
Bill Wendling50d27842012-10-15 20:35:56 +00001584 AttrBuilder B(PA);
Bill Wendlinge94d8432012-12-07 23:16:57 +00001585 const AttributeSet PALnew =
Bill Wendling785afdf2013-01-30 23:40:31 +00001586 PAL.addAttributes(Func->getContext(), AttributeSet::FunctionIndex,
1587 AttributeSet::get(Func->getContext(),
1588 AttributeSet::FunctionIndex, B));
Duncan Sands7374a012009-05-06 12:21:17 +00001589 Func->setAttributes(PALnew);
1590}
1591
Tom Stellarde8f35e12013-04-16 23:12:43 +00001592void LLVMAddTargetDependentFunctionAttr(LLVMValueRef Fn, const char *A,
1593 const char *V) {
1594 Function *Func = unwrap<Function>(Fn);
Bill Wendlingb5443632013-04-17 18:26:02 +00001595 AttributeSet::AttrIndex Idx =
1596 AttributeSet::AttrIndex(AttributeSet::FunctionIndex);
Tom Stellarde8f35e12013-04-16 23:12:43 +00001597 AttrBuilder B;
1598
1599 B.addAttribute(A, V);
1600 AttributeSet Set = AttributeSet::get(Func->getContext(), Idx, B);
1601 Func->addAttributes(Idx, Set);
1602}
1603
Duncan Sands7374a012009-05-06 12:21:17 +00001604void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA) {
1605 Function *Func = unwrap<Function>(Fn);
Bill Wendlinge94d8432012-12-07 23:16:57 +00001606 const AttributeSet PAL = Func->getAttributes();
Bill Wendling50d27842012-10-15 20:35:56 +00001607 AttrBuilder B(PA);
Bill Wendlinge94d8432012-12-07 23:16:57 +00001608 const AttributeSet PALnew =
Bill Wendling430fa9b2013-01-23 00:45:55 +00001609 PAL.removeAttributes(Func->getContext(), AttributeSet::FunctionIndex,
1610 AttributeSet::get(Func->getContext(),
1611 AttributeSet::FunctionIndex, B));
Duncan Sands7374a012009-05-06 12:21:17 +00001612 Func->setAttributes(PALnew);
1613}
1614
Chris Lattner40cf28d2009-10-12 04:01:02 +00001615LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn) {
1616 Function *Func = unwrap<Function>(Fn);
Bill Wendlinge94d8432012-12-07 23:16:57 +00001617 const AttributeSet PAL = Func->getAttributes();
Bill Wendling3b651872013-01-09 23:36:50 +00001618 return (LLVMAttribute)PAL.Raw(AttributeSet::FunctionIndex);
Chris Lattner40cf28d2009-10-12 04:01:02 +00001619}
1620
Gordon Henriksen265f7802008-03-19 01:11:35 +00001621/*--.. Operations on parameters ............................................--*/
1622
1623unsigned LLVMCountParams(LLVMValueRef FnRef) {
1624 // This function is strictly redundant to
1625 // LLVMCountParamTypes(LLVMGetElementType(LLVMTypeOf(FnRef)))
Dan Gohmanc7076912008-06-21 22:06:54 +00001626 return unwrap<Function>(FnRef)->arg_size();
Gordon Henriksen265f7802008-03-19 01:11:35 +00001627}
1628
1629void LLVMGetParams(LLVMValueRef FnRef, LLVMValueRef *ParamRefs) {
1630 Function *Fn = unwrap<Function>(FnRef);
1631 for (Function::arg_iterator I = Fn->arg_begin(),
1632 E = Fn->arg_end(); I != E; I++)
1633 *ParamRefs++ = wrap(I);
1634}
1635
1636LLVMValueRef LLVMGetParam(LLVMValueRef FnRef, unsigned index) {
1637 Function::arg_iterator AI = unwrap<Function>(FnRef)->arg_begin();
1638 while (index --> 0)
1639 AI++;
1640 return wrap(AI);
1641}
1642
1643LLVMValueRef LLVMGetParamParent(LLVMValueRef V) {
1644 return wrap(unwrap<Argument>(V)->getParent());
1645}
1646
Gordon Henriksen07a45f42008-03-23 22:21:29 +00001647LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn) {
1648 Function *Func = unwrap<Function>(Fn);
1649 Function::arg_iterator I = Func->arg_begin();
1650 if (I == Func->arg_end())
Craig Topperc6207612014-04-09 06:08:46 +00001651 return nullptr;
Gordon Henriksen07a45f42008-03-23 22:21:29 +00001652 return wrap(I);
1653}
1654
1655LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn) {
1656 Function *Func = unwrap<Function>(Fn);
1657 Function::arg_iterator I = Func->arg_end();
1658 if (I == Func->arg_begin())
Craig Topperc6207612014-04-09 06:08:46 +00001659 return nullptr;
Gordon Henriksen07a45f42008-03-23 22:21:29 +00001660 return wrap(--I);
1661}
1662
1663LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg) {
1664 Argument *A = unwrap<Argument>(Arg);
1665 Function::arg_iterator I = A;
1666 if (++I == A->getParent()->arg_end())
Craig Topperc6207612014-04-09 06:08:46 +00001667 return nullptr;
Gordon Henriksen07a45f42008-03-23 22:21:29 +00001668 return wrap(I);
1669}
1670
1671LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg) {
1672 Argument *A = unwrap<Argument>(Arg);
1673 Function::arg_iterator I = A;
1674 if (I == A->getParent()->arg_begin())
Craig Topperc6207612014-04-09 06:08:46 +00001675 return nullptr;
Gordon Henriksen07a45f42008-03-23 22:21:29 +00001676 return wrap(--I);
1677}
1678
Devang Patel4c758ea2008-09-25 21:00:45 +00001679void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
Bill Wendlingd079a442012-10-15 04:46:55 +00001680 Argument *A = unwrap<Argument>(Arg);
Bill Wendling50d27842012-10-15 20:35:56 +00001681 AttrBuilder B(PA);
Bill Wendling49bc76c2013-01-23 06:14:59 +00001682 A->addAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
Gordon Henriksen2d9cc212008-04-28 17:37:06 +00001683}
1684
Devang Patel4c758ea2008-09-25 21:00:45 +00001685void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA) {
Bill Wendlingd079a442012-10-15 04:46:55 +00001686 Argument *A = unwrap<Argument>(Arg);
Bill Wendling50d27842012-10-15 20:35:56 +00001687 AttrBuilder B(PA);
Bill Wendling49bc76c2013-01-23 06:14:59 +00001688 A->removeAttr(AttributeSet::get(A->getContext(), A->getArgNo() + 1, B));
Gordon Henriksen2d9cc212008-04-28 17:37:06 +00001689}
1690
Chris Lattner40cf28d2009-10-12 04:01:02 +00001691LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg) {
1692 Argument *A = unwrap<Argument>(Arg);
Bill Wendling749a43d2012-12-30 13:50:49 +00001693 return (LLVMAttribute)A->getParent()->getAttributes().
Bill Wendling3b651872013-01-09 23:36:50 +00001694 Raw(A->getArgNo()+1);
Chris Lattner40cf28d2009-10-12 04:01:02 +00001695}
Andrew Trickdc073ad2013-09-18 23:31:10 +00001696
Chris Lattner40cf28d2009-10-12 04:01:02 +00001697
Gordon Henriksen2d9cc212008-04-28 17:37:06 +00001698void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align) {
Bill Wendling49bc76c2013-01-23 06:14:59 +00001699 Argument *A = unwrap<Argument>(Arg);
Bill Wendling50d27842012-10-15 20:35:56 +00001700 AttrBuilder B;
Bill Wendlingabd5ba22012-10-14 03:58:29 +00001701 B.addAlignmentAttr(align);
Bill Wendling49bc76c2013-01-23 06:14:59 +00001702 A->addAttr(AttributeSet::get(A->getContext(),A->getArgNo() + 1, B));
Gordon Henriksen2d9cc212008-04-28 17:37:06 +00001703}
1704
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001705/*--.. Operations on basic blocks ..........................................--*/
1706
Gordon Henriksen265f7802008-03-19 01:11:35 +00001707LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB) {
1708 return wrap(static_cast<Value*>(unwrap(BB)));
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001709}
1710
Chris Lattner25963c62010-01-09 22:27:07 +00001711LLVMBool LLVMValueIsBasicBlock(LLVMValueRef Val) {
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001712 return isa<BasicBlock>(unwrap(Val));
1713}
1714
1715LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val) {
1716 return wrap(unwrap<BasicBlock>(Val));
1717}
1718
Gordon Henriksen07a45f42008-03-23 22:21:29 +00001719LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB) {
1720 return wrap(unwrap(BB)->getParent());
Gordon Henriksen265f7802008-03-19 01:11:35 +00001721}
1722
Nate Begeman43c322b2011-08-23 20:27:46 +00001723LLVMValueRef LLVMGetBasicBlockTerminator(LLVMBasicBlockRef BB) {
1724 return wrap(unwrap(BB)->getTerminator());
1725}
1726
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001727unsigned LLVMCountBasicBlocks(LLVMValueRef FnRef) {
Dan Gohmanc7076912008-06-21 22:06:54 +00001728 return unwrap<Function>(FnRef)->size();
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001729}
1730
1731void LLVMGetBasicBlocks(LLVMValueRef FnRef, LLVMBasicBlockRef *BasicBlocksRefs){
1732 Function *Fn = unwrap<Function>(FnRef);
1733 for (Function::iterator I = Fn->begin(), E = Fn->end(); I != E; I++)
1734 *BasicBlocksRefs++ = wrap(I);
1735}
1736
1737LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn) {
1738 return wrap(&unwrap<Function>(Fn)->getEntryBlock());
1739}
1740
Gordon Henriksen054817c2008-03-19 03:47:18 +00001741LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn) {
1742 Function *Func = unwrap<Function>(Fn);
1743 Function::iterator I = Func->begin();
1744 if (I == Func->end())
Craig Topperc6207612014-04-09 06:08:46 +00001745 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001746 return wrap(I);
1747}
1748
1749LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn) {
1750 Function *Func = unwrap<Function>(Fn);
1751 Function::iterator I = Func->end();
1752 if (I == Func->begin())
Craig Topperc6207612014-04-09 06:08:46 +00001753 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001754 return wrap(--I);
1755}
1756
1757LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB) {
1758 BasicBlock *Block = unwrap(BB);
1759 Function::iterator I = Block;
1760 if (++I == Block->getParent()->end())
Craig Topperc6207612014-04-09 06:08:46 +00001761 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001762 return wrap(I);
1763}
1764
1765LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB) {
1766 BasicBlock *Block = unwrap(BB);
1767 Function::iterator I = Block;
1768 if (I == Block->getParent()->begin())
Craig Topperc6207612014-04-09 06:08:46 +00001769 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001770 return wrap(--I);
1771}
1772
Erick Tryzelaar262332f2009-08-14 00:01:31 +00001773LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
1774 LLVMValueRef FnRef,
1775 const char *Name) {
1776 return wrap(BasicBlock::Create(*unwrap(C), Name, unwrap<Function>(FnRef)));
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001777}
1778
Erick Tryzelaar262332f2009-08-14 00:01:31 +00001779LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef FnRef, const char *Name) {
1780 return LLVMAppendBasicBlockInContext(LLVMGetGlobalContext(), FnRef, Name);
1781}
1782
1783LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
1784 LLVMBasicBlockRef BBRef,
1785 const char *Name) {
1786 BasicBlock *BB = unwrap(BBRef);
1787 return wrap(BasicBlock::Create(*unwrap(C), Name, BB->getParent(), BB));
1788}
1789
1790LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef BBRef,
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001791 const char *Name) {
Erick Tryzelaar262332f2009-08-14 00:01:31 +00001792 return LLVMInsertBasicBlockInContext(LLVMGetGlobalContext(), BBRef, Name);
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001793}
1794
1795void LLVMDeleteBasicBlock(LLVMBasicBlockRef BBRef) {
1796 unwrap(BBRef)->eraseFromParent();
1797}
1798
Nate Begeman43c322b2011-08-23 20:27:46 +00001799void LLVMRemoveBasicBlockFromParent(LLVMBasicBlockRef BBRef) {
1800 unwrap(BBRef)->removeFromParent();
1801}
1802
Duncan Sandsb1d61aa2010-07-19 15:31:07 +00001803void LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) {
1804 unwrap(BB)->moveBefore(unwrap(MovePos));
1805}
1806
1807void LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) {
1808 unwrap(BB)->moveAfter(unwrap(MovePos));
1809}
1810
Gordon Henriksen265f7802008-03-19 01:11:35 +00001811/*--.. Operations on instructions ..........................................--*/
1812
1813LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst) {
1814 return wrap(unwrap<Instruction>(Inst)->getParent());
1815}
1816
Gordon Henriksen054817c2008-03-19 03:47:18 +00001817LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB) {
1818 BasicBlock *Block = unwrap(BB);
1819 BasicBlock::iterator I = Block->begin();
1820 if (I == Block->end())
Craig Topperc6207612014-04-09 06:08:46 +00001821 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001822 return wrap(I);
1823}
1824
1825LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB) {
1826 BasicBlock *Block = unwrap(BB);
1827 BasicBlock::iterator I = Block->end();
1828 if (I == Block->begin())
Craig Topperc6207612014-04-09 06:08:46 +00001829 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001830 return wrap(--I);
1831}
1832
1833LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst) {
1834 Instruction *Instr = unwrap<Instruction>(Inst);
1835 BasicBlock::iterator I = Instr;
1836 if (++I == Instr->getParent()->end())
Craig Topperc6207612014-04-09 06:08:46 +00001837 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001838 return wrap(I);
1839}
1840
1841LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst) {
1842 Instruction *Instr = unwrap<Instruction>(Inst);
1843 BasicBlock::iterator I = Instr;
1844 if (I == Instr->getParent()->begin())
Craig Topperc6207612014-04-09 06:08:46 +00001845 return nullptr;
Gordon Henriksen054817c2008-03-19 03:47:18 +00001846 return wrap(--I);
1847}
1848
Devang Pateldbebc6f2011-10-03 20:59:18 +00001849void LLVMInstructionEraseFromParent(LLVMValueRef Inst) {
1850 unwrap<Instruction>(Inst)->eraseFromParent();
1851}
1852
Torok Edwin60c40de2011-10-06 12:13:20 +00001853LLVMIntPredicate LLVMGetICmpPredicate(LLVMValueRef Inst) {
Torok Edwin2e9affe2011-10-14 20:37:42 +00001854 if (ICmpInst *I = dyn_cast<ICmpInst>(unwrap(Inst)))
1855 return (LLVMIntPredicate)I->getPredicate();
1856 if (ConstantExpr *CE = dyn_cast<ConstantExpr>(unwrap(Inst)))
1857 if (CE->getOpcode() == Instruction::ICmp)
1858 return (LLVMIntPredicate)CE->getPredicate();
1859 return (LLVMIntPredicate)0;
Torok Edwin60c40de2011-10-06 12:13:20 +00001860}
1861
Torok Edwinab6158e2011-10-14 20:37:49 +00001862LLVMOpcode LLVMGetInstructionOpcode(LLVMValueRef Inst) {
1863 if (Instruction *C = dyn_cast<Instruction>(unwrap(Inst)))
1864 return map_to_llvmopcode(C->getOpcode());
1865 return (LLVMOpcode)0;
1866}
1867
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001868/*--.. Call and invoke instructions ........................................--*/
1869
1870unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr) {
1871 Value *V = unwrap(Instr);
1872 if (CallInst *CI = dyn_cast<CallInst>(V))
1873 return CI->getCallingConv();
David Blaikie46a9f012012-01-20 21:51:11 +00001874 if (InvokeInst *II = dyn_cast<InvokeInst>(V))
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001875 return II->getCallingConv();
Torok Edwinfbcc6632009-07-14 16:55:14 +00001876 llvm_unreachable("LLVMGetInstructionCallConv applies only to call and invoke!");
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001877}
1878
1879void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC) {
1880 Value *V = unwrap(Instr);
1881 if (CallInst *CI = dyn_cast<CallInst>(V))
Sandeep Patel68c5f472009-09-02 08:44:58 +00001882 return CI->setCallingConv(static_cast<CallingConv::ID>(CC));
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001883 else if (InvokeInst *II = dyn_cast<InvokeInst>(V))
Sandeep Patel68c5f472009-09-02 08:44:58 +00001884 return II->setCallingConv(static_cast<CallingConv::ID>(CC));
Torok Edwinfbcc6632009-07-14 16:55:14 +00001885 llvm_unreachable("LLVMSetInstructionCallConv applies only to call and invoke!");
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001886}
1887
Andrew Trickdc073ad2013-09-18 23:31:10 +00001888void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index,
Devang Patel4c758ea2008-09-25 21:00:45 +00001889 LLVMAttribute PA) {
Gordon Henriksen2d9cc212008-04-28 17:37:06 +00001890 CallSite Call = CallSite(unwrap<Instruction>(Instr));
Bill Wendling50d27842012-10-15 20:35:56 +00001891 AttrBuilder B(PA);
Devang Patel4c758ea2008-09-25 21:00:45 +00001892 Call.setAttributes(
Bill Wendling09175b32013-01-22 21:15:51 +00001893 Call.getAttributes().addAttributes(Call->getContext(), index,
1894 AttributeSet::get(Call->getContext(),
1895 index, B)));
Gordon Henriksen2d9cc212008-04-28 17:37:06 +00001896}
1897
Andrew Trickdc073ad2013-09-18 23:31:10 +00001898void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index,
Devang Patel4c758ea2008-09-25 21:00:45 +00001899 LLVMAttribute PA) {
Gordon Henriksen2d9cc212008-04-28 17:37:06 +00001900 CallSite Call = CallSite(unwrap<Instruction>(Instr));
Bill Wendling50d27842012-10-15 20:35:56 +00001901 AttrBuilder B(PA);
Bill Wendling430fa9b2013-01-23 00:45:55 +00001902 Call.setAttributes(Call.getAttributes()
1903 .removeAttributes(Call->getContext(), index,
1904 AttributeSet::get(Call->getContext(),
1905 index, B)));
Gordon Henriksen2d9cc212008-04-28 17:37:06 +00001906}
1907
Andrew Trickdc073ad2013-09-18 23:31:10 +00001908void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
Gordon Henriksen2d9cc212008-04-28 17:37:06 +00001909 unsigned align) {
1910 CallSite Call = CallSite(unwrap<Instruction>(Instr));
Bill Wendling50d27842012-10-15 20:35:56 +00001911 AttrBuilder B;
Bill Wendlingabd5ba22012-10-14 03:58:29 +00001912 B.addAlignmentAttr(align);
Bill Wendling09175b32013-01-22 21:15:51 +00001913 Call.setAttributes(Call.getAttributes()
1914 .addAttributes(Call->getContext(), index,
1915 AttributeSet::get(Call->getContext(),
1916 index, B)));
Gordon Henriksen2d9cc212008-04-28 17:37:06 +00001917}
1918
Gordon Henrikseneeb65372008-08-30 16:34:54 +00001919/*--.. Operations on call instructions (only) ..............................--*/
1920
Chris Lattner25963c62010-01-09 22:27:07 +00001921LLVMBool LLVMIsTailCall(LLVMValueRef Call) {
Gordon Henrikseneeb65372008-08-30 16:34:54 +00001922 return unwrap<CallInst>(Call)->isTailCall();
1923}
1924
Chris Lattner25963c62010-01-09 22:27:07 +00001925void LLVMSetTailCall(LLVMValueRef Call, LLVMBool isTailCall) {
Gordon Henrikseneeb65372008-08-30 16:34:54 +00001926 unwrap<CallInst>(Call)->setTailCall(isTailCall);
1927}
1928
Nate Begeman43c322b2011-08-23 20:27:46 +00001929/*--.. Operations on switch instructions (only) ............................--*/
1930
1931LLVMBasicBlockRef LLVMGetSwitchDefaultDest(LLVMValueRef Switch) {
1932 return wrap(unwrap<SwitchInst>(Switch)->getDefaultDest());
1933}
1934
Gordon Henriksen44dd8fb2007-10-08 18:14:39 +00001935/*--.. Operations on phi nodes .............................................--*/
1936
1937void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
1938 LLVMBasicBlockRef *IncomingBlocks, unsigned Count) {
1939 PHINode *PhiVal = unwrap<PHINode>(PhiNode);
1940 for (unsigned I = 0; I != Count; ++I)
1941 PhiVal->addIncoming(unwrap(IncomingValues[I]), unwrap(IncomingBlocks[I]));
1942}
1943
1944unsigned LLVMCountIncoming(LLVMValueRef PhiNode) {
1945 return unwrap<PHINode>(PhiNode)->getNumIncomingValues();
1946}
1947
1948LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index) {
1949 return wrap(unwrap<PHINode>(PhiNode)->getIncomingValue(Index));
1950}
1951
1952LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index) {
1953 return wrap(unwrap<PHINode>(PhiNode)->getIncomingBlock(Index));
1954}
1955
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001956
1957/*===-- Instruction builders ----------------------------------------------===*/
1958
Erick Tryzelaar262332f2009-08-14 00:01:31 +00001959LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C) {
1960 return wrap(new IRBuilder<>(*unwrap(C)));
1961}
1962
Gordon Henriksena735a9c2008-05-04 12:55:34 +00001963LLVMBuilderRef LLVMCreateBuilder(void) {
Erick Tryzelaar262332f2009-08-14 00:01:31 +00001964 return LLVMCreateBuilderInContext(LLVMGetGlobalContext());
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001965}
1966
Gordon Henriksen054817c2008-03-19 03:47:18 +00001967void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
1968 LLVMValueRef Instr) {
1969 BasicBlock *BB = unwrap(Block);
1970 Instruction *I = Instr? unwrap<Instruction>(Instr) : (Instruction*) BB->end();
1971 unwrap(Builder)->SetInsertPoint(BB, I);
1972}
1973
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00001974void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr) {
1975 Instruction *I = unwrap<Instruction>(Instr);
1976 unwrap(Builder)->SetInsertPoint(I->getParent(), I);
1977}
1978
1979void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block) {
1980 BasicBlock *BB = unwrap(Block);
1981 unwrap(Builder)->SetInsertPoint(BB);
1982}
1983
Gordon Henriksen265f7802008-03-19 01:11:35 +00001984LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder) {
1985 return wrap(unwrap(Builder)->GetInsertBlock());
1986}
1987
Chris Lattner3d1f5522008-12-17 21:39:50 +00001988void LLVMClearInsertionPosition(LLVMBuilderRef Builder) {
Chris Lattnere4bcde82010-04-01 06:31:45 +00001989 unwrap(Builder)->ClearInsertionPoint();
Chris Lattner3d1f5522008-12-17 21:39:50 +00001990}
1991
1992void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr) {
1993 unwrap(Builder)->Insert(unwrap<Instruction>(Instr));
1994}
1995
Erick Tryzelaar9813bea2009-08-16 02:20:57 +00001996void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
1997 const char *Name) {
1998 unwrap(Builder)->Insert(unwrap<Instruction>(Instr), Name);
1999}
2000
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002001void LLVMDisposeBuilder(LLVMBuilderRef Builder) {
2002 delete unwrap(Builder);
2003}
2004
Erick Tryzelaard8531fa2010-02-28 09:45:59 +00002005/*--.. Metadata builders ...................................................--*/
2006
2007void LLVMSetCurrentDebugLocation(LLVMBuilderRef Builder, LLVMValueRef L) {
Craig Topperc6207612014-04-09 06:08:46 +00002008 MDNode *Loc = L ? unwrap<MDNode>(L) : nullptr;
Chris Lattner593916d2010-04-02 20:21:22 +00002009 unwrap(Builder)->SetCurrentDebugLocation(DebugLoc::getFromDILocation(Loc));
Erick Tryzelaard8531fa2010-02-28 09:45:59 +00002010}
2011
2012LLVMValueRef LLVMGetCurrentDebugLocation(LLVMBuilderRef Builder) {
Chris Lattnere4bcde82010-04-01 06:31:45 +00002013 return wrap(unwrap(Builder)->getCurrentDebugLocation()
2014 .getAsMDNode(unwrap(Builder)->getContext()));
Erick Tryzelaard8531fa2010-02-28 09:45:59 +00002015}
2016
2017void LLVMSetInstDebugLocation(LLVMBuilderRef Builder, LLVMValueRef Inst) {
2018 unwrap(Builder)->SetInstDebugLocation(unwrap<Instruction>(Inst));
2019}
2020
2021
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002022/*--.. Instruction builders ................................................--*/
2023
2024LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef B) {
2025 return wrap(unwrap(B)->CreateRetVoid());
2026}
2027
2028LLVMValueRef LLVMBuildRet(LLVMBuilderRef B, LLVMValueRef V) {
2029 return wrap(unwrap(B)->CreateRet(unwrap(V)));
2030}
2031
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00002032LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef B, LLVMValueRef *RetVals,
2033 unsigned N) {
2034 return wrap(unwrap(B)->CreateAggregateRet(unwrap(RetVals), N));
2035}
2036
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002037LLVMValueRef LLVMBuildBr(LLVMBuilderRef B, LLVMBasicBlockRef Dest) {
2038 return wrap(unwrap(B)->CreateBr(unwrap(Dest)));
2039}
2040
2041LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef B, LLVMValueRef If,
2042 LLVMBasicBlockRef Then, LLVMBasicBlockRef Else) {
2043 return wrap(unwrap(B)->CreateCondBr(unwrap(If), unwrap(Then), unwrap(Else)));
2044}
2045
2046LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef B, LLVMValueRef V,
2047 LLVMBasicBlockRef Else, unsigned NumCases) {
2048 return wrap(unwrap(B)->CreateSwitch(unwrap(V), unwrap(Else), NumCases));
2049}
2050
Erick Tryzelaar0fb26ef2010-02-28 09:46:06 +00002051LLVMValueRef LLVMBuildIndirectBr(LLVMBuilderRef B, LLVMValueRef Addr,
2052 unsigned NumDests) {
2053 return wrap(unwrap(B)->CreateIndirectBr(unwrap(Addr), NumDests));
2054}
2055
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002056LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn,
2057 LLVMValueRef *Args, unsigned NumArgs,
2058 LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
2059 const char *Name) {
2060 return wrap(unwrap(B)->CreateInvoke(unwrap(Fn), unwrap(Then), unwrap(Catch),
Frits van Bommel717d7ed2011-07-18 12:00:32 +00002061 makeArrayRef(unwrap(Args), NumArgs),
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002062 Name));
2063}
2064
Bill Wendlingfae14752011-08-12 20:24:12 +00002065LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty,
2066 LLVMValueRef PersFn, unsigned NumClauses,
2067 const char *Name) {
2068 return wrap(unwrap(B)->CreateLandingPad(unwrap(Ty),
2069 cast<Function>(unwrap(PersFn)),
2070 NumClauses, Name));
2071}
2072
Bill Wendlingf891bf82011-07-31 06:30:59 +00002073LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn) {
2074 return wrap(unwrap(B)->CreateResume(unwrap(Exn)));
2075}
2076
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002077LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef B) {
2078 return wrap(unwrap(B)->CreateUnreachable());
2079}
2080
Gordon Henriksen097102c2008-01-01 05:50:53 +00002081void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
2082 LLVMBasicBlockRef Dest) {
2083 unwrap<SwitchInst>(Switch)->addCase(unwrap<ConstantInt>(OnVal), unwrap(Dest));
2084}
2085
Erick Tryzelaar0fb26ef2010-02-28 09:46:06 +00002086void LLVMAddDestination(LLVMValueRef IndirectBr, LLVMBasicBlockRef Dest) {
2087 unwrap<IndirectBrInst>(IndirectBr)->addDestination(unwrap(Dest));
2088}
2089
Bill Wendlingfae14752011-08-12 20:24:12 +00002090void LLVMAddClause(LLVMValueRef LandingPad, LLVMValueRef ClauseVal) {
2091 unwrap<LandingPadInst>(LandingPad)->
2092 addClause(cast<Constant>(unwrap(ClauseVal)));
2093}
2094
2095void LLVMSetCleanup(LLVMValueRef LandingPad, LLVMBool Val) {
2096 unwrap<LandingPadInst>(LandingPad)->setCleanup(Val);
2097}
2098
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002099/*--.. Arithmetic ..........................................................--*/
2100
2101LLVMValueRef LLVMBuildAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2102 const char *Name) {
2103 return wrap(unwrap(B)->CreateAdd(unwrap(LHS), unwrap(RHS), Name));
2104}
2105
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00002106LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2107 const char *Name) {
2108 return wrap(unwrap(B)->CreateNSWAdd(unwrap(LHS), unwrap(RHS), Name));
2109}
2110
Erick Tryzelaar4c340c72010-02-28 05:51:43 +00002111LLVMValueRef LLVMBuildNUWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2112 const char *Name) {
2113 return wrap(unwrap(B)->CreateNUWAdd(unwrap(LHS), unwrap(RHS), Name));
2114}
2115
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00002116LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2117 const char *Name) {
2118 return wrap(unwrap(B)->CreateFAdd(unwrap(LHS), unwrap(RHS), Name));
2119}
2120
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002121LLVMValueRef LLVMBuildSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2122 const char *Name) {
2123 return wrap(unwrap(B)->CreateSub(unwrap(LHS), unwrap(RHS), Name));
2124}
2125
Erick Tryzelaar4c340c72010-02-28 05:51:43 +00002126LLVMValueRef LLVMBuildNSWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2127 const char *Name) {
2128 return wrap(unwrap(B)->CreateNSWSub(unwrap(LHS), unwrap(RHS), Name));
2129}
2130
2131LLVMValueRef LLVMBuildNUWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2132 const char *Name) {
2133 return wrap(unwrap(B)->CreateNUWSub(unwrap(LHS), unwrap(RHS), Name));
2134}
2135
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00002136LLVMValueRef LLVMBuildFSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2137 const char *Name) {
2138 return wrap(unwrap(B)->CreateFSub(unwrap(LHS), unwrap(RHS), Name));
2139}
2140
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002141LLVMValueRef LLVMBuildMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2142 const char *Name) {
2143 return wrap(unwrap(B)->CreateMul(unwrap(LHS), unwrap(RHS), Name));
2144}
2145
Erick Tryzelaar4c340c72010-02-28 05:51:43 +00002146LLVMValueRef LLVMBuildNSWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2147 const char *Name) {
2148 return wrap(unwrap(B)->CreateNSWMul(unwrap(LHS), unwrap(RHS), Name));
2149}
2150
2151LLVMValueRef LLVMBuildNUWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2152 const char *Name) {
2153 return wrap(unwrap(B)->CreateNUWMul(unwrap(LHS), unwrap(RHS), Name));
2154}
2155
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00002156LLVMValueRef LLVMBuildFMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2157 const char *Name) {
2158 return wrap(unwrap(B)->CreateFMul(unwrap(LHS), unwrap(RHS), Name));
2159}
2160
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002161LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2162 const char *Name) {
2163 return wrap(unwrap(B)->CreateUDiv(unwrap(LHS), unwrap(RHS), Name));
2164}
2165
2166LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2167 const char *Name) {
2168 return wrap(unwrap(B)->CreateSDiv(unwrap(LHS), unwrap(RHS), Name));
2169}
2170
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00002171LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef B, LLVMValueRef LHS,
2172 LLVMValueRef RHS, const char *Name) {
2173 return wrap(unwrap(B)->CreateExactSDiv(unwrap(LHS), unwrap(RHS), Name));
2174}
2175
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002176LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2177 const char *Name) {
2178 return wrap(unwrap(B)->CreateFDiv(unwrap(LHS), unwrap(RHS), Name));
2179}
2180
2181LLVMValueRef LLVMBuildURem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2182 const char *Name) {
2183 return wrap(unwrap(B)->CreateURem(unwrap(LHS), unwrap(RHS), Name));
2184}
2185
2186LLVMValueRef LLVMBuildSRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2187 const char *Name) {
2188 return wrap(unwrap(B)->CreateSRem(unwrap(LHS), unwrap(RHS), Name));
2189}
2190
2191LLVMValueRef LLVMBuildFRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2192 const char *Name) {
2193 return wrap(unwrap(B)->CreateFRem(unwrap(LHS), unwrap(RHS), Name));
2194}
2195
2196LLVMValueRef LLVMBuildShl(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2197 const char *Name) {
2198 return wrap(unwrap(B)->CreateShl(unwrap(LHS), unwrap(RHS), Name));
2199}
2200
2201LLVMValueRef LLVMBuildLShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2202 const char *Name) {
2203 return wrap(unwrap(B)->CreateLShr(unwrap(LHS), unwrap(RHS), Name));
2204}
2205
2206LLVMValueRef LLVMBuildAShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2207 const char *Name) {
2208 return wrap(unwrap(B)->CreateAShr(unwrap(LHS), unwrap(RHS), Name));
2209}
2210
2211LLVMValueRef LLVMBuildAnd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2212 const char *Name) {
2213 return wrap(unwrap(B)->CreateAnd(unwrap(LHS), unwrap(RHS), Name));
2214}
2215
2216LLVMValueRef LLVMBuildOr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2217 const char *Name) {
2218 return wrap(unwrap(B)->CreateOr(unwrap(LHS), unwrap(RHS), Name));
2219}
2220
2221LLVMValueRef LLVMBuildXor(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
2222 const char *Name) {
2223 return wrap(unwrap(B)->CreateXor(unwrap(LHS), unwrap(RHS), Name));
2224}
2225
Erick Tryzelaar31831792010-02-28 05:51:27 +00002226LLVMValueRef LLVMBuildBinOp(LLVMBuilderRef B, LLVMOpcode Op,
2227 LLVMValueRef LHS, LLVMValueRef RHS,
2228 const char *Name) {
Torok Edwin05dc9d62011-10-06 12:39:34 +00002229 return wrap(unwrap(B)->CreateBinOp(Instruction::BinaryOps(map_from_llvmopcode(Op)), unwrap(LHS),
Erick Tryzelaar31831792010-02-28 05:51:27 +00002230 unwrap(RHS), Name));
2231}
2232
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002233LLVMValueRef LLVMBuildNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
2234 return wrap(unwrap(B)->CreateNeg(unwrap(V), Name));
2235}
2236
Erick Tryzelaar4c340c72010-02-28 05:51:43 +00002237LLVMValueRef LLVMBuildNSWNeg(LLVMBuilderRef B, LLVMValueRef V,
2238 const char *Name) {
2239 return wrap(unwrap(B)->CreateNSWNeg(unwrap(V), Name));
2240}
2241
2242LLVMValueRef LLVMBuildNUWNeg(LLVMBuilderRef B, LLVMValueRef V,
2243 const char *Name) {
2244 return wrap(unwrap(B)->CreateNUWNeg(unwrap(V), Name));
2245}
2246
Dan Gohmanf919bd62009-09-28 21:51:41 +00002247LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
2248 return wrap(unwrap(B)->CreateFNeg(unwrap(V), Name));
2249}
2250
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002251LLVMValueRef LLVMBuildNot(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
2252 return wrap(unwrap(B)->CreateNot(unwrap(V), Name));
2253}
2254
2255/*--.. Memory ..............................................................--*/
2256
2257LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
2258 const char *Name) {
Chris Lattner229907c2011-07-18 04:54:35 +00002259 Type* ITy = Type::getInt32Ty(unwrap(B)->GetInsertBlock()->getContext());
Victor Hernandezf3db9152009-11-07 00:16:28 +00002260 Constant* AllocSize = ConstantExpr::getSizeOf(unwrap(Ty));
2261 AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, ITy);
Andrew Trickdc073ad2013-09-18 23:31:10 +00002262 Instruction* Malloc = CallInst::CreateMalloc(unwrap(B)->GetInsertBlock(),
2263 ITy, unwrap(Ty), AllocSize,
Craig Topperc6207612014-04-09 06:08:46 +00002264 nullptr, nullptr, "");
Victor Hernandezf3db9152009-11-07 00:16:28 +00002265 return wrap(unwrap(B)->Insert(Malloc, Twine(Name)));
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002266}
2267
2268LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
2269 LLVMValueRef Val, const char *Name) {
Chris Lattner229907c2011-07-18 04:54:35 +00002270 Type* ITy = Type::getInt32Ty(unwrap(B)->GetInsertBlock()->getContext());
Victor Hernandezf3db9152009-11-07 00:16:28 +00002271 Constant* AllocSize = ConstantExpr::getSizeOf(unwrap(Ty));
2272 AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, ITy);
Andrew Trickdc073ad2013-09-18 23:31:10 +00002273 Instruction* Malloc = CallInst::CreateMalloc(unwrap(B)->GetInsertBlock(),
2274 ITy, unwrap(Ty), AllocSize,
Craig Topperc6207612014-04-09 06:08:46 +00002275 unwrap(Val), nullptr, "");
Victor Hernandezf3db9152009-11-07 00:16:28 +00002276 return wrap(unwrap(B)->Insert(Malloc, Twine(Name)));
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002277}
2278
2279LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
2280 const char *Name) {
Craig Topperc6207612014-04-09 06:08:46 +00002281 return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), nullptr, Name));
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002282}
2283
2284LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
2285 LLVMValueRef Val, const char *Name) {
2286 return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), unwrap(Val), Name));
2287}
2288
2289LLVMValueRef LLVMBuildFree(LLVMBuilderRef B, LLVMValueRef PointerVal) {
Victor Hernandezde5ad422009-10-26 23:43:48 +00002290 return wrap(unwrap(B)->Insert(
2291 CallInst::CreateFree(unwrap(PointerVal), unwrap(B)->GetInsertBlock())));
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002292}
2293
2294
2295LLVMValueRef LLVMBuildLoad(LLVMBuilderRef B, LLVMValueRef PointerVal,
2296 const char *Name) {
2297 return wrap(unwrap(B)->CreateLoad(unwrap(PointerVal), Name));
2298}
2299
Andrew Trickdc073ad2013-09-18 23:31:10 +00002300LLVMValueRef LLVMBuildStore(LLVMBuilderRef B, LLVMValueRef Val,
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002301 LLVMValueRef PointerVal) {
2302 return wrap(unwrap(B)->CreateStore(unwrap(Val), unwrap(PointerVal)));
2303}
2304
Filip Pizlo0d3f7ec2013-11-20 00:07:49 +00002305static AtomicOrdering mapFromLLVMOrdering(LLVMAtomicOrdering Ordering) {
2306 switch (Ordering) {
2307 case LLVMAtomicOrderingNotAtomic: return NotAtomic;
2308 case LLVMAtomicOrderingUnordered: return Unordered;
2309 case LLVMAtomicOrderingMonotonic: return Monotonic;
2310 case LLVMAtomicOrderingAcquire: return Acquire;
2311 case LLVMAtomicOrderingRelease: return Release;
2312 case LLVMAtomicOrderingAcquireRelease: return AcquireRelease;
2313 case LLVMAtomicOrderingSequentiallyConsistent:
2314 return SequentiallyConsistent;
2315 }
2316
2317 llvm_unreachable("Invalid LLVMAtomicOrdering value!");
2318}
2319
2320LLVMValueRef LLVMBuildFence(LLVMBuilderRef B, LLVMAtomicOrdering Ordering,
2321 LLVMBool isSingleThread, const char *Name) {
2322 return wrap(
2323 unwrap(B)->CreateFence(mapFromLLVMOrdering(Ordering),
2324 isSingleThread ? SingleThread : CrossThread,
2325 Name));
2326}
2327
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002328LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
2329 LLVMValueRef *Indices, unsigned NumIndices,
2330 const char *Name) {
Jay Foad040dd822011-07-22 08:16:57 +00002331 ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices);
2332 return wrap(unwrap(B)->CreateGEP(unwrap(Pointer), IdxList, Name));
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002333}
2334
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00002335LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
2336 LLVMValueRef *Indices, unsigned NumIndices,
2337 const char *Name) {
Jay Foad040dd822011-07-22 08:16:57 +00002338 ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices);
2339 return wrap(unwrap(B)->CreateInBoundsGEP(unwrap(Pointer), IdxList, Name));
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00002340}
2341
2342LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
2343 unsigned Idx, const char *Name) {
2344 return wrap(unwrap(B)->CreateStructGEP(unwrap(Pointer), Idx, Name));
2345}
2346
2347LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
2348 const char *Name) {
2349 return wrap(unwrap(B)->CreateGlobalString(Str, Name));
2350}
2351
2352LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
2353 const char *Name) {
2354 return wrap(unwrap(B)->CreateGlobalStringPtr(Str, Name));
2355}
2356
Chris Lattner2cc6f9d2012-03-22 03:54:15 +00002357LLVMBool LLVMGetVolatile(LLVMValueRef MemAccessInst) {
2358 Value *P = unwrap<Value>(MemAccessInst);
2359 if (LoadInst *LI = dyn_cast<LoadInst>(P))
2360 return LI->isVolatile();
2361 return cast<StoreInst>(P)->isVolatile();
2362}
2363
2364void LLVMSetVolatile(LLVMValueRef MemAccessInst, LLVMBool isVolatile) {
2365 Value *P = unwrap<Value>(MemAccessInst);
2366 if (LoadInst *LI = dyn_cast<LoadInst>(P))
2367 return LI->setVolatile(isVolatile);
2368 return cast<StoreInst>(P)->setVolatile(isVolatile);
2369}
2370
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002371/*--.. Casts ...............................................................--*/
2372
2373LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef B, LLVMValueRef Val,
2374 LLVMTypeRef DestTy, const char *Name) {
2375 return wrap(unwrap(B)->CreateTrunc(unwrap(Val), unwrap(DestTy), Name));
2376}
2377
2378LLVMValueRef LLVMBuildZExt(LLVMBuilderRef B, LLVMValueRef Val,
2379 LLVMTypeRef DestTy, const char *Name) {
2380 return wrap(unwrap(B)->CreateZExt(unwrap(Val), unwrap(DestTy), Name));
2381}
2382
2383LLVMValueRef LLVMBuildSExt(LLVMBuilderRef B, LLVMValueRef Val,
2384 LLVMTypeRef DestTy, const char *Name) {
2385 return wrap(unwrap(B)->CreateSExt(unwrap(Val), unwrap(DestTy), Name));
2386}
2387
2388LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef B, LLVMValueRef Val,
2389 LLVMTypeRef DestTy, const char *Name) {
2390 return wrap(unwrap(B)->CreateFPToUI(unwrap(Val), unwrap(DestTy), Name));
2391}
2392
2393LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef B, LLVMValueRef Val,
2394 LLVMTypeRef DestTy, const char *Name) {
2395 return wrap(unwrap(B)->CreateFPToSI(unwrap(Val), unwrap(DestTy), Name));
2396}
2397
2398LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef B, LLVMValueRef Val,
2399 LLVMTypeRef DestTy, const char *Name) {
2400 return wrap(unwrap(B)->CreateUIToFP(unwrap(Val), unwrap(DestTy), Name));
2401}
2402
2403LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef B, LLVMValueRef Val,
2404 LLVMTypeRef DestTy, const char *Name) {
2405 return wrap(unwrap(B)->CreateSIToFP(unwrap(Val), unwrap(DestTy), Name));
2406}
2407
2408LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef B, LLVMValueRef Val,
2409 LLVMTypeRef DestTy, const char *Name) {
2410 return wrap(unwrap(B)->CreateFPTrunc(unwrap(Val), unwrap(DestTy), Name));
2411}
2412
2413LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef B, LLVMValueRef Val,
2414 LLVMTypeRef DestTy, const char *Name) {
2415 return wrap(unwrap(B)->CreateFPExt(unwrap(Val), unwrap(DestTy), Name));
2416}
2417
2418LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef B, LLVMValueRef Val,
2419 LLVMTypeRef DestTy, const char *Name) {
2420 return wrap(unwrap(B)->CreatePtrToInt(unwrap(Val), unwrap(DestTy), Name));
2421}
2422
2423LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef B, LLVMValueRef Val,
2424 LLVMTypeRef DestTy, const char *Name) {
2425 return wrap(unwrap(B)->CreateIntToPtr(unwrap(Val), unwrap(DestTy), Name));
2426}
2427
2428LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef B, LLVMValueRef Val,
2429 LLVMTypeRef DestTy, const char *Name) {
2430 return wrap(unwrap(B)->CreateBitCast(unwrap(Val), unwrap(DestTy), Name));
2431}
2432
Matt Arsenaultb03bd4d2013-11-15 01:34:59 +00002433LLVMValueRef LLVMBuildAddrSpaceCast(LLVMBuilderRef B, LLVMValueRef Val,
2434 LLVMTypeRef DestTy, const char *Name) {
2435 return wrap(unwrap(B)->CreateAddrSpaceCast(unwrap(Val), unwrap(DestTy), Name));
2436}
2437
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00002438LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
2439 LLVMTypeRef DestTy, const char *Name) {
2440 return wrap(unwrap(B)->CreateZExtOrBitCast(unwrap(Val), unwrap(DestTy),
2441 Name));
2442}
2443
2444LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
2445 LLVMTypeRef DestTy, const char *Name) {
2446 return wrap(unwrap(B)->CreateSExtOrBitCast(unwrap(Val), unwrap(DestTy),
2447 Name));
2448}
2449
2450LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
2451 LLVMTypeRef DestTy, const char *Name) {
2452 return wrap(unwrap(B)->CreateTruncOrBitCast(unwrap(Val), unwrap(DestTy),
2453 Name));
2454}
2455
Erick Tryzelaar31831792010-02-28 05:51:27 +00002456LLVMValueRef LLVMBuildCast(LLVMBuilderRef B, LLVMOpcode Op, LLVMValueRef Val,
2457 LLVMTypeRef DestTy, const char *Name) {
Torok Edwin05dc9d62011-10-06 12:39:34 +00002458 return wrap(unwrap(B)->CreateCast(Instruction::CastOps(map_from_llvmopcode(Op)), unwrap(Val),
Erick Tryzelaar31831792010-02-28 05:51:27 +00002459 unwrap(DestTy), Name));
2460}
2461
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00002462LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef B, LLVMValueRef Val,
2463 LLVMTypeRef DestTy, const char *Name) {
2464 return wrap(unwrap(B)->CreatePointerCast(unwrap(Val), unwrap(DestTy), Name));
2465}
2466
2467LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef B, LLVMValueRef Val,
Duncan Sands9d786d72009-11-23 10:49:03 +00002468 LLVMTypeRef DestTy, const char *Name) {
2469 return wrap(unwrap(B)->CreateIntCast(unwrap(Val), unwrap(DestTy),
2470 /*isSigned*/true, Name));
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00002471}
2472
2473LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef B, LLVMValueRef Val,
2474 LLVMTypeRef DestTy, const char *Name) {
2475 return wrap(unwrap(B)->CreateFPCast(unwrap(Val), unwrap(DestTy), Name));
2476}
2477
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002478/*--.. Comparisons .........................................................--*/
2479
2480LLVMValueRef LLVMBuildICmp(LLVMBuilderRef B, LLVMIntPredicate Op,
2481 LLVMValueRef LHS, LLVMValueRef RHS,
2482 const char *Name) {
2483 return wrap(unwrap(B)->CreateICmp(static_cast<ICmpInst::Predicate>(Op),
2484 unwrap(LHS), unwrap(RHS), Name));
2485}
2486
2487LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef B, LLVMRealPredicate Op,
2488 LLVMValueRef LHS, LLVMValueRef RHS,
2489 const char *Name) {
2490 return wrap(unwrap(B)->CreateFCmp(static_cast<FCmpInst::Predicate>(Op),
2491 unwrap(LHS), unwrap(RHS), Name));
2492}
2493
2494/*--.. Miscellaneous instructions ..........................................--*/
2495
2496LLVMValueRef LLVMBuildPhi(LLVMBuilderRef B, LLVMTypeRef Ty, const char *Name) {
Jay Foad52131342011-03-30 11:28:46 +00002497 return wrap(unwrap(B)->CreatePHI(unwrap(Ty), 0, Name));
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002498}
2499
2500LLVMValueRef LLVMBuildCall(LLVMBuilderRef B, LLVMValueRef Fn,
2501 LLVMValueRef *Args, unsigned NumArgs,
2502 const char *Name) {
Jay Foad5bd375a2011-07-15 08:37:34 +00002503 return wrap(unwrap(B)->CreateCall(unwrap(Fn),
Frits van Bommel717d7ed2011-07-18 12:00:32 +00002504 makeArrayRef(unwrap(Args), NumArgs),
Jay Foad5bd375a2011-07-15 08:37:34 +00002505 Name));
Gordon Henriksenc23b66c2007-09-26 20:56:12 +00002506}
2507
2508LLVMValueRef LLVMBuildSelect(LLVMBuilderRef B, LLVMValueRef If,
2509 LLVMValueRef Then, LLVMValueRef Else,
2510 const char *Name) {
2511 return wrap(unwrap(B)->CreateSelect(unwrap(If), unwrap(Then), unwrap(Else),
2512 Name));
2513}
2514
2515LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef B, LLVMValueRef List,
2516 LLVMTypeRef Ty, const char *Name) {
2517 return wrap(unwrap(B)->CreateVAArg(unwrap(List), unwrap(Ty), Name));
2518}
2519
2520LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef B, LLVMValueRef VecVal,
2521 LLVMValueRef Index, const char *Name) {
2522 return wrap(unwrap(B)->CreateExtractElement(unwrap(VecVal), unwrap(Index),
2523 Name));
2524}
2525
2526LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef B, LLVMValueRef VecVal,
2527 LLVMValueRef EltVal, LLVMValueRef Index,
2528 const char *Name) {
2529 return wrap(unwrap(B)->CreateInsertElement(unwrap(VecVal), unwrap(EltVal),
2530 unwrap(Index), Name));
2531}
2532
2533LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef B, LLVMValueRef V1,
2534 LLVMValueRef V2, LLVMValueRef Mask,
2535 const char *Name) {
2536 return wrap(unwrap(B)->CreateShuffleVector(unwrap(V1), unwrap(V2),
2537 unwrap(Mask), Name));
2538}
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00002539
Dan Gohmand5104a52008-11-03 22:55:43 +00002540LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef B, LLVMValueRef AggVal,
2541 unsigned Index, const char *Name) {
2542 return wrap(unwrap(B)->CreateExtractValue(unwrap(AggVal), Index, Name));
2543}
2544
2545LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef B, LLVMValueRef AggVal,
2546 LLVMValueRef EltVal, unsigned Index,
2547 const char *Name) {
2548 return wrap(unwrap(B)->CreateInsertValue(unwrap(AggVal), unwrap(EltVal),
2549 Index, Name));
2550}
2551
Erick Tryzelaar3045b8b2009-08-16 02:19:59 +00002552LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef B, LLVMValueRef Val,
2553 const char *Name) {
2554 return wrap(unwrap(B)->CreateIsNull(unwrap(Val), Name));
2555}
2556
2557LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef B, LLVMValueRef Val,
2558 const char *Name) {
2559 return wrap(unwrap(B)->CreateIsNotNull(unwrap(Val), Name));
2560}
2561
2562LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef B, LLVMValueRef LHS,
2563 LLVMValueRef RHS, const char *Name) {
2564 return wrap(unwrap(B)->CreatePtrDiff(unwrap(LHS), unwrap(RHS), Name));
2565}
2566
Andrew Trickdc073ad2013-09-18 23:31:10 +00002567LLVMValueRef LLVMBuildAtomicRMW(LLVMBuilderRef B,LLVMAtomicRMWBinOp op,
2568 LLVMValueRef PTR, LLVMValueRef Val,
2569 LLVMAtomicOrdering ordering,
Carlo Kok8c6719b2013-04-23 13:21:19 +00002570 LLVMBool singleThread) {
2571 AtomicRMWInst::BinOp intop;
2572 switch (op) {
2573 case LLVMAtomicRMWBinOpXchg: intop = AtomicRMWInst::Xchg; break;
2574 case LLVMAtomicRMWBinOpAdd: intop = AtomicRMWInst::Add; break;
2575 case LLVMAtomicRMWBinOpSub: intop = AtomicRMWInst::Sub; break;
2576 case LLVMAtomicRMWBinOpAnd: intop = AtomicRMWInst::And; break;
2577 case LLVMAtomicRMWBinOpNand: intop = AtomicRMWInst::Nand; break;
2578 case LLVMAtomicRMWBinOpOr: intop = AtomicRMWInst::Or; break;
2579 case LLVMAtomicRMWBinOpXor: intop = AtomicRMWInst::Xor; break;
2580 case LLVMAtomicRMWBinOpMax: intop = AtomicRMWInst::Max; break;
2581 case LLVMAtomicRMWBinOpMin: intop = AtomicRMWInst::Min; break;
2582 case LLVMAtomicRMWBinOpUMax: intop = AtomicRMWInst::UMax; break;
2583 case LLVMAtomicRMWBinOpUMin: intop = AtomicRMWInst::UMin; break;
2584 }
Andrew Trickdc073ad2013-09-18 23:31:10 +00002585 return wrap(unwrap(B)->CreateAtomicRMW(intop, unwrap(PTR), unwrap(Val),
Filip Pizlo0d3f7ec2013-11-20 00:07:49 +00002586 mapFromLLVMOrdering(ordering), singleThread ? SingleThread : CrossThread));
Carlo Kok8c6719b2013-04-23 13:21:19 +00002587}
2588
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00002589
2590/*===-- Module providers --------------------------------------------------===*/
2591
2592LLVMModuleProviderRef
2593LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M) {
Jeffrey Yasskin091217b2010-01-27 20:34:15 +00002594 return reinterpret_cast<LLVMModuleProviderRef>(M);
Gordon Henriksen0a68fe22007-12-12 01:04:30 +00002595}
2596
2597void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP) {
2598 delete unwrap(MP);
2599}
2600
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00002601
2602/*===-- Memory buffers ----------------------------------------------------===*/
2603
Chris Lattner25963c62010-01-09 22:27:07 +00002604LLVMBool LLVMCreateMemoryBufferWithContentsOfFile(
2605 const char *Path,
2606 LLVMMemoryBufferRef *OutMemBuf,
2607 char **OutMessage) {
2608
Rafael Espindolaadf21f22014-07-06 17:43:13 +00002609 ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr = MemoryBuffer::getFile(Path);
2610 if (std::error_code EC = MBOrErr.getError()) {
2611 *OutMessage = strdup(EC.message().c_str());
2612 return 1;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00002613 }
Rafael Espindolaadf21f22014-07-06 17:43:13 +00002614 *OutMemBuf = wrap(MBOrErr.get().release());
2615 return 0;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00002616}
2617
Chris Lattner25963c62010-01-09 22:27:07 +00002618LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
2619 char **OutMessage) {
Rafael Espindolaadf21f22014-07-06 17:43:13 +00002620 ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr = MemoryBuffer::getSTDIN();
2621 if (std::error_code EC = MBOrErr.getError()) {
2622 *OutMessage = strdup(EC.message().c_str());
2623 return 1;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00002624 }
Rafael Espindolaadf21f22014-07-06 17:43:13 +00002625 *OutMemBuf = wrap(MBOrErr.get().release());
2626 return 0;
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00002627}
2628
Bill Wendling526276a2013-02-14 19:11:28 +00002629LLVMMemoryBufferRef LLVMCreateMemoryBufferWithMemoryRange(
2630 const char *InputData,
2631 size_t InputDataLength,
2632 const char *BufferName,
Bill Wendlingff61da92013-02-14 19:40:27 +00002633 LLVMBool RequiresNullTerminator) {
Bill Wendling526276a2013-02-14 19:11:28 +00002634
2635 return wrap(MemoryBuffer::getMemBuffer(
2636 StringRef(InputData, InputDataLength),
2637 StringRef(BufferName),
2638 RequiresNullTerminator));
2639}
2640
2641LLVMMemoryBufferRef LLVMCreateMemoryBufferWithMemoryRangeCopy(
2642 const char *InputData,
2643 size_t InputDataLength,
2644 const char *BufferName) {
2645
2646 return wrap(MemoryBuffer::getMemBufferCopy(
2647 StringRef(InputData, InputDataLength),
2648 StringRef(BufferName)));
2649}
2650
Tom Stellard62c03202013-04-18 19:50:53 +00002651const char *LLVMGetBufferStart(LLVMMemoryBufferRef MemBuf) {
Tom Stellard385fa262013-04-16 23:12:47 +00002652 return unwrap(MemBuf)->getBufferStart();
2653}
Bill Wendling526276a2013-02-14 19:11:28 +00002654
Tom Stellardb7fb7242013-04-16 23:12:51 +00002655size_t LLVMGetBufferSize(LLVMMemoryBufferRef MemBuf) {
2656 return unwrap(MemBuf)->getBufferSize();
2657}
2658
Gordon Henriksen34eb6d82007-12-19 22:30:40 +00002659void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf) {
2660 delete unwrap(MemBuf);
2661}
Dan Gohman093b42f2010-08-07 00:43:20 +00002662
Owen Anderson4698c5d2010-10-07 17:55:47 +00002663/*===-- Pass Registry -----------------------------------------------------===*/
2664
2665LLVMPassRegistryRef LLVMGetGlobalPassRegistry(void) {
2666 return wrap(PassRegistry::getPassRegistry());
2667}
Dan Gohman093b42f2010-08-07 00:43:20 +00002668
2669/*===-- Pass Manager ------------------------------------------------------===*/
2670
2671LLVMPassManagerRef LLVMCreatePassManager() {
2672 return wrap(new PassManager());
2673}
2674
2675LLVMPassManagerRef LLVMCreateFunctionPassManagerForModule(LLVMModuleRef M) {
2676 return wrap(new FunctionPassManager(unwrap(M)));
2677}
2678
2679LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef P) {
2680 return LLVMCreateFunctionPassManagerForModule(
2681 reinterpret_cast<LLVMModuleRef>(P));
2682}
2683
2684LLVMBool LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M) {
2685 return unwrap<PassManager>(PM)->run(*unwrap(M));
2686}
2687
2688LLVMBool LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM) {
2689 return unwrap<FunctionPassManager>(FPM)->doInitialization();
2690}
2691
2692LLVMBool LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F) {
2693 return unwrap<FunctionPassManager>(FPM)->run(*unwrap<Function>(F));
2694}
2695
2696LLVMBool LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM) {
2697 return unwrap<FunctionPassManager>(FPM)->doFinalization();
2698}
2699
2700void LLVMDisposePassManager(LLVMPassManagerRef PM) {
2701 delete unwrap(PM);
2702}
Duncan Sands1cba0a82013-02-17 16:35:51 +00002703
2704/*===-- Threading ------------------------------------------------------===*/
2705
2706LLVMBool LLVMStartMultithreaded() {
Chandler Carruth39cd2162014-06-27 15:13:01 +00002707 return LLVMIsMultithreaded();
Duncan Sands1cba0a82013-02-17 16:35:51 +00002708}
2709
2710void LLVMStopMultithreaded() {
Duncan Sands1cba0a82013-02-17 16:35:51 +00002711}
2712
2713LLVMBool LLVMIsMultithreaded() {
2714 return llvm_is_multithreaded();
2715}