1 //===-- Core.cpp ----------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements the common infrastructure (including the C bindings)
10 // for libLLVMCore.a, which implements the LLVM intermediate representation.
12 //===----------------------------------------------------------------------===//
14 #include "llvm-c/Core.h"
15 #include "llvm/ADT/StringSwitch.h"
16 #include "llvm/IR/Attributes.h"
17 #include "llvm/IR/Constants.h"
18 #include "llvm/IR/DebugInfoMetadata.h"
19 #include "llvm/IR/DerivedTypes.h"
20 #include "llvm/IR/DiagnosticInfo.h"
21 #include "llvm/IR/DiagnosticPrinter.h"
22 #include "llvm/IR/GlobalAlias.h"
23 #include "llvm/IR/GlobalVariable.h"
24 #include "llvm/IR/IRBuilder.h"
25 #include "llvm/IR/InlineAsm.h"
26 #include "llvm/IR/IntrinsicInst.h"
27 #include "llvm/IR/LLVMContext.h"
28 #include "llvm/IR/LegacyPassManager.h"
29 #include "llvm/IR/Module.h"
30 #include "llvm/Support/Debug.h"
31 #include "llvm/Support/ErrorHandling.h"
32 #include "llvm/Support/FileSystem.h"
33 #include "llvm/Support/ManagedStatic.h"
34 #include "llvm/Support/MemoryBuffer.h"
35 #include "llvm/Support/Threading.h"
36 #include "llvm/Support/raw_ostream.h"
40 #include <system_error>
44 #define DEBUG_TYPE "ir"
46 void llvm::initializeCore(PassRegistry
&Registry
) {
47 initializeDominatorTreeWrapperPassPass(Registry
);
48 initializePrintModulePassWrapperPass(Registry
);
49 initializePrintFunctionPassWrapperPass(Registry
);
50 initializePrintBasicBlockPassPass(Registry
);
51 initializeSafepointIRVerifierPass(Registry
);
52 initializeVerifierLegacyPassPass(Registry
);
55 void LLVMInitializeCore(LLVMPassRegistryRef R
) {
56 initializeCore(*unwrap(R
));
63 /*===-- Error handling ----------------------------------------------------===*/
65 char *LLVMCreateMessage(const char *Message
) {
66 return strdup(Message
);
69 void LLVMDisposeMessage(char *Message
) {
74 /*===-- Operations on contexts --------------------------------------------===*/
76 static ManagedStatic
<LLVMContext
> GlobalContext
;
78 LLVMContextRef
LLVMContextCreate() {
79 return wrap(new LLVMContext());
82 LLVMContextRef
LLVMGetGlobalContext() { return wrap(&*GlobalContext
); }
84 void LLVMContextSetDiagnosticHandler(LLVMContextRef C
,
85 LLVMDiagnosticHandler Handler
,
86 void *DiagnosticContext
) {
87 unwrap(C
)->setDiagnosticHandlerCallBack(
88 LLVM_EXTENSION
reinterpret_cast<DiagnosticHandler::DiagnosticHandlerTy
>(
93 LLVMDiagnosticHandler
LLVMContextGetDiagnosticHandler(LLVMContextRef C
) {
94 return LLVM_EXTENSION
reinterpret_cast<LLVMDiagnosticHandler
>(
95 unwrap(C
)->getDiagnosticHandlerCallBack());
98 void *LLVMContextGetDiagnosticContext(LLVMContextRef C
) {
99 return unwrap(C
)->getDiagnosticContext();
102 void LLVMContextSetYieldCallback(LLVMContextRef C
, LLVMYieldCallback Callback
,
103 void *OpaqueHandle
) {
105 LLVM_EXTENSION
reinterpret_cast<LLVMContext::YieldCallbackTy
>(Callback
);
106 unwrap(C
)->setYieldCallback(YieldCallback
, OpaqueHandle
);
109 LLVMBool
LLVMContextShouldDiscardValueNames(LLVMContextRef C
) {
110 return unwrap(C
)->shouldDiscardValueNames();
113 void LLVMContextSetDiscardValueNames(LLVMContextRef C
, LLVMBool Discard
) {
114 unwrap(C
)->setDiscardValueNames(Discard
);
117 void LLVMContextDispose(LLVMContextRef C
) {
121 unsigned LLVMGetMDKindIDInContext(LLVMContextRef C
, const char *Name
,
123 return unwrap(C
)->getMDKindID(StringRef(Name
, SLen
));
126 unsigned LLVMGetMDKindID(const char *Name
, unsigned SLen
) {
127 return LLVMGetMDKindIDInContext(LLVMGetGlobalContext(), Name
, SLen
);
130 #define GET_ATTR_KIND_FROM_NAME
131 #include "AttributesCompatFunc.inc"
133 unsigned LLVMGetEnumAttributeKindForName(const char *Name
, size_t SLen
) {
134 return getAttrKindFromName(StringRef(Name
, SLen
));
137 unsigned LLVMGetLastEnumAttributeKind(void) {
138 return Attribute::AttrKind::EndAttrKinds
;
141 LLVMAttributeRef
LLVMCreateEnumAttribute(LLVMContextRef C
, unsigned KindID
,
143 return wrap(Attribute::get(*unwrap(C
), (Attribute::AttrKind
)KindID
, Val
));
146 unsigned LLVMGetEnumAttributeKind(LLVMAttributeRef A
) {
147 return unwrap(A
).getKindAsEnum();
150 uint64_t LLVMGetEnumAttributeValue(LLVMAttributeRef A
) {
151 auto Attr
= unwrap(A
);
152 if (Attr
.isEnumAttribute())
154 return Attr
.getValueAsInt();
157 LLVMAttributeRef
LLVMCreateStringAttribute(LLVMContextRef C
,
158 const char *K
, unsigned KLength
,
159 const char *V
, unsigned VLength
) {
160 return wrap(Attribute::get(*unwrap(C
), StringRef(K
, KLength
),
161 StringRef(V
, VLength
)));
164 const char *LLVMGetStringAttributeKind(LLVMAttributeRef A
,
166 auto S
= unwrap(A
).getKindAsString();
171 const char *LLVMGetStringAttributeValue(LLVMAttributeRef A
,
173 auto S
= unwrap(A
).getValueAsString();
178 LLVMBool
LLVMIsEnumAttribute(LLVMAttributeRef A
) {
179 auto Attr
= unwrap(A
);
180 return Attr
.isEnumAttribute() || Attr
.isIntAttribute();
183 LLVMBool
LLVMIsStringAttribute(LLVMAttributeRef A
) {
184 return unwrap(A
).isStringAttribute();
187 char *LLVMGetDiagInfoDescription(LLVMDiagnosticInfoRef DI
) {
188 std::string MsgStorage
;
189 raw_string_ostream
Stream(MsgStorage
);
190 DiagnosticPrinterRawOStream
DP(Stream
);
192 unwrap(DI
)->print(DP
);
195 return LLVMCreateMessage(MsgStorage
.c_str());
198 LLVMDiagnosticSeverity
LLVMGetDiagInfoSeverity(LLVMDiagnosticInfoRef DI
) {
199 LLVMDiagnosticSeverity severity
;
201 switch(unwrap(DI
)->getSeverity()) {
203 severity
= LLVMDSError
;
206 severity
= LLVMDSWarning
;
209 severity
= LLVMDSRemark
;
212 severity
= LLVMDSNote
;
219 /*===-- Operations on modules ---------------------------------------------===*/
221 LLVMModuleRef
LLVMModuleCreateWithName(const char *ModuleID
) {
222 return wrap(new Module(ModuleID
, *GlobalContext
));
225 LLVMModuleRef
LLVMModuleCreateWithNameInContext(const char *ModuleID
,
227 return wrap(new Module(ModuleID
, *unwrap(C
)));
230 void LLVMDisposeModule(LLVMModuleRef M
) {
234 const char *LLVMGetModuleIdentifier(LLVMModuleRef M
, size_t *Len
) {
235 auto &Str
= unwrap(M
)->getModuleIdentifier();
240 void LLVMSetModuleIdentifier(LLVMModuleRef M
, const char *Ident
, size_t Len
) {
241 unwrap(M
)->setModuleIdentifier(StringRef(Ident
, Len
));
244 const char *LLVMGetSourceFileName(LLVMModuleRef M
, size_t *Len
) {
245 auto &Str
= unwrap(M
)->getSourceFileName();
250 void LLVMSetSourceFileName(LLVMModuleRef M
, const char *Name
, size_t Len
) {
251 unwrap(M
)->setSourceFileName(StringRef(Name
, Len
));
254 /*--.. Data layout .........................................................--*/
255 const char *LLVMGetDataLayoutStr(LLVMModuleRef M
) {
256 return unwrap(M
)->getDataLayoutStr().c_str();
259 const char *LLVMGetDataLayout(LLVMModuleRef M
) {
260 return LLVMGetDataLayoutStr(M
);
263 void LLVMSetDataLayout(LLVMModuleRef M
, const char *DataLayoutStr
) {
264 unwrap(M
)->setDataLayout(DataLayoutStr
);
267 /*--.. Target triple .......................................................--*/
268 const char * LLVMGetTarget(LLVMModuleRef M
) {
269 return unwrap(M
)->getTargetTriple().c_str();
272 void LLVMSetTarget(LLVMModuleRef M
, const char *Triple
) {
273 unwrap(M
)->setTargetTriple(Triple
);
276 /*--.. Module flags ........................................................--*/
277 struct LLVMOpaqueModuleFlagEntry
{
278 LLVMModuleFlagBehavior Behavior
;
281 LLVMMetadataRef Metadata
;
284 static Module::ModFlagBehavior
285 map_to_llvmModFlagBehavior(LLVMModuleFlagBehavior Behavior
) {
287 case LLVMModuleFlagBehaviorError
:
288 return Module::ModFlagBehavior::Error
;
289 case LLVMModuleFlagBehaviorWarning
:
290 return Module::ModFlagBehavior::Warning
;
291 case LLVMModuleFlagBehaviorRequire
:
292 return Module::ModFlagBehavior::Require
;
293 case LLVMModuleFlagBehaviorOverride
:
294 return Module::ModFlagBehavior::Override
;
295 case LLVMModuleFlagBehaviorAppend
:
296 return Module::ModFlagBehavior::Append
;
297 case LLVMModuleFlagBehaviorAppendUnique
:
298 return Module::ModFlagBehavior::AppendUnique
;
300 llvm_unreachable("Unknown LLVMModuleFlagBehavior");
303 static LLVMModuleFlagBehavior
304 map_from_llvmModFlagBehavior(Module::ModFlagBehavior Behavior
) {
306 case Module::ModFlagBehavior::Error
:
307 return LLVMModuleFlagBehaviorError
;
308 case Module::ModFlagBehavior::Warning
:
309 return LLVMModuleFlagBehaviorWarning
;
310 case Module::ModFlagBehavior::Require
:
311 return LLVMModuleFlagBehaviorRequire
;
312 case Module::ModFlagBehavior::Override
:
313 return LLVMModuleFlagBehaviorOverride
;
314 case Module::ModFlagBehavior::Append
:
315 return LLVMModuleFlagBehaviorAppend
;
316 case Module::ModFlagBehavior::AppendUnique
:
317 return LLVMModuleFlagBehaviorAppendUnique
;
319 llvm_unreachable("Unhandled Flag Behavior");
323 LLVMModuleFlagEntry
*LLVMCopyModuleFlagsMetadata(LLVMModuleRef M
, size_t *Len
) {
324 SmallVector
<Module::ModuleFlagEntry
, 8> MFEs
;
325 unwrap(M
)->getModuleFlagsMetadata(MFEs
);
327 LLVMOpaqueModuleFlagEntry
*Result
= static_cast<LLVMOpaqueModuleFlagEntry
*>(
328 safe_malloc(MFEs
.size() * sizeof(LLVMOpaqueModuleFlagEntry
)));
329 for (unsigned i
= 0; i
< MFEs
.size(); ++i
) {
330 const auto &ModuleFlag
= MFEs
[i
];
331 Result
[i
].Behavior
= map_from_llvmModFlagBehavior(ModuleFlag
.Behavior
);
332 Result
[i
].Key
= ModuleFlag
.Key
->getString().data();
333 Result
[i
].KeyLen
= ModuleFlag
.Key
->getString().size();
334 Result
[i
].Metadata
= wrap(ModuleFlag
.Val
);
340 void LLVMDisposeModuleFlagsMetadata(LLVMModuleFlagEntry
*Entries
) {
344 LLVMModuleFlagBehavior
345 LLVMModuleFlagEntriesGetFlagBehavior(LLVMModuleFlagEntry
*Entries
,
347 LLVMOpaqueModuleFlagEntry MFE
=
348 static_cast<LLVMOpaqueModuleFlagEntry
>(Entries
[Index
]);
352 const char *LLVMModuleFlagEntriesGetKey(LLVMModuleFlagEntry
*Entries
,
353 unsigned Index
, size_t *Len
) {
354 LLVMOpaqueModuleFlagEntry MFE
=
355 static_cast<LLVMOpaqueModuleFlagEntry
>(Entries
[Index
]);
360 LLVMMetadataRef
LLVMModuleFlagEntriesGetMetadata(LLVMModuleFlagEntry
*Entries
,
362 LLVMOpaqueModuleFlagEntry MFE
=
363 static_cast<LLVMOpaqueModuleFlagEntry
>(Entries
[Index
]);
367 LLVMMetadataRef
LLVMGetModuleFlag(LLVMModuleRef M
,
368 const char *Key
, size_t KeyLen
) {
369 return wrap(unwrap(M
)->getModuleFlag({Key
, KeyLen
}));
372 void LLVMAddModuleFlag(LLVMModuleRef M
, LLVMModuleFlagBehavior Behavior
,
373 const char *Key
, size_t KeyLen
,
374 LLVMMetadataRef Val
) {
375 unwrap(M
)->addModuleFlag(map_to_llvmModFlagBehavior(Behavior
),
376 {Key
, KeyLen
}, unwrap(Val
));
379 /*--.. Printing modules ....................................................--*/
381 void LLVMDumpModule(LLVMModuleRef M
) {
382 unwrap(M
)->print(errs(), nullptr,
383 /*ShouldPreserveUseListOrder=*/false, /*IsForDebug=*/true);
386 LLVMBool
LLVMPrintModuleToFile(LLVMModuleRef M
, const char *Filename
,
387 char **ErrorMessage
) {
389 raw_fd_ostream
dest(Filename
, EC
, sys::fs::F_Text
);
391 *ErrorMessage
= strdup(EC
.message().c_str());
395 unwrap(M
)->print(dest
, nullptr);
399 if (dest
.has_error()) {
400 std::string E
= "Error printing to file: " + dest
.error().message();
401 *ErrorMessage
= strdup(E
.c_str());
408 char *LLVMPrintModuleToString(LLVMModuleRef M
) {
410 raw_string_ostream
os(buf
);
412 unwrap(M
)->print(os
, nullptr);
415 return strdup(buf
.c_str());
418 /*--.. Operations on inline assembler ......................................--*/
419 void LLVMSetModuleInlineAsm2(LLVMModuleRef M
, const char *Asm
, size_t Len
) {
420 unwrap(M
)->setModuleInlineAsm(StringRef(Asm
, Len
));
423 void LLVMSetModuleInlineAsm(LLVMModuleRef M
, const char *Asm
) {
424 unwrap(M
)->setModuleInlineAsm(StringRef(Asm
));
427 void LLVMAppendModuleInlineAsm(LLVMModuleRef M
, const char *Asm
, size_t Len
) {
428 unwrap(M
)->appendModuleInlineAsm(StringRef(Asm
, Len
));
431 const char *LLVMGetModuleInlineAsm(LLVMModuleRef M
, size_t *Len
) {
432 auto &Str
= unwrap(M
)->getModuleInlineAsm();
437 LLVMValueRef
LLVMGetInlineAsm(LLVMTypeRef Ty
,
438 char *AsmString
, size_t AsmStringSize
,
439 char *Constraints
, size_t ConstraintsSize
,
440 LLVMBool HasSideEffects
, LLVMBool IsAlignStack
,
441 LLVMInlineAsmDialect Dialect
) {
442 InlineAsm::AsmDialect AD
;
444 case LLVMInlineAsmDialectATT
:
445 AD
= InlineAsm::AD_ATT
;
447 case LLVMInlineAsmDialectIntel
:
448 AD
= InlineAsm::AD_Intel
;
451 return wrap(InlineAsm::get(unwrap
<FunctionType
>(Ty
),
452 StringRef(AsmString
, AsmStringSize
),
453 StringRef(Constraints
, ConstraintsSize
),
454 HasSideEffects
, IsAlignStack
, AD
));
458 /*--.. Operations on module contexts ......................................--*/
459 LLVMContextRef
LLVMGetModuleContext(LLVMModuleRef M
) {
460 return wrap(&unwrap(M
)->getContext());
464 /*===-- Operations on types -----------------------------------------------===*/
466 /*--.. Operations on all types (mostly) ....................................--*/
468 LLVMTypeKind
LLVMGetTypeKind(LLVMTypeRef Ty
) {
469 switch (unwrap(Ty
)->getTypeID()) {
471 return LLVMVoidTypeKind
;
473 return LLVMHalfTypeKind
;
474 case Type::FloatTyID
:
475 return LLVMFloatTypeKind
;
476 case Type::DoubleTyID
:
477 return LLVMDoubleTypeKind
;
478 case Type::X86_FP80TyID
:
479 return LLVMX86_FP80TypeKind
;
480 case Type::FP128TyID
:
481 return LLVMFP128TypeKind
;
482 case Type::PPC_FP128TyID
:
483 return LLVMPPC_FP128TypeKind
;
484 case Type::LabelTyID
:
485 return LLVMLabelTypeKind
;
486 case Type::MetadataTyID
:
487 return LLVMMetadataTypeKind
;
488 case Type::IntegerTyID
:
489 return LLVMIntegerTypeKind
;
490 case Type::FunctionTyID
:
491 return LLVMFunctionTypeKind
;
492 case Type::StructTyID
:
493 return LLVMStructTypeKind
;
494 case Type::ArrayTyID
:
495 return LLVMArrayTypeKind
;
496 case Type::PointerTyID
:
497 return LLVMPointerTypeKind
;
498 case Type::VectorTyID
:
499 return LLVMVectorTypeKind
;
500 case Type::X86_MMXTyID
:
501 return LLVMX86_MMXTypeKind
;
502 case Type::TokenTyID
:
503 return LLVMTokenTypeKind
;
505 llvm_unreachable("Unhandled TypeID.");
508 LLVMBool
LLVMTypeIsSized(LLVMTypeRef Ty
)
510 return unwrap(Ty
)->isSized();
513 LLVMContextRef
LLVMGetTypeContext(LLVMTypeRef Ty
) {
514 return wrap(&unwrap(Ty
)->getContext());
517 void LLVMDumpType(LLVMTypeRef Ty
) {
518 return unwrap(Ty
)->print(errs(), /*IsForDebug=*/true);
521 char *LLVMPrintTypeToString(LLVMTypeRef Ty
) {
523 raw_string_ostream
os(buf
);
526 unwrap(Ty
)->print(os
);
528 os
<< "Printing <null> Type";
532 return strdup(buf
.c_str());
535 /*--.. Operations on integer types .........................................--*/
537 LLVMTypeRef
LLVMInt1TypeInContext(LLVMContextRef C
) {
538 return (LLVMTypeRef
) Type::getInt1Ty(*unwrap(C
));
540 LLVMTypeRef
LLVMInt8TypeInContext(LLVMContextRef C
) {
541 return (LLVMTypeRef
) Type::getInt8Ty(*unwrap(C
));
543 LLVMTypeRef
LLVMInt16TypeInContext(LLVMContextRef C
) {
544 return (LLVMTypeRef
) Type::getInt16Ty(*unwrap(C
));
546 LLVMTypeRef
LLVMInt32TypeInContext(LLVMContextRef C
) {
547 return (LLVMTypeRef
) Type::getInt32Ty(*unwrap(C
));
549 LLVMTypeRef
LLVMInt64TypeInContext(LLVMContextRef C
) {
550 return (LLVMTypeRef
) Type::getInt64Ty(*unwrap(C
));
552 LLVMTypeRef
LLVMInt128TypeInContext(LLVMContextRef C
) {
553 return (LLVMTypeRef
) Type::getInt128Ty(*unwrap(C
));
555 LLVMTypeRef
LLVMIntTypeInContext(LLVMContextRef C
, unsigned NumBits
) {
556 return wrap(IntegerType::get(*unwrap(C
), NumBits
));
559 LLVMTypeRef
LLVMInt1Type(void) {
560 return LLVMInt1TypeInContext(LLVMGetGlobalContext());
562 LLVMTypeRef
LLVMInt8Type(void) {
563 return LLVMInt8TypeInContext(LLVMGetGlobalContext());
565 LLVMTypeRef
LLVMInt16Type(void) {
566 return LLVMInt16TypeInContext(LLVMGetGlobalContext());
568 LLVMTypeRef
LLVMInt32Type(void) {
569 return LLVMInt32TypeInContext(LLVMGetGlobalContext());
571 LLVMTypeRef
LLVMInt64Type(void) {
572 return LLVMInt64TypeInContext(LLVMGetGlobalContext());
574 LLVMTypeRef
LLVMInt128Type(void) {
575 return LLVMInt128TypeInContext(LLVMGetGlobalContext());
577 LLVMTypeRef
LLVMIntType(unsigned NumBits
) {
578 return LLVMIntTypeInContext(LLVMGetGlobalContext(), NumBits
);
581 unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy
) {
582 return unwrap
<IntegerType
>(IntegerTy
)->getBitWidth();
585 /*--.. Operations on real types ............................................--*/
587 LLVMTypeRef
LLVMHalfTypeInContext(LLVMContextRef C
) {
588 return (LLVMTypeRef
) Type::getHalfTy(*unwrap(C
));
590 LLVMTypeRef
LLVMFloatTypeInContext(LLVMContextRef C
) {
591 return (LLVMTypeRef
) Type::getFloatTy(*unwrap(C
));
593 LLVMTypeRef
LLVMDoubleTypeInContext(LLVMContextRef C
) {
594 return (LLVMTypeRef
) Type::getDoubleTy(*unwrap(C
));
596 LLVMTypeRef
LLVMX86FP80TypeInContext(LLVMContextRef C
) {
597 return (LLVMTypeRef
) Type::getX86_FP80Ty(*unwrap(C
));
599 LLVMTypeRef
LLVMFP128TypeInContext(LLVMContextRef C
) {
600 return (LLVMTypeRef
) Type::getFP128Ty(*unwrap(C
));
602 LLVMTypeRef
LLVMPPCFP128TypeInContext(LLVMContextRef C
) {
603 return (LLVMTypeRef
) Type::getPPC_FP128Ty(*unwrap(C
));
605 LLVMTypeRef
LLVMX86MMXTypeInContext(LLVMContextRef C
) {
606 return (LLVMTypeRef
) Type::getX86_MMXTy(*unwrap(C
));
609 LLVMTypeRef
LLVMHalfType(void) {
610 return LLVMHalfTypeInContext(LLVMGetGlobalContext());
612 LLVMTypeRef
LLVMFloatType(void) {
613 return LLVMFloatTypeInContext(LLVMGetGlobalContext());
615 LLVMTypeRef
LLVMDoubleType(void) {
616 return LLVMDoubleTypeInContext(LLVMGetGlobalContext());
618 LLVMTypeRef
LLVMX86FP80Type(void) {
619 return LLVMX86FP80TypeInContext(LLVMGetGlobalContext());
621 LLVMTypeRef
LLVMFP128Type(void) {
622 return LLVMFP128TypeInContext(LLVMGetGlobalContext());
624 LLVMTypeRef
LLVMPPCFP128Type(void) {
625 return LLVMPPCFP128TypeInContext(LLVMGetGlobalContext());
627 LLVMTypeRef
LLVMX86MMXType(void) {
628 return LLVMX86MMXTypeInContext(LLVMGetGlobalContext());
631 /*--.. Operations on function types ........................................--*/
633 LLVMTypeRef
LLVMFunctionType(LLVMTypeRef ReturnType
,
634 LLVMTypeRef
*ParamTypes
, unsigned ParamCount
,
636 ArrayRef
<Type
*> Tys(unwrap(ParamTypes
), ParamCount
);
637 return wrap(FunctionType::get(unwrap(ReturnType
), Tys
, IsVarArg
!= 0));
640 LLVMBool
LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy
) {
641 return unwrap
<FunctionType
>(FunctionTy
)->isVarArg();
644 LLVMTypeRef
LLVMGetReturnType(LLVMTypeRef FunctionTy
) {
645 return wrap(unwrap
<FunctionType
>(FunctionTy
)->getReturnType());
648 unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy
) {
649 return unwrap
<FunctionType
>(FunctionTy
)->getNumParams();
652 void LLVMGetParamTypes(LLVMTypeRef FunctionTy
, LLVMTypeRef
*Dest
) {
653 FunctionType
*Ty
= unwrap
<FunctionType
>(FunctionTy
);
654 for (FunctionType::param_iterator I
= Ty
->param_begin(),
655 E
= Ty
->param_end(); I
!= E
; ++I
)
659 /*--.. Operations on struct types ..........................................--*/
661 LLVMTypeRef
LLVMStructTypeInContext(LLVMContextRef C
, LLVMTypeRef
*ElementTypes
,
662 unsigned ElementCount
, LLVMBool Packed
) {
663 ArrayRef
<Type
*> Tys(unwrap(ElementTypes
), ElementCount
);
664 return wrap(StructType::get(*unwrap(C
), Tys
, Packed
!= 0));
667 LLVMTypeRef
LLVMStructType(LLVMTypeRef
*ElementTypes
,
668 unsigned ElementCount
, LLVMBool Packed
) {
669 return LLVMStructTypeInContext(LLVMGetGlobalContext(), ElementTypes
,
670 ElementCount
, Packed
);
673 LLVMTypeRef
LLVMStructCreateNamed(LLVMContextRef C
, const char *Name
)
675 return wrap(StructType::create(*unwrap(C
), Name
));
678 const char *LLVMGetStructName(LLVMTypeRef Ty
)
680 StructType
*Type
= unwrap
<StructType
>(Ty
);
681 if (!Type
->hasName())
683 return Type
->getName().data();
686 void LLVMStructSetBody(LLVMTypeRef StructTy
, LLVMTypeRef
*ElementTypes
,
687 unsigned ElementCount
, LLVMBool Packed
) {
688 ArrayRef
<Type
*> Tys(unwrap(ElementTypes
), ElementCount
);
689 unwrap
<StructType
>(StructTy
)->setBody(Tys
, Packed
!= 0);
692 unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy
) {
693 return unwrap
<StructType
>(StructTy
)->getNumElements();
696 void LLVMGetStructElementTypes(LLVMTypeRef StructTy
, LLVMTypeRef
*Dest
) {
697 StructType
*Ty
= unwrap
<StructType
>(StructTy
);
698 for (StructType::element_iterator I
= Ty
->element_begin(),
699 E
= Ty
->element_end(); I
!= E
; ++I
)
703 LLVMTypeRef
LLVMStructGetTypeAtIndex(LLVMTypeRef StructTy
, unsigned i
) {
704 StructType
*Ty
= unwrap
<StructType
>(StructTy
);
705 return wrap(Ty
->getTypeAtIndex(i
));
708 LLVMBool
LLVMIsPackedStruct(LLVMTypeRef StructTy
) {
709 return unwrap
<StructType
>(StructTy
)->isPacked();
712 LLVMBool
LLVMIsOpaqueStruct(LLVMTypeRef StructTy
) {
713 return unwrap
<StructType
>(StructTy
)->isOpaque();
716 LLVMBool
LLVMIsLiteralStruct(LLVMTypeRef StructTy
) {
717 return unwrap
<StructType
>(StructTy
)->isLiteral();
720 LLVMTypeRef
LLVMGetTypeByName(LLVMModuleRef M
, const char *Name
) {
721 return wrap(unwrap(M
)->getTypeByName(Name
));
724 /*--.. Operations on array, pointer, and vector types (sequence types) .....--*/
726 void LLVMGetSubtypes(LLVMTypeRef Tp
, LLVMTypeRef
*Arr
) {
728 for (auto *T
: unwrap(Tp
)->subtypes()) {
734 LLVMTypeRef
LLVMArrayType(LLVMTypeRef ElementType
, unsigned ElementCount
) {
735 return wrap(ArrayType::get(unwrap(ElementType
), ElementCount
));
738 LLVMTypeRef
LLVMPointerType(LLVMTypeRef ElementType
, unsigned AddressSpace
) {
739 return wrap(PointerType::get(unwrap(ElementType
), AddressSpace
));
742 LLVMTypeRef
LLVMVectorType(LLVMTypeRef ElementType
, unsigned ElementCount
) {
743 return wrap(VectorType::get(unwrap(ElementType
), ElementCount
));
746 LLVMTypeRef
LLVMGetElementType(LLVMTypeRef WrappedTy
) {
747 auto *Ty
= unwrap
<Type
>(WrappedTy
);
748 if (auto *PTy
= dyn_cast
<PointerType
>(Ty
))
749 return wrap(PTy
->getElementType());
750 return wrap(cast
<SequentialType
>(Ty
)->getElementType());
753 unsigned LLVMGetNumContainedTypes(LLVMTypeRef Tp
) {
754 return unwrap(Tp
)->getNumContainedTypes();
757 unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy
) {
758 return unwrap
<ArrayType
>(ArrayTy
)->getNumElements();
761 unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy
) {
762 return unwrap
<PointerType
>(PointerTy
)->getAddressSpace();
765 unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy
) {
766 return unwrap
<VectorType
>(VectorTy
)->getNumElements();
769 /*--.. Operations on other types ...........................................--*/
771 LLVMTypeRef
LLVMVoidTypeInContext(LLVMContextRef C
) {
772 return wrap(Type::getVoidTy(*unwrap(C
)));
774 LLVMTypeRef
LLVMLabelTypeInContext(LLVMContextRef C
) {
775 return wrap(Type::getLabelTy(*unwrap(C
)));
777 LLVMTypeRef
LLVMTokenTypeInContext(LLVMContextRef C
) {
778 return wrap(Type::getTokenTy(*unwrap(C
)));
780 LLVMTypeRef
LLVMMetadataTypeInContext(LLVMContextRef C
) {
781 return wrap(Type::getMetadataTy(*unwrap(C
)));
784 LLVMTypeRef
LLVMVoidType(void) {
785 return LLVMVoidTypeInContext(LLVMGetGlobalContext());
787 LLVMTypeRef
LLVMLabelType(void) {
788 return LLVMLabelTypeInContext(LLVMGetGlobalContext());
791 /*===-- Operations on values ----------------------------------------------===*/
793 /*--.. Operations on all values ............................................--*/
795 LLVMTypeRef
LLVMTypeOf(LLVMValueRef Val
) {
796 return wrap(unwrap(Val
)->getType());
799 LLVMValueKind
LLVMGetValueKind(LLVMValueRef Val
) {
800 switch(unwrap(Val
)->getValueID()) {
801 #define HANDLE_VALUE(Name) \
802 case Value::Name##Val: \
803 return LLVM##Name##ValueKind;
804 #include "llvm/IR/Value.def"
806 return LLVMInstructionValueKind
;
810 const char *LLVMGetValueName2(LLVMValueRef Val
, size_t *Length
) {
811 auto *V
= unwrap(Val
);
812 *Length
= V
->getName().size();
813 return V
->getName().data();
816 void LLVMSetValueName2(LLVMValueRef Val
, const char *Name
, size_t NameLen
) {
817 unwrap(Val
)->setName(StringRef(Name
, NameLen
));
820 const char *LLVMGetValueName(LLVMValueRef Val
) {
821 return unwrap(Val
)->getName().data();
824 void LLVMSetValueName(LLVMValueRef Val
, const char *Name
) {
825 unwrap(Val
)->setName(Name
);
828 void LLVMDumpValue(LLVMValueRef Val
) {
829 unwrap(Val
)->print(errs(), /*IsForDebug=*/true);
832 char* LLVMPrintValueToString(LLVMValueRef Val
) {
834 raw_string_ostream
os(buf
);
837 unwrap(Val
)->print(os
);
839 os
<< "Printing <null> Value";
843 return strdup(buf
.c_str());
846 void LLVMReplaceAllUsesWith(LLVMValueRef OldVal
, LLVMValueRef NewVal
) {
847 unwrap(OldVal
)->replaceAllUsesWith(unwrap(NewVal
));
850 int LLVMHasMetadata(LLVMValueRef Inst
) {
851 return unwrap
<Instruction
>(Inst
)->hasMetadata();
854 LLVMValueRef
LLVMGetMetadata(LLVMValueRef Inst
, unsigned KindID
) {
855 auto *I
= unwrap
<Instruction
>(Inst
);
856 assert(I
&& "Expected instruction");
857 if (auto *MD
= I
->getMetadata(KindID
))
858 return wrap(MetadataAsValue::get(I
->getContext(), MD
));
862 // MetadataAsValue uses a canonical format which strips the actual MDNode for
863 // MDNode with just a single constant value, storing just a ConstantAsMetadata
864 // This undoes this canonicalization, reconstructing the MDNode.
865 static MDNode
*extractMDNode(MetadataAsValue
*MAV
) {
866 Metadata
*MD
= MAV
->getMetadata();
867 assert((isa
<MDNode
>(MD
) || isa
<ConstantAsMetadata
>(MD
)) &&
868 "Expected a metadata node or a canonicalized constant");
870 if (MDNode
*N
= dyn_cast
<MDNode
>(MD
))
873 return MDNode::get(MAV
->getContext(), MD
);
876 void LLVMSetMetadata(LLVMValueRef Inst
, unsigned KindID
, LLVMValueRef Val
) {
877 MDNode
*N
= Val
? extractMDNode(unwrap
<MetadataAsValue
>(Val
)) : nullptr;
879 unwrap
<Instruction
>(Inst
)->setMetadata(KindID
, N
);
882 struct LLVMOpaqueValueMetadataEntry
{
884 LLVMMetadataRef Metadata
;
887 using MetadataEntries
= SmallVectorImpl
<std::pair
<unsigned, MDNode
*>>;
888 static LLVMValueMetadataEntry
*
889 llvm_getMetadata(size_t *NumEntries
,
890 llvm::function_ref
<void(MetadataEntries
&)> AccessMD
) {
891 SmallVector
<std::pair
<unsigned, MDNode
*>, 8> MVEs
;
894 LLVMOpaqueValueMetadataEntry
*Result
=
895 static_cast<LLVMOpaqueValueMetadataEntry
*>(
896 safe_malloc(MVEs
.size() * sizeof(LLVMOpaqueValueMetadataEntry
)));
897 for (unsigned i
= 0; i
< MVEs
.size(); ++i
) {
898 const auto &ModuleFlag
= MVEs
[i
];
899 Result
[i
].Kind
= ModuleFlag
.first
;
900 Result
[i
].Metadata
= wrap(ModuleFlag
.second
);
902 *NumEntries
= MVEs
.size();
906 LLVMValueMetadataEntry
*
907 LLVMInstructionGetAllMetadataOtherThanDebugLoc(LLVMValueRef Value
,
908 size_t *NumEntries
) {
909 return llvm_getMetadata(NumEntries
, [&Value
](MetadataEntries
&Entries
) {
910 unwrap
<Instruction
>(Value
)->getAllMetadata(Entries
);
914 /*--.. Conversion functions ................................................--*/
916 #define LLVM_DEFINE_VALUE_CAST(name) \
917 LLVMValueRef LLVMIsA##name(LLVMValueRef Val) { \
918 return wrap(static_cast<Value*>(dyn_cast_or_null<name>(unwrap(Val)))); \
921 LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DEFINE_VALUE_CAST
)
923 LLVMValueRef
LLVMIsAMDNode(LLVMValueRef Val
) {
924 if (auto *MD
= dyn_cast_or_null
<MetadataAsValue
>(unwrap(Val
)))
925 if (isa
<MDNode
>(MD
->getMetadata()) ||
926 isa
<ValueAsMetadata
>(MD
->getMetadata()))
931 LLVMValueRef
LLVMIsAMDString(LLVMValueRef Val
) {
932 if (auto *MD
= dyn_cast_or_null
<MetadataAsValue
>(unwrap(Val
)))
933 if (isa
<MDString
>(MD
->getMetadata()))
938 /*--.. Operations on Uses ..................................................--*/
939 LLVMUseRef
LLVMGetFirstUse(LLVMValueRef Val
) {
940 Value
*V
= unwrap(Val
);
941 Value::use_iterator I
= V
->use_begin();
942 if (I
== V
->use_end())
947 LLVMUseRef
LLVMGetNextUse(LLVMUseRef U
) {
948 Use
*Next
= unwrap(U
)->getNext();
954 LLVMValueRef
LLVMGetUser(LLVMUseRef U
) {
955 return wrap(unwrap(U
)->getUser());
958 LLVMValueRef
LLVMGetUsedValue(LLVMUseRef U
) {
959 return wrap(unwrap(U
)->get());
962 /*--.. Operations on Users .................................................--*/
964 static LLVMValueRef
getMDNodeOperandImpl(LLVMContext
&Context
, const MDNode
*N
,
966 Metadata
*Op
= N
->getOperand(Index
);
969 if (auto *C
= dyn_cast
<ConstantAsMetadata
>(Op
))
970 return wrap(C
->getValue());
971 return wrap(MetadataAsValue::get(Context
, Op
));
974 LLVMValueRef
LLVMGetOperand(LLVMValueRef Val
, unsigned Index
) {
975 Value
*V
= unwrap(Val
);
976 if (auto *MD
= dyn_cast
<MetadataAsValue
>(V
)) {
977 if (auto *L
= dyn_cast
<ValueAsMetadata
>(MD
->getMetadata())) {
978 assert(Index
== 0 && "Function-local metadata can only have one operand");
979 return wrap(L
->getValue());
981 return getMDNodeOperandImpl(V
->getContext(),
982 cast
<MDNode
>(MD
->getMetadata()), Index
);
985 return wrap(cast
<User
>(V
)->getOperand(Index
));
988 LLVMUseRef
LLVMGetOperandUse(LLVMValueRef Val
, unsigned Index
) {
989 Value
*V
= unwrap(Val
);
990 return wrap(&cast
<User
>(V
)->getOperandUse(Index
));
993 void LLVMSetOperand(LLVMValueRef Val
, unsigned Index
, LLVMValueRef Op
) {
994 unwrap
<User
>(Val
)->setOperand(Index
, unwrap(Op
));
997 int LLVMGetNumOperands(LLVMValueRef Val
) {
998 Value
*V
= unwrap(Val
);
999 if (isa
<MetadataAsValue
>(V
))
1000 return LLVMGetMDNodeNumOperands(Val
);
1002 return cast
<User
>(V
)->getNumOperands();
1005 /*--.. Operations on constants of any type .................................--*/
1007 LLVMValueRef
LLVMConstNull(LLVMTypeRef Ty
) {
1008 return wrap(Constant::getNullValue(unwrap(Ty
)));
1011 LLVMValueRef
LLVMConstAllOnes(LLVMTypeRef Ty
) {
1012 return wrap(Constant::getAllOnesValue(unwrap(Ty
)));
1015 LLVMValueRef
LLVMGetUndef(LLVMTypeRef Ty
) {
1016 return wrap(UndefValue::get(unwrap(Ty
)));
1019 LLVMBool
LLVMIsConstant(LLVMValueRef Ty
) {
1020 return isa
<Constant
>(unwrap(Ty
));
1023 LLVMBool
LLVMIsNull(LLVMValueRef Val
) {
1024 if (Constant
*C
= dyn_cast
<Constant
>(unwrap(Val
)))
1025 return C
->isNullValue();
1029 LLVMBool
LLVMIsUndef(LLVMValueRef Val
) {
1030 return isa
<UndefValue
>(unwrap(Val
));
1033 LLVMValueRef
LLVMConstPointerNull(LLVMTypeRef Ty
) {
1034 return wrap(ConstantPointerNull::get(unwrap
<PointerType
>(Ty
)));
1037 /*--.. Operations on metadata nodes ........................................--*/
1039 LLVMValueRef
LLVMMDStringInContext(LLVMContextRef C
, const char *Str
,
1041 LLVMContext
&Context
= *unwrap(C
);
1042 return wrap(MetadataAsValue::get(
1043 Context
, MDString::get(Context
, StringRef(Str
, SLen
))));
1046 LLVMValueRef
LLVMMDString(const char *Str
, unsigned SLen
) {
1047 return LLVMMDStringInContext(LLVMGetGlobalContext(), Str
, SLen
);
1050 LLVMValueRef
LLVMMDNodeInContext(LLVMContextRef C
, LLVMValueRef
*Vals
,
1052 LLVMContext
&Context
= *unwrap(C
);
1053 SmallVector
<Metadata
*, 8> MDs
;
1054 for (auto *OV
: makeArrayRef(Vals
, Count
)) {
1055 Value
*V
= unwrap(OV
);
1059 else if (auto *C
= dyn_cast
<Constant
>(V
))
1060 MD
= ConstantAsMetadata::get(C
);
1061 else if (auto *MDV
= dyn_cast
<MetadataAsValue
>(V
)) {
1062 MD
= MDV
->getMetadata();
1063 assert(!isa
<LocalAsMetadata
>(MD
) && "Unexpected function-local metadata "
1064 "outside of direct argument to call");
1066 // This is function-local metadata. Pretend to make an MDNode.
1067 assert(Count
== 1 &&
1068 "Expected only one operand to function-local metadata");
1069 return wrap(MetadataAsValue::get(Context
, LocalAsMetadata::get(V
)));
1074 return wrap(MetadataAsValue::get(Context
, MDNode::get(Context
, MDs
)));
1077 LLVMValueRef
LLVMMDNode(LLVMValueRef
*Vals
, unsigned Count
) {
1078 return LLVMMDNodeInContext(LLVMGetGlobalContext(), Vals
, Count
);
1081 LLVMValueRef
LLVMMetadataAsValue(LLVMContextRef C
, LLVMMetadataRef MD
) {
1082 return wrap(MetadataAsValue::get(*unwrap(C
), unwrap(MD
)));
1085 LLVMMetadataRef
LLVMValueAsMetadata(LLVMValueRef Val
) {
1086 auto *V
= unwrap(Val
);
1087 if (auto *C
= dyn_cast
<Constant
>(V
))
1088 return wrap(ConstantAsMetadata::get(C
));
1089 if (auto *MAV
= dyn_cast
<MetadataAsValue
>(V
))
1090 return wrap(MAV
->getMetadata());
1091 return wrap(ValueAsMetadata::get(V
));
1094 const char *LLVMGetMDString(LLVMValueRef V
, unsigned *Length
) {
1095 if (const auto *MD
= dyn_cast
<MetadataAsValue
>(unwrap(V
)))
1096 if (const MDString
*S
= dyn_cast
<MDString
>(MD
->getMetadata())) {
1097 *Length
= S
->getString().size();
1098 return S
->getString().data();
1104 unsigned LLVMGetMDNodeNumOperands(LLVMValueRef V
) {
1105 auto *MD
= cast
<MetadataAsValue
>(unwrap(V
));
1106 if (isa
<ValueAsMetadata
>(MD
->getMetadata()))
1108 return cast
<MDNode
>(MD
->getMetadata())->getNumOperands();
1111 LLVMNamedMDNodeRef
LLVMGetFirstNamedMetadata(LLVMModuleRef M
) {
1112 Module
*Mod
= unwrap(M
);
1113 Module::named_metadata_iterator I
= Mod
->named_metadata_begin();
1114 if (I
== Mod
->named_metadata_end())
1119 LLVMNamedMDNodeRef
LLVMGetLastNamedMetadata(LLVMModuleRef M
) {
1120 Module
*Mod
= unwrap(M
);
1121 Module::named_metadata_iterator I
= Mod
->named_metadata_end();
1122 if (I
== Mod
->named_metadata_begin())
1127 LLVMNamedMDNodeRef
LLVMGetNextNamedMetadata(LLVMNamedMDNodeRef NMD
) {
1128 NamedMDNode
*NamedNode
= unwrap
<NamedMDNode
>(NMD
);
1129 Module::named_metadata_iterator
I(NamedNode
);
1130 if (++I
== NamedNode
->getParent()->named_metadata_end())
1135 LLVMNamedMDNodeRef
LLVMGetPreviousNamedMetadata(LLVMNamedMDNodeRef NMD
) {
1136 NamedMDNode
*NamedNode
= unwrap
<NamedMDNode
>(NMD
);
1137 Module::named_metadata_iterator
I(NamedNode
);
1138 if (I
== NamedNode
->getParent()->named_metadata_begin())
1143 LLVMNamedMDNodeRef
LLVMGetNamedMetadata(LLVMModuleRef M
,
1144 const char *Name
, size_t NameLen
) {
1145 return wrap(unwrap(M
)->getNamedMetadata(StringRef(Name
, NameLen
)));
1148 LLVMNamedMDNodeRef
LLVMGetOrInsertNamedMetadata(LLVMModuleRef M
,
1149 const char *Name
, size_t NameLen
) {
1150 return wrap(unwrap(M
)->getOrInsertNamedMetadata({Name
, NameLen
}));
1153 const char *LLVMGetNamedMetadataName(LLVMNamedMDNodeRef NMD
, size_t *NameLen
) {
1154 NamedMDNode
*NamedNode
= unwrap
<NamedMDNode
>(NMD
);
1155 *NameLen
= NamedNode
->getName().size();
1156 return NamedNode
->getName().data();
1159 void LLVMGetMDNodeOperands(LLVMValueRef V
, LLVMValueRef
*Dest
) {
1160 auto *MD
= cast
<MetadataAsValue
>(unwrap(V
));
1161 if (auto *MDV
= dyn_cast
<ValueAsMetadata
>(MD
->getMetadata())) {
1162 *Dest
= wrap(MDV
->getValue());
1165 const auto *N
= cast
<MDNode
>(MD
->getMetadata());
1166 const unsigned numOperands
= N
->getNumOperands();
1167 LLVMContext
&Context
= unwrap(V
)->getContext();
1168 for (unsigned i
= 0; i
< numOperands
; i
++)
1169 Dest
[i
] = getMDNodeOperandImpl(Context
, N
, i
);
1172 unsigned LLVMGetNamedMetadataNumOperands(LLVMModuleRef M
, const char *Name
) {
1173 if (NamedMDNode
*N
= unwrap(M
)->getNamedMetadata(Name
)) {
1174 return N
->getNumOperands();
1179 void LLVMGetNamedMetadataOperands(LLVMModuleRef M
, const char *Name
,
1180 LLVMValueRef
*Dest
) {
1181 NamedMDNode
*N
= unwrap(M
)->getNamedMetadata(Name
);
1184 LLVMContext
&Context
= unwrap(M
)->getContext();
1185 for (unsigned i
=0;i
<N
->getNumOperands();i
++)
1186 Dest
[i
] = wrap(MetadataAsValue::get(Context
, N
->getOperand(i
)));
1189 void LLVMAddNamedMetadataOperand(LLVMModuleRef M
, const char *Name
,
1191 NamedMDNode
*N
= unwrap(M
)->getOrInsertNamedMetadata(Name
);
1196 N
->addOperand(extractMDNode(unwrap
<MetadataAsValue
>(Val
)));
1199 const char *LLVMGetDebugLocDirectory(LLVMValueRef Val
, unsigned *Length
) {
1200 if (!Length
) return nullptr;
1202 if (const auto *I
= unwrap
<Instruction
>(Val
)) {
1203 S
= I
->getDebugLoc()->getDirectory();
1204 } else if (const auto *GV
= unwrap
<GlobalVariable
>(Val
)) {
1205 SmallVector
<DIGlobalVariableExpression
*, 1> GVEs
;
1206 GV
->getDebugInfo(GVEs
);
1208 if (const DIGlobalVariable
*DGV
= GVEs
[0]->getVariable())
1209 S
= DGV
->getDirectory();
1210 } else if (const auto *F
= unwrap
<Function
>(Val
)) {
1211 if (const DISubprogram
*DSP
= F
->getSubprogram())
1212 S
= DSP
->getDirectory();
1214 assert(0 && "Expected Instruction, GlobalVariable or Function");
1221 const char *LLVMGetDebugLocFilename(LLVMValueRef Val
, unsigned *Length
) {
1222 if (!Length
) return nullptr;
1224 if (const auto *I
= unwrap
<Instruction
>(Val
)) {
1225 S
= I
->getDebugLoc()->getFilename();
1226 } else if (const auto *GV
= unwrap
<GlobalVariable
>(Val
)) {
1227 SmallVector
<DIGlobalVariableExpression
*, 1> GVEs
;
1228 GV
->getDebugInfo(GVEs
);
1230 if (const DIGlobalVariable
*DGV
= GVEs
[0]->getVariable())
1231 S
= DGV
->getFilename();
1232 } else if (const auto *F
= unwrap
<Function
>(Val
)) {
1233 if (const DISubprogram
*DSP
= F
->getSubprogram())
1234 S
= DSP
->getFilename();
1236 assert(0 && "Expected Instruction, GlobalVariable or Function");
1243 unsigned LLVMGetDebugLocLine(LLVMValueRef Val
) {
1245 if (const auto *I
= unwrap
<Instruction
>(Val
)) {
1246 L
= I
->getDebugLoc()->getLine();
1247 } else if (const auto *GV
= unwrap
<GlobalVariable
>(Val
)) {
1248 SmallVector
<DIGlobalVariableExpression
*, 1> GVEs
;
1249 GV
->getDebugInfo(GVEs
);
1251 if (const DIGlobalVariable
*DGV
= GVEs
[0]->getVariable())
1253 } else if (const auto *F
= unwrap
<Function
>(Val
)) {
1254 if (const DISubprogram
*DSP
= F
->getSubprogram())
1257 assert(0 && "Expected Instruction, GlobalVariable or Function");
1263 unsigned LLVMGetDebugLocColumn(LLVMValueRef Val
) {
1265 if (const auto *I
= unwrap
<Instruction
>(Val
))
1266 if (const auto &L
= I
->getDebugLoc())
1271 /*--.. Operations on scalar constants ......................................--*/
1273 LLVMValueRef
LLVMConstInt(LLVMTypeRef IntTy
, unsigned long long N
,
1274 LLVMBool SignExtend
) {
1275 return wrap(ConstantInt::get(unwrap
<IntegerType
>(IntTy
), N
, SignExtend
!= 0));
1278 LLVMValueRef
LLVMConstIntOfArbitraryPrecision(LLVMTypeRef IntTy
,
1280 const uint64_t Words
[]) {
1281 IntegerType
*Ty
= unwrap
<IntegerType
>(IntTy
);
1282 return wrap(ConstantInt::get(Ty
->getContext(),
1283 APInt(Ty
->getBitWidth(),
1284 makeArrayRef(Words
, NumWords
))));
1287 LLVMValueRef
LLVMConstIntOfString(LLVMTypeRef IntTy
, const char Str
[],
1289 return wrap(ConstantInt::get(unwrap
<IntegerType
>(IntTy
), StringRef(Str
),
1293 LLVMValueRef
LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy
, const char Str
[],
1294 unsigned SLen
, uint8_t Radix
) {
1295 return wrap(ConstantInt::get(unwrap
<IntegerType
>(IntTy
), StringRef(Str
, SLen
),
1299 LLVMValueRef
LLVMConstReal(LLVMTypeRef RealTy
, double N
) {
1300 return wrap(ConstantFP::get(unwrap(RealTy
), N
));
1303 LLVMValueRef
LLVMConstRealOfString(LLVMTypeRef RealTy
, const char *Text
) {
1304 return wrap(ConstantFP::get(unwrap(RealTy
), StringRef(Text
)));
1307 LLVMValueRef
LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy
, const char Str
[],
1309 return wrap(ConstantFP::get(unwrap(RealTy
), StringRef(Str
, SLen
)));
1312 unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal
) {
1313 return unwrap
<ConstantInt
>(ConstantVal
)->getZExtValue();
1316 long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal
) {
1317 return unwrap
<ConstantInt
>(ConstantVal
)->getSExtValue();
1320 double LLVMConstRealGetDouble(LLVMValueRef ConstantVal
, LLVMBool
*LosesInfo
) {
1321 ConstantFP
*cFP
= unwrap
<ConstantFP
>(ConstantVal
) ;
1322 Type
*Ty
= cFP
->getType();
1324 if (Ty
->isFloatTy()) {
1326 return cFP
->getValueAPF().convertToFloat();
1329 if (Ty
->isDoubleTy()) {
1331 return cFP
->getValueAPF().convertToDouble();
1335 APFloat APF
= cFP
->getValueAPF();
1336 APF
.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven
, &APFLosesInfo
);
1337 *LosesInfo
= APFLosesInfo
;
1338 return APF
.convertToDouble();
1341 /*--.. Operations on composite constants ...................................--*/
1343 LLVMValueRef
LLVMConstStringInContext(LLVMContextRef C
, const char *Str
,
1345 LLVMBool DontNullTerminate
) {
1346 /* Inverted the sense of AddNull because ', 0)' is a
1347 better mnemonic for null termination than ', 1)'. */
1348 return wrap(ConstantDataArray::getString(*unwrap(C
), StringRef(Str
, Length
),
1349 DontNullTerminate
== 0));
1352 LLVMValueRef
LLVMConstString(const char *Str
, unsigned Length
,
1353 LLVMBool DontNullTerminate
) {
1354 return LLVMConstStringInContext(LLVMGetGlobalContext(), Str
, Length
,
1358 LLVMValueRef
LLVMGetElementAsConstant(LLVMValueRef C
, unsigned idx
) {
1359 return wrap(unwrap
<ConstantDataSequential
>(C
)->getElementAsConstant(idx
));
1362 LLVMBool
LLVMIsConstantString(LLVMValueRef C
) {
1363 return unwrap
<ConstantDataSequential
>(C
)->isString();
1366 const char *LLVMGetAsString(LLVMValueRef C
, size_t *Length
) {
1367 StringRef Str
= unwrap
<ConstantDataSequential
>(C
)->getAsString();
1368 *Length
= Str
.size();
1372 LLVMValueRef
LLVMConstArray(LLVMTypeRef ElementTy
,
1373 LLVMValueRef
*ConstantVals
, unsigned Length
) {
1374 ArrayRef
<Constant
*> V(unwrap
<Constant
>(ConstantVals
, Length
), Length
);
1375 return wrap(ConstantArray::get(ArrayType::get(unwrap(ElementTy
), Length
), V
));
1378 LLVMValueRef
LLVMConstStructInContext(LLVMContextRef C
,
1379 LLVMValueRef
*ConstantVals
,
1380 unsigned Count
, LLVMBool Packed
) {
1381 Constant
**Elements
= unwrap
<Constant
>(ConstantVals
, Count
);
1382 return wrap(ConstantStruct::getAnon(*unwrap(C
), makeArrayRef(Elements
, Count
),
1386 LLVMValueRef
LLVMConstStruct(LLVMValueRef
*ConstantVals
, unsigned Count
,
1388 return LLVMConstStructInContext(LLVMGetGlobalContext(), ConstantVals
, Count
,
1392 LLVMValueRef
LLVMConstNamedStruct(LLVMTypeRef StructTy
,
1393 LLVMValueRef
*ConstantVals
,
1395 Constant
**Elements
= unwrap
<Constant
>(ConstantVals
, Count
);
1396 StructType
*Ty
= cast
<StructType
>(unwrap(StructTy
));
1398 return wrap(ConstantStruct::get(Ty
, makeArrayRef(Elements
, Count
)));
1401 LLVMValueRef
LLVMConstVector(LLVMValueRef
*ScalarConstantVals
, unsigned Size
) {
1402 return wrap(ConstantVector::get(makeArrayRef(
1403 unwrap
<Constant
>(ScalarConstantVals
, Size
), Size
)));
1406 /*-- Opcode mapping */
1408 static LLVMOpcode
map_to_llvmopcode(int opcode
)
1411 default: llvm_unreachable("Unhandled Opcode.");
1412 #define HANDLE_INST(num, opc, clas) case num: return LLVM##opc;
1413 #include "llvm/IR/Instruction.def"
1418 static int map_from_llvmopcode(LLVMOpcode code
)
1421 #define HANDLE_INST(num, opc, clas) case LLVM##opc: return num;
1422 #include "llvm/IR/Instruction.def"
1425 llvm_unreachable("Unhandled Opcode.");
1428 /*--.. Constant expressions ................................................--*/
1430 LLVMOpcode
LLVMGetConstOpcode(LLVMValueRef ConstantVal
) {
1431 return map_to_llvmopcode(unwrap
<ConstantExpr
>(ConstantVal
)->getOpcode());
1434 LLVMValueRef
LLVMAlignOf(LLVMTypeRef Ty
) {
1435 return wrap(ConstantExpr::getAlignOf(unwrap(Ty
)));
1438 LLVMValueRef
LLVMSizeOf(LLVMTypeRef Ty
) {
1439 return wrap(ConstantExpr::getSizeOf(unwrap(Ty
)));
1442 LLVMValueRef
LLVMConstNeg(LLVMValueRef ConstantVal
) {
1443 return wrap(ConstantExpr::getNeg(unwrap
<Constant
>(ConstantVal
)));
1446 LLVMValueRef
LLVMConstNSWNeg(LLVMValueRef ConstantVal
) {
1447 return wrap(ConstantExpr::getNSWNeg(unwrap
<Constant
>(ConstantVal
)));
1450 LLVMValueRef
LLVMConstNUWNeg(LLVMValueRef ConstantVal
) {
1451 return wrap(ConstantExpr::getNUWNeg(unwrap
<Constant
>(ConstantVal
)));
1455 LLVMValueRef
LLVMConstFNeg(LLVMValueRef ConstantVal
) {
1456 return wrap(ConstantExpr::getFNeg(unwrap
<Constant
>(ConstantVal
)));
1459 LLVMValueRef
LLVMConstNot(LLVMValueRef ConstantVal
) {
1460 return wrap(ConstantExpr::getNot(unwrap
<Constant
>(ConstantVal
)));
1463 LLVMValueRef
LLVMConstAdd(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1464 return wrap(ConstantExpr::getAdd(unwrap
<Constant
>(LHSConstant
),
1465 unwrap
<Constant
>(RHSConstant
)));
1468 LLVMValueRef
LLVMConstNSWAdd(LLVMValueRef LHSConstant
,
1469 LLVMValueRef RHSConstant
) {
1470 return wrap(ConstantExpr::getNSWAdd(unwrap
<Constant
>(LHSConstant
),
1471 unwrap
<Constant
>(RHSConstant
)));
1474 LLVMValueRef
LLVMConstNUWAdd(LLVMValueRef LHSConstant
,
1475 LLVMValueRef RHSConstant
) {
1476 return wrap(ConstantExpr::getNUWAdd(unwrap
<Constant
>(LHSConstant
),
1477 unwrap
<Constant
>(RHSConstant
)));
1480 LLVMValueRef
LLVMConstFAdd(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1481 return wrap(ConstantExpr::getFAdd(unwrap
<Constant
>(LHSConstant
),
1482 unwrap
<Constant
>(RHSConstant
)));
1485 LLVMValueRef
LLVMConstSub(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1486 return wrap(ConstantExpr::getSub(unwrap
<Constant
>(LHSConstant
),
1487 unwrap
<Constant
>(RHSConstant
)));
1490 LLVMValueRef
LLVMConstNSWSub(LLVMValueRef LHSConstant
,
1491 LLVMValueRef RHSConstant
) {
1492 return wrap(ConstantExpr::getNSWSub(unwrap
<Constant
>(LHSConstant
),
1493 unwrap
<Constant
>(RHSConstant
)));
1496 LLVMValueRef
LLVMConstNUWSub(LLVMValueRef LHSConstant
,
1497 LLVMValueRef RHSConstant
) {
1498 return wrap(ConstantExpr::getNUWSub(unwrap
<Constant
>(LHSConstant
),
1499 unwrap
<Constant
>(RHSConstant
)));
1502 LLVMValueRef
LLVMConstFSub(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1503 return wrap(ConstantExpr::getFSub(unwrap
<Constant
>(LHSConstant
),
1504 unwrap
<Constant
>(RHSConstant
)));
1507 LLVMValueRef
LLVMConstMul(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1508 return wrap(ConstantExpr::getMul(unwrap
<Constant
>(LHSConstant
),
1509 unwrap
<Constant
>(RHSConstant
)));
1512 LLVMValueRef
LLVMConstNSWMul(LLVMValueRef LHSConstant
,
1513 LLVMValueRef RHSConstant
) {
1514 return wrap(ConstantExpr::getNSWMul(unwrap
<Constant
>(LHSConstant
),
1515 unwrap
<Constant
>(RHSConstant
)));
1518 LLVMValueRef
LLVMConstNUWMul(LLVMValueRef LHSConstant
,
1519 LLVMValueRef RHSConstant
) {
1520 return wrap(ConstantExpr::getNUWMul(unwrap
<Constant
>(LHSConstant
),
1521 unwrap
<Constant
>(RHSConstant
)));
1524 LLVMValueRef
LLVMConstFMul(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1525 return wrap(ConstantExpr::getFMul(unwrap
<Constant
>(LHSConstant
),
1526 unwrap
<Constant
>(RHSConstant
)));
1529 LLVMValueRef
LLVMConstUDiv(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1530 return wrap(ConstantExpr::getUDiv(unwrap
<Constant
>(LHSConstant
),
1531 unwrap
<Constant
>(RHSConstant
)));
1534 LLVMValueRef
LLVMConstExactUDiv(LLVMValueRef LHSConstant
,
1535 LLVMValueRef RHSConstant
) {
1536 return wrap(ConstantExpr::getExactUDiv(unwrap
<Constant
>(LHSConstant
),
1537 unwrap
<Constant
>(RHSConstant
)));
1540 LLVMValueRef
LLVMConstSDiv(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1541 return wrap(ConstantExpr::getSDiv(unwrap
<Constant
>(LHSConstant
),
1542 unwrap
<Constant
>(RHSConstant
)));
1545 LLVMValueRef
LLVMConstExactSDiv(LLVMValueRef LHSConstant
,
1546 LLVMValueRef RHSConstant
) {
1547 return wrap(ConstantExpr::getExactSDiv(unwrap
<Constant
>(LHSConstant
),
1548 unwrap
<Constant
>(RHSConstant
)));
1551 LLVMValueRef
LLVMConstFDiv(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1552 return wrap(ConstantExpr::getFDiv(unwrap
<Constant
>(LHSConstant
),
1553 unwrap
<Constant
>(RHSConstant
)));
1556 LLVMValueRef
LLVMConstURem(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1557 return wrap(ConstantExpr::getURem(unwrap
<Constant
>(LHSConstant
),
1558 unwrap
<Constant
>(RHSConstant
)));
1561 LLVMValueRef
LLVMConstSRem(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1562 return wrap(ConstantExpr::getSRem(unwrap
<Constant
>(LHSConstant
),
1563 unwrap
<Constant
>(RHSConstant
)));
1566 LLVMValueRef
LLVMConstFRem(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1567 return wrap(ConstantExpr::getFRem(unwrap
<Constant
>(LHSConstant
),
1568 unwrap
<Constant
>(RHSConstant
)));
1571 LLVMValueRef
LLVMConstAnd(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1572 return wrap(ConstantExpr::getAnd(unwrap
<Constant
>(LHSConstant
),
1573 unwrap
<Constant
>(RHSConstant
)));
1576 LLVMValueRef
LLVMConstOr(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1577 return wrap(ConstantExpr::getOr(unwrap
<Constant
>(LHSConstant
),
1578 unwrap
<Constant
>(RHSConstant
)));
1581 LLVMValueRef
LLVMConstXor(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1582 return wrap(ConstantExpr::getXor(unwrap
<Constant
>(LHSConstant
),
1583 unwrap
<Constant
>(RHSConstant
)));
1586 LLVMValueRef
LLVMConstICmp(LLVMIntPredicate Predicate
,
1587 LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1588 return wrap(ConstantExpr::getICmp(Predicate
,
1589 unwrap
<Constant
>(LHSConstant
),
1590 unwrap
<Constant
>(RHSConstant
)));
1593 LLVMValueRef
LLVMConstFCmp(LLVMRealPredicate Predicate
,
1594 LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1595 return wrap(ConstantExpr::getFCmp(Predicate
,
1596 unwrap
<Constant
>(LHSConstant
),
1597 unwrap
<Constant
>(RHSConstant
)));
1600 LLVMValueRef
LLVMConstShl(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1601 return wrap(ConstantExpr::getShl(unwrap
<Constant
>(LHSConstant
),
1602 unwrap
<Constant
>(RHSConstant
)));
1605 LLVMValueRef
LLVMConstLShr(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1606 return wrap(ConstantExpr::getLShr(unwrap
<Constant
>(LHSConstant
),
1607 unwrap
<Constant
>(RHSConstant
)));
1610 LLVMValueRef
LLVMConstAShr(LLVMValueRef LHSConstant
, LLVMValueRef RHSConstant
) {
1611 return wrap(ConstantExpr::getAShr(unwrap
<Constant
>(LHSConstant
),
1612 unwrap
<Constant
>(RHSConstant
)));
1615 LLVMValueRef
LLVMConstGEP(LLVMValueRef ConstantVal
,
1616 LLVMValueRef
*ConstantIndices
, unsigned NumIndices
) {
1617 ArrayRef
<Constant
*> IdxList(unwrap
<Constant
>(ConstantIndices
, NumIndices
),
1619 Constant
*Val
= unwrap
<Constant
>(ConstantVal
);
1621 cast
<PointerType
>(Val
->getType()->getScalarType())->getElementType();
1622 return wrap(ConstantExpr::getGetElementPtr(Ty
, Val
, IdxList
));
1625 LLVMValueRef
LLVMConstInBoundsGEP(LLVMValueRef ConstantVal
,
1626 LLVMValueRef
*ConstantIndices
,
1627 unsigned NumIndices
) {
1628 ArrayRef
<Constant
*> IdxList(unwrap
<Constant
>(ConstantIndices
, NumIndices
),
1630 Constant
*Val
= unwrap
<Constant
>(ConstantVal
);
1632 cast
<PointerType
>(Val
->getType()->getScalarType())->getElementType();
1633 return wrap(ConstantExpr::getInBoundsGetElementPtr(Ty
, Val
, IdxList
));
1636 LLVMValueRef
LLVMConstTrunc(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
) {
1637 return wrap(ConstantExpr::getTrunc(unwrap
<Constant
>(ConstantVal
),
1641 LLVMValueRef
LLVMConstSExt(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
) {
1642 return wrap(ConstantExpr::getSExt(unwrap
<Constant
>(ConstantVal
),
1646 LLVMValueRef
LLVMConstZExt(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
) {
1647 return wrap(ConstantExpr::getZExt(unwrap
<Constant
>(ConstantVal
),
1651 LLVMValueRef
LLVMConstFPTrunc(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
) {
1652 return wrap(ConstantExpr::getFPTrunc(unwrap
<Constant
>(ConstantVal
),
1656 LLVMValueRef
LLVMConstFPExt(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
) {
1657 return wrap(ConstantExpr::getFPExtend(unwrap
<Constant
>(ConstantVal
),
1661 LLVMValueRef
LLVMConstUIToFP(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
) {
1662 return wrap(ConstantExpr::getUIToFP(unwrap
<Constant
>(ConstantVal
),
1666 LLVMValueRef
LLVMConstSIToFP(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
) {
1667 return wrap(ConstantExpr::getSIToFP(unwrap
<Constant
>(ConstantVal
),
1671 LLVMValueRef
LLVMConstFPToUI(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
) {
1672 return wrap(ConstantExpr::getFPToUI(unwrap
<Constant
>(ConstantVal
),
1676 LLVMValueRef
LLVMConstFPToSI(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
) {
1677 return wrap(ConstantExpr::getFPToSI(unwrap
<Constant
>(ConstantVal
),
1681 LLVMValueRef
LLVMConstPtrToInt(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
) {
1682 return wrap(ConstantExpr::getPtrToInt(unwrap
<Constant
>(ConstantVal
),
1686 LLVMValueRef
LLVMConstIntToPtr(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
) {
1687 return wrap(ConstantExpr::getIntToPtr(unwrap
<Constant
>(ConstantVal
),
1691 LLVMValueRef
LLVMConstBitCast(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
) {
1692 return wrap(ConstantExpr::getBitCast(unwrap
<Constant
>(ConstantVal
),
1696 LLVMValueRef
LLVMConstAddrSpaceCast(LLVMValueRef ConstantVal
,
1697 LLVMTypeRef ToType
) {
1698 return wrap(ConstantExpr::getAddrSpaceCast(unwrap
<Constant
>(ConstantVal
),
1702 LLVMValueRef
LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal
,
1703 LLVMTypeRef ToType
) {
1704 return wrap(ConstantExpr::getZExtOrBitCast(unwrap
<Constant
>(ConstantVal
),
1708 LLVMValueRef
LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal
,
1709 LLVMTypeRef ToType
) {
1710 return wrap(ConstantExpr::getSExtOrBitCast(unwrap
<Constant
>(ConstantVal
),
1714 LLVMValueRef
LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal
,
1715 LLVMTypeRef ToType
) {
1716 return wrap(ConstantExpr::getTruncOrBitCast(unwrap
<Constant
>(ConstantVal
),
1720 LLVMValueRef
LLVMConstPointerCast(LLVMValueRef ConstantVal
,
1721 LLVMTypeRef ToType
) {
1722 return wrap(ConstantExpr::getPointerCast(unwrap
<Constant
>(ConstantVal
),
1726 LLVMValueRef
LLVMConstIntCast(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
,
1727 LLVMBool isSigned
) {
1728 return wrap(ConstantExpr::getIntegerCast(unwrap
<Constant
>(ConstantVal
),
1729 unwrap(ToType
), isSigned
));
1732 LLVMValueRef
LLVMConstFPCast(LLVMValueRef ConstantVal
, LLVMTypeRef ToType
) {
1733 return wrap(ConstantExpr::getFPCast(unwrap
<Constant
>(ConstantVal
),
1737 LLVMValueRef
LLVMConstSelect(LLVMValueRef ConstantCondition
,
1738 LLVMValueRef ConstantIfTrue
,
1739 LLVMValueRef ConstantIfFalse
) {
1740 return wrap(ConstantExpr::getSelect(unwrap
<Constant
>(ConstantCondition
),
1741 unwrap
<Constant
>(ConstantIfTrue
),
1742 unwrap
<Constant
>(ConstantIfFalse
)));
1745 LLVMValueRef
LLVMConstExtractElement(LLVMValueRef VectorConstant
,
1746 LLVMValueRef IndexConstant
) {
1747 return wrap(ConstantExpr::getExtractElement(unwrap
<Constant
>(VectorConstant
),
1748 unwrap
<Constant
>(IndexConstant
)));
1751 LLVMValueRef
LLVMConstInsertElement(LLVMValueRef VectorConstant
,
1752 LLVMValueRef ElementValueConstant
,
1753 LLVMValueRef IndexConstant
) {
1754 return wrap(ConstantExpr::getInsertElement(unwrap
<Constant
>(VectorConstant
),
1755 unwrap
<Constant
>(ElementValueConstant
),
1756 unwrap
<Constant
>(IndexConstant
)));
1759 LLVMValueRef
LLVMConstShuffleVector(LLVMValueRef VectorAConstant
,
1760 LLVMValueRef VectorBConstant
,
1761 LLVMValueRef MaskConstant
) {
1762 return wrap(ConstantExpr::getShuffleVector(unwrap
<Constant
>(VectorAConstant
),
1763 unwrap
<Constant
>(VectorBConstant
),
1764 unwrap
<Constant
>(MaskConstant
)));
1767 LLVMValueRef
LLVMConstExtractValue(LLVMValueRef AggConstant
, unsigned *IdxList
,
1769 return wrap(ConstantExpr::getExtractValue(unwrap
<Constant
>(AggConstant
),
1770 makeArrayRef(IdxList
, NumIdx
)));
1773 LLVMValueRef
LLVMConstInsertValue(LLVMValueRef AggConstant
,
1774 LLVMValueRef ElementValueConstant
,
1775 unsigned *IdxList
, unsigned NumIdx
) {
1776 return wrap(ConstantExpr::getInsertValue(unwrap
<Constant
>(AggConstant
),
1777 unwrap
<Constant
>(ElementValueConstant
),
1778 makeArrayRef(IdxList
, NumIdx
)));
1781 LLVMValueRef
LLVMConstInlineAsm(LLVMTypeRef Ty
, const char *AsmString
,
1782 const char *Constraints
,
1783 LLVMBool HasSideEffects
,
1784 LLVMBool IsAlignStack
) {
1785 return wrap(InlineAsm::get(dyn_cast
<FunctionType
>(unwrap(Ty
)), AsmString
,
1786 Constraints
, HasSideEffects
, IsAlignStack
));
1789 LLVMValueRef
LLVMBlockAddress(LLVMValueRef F
, LLVMBasicBlockRef BB
) {
1790 return wrap(BlockAddress::get(unwrap
<Function
>(F
), unwrap(BB
)));
1793 /*--.. Operations on global variables, functions, and aliases (globals) ....--*/
1795 LLVMModuleRef
LLVMGetGlobalParent(LLVMValueRef Global
) {
1796 return wrap(unwrap
<GlobalValue
>(Global
)->getParent());
1799 LLVMBool
LLVMIsDeclaration(LLVMValueRef Global
) {
1800 return unwrap
<GlobalValue
>(Global
)->isDeclaration();
1803 LLVMLinkage
LLVMGetLinkage(LLVMValueRef Global
) {
1804 switch (unwrap
<GlobalValue
>(Global
)->getLinkage()) {
1805 case GlobalValue::ExternalLinkage
:
1806 return LLVMExternalLinkage
;
1807 case GlobalValue::AvailableExternallyLinkage
:
1808 return LLVMAvailableExternallyLinkage
;
1809 case GlobalValue::LinkOnceAnyLinkage
:
1810 return LLVMLinkOnceAnyLinkage
;
1811 case GlobalValue::LinkOnceODRLinkage
:
1812 return LLVMLinkOnceODRLinkage
;
1813 case GlobalValue::WeakAnyLinkage
:
1814 return LLVMWeakAnyLinkage
;
1815 case GlobalValue::WeakODRLinkage
:
1816 return LLVMWeakODRLinkage
;
1817 case GlobalValue::AppendingLinkage
:
1818 return LLVMAppendingLinkage
;
1819 case GlobalValue::InternalLinkage
:
1820 return LLVMInternalLinkage
;
1821 case GlobalValue::PrivateLinkage
:
1822 return LLVMPrivateLinkage
;
1823 case GlobalValue::ExternalWeakLinkage
:
1824 return LLVMExternalWeakLinkage
;
1825 case GlobalValue::CommonLinkage
:
1826 return LLVMCommonLinkage
;
1829 llvm_unreachable("Invalid GlobalValue linkage!");
1832 void LLVMSetLinkage(LLVMValueRef Global
, LLVMLinkage Linkage
) {
1833 GlobalValue
*GV
= unwrap
<GlobalValue
>(Global
);
1836 case LLVMExternalLinkage
:
1837 GV
->setLinkage(GlobalValue::ExternalLinkage
);
1839 case LLVMAvailableExternallyLinkage
:
1840 GV
->setLinkage(GlobalValue::AvailableExternallyLinkage
);
1842 case LLVMLinkOnceAnyLinkage
:
1843 GV
->setLinkage(GlobalValue::LinkOnceAnyLinkage
);
1845 case LLVMLinkOnceODRLinkage
:
1846 GV
->setLinkage(GlobalValue::LinkOnceODRLinkage
);
1848 case LLVMLinkOnceODRAutoHideLinkage
:
1850 errs() << "LLVMSetLinkage(): LLVMLinkOnceODRAutoHideLinkage is no "
1851 "longer supported.");
1853 case LLVMWeakAnyLinkage
:
1854 GV
->setLinkage(GlobalValue::WeakAnyLinkage
);
1856 case LLVMWeakODRLinkage
:
1857 GV
->setLinkage(GlobalValue::WeakODRLinkage
);
1859 case LLVMAppendingLinkage
:
1860 GV
->setLinkage(GlobalValue::AppendingLinkage
);
1862 case LLVMInternalLinkage
:
1863 GV
->setLinkage(GlobalValue::InternalLinkage
);
1865 case LLVMPrivateLinkage
:
1866 GV
->setLinkage(GlobalValue::PrivateLinkage
);
1868 case LLVMLinkerPrivateLinkage
:
1869 GV
->setLinkage(GlobalValue::PrivateLinkage
);
1871 case LLVMLinkerPrivateWeakLinkage
:
1872 GV
->setLinkage(GlobalValue::PrivateLinkage
);
1874 case LLVMDLLImportLinkage
:
1877 << "LLVMSetLinkage(): LLVMDLLImportLinkage is no longer supported.");
1879 case LLVMDLLExportLinkage
:
1882 << "LLVMSetLinkage(): LLVMDLLExportLinkage is no longer supported.");
1884 case LLVMExternalWeakLinkage
:
1885 GV
->setLinkage(GlobalValue::ExternalWeakLinkage
);
1887 case LLVMGhostLinkage
:
1889 errs() << "LLVMSetLinkage(): LLVMGhostLinkage is no longer supported.");
1891 case LLVMCommonLinkage
:
1892 GV
->setLinkage(GlobalValue::CommonLinkage
);
1897 const char *LLVMGetSection(LLVMValueRef Global
) {
1898 // Using .data() is safe because of how GlobalObject::setSection is
1900 return unwrap
<GlobalValue
>(Global
)->getSection().data();
1903 void LLVMSetSection(LLVMValueRef Global
, const char *Section
) {
1904 unwrap
<GlobalObject
>(Global
)->setSection(Section
);
1907 LLVMVisibility
LLVMGetVisibility(LLVMValueRef Global
) {
1908 return static_cast<LLVMVisibility
>(
1909 unwrap
<GlobalValue
>(Global
)->getVisibility());
1912 void LLVMSetVisibility(LLVMValueRef Global
, LLVMVisibility Viz
) {
1913 unwrap
<GlobalValue
>(Global
)
1914 ->setVisibility(static_cast<GlobalValue::VisibilityTypes
>(Viz
));
1917 LLVMDLLStorageClass
LLVMGetDLLStorageClass(LLVMValueRef Global
) {
1918 return static_cast<LLVMDLLStorageClass
>(
1919 unwrap
<GlobalValue
>(Global
)->getDLLStorageClass());
1922 void LLVMSetDLLStorageClass(LLVMValueRef Global
, LLVMDLLStorageClass Class
) {
1923 unwrap
<GlobalValue
>(Global
)->setDLLStorageClass(
1924 static_cast<GlobalValue::DLLStorageClassTypes
>(Class
));
1927 LLVMUnnamedAddr
LLVMGetUnnamedAddress(LLVMValueRef Global
) {
1928 switch (unwrap
<GlobalValue
>(Global
)->getUnnamedAddr()) {
1929 case GlobalVariable::UnnamedAddr::None
:
1930 return LLVMNoUnnamedAddr
;
1931 case GlobalVariable::UnnamedAddr::Local
:
1932 return LLVMLocalUnnamedAddr
;
1933 case GlobalVariable::UnnamedAddr::Global
:
1934 return LLVMGlobalUnnamedAddr
;
1936 llvm_unreachable("Unknown UnnamedAddr kind!");
1939 void LLVMSetUnnamedAddress(LLVMValueRef Global
, LLVMUnnamedAddr UnnamedAddr
) {
1940 GlobalValue
*GV
= unwrap
<GlobalValue
>(Global
);
1942 switch (UnnamedAddr
) {
1943 case LLVMNoUnnamedAddr
:
1944 return GV
->setUnnamedAddr(GlobalVariable::UnnamedAddr::None
);
1945 case LLVMLocalUnnamedAddr
:
1946 return GV
->setUnnamedAddr(GlobalVariable::UnnamedAddr::Local
);
1947 case LLVMGlobalUnnamedAddr
:
1948 return GV
->setUnnamedAddr(GlobalVariable::UnnamedAddr::Global
);
1952 LLVMBool
LLVMHasUnnamedAddr(LLVMValueRef Global
) {
1953 return unwrap
<GlobalValue
>(Global
)->hasGlobalUnnamedAddr();
1956 void LLVMSetUnnamedAddr(LLVMValueRef Global
, LLVMBool HasUnnamedAddr
) {
1957 unwrap
<GlobalValue
>(Global
)->setUnnamedAddr(
1958 HasUnnamedAddr
? GlobalValue::UnnamedAddr::Global
1959 : GlobalValue::UnnamedAddr::None
);
1962 LLVMTypeRef
LLVMGlobalGetValueType(LLVMValueRef Global
) {
1963 return wrap(unwrap
<GlobalValue
>(Global
)->getValueType());
1966 /*--.. Operations on global variables, load and store instructions .........--*/
1968 unsigned LLVMGetAlignment(LLVMValueRef V
) {
1969 Value
*P
= unwrap
<Value
>(V
);
1970 if (GlobalValue
*GV
= dyn_cast
<GlobalValue
>(P
))
1971 return GV
->getAlignment();
1972 if (AllocaInst
*AI
= dyn_cast
<AllocaInst
>(P
))
1973 return AI
->getAlignment();
1974 if (LoadInst
*LI
= dyn_cast
<LoadInst
>(P
))
1975 return LI
->getAlignment();
1976 if (StoreInst
*SI
= dyn_cast
<StoreInst
>(P
))
1977 return SI
->getAlignment();
1980 "only GlobalValue, AllocaInst, LoadInst and StoreInst have alignment");
1983 void LLVMSetAlignment(LLVMValueRef V
, unsigned Bytes
) {
1984 Value
*P
= unwrap
<Value
>(V
);
1985 if (GlobalObject
*GV
= dyn_cast
<GlobalObject
>(P
))
1986 GV
->setAlignment(Bytes
);
1987 else if (AllocaInst
*AI
= dyn_cast
<AllocaInst
>(P
))
1988 AI
->setAlignment(Bytes
);
1989 else if (LoadInst
*LI
= dyn_cast
<LoadInst
>(P
))
1990 LI
->setAlignment(Bytes
);
1991 else if (StoreInst
*SI
= dyn_cast
<StoreInst
>(P
))
1992 SI
->setAlignment(Bytes
);
1995 "only GlobalValue, AllocaInst, LoadInst and StoreInst have alignment");
1998 LLVMValueMetadataEntry
*LLVMGlobalCopyAllMetadata(LLVMValueRef Value
,
1999 size_t *NumEntries
) {
2000 return llvm_getMetadata(NumEntries
, [&Value
](MetadataEntries
&Entries
) {
2001 if (Instruction
*Instr
= dyn_cast
<Instruction
>(unwrap(Value
))) {
2002 Instr
->getAllMetadata(Entries
);
2004 unwrap
<GlobalObject
>(Value
)->getAllMetadata(Entries
);
2009 unsigned LLVMValueMetadataEntriesGetKind(LLVMValueMetadataEntry
*Entries
,
2011 LLVMOpaqueValueMetadataEntry MVE
=
2012 static_cast<LLVMOpaqueValueMetadataEntry
>(Entries
[Index
]);
2017 LLVMValueMetadataEntriesGetMetadata(LLVMValueMetadataEntry
*Entries
,
2019 LLVMOpaqueValueMetadataEntry MVE
=
2020 static_cast<LLVMOpaqueValueMetadataEntry
>(Entries
[Index
]);
2021 return MVE
.Metadata
;
2024 void LLVMDisposeValueMetadataEntries(LLVMValueMetadataEntry
*Entries
) {
2028 void LLVMGlobalSetMetadata(LLVMValueRef Global
, unsigned Kind
,
2029 LLVMMetadataRef MD
) {
2030 unwrap
<GlobalObject
>(Global
)->setMetadata(Kind
, unwrap
<MDNode
>(MD
));
2033 void LLVMGlobalEraseMetadata(LLVMValueRef Global
, unsigned Kind
) {
2034 unwrap
<GlobalObject
>(Global
)->eraseMetadata(Kind
);
2037 void LLVMGlobalClearMetadata(LLVMValueRef Global
) {
2038 unwrap
<GlobalObject
>(Global
)->clearMetadata();
2041 /*--.. Operations on global variables ......................................--*/
2043 LLVMValueRef
LLVMAddGlobal(LLVMModuleRef M
, LLVMTypeRef Ty
, const char *Name
) {
2044 return wrap(new GlobalVariable(*unwrap(M
), unwrap(Ty
), false,
2045 GlobalValue::ExternalLinkage
, nullptr, Name
));
2048 LLVMValueRef
LLVMAddGlobalInAddressSpace(LLVMModuleRef M
, LLVMTypeRef Ty
,
2050 unsigned AddressSpace
) {
2051 return wrap(new GlobalVariable(*unwrap(M
), unwrap(Ty
), false,
2052 GlobalValue::ExternalLinkage
, nullptr, Name
,
2053 nullptr, GlobalVariable::NotThreadLocal
,
2057 LLVMValueRef
LLVMGetNamedGlobal(LLVMModuleRef M
, const char *Name
) {
2058 return wrap(unwrap(M
)->getNamedGlobal(Name
));
2061 LLVMValueRef
LLVMGetFirstGlobal(LLVMModuleRef M
) {
2062 Module
*Mod
= unwrap(M
);
2063 Module::global_iterator I
= Mod
->global_begin();
2064 if (I
== Mod
->global_end())
2069 LLVMValueRef
LLVMGetLastGlobal(LLVMModuleRef M
) {
2070 Module
*Mod
= unwrap(M
);
2071 Module::global_iterator I
= Mod
->global_end();
2072 if (I
== Mod
->global_begin())
2077 LLVMValueRef
LLVMGetNextGlobal(LLVMValueRef GlobalVar
) {
2078 GlobalVariable
*GV
= unwrap
<GlobalVariable
>(GlobalVar
);
2079 Module::global_iterator
I(GV
);
2080 if (++I
== GV
->getParent()->global_end())
2085 LLVMValueRef
LLVMGetPreviousGlobal(LLVMValueRef GlobalVar
) {
2086 GlobalVariable
*GV
= unwrap
<GlobalVariable
>(GlobalVar
);
2087 Module::global_iterator
I(GV
);
2088 if (I
== GV
->getParent()->global_begin())
2093 void LLVMDeleteGlobal(LLVMValueRef GlobalVar
) {
2094 unwrap
<GlobalVariable
>(GlobalVar
)->eraseFromParent();
2097 LLVMValueRef
LLVMGetInitializer(LLVMValueRef GlobalVar
) {
2098 GlobalVariable
* GV
= unwrap
<GlobalVariable
>(GlobalVar
);
2099 if ( !GV
->hasInitializer() )
2101 return wrap(GV
->getInitializer());
2104 void LLVMSetInitializer(LLVMValueRef GlobalVar
, LLVMValueRef ConstantVal
) {
2105 unwrap
<GlobalVariable
>(GlobalVar
)
2106 ->setInitializer(unwrap
<Constant
>(ConstantVal
));
2109 LLVMBool
LLVMIsThreadLocal(LLVMValueRef GlobalVar
) {
2110 return unwrap
<GlobalVariable
>(GlobalVar
)->isThreadLocal();
2113 void LLVMSetThreadLocal(LLVMValueRef GlobalVar
, LLVMBool IsThreadLocal
) {
2114 unwrap
<GlobalVariable
>(GlobalVar
)->setThreadLocal(IsThreadLocal
!= 0);
2117 LLVMBool
LLVMIsGlobalConstant(LLVMValueRef GlobalVar
) {
2118 return unwrap
<GlobalVariable
>(GlobalVar
)->isConstant();
2121 void LLVMSetGlobalConstant(LLVMValueRef GlobalVar
, LLVMBool IsConstant
) {
2122 unwrap
<GlobalVariable
>(GlobalVar
)->setConstant(IsConstant
!= 0);
2125 LLVMThreadLocalMode
LLVMGetThreadLocalMode(LLVMValueRef GlobalVar
) {
2126 switch (unwrap
<GlobalVariable
>(GlobalVar
)->getThreadLocalMode()) {
2127 case GlobalVariable::NotThreadLocal
:
2128 return LLVMNotThreadLocal
;
2129 case GlobalVariable::GeneralDynamicTLSModel
:
2130 return LLVMGeneralDynamicTLSModel
;
2131 case GlobalVariable::LocalDynamicTLSModel
:
2132 return LLVMLocalDynamicTLSModel
;
2133 case GlobalVariable::InitialExecTLSModel
:
2134 return LLVMInitialExecTLSModel
;
2135 case GlobalVariable::LocalExecTLSModel
:
2136 return LLVMLocalExecTLSModel
;
2139 llvm_unreachable("Invalid GlobalVariable thread local mode");
2142 void LLVMSetThreadLocalMode(LLVMValueRef GlobalVar
, LLVMThreadLocalMode Mode
) {
2143 GlobalVariable
*GV
= unwrap
<GlobalVariable
>(GlobalVar
);
2146 case LLVMNotThreadLocal
:
2147 GV
->setThreadLocalMode(GlobalVariable::NotThreadLocal
);
2149 case LLVMGeneralDynamicTLSModel
:
2150 GV
->setThreadLocalMode(GlobalVariable::GeneralDynamicTLSModel
);
2152 case LLVMLocalDynamicTLSModel
:
2153 GV
->setThreadLocalMode(GlobalVariable::LocalDynamicTLSModel
);
2155 case LLVMInitialExecTLSModel
:
2156 GV
->setThreadLocalMode(GlobalVariable::InitialExecTLSModel
);
2158 case LLVMLocalExecTLSModel
:
2159 GV
->setThreadLocalMode(GlobalVariable::LocalExecTLSModel
);
2164 LLVMBool
LLVMIsExternallyInitialized(LLVMValueRef GlobalVar
) {
2165 return unwrap
<GlobalVariable
>(GlobalVar
)->isExternallyInitialized();
2168 void LLVMSetExternallyInitialized(LLVMValueRef GlobalVar
, LLVMBool IsExtInit
) {
2169 unwrap
<GlobalVariable
>(GlobalVar
)->setExternallyInitialized(IsExtInit
);
2172 /*--.. Operations on aliases ......................................--*/
2174 LLVMValueRef
LLVMAddAlias(LLVMModuleRef M
, LLVMTypeRef Ty
, LLVMValueRef Aliasee
,
2176 auto *PTy
= cast
<PointerType
>(unwrap(Ty
));
2177 return wrap(GlobalAlias::create(PTy
->getElementType(), PTy
->getAddressSpace(),
2178 GlobalValue::ExternalLinkage
, Name
,
2179 unwrap
<Constant
>(Aliasee
), unwrap(M
)));
2182 LLVMValueRef
LLVMGetNamedGlobalAlias(LLVMModuleRef M
,
2183 const char *Name
, size_t NameLen
) {
2184 return wrap(unwrap(M
)->getNamedAlias(Name
));
2187 LLVMValueRef
LLVMGetFirstGlobalAlias(LLVMModuleRef M
) {
2188 Module
*Mod
= unwrap(M
);
2189 Module::alias_iterator I
= Mod
->alias_begin();
2190 if (I
== Mod
->alias_end())
2195 LLVMValueRef
LLVMGetLastGlobalAlias(LLVMModuleRef M
) {
2196 Module
*Mod
= unwrap(M
);
2197 Module::alias_iterator I
= Mod
->alias_end();
2198 if (I
== Mod
->alias_begin())
2203 LLVMValueRef
LLVMGetNextGlobalAlias(LLVMValueRef GA
) {
2204 GlobalAlias
*Alias
= unwrap
<GlobalAlias
>(GA
);
2205 Module::alias_iterator
I(Alias
);
2206 if (++I
== Alias
->getParent()->alias_end())
2211 LLVMValueRef
LLVMGetPreviousGlobalAlias(LLVMValueRef GA
) {
2212 GlobalAlias
*Alias
= unwrap
<GlobalAlias
>(GA
);
2213 Module::alias_iterator
I(Alias
);
2214 if (I
== Alias
->getParent()->alias_begin())
2219 LLVMValueRef
LLVMAliasGetAliasee(LLVMValueRef Alias
) {
2220 return wrap(unwrap
<GlobalAlias
>(Alias
)->getAliasee());
2223 void LLVMAliasSetAliasee(LLVMValueRef Alias
, LLVMValueRef Aliasee
) {
2224 unwrap
<GlobalAlias
>(Alias
)->setAliasee(unwrap
<Constant
>(Aliasee
));
2227 /*--.. Operations on functions .............................................--*/
2229 LLVMValueRef
LLVMAddFunction(LLVMModuleRef M
, const char *Name
,
2230 LLVMTypeRef FunctionTy
) {
2231 return wrap(Function::Create(unwrap
<FunctionType
>(FunctionTy
),
2232 GlobalValue::ExternalLinkage
, Name
, unwrap(M
)));
2235 LLVMValueRef
LLVMGetNamedFunction(LLVMModuleRef M
, const char *Name
) {
2236 return wrap(unwrap(M
)->getFunction(Name
));
2239 LLVMValueRef
LLVMGetFirstFunction(LLVMModuleRef M
) {
2240 Module
*Mod
= unwrap(M
);
2241 Module::iterator I
= Mod
->begin();
2242 if (I
== Mod
->end())
2247 LLVMValueRef
LLVMGetLastFunction(LLVMModuleRef M
) {
2248 Module
*Mod
= unwrap(M
);
2249 Module::iterator I
= Mod
->end();
2250 if (I
== Mod
->begin())
2255 LLVMValueRef
LLVMGetNextFunction(LLVMValueRef Fn
) {
2256 Function
*Func
= unwrap
<Function
>(Fn
);
2257 Module::iterator
I(Func
);
2258 if (++I
== Func
->getParent()->end())
2263 LLVMValueRef
LLVMGetPreviousFunction(LLVMValueRef Fn
) {
2264 Function
*Func
= unwrap
<Function
>(Fn
);
2265 Module::iterator
I(Func
);
2266 if (I
== Func
->getParent()->begin())
2271 void LLVMDeleteFunction(LLVMValueRef Fn
) {
2272 unwrap
<Function
>(Fn
)->eraseFromParent();
2275 LLVMBool
LLVMHasPersonalityFn(LLVMValueRef Fn
) {
2276 return unwrap
<Function
>(Fn
)->hasPersonalityFn();
2279 LLVMValueRef
LLVMGetPersonalityFn(LLVMValueRef Fn
) {
2280 return wrap(unwrap
<Function
>(Fn
)->getPersonalityFn());
2283 void LLVMSetPersonalityFn(LLVMValueRef Fn
, LLVMValueRef PersonalityFn
) {
2284 unwrap
<Function
>(Fn
)->setPersonalityFn(unwrap
<Constant
>(PersonalityFn
));
2287 unsigned LLVMGetIntrinsicID(LLVMValueRef Fn
) {
2288 if (Function
*F
= dyn_cast
<Function
>(unwrap(Fn
)))
2289 return F
->getIntrinsicID();
2293 static Intrinsic::ID
llvm_map_to_intrinsic_id(unsigned ID
) {
2294 assert(ID
< llvm::Intrinsic::num_intrinsics
&& "Intrinsic ID out of range");
2295 return llvm::Intrinsic::ID(ID
);
2298 LLVMValueRef
LLVMGetIntrinsicDeclaration(LLVMModuleRef Mod
,
2300 LLVMTypeRef
*ParamTypes
,
2301 size_t ParamCount
) {
2302 ArrayRef
<Type
*> Tys(unwrap(ParamTypes
), ParamCount
);
2303 auto IID
= llvm_map_to_intrinsic_id(ID
);
2304 return wrap(llvm::Intrinsic::getDeclaration(unwrap(Mod
), IID
, Tys
));
2307 const char *LLVMIntrinsicGetName(unsigned ID
, size_t *NameLength
) {
2308 auto IID
= llvm_map_to_intrinsic_id(ID
);
2309 auto Str
= llvm::Intrinsic::getName(IID
);
2310 *NameLength
= Str
.size();
2314 LLVMTypeRef
LLVMIntrinsicGetType(LLVMContextRef Ctx
, unsigned ID
,
2315 LLVMTypeRef
*ParamTypes
, size_t ParamCount
) {
2316 auto IID
= llvm_map_to_intrinsic_id(ID
);
2317 ArrayRef
<Type
*> Tys(unwrap(ParamTypes
), ParamCount
);
2318 return wrap(llvm::Intrinsic::getType(*unwrap(Ctx
), IID
, Tys
));
2321 const char *LLVMIntrinsicCopyOverloadedName(unsigned ID
,
2322 LLVMTypeRef
*ParamTypes
,
2324 size_t *NameLength
) {
2325 auto IID
= llvm_map_to_intrinsic_id(ID
);
2326 ArrayRef
<Type
*> Tys(unwrap(ParamTypes
), ParamCount
);
2327 auto Str
= llvm::Intrinsic::getName(IID
, Tys
);
2328 *NameLength
= Str
.length();
2329 return strdup(Str
.c_str());
2332 LLVMBool
LLVMIntrinsicIsOverloaded(unsigned ID
) {
2333 auto IID
= llvm_map_to_intrinsic_id(ID
);
2334 return llvm::Intrinsic::isOverloaded(IID
);
2337 unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn
) {
2338 return unwrap
<Function
>(Fn
)->getCallingConv();
2341 void LLVMSetFunctionCallConv(LLVMValueRef Fn
, unsigned CC
) {
2342 return unwrap
<Function
>(Fn
)->setCallingConv(
2343 static_cast<CallingConv::ID
>(CC
));
2346 const char *LLVMGetGC(LLVMValueRef Fn
) {
2347 Function
*F
= unwrap
<Function
>(Fn
);
2348 return F
->hasGC()? F
->getGC().c_str() : nullptr;
2351 void LLVMSetGC(LLVMValueRef Fn
, const char *GC
) {
2352 Function
*F
= unwrap
<Function
>(Fn
);
2359 void LLVMAddAttributeAtIndex(LLVMValueRef F
, LLVMAttributeIndex Idx
,
2360 LLVMAttributeRef A
) {
2361 unwrap
<Function
>(F
)->addAttribute(Idx
, unwrap(A
));
2364 unsigned LLVMGetAttributeCountAtIndex(LLVMValueRef F
, LLVMAttributeIndex Idx
) {
2365 auto AS
= unwrap
<Function
>(F
)->getAttributes().getAttributes(Idx
);
2366 return AS
.getNumAttributes();
2369 void LLVMGetAttributesAtIndex(LLVMValueRef F
, LLVMAttributeIndex Idx
,
2370 LLVMAttributeRef
*Attrs
) {
2371 auto AS
= unwrap
<Function
>(F
)->getAttributes().getAttributes(Idx
);
2376 LLVMAttributeRef
LLVMGetEnumAttributeAtIndex(LLVMValueRef F
,
2377 LLVMAttributeIndex Idx
,
2379 return wrap(unwrap
<Function
>(F
)->getAttribute(Idx
,
2380 (Attribute::AttrKind
)KindID
));
2383 LLVMAttributeRef
LLVMGetStringAttributeAtIndex(LLVMValueRef F
,
2384 LLVMAttributeIndex Idx
,
2385 const char *K
, unsigned KLen
) {
2386 return wrap(unwrap
<Function
>(F
)->getAttribute(Idx
, StringRef(K
, KLen
)));
2389 void LLVMRemoveEnumAttributeAtIndex(LLVMValueRef F
, LLVMAttributeIndex Idx
,
2391 unwrap
<Function
>(F
)->removeAttribute(Idx
, (Attribute::AttrKind
)KindID
);
2394 void LLVMRemoveStringAttributeAtIndex(LLVMValueRef F
, LLVMAttributeIndex Idx
,
2395 const char *K
, unsigned KLen
) {
2396 unwrap
<Function
>(F
)->removeAttribute(Idx
, StringRef(K
, KLen
));
2399 void LLVMAddTargetDependentFunctionAttr(LLVMValueRef Fn
, const char *A
,
2401 Function
*Func
= unwrap
<Function
>(Fn
);
2402 Attribute Attr
= Attribute::get(Func
->getContext(), A
, V
);
2403 Func
->addAttribute(AttributeList::FunctionIndex
, Attr
);
2406 /*--.. Operations on parameters ............................................--*/
2408 unsigned LLVMCountParams(LLVMValueRef FnRef
) {
2409 // This function is strictly redundant to
2410 // LLVMCountParamTypes(LLVMGetElementType(LLVMTypeOf(FnRef)))
2411 return unwrap
<Function
>(FnRef
)->arg_size();
2414 void LLVMGetParams(LLVMValueRef FnRef
, LLVMValueRef
*ParamRefs
) {
2415 Function
*Fn
= unwrap
<Function
>(FnRef
);
2416 for (Function::arg_iterator I
= Fn
->arg_begin(),
2417 E
= Fn
->arg_end(); I
!= E
; I
++)
2418 *ParamRefs
++ = wrap(&*I
);
2421 LLVMValueRef
LLVMGetParam(LLVMValueRef FnRef
, unsigned index
) {
2422 Function
*Fn
= unwrap
<Function
>(FnRef
);
2423 return wrap(&Fn
->arg_begin()[index
]);
2426 LLVMValueRef
LLVMGetParamParent(LLVMValueRef V
) {
2427 return wrap(unwrap
<Argument
>(V
)->getParent());
2430 LLVMValueRef
LLVMGetFirstParam(LLVMValueRef Fn
) {
2431 Function
*Func
= unwrap
<Function
>(Fn
);
2432 Function::arg_iterator I
= Func
->arg_begin();
2433 if (I
== Func
->arg_end())
2438 LLVMValueRef
LLVMGetLastParam(LLVMValueRef Fn
) {
2439 Function
*Func
= unwrap
<Function
>(Fn
);
2440 Function::arg_iterator I
= Func
->arg_end();
2441 if (I
== Func
->arg_begin())
2446 LLVMValueRef
LLVMGetNextParam(LLVMValueRef Arg
) {
2447 Argument
*A
= unwrap
<Argument
>(Arg
);
2448 Function
*Fn
= A
->getParent();
2449 if (A
->getArgNo() + 1 >= Fn
->arg_size())
2451 return wrap(&Fn
->arg_begin()[A
->getArgNo() + 1]);
2454 LLVMValueRef
LLVMGetPreviousParam(LLVMValueRef Arg
) {
2455 Argument
*A
= unwrap
<Argument
>(Arg
);
2456 if (A
->getArgNo() == 0)
2458 return wrap(&A
->getParent()->arg_begin()[A
->getArgNo() - 1]);
2461 void LLVMSetParamAlignment(LLVMValueRef Arg
, unsigned align
) {
2462 Argument
*A
= unwrap
<Argument
>(Arg
);
2463 A
->addAttr(Attribute::getWithAlignment(A
->getContext(), align
));
2466 /*--.. Operations on ifuncs ................................................--*/
2468 LLVMValueRef
LLVMAddGlobalIFunc(LLVMModuleRef M
,
2469 const char *Name
, size_t NameLen
,
2470 LLVMTypeRef Ty
, unsigned AddrSpace
,
2471 LLVMValueRef Resolver
) {
2472 return wrap(GlobalIFunc::create(unwrap(Ty
), AddrSpace
,
2473 GlobalValue::ExternalLinkage
,
2474 StringRef(Name
, NameLen
),
2475 unwrap
<Constant
>(Resolver
), unwrap(M
)));
2478 LLVMValueRef
LLVMGetNamedGlobalIFunc(LLVMModuleRef M
,
2479 const char *Name
, size_t NameLen
) {
2480 return wrap(unwrap(M
)->getNamedIFunc(StringRef(Name
, NameLen
)));
2483 LLVMValueRef
LLVMGetFirstGlobalIFunc(LLVMModuleRef M
) {
2484 Module
*Mod
= unwrap(M
);
2485 Module::ifunc_iterator I
= Mod
->ifunc_begin();
2486 if (I
== Mod
->ifunc_end())
2491 LLVMValueRef
LLVMGetLastGlobalIFunc(LLVMModuleRef M
) {
2492 Module
*Mod
= unwrap(M
);
2493 Module::ifunc_iterator I
= Mod
->ifunc_end();
2494 if (I
== Mod
->ifunc_begin())
2499 LLVMValueRef
LLVMGetNextGlobalIFunc(LLVMValueRef IFunc
) {
2500 GlobalIFunc
*GIF
= unwrap
<GlobalIFunc
>(IFunc
);
2501 Module::ifunc_iterator
I(GIF
);
2502 if (++I
== GIF
->getParent()->ifunc_end())
2507 LLVMValueRef
LLVMGetPreviousGlobalIFunc(LLVMValueRef IFunc
) {
2508 GlobalIFunc
*GIF
= unwrap
<GlobalIFunc
>(IFunc
);
2509 Module::ifunc_iterator
I(GIF
);
2510 if (I
== GIF
->getParent()->ifunc_begin())
2515 LLVMValueRef
LLVMGetGlobalIFuncResolver(LLVMValueRef IFunc
) {
2516 return wrap(unwrap
<GlobalIFunc
>(IFunc
)->getResolver());
2519 void LLVMSetGlobalIFuncResolver(LLVMValueRef IFunc
, LLVMValueRef Resolver
) {
2520 unwrap
<GlobalIFunc
>(IFunc
)->setResolver(unwrap
<Constant
>(Resolver
));
2523 void LLVMEraseGlobalIFunc(LLVMValueRef IFunc
) {
2524 unwrap
<GlobalIFunc
>(IFunc
)->eraseFromParent();
2527 void LLVMRemoveGlobalIFunc(LLVMValueRef IFunc
) {
2528 unwrap
<GlobalIFunc
>(IFunc
)->removeFromParent();
2531 /*--.. Operations on basic blocks ..........................................--*/
2533 LLVMValueRef
LLVMBasicBlockAsValue(LLVMBasicBlockRef BB
) {
2534 return wrap(static_cast<Value
*>(unwrap(BB
)));
2537 LLVMBool
LLVMValueIsBasicBlock(LLVMValueRef Val
) {
2538 return isa
<BasicBlock
>(unwrap(Val
));
2541 LLVMBasicBlockRef
LLVMValueAsBasicBlock(LLVMValueRef Val
) {
2542 return wrap(unwrap
<BasicBlock
>(Val
));
2545 const char *LLVMGetBasicBlockName(LLVMBasicBlockRef BB
) {
2546 return unwrap(BB
)->getName().data();
2549 LLVMValueRef
LLVMGetBasicBlockParent(LLVMBasicBlockRef BB
) {
2550 return wrap(unwrap(BB
)->getParent());
2553 LLVMValueRef
LLVMGetBasicBlockTerminator(LLVMBasicBlockRef BB
) {
2554 return wrap(unwrap(BB
)->getTerminator());
2557 unsigned LLVMCountBasicBlocks(LLVMValueRef FnRef
) {
2558 return unwrap
<Function
>(FnRef
)->size();
2561 void LLVMGetBasicBlocks(LLVMValueRef FnRef
, LLVMBasicBlockRef
*BasicBlocksRefs
){
2562 Function
*Fn
= unwrap
<Function
>(FnRef
);
2563 for (BasicBlock
&BB
: *Fn
)
2564 *BasicBlocksRefs
++ = wrap(&BB
);
2567 LLVMBasicBlockRef
LLVMGetEntryBasicBlock(LLVMValueRef Fn
) {
2568 return wrap(&unwrap
<Function
>(Fn
)->getEntryBlock());
2571 LLVMBasicBlockRef
LLVMGetFirstBasicBlock(LLVMValueRef Fn
) {
2572 Function
*Func
= unwrap
<Function
>(Fn
);
2573 Function::iterator I
= Func
->begin();
2574 if (I
== Func
->end())
2579 LLVMBasicBlockRef
LLVMGetLastBasicBlock(LLVMValueRef Fn
) {
2580 Function
*Func
= unwrap
<Function
>(Fn
);
2581 Function::iterator I
= Func
->end();
2582 if (I
== Func
->begin())
2587 LLVMBasicBlockRef
LLVMGetNextBasicBlock(LLVMBasicBlockRef BB
) {
2588 BasicBlock
*Block
= unwrap(BB
);
2589 Function::iterator
I(Block
);
2590 if (++I
== Block
->getParent()->end())
2595 LLVMBasicBlockRef
LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB
) {
2596 BasicBlock
*Block
= unwrap(BB
);
2597 Function::iterator
I(Block
);
2598 if (I
== Block
->getParent()->begin())
2603 LLVMBasicBlockRef
LLVMCreateBasicBlockInContext(LLVMContextRef C
,
2605 return wrap(llvm::BasicBlock::Create(*unwrap(C
), Name
));
2608 LLVMBasicBlockRef
LLVMAppendBasicBlockInContext(LLVMContextRef C
,
2611 return wrap(BasicBlock::Create(*unwrap(C
), Name
, unwrap
<Function
>(FnRef
)));
2614 LLVMBasicBlockRef
LLVMAppendBasicBlock(LLVMValueRef FnRef
, const char *Name
) {
2615 return LLVMAppendBasicBlockInContext(LLVMGetGlobalContext(), FnRef
, Name
);
2618 LLVMBasicBlockRef
LLVMInsertBasicBlockInContext(LLVMContextRef C
,
2619 LLVMBasicBlockRef BBRef
,
2621 BasicBlock
*BB
= unwrap(BBRef
);
2622 return wrap(BasicBlock::Create(*unwrap(C
), Name
, BB
->getParent(), BB
));
2625 LLVMBasicBlockRef
LLVMInsertBasicBlock(LLVMBasicBlockRef BBRef
,
2627 return LLVMInsertBasicBlockInContext(LLVMGetGlobalContext(), BBRef
, Name
);
2630 void LLVMDeleteBasicBlock(LLVMBasicBlockRef BBRef
) {
2631 unwrap(BBRef
)->eraseFromParent();
2634 void LLVMRemoveBasicBlockFromParent(LLVMBasicBlockRef BBRef
) {
2635 unwrap(BBRef
)->removeFromParent();
2638 void LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB
, LLVMBasicBlockRef MovePos
) {
2639 unwrap(BB
)->moveBefore(unwrap(MovePos
));
2642 void LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB
, LLVMBasicBlockRef MovePos
) {
2643 unwrap(BB
)->moveAfter(unwrap(MovePos
));
2646 /*--.. Operations on instructions ..........................................--*/
2648 LLVMBasicBlockRef
LLVMGetInstructionParent(LLVMValueRef Inst
) {
2649 return wrap(unwrap
<Instruction
>(Inst
)->getParent());
2652 LLVMValueRef
LLVMGetFirstInstruction(LLVMBasicBlockRef BB
) {
2653 BasicBlock
*Block
= unwrap(BB
);
2654 BasicBlock::iterator I
= Block
->begin();
2655 if (I
== Block
->end())
2660 LLVMValueRef
LLVMGetLastInstruction(LLVMBasicBlockRef BB
) {
2661 BasicBlock
*Block
= unwrap(BB
);
2662 BasicBlock::iterator I
= Block
->end();
2663 if (I
== Block
->begin())
2668 LLVMValueRef
LLVMGetNextInstruction(LLVMValueRef Inst
) {
2669 Instruction
*Instr
= unwrap
<Instruction
>(Inst
);
2670 BasicBlock::iterator
I(Instr
);
2671 if (++I
== Instr
->getParent()->end())
2676 LLVMValueRef
LLVMGetPreviousInstruction(LLVMValueRef Inst
) {
2677 Instruction
*Instr
= unwrap
<Instruction
>(Inst
);
2678 BasicBlock::iterator
I(Instr
);
2679 if (I
== Instr
->getParent()->begin())
2684 void LLVMInstructionRemoveFromParent(LLVMValueRef Inst
) {
2685 unwrap
<Instruction
>(Inst
)->removeFromParent();
2688 void LLVMInstructionEraseFromParent(LLVMValueRef Inst
) {
2689 unwrap
<Instruction
>(Inst
)->eraseFromParent();
2692 LLVMIntPredicate
LLVMGetICmpPredicate(LLVMValueRef Inst
) {
2693 if (ICmpInst
*I
= dyn_cast
<ICmpInst
>(unwrap(Inst
)))
2694 return (LLVMIntPredicate
)I
->getPredicate();
2695 if (ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(unwrap(Inst
)))
2696 if (CE
->getOpcode() == Instruction::ICmp
)
2697 return (LLVMIntPredicate
)CE
->getPredicate();
2698 return (LLVMIntPredicate
)0;
2701 LLVMRealPredicate
LLVMGetFCmpPredicate(LLVMValueRef Inst
) {
2702 if (FCmpInst
*I
= dyn_cast
<FCmpInst
>(unwrap(Inst
)))
2703 return (LLVMRealPredicate
)I
->getPredicate();
2704 if (ConstantExpr
*CE
= dyn_cast
<ConstantExpr
>(unwrap(Inst
)))
2705 if (CE
->getOpcode() == Instruction::FCmp
)
2706 return (LLVMRealPredicate
)CE
->getPredicate();
2707 return (LLVMRealPredicate
)0;
2710 LLVMOpcode
LLVMGetInstructionOpcode(LLVMValueRef Inst
) {
2711 if (Instruction
*C
= dyn_cast
<Instruction
>(unwrap(Inst
)))
2712 return map_to_llvmopcode(C
->getOpcode());
2713 return (LLVMOpcode
)0;
2716 LLVMValueRef
LLVMInstructionClone(LLVMValueRef Inst
) {
2717 if (Instruction
*C
= dyn_cast
<Instruction
>(unwrap(Inst
)))
2718 return wrap(C
->clone());
2722 LLVMValueRef
LLVMIsATerminatorInst(LLVMValueRef Inst
) {
2723 Instruction
*I
= dyn_cast
<Instruction
>(unwrap(Inst
));
2724 return (I
&& I
->isTerminator()) ? wrap(I
) : nullptr;
2727 unsigned LLVMGetNumArgOperands(LLVMValueRef Instr
) {
2728 if (FuncletPadInst
*FPI
= dyn_cast
<FuncletPadInst
>(unwrap(Instr
))) {
2729 return FPI
->getNumArgOperands();
2731 return unwrap
<CallBase
>(Instr
)->getNumArgOperands();
2734 /*--.. Call and invoke instructions ........................................--*/
2736 unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr
) {
2737 return unwrap
<CallBase
>(Instr
)->getCallingConv();
2740 void LLVMSetInstructionCallConv(LLVMValueRef Instr
, unsigned CC
) {
2741 return unwrap
<CallBase
>(Instr
)->setCallingConv(
2742 static_cast<CallingConv::ID
>(CC
));
2745 void LLVMSetInstrParamAlignment(LLVMValueRef Instr
, unsigned index
,
2747 auto *Call
= unwrap
<CallBase
>(Instr
);
2748 Attribute AlignAttr
= Attribute::getWithAlignment(Call
->getContext(), align
);
2749 Call
->addAttribute(index
, AlignAttr
);
2752 void LLVMAddCallSiteAttribute(LLVMValueRef C
, LLVMAttributeIndex Idx
,
2753 LLVMAttributeRef A
) {
2754 unwrap
<CallBase
>(C
)->addAttribute(Idx
, unwrap(A
));
2757 unsigned LLVMGetCallSiteAttributeCount(LLVMValueRef C
,
2758 LLVMAttributeIndex Idx
) {
2759 auto *Call
= unwrap
<CallBase
>(C
);
2760 auto AS
= Call
->getAttributes().getAttributes(Idx
);
2761 return AS
.getNumAttributes();
2764 void LLVMGetCallSiteAttributes(LLVMValueRef C
, LLVMAttributeIndex Idx
,
2765 LLVMAttributeRef
*Attrs
) {
2766 auto *Call
= unwrap
<CallBase
>(C
);
2767 auto AS
= Call
->getAttributes().getAttributes(Idx
);
2772 LLVMAttributeRef
LLVMGetCallSiteEnumAttribute(LLVMValueRef C
,
2773 LLVMAttributeIndex Idx
,
2776 unwrap
<CallBase
>(C
)->getAttribute(Idx
, (Attribute::AttrKind
)KindID
));
2779 LLVMAttributeRef
LLVMGetCallSiteStringAttribute(LLVMValueRef C
,
2780 LLVMAttributeIndex Idx
,
2781 const char *K
, unsigned KLen
) {
2782 return wrap(unwrap
<CallBase
>(C
)->getAttribute(Idx
, StringRef(K
, KLen
)));
2785 void LLVMRemoveCallSiteEnumAttribute(LLVMValueRef C
, LLVMAttributeIndex Idx
,
2787 unwrap
<CallBase
>(C
)->removeAttribute(Idx
, (Attribute::AttrKind
)KindID
);
2790 void LLVMRemoveCallSiteStringAttribute(LLVMValueRef C
, LLVMAttributeIndex Idx
,
2791 const char *K
, unsigned KLen
) {
2792 unwrap
<CallBase
>(C
)->removeAttribute(Idx
, StringRef(K
, KLen
));
2795 LLVMValueRef
LLVMGetCalledValue(LLVMValueRef Instr
) {
2796 return wrap(unwrap
<CallBase
>(Instr
)->getCalledValue());
2799 LLVMTypeRef
LLVMGetCalledFunctionType(LLVMValueRef Instr
) {
2800 return wrap(unwrap
<CallBase
>(Instr
)->getFunctionType());
2803 /*--.. Operations on call instructions (only) ..............................--*/
2805 LLVMBool
LLVMIsTailCall(LLVMValueRef Call
) {
2806 return unwrap
<CallInst
>(Call
)->isTailCall();
2809 void LLVMSetTailCall(LLVMValueRef Call
, LLVMBool isTailCall
) {
2810 unwrap
<CallInst
>(Call
)->setTailCall(isTailCall
);
2813 /*--.. Operations on invoke instructions (only) ............................--*/
2815 LLVMBasicBlockRef
LLVMGetNormalDest(LLVMValueRef Invoke
) {
2816 return wrap(unwrap
<InvokeInst
>(Invoke
)->getNormalDest());
2819 LLVMBasicBlockRef
LLVMGetUnwindDest(LLVMValueRef Invoke
) {
2820 if (CleanupReturnInst
*CRI
= dyn_cast
<CleanupReturnInst
>(unwrap(Invoke
))) {
2821 return wrap(CRI
->getUnwindDest());
2822 } else if (CatchSwitchInst
*CSI
= dyn_cast
<CatchSwitchInst
>(unwrap(Invoke
))) {
2823 return wrap(CSI
->getUnwindDest());
2825 return wrap(unwrap
<InvokeInst
>(Invoke
)->getUnwindDest());
2828 void LLVMSetNormalDest(LLVMValueRef Invoke
, LLVMBasicBlockRef B
) {
2829 unwrap
<InvokeInst
>(Invoke
)->setNormalDest(unwrap(B
));
2832 void LLVMSetUnwindDest(LLVMValueRef Invoke
, LLVMBasicBlockRef B
) {
2833 if (CleanupReturnInst
*CRI
= dyn_cast
<CleanupReturnInst
>(unwrap(Invoke
))) {
2834 return CRI
->setUnwindDest(unwrap(B
));
2835 } else if (CatchSwitchInst
*CSI
= dyn_cast
<CatchSwitchInst
>(unwrap(Invoke
))) {
2836 return CSI
->setUnwindDest(unwrap(B
));
2838 unwrap
<InvokeInst
>(Invoke
)->setUnwindDest(unwrap(B
));
2841 /*--.. Operations on terminators ...........................................--*/
2843 unsigned LLVMGetNumSuccessors(LLVMValueRef Term
) {
2844 return unwrap
<Instruction
>(Term
)->getNumSuccessors();
2847 LLVMBasicBlockRef
LLVMGetSuccessor(LLVMValueRef Term
, unsigned i
) {
2848 return wrap(unwrap
<Instruction
>(Term
)->getSuccessor(i
));
2851 void LLVMSetSuccessor(LLVMValueRef Term
, unsigned i
, LLVMBasicBlockRef block
) {
2852 return unwrap
<Instruction
>(Term
)->setSuccessor(i
, unwrap(block
));
2855 /*--.. Operations on branch instructions (only) ............................--*/
2857 LLVMBool
LLVMIsConditional(LLVMValueRef Branch
) {
2858 return unwrap
<BranchInst
>(Branch
)->isConditional();
2861 LLVMValueRef
LLVMGetCondition(LLVMValueRef Branch
) {
2862 return wrap(unwrap
<BranchInst
>(Branch
)->getCondition());
2865 void LLVMSetCondition(LLVMValueRef Branch
, LLVMValueRef Cond
) {
2866 return unwrap
<BranchInst
>(Branch
)->setCondition(unwrap(Cond
));
2869 /*--.. Operations on switch instructions (only) ............................--*/
2871 LLVMBasicBlockRef
LLVMGetSwitchDefaultDest(LLVMValueRef Switch
) {
2872 return wrap(unwrap
<SwitchInst
>(Switch
)->getDefaultDest());
2875 /*--.. Operations on alloca instructions (only) ............................--*/
2877 LLVMTypeRef
LLVMGetAllocatedType(LLVMValueRef Alloca
) {
2878 return wrap(unwrap
<AllocaInst
>(Alloca
)->getAllocatedType());
2881 /*--.. Operations on gep instructions (only) ...............................--*/
2883 LLVMBool
LLVMIsInBounds(LLVMValueRef GEP
) {
2884 return unwrap
<GetElementPtrInst
>(GEP
)->isInBounds();
2887 void LLVMSetIsInBounds(LLVMValueRef GEP
, LLVMBool InBounds
) {
2888 return unwrap
<GetElementPtrInst
>(GEP
)->setIsInBounds(InBounds
);
2891 /*--.. Operations on phi nodes .............................................--*/
2893 void LLVMAddIncoming(LLVMValueRef PhiNode
, LLVMValueRef
*IncomingValues
,
2894 LLVMBasicBlockRef
*IncomingBlocks
, unsigned Count
) {
2895 PHINode
*PhiVal
= unwrap
<PHINode
>(PhiNode
);
2896 for (unsigned I
= 0; I
!= Count
; ++I
)
2897 PhiVal
->addIncoming(unwrap(IncomingValues
[I
]), unwrap(IncomingBlocks
[I
]));
2900 unsigned LLVMCountIncoming(LLVMValueRef PhiNode
) {
2901 return unwrap
<PHINode
>(PhiNode
)->getNumIncomingValues();
2904 LLVMValueRef
LLVMGetIncomingValue(LLVMValueRef PhiNode
, unsigned Index
) {
2905 return wrap(unwrap
<PHINode
>(PhiNode
)->getIncomingValue(Index
));
2908 LLVMBasicBlockRef
LLVMGetIncomingBlock(LLVMValueRef PhiNode
, unsigned Index
) {
2909 return wrap(unwrap
<PHINode
>(PhiNode
)->getIncomingBlock(Index
));
2912 /*--.. Operations on extractvalue and insertvalue nodes ....................--*/
2914 unsigned LLVMGetNumIndices(LLVMValueRef Inst
) {
2915 auto *I
= unwrap(Inst
);
2916 if (auto *GEP
= dyn_cast
<GetElementPtrInst
>(I
))
2917 return GEP
->getNumIndices();
2918 if (auto *EV
= dyn_cast
<ExtractValueInst
>(I
))
2919 return EV
->getNumIndices();
2920 if (auto *IV
= dyn_cast
<InsertValueInst
>(I
))
2921 return IV
->getNumIndices();
2922 if (auto *CE
= dyn_cast
<ConstantExpr
>(I
))
2923 return CE
->getIndices().size();
2925 "LLVMGetNumIndices applies only to extractvalue and insertvalue!");
2928 const unsigned *LLVMGetIndices(LLVMValueRef Inst
) {
2929 auto *I
= unwrap(Inst
);
2930 if (auto *EV
= dyn_cast
<ExtractValueInst
>(I
))
2931 return EV
->getIndices().data();
2932 if (auto *IV
= dyn_cast
<InsertValueInst
>(I
))
2933 return IV
->getIndices().data();
2934 if (auto *CE
= dyn_cast
<ConstantExpr
>(I
))
2935 return CE
->getIndices().data();
2937 "LLVMGetIndices applies only to extractvalue and insertvalue!");
2941 /*===-- Instruction builders ----------------------------------------------===*/
2943 LLVMBuilderRef
LLVMCreateBuilderInContext(LLVMContextRef C
) {
2944 return wrap(new IRBuilder
<>(*unwrap(C
)));
2947 LLVMBuilderRef
LLVMCreateBuilder(void) {
2948 return LLVMCreateBuilderInContext(LLVMGetGlobalContext());
2951 void LLVMPositionBuilder(LLVMBuilderRef Builder
, LLVMBasicBlockRef Block
,
2952 LLVMValueRef Instr
) {
2953 BasicBlock
*BB
= unwrap(Block
);
2954 auto I
= Instr
? unwrap
<Instruction
>(Instr
)->getIterator() : BB
->end();
2955 unwrap(Builder
)->SetInsertPoint(BB
, I
);
2958 void LLVMPositionBuilderBefore(LLVMBuilderRef Builder
, LLVMValueRef Instr
) {
2959 Instruction
*I
= unwrap
<Instruction
>(Instr
);
2960 unwrap(Builder
)->SetInsertPoint(I
->getParent(), I
->getIterator());
2963 void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder
, LLVMBasicBlockRef Block
) {
2964 BasicBlock
*BB
= unwrap(Block
);
2965 unwrap(Builder
)->SetInsertPoint(BB
);
2968 LLVMBasicBlockRef
LLVMGetInsertBlock(LLVMBuilderRef Builder
) {
2969 return wrap(unwrap(Builder
)->GetInsertBlock());
2972 void LLVMClearInsertionPosition(LLVMBuilderRef Builder
) {
2973 unwrap(Builder
)->ClearInsertionPoint();
2976 void LLVMInsertIntoBuilder(LLVMBuilderRef Builder
, LLVMValueRef Instr
) {
2977 unwrap(Builder
)->Insert(unwrap
<Instruction
>(Instr
));
2980 void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder
, LLVMValueRef Instr
,
2982 unwrap(Builder
)->Insert(unwrap
<Instruction
>(Instr
), Name
);
2985 void LLVMDisposeBuilder(LLVMBuilderRef Builder
) {
2986 delete unwrap(Builder
);
2989 /*--.. Metadata builders ...................................................--*/
2991 void LLVMSetCurrentDebugLocation(LLVMBuilderRef Builder
, LLVMValueRef L
) {
2993 L
? cast
<MDNode
>(unwrap
<MetadataAsValue
>(L
)->getMetadata()) : nullptr;
2994 unwrap(Builder
)->SetCurrentDebugLocation(DebugLoc(Loc
));
2997 LLVMValueRef
LLVMGetCurrentDebugLocation(LLVMBuilderRef Builder
) {
2998 LLVMContext
&Context
= unwrap(Builder
)->getContext();
2999 return wrap(MetadataAsValue::get(
3000 Context
, unwrap(Builder
)->getCurrentDebugLocation().getAsMDNode()));
3003 void LLVMSetInstDebugLocation(LLVMBuilderRef Builder
, LLVMValueRef Inst
) {
3004 unwrap(Builder
)->SetInstDebugLocation(unwrap
<Instruction
>(Inst
));
3008 /*--.. Instruction builders ................................................--*/
3010 LLVMValueRef
LLVMBuildRetVoid(LLVMBuilderRef B
) {
3011 return wrap(unwrap(B
)->CreateRetVoid());
3014 LLVMValueRef
LLVMBuildRet(LLVMBuilderRef B
, LLVMValueRef V
) {
3015 return wrap(unwrap(B
)->CreateRet(unwrap(V
)));
3018 LLVMValueRef
LLVMBuildAggregateRet(LLVMBuilderRef B
, LLVMValueRef
*RetVals
,
3020 return wrap(unwrap(B
)->CreateAggregateRet(unwrap(RetVals
), N
));
3023 LLVMValueRef
LLVMBuildBr(LLVMBuilderRef B
, LLVMBasicBlockRef Dest
) {
3024 return wrap(unwrap(B
)->CreateBr(unwrap(Dest
)));
3027 LLVMValueRef
LLVMBuildCondBr(LLVMBuilderRef B
, LLVMValueRef If
,
3028 LLVMBasicBlockRef Then
, LLVMBasicBlockRef Else
) {
3029 return wrap(unwrap(B
)->CreateCondBr(unwrap(If
), unwrap(Then
), unwrap(Else
)));
3032 LLVMValueRef
LLVMBuildSwitch(LLVMBuilderRef B
, LLVMValueRef V
,
3033 LLVMBasicBlockRef Else
, unsigned NumCases
) {
3034 return wrap(unwrap(B
)->CreateSwitch(unwrap(V
), unwrap(Else
), NumCases
));
3037 LLVMValueRef
LLVMBuildIndirectBr(LLVMBuilderRef B
, LLVMValueRef Addr
,
3038 unsigned NumDests
) {
3039 return wrap(unwrap(B
)->CreateIndirectBr(unwrap(Addr
), NumDests
));
3042 LLVMValueRef
LLVMBuildInvoke(LLVMBuilderRef B
, LLVMValueRef Fn
,
3043 LLVMValueRef
*Args
, unsigned NumArgs
,
3044 LLVMBasicBlockRef Then
, LLVMBasicBlockRef Catch
,
3046 Value
*V
= unwrap(Fn
);
3048 cast
<FunctionType
>(cast
<PointerType
>(V
->getType())->getElementType());
3051 unwrap(B
)->CreateInvoke(FnT
, unwrap(Fn
), unwrap(Then
), unwrap(Catch
),
3052 makeArrayRef(unwrap(Args
), NumArgs
), Name
));
3055 LLVMValueRef
LLVMBuildInvoke2(LLVMBuilderRef B
, LLVMTypeRef Ty
, LLVMValueRef Fn
,
3056 LLVMValueRef
*Args
, unsigned NumArgs
,
3057 LLVMBasicBlockRef Then
, LLVMBasicBlockRef Catch
,
3059 return wrap(unwrap(B
)->CreateInvoke(
3060 unwrap
<FunctionType
>(Ty
), unwrap(Fn
), unwrap(Then
), unwrap(Catch
),
3061 makeArrayRef(unwrap(Args
), NumArgs
), Name
));
3064 LLVMValueRef
LLVMBuildLandingPad(LLVMBuilderRef B
, LLVMTypeRef Ty
,
3065 LLVMValueRef PersFn
, unsigned NumClauses
,
3067 // The personality used to live on the landingpad instruction, but now it
3068 // lives on the parent function. For compatibility, take the provided
3069 // personality and put it on the parent function.
3071 unwrap(B
)->GetInsertBlock()->getParent()->setPersonalityFn(
3072 cast
<Function
>(unwrap(PersFn
)));
3073 return wrap(unwrap(B
)->CreateLandingPad(unwrap(Ty
), NumClauses
, Name
));
3076 LLVMValueRef
LLVMBuildCatchPad(LLVMBuilderRef B
, LLVMValueRef ParentPad
,
3077 LLVMValueRef
*Args
, unsigned NumArgs
,
3079 return wrap(unwrap(B
)->CreateCatchPad(unwrap(ParentPad
),
3080 makeArrayRef(unwrap(Args
), NumArgs
),
3084 LLVMValueRef
LLVMBuildCleanupPad(LLVMBuilderRef B
, LLVMValueRef ParentPad
,
3085 LLVMValueRef
*Args
, unsigned NumArgs
,
3087 if (ParentPad
== nullptr) {
3088 Type
*Ty
= Type::getTokenTy(unwrap(B
)->getContext());
3089 ParentPad
= wrap(Constant::getNullValue(Ty
));
3091 return wrap(unwrap(B
)->CreateCleanupPad(unwrap(ParentPad
),
3092 makeArrayRef(unwrap(Args
), NumArgs
),
3096 LLVMValueRef
LLVMBuildResume(LLVMBuilderRef B
, LLVMValueRef Exn
) {
3097 return wrap(unwrap(B
)->CreateResume(unwrap(Exn
)));
3100 LLVMValueRef
LLVMBuildCatchSwitch(LLVMBuilderRef B
, LLVMValueRef ParentPad
,
3101 LLVMBasicBlockRef UnwindBB
,
3102 unsigned NumHandlers
, const char *Name
) {
3103 if (ParentPad
== nullptr) {
3104 Type
*Ty
= Type::getTokenTy(unwrap(B
)->getContext());
3105 ParentPad
= wrap(Constant::getNullValue(Ty
));
3107 return wrap(unwrap(B
)->CreateCatchSwitch(unwrap(ParentPad
), unwrap(UnwindBB
),
3108 NumHandlers
, Name
));
3111 LLVMValueRef
LLVMBuildCatchRet(LLVMBuilderRef B
, LLVMValueRef CatchPad
,
3112 LLVMBasicBlockRef BB
) {
3113 return wrap(unwrap(B
)->CreateCatchRet(unwrap
<CatchPadInst
>(CatchPad
),
3117 LLVMValueRef
LLVMBuildCleanupRet(LLVMBuilderRef B
, LLVMValueRef CatchPad
,
3118 LLVMBasicBlockRef BB
) {
3119 return wrap(unwrap(B
)->CreateCleanupRet(unwrap
<CleanupPadInst
>(CatchPad
),
3123 LLVMValueRef
LLVMBuildUnreachable(LLVMBuilderRef B
) {
3124 return wrap(unwrap(B
)->CreateUnreachable());
3127 void LLVMAddCase(LLVMValueRef Switch
, LLVMValueRef OnVal
,
3128 LLVMBasicBlockRef Dest
) {
3129 unwrap
<SwitchInst
>(Switch
)->addCase(unwrap
<ConstantInt
>(OnVal
), unwrap(Dest
));
3132 void LLVMAddDestination(LLVMValueRef IndirectBr
, LLVMBasicBlockRef Dest
) {
3133 unwrap
<IndirectBrInst
>(IndirectBr
)->addDestination(unwrap(Dest
));
3136 unsigned LLVMGetNumClauses(LLVMValueRef LandingPad
) {
3137 return unwrap
<LandingPadInst
>(LandingPad
)->getNumClauses();
3140 LLVMValueRef
LLVMGetClause(LLVMValueRef LandingPad
, unsigned Idx
) {
3141 return wrap(unwrap
<LandingPadInst
>(LandingPad
)->getClause(Idx
));
3144 void LLVMAddClause(LLVMValueRef LandingPad
, LLVMValueRef ClauseVal
) {
3145 unwrap
<LandingPadInst
>(LandingPad
)->
3146 addClause(cast
<Constant
>(unwrap(ClauseVal
)));
3149 LLVMBool
LLVMIsCleanup(LLVMValueRef LandingPad
) {
3150 return unwrap
<LandingPadInst
>(LandingPad
)->isCleanup();
3153 void LLVMSetCleanup(LLVMValueRef LandingPad
, LLVMBool Val
) {
3154 unwrap
<LandingPadInst
>(LandingPad
)->setCleanup(Val
);
3157 void LLVMAddHandler(LLVMValueRef CatchSwitch
, LLVMBasicBlockRef Dest
) {
3158 unwrap
<CatchSwitchInst
>(CatchSwitch
)->addHandler(unwrap(Dest
));
3161 unsigned LLVMGetNumHandlers(LLVMValueRef CatchSwitch
) {
3162 return unwrap
<CatchSwitchInst
>(CatchSwitch
)->getNumHandlers();
3165 void LLVMGetHandlers(LLVMValueRef CatchSwitch
, LLVMBasicBlockRef
*Handlers
) {
3166 CatchSwitchInst
*CSI
= unwrap
<CatchSwitchInst
>(CatchSwitch
);
3167 for (CatchSwitchInst::handler_iterator I
= CSI
->handler_begin(),
3168 E
= CSI
->handler_end(); I
!= E
; ++I
)
3169 *Handlers
++ = wrap(*I
);
3172 LLVMValueRef
LLVMGetParentCatchSwitch(LLVMValueRef CatchPad
) {
3173 return wrap(unwrap
<CatchPadInst
>(CatchPad
)->getCatchSwitch());
3176 void LLVMSetParentCatchSwitch(LLVMValueRef CatchPad
, LLVMValueRef CatchSwitch
) {
3177 unwrap
<CatchPadInst
>(CatchPad
)
3178 ->setCatchSwitch(unwrap
<CatchSwitchInst
>(CatchSwitch
));
3181 /*--.. Funclets ...........................................................--*/
3183 LLVMValueRef
LLVMGetArgOperand(LLVMValueRef Funclet
, unsigned i
) {
3184 return wrap(unwrap
<FuncletPadInst
>(Funclet
)->getArgOperand(i
));
3187 void LLVMSetArgOperand(LLVMValueRef Funclet
, unsigned i
, LLVMValueRef value
) {
3188 unwrap
<FuncletPadInst
>(Funclet
)->setArgOperand(i
, unwrap(value
));
3191 /*--.. Arithmetic ..........................................................--*/
3193 LLVMValueRef
LLVMBuildAdd(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3195 return wrap(unwrap(B
)->CreateAdd(unwrap(LHS
), unwrap(RHS
), Name
));
3198 LLVMValueRef
LLVMBuildNSWAdd(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3200 return wrap(unwrap(B
)->CreateNSWAdd(unwrap(LHS
), unwrap(RHS
), Name
));
3203 LLVMValueRef
LLVMBuildNUWAdd(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3205 return wrap(unwrap(B
)->CreateNUWAdd(unwrap(LHS
), unwrap(RHS
), Name
));
3208 LLVMValueRef
LLVMBuildFAdd(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3210 return wrap(unwrap(B
)->CreateFAdd(unwrap(LHS
), unwrap(RHS
), Name
));
3213 LLVMValueRef
LLVMBuildSub(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3215 return wrap(unwrap(B
)->CreateSub(unwrap(LHS
), unwrap(RHS
), Name
));
3218 LLVMValueRef
LLVMBuildNSWSub(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3220 return wrap(unwrap(B
)->CreateNSWSub(unwrap(LHS
), unwrap(RHS
), Name
));
3223 LLVMValueRef
LLVMBuildNUWSub(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3225 return wrap(unwrap(B
)->CreateNUWSub(unwrap(LHS
), unwrap(RHS
), Name
));
3228 LLVMValueRef
LLVMBuildFSub(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3230 return wrap(unwrap(B
)->CreateFSub(unwrap(LHS
), unwrap(RHS
), Name
));
3233 LLVMValueRef
LLVMBuildMul(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3235 return wrap(unwrap(B
)->CreateMul(unwrap(LHS
), unwrap(RHS
), Name
));
3238 LLVMValueRef
LLVMBuildNSWMul(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3240 return wrap(unwrap(B
)->CreateNSWMul(unwrap(LHS
), unwrap(RHS
), Name
));
3243 LLVMValueRef
LLVMBuildNUWMul(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3245 return wrap(unwrap(B
)->CreateNUWMul(unwrap(LHS
), unwrap(RHS
), Name
));
3248 LLVMValueRef
LLVMBuildFMul(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3250 return wrap(unwrap(B
)->CreateFMul(unwrap(LHS
), unwrap(RHS
), Name
));
3253 LLVMValueRef
LLVMBuildUDiv(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3255 return wrap(unwrap(B
)->CreateUDiv(unwrap(LHS
), unwrap(RHS
), Name
));
3258 LLVMValueRef
LLVMBuildExactUDiv(LLVMBuilderRef B
, LLVMValueRef LHS
,
3259 LLVMValueRef RHS
, const char *Name
) {
3260 return wrap(unwrap(B
)->CreateExactUDiv(unwrap(LHS
), unwrap(RHS
), Name
));
3263 LLVMValueRef
LLVMBuildSDiv(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3265 return wrap(unwrap(B
)->CreateSDiv(unwrap(LHS
), unwrap(RHS
), Name
));
3268 LLVMValueRef
LLVMBuildExactSDiv(LLVMBuilderRef B
, LLVMValueRef LHS
,
3269 LLVMValueRef RHS
, const char *Name
) {
3270 return wrap(unwrap(B
)->CreateExactSDiv(unwrap(LHS
), unwrap(RHS
), Name
));
3273 LLVMValueRef
LLVMBuildFDiv(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3275 return wrap(unwrap(B
)->CreateFDiv(unwrap(LHS
), unwrap(RHS
), Name
));
3278 LLVMValueRef
LLVMBuildURem(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3280 return wrap(unwrap(B
)->CreateURem(unwrap(LHS
), unwrap(RHS
), Name
));
3283 LLVMValueRef
LLVMBuildSRem(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3285 return wrap(unwrap(B
)->CreateSRem(unwrap(LHS
), unwrap(RHS
), Name
));
3288 LLVMValueRef
LLVMBuildFRem(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3290 return wrap(unwrap(B
)->CreateFRem(unwrap(LHS
), unwrap(RHS
), Name
));
3293 LLVMValueRef
LLVMBuildShl(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3295 return wrap(unwrap(B
)->CreateShl(unwrap(LHS
), unwrap(RHS
), Name
));
3298 LLVMValueRef
LLVMBuildLShr(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3300 return wrap(unwrap(B
)->CreateLShr(unwrap(LHS
), unwrap(RHS
), Name
));
3303 LLVMValueRef
LLVMBuildAShr(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3305 return wrap(unwrap(B
)->CreateAShr(unwrap(LHS
), unwrap(RHS
), Name
));
3308 LLVMValueRef
LLVMBuildAnd(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3310 return wrap(unwrap(B
)->CreateAnd(unwrap(LHS
), unwrap(RHS
), Name
));
3313 LLVMValueRef
LLVMBuildOr(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3315 return wrap(unwrap(B
)->CreateOr(unwrap(LHS
), unwrap(RHS
), Name
));
3318 LLVMValueRef
LLVMBuildXor(LLVMBuilderRef B
, LLVMValueRef LHS
, LLVMValueRef RHS
,
3320 return wrap(unwrap(B
)->CreateXor(unwrap(LHS
), unwrap(RHS
), Name
));
3323 LLVMValueRef
LLVMBuildBinOp(LLVMBuilderRef B
, LLVMOpcode Op
,
3324 LLVMValueRef LHS
, LLVMValueRef RHS
,
3326 return wrap(unwrap(B
)->CreateBinOp(Instruction::BinaryOps(map_from_llvmopcode(Op
)), unwrap(LHS
),
3327 unwrap(RHS
), Name
));
3330 LLVMValueRef
LLVMBuildNeg(LLVMBuilderRef B
, LLVMValueRef V
, const char *Name
) {
3331 return wrap(unwrap(B
)->CreateNeg(unwrap(V
), Name
));
3334 LLVMValueRef
LLVMBuildNSWNeg(LLVMBuilderRef B
, LLVMValueRef V
,
3336 return wrap(unwrap(B
)->CreateNSWNeg(unwrap(V
), Name
));
3339 LLVMValueRef
LLVMBuildNUWNeg(LLVMBuilderRef B
, LLVMValueRef V
,
3341 return wrap(unwrap(B
)->CreateNUWNeg(unwrap(V
), Name
));
3344 LLVMValueRef
LLVMBuildFNeg(LLVMBuilderRef B
, LLVMValueRef V
, const char *Name
) {
3345 return wrap(unwrap(B
)->CreateFNeg(unwrap(V
), Name
));
3348 LLVMValueRef
LLVMBuildNot(LLVMBuilderRef B
, LLVMValueRef V
, const char *Name
) {
3349 return wrap(unwrap(B
)->CreateNot(unwrap(V
), Name
));
3352 /*--.. Memory ..............................................................--*/
3354 LLVMValueRef
LLVMBuildMalloc(LLVMBuilderRef B
, LLVMTypeRef Ty
,
3356 Type
* ITy
= Type::getInt32Ty(unwrap(B
)->GetInsertBlock()->getContext());
3357 Constant
* AllocSize
= ConstantExpr::getSizeOf(unwrap(Ty
));
3358 AllocSize
= ConstantExpr::getTruncOrBitCast(AllocSize
, ITy
);
3359 Instruction
* Malloc
= CallInst::CreateMalloc(unwrap(B
)->GetInsertBlock(),
3360 ITy
, unwrap(Ty
), AllocSize
,
3361 nullptr, nullptr, "");
3362 return wrap(unwrap(B
)->Insert(Malloc
, Twine(Name
)));
3365 LLVMValueRef
LLVMBuildArrayMalloc(LLVMBuilderRef B
, LLVMTypeRef Ty
,
3366 LLVMValueRef Val
, const char *Name
) {
3367 Type
* ITy
= Type::getInt32Ty(unwrap(B
)->GetInsertBlock()->getContext());
3368 Constant
* AllocSize
= ConstantExpr::getSizeOf(unwrap(Ty
));
3369 AllocSize
= ConstantExpr::getTruncOrBitCast(AllocSize
, ITy
);
3370 Instruction
* Malloc
= CallInst::CreateMalloc(unwrap(B
)->GetInsertBlock(),
3371 ITy
, unwrap(Ty
), AllocSize
,
3372 unwrap(Val
), nullptr, "");
3373 return wrap(unwrap(B
)->Insert(Malloc
, Twine(Name
)));
3376 LLVMValueRef
LLVMBuildMemSet(LLVMBuilderRef B
, LLVMValueRef Ptr
,
3377 LLVMValueRef Val
, LLVMValueRef Len
,
3379 return wrap(unwrap(B
)->CreateMemSet(unwrap(Ptr
), unwrap(Val
), unwrap(Len
), Align
));
3382 LLVMValueRef
LLVMBuildMemCpy(LLVMBuilderRef B
,
3383 LLVMValueRef Dst
, unsigned DstAlign
,
3384 LLVMValueRef Src
, unsigned SrcAlign
,
3385 LLVMValueRef Size
) {
3386 return wrap(unwrap(B
)->CreateMemCpy(unwrap(Dst
), DstAlign
,
3387 unwrap(Src
), SrcAlign
,
3391 LLVMValueRef
LLVMBuildMemMove(LLVMBuilderRef B
,
3392 LLVMValueRef Dst
, unsigned DstAlign
,
3393 LLVMValueRef Src
, unsigned SrcAlign
,
3394 LLVMValueRef Size
) {
3395 return wrap(unwrap(B
)->CreateMemMove(unwrap(Dst
), DstAlign
,
3396 unwrap(Src
), SrcAlign
,
3400 LLVMValueRef
LLVMBuildAlloca(LLVMBuilderRef B
, LLVMTypeRef Ty
,
3402 return wrap(unwrap(B
)->CreateAlloca(unwrap(Ty
), nullptr, Name
));
3405 LLVMValueRef
LLVMBuildArrayAlloca(LLVMBuilderRef B
, LLVMTypeRef Ty
,
3406 LLVMValueRef Val
, const char *Name
) {
3407 return wrap(unwrap(B
)->CreateAlloca(unwrap(Ty
), unwrap(Val
), Name
));
3410 LLVMValueRef
LLVMBuildFree(LLVMBuilderRef B
, LLVMValueRef PointerVal
) {
3411 return wrap(unwrap(B
)->Insert(
3412 CallInst::CreateFree(unwrap(PointerVal
), unwrap(B
)->GetInsertBlock())));
3415 LLVMValueRef
LLVMBuildLoad(LLVMBuilderRef B
, LLVMValueRef PointerVal
,
3417 Value
*V
= unwrap(PointerVal
);
3418 PointerType
*Ty
= cast
<PointerType
>(V
->getType());
3420 return wrap(unwrap(B
)->CreateLoad(Ty
->getElementType(), V
, Name
));
3423 LLVMValueRef
LLVMBuildLoad2(LLVMBuilderRef B
, LLVMTypeRef Ty
,
3424 LLVMValueRef PointerVal
, const char *Name
) {
3425 return wrap(unwrap(B
)->CreateLoad(unwrap(Ty
), unwrap(PointerVal
), Name
));
3428 LLVMValueRef
LLVMBuildStore(LLVMBuilderRef B
, LLVMValueRef Val
,
3429 LLVMValueRef PointerVal
) {
3430 return wrap(unwrap(B
)->CreateStore(unwrap(Val
), unwrap(PointerVal
)));
3433 static AtomicOrdering
mapFromLLVMOrdering(LLVMAtomicOrdering Ordering
) {
3435 case LLVMAtomicOrderingNotAtomic
: return AtomicOrdering::NotAtomic
;
3436 case LLVMAtomicOrderingUnordered
: return AtomicOrdering::Unordered
;
3437 case LLVMAtomicOrderingMonotonic
: return AtomicOrdering::Monotonic
;
3438 case LLVMAtomicOrderingAcquire
: return AtomicOrdering::Acquire
;
3439 case LLVMAtomicOrderingRelease
: return AtomicOrdering::Release
;
3440 case LLVMAtomicOrderingAcquireRelease
:
3441 return AtomicOrdering::AcquireRelease
;
3442 case LLVMAtomicOrderingSequentiallyConsistent
:
3443 return AtomicOrdering::SequentiallyConsistent
;
3446 llvm_unreachable("Invalid LLVMAtomicOrdering value!");
3449 static LLVMAtomicOrdering
mapToLLVMOrdering(AtomicOrdering Ordering
) {
3451 case AtomicOrdering::NotAtomic
: return LLVMAtomicOrderingNotAtomic
;
3452 case AtomicOrdering::Unordered
: return LLVMAtomicOrderingUnordered
;
3453 case AtomicOrdering::Monotonic
: return LLVMAtomicOrderingMonotonic
;
3454 case AtomicOrdering::Acquire
: return LLVMAtomicOrderingAcquire
;
3455 case AtomicOrdering::Release
: return LLVMAtomicOrderingRelease
;
3456 case AtomicOrdering::AcquireRelease
:
3457 return LLVMAtomicOrderingAcquireRelease
;
3458 case AtomicOrdering::SequentiallyConsistent
:
3459 return LLVMAtomicOrderingSequentiallyConsistent
;
3462 llvm_unreachable("Invalid AtomicOrdering value!");
3465 // TODO: Should this and other atomic instructions support building with
3467 LLVMValueRef
LLVMBuildFence(LLVMBuilderRef B
, LLVMAtomicOrdering Ordering
,
3468 LLVMBool isSingleThread
, const char *Name
) {
3470 unwrap(B
)->CreateFence(mapFromLLVMOrdering(Ordering
),
3471 isSingleThread
? SyncScope::SingleThread
3472 : SyncScope::System
,
3476 LLVMValueRef
LLVMBuildGEP(LLVMBuilderRef B
, LLVMValueRef Pointer
,
3477 LLVMValueRef
*Indices
, unsigned NumIndices
,
3479 ArrayRef
<Value
*> IdxList(unwrap(Indices
), NumIndices
);
3480 Value
*Val
= unwrap(Pointer
);
3482 cast
<PointerType
>(Val
->getType()->getScalarType())->getElementType();
3483 return wrap(unwrap(B
)->CreateGEP(Ty
, Val
, IdxList
, Name
));
3486 LLVMValueRef
LLVMBuildGEP2(LLVMBuilderRef B
, LLVMTypeRef Ty
,
3487 LLVMValueRef Pointer
, LLVMValueRef
*Indices
,
3488 unsigned NumIndices
, const char *Name
) {
3489 ArrayRef
<Value
*> IdxList(unwrap(Indices
), NumIndices
);
3490 return wrap(unwrap(B
)->CreateGEP(unwrap(Ty
), unwrap(Pointer
), IdxList
, Name
));
3493 LLVMValueRef
LLVMBuildInBoundsGEP(LLVMBuilderRef B
, LLVMValueRef Pointer
,
3494 LLVMValueRef
*Indices
, unsigned NumIndices
,
3496 ArrayRef
<Value
*> IdxList(unwrap(Indices
), NumIndices
);
3497 Value
*Val
= unwrap(Pointer
);
3499 cast
<PointerType
>(Val
->getType()->getScalarType())->getElementType();
3500 return wrap(unwrap(B
)->CreateInBoundsGEP(Ty
, Val
, IdxList
, Name
));
3503 LLVMValueRef
LLVMBuildInBoundsGEP2(LLVMBuilderRef B
, LLVMTypeRef Ty
,
3504 LLVMValueRef Pointer
, LLVMValueRef
*Indices
,
3505 unsigned NumIndices
, const char *Name
) {
3506 ArrayRef
<Value
*> IdxList(unwrap(Indices
), NumIndices
);
3508 unwrap(B
)->CreateInBoundsGEP(unwrap(Ty
), unwrap(Pointer
), IdxList
, Name
));
3511 LLVMValueRef
LLVMBuildStructGEP(LLVMBuilderRef B
, LLVMValueRef Pointer
,
3512 unsigned Idx
, const char *Name
) {
3513 Value
*Val
= unwrap(Pointer
);
3515 cast
<PointerType
>(Val
->getType()->getScalarType())->getElementType();
3516 return wrap(unwrap(B
)->CreateStructGEP(Ty
, Val
, Idx
, Name
));
3519 LLVMValueRef
LLVMBuildStructGEP2(LLVMBuilderRef B
, LLVMTypeRef Ty
,
3520 LLVMValueRef Pointer
, unsigned Idx
,
3523 unwrap(B
)->CreateStructGEP(unwrap(Ty
), unwrap(Pointer
), Idx
, Name
));
3526 LLVMValueRef
LLVMBuildGlobalString(LLVMBuilderRef B
, const char *Str
,
3528 return wrap(unwrap(B
)->CreateGlobalString(Str
, Name
));
3531 LLVMValueRef
LLVMBuildGlobalStringPtr(LLVMBuilderRef B
, const char *Str
,
3533 return wrap(unwrap(B
)->CreateGlobalStringPtr(Str
, Name
));
3536 LLVMBool
LLVMGetVolatile(LLVMValueRef MemAccessInst
) {
3537 Value
*P
= unwrap
<Value
>(MemAccessInst
);
3538 if (LoadInst
*LI
= dyn_cast
<LoadInst
>(P
))
3539 return LI
->isVolatile();
3540 return cast
<StoreInst
>(P
)->isVolatile();
3543 void LLVMSetVolatile(LLVMValueRef MemAccessInst
, LLVMBool isVolatile
) {
3544 Value
*P
= unwrap
<Value
>(MemAccessInst
);
3545 if (LoadInst
*LI
= dyn_cast
<LoadInst
>(P
))
3546 return LI
->setVolatile(isVolatile
);
3547 return cast
<StoreInst
>(P
)->setVolatile(isVolatile
);
3550 LLVMAtomicOrdering
LLVMGetOrdering(LLVMValueRef MemAccessInst
) {
3551 Value
*P
= unwrap
<Value
>(MemAccessInst
);
3553 if (LoadInst
*LI
= dyn_cast
<LoadInst
>(P
))
3554 O
= LI
->getOrdering();
3556 O
= cast
<StoreInst
>(P
)->getOrdering();
3557 return mapToLLVMOrdering(O
);
3560 void LLVMSetOrdering(LLVMValueRef MemAccessInst
, LLVMAtomicOrdering Ordering
) {
3561 Value
*P
= unwrap
<Value
>(MemAccessInst
);
3562 AtomicOrdering O
= mapFromLLVMOrdering(Ordering
);
3564 if (LoadInst
*LI
= dyn_cast
<LoadInst
>(P
))
3565 return LI
->setOrdering(O
);
3566 return cast
<StoreInst
>(P
)->setOrdering(O
);
3569 /*--.. Casts ...............................................................--*/
3571 LLVMValueRef
LLVMBuildTrunc(LLVMBuilderRef B
, LLVMValueRef Val
,
3572 LLVMTypeRef DestTy
, const char *Name
) {
3573 return wrap(unwrap(B
)->CreateTrunc(unwrap(Val
), unwrap(DestTy
), Name
));
3576 LLVMValueRef
LLVMBuildZExt(LLVMBuilderRef B
, LLVMValueRef Val
,
3577 LLVMTypeRef DestTy
, const char *Name
) {
3578 return wrap(unwrap(B
)->CreateZExt(unwrap(Val
), unwrap(DestTy
), Name
));
3581 LLVMValueRef
LLVMBuildSExt(LLVMBuilderRef B
, LLVMValueRef Val
,
3582 LLVMTypeRef DestTy
, const char *Name
) {
3583 return wrap(unwrap(B
)->CreateSExt(unwrap(Val
), unwrap(DestTy
), Name
));
3586 LLVMValueRef
LLVMBuildFPToUI(LLVMBuilderRef B
, LLVMValueRef Val
,
3587 LLVMTypeRef DestTy
, const char *Name
) {
3588 return wrap(unwrap(B
)->CreateFPToUI(unwrap(Val
), unwrap(DestTy
), Name
));
3591 LLVMValueRef
LLVMBuildFPToSI(LLVMBuilderRef B
, LLVMValueRef Val
,
3592 LLVMTypeRef DestTy
, const char *Name
) {
3593 return wrap(unwrap(B
)->CreateFPToSI(unwrap(Val
), unwrap(DestTy
), Name
));
3596 LLVMValueRef
LLVMBuildUIToFP(LLVMBuilderRef B
, LLVMValueRef Val
,
3597 LLVMTypeRef DestTy
, const char *Name
) {
3598 return wrap(unwrap(B
)->CreateUIToFP(unwrap(Val
), unwrap(DestTy
), Name
));
3601 LLVMValueRef
LLVMBuildSIToFP(LLVMBuilderRef B
, LLVMValueRef Val
,
3602 LLVMTypeRef DestTy
, const char *Name
) {
3603 return wrap(unwrap(B
)->CreateSIToFP(unwrap(Val
), unwrap(DestTy
), Name
));
3606 LLVMValueRef
LLVMBuildFPTrunc(LLVMBuilderRef B
, LLVMValueRef Val
,
3607 LLVMTypeRef DestTy
, const char *Name
) {
3608 return wrap(unwrap(B
)->CreateFPTrunc(unwrap(Val
), unwrap(DestTy
), Name
));
3611 LLVMValueRef
LLVMBuildFPExt(LLVMBuilderRef B
, LLVMValueRef Val
,
3612 LLVMTypeRef DestTy
, const char *Name
) {
3613 return wrap(unwrap(B
)->CreateFPExt(unwrap(Val
), unwrap(DestTy
), Name
));
3616 LLVMValueRef
LLVMBuildPtrToInt(LLVMBuilderRef B
, LLVMValueRef Val
,
3617 LLVMTypeRef DestTy
, const char *Name
) {
3618 return wrap(unwrap(B
)->CreatePtrToInt(unwrap(Val
), unwrap(DestTy
), Name
));
3621 LLVMValueRef
LLVMBuildIntToPtr(LLVMBuilderRef B
, LLVMValueRef Val
,
3622 LLVMTypeRef DestTy
, const char *Name
) {
3623 return wrap(unwrap(B
)->CreateIntToPtr(unwrap(Val
), unwrap(DestTy
), Name
));
3626 LLVMValueRef
LLVMBuildBitCast(LLVMBuilderRef B
, LLVMValueRef Val
,
3627 LLVMTypeRef DestTy
, const char *Name
) {
3628 return wrap(unwrap(B
)->CreateBitCast(unwrap(Val
), unwrap(DestTy
), Name
));
3631 LLVMValueRef
LLVMBuildAddrSpaceCast(LLVMBuilderRef B
, LLVMValueRef Val
,
3632 LLVMTypeRef DestTy
, const char *Name
) {
3633 return wrap(unwrap(B
)->CreateAddrSpaceCast(unwrap(Val
), unwrap(DestTy
), Name
));
3636 LLVMValueRef
LLVMBuildZExtOrBitCast(LLVMBuilderRef B
, LLVMValueRef Val
,
3637 LLVMTypeRef DestTy
, const char *Name
) {
3638 return wrap(unwrap(B
)->CreateZExtOrBitCast(unwrap(Val
), unwrap(DestTy
),
3642 LLVMValueRef
LLVMBuildSExtOrBitCast(LLVMBuilderRef B
, LLVMValueRef Val
,
3643 LLVMTypeRef DestTy
, const char *Name
) {
3644 return wrap(unwrap(B
)->CreateSExtOrBitCast(unwrap(Val
), unwrap(DestTy
),
3648 LLVMValueRef
LLVMBuildTruncOrBitCast(LLVMBuilderRef B
, LLVMValueRef Val
,
3649 LLVMTypeRef DestTy
, const char *Name
) {
3650 return wrap(unwrap(B
)->CreateTruncOrBitCast(unwrap(Val
), unwrap(DestTy
),
3654 LLVMValueRef
LLVMBuildCast(LLVMBuilderRef B
, LLVMOpcode Op
, LLVMValueRef Val
,
3655 LLVMTypeRef DestTy
, const char *Name
) {
3656 return wrap(unwrap(B
)->CreateCast(Instruction::CastOps(map_from_llvmopcode(Op
)), unwrap(Val
),
3657 unwrap(DestTy
), Name
));
3660 LLVMValueRef
LLVMBuildPointerCast(LLVMBuilderRef B
, LLVMValueRef Val
,
3661 LLVMTypeRef DestTy
, const char *Name
) {
3662 return wrap(unwrap(B
)->CreatePointerCast(unwrap(Val
), unwrap(DestTy
), Name
));
3665 LLVMValueRef
LLVMBuildIntCast2(LLVMBuilderRef B
, LLVMValueRef Val
,
3666 LLVMTypeRef DestTy
, LLVMBool IsSigned
,
3669 unwrap(B
)->CreateIntCast(unwrap(Val
), unwrap(DestTy
), IsSigned
, Name
));
3672 LLVMValueRef
LLVMBuildIntCast(LLVMBuilderRef B
, LLVMValueRef Val
,
3673 LLVMTypeRef DestTy
, const char *Name
) {
3674 return wrap(unwrap(B
)->CreateIntCast(unwrap(Val
), unwrap(DestTy
),
3675 /*isSigned*/true, Name
));
3678 LLVMValueRef
LLVMBuildFPCast(LLVMBuilderRef B
, LLVMValueRef Val
,
3679 LLVMTypeRef DestTy
, const char *Name
) {
3680 return wrap(unwrap(B
)->CreateFPCast(unwrap(Val
), unwrap(DestTy
), Name
));
3683 /*--.. Comparisons .........................................................--*/
3685 LLVMValueRef
LLVMBuildICmp(LLVMBuilderRef B
, LLVMIntPredicate Op
,
3686 LLVMValueRef LHS
, LLVMValueRef RHS
,
3688 return wrap(unwrap(B
)->CreateICmp(static_cast<ICmpInst::Predicate
>(Op
),
3689 unwrap(LHS
), unwrap(RHS
), Name
));
3692 LLVMValueRef
LLVMBuildFCmp(LLVMBuilderRef B
, LLVMRealPredicate Op
,
3693 LLVMValueRef LHS
, LLVMValueRef RHS
,
3695 return wrap(unwrap(B
)->CreateFCmp(static_cast<FCmpInst::Predicate
>(Op
),
3696 unwrap(LHS
), unwrap(RHS
), Name
));
3699 /*--.. Miscellaneous instructions ..........................................--*/
3701 LLVMValueRef
LLVMBuildPhi(LLVMBuilderRef B
, LLVMTypeRef Ty
, const char *Name
) {
3702 return wrap(unwrap(B
)->CreatePHI(unwrap(Ty
), 0, Name
));
3705 LLVMValueRef
LLVMBuildCall(LLVMBuilderRef B
, LLVMValueRef Fn
,
3706 LLVMValueRef
*Args
, unsigned NumArgs
,
3708 Value
*V
= unwrap(Fn
);
3710 cast
<FunctionType
>(cast
<PointerType
>(V
->getType())->getElementType());
3712 return wrap(unwrap(B
)->CreateCall(FnT
, unwrap(Fn
),
3713 makeArrayRef(unwrap(Args
), NumArgs
), Name
));
3716 LLVMValueRef
LLVMBuildCall2(LLVMBuilderRef B
, LLVMTypeRef Ty
, LLVMValueRef Fn
,
3717 LLVMValueRef
*Args
, unsigned NumArgs
,
3719 FunctionType
*FTy
= unwrap
<FunctionType
>(Ty
);
3720 return wrap(unwrap(B
)->CreateCall(FTy
, unwrap(Fn
),
3721 makeArrayRef(unwrap(Args
), NumArgs
), Name
));
3724 LLVMValueRef
LLVMBuildSelect(LLVMBuilderRef B
, LLVMValueRef If
,
3725 LLVMValueRef Then
, LLVMValueRef Else
,
3727 return wrap(unwrap(B
)->CreateSelect(unwrap(If
), unwrap(Then
), unwrap(Else
),
3731 LLVMValueRef
LLVMBuildVAArg(LLVMBuilderRef B
, LLVMValueRef List
,
3732 LLVMTypeRef Ty
, const char *Name
) {
3733 return wrap(unwrap(B
)->CreateVAArg(unwrap(List
), unwrap(Ty
), Name
));
3736 LLVMValueRef
LLVMBuildExtractElement(LLVMBuilderRef B
, LLVMValueRef VecVal
,
3737 LLVMValueRef Index
, const char *Name
) {
3738 return wrap(unwrap(B
)->CreateExtractElement(unwrap(VecVal
), unwrap(Index
),
3742 LLVMValueRef
LLVMBuildInsertElement(LLVMBuilderRef B
, LLVMValueRef VecVal
,
3743 LLVMValueRef EltVal
, LLVMValueRef Index
,
3745 return wrap(unwrap(B
)->CreateInsertElement(unwrap(VecVal
), unwrap(EltVal
),
3746 unwrap(Index
), Name
));
3749 LLVMValueRef
LLVMBuildShuffleVector(LLVMBuilderRef B
, LLVMValueRef V1
,
3750 LLVMValueRef V2
, LLVMValueRef Mask
,
3752 return wrap(unwrap(B
)->CreateShuffleVector(unwrap(V1
), unwrap(V2
),
3753 unwrap(Mask
), Name
));
3756 LLVMValueRef
LLVMBuildExtractValue(LLVMBuilderRef B
, LLVMValueRef AggVal
,
3757 unsigned Index
, const char *Name
) {
3758 return wrap(unwrap(B
)->CreateExtractValue(unwrap(AggVal
), Index
, Name
));
3761 LLVMValueRef
LLVMBuildInsertValue(LLVMBuilderRef B
, LLVMValueRef AggVal
,
3762 LLVMValueRef EltVal
, unsigned Index
,
3764 return wrap(unwrap(B
)->CreateInsertValue(unwrap(AggVal
), unwrap(EltVal
),
3768 LLVMValueRef
LLVMBuildIsNull(LLVMBuilderRef B
, LLVMValueRef Val
,
3770 return wrap(unwrap(B
)->CreateIsNull(unwrap(Val
), Name
));
3773 LLVMValueRef
LLVMBuildIsNotNull(LLVMBuilderRef B
, LLVMValueRef Val
,
3775 return wrap(unwrap(B
)->CreateIsNotNull(unwrap(Val
), Name
));
3778 LLVMValueRef
LLVMBuildPtrDiff(LLVMBuilderRef B
, LLVMValueRef LHS
,
3779 LLVMValueRef RHS
, const char *Name
) {
3780 return wrap(unwrap(B
)->CreatePtrDiff(unwrap(LHS
), unwrap(RHS
), Name
));
3783 LLVMValueRef
LLVMBuildAtomicRMW(LLVMBuilderRef B
,LLVMAtomicRMWBinOp op
,
3784 LLVMValueRef PTR
, LLVMValueRef Val
,
3785 LLVMAtomicOrdering ordering
,
3786 LLVMBool singleThread
) {
3787 AtomicRMWInst::BinOp intop
;
3789 case LLVMAtomicRMWBinOpXchg
: intop
= AtomicRMWInst::Xchg
; break;
3790 case LLVMAtomicRMWBinOpAdd
: intop
= AtomicRMWInst::Add
; break;
3791 case LLVMAtomicRMWBinOpSub
: intop
= AtomicRMWInst::Sub
; break;
3792 case LLVMAtomicRMWBinOpAnd
: intop
= AtomicRMWInst::And
; break;
3793 case LLVMAtomicRMWBinOpNand
: intop
= AtomicRMWInst::Nand
; break;
3794 case LLVMAtomicRMWBinOpOr
: intop
= AtomicRMWInst::Or
; break;
3795 case LLVMAtomicRMWBinOpXor
: intop
= AtomicRMWInst::Xor
; break;
3796 case LLVMAtomicRMWBinOpMax
: intop
= AtomicRMWInst::Max
; break;
3797 case LLVMAtomicRMWBinOpMin
: intop
= AtomicRMWInst::Min
; break;
3798 case LLVMAtomicRMWBinOpUMax
: intop
= AtomicRMWInst::UMax
; break;
3799 case LLVMAtomicRMWBinOpUMin
: intop
= AtomicRMWInst::UMin
; break;
3801 return wrap(unwrap(B
)->CreateAtomicRMW(intop
, unwrap(PTR
), unwrap(Val
),
3802 mapFromLLVMOrdering(ordering
), singleThread
? SyncScope::SingleThread
3803 : SyncScope::System
));
3806 LLVMValueRef
LLVMBuildAtomicCmpXchg(LLVMBuilderRef B
, LLVMValueRef Ptr
,
3807 LLVMValueRef Cmp
, LLVMValueRef New
,
3808 LLVMAtomicOrdering SuccessOrdering
,
3809 LLVMAtomicOrdering FailureOrdering
,
3810 LLVMBool singleThread
) {
3812 return wrap(unwrap(B
)->CreateAtomicCmpXchg(unwrap(Ptr
), unwrap(Cmp
),
3813 unwrap(New
), mapFromLLVMOrdering(SuccessOrdering
),
3814 mapFromLLVMOrdering(FailureOrdering
),
3815 singleThread
? SyncScope::SingleThread
: SyncScope::System
));
3819 LLVMBool
LLVMIsAtomicSingleThread(LLVMValueRef AtomicInst
) {
3820 Value
*P
= unwrap
<Value
>(AtomicInst
);
3822 if (AtomicRMWInst
*I
= dyn_cast
<AtomicRMWInst
>(P
))
3823 return I
->getSyncScopeID() == SyncScope::SingleThread
;
3824 return cast
<AtomicCmpXchgInst
>(P
)->getSyncScopeID() ==
3825 SyncScope::SingleThread
;
3828 void LLVMSetAtomicSingleThread(LLVMValueRef AtomicInst
, LLVMBool NewValue
) {
3829 Value
*P
= unwrap
<Value
>(AtomicInst
);
3830 SyncScope::ID SSID
= NewValue
? SyncScope::SingleThread
: SyncScope::System
;
3832 if (AtomicRMWInst
*I
= dyn_cast
<AtomicRMWInst
>(P
))
3833 return I
->setSyncScopeID(SSID
);
3834 return cast
<AtomicCmpXchgInst
>(P
)->setSyncScopeID(SSID
);
3837 LLVMAtomicOrdering
LLVMGetCmpXchgSuccessOrdering(LLVMValueRef CmpXchgInst
) {
3838 Value
*P
= unwrap
<Value
>(CmpXchgInst
);
3839 return mapToLLVMOrdering(cast
<AtomicCmpXchgInst
>(P
)->getSuccessOrdering());
3842 void LLVMSetCmpXchgSuccessOrdering(LLVMValueRef CmpXchgInst
,
3843 LLVMAtomicOrdering Ordering
) {
3844 Value
*P
= unwrap
<Value
>(CmpXchgInst
);
3845 AtomicOrdering O
= mapFromLLVMOrdering(Ordering
);
3847 return cast
<AtomicCmpXchgInst
>(P
)->setSuccessOrdering(O
);
3850 LLVMAtomicOrdering
LLVMGetCmpXchgFailureOrdering(LLVMValueRef CmpXchgInst
) {
3851 Value
*P
= unwrap
<Value
>(CmpXchgInst
);
3852 return mapToLLVMOrdering(cast
<AtomicCmpXchgInst
>(P
)->getFailureOrdering());
3855 void LLVMSetCmpXchgFailureOrdering(LLVMValueRef CmpXchgInst
,
3856 LLVMAtomicOrdering Ordering
) {
3857 Value
*P
= unwrap
<Value
>(CmpXchgInst
);
3858 AtomicOrdering O
= mapFromLLVMOrdering(Ordering
);
3860 return cast
<AtomicCmpXchgInst
>(P
)->setFailureOrdering(O
);
3863 /*===-- Module providers --------------------------------------------------===*/
3865 LLVMModuleProviderRef
3866 LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M
) {
3867 return reinterpret_cast<LLVMModuleProviderRef
>(M
);
3870 void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP
) {
3875 /*===-- Memory buffers ----------------------------------------------------===*/
3877 LLVMBool
LLVMCreateMemoryBufferWithContentsOfFile(
3879 LLVMMemoryBufferRef
*OutMemBuf
,
3880 char **OutMessage
) {
3882 ErrorOr
<std::unique_ptr
<MemoryBuffer
>> MBOrErr
= MemoryBuffer::getFile(Path
);
3883 if (std::error_code EC
= MBOrErr
.getError()) {
3884 *OutMessage
= strdup(EC
.message().c_str());
3887 *OutMemBuf
= wrap(MBOrErr
.get().release());
3891 LLVMBool
LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef
*OutMemBuf
,
3892 char **OutMessage
) {
3893 ErrorOr
<std::unique_ptr
<MemoryBuffer
>> MBOrErr
= MemoryBuffer::getSTDIN();
3894 if (std::error_code EC
= MBOrErr
.getError()) {
3895 *OutMessage
= strdup(EC
.message().c_str());
3898 *OutMemBuf
= wrap(MBOrErr
.get().release());
3902 LLVMMemoryBufferRef
LLVMCreateMemoryBufferWithMemoryRange(
3903 const char *InputData
,
3904 size_t InputDataLength
,
3905 const char *BufferName
,
3906 LLVMBool RequiresNullTerminator
) {
3908 return wrap(MemoryBuffer::getMemBuffer(StringRef(InputData
, InputDataLength
),
3909 StringRef(BufferName
),
3910 RequiresNullTerminator
).release());
3913 LLVMMemoryBufferRef
LLVMCreateMemoryBufferWithMemoryRangeCopy(
3914 const char *InputData
,
3915 size_t InputDataLength
,
3916 const char *BufferName
) {
3919 MemoryBuffer::getMemBufferCopy(StringRef(InputData
, InputDataLength
),
3920 StringRef(BufferName
)).release());
3923 const char *LLVMGetBufferStart(LLVMMemoryBufferRef MemBuf
) {
3924 return unwrap(MemBuf
)->getBufferStart();
3927 size_t LLVMGetBufferSize(LLVMMemoryBufferRef MemBuf
) {
3928 return unwrap(MemBuf
)->getBufferSize();
3931 void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf
) {
3932 delete unwrap(MemBuf
);
3935 /*===-- Pass Registry -----------------------------------------------------===*/
3937 LLVMPassRegistryRef
LLVMGetGlobalPassRegistry(void) {
3938 return wrap(PassRegistry::getPassRegistry());
3941 /*===-- Pass Manager ------------------------------------------------------===*/
3943 LLVMPassManagerRef
LLVMCreatePassManager() {
3944 return wrap(new legacy::PassManager());
3947 LLVMPassManagerRef
LLVMCreateFunctionPassManagerForModule(LLVMModuleRef M
) {
3948 return wrap(new legacy::FunctionPassManager(unwrap(M
)));
3951 LLVMPassManagerRef
LLVMCreateFunctionPassManager(LLVMModuleProviderRef P
) {
3952 return LLVMCreateFunctionPassManagerForModule(
3953 reinterpret_cast<LLVMModuleRef
>(P
));
3956 LLVMBool
LLVMRunPassManager(LLVMPassManagerRef PM
, LLVMModuleRef M
) {
3957 return unwrap
<legacy::PassManager
>(PM
)->run(*unwrap(M
));
3960 LLVMBool
LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM
) {
3961 return unwrap
<legacy::FunctionPassManager
>(FPM
)->doInitialization();
3964 LLVMBool
LLVMRunFunctionPassManager(LLVMPassManagerRef FPM
, LLVMValueRef F
) {
3965 return unwrap
<legacy::FunctionPassManager
>(FPM
)->run(*unwrap
<Function
>(F
));
3968 LLVMBool
LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM
) {
3969 return unwrap
<legacy::FunctionPassManager
>(FPM
)->doFinalization();
3972 void LLVMDisposePassManager(LLVMPassManagerRef PM
) {
3976 /*===-- Threading ------------------------------------------------------===*/
3978 LLVMBool
LLVMStartMultithreaded() {
3979 return LLVMIsMultithreaded();
3982 void LLVMStopMultithreaded() {
3985 LLVMBool
LLVMIsMultithreaded() {
3986 return llvm_is_multithreaded();