10b57cec5SDimitry Andric //===-- Core.cpp ----------------------------------------------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file implements the common infrastructure (including the C bindings) 100b57cec5SDimitry Andric // for libLLVMCore.a, which implements the LLVM intermediate representation. 110b57cec5SDimitry Andric // 120b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric #include "llvm-c/Core.h" 150b57cec5SDimitry Andric #include "llvm/IR/Attributes.h" 161fd87a68SDimitry Andric #include "llvm/IR/BasicBlock.h" 17*0fca6ea1SDimitry Andric #include "llvm/IR/ConstantRange.h" 180b57cec5SDimitry Andric #include "llvm/IR/Constants.h" 190b57cec5SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h" 200b57cec5SDimitry Andric #include "llvm/IR/DerivedTypes.h" 210b57cec5SDimitry Andric #include "llvm/IR/DiagnosticInfo.h" 220b57cec5SDimitry Andric #include "llvm/IR/DiagnosticPrinter.h" 230b57cec5SDimitry Andric #include "llvm/IR/GlobalAlias.h" 240b57cec5SDimitry Andric #include "llvm/IR/GlobalVariable.h" 250b57cec5SDimitry Andric #include "llvm/IR/IRBuilder.h" 260b57cec5SDimitry Andric #include "llvm/IR/InlineAsm.h" 270b57cec5SDimitry Andric #include "llvm/IR/IntrinsicInst.h" 280b57cec5SDimitry Andric #include "llvm/IR/LLVMContext.h" 290b57cec5SDimitry Andric #include "llvm/IR/LegacyPassManager.h" 300b57cec5SDimitry Andric #include "llvm/IR/Module.h" 31480093f4SDimitry Andric #include "llvm/InitializePasses.h" 321fd87a68SDimitry Andric #include "llvm/PassRegistry.h" 330b57cec5SDimitry Andric #include "llvm/Support/Debug.h" 340b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 350b57cec5SDimitry Andric #include "llvm/Support/FileSystem.h" 360b57cec5SDimitry Andric #include "llvm/Support/ManagedStatic.h" 37*0fca6ea1SDimitry Andric #include "llvm/Support/MathExtras.h" 380b57cec5SDimitry Andric #include "llvm/Support/MemoryBuffer.h" 390b57cec5SDimitry Andric #include "llvm/Support/Threading.h" 400b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 410b57cec5SDimitry Andric #include <cassert> 420b57cec5SDimitry Andric #include <cstdlib> 430b57cec5SDimitry Andric #include <cstring> 440b57cec5SDimitry Andric #include <system_error> 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric using namespace llvm; 470b57cec5SDimitry Andric 485f757f3fSDimitry Andric DEFINE_SIMPLE_CONVERSION_FUNCTIONS(OperandBundleDef, LLVMOperandBundleRef) 495f757f3fSDimitry Andric 50*0fca6ea1SDimitry Andric inline BasicBlock **unwrap(LLVMBasicBlockRef *BBs) { 51*0fca6ea1SDimitry Andric return reinterpret_cast<BasicBlock **>(BBs); 52*0fca6ea1SDimitry Andric } 53*0fca6ea1SDimitry Andric 540b57cec5SDimitry Andric #define DEBUG_TYPE "ir" 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric void llvm::initializeCore(PassRegistry &Registry) { 570b57cec5SDimitry Andric initializeDominatorTreeWrapperPassPass(Registry); 580b57cec5SDimitry Andric initializePrintModulePassWrapperPass(Registry); 590b57cec5SDimitry Andric initializePrintFunctionPassWrapperPass(Registry); 600b57cec5SDimitry Andric initializeSafepointIRVerifierPass(Registry); 610b57cec5SDimitry Andric initializeVerifierLegacyPassPass(Registry); 620b57cec5SDimitry Andric } 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric void LLVMShutdown() { 650b57cec5SDimitry Andric llvm_shutdown(); 660b57cec5SDimitry Andric } 670b57cec5SDimitry Andric 68bdd1243dSDimitry Andric /*===-- Version query -----------------------------------------------------===*/ 69bdd1243dSDimitry Andric 70bdd1243dSDimitry Andric void LLVMGetVersion(unsigned *Major, unsigned *Minor, unsigned *Patch) { 71bdd1243dSDimitry Andric if (Major) 72bdd1243dSDimitry Andric *Major = LLVM_VERSION_MAJOR; 73bdd1243dSDimitry Andric if (Minor) 74bdd1243dSDimitry Andric *Minor = LLVM_VERSION_MINOR; 75bdd1243dSDimitry Andric if (Patch) 76bdd1243dSDimitry Andric *Patch = LLVM_VERSION_PATCH; 77bdd1243dSDimitry Andric } 78bdd1243dSDimitry Andric 790b57cec5SDimitry Andric /*===-- Error handling ----------------------------------------------------===*/ 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric char *LLVMCreateMessage(const char *Message) { 820b57cec5SDimitry Andric return strdup(Message); 830b57cec5SDimitry Andric } 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric void LLVMDisposeMessage(char *Message) { 860b57cec5SDimitry Andric free(Message); 870b57cec5SDimitry Andric } 880b57cec5SDimitry Andric 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric /*===-- Operations on contexts --------------------------------------------===*/ 910b57cec5SDimitry Andric 92753f127fSDimitry Andric static LLVMContext &getGlobalContext() { 93753f127fSDimitry Andric static LLVMContext GlobalContext; 94753f127fSDimitry Andric return GlobalContext; 95753f127fSDimitry Andric } 960b57cec5SDimitry Andric 970b57cec5SDimitry Andric LLVMContextRef LLVMContextCreate() { 980b57cec5SDimitry Andric return wrap(new LLVMContext()); 990b57cec5SDimitry Andric } 1000b57cec5SDimitry Andric 101753f127fSDimitry Andric LLVMContextRef LLVMGetGlobalContext() { return wrap(&getGlobalContext()); } 1020b57cec5SDimitry Andric 1030b57cec5SDimitry Andric void LLVMContextSetDiagnosticHandler(LLVMContextRef C, 1040b57cec5SDimitry Andric LLVMDiagnosticHandler Handler, 1050b57cec5SDimitry Andric void *DiagnosticContext) { 1060b57cec5SDimitry Andric unwrap(C)->setDiagnosticHandlerCallBack( 1070b57cec5SDimitry Andric LLVM_EXTENSION reinterpret_cast<DiagnosticHandler::DiagnosticHandlerTy>( 1080b57cec5SDimitry Andric Handler), 1090b57cec5SDimitry Andric DiagnosticContext); 1100b57cec5SDimitry Andric } 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andric LLVMDiagnosticHandler LLVMContextGetDiagnosticHandler(LLVMContextRef C) { 1130b57cec5SDimitry Andric return LLVM_EXTENSION reinterpret_cast<LLVMDiagnosticHandler>( 1140b57cec5SDimitry Andric unwrap(C)->getDiagnosticHandlerCallBack()); 1150b57cec5SDimitry Andric } 1160b57cec5SDimitry Andric 1170b57cec5SDimitry Andric void *LLVMContextGetDiagnosticContext(LLVMContextRef C) { 1180b57cec5SDimitry Andric return unwrap(C)->getDiagnosticContext(); 1190b57cec5SDimitry Andric } 1200b57cec5SDimitry Andric 1210b57cec5SDimitry Andric void LLVMContextSetYieldCallback(LLVMContextRef C, LLVMYieldCallback Callback, 1220b57cec5SDimitry Andric void *OpaqueHandle) { 1230b57cec5SDimitry Andric auto YieldCallback = 1240b57cec5SDimitry Andric LLVM_EXTENSION reinterpret_cast<LLVMContext::YieldCallbackTy>(Callback); 1250b57cec5SDimitry Andric unwrap(C)->setYieldCallback(YieldCallback, OpaqueHandle); 1260b57cec5SDimitry Andric } 1270b57cec5SDimitry Andric 1280b57cec5SDimitry Andric LLVMBool LLVMContextShouldDiscardValueNames(LLVMContextRef C) { 1290b57cec5SDimitry Andric return unwrap(C)->shouldDiscardValueNames(); 1300b57cec5SDimitry Andric } 1310b57cec5SDimitry Andric 1320b57cec5SDimitry Andric void LLVMContextSetDiscardValueNames(LLVMContextRef C, LLVMBool Discard) { 1330b57cec5SDimitry Andric unwrap(C)->setDiscardValueNames(Discard); 1340b57cec5SDimitry Andric } 1350b57cec5SDimitry Andric 1360b57cec5SDimitry Andric void LLVMContextDispose(LLVMContextRef C) { 1370b57cec5SDimitry Andric delete unwrap(C); 1380b57cec5SDimitry Andric } 1390b57cec5SDimitry Andric 1400b57cec5SDimitry Andric unsigned LLVMGetMDKindIDInContext(LLVMContextRef C, const char *Name, 1410b57cec5SDimitry Andric unsigned SLen) { 1420b57cec5SDimitry Andric return unwrap(C)->getMDKindID(StringRef(Name, SLen)); 1430b57cec5SDimitry Andric } 1440b57cec5SDimitry Andric 1450b57cec5SDimitry Andric unsigned LLVMGetMDKindID(const char *Name, unsigned SLen) { 1460b57cec5SDimitry Andric return LLVMGetMDKindIDInContext(LLVMGetGlobalContext(), Name, SLen); 1470b57cec5SDimitry Andric } 1480b57cec5SDimitry Andric 1490b57cec5SDimitry Andric unsigned LLVMGetEnumAttributeKindForName(const char *Name, size_t SLen) { 1505ffd83dbSDimitry Andric return Attribute::getAttrKindFromName(StringRef(Name, SLen)); 1510b57cec5SDimitry Andric } 1520b57cec5SDimitry Andric 1530b57cec5SDimitry Andric unsigned LLVMGetLastEnumAttributeKind(void) { 1540b57cec5SDimitry Andric return Attribute::AttrKind::EndAttrKinds; 1550b57cec5SDimitry Andric } 1560b57cec5SDimitry Andric 1570b57cec5SDimitry Andric LLVMAttributeRef LLVMCreateEnumAttribute(LLVMContextRef C, unsigned KindID, 1580b57cec5SDimitry Andric uint64_t Val) { 1590b57cec5SDimitry Andric auto &Ctx = *unwrap(C); 1600b57cec5SDimitry Andric auto AttrKind = (Attribute::AttrKind)KindID; 161480093f4SDimitry Andric return wrap(Attribute::get(Ctx, AttrKind, Val)); 1620b57cec5SDimitry Andric } 1630b57cec5SDimitry Andric 1640b57cec5SDimitry Andric unsigned LLVMGetEnumAttributeKind(LLVMAttributeRef A) { 1650b57cec5SDimitry Andric return unwrap(A).getKindAsEnum(); 1660b57cec5SDimitry Andric } 1670b57cec5SDimitry Andric 1680b57cec5SDimitry Andric uint64_t LLVMGetEnumAttributeValue(LLVMAttributeRef A) { 1690b57cec5SDimitry Andric auto Attr = unwrap(A); 1700b57cec5SDimitry Andric if (Attr.isEnumAttribute()) 1710b57cec5SDimitry Andric return 0; 1720b57cec5SDimitry Andric return Attr.getValueAsInt(); 1730b57cec5SDimitry Andric } 1740b57cec5SDimitry Andric 1754652422eSDimitry Andric LLVMAttributeRef LLVMCreateTypeAttribute(LLVMContextRef C, unsigned KindID, 1764652422eSDimitry Andric LLVMTypeRef type_ref) { 1774652422eSDimitry Andric auto &Ctx = *unwrap(C); 1784652422eSDimitry Andric auto AttrKind = (Attribute::AttrKind)KindID; 1794652422eSDimitry Andric return wrap(Attribute::get(Ctx, AttrKind, unwrap(type_ref))); 1804652422eSDimitry Andric } 1814652422eSDimitry Andric 1824652422eSDimitry Andric LLVMTypeRef LLVMGetTypeAttributeValue(LLVMAttributeRef A) { 1834652422eSDimitry Andric auto Attr = unwrap(A); 1844652422eSDimitry Andric return wrap(Attr.getValueAsType()); 1854652422eSDimitry Andric } 1864652422eSDimitry Andric 187*0fca6ea1SDimitry Andric LLVMAttributeRef LLVMCreateConstantRangeAttribute(LLVMContextRef C, 188*0fca6ea1SDimitry Andric unsigned KindID, 189*0fca6ea1SDimitry Andric unsigned NumBits, 190*0fca6ea1SDimitry Andric const uint64_t LowerWords[], 191*0fca6ea1SDimitry Andric const uint64_t UpperWords[]) { 192*0fca6ea1SDimitry Andric auto &Ctx = *unwrap(C); 193*0fca6ea1SDimitry Andric auto AttrKind = (Attribute::AttrKind)KindID; 194*0fca6ea1SDimitry Andric unsigned NumWords = divideCeil(NumBits, 64); 195*0fca6ea1SDimitry Andric return wrap(Attribute::get( 196*0fca6ea1SDimitry Andric Ctx, AttrKind, 197*0fca6ea1SDimitry Andric ConstantRange(APInt(NumBits, ArrayRef(LowerWords, NumWords)), 198*0fca6ea1SDimitry Andric APInt(NumBits, ArrayRef(UpperWords, NumWords))))); 199*0fca6ea1SDimitry Andric } 200*0fca6ea1SDimitry Andric 2010b57cec5SDimitry Andric LLVMAttributeRef LLVMCreateStringAttribute(LLVMContextRef C, 2020b57cec5SDimitry Andric const char *K, unsigned KLength, 2030b57cec5SDimitry Andric const char *V, unsigned VLength) { 2040b57cec5SDimitry Andric return wrap(Attribute::get(*unwrap(C), StringRef(K, KLength), 2050b57cec5SDimitry Andric StringRef(V, VLength))); 2060b57cec5SDimitry Andric } 2070b57cec5SDimitry Andric 2080b57cec5SDimitry Andric const char *LLVMGetStringAttributeKind(LLVMAttributeRef A, 2090b57cec5SDimitry Andric unsigned *Length) { 2100b57cec5SDimitry Andric auto S = unwrap(A).getKindAsString(); 2110b57cec5SDimitry Andric *Length = S.size(); 2120b57cec5SDimitry Andric return S.data(); 2130b57cec5SDimitry Andric } 2140b57cec5SDimitry Andric 2150b57cec5SDimitry Andric const char *LLVMGetStringAttributeValue(LLVMAttributeRef A, 2160b57cec5SDimitry Andric unsigned *Length) { 2170b57cec5SDimitry Andric auto S = unwrap(A).getValueAsString(); 2180b57cec5SDimitry Andric *Length = S.size(); 2190b57cec5SDimitry Andric return S.data(); 2200b57cec5SDimitry Andric } 2210b57cec5SDimitry Andric 2220b57cec5SDimitry Andric LLVMBool LLVMIsEnumAttribute(LLVMAttributeRef A) { 2230b57cec5SDimitry Andric auto Attr = unwrap(A); 2240b57cec5SDimitry Andric return Attr.isEnumAttribute() || Attr.isIntAttribute(); 2250b57cec5SDimitry Andric } 2260b57cec5SDimitry Andric 2270b57cec5SDimitry Andric LLVMBool LLVMIsStringAttribute(LLVMAttributeRef A) { 2280b57cec5SDimitry Andric return unwrap(A).isStringAttribute(); 2290b57cec5SDimitry Andric } 2300b57cec5SDimitry Andric 2314652422eSDimitry Andric LLVMBool LLVMIsTypeAttribute(LLVMAttributeRef A) { 2324652422eSDimitry Andric return unwrap(A).isTypeAttribute(); 2334652422eSDimitry Andric } 2344652422eSDimitry Andric 2350b57cec5SDimitry Andric char *LLVMGetDiagInfoDescription(LLVMDiagnosticInfoRef DI) { 2360b57cec5SDimitry Andric std::string MsgStorage; 2370b57cec5SDimitry Andric raw_string_ostream Stream(MsgStorage); 2380b57cec5SDimitry Andric DiagnosticPrinterRawOStream DP(Stream); 2390b57cec5SDimitry Andric 2400b57cec5SDimitry Andric unwrap(DI)->print(DP); 2410b57cec5SDimitry Andric Stream.flush(); 2420b57cec5SDimitry Andric 2430b57cec5SDimitry Andric return LLVMCreateMessage(MsgStorage.c_str()); 2440b57cec5SDimitry Andric } 2450b57cec5SDimitry Andric 2460b57cec5SDimitry Andric LLVMDiagnosticSeverity LLVMGetDiagInfoSeverity(LLVMDiagnosticInfoRef DI) { 2470b57cec5SDimitry Andric LLVMDiagnosticSeverity severity; 2480b57cec5SDimitry Andric 2490b57cec5SDimitry Andric switch(unwrap(DI)->getSeverity()) { 2500b57cec5SDimitry Andric default: 2510b57cec5SDimitry Andric severity = LLVMDSError; 2520b57cec5SDimitry Andric break; 2530b57cec5SDimitry Andric case DS_Warning: 2540b57cec5SDimitry Andric severity = LLVMDSWarning; 2550b57cec5SDimitry Andric break; 2560b57cec5SDimitry Andric case DS_Remark: 2570b57cec5SDimitry Andric severity = LLVMDSRemark; 2580b57cec5SDimitry Andric break; 2590b57cec5SDimitry Andric case DS_Note: 2600b57cec5SDimitry Andric severity = LLVMDSNote; 2610b57cec5SDimitry Andric break; 2620b57cec5SDimitry Andric } 2630b57cec5SDimitry Andric 2640b57cec5SDimitry Andric return severity; 2650b57cec5SDimitry Andric } 2660b57cec5SDimitry Andric 2670b57cec5SDimitry Andric /*===-- Operations on modules ---------------------------------------------===*/ 2680b57cec5SDimitry Andric 2690b57cec5SDimitry Andric LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID) { 270753f127fSDimitry Andric return wrap(new Module(ModuleID, getGlobalContext())); 2710b57cec5SDimitry Andric } 2720b57cec5SDimitry Andric 2730b57cec5SDimitry Andric LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID, 2740b57cec5SDimitry Andric LLVMContextRef C) { 2750b57cec5SDimitry Andric return wrap(new Module(ModuleID, *unwrap(C))); 2760b57cec5SDimitry Andric } 2770b57cec5SDimitry Andric 2780b57cec5SDimitry Andric void LLVMDisposeModule(LLVMModuleRef M) { 2790b57cec5SDimitry Andric delete unwrap(M); 2800b57cec5SDimitry Andric } 2810b57cec5SDimitry Andric 2820b57cec5SDimitry Andric const char *LLVMGetModuleIdentifier(LLVMModuleRef M, size_t *Len) { 2830b57cec5SDimitry Andric auto &Str = unwrap(M)->getModuleIdentifier(); 2840b57cec5SDimitry Andric *Len = Str.length(); 2850b57cec5SDimitry Andric return Str.c_str(); 2860b57cec5SDimitry Andric } 2870b57cec5SDimitry Andric 2880b57cec5SDimitry Andric void LLVMSetModuleIdentifier(LLVMModuleRef M, const char *Ident, size_t Len) { 2890b57cec5SDimitry Andric unwrap(M)->setModuleIdentifier(StringRef(Ident, Len)); 2900b57cec5SDimitry Andric } 2910b57cec5SDimitry Andric 2920b57cec5SDimitry Andric const char *LLVMGetSourceFileName(LLVMModuleRef M, size_t *Len) { 2930b57cec5SDimitry Andric auto &Str = unwrap(M)->getSourceFileName(); 2940b57cec5SDimitry Andric *Len = Str.length(); 2950b57cec5SDimitry Andric return Str.c_str(); 2960b57cec5SDimitry Andric } 2970b57cec5SDimitry Andric 2980b57cec5SDimitry Andric void LLVMSetSourceFileName(LLVMModuleRef M, const char *Name, size_t Len) { 2990b57cec5SDimitry Andric unwrap(M)->setSourceFileName(StringRef(Name, Len)); 3000b57cec5SDimitry Andric } 3010b57cec5SDimitry Andric 3020b57cec5SDimitry Andric /*--.. Data layout .........................................................--*/ 3030b57cec5SDimitry Andric const char *LLVMGetDataLayoutStr(LLVMModuleRef M) { 3040b57cec5SDimitry Andric return unwrap(M)->getDataLayoutStr().c_str(); 3050b57cec5SDimitry Andric } 3060b57cec5SDimitry Andric 3070b57cec5SDimitry Andric const char *LLVMGetDataLayout(LLVMModuleRef M) { 3080b57cec5SDimitry Andric return LLVMGetDataLayoutStr(M); 3090b57cec5SDimitry Andric } 3100b57cec5SDimitry Andric 3110b57cec5SDimitry Andric void LLVMSetDataLayout(LLVMModuleRef M, const char *DataLayoutStr) { 3120b57cec5SDimitry Andric unwrap(M)->setDataLayout(DataLayoutStr); 3130b57cec5SDimitry Andric } 3140b57cec5SDimitry Andric 3150b57cec5SDimitry Andric /*--.. Target triple .......................................................--*/ 3160b57cec5SDimitry Andric const char * LLVMGetTarget(LLVMModuleRef M) { 3170b57cec5SDimitry Andric return unwrap(M)->getTargetTriple().c_str(); 3180b57cec5SDimitry Andric } 3190b57cec5SDimitry Andric 3200b57cec5SDimitry Andric void LLVMSetTarget(LLVMModuleRef M, const char *Triple) { 3210b57cec5SDimitry Andric unwrap(M)->setTargetTriple(Triple); 3220b57cec5SDimitry Andric } 3230b57cec5SDimitry Andric 3240b57cec5SDimitry Andric /*--.. Module flags ........................................................--*/ 3250b57cec5SDimitry Andric struct LLVMOpaqueModuleFlagEntry { 3260b57cec5SDimitry Andric LLVMModuleFlagBehavior Behavior; 3270b57cec5SDimitry Andric const char *Key; 3280b57cec5SDimitry Andric size_t KeyLen; 3290b57cec5SDimitry Andric LLVMMetadataRef Metadata; 3300b57cec5SDimitry Andric }; 3310b57cec5SDimitry Andric 3320b57cec5SDimitry Andric static Module::ModFlagBehavior 3330b57cec5SDimitry Andric map_to_llvmModFlagBehavior(LLVMModuleFlagBehavior Behavior) { 3340b57cec5SDimitry Andric switch (Behavior) { 3350b57cec5SDimitry Andric case LLVMModuleFlagBehaviorError: 3360b57cec5SDimitry Andric return Module::ModFlagBehavior::Error; 3370b57cec5SDimitry Andric case LLVMModuleFlagBehaviorWarning: 3380b57cec5SDimitry Andric return Module::ModFlagBehavior::Warning; 3390b57cec5SDimitry Andric case LLVMModuleFlagBehaviorRequire: 3400b57cec5SDimitry Andric return Module::ModFlagBehavior::Require; 3410b57cec5SDimitry Andric case LLVMModuleFlagBehaviorOverride: 3420b57cec5SDimitry Andric return Module::ModFlagBehavior::Override; 3430b57cec5SDimitry Andric case LLVMModuleFlagBehaviorAppend: 3440b57cec5SDimitry Andric return Module::ModFlagBehavior::Append; 3450b57cec5SDimitry Andric case LLVMModuleFlagBehaviorAppendUnique: 3460b57cec5SDimitry Andric return Module::ModFlagBehavior::AppendUnique; 3470b57cec5SDimitry Andric } 3480b57cec5SDimitry Andric llvm_unreachable("Unknown LLVMModuleFlagBehavior"); 3490b57cec5SDimitry Andric } 3500b57cec5SDimitry Andric 3510b57cec5SDimitry Andric static LLVMModuleFlagBehavior 3520b57cec5SDimitry Andric map_from_llvmModFlagBehavior(Module::ModFlagBehavior Behavior) { 3530b57cec5SDimitry Andric switch (Behavior) { 3540b57cec5SDimitry Andric case Module::ModFlagBehavior::Error: 3550b57cec5SDimitry Andric return LLVMModuleFlagBehaviorError; 3560b57cec5SDimitry Andric case Module::ModFlagBehavior::Warning: 3570b57cec5SDimitry Andric return LLVMModuleFlagBehaviorWarning; 3580b57cec5SDimitry Andric case Module::ModFlagBehavior::Require: 3590b57cec5SDimitry Andric return LLVMModuleFlagBehaviorRequire; 3600b57cec5SDimitry Andric case Module::ModFlagBehavior::Override: 3610b57cec5SDimitry Andric return LLVMModuleFlagBehaviorOverride; 3620b57cec5SDimitry Andric case Module::ModFlagBehavior::Append: 3630b57cec5SDimitry Andric return LLVMModuleFlagBehaviorAppend; 3640b57cec5SDimitry Andric case Module::ModFlagBehavior::AppendUnique: 3650b57cec5SDimitry Andric return LLVMModuleFlagBehaviorAppendUnique; 3660b57cec5SDimitry Andric default: 3670b57cec5SDimitry Andric llvm_unreachable("Unhandled Flag Behavior"); 3680b57cec5SDimitry Andric } 3690b57cec5SDimitry Andric } 3700b57cec5SDimitry Andric 3710b57cec5SDimitry Andric LLVMModuleFlagEntry *LLVMCopyModuleFlagsMetadata(LLVMModuleRef M, size_t *Len) { 3720b57cec5SDimitry Andric SmallVector<Module::ModuleFlagEntry, 8> MFEs; 3730b57cec5SDimitry Andric unwrap(M)->getModuleFlagsMetadata(MFEs); 3740b57cec5SDimitry Andric 3750b57cec5SDimitry Andric LLVMOpaqueModuleFlagEntry *Result = static_cast<LLVMOpaqueModuleFlagEntry *>( 3760b57cec5SDimitry Andric safe_malloc(MFEs.size() * sizeof(LLVMOpaqueModuleFlagEntry))); 3770b57cec5SDimitry Andric for (unsigned i = 0; i < MFEs.size(); ++i) { 3780b57cec5SDimitry Andric const auto &ModuleFlag = MFEs[i]; 3790b57cec5SDimitry Andric Result[i].Behavior = map_from_llvmModFlagBehavior(ModuleFlag.Behavior); 3800b57cec5SDimitry Andric Result[i].Key = ModuleFlag.Key->getString().data(); 3810b57cec5SDimitry Andric Result[i].KeyLen = ModuleFlag.Key->getString().size(); 3820b57cec5SDimitry Andric Result[i].Metadata = wrap(ModuleFlag.Val); 3830b57cec5SDimitry Andric } 3840b57cec5SDimitry Andric *Len = MFEs.size(); 3850b57cec5SDimitry Andric return Result; 3860b57cec5SDimitry Andric } 3870b57cec5SDimitry Andric 3880b57cec5SDimitry Andric void LLVMDisposeModuleFlagsMetadata(LLVMModuleFlagEntry *Entries) { 3890b57cec5SDimitry Andric free(Entries); 3900b57cec5SDimitry Andric } 3910b57cec5SDimitry Andric 3920b57cec5SDimitry Andric LLVMModuleFlagBehavior 3930b57cec5SDimitry Andric LLVMModuleFlagEntriesGetFlagBehavior(LLVMModuleFlagEntry *Entries, 3940b57cec5SDimitry Andric unsigned Index) { 3950b57cec5SDimitry Andric LLVMOpaqueModuleFlagEntry MFE = 3960b57cec5SDimitry Andric static_cast<LLVMOpaqueModuleFlagEntry>(Entries[Index]); 3970b57cec5SDimitry Andric return MFE.Behavior; 3980b57cec5SDimitry Andric } 3990b57cec5SDimitry Andric 4000b57cec5SDimitry Andric const char *LLVMModuleFlagEntriesGetKey(LLVMModuleFlagEntry *Entries, 4010b57cec5SDimitry Andric unsigned Index, size_t *Len) { 4020b57cec5SDimitry Andric LLVMOpaqueModuleFlagEntry MFE = 4030b57cec5SDimitry Andric static_cast<LLVMOpaqueModuleFlagEntry>(Entries[Index]); 4040b57cec5SDimitry Andric *Len = MFE.KeyLen; 4050b57cec5SDimitry Andric return MFE.Key; 4060b57cec5SDimitry Andric } 4070b57cec5SDimitry Andric 4080b57cec5SDimitry Andric LLVMMetadataRef LLVMModuleFlagEntriesGetMetadata(LLVMModuleFlagEntry *Entries, 4090b57cec5SDimitry Andric unsigned Index) { 4100b57cec5SDimitry Andric LLVMOpaqueModuleFlagEntry MFE = 4110b57cec5SDimitry Andric static_cast<LLVMOpaqueModuleFlagEntry>(Entries[Index]); 4120b57cec5SDimitry Andric return MFE.Metadata; 4130b57cec5SDimitry Andric } 4140b57cec5SDimitry Andric 4150b57cec5SDimitry Andric LLVMMetadataRef LLVMGetModuleFlag(LLVMModuleRef M, 4160b57cec5SDimitry Andric const char *Key, size_t KeyLen) { 4170b57cec5SDimitry Andric return wrap(unwrap(M)->getModuleFlag({Key, KeyLen})); 4180b57cec5SDimitry Andric } 4190b57cec5SDimitry Andric 4200b57cec5SDimitry Andric void LLVMAddModuleFlag(LLVMModuleRef M, LLVMModuleFlagBehavior Behavior, 4210b57cec5SDimitry Andric const char *Key, size_t KeyLen, 4220b57cec5SDimitry Andric LLVMMetadataRef Val) { 4230b57cec5SDimitry Andric unwrap(M)->addModuleFlag(map_to_llvmModFlagBehavior(Behavior), 4240b57cec5SDimitry Andric {Key, KeyLen}, unwrap(Val)); 4250b57cec5SDimitry Andric } 4260b57cec5SDimitry Andric 427*0fca6ea1SDimitry Andric LLVMBool LLVMIsNewDbgInfoFormat(LLVMModuleRef M) { 428*0fca6ea1SDimitry Andric return unwrap(M)->IsNewDbgInfoFormat; 429*0fca6ea1SDimitry Andric } 430*0fca6ea1SDimitry Andric 431*0fca6ea1SDimitry Andric void LLVMSetIsNewDbgInfoFormat(LLVMModuleRef M, LLVMBool UseNewFormat) { 432*0fca6ea1SDimitry Andric unwrap(M)->setIsNewDbgInfoFormat(UseNewFormat); 433*0fca6ea1SDimitry Andric } 434*0fca6ea1SDimitry Andric 4350b57cec5SDimitry Andric /*--.. Printing modules ....................................................--*/ 4360b57cec5SDimitry Andric 4370b57cec5SDimitry Andric void LLVMDumpModule(LLVMModuleRef M) { 4380b57cec5SDimitry Andric unwrap(M)->print(errs(), nullptr, 4390b57cec5SDimitry Andric /*ShouldPreserveUseListOrder=*/false, /*IsForDebug=*/true); 4400b57cec5SDimitry Andric } 4410b57cec5SDimitry Andric 4420b57cec5SDimitry Andric LLVMBool LLVMPrintModuleToFile(LLVMModuleRef M, const char *Filename, 4430b57cec5SDimitry Andric char **ErrorMessage) { 4440b57cec5SDimitry Andric std::error_code EC; 445fe6060f1SDimitry Andric raw_fd_ostream dest(Filename, EC, sys::fs::OF_TextWithCRLF); 4460b57cec5SDimitry Andric if (EC) { 4470b57cec5SDimitry Andric *ErrorMessage = strdup(EC.message().c_str()); 4480b57cec5SDimitry Andric return true; 4490b57cec5SDimitry Andric } 4500b57cec5SDimitry Andric 4510b57cec5SDimitry Andric unwrap(M)->print(dest, nullptr); 4520b57cec5SDimitry Andric 4530b57cec5SDimitry Andric dest.close(); 4540b57cec5SDimitry Andric 4550b57cec5SDimitry Andric if (dest.has_error()) { 4560b57cec5SDimitry Andric std::string E = "Error printing to file: " + dest.error().message(); 4570b57cec5SDimitry Andric *ErrorMessage = strdup(E.c_str()); 4580b57cec5SDimitry Andric return true; 4590b57cec5SDimitry Andric } 4600b57cec5SDimitry Andric 4610b57cec5SDimitry Andric return false; 4620b57cec5SDimitry Andric } 4630b57cec5SDimitry Andric 4640b57cec5SDimitry Andric char *LLVMPrintModuleToString(LLVMModuleRef M) { 4650b57cec5SDimitry Andric std::string buf; 4660b57cec5SDimitry Andric raw_string_ostream os(buf); 4670b57cec5SDimitry Andric 4680b57cec5SDimitry Andric unwrap(M)->print(os, nullptr); 4690b57cec5SDimitry Andric os.flush(); 4700b57cec5SDimitry Andric 4710b57cec5SDimitry Andric return strdup(buf.c_str()); 4720b57cec5SDimitry Andric } 4730b57cec5SDimitry Andric 4740b57cec5SDimitry Andric /*--.. Operations on inline assembler ......................................--*/ 4750b57cec5SDimitry Andric void LLVMSetModuleInlineAsm2(LLVMModuleRef M, const char *Asm, size_t Len) { 4760b57cec5SDimitry Andric unwrap(M)->setModuleInlineAsm(StringRef(Asm, Len)); 4770b57cec5SDimitry Andric } 4780b57cec5SDimitry Andric 4790b57cec5SDimitry Andric void LLVMSetModuleInlineAsm(LLVMModuleRef M, const char *Asm) { 4800b57cec5SDimitry Andric unwrap(M)->setModuleInlineAsm(StringRef(Asm)); 4810b57cec5SDimitry Andric } 4820b57cec5SDimitry Andric 4830b57cec5SDimitry Andric void LLVMAppendModuleInlineAsm(LLVMModuleRef M, const char *Asm, size_t Len) { 4840b57cec5SDimitry Andric unwrap(M)->appendModuleInlineAsm(StringRef(Asm, Len)); 4850b57cec5SDimitry Andric } 4860b57cec5SDimitry Andric 4870b57cec5SDimitry Andric const char *LLVMGetModuleInlineAsm(LLVMModuleRef M, size_t *Len) { 4880b57cec5SDimitry Andric auto &Str = unwrap(M)->getModuleInlineAsm(); 4890b57cec5SDimitry Andric *Len = Str.length(); 4900b57cec5SDimitry Andric return Str.c_str(); 4910b57cec5SDimitry Andric } 4920b57cec5SDimitry Andric 4935f757f3fSDimitry Andric LLVMValueRef LLVMGetInlineAsm(LLVMTypeRef Ty, const char *AsmString, 4945f757f3fSDimitry Andric size_t AsmStringSize, const char *Constraints, 495fe6060f1SDimitry Andric size_t ConstraintsSize, LLVMBool HasSideEffects, 496fe6060f1SDimitry Andric LLVMBool IsAlignStack, 497fe6060f1SDimitry Andric LLVMInlineAsmDialect Dialect, LLVMBool CanThrow) { 4980b57cec5SDimitry Andric InlineAsm::AsmDialect AD; 4990b57cec5SDimitry Andric switch (Dialect) { 5000b57cec5SDimitry Andric case LLVMInlineAsmDialectATT: 5010b57cec5SDimitry Andric AD = InlineAsm::AD_ATT; 5020b57cec5SDimitry Andric break; 5030b57cec5SDimitry Andric case LLVMInlineAsmDialectIntel: 5040b57cec5SDimitry Andric AD = InlineAsm::AD_Intel; 5050b57cec5SDimitry Andric break; 5060b57cec5SDimitry Andric } 5070b57cec5SDimitry Andric return wrap(InlineAsm::get(unwrap<FunctionType>(Ty), 5080b57cec5SDimitry Andric StringRef(AsmString, AsmStringSize), 5090b57cec5SDimitry Andric StringRef(Constraints, ConstraintsSize), 510fe6060f1SDimitry Andric HasSideEffects, IsAlignStack, AD, CanThrow)); 5110b57cec5SDimitry Andric } 5120b57cec5SDimitry Andric 5135f757f3fSDimitry Andric const char *LLVMGetInlineAsmAsmString(LLVMValueRef InlineAsmVal, size_t *Len) { 5145f757f3fSDimitry Andric 5155f757f3fSDimitry Andric Value *Val = unwrap<Value>(InlineAsmVal); 5165f757f3fSDimitry Andric const std::string &AsmString = cast<InlineAsm>(Val)->getAsmString(); 5175f757f3fSDimitry Andric 5185f757f3fSDimitry Andric *Len = AsmString.length(); 5195f757f3fSDimitry Andric return AsmString.c_str(); 5205f757f3fSDimitry Andric } 5215f757f3fSDimitry Andric 5225f757f3fSDimitry Andric const char *LLVMGetInlineAsmConstraintString(LLVMValueRef InlineAsmVal, 5235f757f3fSDimitry Andric size_t *Len) { 5245f757f3fSDimitry Andric Value *Val = unwrap<Value>(InlineAsmVal); 5255f757f3fSDimitry Andric const std::string &ConstraintString = 5265f757f3fSDimitry Andric cast<InlineAsm>(Val)->getConstraintString(); 5275f757f3fSDimitry Andric 5285f757f3fSDimitry Andric *Len = ConstraintString.length(); 5295f757f3fSDimitry Andric return ConstraintString.c_str(); 5305f757f3fSDimitry Andric } 5315f757f3fSDimitry Andric 5325f757f3fSDimitry Andric LLVMInlineAsmDialect LLVMGetInlineAsmDialect(LLVMValueRef InlineAsmVal) { 5335f757f3fSDimitry Andric 5345f757f3fSDimitry Andric Value *Val = unwrap<Value>(InlineAsmVal); 5355f757f3fSDimitry Andric InlineAsm::AsmDialect Dialect = cast<InlineAsm>(Val)->getDialect(); 5365f757f3fSDimitry Andric 5375f757f3fSDimitry Andric switch (Dialect) { 5385f757f3fSDimitry Andric case InlineAsm::AD_ATT: 5395f757f3fSDimitry Andric return LLVMInlineAsmDialectATT; 5405f757f3fSDimitry Andric case InlineAsm::AD_Intel: 5415f757f3fSDimitry Andric return LLVMInlineAsmDialectIntel; 5425f757f3fSDimitry Andric } 5435f757f3fSDimitry Andric 5445f757f3fSDimitry Andric llvm_unreachable("Unrecognized inline assembly dialect"); 5455f757f3fSDimitry Andric return LLVMInlineAsmDialectATT; 5465f757f3fSDimitry Andric } 5475f757f3fSDimitry Andric 5485f757f3fSDimitry Andric LLVMTypeRef LLVMGetInlineAsmFunctionType(LLVMValueRef InlineAsmVal) { 5495f757f3fSDimitry Andric Value *Val = unwrap<Value>(InlineAsmVal); 5505f757f3fSDimitry Andric return (LLVMTypeRef)cast<InlineAsm>(Val)->getFunctionType(); 5515f757f3fSDimitry Andric } 5525f757f3fSDimitry Andric 5535f757f3fSDimitry Andric LLVMBool LLVMGetInlineAsmHasSideEffects(LLVMValueRef InlineAsmVal) { 5545f757f3fSDimitry Andric Value *Val = unwrap<Value>(InlineAsmVal); 5555f757f3fSDimitry Andric return cast<InlineAsm>(Val)->hasSideEffects(); 5565f757f3fSDimitry Andric } 5575f757f3fSDimitry Andric 5585f757f3fSDimitry Andric LLVMBool LLVMGetInlineAsmNeedsAlignedStack(LLVMValueRef InlineAsmVal) { 5595f757f3fSDimitry Andric Value *Val = unwrap<Value>(InlineAsmVal); 5605f757f3fSDimitry Andric return cast<InlineAsm>(Val)->isAlignStack(); 5615f757f3fSDimitry Andric } 5625f757f3fSDimitry Andric 5635f757f3fSDimitry Andric LLVMBool LLVMGetInlineAsmCanUnwind(LLVMValueRef InlineAsmVal) { 5645f757f3fSDimitry Andric Value *Val = unwrap<Value>(InlineAsmVal); 5655f757f3fSDimitry Andric return cast<InlineAsm>(Val)->canThrow(); 5665f757f3fSDimitry Andric } 5675f757f3fSDimitry Andric 5680b57cec5SDimitry Andric /*--.. Operations on module contexts ......................................--*/ 5690b57cec5SDimitry Andric LLVMContextRef LLVMGetModuleContext(LLVMModuleRef M) { 5700b57cec5SDimitry Andric return wrap(&unwrap(M)->getContext()); 5710b57cec5SDimitry Andric } 5720b57cec5SDimitry Andric 5730b57cec5SDimitry Andric 5740b57cec5SDimitry Andric /*===-- Operations on types -----------------------------------------------===*/ 5750b57cec5SDimitry Andric 5760b57cec5SDimitry Andric /*--.. Operations on all types (mostly) ....................................--*/ 5770b57cec5SDimitry Andric 5780b57cec5SDimitry Andric LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty) { 5790b57cec5SDimitry Andric switch (unwrap(Ty)->getTypeID()) { 5800b57cec5SDimitry Andric case Type::VoidTyID: 5810b57cec5SDimitry Andric return LLVMVoidTypeKind; 5820b57cec5SDimitry Andric case Type::HalfTyID: 5830b57cec5SDimitry Andric return LLVMHalfTypeKind; 5845ffd83dbSDimitry Andric case Type::BFloatTyID: 5855ffd83dbSDimitry Andric return LLVMBFloatTypeKind; 5860b57cec5SDimitry Andric case Type::FloatTyID: 5870b57cec5SDimitry Andric return LLVMFloatTypeKind; 5880b57cec5SDimitry Andric case Type::DoubleTyID: 5890b57cec5SDimitry Andric return LLVMDoubleTypeKind; 5900b57cec5SDimitry Andric case Type::X86_FP80TyID: 5910b57cec5SDimitry Andric return LLVMX86_FP80TypeKind; 5920b57cec5SDimitry Andric case Type::FP128TyID: 5930b57cec5SDimitry Andric return LLVMFP128TypeKind; 5940b57cec5SDimitry Andric case Type::PPC_FP128TyID: 5950b57cec5SDimitry Andric return LLVMPPC_FP128TypeKind; 5960b57cec5SDimitry Andric case Type::LabelTyID: 5970b57cec5SDimitry Andric return LLVMLabelTypeKind; 5980b57cec5SDimitry Andric case Type::MetadataTyID: 5990b57cec5SDimitry Andric return LLVMMetadataTypeKind; 6000b57cec5SDimitry Andric case Type::IntegerTyID: 6010b57cec5SDimitry Andric return LLVMIntegerTypeKind; 6020b57cec5SDimitry Andric case Type::FunctionTyID: 6030b57cec5SDimitry Andric return LLVMFunctionTypeKind; 6040b57cec5SDimitry Andric case Type::StructTyID: 6050b57cec5SDimitry Andric return LLVMStructTypeKind; 6060b57cec5SDimitry Andric case Type::ArrayTyID: 6070b57cec5SDimitry Andric return LLVMArrayTypeKind; 6080b57cec5SDimitry Andric case Type::PointerTyID: 6090b57cec5SDimitry Andric return LLVMPointerTypeKind; 6105ffd83dbSDimitry Andric case Type::FixedVectorTyID: 6110b57cec5SDimitry Andric return LLVMVectorTypeKind; 6120b57cec5SDimitry Andric case Type::X86_MMXTyID: 6130b57cec5SDimitry Andric return LLVMX86_MMXTypeKind; 614e8d8bef9SDimitry Andric case Type::X86_AMXTyID: 615e8d8bef9SDimitry Andric return LLVMX86_AMXTypeKind; 6160b57cec5SDimitry Andric case Type::TokenTyID: 6170b57cec5SDimitry Andric return LLVMTokenTypeKind; 6185ffd83dbSDimitry Andric case Type::ScalableVectorTyID: 6195ffd83dbSDimitry Andric return LLVMScalableVectorTypeKind; 620bdd1243dSDimitry Andric case Type::TargetExtTyID: 621bdd1243dSDimitry Andric return LLVMTargetExtTypeKind; 622bdd1243dSDimitry Andric case Type::TypedPointerTyID: 623bdd1243dSDimitry Andric llvm_unreachable("Typed pointers are unsupported via the C API"); 6240b57cec5SDimitry Andric } 6250b57cec5SDimitry Andric llvm_unreachable("Unhandled TypeID."); 6260b57cec5SDimitry Andric } 6270b57cec5SDimitry Andric 6280b57cec5SDimitry Andric LLVMBool LLVMTypeIsSized(LLVMTypeRef Ty) 6290b57cec5SDimitry Andric { 6300b57cec5SDimitry Andric return unwrap(Ty)->isSized(); 6310b57cec5SDimitry Andric } 6320b57cec5SDimitry Andric 6330b57cec5SDimitry Andric LLVMContextRef LLVMGetTypeContext(LLVMTypeRef Ty) { 6340b57cec5SDimitry Andric return wrap(&unwrap(Ty)->getContext()); 6350b57cec5SDimitry Andric } 6360b57cec5SDimitry Andric 6370b57cec5SDimitry Andric void LLVMDumpType(LLVMTypeRef Ty) { 6380b57cec5SDimitry Andric return unwrap(Ty)->print(errs(), /*IsForDebug=*/true); 6390b57cec5SDimitry Andric } 6400b57cec5SDimitry Andric 6410b57cec5SDimitry Andric char *LLVMPrintTypeToString(LLVMTypeRef Ty) { 6420b57cec5SDimitry Andric std::string buf; 6430b57cec5SDimitry Andric raw_string_ostream os(buf); 6440b57cec5SDimitry Andric 6450b57cec5SDimitry Andric if (unwrap(Ty)) 6460b57cec5SDimitry Andric unwrap(Ty)->print(os); 6470b57cec5SDimitry Andric else 6480b57cec5SDimitry Andric os << "Printing <null> Type"; 6490b57cec5SDimitry Andric 6500b57cec5SDimitry Andric os.flush(); 6510b57cec5SDimitry Andric 6520b57cec5SDimitry Andric return strdup(buf.c_str()); 6530b57cec5SDimitry Andric } 6540b57cec5SDimitry Andric 6550b57cec5SDimitry Andric /*--.. Operations on integer types .........................................--*/ 6560b57cec5SDimitry Andric 6570b57cec5SDimitry Andric LLVMTypeRef LLVMInt1TypeInContext(LLVMContextRef C) { 6580b57cec5SDimitry Andric return (LLVMTypeRef) Type::getInt1Ty(*unwrap(C)); 6590b57cec5SDimitry Andric } 6600b57cec5SDimitry Andric LLVMTypeRef LLVMInt8TypeInContext(LLVMContextRef C) { 6610b57cec5SDimitry Andric return (LLVMTypeRef) Type::getInt8Ty(*unwrap(C)); 6620b57cec5SDimitry Andric } 6630b57cec5SDimitry Andric LLVMTypeRef LLVMInt16TypeInContext(LLVMContextRef C) { 6640b57cec5SDimitry Andric return (LLVMTypeRef) Type::getInt16Ty(*unwrap(C)); 6650b57cec5SDimitry Andric } 6660b57cec5SDimitry Andric LLVMTypeRef LLVMInt32TypeInContext(LLVMContextRef C) { 6670b57cec5SDimitry Andric return (LLVMTypeRef) Type::getInt32Ty(*unwrap(C)); 6680b57cec5SDimitry Andric } 6690b57cec5SDimitry Andric LLVMTypeRef LLVMInt64TypeInContext(LLVMContextRef C) { 6700b57cec5SDimitry Andric return (LLVMTypeRef) Type::getInt64Ty(*unwrap(C)); 6710b57cec5SDimitry Andric } 6720b57cec5SDimitry Andric LLVMTypeRef LLVMInt128TypeInContext(LLVMContextRef C) { 6730b57cec5SDimitry Andric return (LLVMTypeRef) Type::getInt128Ty(*unwrap(C)); 6740b57cec5SDimitry Andric } 6750b57cec5SDimitry Andric LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits) { 6760b57cec5SDimitry Andric return wrap(IntegerType::get(*unwrap(C), NumBits)); 6770b57cec5SDimitry Andric } 6780b57cec5SDimitry Andric 6790b57cec5SDimitry Andric LLVMTypeRef LLVMInt1Type(void) { 6800b57cec5SDimitry Andric return LLVMInt1TypeInContext(LLVMGetGlobalContext()); 6810b57cec5SDimitry Andric } 6820b57cec5SDimitry Andric LLVMTypeRef LLVMInt8Type(void) { 6830b57cec5SDimitry Andric return LLVMInt8TypeInContext(LLVMGetGlobalContext()); 6840b57cec5SDimitry Andric } 6850b57cec5SDimitry Andric LLVMTypeRef LLVMInt16Type(void) { 6860b57cec5SDimitry Andric return LLVMInt16TypeInContext(LLVMGetGlobalContext()); 6870b57cec5SDimitry Andric } 6880b57cec5SDimitry Andric LLVMTypeRef LLVMInt32Type(void) { 6890b57cec5SDimitry Andric return LLVMInt32TypeInContext(LLVMGetGlobalContext()); 6900b57cec5SDimitry Andric } 6910b57cec5SDimitry Andric LLVMTypeRef LLVMInt64Type(void) { 6920b57cec5SDimitry Andric return LLVMInt64TypeInContext(LLVMGetGlobalContext()); 6930b57cec5SDimitry Andric } 6940b57cec5SDimitry Andric LLVMTypeRef LLVMInt128Type(void) { 6950b57cec5SDimitry Andric return LLVMInt128TypeInContext(LLVMGetGlobalContext()); 6960b57cec5SDimitry Andric } 6970b57cec5SDimitry Andric LLVMTypeRef LLVMIntType(unsigned NumBits) { 6980b57cec5SDimitry Andric return LLVMIntTypeInContext(LLVMGetGlobalContext(), NumBits); 6990b57cec5SDimitry Andric } 7000b57cec5SDimitry Andric 7010b57cec5SDimitry Andric unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy) { 7020b57cec5SDimitry Andric return unwrap<IntegerType>(IntegerTy)->getBitWidth(); 7030b57cec5SDimitry Andric } 7040b57cec5SDimitry Andric 7050b57cec5SDimitry Andric /*--.. Operations on real types ............................................--*/ 7060b57cec5SDimitry Andric 7070b57cec5SDimitry Andric LLVMTypeRef LLVMHalfTypeInContext(LLVMContextRef C) { 7080b57cec5SDimitry Andric return (LLVMTypeRef) Type::getHalfTy(*unwrap(C)); 7090b57cec5SDimitry Andric } 7105ffd83dbSDimitry Andric LLVMTypeRef LLVMBFloatTypeInContext(LLVMContextRef C) { 7115ffd83dbSDimitry Andric return (LLVMTypeRef) Type::getBFloatTy(*unwrap(C)); 7125ffd83dbSDimitry Andric } 7130b57cec5SDimitry Andric LLVMTypeRef LLVMFloatTypeInContext(LLVMContextRef C) { 7140b57cec5SDimitry Andric return (LLVMTypeRef) Type::getFloatTy(*unwrap(C)); 7150b57cec5SDimitry Andric } 7160b57cec5SDimitry Andric LLVMTypeRef LLVMDoubleTypeInContext(LLVMContextRef C) { 7170b57cec5SDimitry Andric return (LLVMTypeRef) Type::getDoubleTy(*unwrap(C)); 7180b57cec5SDimitry Andric } 7190b57cec5SDimitry Andric LLVMTypeRef LLVMX86FP80TypeInContext(LLVMContextRef C) { 7200b57cec5SDimitry Andric return (LLVMTypeRef) Type::getX86_FP80Ty(*unwrap(C)); 7210b57cec5SDimitry Andric } 7220b57cec5SDimitry Andric LLVMTypeRef LLVMFP128TypeInContext(LLVMContextRef C) { 7230b57cec5SDimitry Andric return (LLVMTypeRef) Type::getFP128Ty(*unwrap(C)); 7240b57cec5SDimitry Andric } 7250b57cec5SDimitry Andric LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C) { 7260b57cec5SDimitry Andric return (LLVMTypeRef) Type::getPPC_FP128Ty(*unwrap(C)); 7270b57cec5SDimitry Andric } 7280b57cec5SDimitry Andric LLVMTypeRef LLVMX86MMXTypeInContext(LLVMContextRef C) { 7290b57cec5SDimitry Andric return (LLVMTypeRef) Type::getX86_MMXTy(*unwrap(C)); 7300b57cec5SDimitry Andric } 731e8d8bef9SDimitry Andric LLVMTypeRef LLVMX86AMXTypeInContext(LLVMContextRef C) { 732e8d8bef9SDimitry Andric return (LLVMTypeRef) Type::getX86_AMXTy(*unwrap(C)); 733e8d8bef9SDimitry Andric } 7340b57cec5SDimitry Andric 7350b57cec5SDimitry Andric LLVMTypeRef LLVMHalfType(void) { 7360b57cec5SDimitry Andric return LLVMHalfTypeInContext(LLVMGetGlobalContext()); 7370b57cec5SDimitry Andric } 7385ffd83dbSDimitry Andric LLVMTypeRef LLVMBFloatType(void) { 7395ffd83dbSDimitry Andric return LLVMBFloatTypeInContext(LLVMGetGlobalContext()); 7405ffd83dbSDimitry Andric } 7410b57cec5SDimitry Andric LLVMTypeRef LLVMFloatType(void) { 7420b57cec5SDimitry Andric return LLVMFloatTypeInContext(LLVMGetGlobalContext()); 7430b57cec5SDimitry Andric } 7440b57cec5SDimitry Andric LLVMTypeRef LLVMDoubleType(void) { 7450b57cec5SDimitry Andric return LLVMDoubleTypeInContext(LLVMGetGlobalContext()); 7460b57cec5SDimitry Andric } 7470b57cec5SDimitry Andric LLVMTypeRef LLVMX86FP80Type(void) { 7480b57cec5SDimitry Andric return LLVMX86FP80TypeInContext(LLVMGetGlobalContext()); 7490b57cec5SDimitry Andric } 7500b57cec5SDimitry Andric LLVMTypeRef LLVMFP128Type(void) { 7510b57cec5SDimitry Andric return LLVMFP128TypeInContext(LLVMGetGlobalContext()); 7520b57cec5SDimitry Andric } 7530b57cec5SDimitry Andric LLVMTypeRef LLVMPPCFP128Type(void) { 7540b57cec5SDimitry Andric return LLVMPPCFP128TypeInContext(LLVMGetGlobalContext()); 7550b57cec5SDimitry Andric } 7560b57cec5SDimitry Andric LLVMTypeRef LLVMX86MMXType(void) { 7570b57cec5SDimitry Andric return LLVMX86MMXTypeInContext(LLVMGetGlobalContext()); 7580b57cec5SDimitry Andric } 759e8d8bef9SDimitry Andric LLVMTypeRef LLVMX86AMXType(void) { 760e8d8bef9SDimitry Andric return LLVMX86AMXTypeInContext(LLVMGetGlobalContext()); 761e8d8bef9SDimitry Andric } 7620b57cec5SDimitry Andric 7630b57cec5SDimitry Andric /*--.. Operations on function types ........................................--*/ 7640b57cec5SDimitry Andric 7650b57cec5SDimitry Andric LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType, 7660b57cec5SDimitry Andric LLVMTypeRef *ParamTypes, unsigned ParamCount, 7670b57cec5SDimitry Andric LLVMBool IsVarArg) { 7680b57cec5SDimitry Andric ArrayRef<Type*> Tys(unwrap(ParamTypes), ParamCount); 7690b57cec5SDimitry Andric return wrap(FunctionType::get(unwrap(ReturnType), Tys, IsVarArg != 0)); 7700b57cec5SDimitry Andric } 7710b57cec5SDimitry Andric 7720b57cec5SDimitry Andric LLVMBool LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy) { 7730b57cec5SDimitry Andric return unwrap<FunctionType>(FunctionTy)->isVarArg(); 7740b57cec5SDimitry Andric } 7750b57cec5SDimitry Andric 7760b57cec5SDimitry Andric LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy) { 7770b57cec5SDimitry Andric return wrap(unwrap<FunctionType>(FunctionTy)->getReturnType()); 7780b57cec5SDimitry Andric } 7790b57cec5SDimitry Andric 7800b57cec5SDimitry Andric unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy) { 7810b57cec5SDimitry Andric return unwrap<FunctionType>(FunctionTy)->getNumParams(); 7820b57cec5SDimitry Andric } 7830b57cec5SDimitry Andric 7840b57cec5SDimitry Andric void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest) { 7850b57cec5SDimitry Andric FunctionType *Ty = unwrap<FunctionType>(FunctionTy); 786fe6060f1SDimitry Andric for (Type *T : Ty->params()) 787fe6060f1SDimitry Andric *Dest++ = wrap(T); 7880b57cec5SDimitry Andric } 7890b57cec5SDimitry Andric 7900b57cec5SDimitry Andric /*--.. Operations on struct types ..........................................--*/ 7910b57cec5SDimitry Andric 7920b57cec5SDimitry Andric LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes, 7930b57cec5SDimitry Andric unsigned ElementCount, LLVMBool Packed) { 7940b57cec5SDimitry Andric ArrayRef<Type*> Tys(unwrap(ElementTypes), ElementCount); 7950b57cec5SDimitry Andric return wrap(StructType::get(*unwrap(C), Tys, Packed != 0)); 7960b57cec5SDimitry Andric } 7970b57cec5SDimitry Andric 7980b57cec5SDimitry Andric LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, 7990b57cec5SDimitry Andric unsigned ElementCount, LLVMBool Packed) { 8000b57cec5SDimitry Andric return LLVMStructTypeInContext(LLVMGetGlobalContext(), ElementTypes, 8010b57cec5SDimitry Andric ElementCount, Packed); 8020b57cec5SDimitry Andric } 8030b57cec5SDimitry Andric 8040b57cec5SDimitry Andric LLVMTypeRef LLVMStructCreateNamed(LLVMContextRef C, const char *Name) 8050b57cec5SDimitry Andric { 8060b57cec5SDimitry Andric return wrap(StructType::create(*unwrap(C), Name)); 8070b57cec5SDimitry Andric } 8080b57cec5SDimitry Andric 8090b57cec5SDimitry Andric const char *LLVMGetStructName(LLVMTypeRef Ty) 8100b57cec5SDimitry Andric { 8110b57cec5SDimitry Andric StructType *Type = unwrap<StructType>(Ty); 8120b57cec5SDimitry Andric if (!Type->hasName()) 8130b57cec5SDimitry Andric return nullptr; 8140b57cec5SDimitry Andric return Type->getName().data(); 8150b57cec5SDimitry Andric } 8160b57cec5SDimitry Andric 8170b57cec5SDimitry Andric void LLVMStructSetBody(LLVMTypeRef StructTy, LLVMTypeRef *ElementTypes, 8180b57cec5SDimitry Andric unsigned ElementCount, LLVMBool Packed) { 8190b57cec5SDimitry Andric ArrayRef<Type*> Tys(unwrap(ElementTypes), ElementCount); 8200b57cec5SDimitry Andric unwrap<StructType>(StructTy)->setBody(Tys, Packed != 0); 8210b57cec5SDimitry Andric } 8220b57cec5SDimitry Andric 8230b57cec5SDimitry Andric unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy) { 8240b57cec5SDimitry Andric return unwrap<StructType>(StructTy)->getNumElements(); 8250b57cec5SDimitry Andric } 8260b57cec5SDimitry Andric 8270b57cec5SDimitry Andric void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest) { 8280b57cec5SDimitry Andric StructType *Ty = unwrap<StructType>(StructTy); 829fe6060f1SDimitry Andric for (Type *T : Ty->elements()) 830fe6060f1SDimitry Andric *Dest++ = wrap(T); 8310b57cec5SDimitry Andric } 8320b57cec5SDimitry Andric 8330b57cec5SDimitry Andric LLVMTypeRef LLVMStructGetTypeAtIndex(LLVMTypeRef StructTy, unsigned i) { 8340b57cec5SDimitry Andric StructType *Ty = unwrap<StructType>(StructTy); 8350b57cec5SDimitry Andric return wrap(Ty->getTypeAtIndex(i)); 8360b57cec5SDimitry Andric } 8370b57cec5SDimitry Andric 8380b57cec5SDimitry Andric LLVMBool LLVMIsPackedStruct(LLVMTypeRef StructTy) { 8390b57cec5SDimitry Andric return unwrap<StructType>(StructTy)->isPacked(); 8400b57cec5SDimitry Andric } 8410b57cec5SDimitry Andric 8420b57cec5SDimitry Andric LLVMBool LLVMIsOpaqueStruct(LLVMTypeRef StructTy) { 8430b57cec5SDimitry Andric return unwrap<StructType>(StructTy)->isOpaque(); 8440b57cec5SDimitry Andric } 8450b57cec5SDimitry Andric 8460b57cec5SDimitry Andric LLVMBool LLVMIsLiteralStruct(LLVMTypeRef StructTy) { 8470b57cec5SDimitry Andric return unwrap<StructType>(StructTy)->isLiteral(); 8480b57cec5SDimitry Andric } 8490b57cec5SDimitry Andric 8500b57cec5SDimitry Andric LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name) { 851e8d8bef9SDimitry Andric return wrap(StructType::getTypeByName(unwrap(M)->getContext(), Name)); 852e8d8bef9SDimitry Andric } 853e8d8bef9SDimitry Andric 854e8d8bef9SDimitry Andric LLVMTypeRef LLVMGetTypeByName2(LLVMContextRef C, const char *Name) { 855e8d8bef9SDimitry Andric return wrap(StructType::getTypeByName(*unwrap(C), Name)); 8560b57cec5SDimitry Andric } 8570b57cec5SDimitry Andric 8580b57cec5SDimitry Andric /*--.. Operations on array, pointer, and vector types (sequence types) .....--*/ 8590b57cec5SDimitry Andric 8600b57cec5SDimitry Andric void LLVMGetSubtypes(LLVMTypeRef Tp, LLVMTypeRef *Arr) { 8610b57cec5SDimitry Andric int i = 0; 8620b57cec5SDimitry Andric for (auto *T : unwrap(Tp)->subtypes()) { 8630b57cec5SDimitry Andric Arr[i] = wrap(T); 8640b57cec5SDimitry Andric i++; 8650b57cec5SDimitry Andric } 8660b57cec5SDimitry Andric } 8670b57cec5SDimitry Andric 8680b57cec5SDimitry Andric LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount) { 8690b57cec5SDimitry Andric return wrap(ArrayType::get(unwrap(ElementType), ElementCount)); 8700b57cec5SDimitry Andric } 8710b57cec5SDimitry Andric 87206c3fb27SDimitry Andric LLVMTypeRef LLVMArrayType2(LLVMTypeRef ElementType, uint64_t ElementCount) { 87306c3fb27SDimitry Andric return wrap(ArrayType::get(unwrap(ElementType), ElementCount)); 87406c3fb27SDimitry Andric } 87506c3fb27SDimitry Andric 8760b57cec5SDimitry Andric LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace) { 8770b57cec5SDimitry Andric return wrap(PointerType::get(unwrap(ElementType), AddressSpace)); 8780b57cec5SDimitry Andric } 8790b57cec5SDimitry Andric 88081ad6265SDimitry Andric LLVMBool LLVMPointerTypeIsOpaque(LLVMTypeRef Ty) { 88106c3fb27SDimitry Andric return true; 88281ad6265SDimitry Andric } 88381ad6265SDimitry Andric 8840b57cec5SDimitry Andric LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount) { 8855ffd83dbSDimitry Andric return wrap(FixedVectorType::get(unwrap(ElementType), ElementCount)); 8860b57cec5SDimitry Andric } 8870b57cec5SDimitry Andric 888e8d8bef9SDimitry Andric LLVMTypeRef LLVMScalableVectorType(LLVMTypeRef ElementType, 889e8d8bef9SDimitry Andric unsigned ElementCount) { 890e8d8bef9SDimitry Andric return wrap(ScalableVectorType::get(unwrap(ElementType), ElementCount)); 891e8d8bef9SDimitry Andric } 892e8d8bef9SDimitry Andric 8930b57cec5SDimitry Andric LLVMTypeRef LLVMGetElementType(LLVMTypeRef WrappedTy) { 894bdd1243dSDimitry Andric auto *Ty = unwrap(WrappedTy); 8955ffd83dbSDimitry Andric if (auto *ATy = dyn_cast<ArrayType>(Ty)) 8965ffd83dbSDimitry Andric return wrap(ATy->getElementType()); 8975ffd83dbSDimitry Andric return wrap(cast<VectorType>(Ty)->getElementType()); 8980b57cec5SDimitry Andric } 8990b57cec5SDimitry Andric 9000b57cec5SDimitry Andric unsigned LLVMGetNumContainedTypes(LLVMTypeRef Tp) { 9010b57cec5SDimitry Andric return unwrap(Tp)->getNumContainedTypes(); 9020b57cec5SDimitry Andric } 9030b57cec5SDimitry Andric 9040b57cec5SDimitry Andric unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy) { 9050b57cec5SDimitry Andric return unwrap<ArrayType>(ArrayTy)->getNumElements(); 9060b57cec5SDimitry Andric } 9070b57cec5SDimitry Andric 90806c3fb27SDimitry Andric uint64_t LLVMGetArrayLength2(LLVMTypeRef ArrayTy) { 90906c3fb27SDimitry Andric return unwrap<ArrayType>(ArrayTy)->getNumElements(); 91006c3fb27SDimitry Andric } 91106c3fb27SDimitry Andric 9120b57cec5SDimitry Andric unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy) { 9130b57cec5SDimitry Andric return unwrap<PointerType>(PointerTy)->getAddressSpace(); 9140b57cec5SDimitry Andric } 9150b57cec5SDimitry Andric 9160b57cec5SDimitry Andric unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy) { 917e8d8bef9SDimitry Andric return unwrap<VectorType>(VectorTy)->getElementCount().getKnownMinValue(); 9180b57cec5SDimitry Andric } 9190b57cec5SDimitry Andric 920*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetConstantPtrAuthPointer(LLVMValueRef PtrAuth) { 921*0fca6ea1SDimitry Andric return wrap(unwrap<ConstantPtrAuth>(PtrAuth)->getPointer()); 922*0fca6ea1SDimitry Andric } 923*0fca6ea1SDimitry Andric 924*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetConstantPtrAuthKey(LLVMValueRef PtrAuth) { 925*0fca6ea1SDimitry Andric return wrap(unwrap<ConstantPtrAuth>(PtrAuth)->getKey()); 926*0fca6ea1SDimitry Andric } 927*0fca6ea1SDimitry Andric 928*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetConstantPtrAuthDiscriminator(LLVMValueRef PtrAuth) { 929*0fca6ea1SDimitry Andric return wrap(unwrap<ConstantPtrAuth>(PtrAuth)->getDiscriminator()); 930*0fca6ea1SDimitry Andric } 931*0fca6ea1SDimitry Andric 932*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetConstantPtrAuthAddrDiscriminator(LLVMValueRef PtrAuth) { 933*0fca6ea1SDimitry Andric return wrap(unwrap<ConstantPtrAuth>(PtrAuth)->getAddrDiscriminator()); 934*0fca6ea1SDimitry Andric } 935*0fca6ea1SDimitry Andric 9360b57cec5SDimitry Andric /*--.. Operations on other types ...........................................--*/ 9370b57cec5SDimitry Andric 93881ad6265SDimitry Andric LLVMTypeRef LLVMPointerTypeInContext(LLVMContextRef C, unsigned AddressSpace) { 93981ad6265SDimitry Andric return wrap(PointerType::get(*unwrap(C), AddressSpace)); 94081ad6265SDimitry Andric } 94181ad6265SDimitry Andric 9420b57cec5SDimitry Andric LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C) { 9430b57cec5SDimitry Andric return wrap(Type::getVoidTy(*unwrap(C))); 9440b57cec5SDimitry Andric } 9450b57cec5SDimitry Andric LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C) { 9460b57cec5SDimitry Andric return wrap(Type::getLabelTy(*unwrap(C))); 9470b57cec5SDimitry Andric } 9480b57cec5SDimitry Andric LLVMTypeRef LLVMTokenTypeInContext(LLVMContextRef C) { 9490b57cec5SDimitry Andric return wrap(Type::getTokenTy(*unwrap(C))); 9500b57cec5SDimitry Andric } 9510b57cec5SDimitry Andric LLVMTypeRef LLVMMetadataTypeInContext(LLVMContextRef C) { 9520b57cec5SDimitry Andric return wrap(Type::getMetadataTy(*unwrap(C))); 9530b57cec5SDimitry Andric } 9540b57cec5SDimitry Andric 9550b57cec5SDimitry Andric LLVMTypeRef LLVMVoidType(void) { 9560b57cec5SDimitry Andric return LLVMVoidTypeInContext(LLVMGetGlobalContext()); 9570b57cec5SDimitry Andric } 9580b57cec5SDimitry Andric LLVMTypeRef LLVMLabelType(void) { 9590b57cec5SDimitry Andric return LLVMLabelTypeInContext(LLVMGetGlobalContext()); 9600b57cec5SDimitry Andric } 9610b57cec5SDimitry Andric 962bdd1243dSDimitry Andric LLVMTypeRef LLVMTargetExtTypeInContext(LLVMContextRef C, const char *Name, 963bdd1243dSDimitry Andric LLVMTypeRef *TypeParams, 964bdd1243dSDimitry Andric unsigned TypeParamCount, 965bdd1243dSDimitry Andric unsigned *IntParams, 966bdd1243dSDimitry Andric unsigned IntParamCount) { 967bdd1243dSDimitry Andric ArrayRef<Type *> TypeParamArray(unwrap(TypeParams), TypeParamCount); 968bdd1243dSDimitry Andric ArrayRef<unsigned> IntParamArray(IntParams, IntParamCount); 969bdd1243dSDimitry Andric return wrap( 970bdd1243dSDimitry Andric TargetExtType::get(*unwrap(C), Name, TypeParamArray, IntParamArray)); 971bdd1243dSDimitry Andric } 972bdd1243dSDimitry Andric 973*0fca6ea1SDimitry Andric const char *LLVMGetTargetExtTypeName(LLVMTypeRef TargetExtTy) { 974*0fca6ea1SDimitry Andric TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy); 975*0fca6ea1SDimitry Andric return Type->getName().data(); 976*0fca6ea1SDimitry Andric } 977*0fca6ea1SDimitry Andric 978*0fca6ea1SDimitry Andric unsigned LLVMGetTargetExtTypeNumTypeParams(LLVMTypeRef TargetExtTy) { 979*0fca6ea1SDimitry Andric TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy); 980*0fca6ea1SDimitry Andric return Type->getNumTypeParameters(); 981*0fca6ea1SDimitry Andric } 982*0fca6ea1SDimitry Andric 983*0fca6ea1SDimitry Andric LLVMTypeRef LLVMGetTargetExtTypeTypeParam(LLVMTypeRef TargetExtTy, 984*0fca6ea1SDimitry Andric unsigned Idx) { 985*0fca6ea1SDimitry Andric TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy); 986*0fca6ea1SDimitry Andric return wrap(Type->getTypeParameter(Idx)); 987*0fca6ea1SDimitry Andric } 988*0fca6ea1SDimitry Andric 989*0fca6ea1SDimitry Andric unsigned LLVMGetTargetExtTypeNumIntParams(LLVMTypeRef TargetExtTy) { 990*0fca6ea1SDimitry Andric TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy); 991*0fca6ea1SDimitry Andric return Type->getNumIntParameters(); 992*0fca6ea1SDimitry Andric } 993*0fca6ea1SDimitry Andric 994*0fca6ea1SDimitry Andric unsigned LLVMGetTargetExtTypeIntParam(LLVMTypeRef TargetExtTy, unsigned Idx) { 995*0fca6ea1SDimitry Andric TargetExtType *Type = unwrap<TargetExtType>(TargetExtTy); 996*0fca6ea1SDimitry Andric return Type->getIntParameter(Idx); 997*0fca6ea1SDimitry Andric } 998*0fca6ea1SDimitry Andric 9990b57cec5SDimitry Andric /*===-- Operations on values ----------------------------------------------===*/ 10000b57cec5SDimitry Andric 10010b57cec5SDimitry Andric /*--.. Operations on all values ............................................--*/ 10020b57cec5SDimitry Andric 10030b57cec5SDimitry Andric LLVMTypeRef LLVMTypeOf(LLVMValueRef Val) { 10040b57cec5SDimitry Andric return wrap(unwrap(Val)->getType()); 10050b57cec5SDimitry Andric } 10060b57cec5SDimitry Andric 10070b57cec5SDimitry Andric LLVMValueKind LLVMGetValueKind(LLVMValueRef Val) { 10080b57cec5SDimitry Andric switch(unwrap(Val)->getValueID()) { 1009e8d8bef9SDimitry Andric #define LLVM_C_API 1 10100b57cec5SDimitry Andric #define HANDLE_VALUE(Name) \ 10110b57cec5SDimitry Andric case Value::Name##Val: \ 10120b57cec5SDimitry Andric return LLVM##Name##ValueKind; 10130b57cec5SDimitry Andric #include "llvm/IR/Value.def" 10140b57cec5SDimitry Andric default: 10150b57cec5SDimitry Andric return LLVMInstructionValueKind; 10160b57cec5SDimitry Andric } 10170b57cec5SDimitry Andric } 10180b57cec5SDimitry Andric 10190b57cec5SDimitry Andric const char *LLVMGetValueName2(LLVMValueRef Val, size_t *Length) { 10200b57cec5SDimitry Andric auto *V = unwrap(Val); 10210b57cec5SDimitry Andric *Length = V->getName().size(); 10220b57cec5SDimitry Andric return V->getName().data(); 10230b57cec5SDimitry Andric } 10240b57cec5SDimitry Andric 10250b57cec5SDimitry Andric void LLVMSetValueName2(LLVMValueRef Val, const char *Name, size_t NameLen) { 10260b57cec5SDimitry Andric unwrap(Val)->setName(StringRef(Name, NameLen)); 10270b57cec5SDimitry Andric } 10280b57cec5SDimitry Andric 10290b57cec5SDimitry Andric const char *LLVMGetValueName(LLVMValueRef Val) { 10300b57cec5SDimitry Andric return unwrap(Val)->getName().data(); 10310b57cec5SDimitry Andric } 10320b57cec5SDimitry Andric 10330b57cec5SDimitry Andric void LLVMSetValueName(LLVMValueRef Val, const char *Name) { 10340b57cec5SDimitry Andric unwrap(Val)->setName(Name); 10350b57cec5SDimitry Andric } 10360b57cec5SDimitry Andric 10370b57cec5SDimitry Andric void LLVMDumpValue(LLVMValueRef Val) { 10380b57cec5SDimitry Andric unwrap(Val)->print(errs(), /*IsForDebug=*/true); 10390b57cec5SDimitry Andric } 10400b57cec5SDimitry Andric 10410b57cec5SDimitry Andric char* LLVMPrintValueToString(LLVMValueRef Val) { 10420b57cec5SDimitry Andric std::string buf; 10430b57cec5SDimitry Andric raw_string_ostream os(buf); 10440b57cec5SDimitry Andric 10450b57cec5SDimitry Andric if (unwrap(Val)) 10460b57cec5SDimitry Andric unwrap(Val)->print(os); 10470b57cec5SDimitry Andric else 10480b57cec5SDimitry Andric os << "Printing <null> Value"; 10490b57cec5SDimitry Andric 10500b57cec5SDimitry Andric os.flush(); 10510b57cec5SDimitry Andric 10520b57cec5SDimitry Andric return strdup(buf.c_str()); 10530b57cec5SDimitry Andric } 10540b57cec5SDimitry Andric 1055*0fca6ea1SDimitry Andric char *LLVMPrintDbgRecordToString(LLVMDbgRecordRef Record) { 1056*0fca6ea1SDimitry Andric std::string buf; 1057*0fca6ea1SDimitry Andric raw_string_ostream os(buf); 1058*0fca6ea1SDimitry Andric 1059*0fca6ea1SDimitry Andric if (unwrap(Record)) 1060*0fca6ea1SDimitry Andric unwrap(Record)->print(os); 1061*0fca6ea1SDimitry Andric else 1062*0fca6ea1SDimitry Andric os << "Printing <null> DbgRecord"; 1063*0fca6ea1SDimitry Andric 1064*0fca6ea1SDimitry Andric os.flush(); 1065*0fca6ea1SDimitry Andric 1066*0fca6ea1SDimitry Andric return strdup(buf.c_str()); 1067*0fca6ea1SDimitry Andric } 1068*0fca6ea1SDimitry Andric 10690b57cec5SDimitry Andric void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal) { 10700b57cec5SDimitry Andric unwrap(OldVal)->replaceAllUsesWith(unwrap(NewVal)); 10710b57cec5SDimitry Andric } 10720b57cec5SDimitry Andric 10730b57cec5SDimitry Andric int LLVMHasMetadata(LLVMValueRef Inst) { 10740b57cec5SDimitry Andric return unwrap<Instruction>(Inst)->hasMetadata(); 10750b57cec5SDimitry Andric } 10760b57cec5SDimitry Andric 10770b57cec5SDimitry Andric LLVMValueRef LLVMGetMetadata(LLVMValueRef Inst, unsigned KindID) { 10780b57cec5SDimitry Andric auto *I = unwrap<Instruction>(Inst); 10790b57cec5SDimitry Andric assert(I && "Expected instruction"); 10800b57cec5SDimitry Andric if (auto *MD = I->getMetadata(KindID)) 10810b57cec5SDimitry Andric return wrap(MetadataAsValue::get(I->getContext(), MD)); 10820b57cec5SDimitry Andric return nullptr; 10830b57cec5SDimitry Andric } 10840b57cec5SDimitry Andric 10850b57cec5SDimitry Andric // MetadataAsValue uses a canonical format which strips the actual MDNode for 10860b57cec5SDimitry Andric // MDNode with just a single constant value, storing just a ConstantAsMetadata 10870b57cec5SDimitry Andric // This undoes this canonicalization, reconstructing the MDNode. 10880b57cec5SDimitry Andric static MDNode *extractMDNode(MetadataAsValue *MAV) { 10890b57cec5SDimitry Andric Metadata *MD = MAV->getMetadata(); 10900b57cec5SDimitry Andric assert((isa<MDNode>(MD) || isa<ConstantAsMetadata>(MD)) && 10910b57cec5SDimitry Andric "Expected a metadata node or a canonicalized constant"); 10920b57cec5SDimitry Andric 10930b57cec5SDimitry Andric if (MDNode *N = dyn_cast<MDNode>(MD)) 10940b57cec5SDimitry Andric return N; 10950b57cec5SDimitry Andric 10960b57cec5SDimitry Andric return MDNode::get(MAV->getContext(), MD); 10970b57cec5SDimitry Andric } 10980b57cec5SDimitry Andric 10990b57cec5SDimitry Andric void LLVMSetMetadata(LLVMValueRef Inst, unsigned KindID, LLVMValueRef Val) { 11000b57cec5SDimitry Andric MDNode *N = Val ? extractMDNode(unwrap<MetadataAsValue>(Val)) : nullptr; 11010b57cec5SDimitry Andric 11020b57cec5SDimitry Andric unwrap<Instruction>(Inst)->setMetadata(KindID, N); 11030b57cec5SDimitry Andric } 11040b57cec5SDimitry Andric 11050b57cec5SDimitry Andric struct LLVMOpaqueValueMetadataEntry { 11060b57cec5SDimitry Andric unsigned Kind; 11070b57cec5SDimitry Andric LLVMMetadataRef Metadata; 11080b57cec5SDimitry Andric }; 11090b57cec5SDimitry Andric 11100b57cec5SDimitry Andric using MetadataEntries = SmallVectorImpl<std::pair<unsigned, MDNode *>>; 11110b57cec5SDimitry Andric static LLVMValueMetadataEntry * 11120b57cec5SDimitry Andric llvm_getMetadata(size_t *NumEntries, 11130b57cec5SDimitry Andric llvm::function_ref<void(MetadataEntries &)> AccessMD) { 11140b57cec5SDimitry Andric SmallVector<std::pair<unsigned, MDNode *>, 8> MVEs; 11150b57cec5SDimitry Andric AccessMD(MVEs); 11160b57cec5SDimitry Andric 11170b57cec5SDimitry Andric LLVMOpaqueValueMetadataEntry *Result = 11180b57cec5SDimitry Andric static_cast<LLVMOpaqueValueMetadataEntry *>( 11190b57cec5SDimitry Andric safe_malloc(MVEs.size() * sizeof(LLVMOpaqueValueMetadataEntry))); 11200b57cec5SDimitry Andric for (unsigned i = 0; i < MVEs.size(); ++i) { 11210b57cec5SDimitry Andric const auto &ModuleFlag = MVEs[i]; 11220b57cec5SDimitry Andric Result[i].Kind = ModuleFlag.first; 11230b57cec5SDimitry Andric Result[i].Metadata = wrap(ModuleFlag.second); 11240b57cec5SDimitry Andric } 11250b57cec5SDimitry Andric *NumEntries = MVEs.size(); 11260b57cec5SDimitry Andric return Result; 11270b57cec5SDimitry Andric } 11280b57cec5SDimitry Andric 11290b57cec5SDimitry Andric LLVMValueMetadataEntry * 11300b57cec5SDimitry Andric LLVMInstructionGetAllMetadataOtherThanDebugLoc(LLVMValueRef Value, 11310b57cec5SDimitry Andric size_t *NumEntries) { 11320b57cec5SDimitry Andric return llvm_getMetadata(NumEntries, [&Value](MetadataEntries &Entries) { 1133e8d8bef9SDimitry Andric Entries.clear(); 11340b57cec5SDimitry Andric unwrap<Instruction>(Value)->getAllMetadata(Entries); 11350b57cec5SDimitry Andric }); 11360b57cec5SDimitry Andric } 11370b57cec5SDimitry Andric 11380b57cec5SDimitry Andric /*--.. Conversion functions ................................................--*/ 11390b57cec5SDimitry Andric 11400b57cec5SDimitry Andric #define LLVM_DEFINE_VALUE_CAST(name) \ 11410b57cec5SDimitry Andric LLVMValueRef LLVMIsA##name(LLVMValueRef Val) { \ 11420b57cec5SDimitry Andric return wrap(static_cast<Value*>(dyn_cast_or_null<name>(unwrap(Val)))); \ 11430b57cec5SDimitry Andric } 11440b57cec5SDimitry Andric 11450b57cec5SDimitry Andric LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DEFINE_VALUE_CAST) 11460b57cec5SDimitry Andric 11470b57cec5SDimitry Andric LLVMValueRef LLVMIsAMDNode(LLVMValueRef Val) { 11480b57cec5SDimitry Andric if (auto *MD = dyn_cast_or_null<MetadataAsValue>(unwrap(Val))) 11490b57cec5SDimitry Andric if (isa<MDNode>(MD->getMetadata()) || 11500b57cec5SDimitry Andric isa<ValueAsMetadata>(MD->getMetadata())) 11510b57cec5SDimitry Andric return Val; 11520b57cec5SDimitry Andric return nullptr; 11530b57cec5SDimitry Andric } 11540b57cec5SDimitry Andric 115506c3fb27SDimitry Andric LLVMValueRef LLVMIsAValueAsMetadata(LLVMValueRef Val) { 115606c3fb27SDimitry Andric if (auto *MD = dyn_cast_or_null<MetadataAsValue>(unwrap(Val))) 115706c3fb27SDimitry Andric if (isa<ValueAsMetadata>(MD->getMetadata())) 115806c3fb27SDimitry Andric return Val; 115906c3fb27SDimitry Andric return nullptr; 116006c3fb27SDimitry Andric } 116106c3fb27SDimitry Andric 11620b57cec5SDimitry Andric LLVMValueRef LLVMIsAMDString(LLVMValueRef Val) { 11630b57cec5SDimitry Andric if (auto *MD = dyn_cast_or_null<MetadataAsValue>(unwrap(Val))) 11640b57cec5SDimitry Andric if (isa<MDString>(MD->getMetadata())) 11650b57cec5SDimitry Andric return Val; 11660b57cec5SDimitry Andric return nullptr; 11670b57cec5SDimitry Andric } 11680b57cec5SDimitry Andric 11690b57cec5SDimitry Andric /*--.. Operations on Uses ..................................................--*/ 11700b57cec5SDimitry Andric LLVMUseRef LLVMGetFirstUse(LLVMValueRef Val) { 11710b57cec5SDimitry Andric Value *V = unwrap(Val); 11720b57cec5SDimitry Andric Value::use_iterator I = V->use_begin(); 11730b57cec5SDimitry Andric if (I == V->use_end()) 11740b57cec5SDimitry Andric return nullptr; 11750b57cec5SDimitry Andric return wrap(&*I); 11760b57cec5SDimitry Andric } 11770b57cec5SDimitry Andric 11780b57cec5SDimitry Andric LLVMUseRef LLVMGetNextUse(LLVMUseRef U) { 11790b57cec5SDimitry Andric Use *Next = unwrap(U)->getNext(); 11800b57cec5SDimitry Andric if (Next) 11810b57cec5SDimitry Andric return wrap(Next); 11820b57cec5SDimitry Andric return nullptr; 11830b57cec5SDimitry Andric } 11840b57cec5SDimitry Andric 11850b57cec5SDimitry Andric LLVMValueRef LLVMGetUser(LLVMUseRef U) { 11860b57cec5SDimitry Andric return wrap(unwrap(U)->getUser()); 11870b57cec5SDimitry Andric } 11880b57cec5SDimitry Andric 11890b57cec5SDimitry Andric LLVMValueRef LLVMGetUsedValue(LLVMUseRef U) { 11900b57cec5SDimitry Andric return wrap(unwrap(U)->get()); 11910b57cec5SDimitry Andric } 11920b57cec5SDimitry Andric 11930b57cec5SDimitry Andric /*--.. Operations on Users .................................................--*/ 11940b57cec5SDimitry Andric 11950b57cec5SDimitry Andric static LLVMValueRef getMDNodeOperandImpl(LLVMContext &Context, const MDNode *N, 11960b57cec5SDimitry Andric unsigned Index) { 11970b57cec5SDimitry Andric Metadata *Op = N->getOperand(Index); 11980b57cec5SDimitry Andric if (!Op) 11990b57cec5SDimitry Andric return nullptr; 12000b57cec5SDimitry Andric if (auto *C = dyn_cast<ConstantAsMetadata>(Op)) 12010b57cec5SDimitry Andric return wrap(C->getValue()); 12020b57cec5SDimitry Andric return wrap(MetadataAsValue::get(Context, Op)); 12030b57cec5SDimitry Andric } 12040b57cec5SDimitry Andric 12050b57cec5SDimitry Andric LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index) { 12060b57cec5SDimitry Andric Value *V = unwrap(Val); 12070b57cec5SDimitry Andric if (auto *MD = dyn_cast<MetadataAsValue>(V)) { 12080b57cec5SDimitry Andric if (auto *L = dyn_cast<ValueAsMetadata>(MD->getMetadata())) { 12090b57cec5SDimitry Andric assert(Index == 0 && "Function-local metadata can only have one operand"); 12100b57cec5SDimitry Andric return wrap(L->getValue()); 12110b57cec5SDimitry Andric } 12120b57cec5SDimitry Andric return getMDNodeOperandImpl(V->getContext(), 12130b57cec5SDimitry Andric cast<MDNode>(MD->getMetadata()), Index); 12140b57cec5SDimitry Andric } 12150b57cec5SDimitry Andric 12160b57cec5SDimitry Andric return wrap(cast<User>(V)->getOperand(Index)); 12170b57cec5SDimitry Andric } 12180b57cec5SDimitry Andric 12190b57cec5SDimitry Andric LLVMUseRef LLVMGetOperandUse(LLVMValueRef Val, unsigned Index) { 12200b57cec5SDimitry Andric Value *V = unwrap(Val); 12210b57cec5SDimitry Andric return wrap(&cast<User>(V)->getOperandUse(Index)); 12220b57cec5SDimitry Andric } 12230b57cec5SDimitry Andric 12240b57cec5SDimitry Andric void LLVMSetOperand(LLVMValueRef Val, unsigned Index, LLVMValueRef Op) { 12250b57cec5SDimitry Andric unwrap<User>(Val)->setOperand(Index, unwrap(Op)); 12260b57cec5SDimitry Andric } 12270b57cec5SDimitry Andric 12280b57cec5SDimitry Andric int LLVMGetNumOperands(LLVMValueRef Val) { 12290b57cec5SDimitry Andric Value *V = unwrap(Val); 12300b57cec5SDimitry Andric if (isa<MetadataAsValue>(V)) 12310b57cec5SDimitry Andric return LLVMGetMDNodeNumOperands(Val); 12320b57cec5SDimitry Andric 12330b57cec5SDimitry Andric return cast<User>(V)->getNumOperands(); 12340b57cec5SDimitry Andric } 12350b57cec5SDimitry Andric 12360b57cec5SDimitry Andric /*--.. Operations on constants of any type .................................--*/ 12370b57cec5SDimitry Andric 12380b57cec5SDimitry Andric LLVMValueRef LLVMConstNull(LLVMTypeRef Ty) { 12390b57cec5SDimitry Andric return wrap(Constant::getNullValue(unwrap(Ty))); 12400b57cec5SDimitry Andric } 12410b57cec5SDimitry Andric 12420b57cec5SDimitry Andric LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty) { 12430b57cec5SDimitry Andric return wrap(Constant::getAllOnesValue(unwrap(Ty))); 12440b57cec5SDimitry Andric } 12450b57cec5SDimitry Andric 12460b57cec5SDimitry Andric LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty) { 12470b57cec5SDimitry Andric return wrap(UndefValue::get(unwrap(Ty))); 12480b57cec5SDimitry Andric } 12490b57cec5SDimitry Andric 1250e8d8bef9SDimitry Andric LLVMValueRef LLVMGetPoison(LLVMTypeRef Ty) { 1251e8d8bef9SDimitry Andric return wrap(PoisonValue::get(unwrap(Ty))); 1252e8d8bef9SDimitry Andric } 1253e8d8bef9SDimitry Andric 12540b57cec5SDimitry Andric LLVMBool LLVMIsConstant(LLVMValueRef Ty) { 12550b57cec5SDimitry Andric return isa<Constant>(unwrap(Ty)); 12560b57cec5SDimitry Andric } 12570b57cec5SDimitry Andric 12580b57cec5SDimitry Andric LLVMBool LLVMIsNull(LLVMValueRef Val) { 12590b57cec5SDimitry Andric if (Constant *C = dyn_cast<Constant>(unwrap(Val))) 12600b57cec5SDimitry Andric return C->isNullValue(); 12610b57cec5SDimitry Andric return false; 12620b57cec5SDimitry Andric } 12630b57cec5SDimitry Andric 12640b57cec5SDimitry Andric LLVMBool LLVMIsUndef(LLVMValueRef Val) { 12650b57cec5SDimitry Andric return isa<UndefValue>(unwrap(Val)); 12660b57cec5SDimitry Andric } 12670b57cec5SDimitry Andric 1268e8d8bef9SDimitry Andric LLVMBool LLVMIsPoison(LLVMValueRef Val) { 1269e8d8bef9SDimitry Andric return isa<PoisonValue>(unwrap(Val)); 1270e8d8bef9SDimitry Andric } 1271e8d8bef9SDimitry Andric 12720b57cec5SDimitry Andric LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty) { 12730b57cec5SDimitry Andric return wrap(ConstantPointerNull::get(unwrap<PointerType>(Ty))); 12740b57cec5SDimitry Andric } 12750b57cec5SDimitry Andric 12760b57cec5SDimitry Andric /*--.. Operations on metadata nodes ........................................--*/ 12770b57cec5SDimitry Andric 12780b57cec5SDimitry Andric LLVMMetadataRef LLVMMDStringInContext2(LLVMContextRef C, const char *Str, 12790b57cec5SDimitry Andric size_t SLen) { 12800b57cec5SDimitry Andric return wrap(MDString::get(*unwrap(C), StringRef(Str, SLen))); 12810b57cec5SDimitry Andric } 12820b57cec5SDimitry Andric 12830b57cec5SDimitry Andric LLVMMetadataRef LLVMMDNodeInContext2(LLVMContextRef C, LLVMMetadataRef *MDs, 12840b57cec5SDimitry Andric size_t Count) { 12850b57cec5SDimitry Andric return wrap(MDNode::get(*unwrap(C), ArrayRef<Metadata*>(unwrap(MDs), Count))); 12860b57cec5SDimitry Andric } 12870b57cec5SDimitry Andric 12880b57cec5SDimitry Andric LLVMValueRef LLVMMDStringInContext(LLVMContextRef C, const char *Str, 12890b57cec5SDimitry Andric unsigned SLen) { 12900b57cec5SDimitry Andric LLVMContext &Context = *unwrap(C); 12910b57cec5SDimitry Andric return wrap(MetadataAsValue::get( 12920b57cec5SDimitry Andric Context, MDString::get(Context, StringRef(Str, SLen)))); 12930b57cec5SDimitry Andric } 12940b57cec5SDimitry Andric 12950b57cec5SDimitry Andric LLVMValueRef LLVMMDString(const char *Str, unsigned SLen) { 12960b57cec5SDimitry Andric return LLVMMDStringInContext(LLVMGetGlobalContext(), Str, SLen); 12970b57cec5SDimitry Andric } 12980b57cec5SDimitry Andric 12990b57cec5SDimitry Andric LLVMValueRef LLVMMDNodeInContext(LLVMContextRef C, LLVMValueRef *Vals, 13000b57cec5SDimitry Andric unsigned Count) { 13010b57cec5SDimitry Andric LLVMContext &Context = *unwrap(C); 13020b57cec5SDimitry Andric SmallVector<Metadata *, 8> MDs; 1303bdd1243dSDimitry Andric for (auto *OV : ArrayRef(Vals, Count)) { 13040b57cec5SDimitry Andric Value *V = unwrap(OV); 13050b57cec5SDimitry Andric Metadata *MD; 13060b57cec5SDimitry Andric if (!V) 13070b57cec5SDimitry Andric MD = nullptr; 13080b57cec5SDimitry Andric else if (auto *C = dyn_cast<Constant>(V)) 13090b57cec5SDimitry Andric MD = ConstantAsMetadata::get(C); 13100b57cec5SDimitry Andric else if (auto *MDV = dyn_cast<MetadataAsValue>(V)) { 13110b57cec5SDimitry Andric MD = MDV->getMetadata(); 13120b57cec5SDimitry Andric assert(!isa<LocalAsMetadata>(MD) && "Unexpected function-local metadata " 13130b57cec5SDimitry Andric "outside of direct argument to call"); 13140b57cec5SDimitry Andric } else { 13150b57cec5SDimitry Andric // This is function-local metadata. Pretend to make an MDNode. 13160b57cec5SDimitry Andric assert(Count == 1 && 13170b57cec5SDimitry Andric "Expected only one operand to function-local metadata"); 13180b57cec5SDimitry Andric return wrap(MetadataAsValue::get(Context, LocalAsMetadata::get(V))); 13190b57cec5SDimitry Andric } 13200b57cec5SDimitry Andric 13210b57cec5SDimitry Andric MDs.push_back(MD); 13220b57cec5SDimitry Andric } 13230b57cec5SDimitry Andric return wrap(MetadataAsValue::get(Context, MDNode::get(Context, MDs))); 13240b57cec5SDimitry Andric } 13250b57cec5SDimitry Andric 13260b57cec5SDimitry Andric LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count) { 13270b57cec5SDimitry Andric return LLVMMDNodeInContext(LLVMGetGlobalContext(), Vals, Count); 13280b57cec5SDimitry Andric } 13290b57cec5SDimitry Andric 13300b57cec5SDimitry Andric LLVMValueRef LLVMMetadataAsValue(LLVMContextRef C, LLVMMetadataRef MD) { 13310b57cec5SDimitry Andric return wrap(MetadataAsValue::get(*unwrap(C), unwrap(MD))); 13320b57cec5SDimitry Andric } 13330b57cec5SDimitry Andric 13340b57cec5SDimitry Andric LLVMMetadataRef LLVMValueAsMetadata(LLVMValueRef Val) { 13350b57cec5SDimitry Andric auto *V = unwrap(Val); 13360b57cec5SDimitry Andric if (auto *C = dyn_cast<Constant>(V)) 13370b57cec5SDimitry Andric return wrap(ConstantAsMetadata::get(C)); 13380b57cec5SDimitry Andric if (auto *MAV = dyn_cast<MetadataAsValue>(V)) 13390b57cec5SDimitry Andric return wrap(MAV->getMetadata()); 13400b57cec5SDimitry Andric return wrap(ValueAsMetadata::get(V)); 13410b57cec5SDimitry Andric } 13420b57cec5SDimitry Andric 13430b57cec5SDimitry Andric const char *LLVMGetMDString(LLVMValueRef V, unsigned *Length) { 13440b57cec5SDimitry Andric if (const auto *MD = dyn_cast<MetadataAsValue>(unwrap(V))) 13450b57cec5SDimitry Andric if (const MDString *S = dyn_cast<MDString>(MD->getMetadata())) { 13460b57cec5SDimitry Andric *Length = S->getString().size(); 13470b57cec5SDimitry Andric return S->getString().data(); 13480b57cec5SDimitry Andric } 13490b57cec5SDimitry Andric *Length = 0; 13500b57cec5SDimitry Andric return nullptr; 13510b57cec5SDimitry Andric } 13520b57cec5SDimitry Andric 13530b57cec5SDimitry Andric unsigned LLVMGetMDNodeNumOperands(LLVMValueRef V) { 1354bdd1243dSDimitry Andric auto *MD = unwrap<MetadataAsValue>(V); 13550b57cec5SDimitry Andric if (isa<ValueAsMetadata>(MD->getMetadata())) 13560b57cec5SDimitry Andric return 1; 13570b57cec5SDimitry Andric return cast<MDNode>(MD->getMetadata())->getNumOperands(); 13580b57cec5SDimitry Andric } 13590b57cec5SDimitry Andric 13600b57cec5SDimitry Andric LLVMNamedMDNodeRef LLVMGetFirstNamedMetadata(LLVMModuleRef M) { 13610b57cec5SDimitry Andric Module *Mod = unwrap(M); 13620b57cec5SDimitry Andric Module::named_metadata_iterator I = Mod->named_metadata_begin(); 13630b57cec5SDimitry Andric if (I == Mod->named_metadata_end()) 13640b57cec5SDimitry Andric return nullptr; 13650b57cec5SDimitry Andric return wrap(&*I); 13660b57cec5SDimitry Andric } 13670b57cec5SDimitry Andric 13680b57cec5SDimitry Andric LLVMNamedMDNodeRef LLVMGetLastNamedMetadata(LLVMModuleRef M) { 13690b57cec5SDimitry Andric Module *Mod = unwrap(M); 13700b57cec5SDimitry Andric Module::named_metadata_iterator I = Mod->named_metadata_end(); 13710b57cec5SDimitry Andric if (I == Mod->named_metadata_begin()) 13720b57cec5SDimitry Andric return nullptr; 13730b57cec5SDimitry Andric return wrap(&*--I); 13740b57cec5SDimitry Andric } 13750b57cec5SDimitry Andric 13760b57cec5SDimitry Andric LLVMNamedMDNodeRef LLVMGetNextNamedMetadata(LLVMNamedMDNodeRef NMD) { 1377bdd1243dSDimitry Andric NamedMDNode *NamedNode = unwrap(NMD); 13780b57cec5SDimitry Andric Module::named_metadata_iterator I(NamedNode); 13790b57cec5SDimitry Andric if (++I == NamedNode->getParent()->named_metadata_end()) 13800b57cec5SDimitry Andric return nullptr; 13810b57cec5SDimitry Andric return wrap(&*I); 13820b57cec5SDimitry Andric } 13830b57cec5SDimitry Andric 13840b57cec5SDimitry Andric LLVMNamedMDNodeRef LLVMGetPreviousNamedMetadata(LLVMNamedMDNodeRef NMD) { 1385bdd1243dSDimitry Andric NamedMDNode *NamedNode = unwrap(NMD); 13860b57cec5SDimitry Andric Module::named_metadata_iterator I(NamedNode); 13870b57cec5SDimitry Andric if (I == NamedNode->getParent()->named_metadata_begin()) 13880b57cec5SDimitry Andric return nullptr; 13890b57cec5SDimitry Andric return wrap(&*--I); 13900b57cec5SDimitry Andric } 13910b57cec5SDimitry Andric 13920b57cec5SDimitry Andric LLVMNamedMDNodeRef LLVMGetNamedMetadata(LLVMModuleRef M, 13930b57cec5SDimitry Andric const char *Name, size_t NameLen) { 13940b57cec5SDimitry Andric return wrap(unwrap(M)->getNamedMetadata(StringRef(Name, NameLen))); 13950b57cec5SDimitry Andric } 13960b57cec5SDimitry Andric 13970b57cec5SDimitry Andric LLVMNamedMDNodeRef LLVMGetOrInsertNamedMetadata(LLVMModuleRef M, 13980b57cec5SDimitry Andric const char *Name, size_t NameLen) { 13990b57cec5SDimitry Andric return wrap(unwrap(M)->getOrInsertNamedMetadata({Name, NameLen})); 14000b57cec5SDimitry Andric } 14010b57cec5SDimitry Andric 14020b57cec5SDimitry Andric const char *LLVMGetNamedMetadataName(LLVMNamedMDNodeRef NMD, size_t *NameLen) { 1403bdd1243dSDimitry Andric NamedMDNode *NamedNode = unwrap(NMD); 14040b57cec5SDimitry Andric *NameLen = NamedNode->getName().size(); 14050b57cec5SDimitry Andric return NamedNode->getName().data(); 14060b57cec5SDimitry Andric } 14070b57cec5SDimitry Andric 14080b57cec5SDimitry Andric void LLVMGetMDNodeOperands(LLVMValueRef V, LLVMValueRef *Dest) { 1409bdd1243dSDimitry Andric auto *MD = unwrap<MetadataAsValue>(V); 14100b57cec5SDimitry Andric if (auto *MDV = dyn_cast<ValueAsMetadata>(MD->getMetadata())) { 14110b57cec5SDimitry Andric *Dest = wrap(MDV->getValue()); 14120b57cec5SDimitry Andric return; 14130b57cec5SDimitry Andric } 14140b57cec5SDimitry Andric const auto *N = cast<MDNode>(MD->getMetadata()); 14150b57cec5SDimitry Andric const unsigned numOperands = N->getNumOperands(); 14160b57cec5SDimitry Andric LLVMContext &Context = unwrap(V)->getContext(); 14170b57cec5SDimitry Andric for (unsigned i = 0; i < numOperands; i++) 14180b57cec5SDimitry Andric Dest[i] = getMDNodeOperandImpl(Context, N, i); 14190b57cec5SDimitry Andric } 14200b57cec5SDimitry Andric 142106c3fb27SDimitry Andric void LLVMReplaceMDNodeOperandWith(LLVMValueRef V, unsigned Index, 142206c3fb27SDimitry Andric LLVMMetadataRef Replacement) { 142306c3fb27SDimitry Andric auto *MD = cast<MetadataAsValue>(unwrap(V)); 142406c3fb27SDimitry Andric auto *N = cast<MDNode>(MD->getMetadata()); 142506c3fb27SDimitry Andric N->replaceOperandWith(Index, unwrap<Metadata>(Replacement)); 142606c3fb27SDimitry Andric } 142706c3fb27SDimitry Andric 14280b57cec5SDimitry Andric unsigned LLVMGetNamedMetadataNumOperands(LLVMModuleRef M, const char *Name) { 14290b57cec5SDimitry Andric if (NamedMDNode *N = unwrap(M)->getNamedMetadata(Name)) { 14300b57cec5SDimitry Andric return N->getNumOperands(); 14310b57cec5SDimitry Andric } 14320b57cec5SDimitry Andric return 0; 14330b57cec5SDimitry Andric } 14340b57cec5SDimitry Andric 14350b57cec5SDimitry Andric void LLVMGetNamedMetadataOperands(LLVMModuleRef M, const char *Name, 14360b57cec5SDimitry Andric LLVMValueRef *Dest) { 14370b57cec5SDimitry Andric NamedMDNode *N = unwrap(M)->getNamedMetadata(Name); 14380b57cec5SDimitry Andric if (!N) 14390b57cec5SDimitry Andric return; 14400b57cec5SDimitry Andric LLVMContext &Context = unwrap(M)->getContext(); 14410b57cec5SDimitry Andric for (unsigned i=0;i<N->getNumOperands();i++) 14420b57cec5SDimitry Andric Dest[i] = wrap(MetadataAsValue::get(Context, N->getOperand(i))); 14430b57cec5SDimitry Andric } 14440b57cec5SDimitry Andric 14450b57cec5SDimitry Andric void LLVMAddNamedMetadataOperand(LLVMModuleRef M, const char *Name, 14460b57cec5SDimitry Andric LLVMValueRef Val) { 14470b57cec5SDimitry Andric NamedMDNode *N = unwrap(M)->getOrInsertNamedMetadata(Name); 14480b57cec5SDimitry Andric if (!N) 14490b57cec5SDimitry Andric return; 14500b57cec5SDimitry Andric if (!Val) 14510b57cec5SDimitry Andric return; 14520b57cec5SDimitry Andric N->addOperand(extractMDNode(unwrap<MetadataAsValue>(Val))); 14530b57cec5SDimitry Andric } 14540b57cec5SDimitry Andric 14550b57cec5SDimitry Andric const char *LLVMGetDebugLocDirectory(LLVMValueRef Val, unsigned *Length) { 14560b57cec5SDimitry Andric if (!Length) return nullptr; 14570b57cec5SDimitry Andric StringRef S; 14580b57cec5SDimitry Andric if (const auto *I = dyn_cast<Instruction>(unwrap(Val))) { 14590b57cec5SDimitry Andric if (const auto &DL = I->getDebugLoc()) { 14600b57cec5SDimitry Andric S = DL->getDirectory(); 14610b57cec5SDimitry Andric } 14620b57cec5SDimitry Andric } else if (const auto *GV = dyn_cast<GlobalVariable>(unwrap(Val))) { 14630b57cec5SDimitry Andric SmallVector<DIGlobalVariableExpression *, 1> GVEs; 14640b57cec5SDimitry Andric GV->getDebugInfo(GVEs); 14650b57cec5SDimitry Andric if (GVEs.size()) 14660b57cec5SDimitry Andric if (const DIGlobalVariable *DGV = GVEs[0]->getVariable()) 14670b57cec5SDimitry Andric S = DGV->getDirectory(); 14680b57cec5SDimitry Andric } else if (const auto *F = dyn_cast<Function>(unwrap(Val))) { 14690b57cec5SDimitry Andric if (const DISubprogram *DSP = F->getSubprogram()) 14700b57cec5SDimitry Andric S = DSP->getDirectory(); 14710b57cec5SDimitry Andric } else { 14720b57cec5SDimitry Andric assert(0 && "Expected Instruction, GlobalVariable or Function"); 14730b57cec5SDimitry Andric return nullptr; 14740b57cec5SDimitry Andric } 14750b57cec5SDimitry Andric *Length = S.size(); 14760b57cec5SDimitry Andric return S.data(); 14770b57cec5SDimitry Andric } 14780b57cec5SDimitry Andric 14790b57cec5SDimitry Andric const char *LLVMGetDebugLocFilename(LLVMValueRef Val, unsigned *Length) { 14800b57cec5SDimitry Andric if (!Length) return nullptr; 14810b57cec5SDimitry Andric StringRef S; 14820b57cec5SDimitry Andric if (const auto *I = dyn_cast<Instruction>(unwrap(Val))) { 14830b57cec5SDimitry Andric if (const auto &DL = I->getDebugLoc()) { 14840b57cec5SDimitry Andric S = DL->getFilename(); 14850b57cec5SDimitry Andric } 14860b57cec5SDimitry Andric } else if (const auto *GV = dyn_cast<GlobalVariable>(unwrap(Val))) { 14870b57cec5SDimitry Andric SmallVector<DIGlobalVariableExpression *, 1> GVEs; 14880b57cec5SDimitry Andric GV->getDebugInfo(GVEs); 14890b57cec5SDimitry Andric if (GVEs.size()) 14900b57cec5SDimitry Andric if (const DIGlobalVariable *DGV = GVEs[0]->getVariable()) 14910b57cec5SDimitry Andric S = DGV->getFilename(); 14920b57cec5SDimitry Andric } else if (const auto *F = dyn_cast<Function>(unwrap(Val))) { 14930b57cec5SDimitry Andric if (const DISubprogram *DSP = F->getSubprogram()) 14940b57cec5SDimitry Andric S = DSP->getFilename(); 14950b57cec5SDimitry Andric } else { 14960b57cec5SDimitry Andric assert(0 && "Expected Instruction, GlobalVariable or Function"); 14970b57cec5SDimitry Andric return nullptr; 14980b57cec5SDimitry Andric } 14990b57cec5SDimitry Andric *Length = S.size(); 15000b57cec5SDimitry Andric return S.data(); 15010b57cec5SDimitry Andric } 15020b57cec5SDimitry Andric 15030b57cec5SDimitry Andric unsigned LLVMGetDebugLocLine(LLVMValueRef Val) { 15040b57cec5SDimitry Andric unsigned L = 0; 15050b57cec5SDimitry Andric if (const auto *I = dyn_cast<Instruction>(unwrap(Val))) { 15060b57cec5SDimitry Andric if (const auto &DL = I->getDebugLoc()) { 15070b57cec5SDimitry Andric L = DL->getLine(); 15080b57cec5SDimitry Andric } 15090b57cec5SDimitry Andric } else if (const auto *GV = dyn_cast<GlobalVariable>(unwrap(Val))) { 15100b57cec5SDimitry Andric SmallVector<DIGlobalVariableExpression *, 1> GVEs; 15110b57cec5SDimitry Andric GV->getDebugInfo(GVEs); 15120b57cec5SDimitry Andric if (GVEs.size()) 15130b57cec5SDimitry Andric if (const DIGlobalVariable *DGV = GVEs[0]->getVariable()) 15140b57cec5SDimitry Andric L = DGV->getLine(); 15150b57cec5SDimitry Andric } else if (const auto *F = dyn_cast<Function>(unwrap(Val))) { 15160b57cec5SDimitry Andric if (const DISubprogram *DSP = F->getSubprogram()) 15170b57cec5SDimitry Andric L = DSP->getLine(); 15180b57cec5SDimitry Andric } else { 15190b57cec5SDimitry Andric assert(0 && "Expected Instruction, GlobalVariable or Function"); 15200b57cec5SDimitry Andric return -1; 15210b57cec5SDimitry Andric } 15220b57cec5SDimitry Andric return L; 15230b57cec5SDimitry Andric } 15240b57cec5SDimitry Andric 15250b57cec5SDimitry Andric unsigned LLVMGetDebugLocColumn(LLVMValueRef Val) { 15260b57cec5SDimitry Andric unsigned C = 0; 15270b57cec5SDimitry Andric if (const auto *I = dyn_cast<Instruction>(unwrap(Val))) 15280b57cec5SDimitry Andric if (const auto &DL = I->getDebugLoc()) 15290b57cec5SDimitry Andric C = DL->getColumn(); 15300b57cec5SDimitry Andric return C; 15310b57cec5SDimitry Andric } 15320b57cec5SDimitry Andric 15330b57cec5SDimitry Andric /*--.. Operations on scalar constants ......................................--*/ 15340b57cec5SDimitry Andric 15350b57cec5SDimitry Andric LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N, 15360b57cec5SDimitry Andric LLVMBool SignExtend) { 15370b57cec5SDimitry Andric return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), N, SignExtend != 0)); 15380b57cec5SDimitry Andric } 15390b57cec5SDimitry Andric 15400b57cec5SDimitry Andric LLVMValueRef LLVMConstIntOfArbitraryPrecision(LLVMTypeRef IntTy, 15410b57cec5SDimitry Andric unsigned NumWords, 15420b57cec5SDimitry Andric const uint64_t Words[]) { 15430b57cec5SDimitry Andric IntegerType *Ty = unwrap<IntegerType>(IntTy); 1544bdd1243dSDimitry Andric return wrap(ConstantInt::get( 1545bdd1243dSDimitry Andric Ty->getContext(), APInt(Ty->getBitWidth(), ArrayRef(Words, NumWords)))); 15460b57cec5SDimitry Andric } 15470b57cec5SDimitry Andric 15480b57cec5SDimitry Andric LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char Str[], 15490b57cec5SDimitry Andric uint8_t Radix) { 15500b57cec5SDimitry Andric return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str), 15510b57cec5SDimitry Andric Radix)); 15520b57cec5SDimitry Andric } 15530b57cec5SDimitry Andric 15540b57cec5SDimitry Andric LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char Str[], 15550b57cec5SDimitry Andric unsigned SLen, uint8_t Radix) { 15560b57cec5SDimitry Andric return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str, SLen), 15570b57cec5SDimitry Andric Radix)); 15580b57cec5SDimitry Andric } 15590b57cec5SDimitry Andric 15600b57cec5SDimitry Andric LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N) { 15610b57cec5SDimitry Andric return wrap(ConstantFP::get(unwrap(RealTy), N)); 15620b57cec5SDimitry Andric } 15630b57cec5SDimitry Andric 15640b57cec5SDimitry Andric LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text) { 15650b57cec5SDimitry Andric return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Text))); 15660b57cec5SDimitry Andric } 15670b57cec5SDimitry Andric 15680b57cec5SDimitry Andric LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char Str[], 15690b57cec5SDimitry Andric unsigned SLen) { 15700b57cec5SDimitry Andric return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Str, SLen))); 15710b57cec5SDimitry Andric } 15720b57cec5SDimitry Andric 15730b57cec5SDimitry Andric unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal) { 15740b57cec5SDimitry Andric return unwrap<ConstantInt>(ConstantVal)->getZExtValue(); 15750b57cec5SDimitry Andric } 15760b57cec5SDimitry Andric 15770b57cec5SDimitry Andric long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal) { 15780b57cec5SDimitry Andric return unwrap<ConstantInt>(ConstantVal)->getSExtValue(); 15790b57cec5SDimitry Andric } 15800b57cec5SDimitry Andric 15810b57cec5SDimitry Andric double LLVMConstRealGetDouble(LLVMValueRef ConstantVal, LLVMBool *LosesInfo) { 15820b57cec5SDimitry Andric ConstantFP *cFP = unwrap<ConstantFP>(ConstantVal) ; 15830b57cec5SDimitry Andric Type *Ty = cFP->getType(); 15840b57cec5SDimitry Andric 1585fe6060f1SDimitry Andric if (Ty->isHalfTy() || Ty->isBFloatTy() || Ty->isFloatTy() || 1586fe6060f1SDimitry Andric Ty->isDoubleTy()) { 15870b57cec5SDimitry Andric *LosesInfo = false; 15880b57cec5SDimitry Andric return cFP->getValueAPF().convertToDouble(); 15890b57cec5SDimitry Andric } 15900b57cec5SDimitry Andric 15910b57cec5SDimitry Andric bool APFLosesInfo; 15920b57cec5SDimitry Andric APFloat APF = cFP->getValueAPF(); 15930b57cec5SDimitry Andric APF.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &APFLosesInfo); 15940b57cec5SDimitry Andric *LosesInfo = APFLosesInfo; 15950b57cec5SDimitry Andric return APF.convertToDouble(); 15960b57cec5SDimitry Andric } 15970b57cec5SDimitry Andric 15980b57cec5SDimitry Andric /*--.. Operations on composite constants ...................................--*/ 15990b57cec5SDimitry Andric 16000b57cec5SDimitry Andric LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str, 16010b57cec5SDimitry Andric unsigned Length, 16020b57cec5SDimitry Andric LLVMBool DontNullTerminate) { 16030b57cec5SDimitry Andric /* Inverted the sense of AddNull because ', 0)' is a 16040b57cec5SDimitry Andric better mnemonic for null termination than ', 1)'. */ 16050b57cec5SDimitry Andric return wrap(ConstantDataArray::getString(*unwrap(C), StringRef(Str, Length), 16060b57cec5SDimitry Andric DontNullTerminate == 0)); 16070b57cec5SDimitry Andric } 16080b57cec5SDimitry Andric 1609*0fca6ea1SDimitry Andric LLVMValueRef LLVMConstStringInContext2(LLVMContextRef C, const char *Str, 1610*0fca6ea1SDimitry Andric size_t Length, 1611*0fca6ea1SDimitry Andric LLVMBool DontNullTerminate) { 1612*0fca6ea1SDimitry Andric /* Inverted the sense of AddNull because ', 0)' is a 1613*0fca6ea1SDimitry Andric better mnemonic for null termination than ', 1)'. */ 1614*0fca6ea1SDimitry Andric return wrap(ConstantDataArray::getString(*unwrap(C), StringRef(Str, Length), 1615*0fca6ea1SDimitry Andric DontNullTerminate == 0)); 1616*0fca6ea1SDimitry Andric } 1617*0fca6ea1SDimitry Andric 16180b57cec5SDimitry Andric LLVMValueRef LLVMConstString(const char *Str, unsigned Length, 16190b57cec5SDimitry Andric LLVMBool DontNullTerminate) { 16200b57cec5SDimitry Andric return LLVMConstStringInContext(LLVMGetGlobalContext(), Str, Length, 16210b57cec5SDimitry Andric DontNullTerminate); 16220b57cec5SDimitry Andric } 16230b57cec5SDimitry Andric 162481ad6265SDimitry Andric LLVMValueRef LLVMGetAggregateElement(LLVMValueRef C, unsigned Idx) { 162581ad6265SDimitry Andric return wrap(unwrap<Constant>(C)->getAggregateElement(Idx)); 162681ad6265SDimitry Andric } 162781ad6265SDimitry Andric 16280b57cec5SDimitry Andric LLVMValueRef LLVMGetElementAsConstant(LLVMValueRef C, unsigned idx) { 16290b57cec5SDimitry Andric return wrap(unwrap<ConstantDataSequential>(C)->getElementAsConstant(idx)); 16300b57cec5SDimitry Andric } 16310b57cec5SDimitry Andric 16320b57cec5SDimitry Andric LLVMBool LLVMIsConstantString(LLVMValueRef C) { 16330b57cec5SDimitry Andric return unwrap<ConstantDataSequential>(C)->isString(); 16340b57cec5SDimitry Andric } 16350b57cec5SDimitry Andric 16360b57cec5SDimitry Andric const char *LLVMGetAsString(LLVMValueRef C, size_t *Length) { 16370b57cec5SDimitry Andric StringRef Str = unwrap<ConstantDataSequential>(C)->getAsString(); 16380b57cec5SDimitry Andric *Length = Str.size(); 16390b57cec5SDimitry Andric return Str.data(); 16400b57cec5SDimitry Andric } 16410b57cec5SDimitry Andric 16420b57cec5SDimitry Andric LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy, 16430b57cec5SDimitry Andric LLVMValueRef *ConstantVals, unsigned Length) { 16440b57cec5SDimitry Andric ArrayRef<Constant*> V(unwrap<Constant>(ConstantVals, Length), Length); 16450b57cec5SDimitry Andric return wrap(ConstantArray::get(ArrayType::get(unwrap(ElementTy), Length), V)); 16460b57cec5SDimitry Andric } 16470b57cec5SDimitry Andric 164806c3fb27SDimitry Andric LLVMValueRef LLVMConstArray2(LLVMTypeRef ElementTy, LLVMValueRef *ConstantVals, 164906c3fb27SDimitry Andric uint64_t Length) { 165006c3fb27SDimitry Andric ArrayRef<Constant *> V(unwrap<Constant>(ConstantVals, Length), Length); 165106c3fb27SDimitry Andric return wrap(ConstantArray::get(ArrayType::get(unwrap(ElementTy), Length), V)); 165206c3fb27SDimitry Andric } 165306c3fb27SDimitry Andric 16540b57cec5SDimitry Andric LLVMValueRef LLVMConstStructInContext(LLVMContextRef C, 16550b57cec5SDimitry Andric LLVMValueRef *ConstantVals, 16560b57cec5SDimitry Andric unsigned Count, LLVMBool Packed) { 16570b57cec5SDimitry Andric Constant **Elements = unwrap<Constant>(ConstantVals, Count); 1658bdd1243dSDimitry Andric return wrap(ConstantStruct::getAnon(*unwrap(C), ArrayRef(Elements, Count), 16590b57cec5SDimitry Andric Packed != 0)); 16600b57cec5SDimitry Andric } 16610b57cec5SDimitry Andric 16620b57cec5SDimitry Andric LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count, 16630b57cec5SDimitry Andric LLVMBool Packed) { 16640b57cec5SDimitry Andric return LLVMConstStructInContext(LLVMGetGlobalContext(), ConstantVals, Count, 16650b57cec5SDimitry Andric Packed); 16660b57cec5SDimitry Andric } 16670b57cec5SDimitry Andric 16680b57cec5SDimitry Andric LLVMValueRef LLVMConstNamedStruct(LLVMTypeRef StructTy, 16690b57cec5SDimitry Andric LLVMValueRef *ConstantVals, 16700b57cec5SDimitry Andric unsigned Count) { 16710b57cec5SDimitry Andric Constant **Elements = unwrap<Constant>(ConstantVals, Count); 1672bdd1243dSDimitry Andric StructType *Ty = unwrap<StructType>(StructTy); 16730b57cec5SDimitry Andric 1674bdd1243dSDimitry Andric return wrap(ConstantStruct::get(Ty, ArrayRef(Elements, Count))); 16750b57cec5SDimitry Andric } 16760b57cec5SDimitry Andric 16770b57cec5SDimitry Andric LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size) { 1678bdd1243dSDimitry Andric return wrap(ConstantVector::get( 1679bdd1243dSDimitry Andric ArrayRef(unwrap<Constant>(ScalarConstantVals, Size), Size))); 16800b57cec5SDimitry Andric } 16810b57cec5SDimitry Andric 1682*0fca6ea1SDimitry Andric LLVMValueRef LLVMConstantPtrAuth(LLVMValueRef Ptr, LLVMValueRef Key, 1683*0fca6ea1SDimitry Andric LLVMValueRef Disc, LLVMValueRef AddrDisc) { 1684*0fca6ea1SDimitry Andric return wrap(ConstantPtrAuth::get( 1685*0fca6ea1SDimitry Andric unwrap<Constant>(Ptr), unwrap<ConstantInt>(Key), 1686*0fca6ea1SDimitry Andric unwrap<ConstantInt>(Disc), unwrap<Constant>(AddrDisc))); 1687*0fca6ea1SDimitry Andric } 1688*0fca6ea1SDimitry Andric 16890b57cec5SDimitry Andric /*-- Opcode mapping */ 16900b57cec5SDimitry Andric 16910b57cec5SDimitry Andric static LLVMOpcode map_to_llvmopcode(int opcode) 16920b57cec5SDimitry Andric { 16930b57cec5SDimitry Andric switch (opcode) { 16940b57cec5SDimitry Andric default: llvm_unreachable("Unhandled Opcode."); 16950b57cec5SDimitry Andric #define HANDLE_INST(num, opc, clas) case num: return LLVM##opc; 16960b57cec5SDimitry Andric #include "llvm/IR/Instruction.def" 16970b57cec5SDimitry Andric #undef HANDLE_INST 16980b57cec5SDimitry Andric } 16990b57cec5SDimitry Andric } 17000b57cec5SDimitry Andric 17010b57cec5SDimitry Andric static int map_from_llvmopcode(LLVMOpcode code) 17020b57cec5SDimitry Andric { 17030b57cec5SDimitry Andric switch (code) { 17040b57cec5SDimitry Andric #define HANDLE_INST(num, opc, clas) case LLVM##opc: return num; 17050b57cec5SDimitry Andric #include "llvm/IR/Instruction.def" 17060b57cec5SDimitry Andric #undef HANDLE_INST 17070b57cec5SDimitry Andric } 17080b57cec5SDimitry Andric llvm_unreachable("Unhandled Opcode."); 17090b57cec5SDimitry Andric } 17100b57cec5SDimitry Andric 1711*0fca6ea1SDimitry Andric /*-- GEP wrap flag conversions */ 1712*0fca6ea1SDimitry Andric 1713*0fca6ea1SDimitry Andric static GEPNoWrapFlags mapFromLLVMGEPNoWrapFlags(LLVMGEPNoWrapFlags GEPFlags) { 1714*0fca6ea1SDimitry Andric GEPNoWrapFlags NewGEPFlags; 1715*0fca6ea1SDimitry Andric if ((GEPFlags & LLVMGEPFlagInBounds) != 0) 1716*0fca6ea1SDimitry Andric NewGEPFlags |= GEPNoWrapFlags::inBounds(); 1717*0fca6ea1SDimitry Andric if ((GEPFlags & LLVMGEPFlagNUSW) != 0) 1718*0fca6ea1SDimitry Andric NewGEPFlags |= GEPNoWrapFlags::noUnsignedSignedWrap(); 1719*0fca6ea1SDimitry Andric if ((GEPFlags & LLVMGEPFlagNUW) != 0) 1720*0fca6ea1SDimitry Andric NewGEPFlags |= GEPNoWrapFlags::noUnsignedWrap(); 1721*0fca6ea1SDimitry Andric 1722*0fca6ea1SDimitry Andric return NewGEPFlags; 1723*0fca6ea1SDimitry Andric } 1724*0fca6ea1SDimitry Andric 1725*0fca6ea1SDimitry Andric static LLVMGEPNoWrapFlags mapToLLVMGEPNoWrapFlags(GEPNoWrapFlags GEPFlags) { 1726*0fca6ea1SDimitry Andric LLVMGEPNoWrapFlags NewGEPFlags = 0; 1727*0fca6ea1SDimitry Andric if (GEPFlags.isInBounds()) 1728*0fca6ea1SDimitry Andric NewGEPFlags |= LLVMGEPFlagInBounds; 1729*0fca6ea1SDimitry Andric if (GEPFlags.hasNoUnsignedSignedWrap()) 1730*0fca6ea1SDimitry Andric NewGEPFlags |= LLVMGEPFlagNUSW; 1731*0fca6ea1SDimitry Andric if (GEPFlags.hasNoUnsignedWrap()) 1732*0fca6ea1SDimitry Andric NewGEPFlags |= LLVMGEPFlagNUW; 1733*0fca6ea1SDimitry Andric 1734*0fca6ea1SDimitry Andric return NewGEPFlags; 1735*0fca6ea1SDimitry Andric } 1736*0fca6ea1SDimitry Andric 17370b57cec5SDimitry Andric /*--.. Constant expressions ................................................--*/ 17380b57cec5SDimitry Andric 17390b57cec5SDimitry Andric LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal) { 17400b57cec5SDimitry Andric return map_to_llvmopcode(unwrap<ConstantExpr>(ConstantVal)->getOpcode()); 17410b57cec5SDimitry Andric } 17420b57cec5SDimitry Andric 17430b57cec5SDimitry Andric LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty) { 17440b57cec5SDimitry Andric return wrap(ConstantExpr::getAlignOf(unwrap(Ty))); 17450b57cec5SDimitry Andric } 17460b57cec5SDimitry Andric 17470b57cec5SDimitry Andric LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty) { 17480b57cec5SDimitry Andric return wrap(ConstantExpr::getSizeOf(unwrap(Ty))); 17490b57cec5SDimitry Andric } 17500b57cec5SDimitry Andric 17510b57cec5SDimitry Andric LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal) { 17520b57cec5SDimitry Andric return wrap(ConstantExpr::getNeg(unwrap<Constant>(ConstantVal))); 17530b57cec5SDimitry Andric } 17540b57cec5SDimitry Andric 17550b57cec5SDimitry Andric LLVMValueRef LLVMConstNSWNeg(LLVMValueRef ConstantVal) { 17560b57cec5SDimitry Andric return wrap(ConstantExpr::getNSWNeg(unwrap<Constant>(ConstantVal))); 17570b57cec5SDimitry Andric } 17580b57cec5SDimitry Andric 17590b57cec5SDimitry Andric LLVMValueRef LLVMConstNUWNeg(LLVMValueRef ConstantVal) { 1760*0fca6ea1SDimitry Andric return wrap(ConstantExpr::getNeg(unwrap<Constant>(ConstantVal))); 17610b57cec5SDimitry Andric } 17620b57cec5SDimitry Andric 17630b57cec5SDimitry Andric 17640b57cec5SDimitry Andric LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal) { 17650b57cec5SDimitry Andric return wrap(ConstantExpr::getNot(unwrap<Constant>(ConstantVal))); 17660b57cec5SDimitry Andric } 17670b57cec5SDimitry Andric 17680b57cec5SDimitry Andric LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { 17690b57cec5SDimitry Andric return wrap(ConstantExpr::getAdd(unwrap<Constant>(LHSConstant), 17700b57cec5SDimitry Andric unwrap<Constant>(RHSConstant))); 17710b57cec5SDimitry Andric } 17720b57cec5SDimitry Andric 17730b57cec5SDimitry Andric LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant, 17740b57cec5SDimitry Andric LLVMValueRef RHSConstant) { 17750b57cec5SDimitry Andric return wrap(ConstantExpr::getNSWAdd(unwrap<Constant>(LHSConstant), 17760b57cec5SDimitry Andric unwrap<Constant>(RHSConstant))); 17770b57cec5SDimitry Andric } 17780b57cec5SDimitry Andric 17790b57cec5SDimitry Andric LLVMValueRef LLVMConstNUWAdd(LLVMValueRef LHSConstant, 17800b57cec5SDimitry Andric LLVMValueRef RHSConstant) { 17810b57cec5SDimitry Andric return wrap(ConstantExpr::getNUWAdd(unwrap<Constant>(LHSConstant), 17820b57cec5SDimitry Andric unwrap<Constant>(RHSConstant))); 17830b57cec5SDimitry Andric } 17840b57cec5SDimitry Andric 17850b57cec5SDimitry Andric LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { 17860b57cec5SDimitry Andric return wrap(ConstantExpr::getSub(unwrap<Constant>(LHSConstant), 17870b57cec5SDimitry Andric unwrap<Constant>(RHSConstant))); 17880b57cec5SDimitry Andric } 17890b57cec5SDimitry Andric 17900b57cec5SDimitry Andric LLVMValueRef LLVMConstNSWSub(LLVMValueRef LHSConstant, 17910b57cec5SDimitry Andric LLVMValueRef RHSConstant) { 17920b57cec5SDimitry Andric return wrap(ConstantExpr::getNSWSub(unwrap<Constant>(LHSConstant), 17930b57cec5SDimitry Andric unwrap<Constant>(RHSConstant))); 17940b57cec5SDimitry Andric } 17950b57cec5SDimitry Andric 17960b57cec5SDimitry Andric LLVMValueRef LLVMConstNUWSub(LLVMValueRef LHSConstant, 17970b57cec5SDimitry Andric LLVMValueRef RHSConstant) { 17980b57cec5SDimitry Andric return wrap(ConstantExpr::getNUWSub(unwrap<Constant>(LHSConstant), 17990b57cec5SDimitry Andric unwrap<Constant>(RHSConstant))); 18000b57cec5SDimitry Andric } 18010b57cec5SDimitry Andric 18020b57cec5SDimitry Andric LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { 18030b57cec5SDimitry Andric return wrap(ConstantExpr::getMul(unwrap<Constant>(LHSConstant), 18040b57cec5SDimitry Andric unwrap<Constant>(RHSConstant))); 18050b57cec5SDimitry Andric } 18060b57cec5SDimitry Andric 18070b57cec5SDimitry Andric LLVMValueRef LLVMConstNSWMul(LLVMValueRef LHSConstant, 18080b57cec5SDimitry Andric LLVMValueRef RHSConstant) { 18090b57cec5SDimitry Andric return wrap(ConstantExpr::getNSWMul(unwrap<Constant>(LHSConstant), 18100b57cec5SDimitry Andric unwrap<Constant>(RHSConstant))); 18110b57cec5SDimitry Andric } 18120b57cec5SDimitry Andric 18130b57cec5SDimitry Andric LLVMValueRef LLVMConstNUWMul(LLVMValueRef LHSConstant, 18140b57cec5SDimitry Andric LLVMValueRef RHSConstant) { 18150b57cec5SDimitry Andric return wrap(ConstantExpr::getNUWMul(unwrap<Constant>(LHSConstant), 18160b57cec5SDimitry Andric unwrap<Constant>(RHSConstant))); 18170b57cec5SDimitry Andric } 18180b57cec5SDimitry Andric 18190b57cec5SDimitry Andric LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) { 18200b57cec5SDimitry Andric return wrap(ConstantExpr::getXor(unwrap<Constant>(LHSConstant), 18210b57cec5SDimitry Andric unwrap<Constant>(RHSConstant))); 18220b57cec5SDimitry Andric } 18230b57cec5SDimitry Andric 18240eae32dcSDimitry Andric LLVMValueRef LLVMConstGEP2(LLVMTypeRef Ty, LLVMValueRef ConstantVal, 18250eae32dcSDimitry Andric LLVMValueRef *ConstantIndices, unsigned NumIndices) { 18260eae32dcSDimitry Andric ArrayRef<Constant *> IdxList(unwrap<Constant>(ConstantIndices, NumIndices), 18270eae32dcSDimitry Andric NumIndices); 18280eae32dcSDimitry Andric Constant *Val = unwrap<Constant>(ConstantVal); 18290eae32dcSDimitry Andric return wrap(ConstantExpr::getGetElementPtr(unwrap(Ty), Val, IdxList)); 18300eae32dcSDimitry Andric } 18310eae32dcSDimitry Andric 18320eae32dcSDimitry Andric LLVMValueRef LLVMConstInBoundsGEP2(LLVMTypeRef Ty, LLVMValueRef ConstantVal, 18330eae32dcSDimitry Andric LLVMValueRef *ConstantIndices, 18340eae32dcSDimitry Andric unsigned NumIndices) { 18350eae32dcSDimitry Andric ArrayRef<Constant *> IdxList(unwrap<Constant>(ConstantIndices, NumIndices), 18360eae32dcSDimitry Andric NumIndices); 18370eae32dcSDimitry Andric Constant *Val = unwrap<Constant>(ConstantVal); 18380eae32dcSDimitry Andric return wrap(ConstantExpr::getInBoundsGetElementPtr(unwrap(Ty), Val, IdxList)); 18390eae32dcSDimitry Andric } 18400eae32dcSDimitry Andric 1841*0fca6ea1SDimitry Andric LLVMValueRef LLVMConstGEPWithNoWrapFlags(LLVMTypeRef Ty, 1842*0fca6ea1SDimitry Andric LLVMValueRef ConstantVal, 1843*0fca6ea1SDimitry Andric LLVMValueRef *ConstantIndices, 1844*0fca6ea1SDimitry Andric unsigned NumIndices, 1845*0fca6ea1SDimitry Andric LLVMGEPNoWrapFlags NoWrapFlags) { 1846*0fca6ea1SDimitry Andric ArrayRef<Constant *> IdxList(unwrap<Constant>(ConstantIndices, NumIndices), 1847*0fca6ea1SDimitry Andric NumIndices); 1848*0fca6ea1SDimitry Andric Constant *Val = unwrap<Constant>(ConstantVal); 1849*0fca6ea1SDimitry Andric return wrap(ConstantExpr::getGetElementPtr( 1850*0fca6ea1SDimitry Andric unwrap(Ty), Val, IdxList, mapFromLLVMGEPNoWrapFlags(NoWrapFlags))); 1851*0fca6ea1SDimitry Andric } 1852*0fca6ea1SDimitry Andric 18530b57cec5SDimitry Andric LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { 18540b57cec5SDimitry Andric return wrap(ConstantExpr::getTrunc(unwrap<Constant>(ConstantVal), 18550b57cec5SDimitry Andric unwrap(ToType))); 18560b57cec5SDimitry Andric } 18570b57cec5SDimitry Andric 18580b57cec5SDimitry Andric LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { 18590b57cec5SDimitry Andric return wrap(ConstantExpr::getPtrToInt(unwrap<Constant>(ConstantVal), 18600b57cec5SDimitry Andric unwrap(ToType))); 18610b57cec5SDimitry Andric } 18620b57cec5SDimitry Andric 18630b57cec5SDimitry Andric LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { 18640b57cec5SDimitry Andric return wrap(ConstantExpr::getIntToPtr(unwrap<Constant>(ConstantVal), 18650b57cec5SDimitry Andric unwrap(ToType))); 18660b57cec5SDimitry Andric } 18670b57cec5SDimitry Andric 18680b57cec5SDimitry Andric LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) { 18690b57cec5SDimitry Andric return wrap(ConstantExpr::getBitCast(unwrap<Constant>(ConstantVal), 18700b57cec5SDimitry Andric unwrap(ToType))); 18710b57cec5SDimitry Andric } 18720b57cec5SDimitry Andric 18730b57cec5SDimitry Andric LLVMValueRef LLVMConstAddrSpaceCast(LLVMValueRef ConstantVal, 18740b57cec5SDimitry Andric LLVMTypeRef ToType) { 18750b57cec5SDimitry Andric return wrap(ConstantExpr::getAddrSpaceCast(unwrap<Constant>(ConstantVal), 18760b57cec5SDimitry Andric unwrap(ToType))); 18770b57cec5SDimitry Andric } 18780b57cec5SDimitry Andric 18790b57cec5SDimitry Andric LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal, 18800b57cec5SDimitry Andric LLVMTypeRef ToType) { 18810b57cec5SDimitry Andric return wrap(ConstantExpr::getTruncOrBitCast(unwrap<Constant>(ConstantVal), 18820b57cec5SDimitry Andric unwrap(ToType))); 18830b57cec5SDimitry Andric } 18840b57cec5SDimitry Andric 18850b57cec5SDimitry Andric LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal, 18860b57cec5SDimitry Andric LLVMTypeRef ToType) { 18870b57cec5SDimitry Andric return wrap(ConstantExpr::getPointerCast(unwrap<Constant>(ConstantVal), 18880b57cec5SDimitry Andric unwrap(ToType))); 18890b57cec5SDimitry Andric } 18900b57cec5SDimitry Andric 18910b57cec5SDimitry Andric LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant, 18920b57cec5SDimitry Andric LLVMValueRef IndexConstant) { 18930b57cec5SDimitry Andric return wrap(ConstantExpr::getExtractElement(unwrap<Constant>(VectorConstant), 18940b57cec5SDimitry Andric unwrap<Constant>(IndexConstant))); 18950b57cec5SDimitry Andric } 18960b57cec5SDimitry Andric 18970b57cec5SDimitry Andric LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant, 18980b57cec5SDimitry Andric LLVMValueRef ElementValueConstant, 18990b57cec5SDimitry Andric LLVMValueRef IndexConstant) { 19000b57cec5SDimitry Andric return wrap(ConstantExpr::getInsertElement(unwrap<Constant>(VectorConstant), 19010b57cec5SDimitry Andric unwrap<Constant>(ElementValueConstant), 19020b57cec5SDimitry Andric unwrap<Constant>(IndexConstant))); 19030b57cec5SDimitry Andric } 19040b57cec5SDimitry Andric 19050b57cec5SDimitry Andric LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant, 19060b57cec5SDimitry Andric LLVMValueRef VectorBConstant, 19070b57cec5SDimitry Andric LLVMValueRef MaskConstant) { 19085ffd83dbSDimitry Andric SmallVector<int, 16> IntMask; 19095ffd83dbSDimitry Andric ShuffleVectorInst::getShuffleMask(unwrap<Constant>(MaskConstant), IntMask); 19100b57cec5SDimitry Andric return wrap(ConstantExpr::getShuffleVector(unwrap<Constant>(VectorAConstant), 19110b57cec5SDimitry Andric unwrap<Constant>(VectorBConstant), 19125ffd83dbSDimitry Andric IntMask)); 19130b57cec5SDimitry Andric } 19140b57cec5SDimitry Andric 19150b57cec5SDimitry Andric LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString, 19160b57cec5SDimitry Andric const char *Constraints, 19170b57cec5SDimitry Andric LLVMBool HasSideEffects, 19180b57cec5SDimitry Andric LLVMBool IsAlignStack) { 19190b57cec5SDimitry Andric return wrap(InlineAsm::get(dyn_cast<FunctionType>(unwrap(Ty)), AsmString, 19200b57cec5SDimitry Andric Constraints, HasSideEffects, IsAlignStack)); 19210b57cec5SDimitry Andric } 19220b57cec5SDimitry Andric 19230b57cec5SDimitry Andric LLVMValueRef LLVMBlockAddress(LLVMValueRef F, LLVMBasicBlockRef BB) { 19240b57cec5SDimitry Andric return wrap(BlockAddress::get(unwrap<Function>(F), unwrap(BB))); 19250b57cec5SDimitry Andric } 19260b57cec5SDimitry Andric 1927*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetBlockAddressFunction(LLVMValueRef BlockAddr) { 1928*0fca6ea1SDimitry Andric return wrap(unwrap<BlockAddress>(BlockAddr)->getFunction()); 1929*0fca6ea1SDimitry Andric } 1930*0fca6ea1SDimitry Andric 1931*0fca6ea1SDimitry Andric LLVMBasicBlockRef LLVMGetBlockAddressBasicBlock(LLVMValueRef BlockAddr) { 1932*0fca6ea1SDimitry Andric return wrap(unwrap<BlockAddress>(BlockAddr)->getBasicBlock()); 1933*0fca6ea1SDimitry Andric } 1934*0fca6ea1SDimitry Andric 19350b57cec5SDimitry Andric /*--.. Operations on global variables, functions, and aliases (globals) ....--*/ 19360b57cec5SDimitry Andric 19370b57cec5SDimitry Andric LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global) { 19380b57cec5SDimitry Andric return wrap(unwrap<GlobalValue>(Global)->getParent()); 19390b57cec5SDimitry Andric } 19400b57cec5SDimitry Andric 19410b57cec5SDimitry Andric LLVMBool LLVMIsDeclaration(LLVMValueRef Global) { 19420b57cec5SDimitry Andric return unwrap<GlobalValue>(Global)->isDeclaration(); 19430b57cec5SDimitry Andric } 19440b57cec5SDimitry Andric 19450b57cec5SDimitry Andric LLVMLinkage LLVMGetLinkage(LLVMValueRef Global) { 19460b57cec5SDimitry Andric switch (unwrap<GlobalValue>(Global)->getLinkage()) { 19470b57cec5SDimitry Andric case GlobalValue::ExternalLinkage: 19480b57cec5SDimitry Andric return LLVMExternalLinkage; 19490b57cec5SDimitry Andric case GlobalValue::AvailableExternallyLinkage: 19500b57cec5SDimitry Andric return LLVMAvailableExternallyLinkage; 19510b57cec5SDimitry Andric case GlobalValue::LinkOnceAnyLinkage: 19520b57cec5SDimitry Andric return LLVMLinkOnceAnyLinkage; 19530b57cec5SDimitry Andric case GlobalValue::LinkOnceODRLinkage: 19540b57cec5SDimitry Andric return LLVMLinkOnceODRLinkage; 19550b57cec5SDimitry Andric case GlobalValue::WeakAnyLinkage: 19560b57cec5SDimitry Andric return LLVMWeakAnyLinkage; 19570b57cec5SDimitry Andric case GlobalValue::WeakODRLinkage: 19580b57cec5SDimitry Andric return LLVMWeakODRLinkage; 19590b57cec5SDimitry Andric case GlobalValue::AppendingLinkage: 19600b57cec5SDimitry Andric return LLVMAppendingLinkage; 19610b57cec5SDimitry Andric case GlobalValue::InternalLinkage: 19620b57cec5SDimitry Andric return LLVMInternalLinkage; 19630b57cec5SDimitry Andric case GlobalValue::PrivateLinkage: 19640b57cec5SDimitry Andric return LLVMPrivateLinkage; 19650b57cec5SDimitry Andric case GlobalValue::ExternalWeakLinkage: 19660b57cec5SDimitry Andric return LLVMExternalWeakLinkage; 19670b57cec5SDimitry Andric case GlobalValue::CommonLinkage: 19680b57cec5SDimitry Andric return LLVMCommonLinkage; 19690b57cec5SDimitry Andric } 19700b57cec5SDimitry Andric 19710b57cec5SDimitry Andric llvm_unreachable("Invalid GlobalValue linkage!"); 19720b57cec5SDimitry Andric } 19730b57cec5SDimitry Andric 19740b57cec5SDimitry Andric void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage) { 19750b57cec5SDimitry Andric GlobalValue *GV = unwrap<GlobalValue>(Global); 19760b57cec5SDimitry Andric 19770b57cec5SDimitry Andric switch (Linkage) { 19780b57cec5SDimitry Andric case LLVMExternalLinkage: 19790b57cec5SDimitry Andric GV->setLinkage(GlobalValue::ExternalLinkage); 19800b57cec5SDimitry Andric break; 19810b57cec5SDimitry Andric case LLVMAvailableExternallyLinkage: 19820b57cec5SDimitry Andric GV->setLinkage(GlobalValue::AvailableExternallyLinkage); 19830b57cec5SDimitry Andric break; 19840b57cec5SDimitry Andric case LLVMLinkOnceAnyLinkage: 19850b57cec5SDimitry Andric GV->setLinkage(GlobalValue::LinkOnceAnyLinkage); 19860b57cec5SDimitry Andric break; 19870b57cec5SDimitry Andric case LLVMLinkOnceODRLinkage: 19880b57cec5SDimitry Andric GV->setLinkage(GlobalValue::LinkOnceODRLinkage); 19890b57cec5SDimitry Andric break; 19900b57cec5SDimitry Andric case LLVMLinkOnceODRAutoHideLinkage: 19910b57cec5SDimitry Andric LLVM_DEBUG( 19920b57cec5SDimitry Andric errs() << "LLVMSetLinkage(): LLVMLinkOnceODRAutoHideLinkage is no " 19930b57cec5SDimitry Andric "longer supported."); 19940b57cec5SDimitry Andric break; 19950b57cec5SDimitry Andric case LLVMWeakAnyLinkage: 19960b57cec5SDimitry Andric GV->setLinkage(GlobalValue::WeakAnyLinkage); 19970b57cec5SDimitry Andric break; 19980b57cec5SDimitry Andric case LLVMWeakODRLinkage: 19990b57cec5SDimitry Andric GV->setLinkage(GlobalValue::WeakODRLinkage); 20000b57cec5SDimitry Andric break; 20010b57cec5SDimitry Andric case LLVMAppendingLinkage: 20020b57cec5SDimitry Andric GV->setLinkage(GlobalValue::AppendingLinkage); 20030b57cec5SDimitry Andric break; 20040b57cec5SDimitry Andric case LLVMInternalLinkage: 20050b57cec5SDimitry Andric GV->setLinkage(GlobalValue::InternalLinkage); 20060b57cec5SDimitry Andric break; 20070b57cec5SDimitry Andric case LLVMPrivateLinkage: 20080b57cec5SDimitry Andric GV->setLinkage(GlobalValue::PrivateLinkage); 20090b57cec5SDimitry Andric break; 20100b57cec5SDimitry Andric case LLVMLinkerPrivateLinkage: 20110b57cec5SDimitry Andric GV->setLinkage(GlobalValue::PrivateLinkage); 20120b57cec5SDimitry Andric break; 20130b57cec5SDimitry Andric case LLVMLinkerPrivateWeakLinkage: 20140b57cec5SDimitry Andric GV->setLinkage(GlobalValue::PrivateLinkage); 20150b57cec5SDimitry Andric break; 20160b57cec5SDimitry Andric case LLVMDLLImportLinkage: 20170b57cec5SDimitry Andric LLVM_DEBUG( 20180b57cec5SDimitry Andric errs() 20190b57cec5SDimitry Andric << "LLVMSetLinkage(): LLVMDLLImportLinkage is no longer supported."); 20200b57cec5SDimitry Andric break; 20210b57cec5SDimitry Andric case LLVMDLLExportLinkage: 20220b57cec5SDimitry Andric LLVM_DEBUG( 20230b57cec5SDimitry Andric errs() 20240b57cec5SDimitry Andric << "LLVMSetLinkage(): LLVMDLLExportLinkage is no longer supported."); 20250b57cec5SDimitry Andric break; 20260b57cec5SDimitry Andric case LLVMExternalWeakLinkage: 20270b57cec5SDimitry Andric GV->setLinkage(GlobalValue::ExternalWeakLinkage); 20280b57cec5SDimitry Andric break; 20290b57cec5SDimitry Andric case LLVMGhostLinkage: 20300b57cec5SDimitry Andric LLVM_DEBUG( 20310b57cec5SDimitry Andric errs() << "LLVMSetLinkage(): LLVMGhostLinkage is no longer supported."); 20320b57cec5SDimitry Andric break; 20330b57cec5SDimitry Andric case LLVMCommonLinkage: 20340b57cec5SDimitry Andric GV->setLinkage(GlobalValue::CommonLinkage); 20350b57cec5SDimitry Andric break; 20360b57cec5SDimitry Andric } 20370b57cec5SDimitry Andric } 20380b57cec5SDimitry Andric 20390b57cec5SDimitry Andric const char *LLVMGetSection(LLVMValueRef Global) { 20400b57cec5SDimitry Andric // Using .data() is safe because of how GlobalObject::setSection is 20410b57cec5SDimitry Andric // implemented. 20420b57cec5SDimitry Andric return unwrap<GlobalValue>(Global)->getSection().data(); 20430b57cec5SDimitry Andric } 20440b57cec5SDimitry Andric 20450b57cec5SDimitry Andric void LLVMSetSection(LLVMValueRef Global, const char *Section) { 20460b57cec5SDimitry Andric unwrap<GlobalObject>(Global)->setSection(Section); 20470b57cec5SDimitry Andric } 20480b57cec5SDimitry Andric 20490b57cec5SDimitry Andric LLVMVisibility LLVMGetVisibility(LLVMValueRef Global) { 20500b57cec5SDimitry Andric return static_cast<LLVMVisibility>( 20510b57cec5SDimitry Andric unwrap<GlobalValue>(Global)->getVisibility()); 20520b57cec5SDimitry Andric } 20530b57cec5SDimitry Andric 20540b57cec5SDimitry Andric void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz) { 20550b57cec5SDimitry Andric unwrap<GlobalValue>(Global) 20560b57cec5SDimitry Andric ->setVisibility(static_cast<GlobalValue::VisibilityTypes>(Viz)); 20570b57cec5SDimitry Andric } 20580b57cec5SDimitry Andric 20590b57cec5SDimitry Andric LLVMDLLStorageClass LLVMGetDLLStorageClass(LLVMValueRef Global) { 20600b57cec5SDimitry Andric return static_cast<LLVMDLLStorageClass>( 20610b57cec5SDimitry Andric unwrap<GlobalValue>(Global)->getDLLStorageClass()); 20620b57cec5SDimitry Andric } 20630b57cec5SDimitry Andric 20640b57cec5SDimitry Andric void LLVMSetDLLStorageClass(LLVMValueRef Global, LLVMDLLStorageClass Class) { 20650b57cec5SDimitry Andric unwrap<GlobalValue>(Global)->setDLLStorageClass( 20660b57cec5SDimitry Andric static_cast<GlobalValue::DLLStorageClassTypes>(Class)); 20670b57cec5SDimitry Andric } 20680b57cec5SDimitry Andric 20690b57cec5SDimitry Andric LLVMUnnamedAddr LLVMGetUnnamedAddress(LLVMValueRef Global) { 20700b57cec5SDimitry Andric switch (unwrap<GlobalValue>(Global)->getUnnamedAddr()) { 20710b57cec5SDimitry Andric case GlobalVariable::UnnamedAddr::None: 20720b57cec5SDimitry Andric return LLVMNoUnnamedAddr; 20730b57cec5SDimitry Andric case GlobalVariable::UnnamedAddr::Local: 20740b57cec5SDimitry Andric return LLVMLocalUnnamedAddr; 20750b57cec5SDimitry Andric case GlobalVariable::UnnamedAddr::Global: 20760b57cec5SDimitry Andric return LLVMGlobalUnnamedAddr; 20770b57cec5SDimitry Andric } 20780b57cec5SDimitry Andric llvm_unreachable("Unknown UnnamedAddr kind!"); 20790b57cec5SDimitry Andric } 20800b57cec5SDimitry Andric 20810b57cec5SDimitry Andric void LLVMSetUnnamedAddress(LLVMValueRef Global, LLVMUnnamedAddr UnnamedAddr) { 20820b57cec5SDimitry Andric GlobalValue *GV = unwrap<GlobalValue>(Global); 20830b57cec5SDimitry Andric 20840b57cec5SDimitry Andric switch (UnnamedAddr) { 20850b57cec5SDimitry Andric case LLVMNoUnnamedAddr: 20860b57cec5SDimitry Andric return GV->setUnnamedAddr(GlobalVariable::UnnamedAddr::None); 20870b57cec5SDimitry Andric case LLVMLocalUnnamedAddr: 20880b57cec5SDimitry Andric return GV->setUnnamedAddr(GlobalVariable::UnnamedAddr::Local); 20890b57cec5SDimitry Andric case LLVMGlobalUnnamedAddr: 20900b57cec5SDimitry Andric return GV->setUnnamedAddr(GlobalVariable::UnnamedAddr::Global); 20910b57cec5SDimitry Andric } 20920b57cec5SDimitry Andric } 20930b57cec5SDimitry Andric 20940b57cec5SDimitry Andric LLVMBool LLVMHasUnnamedAddr(LLVMValueRef Global) { 20950b57cec5SDimitry Andric return unwrap<GlobalValue>(Global)->hasGlobalUnnamedAddr(); 20960b57cec5SDimitry Andric } 20970b57cec5SDimitry Andric 20980b57cec5SDimitry Andric void LLVMSetUnnamedAddr(LLVMValueRef Global, LLVMBool HasUnnamedAddr) { 20990b57cec5SDimitry Andric unwrap<GlobalValue>(Global)->setUnnamedAddr( 21000b57cec5SDimitry Andric HasUnnamedAddr ? GlobalValue::UnnamedAddr::Global 21010b57cec5SDimitry Andric : GlobalValue::UnnamedAddr::None); 21020b57cec5SDimitry Andric } 21030b57cec5SDimitry Andric 21040b57cec5SDimitry Andric LLVMTypeRef LLVMGlobalGetValueType(LLVMValueRef Global) { 21050b57cec5SDimitry Andric return wrap(unwrap<GlobalValue>(Global)->getValueType()); 21060b57cec5SDimitry Andric } 21070b57cec5SDimitry Andric 21080b57cec5SDimitry Andric /*--.. Operations on global variables, load and store instructions .........--*/ 21090b57cec5SDimitry Andric 21100b57cec5SDimitry Andric unsigned LLVMGetAlignment(LLVMValueRef V) { 2111bdd1243dSDimitry Andric Value *P = unwrap(V); 21125ffd83dbSDimitry Andric if (GlobalObject *GV = dyn_cast<GlobalObject>(P)) 211381ad6265SDimitry Andric return GV->getAlign() ? GV->getAlign()->value() : 0; 21140b57cec5SDimitry Andric if (AllocaInst *AI = dyn_cast<AllocaInst>(P)) 211581ad6265SDimitry Andric return AI->getAlign().value(); 21160b57cec5SDimitry Andric if (LoadInst *LI = dyn_cast<LoadInst>(P)) 211781ad6265SDimitry Andric return LI->getAlign().value(); 21180b57cec5SDimitry Andric if (StoreInst *SI = dyn_cast<StoreInst>(P)) 211981ad6265SDimitry Andric return SI->getAlign().value(); 2120fe6060f1SDimitry Andric if (AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(P)) 2121fe6060f1SDimitry Andric return RMWI->getAlign().value(); 2122fe6060f1SDimitry Andric if (AtomicCmpXchgInst *CXI = dyn_cast<AtomicCmpXchgInst>(P)) 2123fe6060f1SDimitry Andric return CXI->getAlign().value(); 21240b57cec5SDimitry Andric 21250b57cec5SDimitry Andric llvm_unreachable( 2126fe6060f1SDimitry Andric "only GlobalValue, AllocaInst, LoadInst, StoreInst, AtomicRMWInst, " 2127fe6060f1SDimitry Andric "and AtomicCmpXchgInst have alignment"); 21280b57cec5SDimitry Andric } 21290b57cec5SDimitry Andric 21300b57cec5SDimitry Andric void LLVMSetAlignment(LLVMValueRef V, unsigned Bytes) { 2131bdd1243dSDimitry Andric Value *P = unwrap(V); 21320b57cec5SDimitry Andric if (GlobalObject *GV = dyn_cast<GlobalObject>(P)) 21338bcb0991SDimitry Andric GV->setAlignment(MaybeAlign(Bytes)); 21340b57cec5SDimitry Andric else if (AllocaInst *AI = dyn_cast<AllocaInst>(P)) 21355ffd83dbSDimitry Andric AI->setAlignment(Align(Bytes)); 21360b57cec5SDimitry Andric else if (LoadInst *LI = dyn_cast<LoadInst>(P)) 21375ffd83dbSDimitry Andric LI->setAlignment(Align(Bytes)); 21380b57cec5SDimitry Andric else if (StoreInst *SI = dyn_cast<StoreInst>(P)) 21395ffd83dbSDimitry Andric SI->setAlignment(Align(Bytes)); 2140fe6060f1SDimitry Andric else if (AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(P)) 2141fe6060f1SDimitry Andric RMWI->setAlignment(Align(Bytes)); 2142fe6060f1SDimitry Andric else if (AtomicCmpXchgInst *CXI = dyn_cast<AtomicCmpXchgInst>(P)) 2143fe6060f1SDimitry Andric CXI->setAlignment(Align(Bytes)); 21440b57cec5SDimitry Andric else 21450b57cec5SDimitry Andric llvm_unreachable( 2146fe6060f1SDimitry Andric "only GlobalValue, AllocaInst, LoadInst, StoreInst, AtomicRMWInst, and " 2147fe6060f1SDimitry Andric "and AtomicCmpXchgInst have alignment"); 21480b57cec5SDimitry Andric } 21490b57cec5SDimitry Andric 21500b57cec5SDimitry Andric LLVMValueMetadataEntry *LLVMGlobalCopyAllMetadata(LLVMValueRef Value, 21510b57cec5SDimitry Andric size_t *NumEntries) { 21520b57cec5SDimitry Andric return llvm_getMetadata(NumEntries, [&Value](MetadataEntries &Entries) { 2153e8d8bef9SDimitry Andric Entries.clear(); 21540b57cec5SDimitry Andric if (Instruction *Instr = dyn_cast<Instruction>(unwrap(Value))) { 21550b57cec5SDimitry Andric Instr->getAllMetadata(Entries); 21560b57cec5SDimitry Andric } else { 21570b57cec5SDimitry Andric unwrap<GlobalObject>(Value)->getAllMetadata(Entries); 21580b57cec5SDimitry Andric } 21590b57cec5SDimitry Andric }); 21600b57cec5SDimitry Andric } 21610b57cec5SDimitry Andric 21620b57cec5SDimitry Andric unsigned LLVMValueMetadataEntriesGetKind(LLVMValueMetadataEntry *Entries, 21630b57cec5SDimitry Andric unsigned Index) { 21640b57cec5SDimitry Andric LLVMOpaqueValueMetadataEntry MVE = 21650b57cec5SDimitry Andric static_cast<LLVMOpaqueValueMetadataEntry>(Entries[Index]); 21660b57cec5SDimitry Andric return MVE.Kind; 21670b57cec5SDimitry Andric } 21680b57cec5SDimitry Andric 21690b57cec5SDimitry Andric LLVMMetadataRef 21700b57cec5SDimitry Andric LLVMValueMetadataEntriesGetMetadata(LLVMValueMetadataEntry *Entries, 21710b57cec5SDimitry Andric unsigned Index) { 21720b57cec5SDimitry Andric LLVMOpaqueValueMetadataEntry MVE = 21730b57cec5SDimitry Andric static_cast<LLVMOpaqueValueMetadataEntry>(Entries[Index]); 21740b57cec5SDimitry Andric return MVE.Metadata; 21750b57cec5SDimitry Andric } 21760b57cec5SDimitry Andric 21770b57cec5SDimitry Andric void LLVMDisposeValueMetadataEntries(LLVMValueMetadataEntry *Entries) { 21780b57cec5SDimitry Andric free(Entries); 21790b57cec5SDimitry Andric } 21800b57cec5SDimitry Andric 21810b57cec5SDimitry Andric void LLVMGlobalSetMetadata(LLVMValueRef Global, unsigned Kind, 21820b57cec5SDimitry Andric LLVMMetadataRef MD) { 21830b57cec5SDimitry Andric unwrap<GlobalObject>(Global)->setMetadata(Kind, unwrap<MDNode>(MD)); 21840b57cec5SDimitry Andric } 21850b57cec5SDimitry Andric 21860b57cec5SDimitry Andric void LLVMGlobalEraseMetadata(LLVMValueRef Global, unsigned Kind) { 21870b57cec5SDimitry Andric unwrap<GlobalObject>(Global)->eraseMetadata(Kind); 21880b57cec5SDimitry Andric } 21890b57cec5SDimitry Andric 21900b57cec5SDimitry Andric void LLVMGlobalClearMetadata(LLVMValueRef Global) { 21910b57cec5SDimitry Andric unwrap<GlobalObject>(Global)->clearMetadata(); 21920b57cec5SDimitry Andric } 21930b57cec5SDimitry Andric 21940b57cec5SDimitry Andric /*--.. Operations on global variables ......................................--*/ 21950b57cec5SDimitry Andric 21960b57cec5SDimitry Andric LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name) { 21970b57cec5SDimitry Andric return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false, 21980b57cec5SDimitry Andric GlobalValue::ExternalLinkage, nullptr, Name)); 21990b57cec5SDimitry Andric } 22000b57cec5SDimitry Andric 22010b57cec5SDimitry Andric LLVMValueRef LLVMAddGlobalInAddressSpace(LLVMModuleRef M, LLVMTypeRef Ty, 22020b57cec5SDimitry Andric const char *Name, 22030b57cec5SDimitry Andric unsigned AddressSpace) { 22040b57cec5SDimitry Andric return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false, 22050b57cec5SDimitry Andric GlobalValue::ExternalLinkage, nullptr, Name, 22060b57cec5SDimitry Andric nullptr, GlobalVariable::NotThreadLocal, 22070b57cec5SDimitry Andric AddressSpace)); 22080b57cec5SDimitry Andric } 22090b57cec5SDimitry Andric 22100b57cec5SDimitry Andric LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name) { 22110b57cec5SDimitry Andric return wrap(unwrap(M)->getNamedGlobal(Name)); 22120b57cec5SDimitry Andric } 22130b57cec5SDimitry Andric 22140b57cec5SDimitry Andric LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M) { 22150b57cec5SDimitry Andric Module *Mod = unwrap(M); 22160b57cec5SDimitry Andric Module::global_iterator I = Mod->global_begin(); 22170b57cec5SDimitry Andric if (I == Mod->global_end()) 22180b57cec5SDimitry Andric return nullptr; 22190b57cec5SDimitry Andric return wrap(&*I); 22200b57cec5SDimitry Andric } 22210b57cec5SDimitry Andric 22220b57cec5SDimitry Andric LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M) { 22230b57cec5SDimitry Andric Module *Mod = unwrap(M); 22240b57cec5SDimitry Andric Module::global_iterator I = Mod->global_end(); 22250b57cec5SDimitry Andric if (I == Mod->global_begin()) 22260b57cec5SDimitry Andric return nullptr; 22270b57cec5SDimitry Andric return wrap(&*--I); 22280b57cec5SDimitry Andric } 22290b57cec5SDimitry Andric 22300b57cec5SDimitry Andric LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar) { 22310b57cec5SDimitry Andric GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar); 22320b57cec5SDimitry Andric Module::global_iterator I(GV); 22330b57cec5SDimitry Andric if (++I == GV->getParent()->global_end()) 22340b57cec5SDimitry Andric return nullptr; 22350b57cec5SDimitry Andric return wrap(&*I); 22360b57cec5SDimitry Andric } 22370b57cec5SDimitry Andric 22380b57cec5SDimitry Andric LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar) { 22390b57cec5SDimitry Andric GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar); 22400b57cec5SDimitry Andric Module::global_iterator I(GV); 22410b57cec5SDimitry Andric if (I == GV->getParent()->global_begin()) 22420b57cec5SDimitry Andric return nullptr; 22430b57cec5SDimitry Andric return wrap(&*--I); 22440b57cec5SDimitry Andric } 22450b57cec5SDimitry Andric 22460b57cec5SDimitry Andric void LLVMDeleteGlobal(LLVMValueRef GlobalVar) { 22470b57cec5SDimitry Andric unwrap<GlobalVariable>(GlobalVar)->eraseFromParent(); 22480b57cec5SDimitry Andric } 22490b57cec5SDimitry Andric 22500b57cec5SDimitry Andric LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar) { 22510b57cec5SDimitry Andric GlobalVariable* GV = unwrap<GlobalVariable>(GlobalVar); 22520b57cec5SDimitry Andric if ( !GV->hasInitializer() ) 22530b57cec5SDimitry Andric return nullptr; 22540b57cec5SDimitry Andric return wrap(GV->getInitializer()); 22550b57cec5SDimitry Andric } 22560b57cec5SDimitry Andric 22570b57cec5SDimitry Andric void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal) { 22580b57cec5SDimitry Andric unwrap<GlobalVariable>(GlobalVar) 22590b57cec5SDimitry Andric ->setInitializer(unwrap<Constant>(ConstantVal)); 22600b57cec5SDimitry Andric } 22610b57cec5SDimitry Andric 22620b57cec5SDimitry Andric LLVMBool LLVMIsThreadLocal(LLVMValueRef GlobalVar) { 22630b57cec5SDimitry Andric return unwrap<GlobalVariable>(GlobalVar)->isThreadLocal(); 22640b57cec5SDimitry Andric } 22650b57cec5SDimitry Andric 22660b57cec5SDimitry Andric void LLVMSetThreadLocal(LLVMValueRef GlobalVar, LLVMBool IsThreadLocal) { 22670b57cec5SDimitry Andric unwrap<GlobalVariable>(GlobalVar)->setThreadLocal(IsThreadLocal != 0); 22680b57cec5SDimitry Andric } 22690b57cec5SDimitry Andric 22700b57cec5SDimitry Andric LLVMBool LLVMIsGlobalConstant(LLVMValueRef GlobalVar) { 22710b57cec5SDimitry Andric return unwrap<GlobalVariable>(GlobalVar)->isConstant(); 22720b57cec5SDimitry Andric } 22730b57cec5SDimitry Andric 22740b57cec5SDimitry Andric void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, LLVMBool IsConstant) { 22750b57cec5SDimitry Andric unwrap<GlobalVariable>(GlobalVar)->setConstant(IsConstant != 0); 22760b57cec5SDimitry Andric } 22770b57cec5SDimitry Andric 22780b57cec5SDimitry Andric LLVMThreadLocalMode LLVMGetThreadLocalMode(LLVMValueRef GlobalVar) { 22790b57cec5SDimitry Andric switch (unwrap<GlobalVariable>(GlobalVar)->getThreadLocalMode()) { 22800b57cec5SDimitry Andric case GlobalVariable::NotThreadLocal: 22810b57cec5SDimitry Andric return LLVMNotThreadLocal; 22820b57cec5SDimitry Andric case GlobalVariable::GeneralDynamicTLSModel: 22830b57cec5SDimitry Andric return LLVMGeneralDynamicTLSModel; 22840b57cec5SDimitry Andric case GlobalVariable::LocalDynamicTLSModel: 22850b57cec5SDimitry Andric return LLVMLocalDynamicTLSModel; 22860b57cec5SDimitry Andric case GlobalVariable::InitialExecTLSModel: 22870b57cec5SDimitry Andric return LLVMInitialExecTLSModel; 22880b57cec5SDimitry Andric case GlobalVariable::LocalExecTLSModel: 22890b57cec5SDimitry Andric return LLVMLocalExecTLSModel; 22900b57cec5SDimitry Andric } 22910b57cec5SDimitry Andric 22920b57cec5SDimitry Andric llvm_unreachable("Invalid GlobalVariable thread local mode"); 22930b57cec5SDimitry Andric } 22940b57cec5SDimitry Andric 22950b57cec5SDimitry Andric void LLVMSetThreadLocalMode(LLVMValueRef GlobalVar, LLVMThreadLocalMode Mode) { 22960b57cec5SDimitry Andric GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar); 22970b57cec5SDimitry Andric 22980b57cec5SDimitry Andric switch (Mode) { 22990b57cec5SDimitry Andric case LLVMNotThreadLocal: 23000b57cec5SDimitry Andric GV->setThreadLocalMode(GlobalVariable::NotThreadLocal); 23010b57cec5SDimitry Andric break; 23020b57cec5SDimitry Andric case LLVMGeneralDynamicTLSModel: 23030b57cec5SDimitry Andric GV->setThreadLocalMode(GlobalVariable::GeneralDynamicTLSModel); 23040b57cec5SDimitry Andric break; 23050b57cec5SDimitry Andric case LLVMLocalDynamicTLSModel: 23060b57cec5SDimitry Andric GV->setThreadLocalMode(GlobalVariable::LocalDynamicTLSModel); 23070b57cec5SDimitry Andric break; 23080b57cec5SDimitry Andric case LLVMInitialExecTLSModel: 23090b57cec5SDimitry Andric GV->setThreadLocalMode(GlobalVariable::InitialExecTLSModel); 23100b57cec5SDimitry Andric break; 23110b57cec5SDimitry Andric case LLVMLocalExecTLSModel: 23120b57cec5SDimitry Andric GV->setThreadLocalMode(GlobalVariable::LocalExecTLSModel); 23130b57cec5SDimitry Andric break; 23140b57cec5SDimitry Andric } 23150b57cec5SDimitry Andric } 23160b57cec5SDimitry Andric 23170b57cec5SDimitry Andric LLVMBool LLVMIsExternallyInitialized(LLVMValueRef GlobalVar) { 23180b57cec5SDimitry Andric return unwrap<GlobalVariable>(GlobalVar)->isExternallyInitialized(); 23190b57cec5SDimitry Andric } 23200b57cec5SDimitry Andric 23210b57cec5SDimitry Andric void LLVMSetExternallyInitialized(LLVMValueRef GlobalVar, LLVMBool IsExtInit) { 23220b57cec5SDimitry Andric unwrap<GlobalVariable>(GlobalVar)->setExternallyInitialized(IsExtInit); 23230b57cec5SDimitry Andric } 23240b57cec5SDimitry Andric 23250b57cec5SDimitry Andric /*--.. Operations on aliases ......................................--*/ 23260b57cec5SDimitry Andric 23274824e7fdSDimitry Andric LLVMValueRef LLVMAddAlias2(LLVMModuleRef M, LLVMTypeRef ValueTy, 23284824e7fdSDimitry Andric unsigned AddrSpace, LLVMValueRef Aliasee, 23294824e7fdSDimitry Andric const char *Name) { 23304824e7fdSDimitry Andric return wrap(GlobalAlias::create(unwrap(ValueTy), AddrSpace, 23314824e7fdSDimitry Andric GlobalValue::ExternalLinkage, Name, 23324824e7fdSDimitry Andric unwrap<Constant>(Aliasee), unwrap(M))); 23334824e7fdSDimitry Andric } 23344824e7fdSDimitry Andric 23350b57cec5SDimitry Andric LLVMValueRef LLVMGetNamedGlobalAlias(LLVMModuleRef M, 23360b57cec5SDimitry Andric const char *Name, size_t NameLen) { 233704eeddc0SDimitry Andric return wrap(unwrap(M)->getNamedAlias(StringRef(Name, NameLen))); 23380b57cec5SDimitry Andric } 23390b57cec5SDimitry Andric 23400b57cec5SDimitry Andric LLVMValueRef LLVMGetFirstGlobalAlias(LLVMModuleRef M) { 23410b57cec5SDimitry Andric Module *Mod = unwrap(M); 23420b57cec5SDimitry Andric Module::alias_iterator I = Mod->alias_begin(); 23430b57cec5SDimitry Andric if (I == Mod->alias_end()) 23440b57cec5SDimitry Andric return nullptr; 23450b57cec5SDimitry Andric return wrap(&*I); 23460b57cec5SDimitry Andric } 23470b57cec5SDimitry Andric 23480b57cec5SDimitry Andric LLVMValueRef LLVMGetLastGlobalAlias(LLVMModuleRef M) { 23490b57cec5SDimitry Andric Module *Mod = unwrap(M); 23500b57cec5SDimitry Andric Module::alias_iterator I = Mod->alias_end(); 23510b57cec5SDimitry Andric if (I == Mod->alias_begin()) 23520b57cec5SDimitry Andric return nullptr; 23530b57cec5SDimitry Andric return wrap(&*--I); 23540b57cec5SDimitry Andric } 23550b57cec5SDimitry Andric 23560b57cec5SDimitry Andric LLVMValueRef LLVMGetNextGlobalAlias(LLVMValueRef GA) { 23570b57cec5SDimitry Andric GlobalAlias *Alias = unwrap<GlobalAlias>(GA); 23580b57cec5SDimitry Andric Module::alias_iterator I(Alias); 23590b57cec5SDimitry Andric if (++I == Alias->getParent()->alias_end()) 23600b57cec5SDimitry Andric return nullptr; 23610b57cec5SDimitry Andric return wrap(&*I); 23620b57cec5SDimitry Andric } 23630b57cec5SDimitry Andric 23640b57cec5SDimitry Andric LLVMValueRef LLVMGetPreviousGlobalAlias(LLVMValueRef GA) { 23650b57cec5SDimitry Andric GlobalAlias *Alias = unwrap<GlobalAlias>(GA); 23660b57cec5SDimitry Andric Module::alias_iterator I(Alias); 23670b57cec5SDimitry Andric if (I == Alias->getParent()->alias_begin()) 23680b57cec5SDimitry Andric return nullptr; 23690b57cec5SDimitry Andric return wrap(&*--I); 23700b57cec5SDimitry Andric } 23710b57cec5SDimitry Andric 23720b57cec5SDimitry Andric LLVMValueRef LLVMAliasGetAliasee(LLVMValueRef Alias) { 23730b57cec5SDimitry Andric return wrap(unwrap<GlobalAlias>(Alias)->getAliasee()); 23740b57cec5SDimitry Andric } 23750b57cec5SDimitry Andric 23760b57cec5SDimitry Andric void LLVMAliasSetAliasee(LLVMValueRef Alias, LLVMValueRef Aliasee) { 23770b57cec5SDimitry Andric unwrap<GlobalAlias>(Alias)->setAliasee(unwrap<Constant>(Aliasee)); 23780b57cec5SDimitry Andric } 23790b57cec5SDimitry Andric 23800b57cec5SDimitry Andric /*--.. Operations on functions .............................................--*/ 23810b57cec5SDimitry Andric 23820b57cec5SDimitry Andric LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name, 23830b57cec5SDimitry Andric LLVMTypeRef FunctionTy) { 23840b57cec5SDimitry Andric return wrap(Function::Create(unwrap<FunctionType>(FunctionTy), 23850b57cec5SDimitry Andric GlobalValue::ExternalLinkage, Name, unwrap(M))); 23860b57cec5SDimitry Andric } 23870b57cec5SDimitry Andric 23880b57cec5SDimitry Andric LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name) { 23890b57cec5SDimitry Andric return wrap(unwrap(M)->getFunction(Name)); 23900b57cec5SDimitry Andric } 23910b57cec5SDimitry Andric 23920b57cec5SDimitry Andric LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M) { 23930b57cec5SDimitry Andric Module *Mod = unwrap(M); 23940b57cec5SDimitry Andric Module::iterator I = Mod->begin(); 23950b57cec5SDimitry Andric if (I == Mod->end()) 23960b57cec5SDimitry Andric return nullptr; 23970b57cec5SDimitry Andric return wrap(&*I); 23980b57cec5SDimitry Andric } 23990b57cec5SDimitry Andric 24000b57cec5SDimitry Andric LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M) { 24010b57cec5SDimitry Andric Module *Mod = unwrap(M); 24020b57cec5SDimitry Andric Module::iterator I = Mod->end(); 24030b57cec5SDimitry Andric if (I == Mod->begin()) 24040b57cec5SDimitry Andric return nullptr; 24050b57cec5SDimitry Andric return wrap(&*--I); 24060b57cec5SDimitry Andric } 24070b57cec5SDimitry Andric 24080b57cec5SDimitry Andric LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn) { 24090b57cec5SDimitry Andric Function *Func = unwrap<Function>(Fn); 24100b57cec5SDimitry Andric Module::iterator I(Func); 24110b57cec5SDimitry Andric if (++I == Func->getParent()->end()) 24120b57cec5SDimitry Andric return nullptr; 24130b57cec5SDimitry Andric return wrap(&*I); 24140b57cec5SDimitry Andric } 24150b57cec5SDimitry Andric 24160b57cec5SDimitry Andric LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn) { 24170b57cec5SDimitry Andric Function *Func = unwrap<Function>(Fn); 24180b57cec5SDimitry Andric Module::iterator I(Func); 24190b57cec5SDimitry Andric if (I == Func->getParent()->begin()) 24200b57cec5SDimitry Andric return nullptr; 24210b57cec5SDimitry Andric return wrap(&*--I); 24220b57cec5SDimitry Andric } 24230b57cec5SDimitry Andric 24240b57cec5SDimitry Andric void LLVMDeleteFunction(LLVMValueRef Fn) { 24250b57cec5SDimitry Andric unwrap<Function>(Fn)->eraseFromParent(); 24260b57cec5SDimitry Andric } 24270b57cec5SDimitry Andric 24280b57cec5SDimitry Andric LLVMBool LLVMHasPersonalityFn(LLVMValueRef Fn) { 24290b57cec5SDimitry Andric return unwrap<Function>(Fn)->hasPersonalityFn(); 24300b57cec5SDimitry Andric } 24310b57cec5SDimitry Andric 24320b57cec5SDimitry Andric LLVMValueRef LLVMGetPersonalityFn(LLVMValueRef Fn) { 24330b57cec5SDimitry Andric return wrap(unwrap<Function>(Fn)->getPersonalityFn()); 24340b57cec5SDimitry Andric } 24350b57cec5SDimitry Andric 24360b57cec5SDimitry Andric void LLVMSetPersonalityFn(LLVMValueRef Fn, LLVMValueRef PersonalityFn) { 24370b57cec5SDimitry Andric unwrap<Function>(Fn)->setPersonalityFn(unwrap<Constant>(PersonalityFn)); 24380b57cec5SDimitry Andric } 24390b57cec5SDimitry Andric 24400b57cec5SDimitry Andric unsigned LLVMGetIntrinsicID(LLVMValueRef Fn) { 24410b57cec5SDimitry Andric if (Function *F = dyn_cast<Function>(unwrap(Fn))) 24420b57cec5SDimitry Andric return F->getIntrinsicID(); 24430b57cec5SDimitry Andric return 0; 24440b57cec5SDimitry Andric } 24450b57cec5SDimitry Andric 24460b57cec5SDimitry Andric static Intrinsic::ID llvm_map_to_intrinsic_id(unsigned ID) { 24470b57cec5SDimitry Andric assert(ID < llvm::Intrinsic::num_intrinsics && "Intrinsic ID out of range"); 24480b57cec5SDimitry Andric return llvm::Intrinsic::ID(ID); 24490b57cec5SDimitry Andric } 24500b57cec5SDimitry Andric 24510b57cec5SDimitry Andric LLVMValueRef LLVMGetIntrinsicDeclaration(LLVMModuleRef Mod, 24520b57cec5SDimitry Andric unsigned ID, 24530b57cec5SDimitry Andric LLVMTypeRef *ParamTypes, 24540b57cec5SDimitry Andric size_t ParamCount) { 24550b57cec5SDimitry Andric ArrayRef<Type*> Tys(unwrap(ParamTypes), ParamCount); 24560b57cec5SDimitry Andric auto IID = llvm_map_to_intrinsic_id(ID); 24570b57cec5SDimitry Andric return wrap(llvm::Intrinsic::getDeclaration(unwrap(Mod), IID, Tys)); 24580b57cec5SDimitry Andric } 24590b57cec5SDimitry Andric 24600b57cec5SDimitry Andric const char *LLVMIntrinsicGetName(unsigned ID, size_t *NameLength) { 24610b57cec5SDimitry Andric auto IID = llvm_map_to_intrinsic_id(ID); 24620b57cec5SDimitry Andric auto Str = llvm::Intrinsic::getName(IID); 24630b57cec5SDimitry Andric *NameLength = Str.size(); 24640b57cec5SDimitry Andric return Str.data(); 24650b57cec5SDimitry Andric } 24660b57cec5SDimitry Andric 24670b57cec5SDimitry Andric LLVMTypeRef LLVMIntrinsicGetType(LLVMContextRef Ctx, unsigned ID, 24680b57cec5SDimitry Andric LLVMTypeRef *ParamTypes, size_t ParamCount) { 24690b57cec5SDimitry Andric auto IID = llvm_map_to_intrinsic_id(ID); 24700b57cec5SDimitry Andric ArrayRef<Type*> Tys(unwrap(ParamTypes), ParamCount); 24710b57cec5SDimitry Andric return wrap(llvm::Intrinsic::getType(*unwrap(Ctx), IID, Tys)); 24720b57cec5SDimitry Andric } 24730b57cec5SDimitry Andric 24740b57cec5SDimitry Andric const char *LLVMIntrinsicCopyOverloadedName(unsigned ID, 24750b57cec5SDimitry Andric LLVMTypeRef *ParamTypes, 24760b57cec5SDimitry Andric size_t ParamCount, 24770b57cec5SDimitry Andric size_t *NameLength) { 24780b57cec5SDimitry Andric auto IID = llvm_map_to_intrinsic_id(ID); 24790b57cec5SDimitry Andric ArrayRef<Type*> Tys(unwrap(ParamTypes), ParamCount); 2480fe6060f1SDimitry Andric auto Str = llvm::Intrinsic::getNameNoUnnamedTypes(IID, Tys); 2481fe6060f1SDimitry Andric *NameLength = Str.length(); 2482fe6060f1SDimitry Andric return strdup(Str.c_str()); 2483fe6060f1SDimitry Andric } 2484fe6060f1SDimitry Andric 2485fe6060f1SDimitry Andric const char *LLVMIntrinsicCopyOverloadedName2(LLVMModuleRef Mod, unsigned ID, 2486fe6060f1SDimitry Andric LLVMTypeRef *ParamTypes, 2487fe6060f1SDimitry Andric size_t ParamCount, 2488fe6060f1SDimitry Andric size_t *NameLength) { 2489fe6060f1SDimitry Andric auto IID = llvm_map_to_intrinsic_id(ID); 2490fe6060f1SDimitry Andric ArrayRef<Type *> Tys(unwrap(ParamTypes), ParamCount); 2491fe6060f1SDimitry Andric auto Str = llvm::Intrinsic::getName(IID, Tys, unwrap(Mod)); 24920b57cec5SDimitry Andric *NameLength = Str.length(); 24930b57cec5SDimitry Andric return strdup(Str.c_str()); 24940b57cec5SDimitry Andric } 24950b57cec5SDimitry Andric 24960b57cec5SDimitry Andric unsigned LLVMLookupIntrinsicID(const char *Name, size_t NameLen) { 24970b57cec5SDimitry Andric return Function::lookupIntrinsicID({Name, NameLen}); 24980b57cec5SDimitry Andric } 24990b57cec5SDimitry Andric 25000b57cec5SDimitry Andric LLVMBool LLVMIntrinsicIsOverloaded(unsigned ID) { 25010b57cec5SDimitry Andric auto IID = llvm_map_to_intrinsic_id(ID); 25020b57cec5SDimitry Andric return llvm::Intrinsic::isOverloaded(IID); 25030b57cec5SDimitry Andric } 25040b57cec5SDimitry Andric 25050b57cec5SDimitry Andric unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn) { 25060b57cec5SDimitry Andric return unwrap<Function>(Fn)->getCallingConv(); 25070b57cec5SDimitry Andric } 25080b57cec5SDimitry Andric 25090b57cec5SDimitry Andric void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC) { 25100b57cec5SDimitry Andric return unwrap<Function>(Fn)->setCallingConv( 25110b57cec5SDimitry Andric static_cast<CallingConv::ID>(CC)); 25120b57cec5SDimitry Andric } 25130b57cec5SDimitry Andric 25140b57cec5SDimitry Andric const char *LLVMGetGC(LLVMValueRef Fn) { 25150b57cec5SDimitry Andric Function *F = unwrap<Function>(Fn); 25160b57cec5SDimitry Andric return F->hasGC()? F->getGC().c_str() : nullptr; 25170b57cec5SDimitry Andric } 25180b57cec5SDimitry Andric 25190b57cec5SDimitry Andric void LLVMSetGC(LLVMValueRef Fn, const char *GC) { 25200b57cec5SDimitry Andric Function *F = unwrap<Function>(Fn); 25210b57cec5SDimitry Andric if (GC) 25220b57cec5SDimitry Andric F->setGC(GC); 25230b57cec5SDimitry Andric else 25240b57cec5SDimitry Andric F->clearGC(); 25250b57cec5SDimitry Andric } 25260b57cec5SDimitry Andric 2527*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetPrefixData(LLVMValueRef Fn) { 2528*0fca6ea1SDimitry Andric Function *F = unwrap<Function>(Fn); 2529*0fca6ea1SDimitry Andric return wrap(F->getPrefixData()); 2530*0fca6ea1SDimitry Andric } 2531*0fca6ea1SDimitry Andric 2532*0fca6ea1SDimitry Andric LLVMBool LLVMHasPrefixData(LLVMValueRef Fn) { 2533*0fca6ea1SDimitry Andric Function *F = unwrap<Function>(Fn); 2534*0fca6ea1SDimitry Andric return F->hasPrefixData(); 2535*0fca6ea1SDimitry Andric } 2536*0fca6ea1SDimitry Andric 2537*0fca6ea1SDimitry Andric void LLVMSetPrefixData(LLVMValueRef Fn, LLVMValueRef prefixData) { 2538*0fca6ea1SDimitry Andric Function *F = unwrap<Function>(Fn); 2539*0fca6ea1SDimitry Andric Constant *prefix = unwrap<Constant>(prefixData); 2540*0fca6ea1SDimitry Andric F->setPrefixData(prefix); 2541*0fca6ea1SDimitry Andric } 2542*0fca6ea1SDimitry Andric 2543*0fca6ea1SDimitry Andric LLVMValueRef LLVMGetPrologueData(LLVMValueRef Fn) { 2544*0fca6ea1SDimitry Andric Function *F = unwrap<Function>(Fn); 2545*0fca6ea1SDimitry Andric return wrap(F->getPrologueData()); 2546*0fca6ea1SDimitry Andric } 2547*0fca6ea1SDimitry Andric 2548*0fca6ea1SDimitry Andric LLVMBool LLVMHasPrologueData(LLVMValueRef Fn) { 2549*0fca6ea1SDimitry Andric Function *F = unwrap<Function>(Fn); 2550*0fca6ea1SDimitry Andric return F->hasPrologueData(); 2551*0fca6ea1SDimitry Andric } 2552*0fca6ea1SDimitry Andric 2553*0fca6ea1SDimitry Andric void LLVMSetPrologueData(LLVMValueRef Fn, LLVMValueRef prologueData) { 2554*0fca6ea1SDimitry Andric Function *F = unwrap<Function>(Fn); 2555*0fca6ea1SDimitry Andric Constant *prologue = unwrap<Constant>(prologueData); 2556*0fca6ea1SDimitry Andric F->setPrologueData(prologue); 2557*0fca6ea1SDimitry Andric } 2558*0fca6ea1SDimitry Andric 25590b57cec5SDimitry Andric void LLVMAddAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, 25600b57cec5SDimitry Andric LLVMAttributeRef A) { 2561349cc55cSDimitry Andric unwrap<Function>(F)->addAttributeAtIndex(Idx, unwrap(A)); 25620b57cec5SDimitry Andric } 25630b57cec5SDimitry Andric 25640b57cec5SDimitry Andric unsigned LLVMGetAttributeCountAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx) { 25650b57cec5SDimitry Andric auto AS = unwrap<Function>(F)->getAttributes().getAttributes(Idx); 25660b57cec5SDimitry Andric return AS.getNumAttributes(); 25670b57cec5SDimitry Andric } 25680b57cec5SDimitry Andric 25690b57cec5SDimitry Andric void LLVMGetAttributesAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, 25700b57cec5SDimitry Andric LLVMAttributeRef *Attrs) { 25710b57cec5SDimitry Andric auto AS = unwrap<Function>(F)->getAttributes().getAttributes(Idx); 25720b57cec5SDimitry Andric for (auto A : AS) 25730b57cec5SDimitry Andric *Attrs++ = wrap(A); 25740b57cec5SDimitry Andric } 25750b57cec5SDimitry Andric 25760b57cec5SDimitry Andric LLVMAttributeRef LLVMGetEnumAttributeAtIndex(LLVMValueRef F, 25770b57cec5SDimitry Andric LLVMAttributeIndex Idx, 25780b57cec5SDimitry Andric unsigned KindID) { 2579349cc55cSDimitry Andric return wrap(unwrap<Function>(F)->getAttributeAtIndex( 2580349cc55cSDimitry Andric Idx, (Attribute::AttrKind)KindID)); 25810b57cec5SDimitry Andric } 25820b57cec5SDimitry Andric 25830b57cec5SDimitry Andric LLVMAttributeRef LLVMGetStringAttributeAtIndex(LLVMValueRef F, 25840b57cec5SDimitry Andric LLVMAttributeIndex Idx, 25850b57cec5SDimitry Andric const char *K, unsigned KLen) { 2586349cc55cSDimitry Andric return wrap( 2587349cc55cSDimitry Andric unwrap<Function>(F)->getAttributeAtIndex(Idx, StringRef(K, KLen))); 25880b57cec5SDimitry Andric } 25890b57cec5SDimitry Andric 25900b57cec5SDimitry Andric void LLVMRemoveEnumAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, 25910b57cec5SDimitry Andric unsigned KindID) { 2592349cc55cSDimitry Andric unwrap<Function>(F)->removeAttributeAtIndex(Idx, (Attribute::AttrKind)KindID); 25930b57cec5SDimitry Andric } 25940b57cec5SDimitry Andric 25950b57cec5SDimitry Andric void LLVMRemoveStringAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx, 25960b57cec5SDimitry Andric const char *K, unsigned KLen) { 2597349cc55cSDimitry Andric unwrap<Function>(F)->removeAttributeAtIndex(Idx, StringRef(K, KLen)); 25980b57cec5SDimitry Andric } 25990b57cec5SDimitry Andric 26000b57cec5SDimitry Andric void LLVMAddTargetDependentFunctionAttr(LLVMValueRef Fn, const char *A, 26010b57cec5SDimitry Andric const char *V) { 26020b57cec5SDimitry Andric Function *Func = unwrap<Function>(Fn); 26030b57cec5SDimitry Andric Attribute Attr = Attribute::get(Func->getContext(), A, V); 2604349cc55cSDimitry Andric Func->addFnAttr(Attr); 26050b57cec5SDimitry Andric } 26060b57cec5SDimitry Andric 26070b57cec5SDimitry Andric /*--.. Operations on parameters ............................................--*/ 26080b57cec5SDimitry Andric 26090b57cec5SDimitry Andric unsigned LLVMCountParams(LLVMValueRef FnRef) { 26100b57cec5SDimitry Andric // This function is strictly redundant to 26115f757f3fSDimitry Andric // LLVMCountParamTypes(LLVMGlobalGetValueType(FnRef)) 26120b57cec5SDimitry Andric return unwrap<Function>(FnRef)->arg_size(); 26130b57cec5SDimitry Andric } 26140b57cec5SDimitry Andric 26150b57cec5SDimitry Andric void LLVMGetParams(LLVMValueRef FnRef, LLVMValueRef *ParamRefs) { 26160b57cec5SDimitry Andric Function *Fn = unwrap<Function>(FnRef); 2617fe6060f1SDimitry Andric for (Argument &A : Fn->args()) 2618fe6060f1SDimitry Andric *ParamRefs++ = wrap(&A); 26190b57cec5SDimitry Andric } 26200b57cec5SDimitry Andric 26210b57cec5SDimitry Andric LLVMValueRef LLVMGetParam(LLVMValueRef FnRef, unsigned index) { 26220b57cec5SDimitry Andric Function *Fn = unwrap<Function>(FnRef); 26230b57cec5SDimitry Andric return wrap(&Fn->arg_begin()[index]); 26240b57cec5SDimitry Andric } 26250b57cec5SDimitry Andric 26260b57cec5SDimitry Andric LLVMValueRef LLVMGetParamParent(LLVMValueRef V) { 26270b57cec5SDimitry Andric return wrap(unwrap<Argument>(V)->getParent()); 26280b57cec5SDimitry Andric } 26290b57cec5SDimitry Andric 26300b57cec5SDimitry Andric LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn) { 26310b57cec5SDimitry Andric Function *Func = unwrap<Function>(Fn); 26320b57cec5SDimitry Andric Function::arg_iterator I = Func->arg_begin(); 26330b57cec5SDimitry Andric if (I == Func->arg_end()) 26340b57cec5SDimitry Andric return nullptr; 26350b57cec5SDimitry Andric return wrap(&*I); 26360b57cec5SDimitry Andric } 26370b57cec5SDimitry Andric 26380b57cec5SDimitry Andric LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn) { 26390b57cec5SDimitry Andric Function *Func = unwrap<Function>(Fn); 26400b57cec5SDimitry Andric Function::arg_iterator I = Func->arg_end(); 26410b57cec5SDimitry Andric if (I == Func->arg_begin()) 26420b57cec5SDimitry Andric return nullptr; 26430b57cec5SDimitry Andric return wrap(&*--I); 26440b57cec5SDimitry Andric } 26450b57cec5SDimitry Andric 26460b57cec5SDimitry Andric LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg) { 26470b57cec5SDimitry Andric Argument *A = unwrap<Argument>(Arg); 26480b57cec5SDimitry Andric Function *Fn = A->getParent(); 26490b57cec5SDimitry Andric if (A->getArgNo() + 1 >= Fn->arg_size()) 26500b57cec5SDimitry Andric return nullptr; 26510b57cec5SDimitry Andric return wrap(&Fn->arg_begin()[A->getArgNo() + 1]); 26520b57cec5SDimitry Andric } 26530b57cec5SDimitry Andric 26540b57cec5SDimitry Andric LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg) { 26550b57cec5SDimitry Andric Argument *A = unwrap<Argument>(Arg); 26560b57cec5SDimitry Andric if (A->getArgNo() == 0) 26570b57cec5SDimitry Andric return nullptr; 26580b57cec5SDimitry Andric return wrap(&A->getParent()->arg_begin()[A->getArgNo() - 1]); 26590b57cec5SDimitry Andric } 26600b57cec5SDimitry Andric 26610b57cec5SDimitry Andric void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align) { 26620b57cec5SDimitry Andric Argument *A = unwrap<Argument>(Arg); 26638bcb0991SDimitry Andric A->addAttr(Attribute::getWithAlignment(A->getContext(), Align(align))); 26640b57cec5SDimitry Andric } 26650b57cec5SDimitry Andric 26660b57cec5SDimitry Andric /*--.. Operations on ifuncs ................................................--*/ 26670b57cec5SDimitry Andric 26680b57cec5SDimitry Andric LLVMValueRef LLVMAddGlobalIFunc(LLVMModuleRef M, 26690b57cec5SDimitry Andric const char *Name, size_t NameLen, 26700b57cec5SDimitry Andric LLVMTypeRef Ty, unsigned AddrSpace, 26710b57cec5SDimitry Andric LLVMValueRef Resolver) { 26720b57cec5SDimitry Andric return wrap(GlobalIFunc::create(unwrap(Ty), AddrSpace, 26730b57cec5SDimitry Andric GlobalValue::ExternalLinkage, 26740b57cec5SDimitry Andric StringRef(Name, NameLen), 26750b57cec5SDimitry Andric unwrap<Constant>(Resolver), unwrap(M))); 26760b57cec5SDimitry Andric } 26770b57cec5SDimitry Andric 26780b57cec5SDimitry Andric LLVMValueRef LLVMGetNamedGlobalIFunc(LLVMModuleRef M, 26790b57cec5SDimitry Andric const char *Name, size_t NameLen) { 26800b57cec5SDimitry Andric return wrap(unwrap(M)->getNamedIFunc(StringRef(Name, NameLen))); 26810b57cec5SDimitry Andric } 26820b57cec5SDimitry Andric 26830b57cec5SDimitry Andric LLVMValueRef LLVMGetFirstGlobalIFunc(LLVMModuleRef M) { 26840b57cec5SDimitry Andric Module *Mod = unwrap(M); 26850b57cec5SDimitry Andric Module::ifunc_iterator I = Mod->ifunc_begin(); 26860b57cec5SDimitry Andric if (I == Mod->ifunc_end()) 26870b57cec5SDimitry Andric return nullptr; 26880b57cec5SDimitry Andric return wrap(&*I); 26890b57cec5SDimitry Andric } 26900b57cec5SDimitry Andric 26910b57cec5SDimitry Andric LLVMValueRef LLVMGetLastGlobalIFunc(LLVMModuleRef M) { 26920b57cec5SDimitry Andric Module *Mod = unwrap(M); 26930b57cec5SDimitry Andric Module::ifunc_iterator I = Mod->ifunc_end(); 26940b57cec5SDimitry Andric if (I == Mod->ifunc_begin()) 26950b57cec5SDimitry Andric return nullptr; 26960b57cec5SDimitry Andric return wrap(&*--I); 26970b57cec5SDimitry Andric } 26980b57cec5SDimitry Andric 26990b57cec5SDimitry Andric LLVMValueRef LLVMGetNextGlobalIFunc(LLVMValueRef IFunc) { 27000b57cec5SDimitry Andric GlobalIFunc *GIF = unwrap<GlobalIFunc>(IFunc); 27010b57cec5SDimitry Andric Module::ifunc_iterator I(GIF); 27020b57cec5SDimitry Andric if (++I == GIF->getParent()->ifunc_end()) 27030b57cec5SDimitry Andric return nullptr; 27040b57cec5SDimitry Andric return wrap(&*I); 27050b57cec5SDimitry Andric } 27060b57cec5SDimitry Andric 27070b57cec5SDimitry Andric LLVMValueRef LLVMGetPreviousGlobalIFunc(LLVMValueRef IFunc) { 27080b57cec5SDimitry Andric GlobalIFunc *GIF = unwrap<GlobalIFunc>(IFunc); 27090b57cec5SDimitry Andric Module::ifunc_iterator I(GIF); 27100b57cec5SDimitry Andric if (I == GIF->getParent()->ifunc_begin()) 27110b57cec5SDimitry Andric return nullptr; 27120b57cec5SDimitry Andric return wrap(&*--I); 27130b57cec5SDimitry Andric } 27140b57cec5SDimitry Andric 27150b57cec5SDimitry Andric LLVMValueRef LLVMGetGlobalIFuncResolver(LLVMValueRef IFunc) { 27160b57cec5SDimitry Andric return wrap(unwrap<GlobalIFunc>(IFunc)->getResolver()); 27170b57cec5SDimitry Andric } 27180b57cec5SDimitry Andric 27190b57cec5SDimitry Andric void LLVMSetGlobalIFuncResolver(LLVMValueRef IFunc, LLVMValueRef Resolver) { 27200b57cec5SDimitry Andric unwrap<GlobalIFunc>(IFunc)->setResolver(unwrap<Constant>(Resolver)); 27210b57cec5SDimitry Andric } 27220b57cec5SDimitry Andric 27230b57cec5SDimitry Andric void LLVMEraseGlobalIFunc(LLVMValueRef IFunc) { 27240b57cec5SDimitry Andric unwrap<GlobalIFunc>(IFunc)->eraseFromParent(); 27250b57cec5SDimitry Andric } 27260b57cec5SDimitry Andric 27270b57cec5SDimitry Andric void LLVMRemoveGlobalIFunc(LLVMValueRef IFunc) { 27280b57cec5SDimitry Andric unwrap<GlobalIFunc>(IFunc)->removeFromParent(); 27290b57cec5SDimitry Andric } 27300b57cec5SDimitry Andric 27315f757f3fSDimitry Andric /*--.. Operations on operand bundles........................................--*/ 27325f757f3fSDimitry Andric 27335f757f3fSDimitry Andric LLVMOperandBundleRef LLVMCreateOperandBundle(const char *Tag, size_t TagLen, 27345f757f3fSDimitry Andric LLVMValueRef *Args, 27355f757f3fSDimitry Andric unsigned NumArgs) { 27365f757f3fSDimitry Andric return wrap(new OperandBundleDef(std::string(Tag, TagLen), 27375f757f3fSDimitry Andric ArrayRef(unwrap(Args), NumArgs))); 27385f757f3fSDimitry Andric } 27395f757f3fSDimitry Andric 27405f757f3fSDimitry Andric void LLVMDisposeOperandBundle(LLVMOperandBundleRef Bundle) { 27415f757f3fSDimitry Andric delete unwrap(Bundle); 27425f757f3fSDimitry Andric } 27435f757f3fSDimitry Andric 27445f757f3fSDimitry Andric const char *LLVMGetOperandBundleTag(LLVMOperandBundleRef Bundle, size_t *Len) { 27455f757f3fSDimitry Andric StringRef Str = unwrap(Bundle)->getTag(); 27465f757f3fSDimitry Andric *Len = Str.size(); 27475f757f3fSDimitry Andric return Str.data(); 27485f757f3fSDimitry Andric } 27495f757f3fSDimitry Andric 27505f757f3fSDimitry Andric unsigned LLVMGetNumOperandBundleArgs(LLVMOperandBundleRef Bundle) { 27515f757f3fSDimitry Andric return unwrap(Bundle)->inputs().size(); 27525f757f3fSDimitry Andric } 27535f757f3fSDimitry Andric 27545f757f3fSDimitry Andric LLVMValueRef LLVMGetOperandBundleArgAtIndex(LLVMOperandBundleRef Bundle, 27555f757f3fSDimitry Andric unsigned Index) { 27565f757f3fSDimitry Andric return wrap(unwrap(Bundle)->inputs()[Index]); 27575f757f3fSDimitry Andric } 27585f757f3fSDimitry Andric 27590b57cec5SDimitry Andric /*--.. Operations on basic blocks ..........................................--*/ 27600b57cec5SDimitry Andric 27610b57cec5SDimitry Andric LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB) { 27620b57cec5SDimitry Andric return wrap(static_cast<Value*>(unwrap(BB))); 27630b57cec5SDimitry Andric } 27640b57cec5SDimitry Andric 27650b57cec5SDimitry Andric LLVMBool LLVMValueIsBasicBlock(LLVMValueRef Val) { 27660b57cec5SDimitry Andric return isa<BasicBlock>(unwrap(Val)); 27670b57cec5SDimitry Andric } 27680b57cec5SDimitry Andric 27690b57cec5SDimitry Andric LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val) { 27700b57cec5SDimitry Andric return wrap(unwrap<BasicBlock>(Val)); 27710b57cec5SDimitry Andric } 27720b57cec5SDimitry Andric 27730b57cec5SDimitry Andric const char *LLVMGetBasicBlockName(LLVMBasicBlockRef BB) { 27740b57cec5SDimitry Andric return unwrap(BB)->getName().data(); 27750b57cec5SDimitry Andric } 27760b57cec5SDimitry Andric 27770b57cec5SDimitry Andric LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB) { 27780b57cec5SDimitry Andric return wrap(unwrap(BB)->getParent()); 27790b57cec5SDimitry Andric } 27800b57cec5SDimitry Andric 27810b57cec5SDimitry Andric LLVMValueRef LLVMGetBasicBlockTerminator(LLVMBasicBlockRef BB) { 27820b57cec5SDimitry Andric return wrap(unwrap(BB)->getTerminator()); 27830b57cec5SDimitry Andric } 27840b57cec5SDimitry Andric 27850b57cec5SDimitry Andric unsigned LLVMCountBasicBlocks(LLVMValueRef FnRef) { 27860b57cec5SDimitry Andric return unwrap<Function>(FnRef)->size(); 27870b57cec5SDimitry Andric } 27880b57cec5SDimitry Andric 27890b57cec5SDimitry Andric void LLVMGetBasicBlocks(LLVMValueRef FnRef, LLVMBasicBlockRef *BasicBlocksRefs){ 27900b57cec5SDimitry Andric Function *Fn = unwrap<Function>(FnRef); 27910b57cec5SDimitry Andric for (BasicBlock &BB : *Fn) 27920b57cec5SDimitry Andric *BasicBlocksRefs++ = wrap(&BB); 27930b57cec5SDimitry Andric } 27940b57cec5SDimitry Andric 27950b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn) { 27960b57cec5SDimitry Andric return wrap(&unwrap<Function>(Fn)->getEntryBlock()); 27970b57cec5SDimitry Andric } 27980b57cec5SDimitry Andric 27990b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn) { 28000b57cec5SDimitry Andric Function *Func = unwrap<Function>(Fn); 28010b57cec5SDimitry Andric Function::iterator I = Func->begin(); 28020b57cec5SDimitry Andric if (I == Func->end()) 28030b57cec5SDimitry Andric return nullptr; 28040b57cec5SDimitry Andric return wrap(&*I); 28050b57cec5SDimitry Andric } 28060b57cec5SDimitry Andric 28070b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn) { 28080b57cec5SDimitry Andric Function *Func = unwrap<Function>(Fn); 28090b57cec5SDimitry Andric Function::iterator I = Func->end(); 28100b57cec5SDimitry Andric if (I == Func->begin()) 28110b57cec5SDimitry Andric return nullptr; 28120b57cec5SDimitry Andric return wrap(&*--I); 28130b57cec5SDimitry Andric } 28140b57cec5SDimitry Andric 28150b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB) { 28160b57cec5SDimitry Andric BasicBlock *Block = unwrap(BB); 28170b57cec5SDimitry Andric Function::iterator I(Block); 28180b57cec5SDimitry Andric if (++I == Block->getParent()->end()) 28190b57cec5SDimitry Andric return nullptr; 28200b57cec5SDimitry Andric return wrap(&*I); 28210b57cec5SDimitry Andric } 28220b57cec5SDimitry Andric 28230b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB) { 28240b57cec5SDimitry Andric BasicBlock *Block = unwrap(BB); 28250b57cec5SDimitry Andric Function::iterator I(Block); 28260b57cec5SDimitry Andric if (I == Block->getParent()->begin()) 28270b57cec5SDimitry Andric return nullptr; 28280b57cec5SDimitry Andric return wrap(&*--I); 28290b57cec5SDimitry Andric } 28300b57cec5SDimitry Andric 28310b57cec5SDimitry Andric LLVMBasicBlockRef LLVMCreateBasicBlockInContext(LLVMContextRef C, 28320b57cec5SDimitry Andric const char *Name) { 28330b57cec5SDimitry Andric return wrap(llvm::BasicBlock::Create(*unwrap(C), Name)); 28340b57cec5SDimitry Andric } 28350b57cec5SDimitry Andric 28360b57cec5SDimitry Andric void LLVMInsertExistingBasicBlockAfterInsertBlock(LLVMBuilderRef Builder, 28370b57cec5SDimitry Andric LLVMBasicBlockRef BB) { 28380b57cec5SDimitry Andric BasicBlock *ToInsert = unwrap(BB); 28390b57cec5SDimitry Andric BasicBlock *CurBB = unwrap(Builder)->GetInsertBlock(); 28400b57cec5SDimitry Andric assert(CurBB && "current insertion point is invalid!"); 2841bdd1243dSDimitry Andric CurBB->getParent()->insert(std::next(CurBB->getIterator()), ToInsert); 28420b57cec5SDimitry Andric } 28430b57cec5SDimitry Andric 28440b57cec5SDimitry Andric void LLVMAppendExistingBasicBlock(LLVMValueRef Fn, 28450b57cec5SDimitry Andric LLVMBasicBlockRef BB) { 2846bdd1243dSDimitry Andric unwrap<Function>(Fn)->insert(unwrap<Function>(Fn)->end(), unwrap(BB)); 28470b57cec5SDimitry Andric } 28480b57cec5SDimitry Andric 28490b57cec5SDimitry Andric LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C, 28500b57cec5SDimitry Andric LLVMValueRef FnRef, 28510b57cec5SDimitry Andric const char *Name) { 28520b57cec5SDimitry Andric return wrap(BasicBlock::Create(*unwrap(C), Name, unwrap<Function>(FnRef))); 28530b57cec5SDimitry Andric } 28540b57cec5SDimitry Andric 28550b57cec5SDimitry Andric LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef FnRef, const char *Name) { 28560b57cec5SDimitry Andric return LLVMAppendBasicBlockInContext(LLVMGetGlobalContext(), FnRef, Name); 28570b57cec5SDimitry Andric } 28580b57cec5SDimitry Andric 28590b57cec5SDimitry Andric LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C, 28600b57cec5SDimitry Andric LLVMBasicBlockRef BBRef, 28610b57cec5SDimitry Andric const char *Name) { 28620b57cec5SDimitry Andric BasicBlock *BB = unwrap(BBRef); 28630b57cec5SDimitry Andric return wrap(BasicBlock::Create(*unwrap(C), Name, BB->getParent(), BB)); 28640b57cec5SDimitry Andric } 28650b57cec5SDimitry Andric 28660b57cec5SDimitry Andric LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef BBRef, 28670b57cec5SDimitry Andric const char *Name) { 28680b57cec5SDimitry Andric return LLVMInsertBasicBlockInContext(LLVMGetGlobalContext(), BBRef, Name); 28690b57cec5SDimitry Andric } 28700b57cec5SDimitry Andric 28710b57cec5SDimitry Andric void LLVMDeleteBasicBlock(LLVMBasicBlockRef BBRef) { 28720b57cec5SDimitry Andric unwrap(BBRef)->eraseFromParent(); 28730b57cec5SDimitry Andric } 28740b57cec5SDimitry Andric 28750b57cec5SDimitry Andric void LLVMRemoveBasicBlockFromParent(LLVMBasicBlockRef BBRef) { 28760b57cec5SDimitry Andric unwrap(BBRef)->removeFromParent(); 28770b57cec5SDimitry Andric } 28780b57cec5SDimitry Andric 28790b57cec5SDimitry Andric void LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) { 28800b57cec5SDimitry Andric unwrap(BB)->moveBefore(unwrap(MovePos)); 28810b57cec5SDimitry Andric } 28820b57cec5SDimitry Andric 28830b57cec5SDimitry Andric void LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) { 28840b57cec5SDimitry Andric unwrap(BB)->moveAfter(unwrap(MovePos)); 28850b57cec5SDimitry Andric } 28860b57cec5SDimitry Andric 28870b57cec5SDimitry Andric /*--.. Operations on instructions ..........................................--*/ 28880b57cec5SDimitry Andric 28890b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst) { 28900b57cec5SDimitry Andric return wrap(unwrap<Instruction>(Inst)->getParent()); 28910b57cec5SDimitry Andric } 28920b57cec5SDimitry Andric 28930b57cec5SDimitry Andric LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB) { 28940b57cec5SDimitry Andric BasicBlock *Block = unwrap(BB); 28950b57cec5SDimitry Andric BasicBlock::iterator I = Block->begin(); 28960b57cec5SDimitry Andric if (I == Block->end()) 28970b57cec5SDimitry Andric return nullptr; 28980b57cec5SDimitry Andric return wrap(&*I); 28990b57cec5SDimitry Andric } 29000b57cec5SDimitry Andric 29010b57cec5SDimitry Andric LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB) { 29020b57cec5SDimitry Andric BasicBlock *Block = unwrap(BB); 29030b57cec5SDimitry Andric BasicBlock::iterator I = Block->end(); 29040b57cec5SDimitry Andric if (I == Block->begin()) 29050b57cec5SDimitry Andric return nullptr; 29060b57cec5SDimitry Andric return wrap(&*--I); 29070b57cec5SDimitry Andric } 29080b57cec5SDimitry Andric 29090b57cec5SDimitry Andric LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst) { 29100b57cec5SDimitry Andric Instruction *Instr = unwrap<Instruction>(Inst); 29110b57cec5SDimitry Andric BasicBlock::iterator I(Instr); 29120b57cec5SDimitry Andric if (++I == Instr->getParent()->end()) 29130b57cec5SDimitry Andric return nullptr; 29140b57cec5SDimitry Andric return wrap(&*I); 29150b57cec5SDimitry Andric } 29160b57cec5SDimitry Andric 29170b57cec5SDimitry Andric LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst) { 29180b57cec5SDimitry Andric Instruction *Instr = unwrap<Instruction>(Inst); 29190b57cec5SDimitry Andric BasicBlock::iterator I(Instr); 29200b57cec5SDimitry Andric if (I == Instr->getParent()->begin()) 29210b57cec5SDimitry Andric return nullptr; 29220b57cec5SDimitry Andric return wrap(&*--I); 29230b57cec5SDimitry Andric } 29240b57cec5SDimitry Andric 29250b57cec5SDimitry Andric void LLVMInstructionRemoveFromParent(LLVMValueRef Inst) { 29260b57cec5SDimitry Andric unwrap<Instruction>(Inst)->removeFromParent(); 29270b57cec5SDimitry Andric } 29280b57cec5SDimitry Andric 29290b57cec5SDimitry Andric void LLVMInstructionEraseFromParent(LLVMValueRef Inst) { 29300b57cec5SDimitry Andric unwrap<Instruction>(Inst)->eraseFromParent(); 29310b57cec5SDimitry Andric } 29320b57cec5SDimitry Andric 2933753f127fSDimitry Andric void LLVMDeleteInstruction(LLVMValueRef Inst) { 2934753f127fSDimitry Andric unwrap<Instruction>(Inst)->deleteValue(); 2935753f127fSDimitry Andric } 2936753f127fSDimitry Andric 29370b57cec5SDimitry Andric LLVMIntPredicate LLVMGetICmpPredicate(LLVMValueRef Inst) { 29380b57cec5SDimitry Andric if (ICmpInst *I = dyn_cast<ICmpInst>(unwrap(Inst))) 29390b57cec5SDimitry Andric return (LLVMIntPredicate)I->getPredicate(); 29400b57cec5SDimitry Andric return (LLVMIntPredicate)0; 29410b57cec5SDimitry Andric } 29420b57cec5SDimitry Andric 29430b57cec5SDimitry Andric LLVMRealPredicate LLVMGetFCmpPredicate(LLVMValueRef Inst) { 29440b57cec5SDimitry Andric if (FCmpInst *I = dyn_cast<FCmpInst>(unwrap(Inst))) 29450b57cec5SDimitry Andric return (LLVMRealPredicate)I->getPredicate(); 29460b57cec5SDimitry Andric return (LLVMRealPredicate)0; 29470b57cec5SDimitry Andric } 29480b57cec5SDimitry Andric 29490b57cec5SDimitry Andric LLVMOpcode LLVMGetInstructionOpcode(LLVMValueRef Inst) { 29500b57cec5SDimitry Andric if (Instruction *C = dyn_cast<Instruction>(unwrap(Inst))) 29510b57cec5SDimitry Andric return map_to_llvmopcode(C->getOpcode()); 29520b57cec5SDimitry Andric return (LLVMOpcode)0; 29530b57cec5SDimitry Andric } 29540b57cec5SDimitry Andric 29550b57cec5SDimitry Andric LLVMValueRef LLVMInstructionClone(LLVMValueRef Inst) { 29560b57cec5SDimitry Andric if (Instruction *C = dyn_cast<Instruction>(unwrap(Inst))) 29570b57cec5SDimitry Andric return wrap(C->clone()); 29580b57cec5SDimitry Andric return nullptr; 29590b57cec5SDimitry Andric } 29600b57cec5SDimitry Andric 29610b57cec5SDimitry Andric LLVMValueRef LLVMIsATerminatorInst(LLVMValueRef Inst) { 29620b57cec5SDimitry Andric Instruction *I = dyn_cast<Instruction>(unwrap(Inst)); 29630b57cec5SDimitry Andric return (I && I->isTerminator()) ? wrap(I) : nullptr; 29640b57cec5SDimitry Andric } 29650b57cec5SDimitry Andric 29660b57cec5SDimitry Andric unsigned LLVMGetNumArgOperands(LLVMValueRef Instr) { 29670b57cec5SDimitry Andric if (FuncletPadInst *FPI = dyn_cast<FuncletPadInst>(unwrap(Instr))) { 2968bdd1243dSDimitry Andric return FPI->arg_size(); 29690b57cec5SDimitry Andric } 2970349cc55cSDimitry Andric return unwrap<CallBase>(Instr)->arg_size(); 29710b57cec5SDimitry Andric } 29720b57cec5SDimitry Andric 29730b57cec5SDimitry Andric /*--.. Call and invoke instructions ........................................--*/ 29740b57cec5SDimitry Andric 29750b57cec5SDimitry Andric unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr) { 29760b57cec5SDimitry Andric return unwrap<CallBase>(Instr)->getCallingConv(); 29770b57cec5SDimitry Andric } 29780b57cec5SDimitry Andric 29790b57cec5SDimitry Andric void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC) { 29800b57cec5SDimitry Andric return unwrap<CallBase>(Instr)->setCallingConv( 29810b57cec5SDimitry Andric static_cast<CallingConv::ID>(CC)); 29820b57cec5SDimitry Andric } 29830b57cec5SDimitry Andric 2984349cc55cSDimitry Andric void LLVMSetInstrParamAlignment(LLVMValueRef Instr, LLVMAttributeIndex Idx, 29850b57cec5SDimitry Andric unsigned align) { 29860b57cec5SDimitry Andric auto *Call = unwrap<CallBase>(Instr); 29878bcb0991SDimitry Andric Attribute AlignAttr = 29888bcb0991SDimitry Andric Attribute::getWithAlignment(Call->getContext(), Align(align)); 2989349cc55cSDimitry Andric Call->addAttributeAtIndex(Idx, AlignAttr); 29900b57cec5SDimitry Andric } 29910b57cec5SDimitry Andric 29920b57cec5SDimitry Andric void LLVMAddCallSiteAttribute(LLVMValueRef C, LLVMAttributeIndex Idx, 29930b57cec5SDimitry Andric LLVMAttributeRef A) { 2994349cc55cSDimitry Andric unwrap<CallBase>(C)->addAttributeAtIndex(Idx, unwrap(A)); 29950b57cec5SDimitry Andric } 29960b57cec5SDimitry Andric 29970b57cec5SDimitry Andric unsigned LLVMGetCallSiteAttributeCount(LLVMValueRef C, 29980b57cec5SDimitry Andric LLVMAttributeIndex Idx) { 29990b57cec5SDimitry Andric auto *Call = unwrap<CallBase>(C); 30000b57cec5SDimitry Andric auto AS = Call->getAttributes().getAttributes(Idx); 30010b57cec5SDimitry Andric return AS.getNumAttributes(); 30020b57cec5SDimitry Andric } 30030b57cec5SDimitry Andric 30040b57cec5SDimitry Andric void LLVMGetCallSiteAttributes(LLVMValueRef C, LLVMAttributeIndex Idx, 30050b57cec5SDimitry Andric LLVMAttributeRef *Attrs) { 30060b57cec5SDimitry Andric auto *Call = unwrap<CallBase>(C); 30070b57cec5SDimitry Andric auto AS = Call->getAttributes().getAttributes(Idx); 30080b57cec5SDimitry Andric for (auto A : AS) 30090b57cec5SDimitry Andric *Attrs++ = wrap(A); 30100b57cec5SDimitry Andric } 30110b57cec5SDimitry Andric 30120b57cec5SDimitry Andric LLVMAttributeRef LLVMGetCallSiteEnumAttribute(LLVMValueRef C, 30130b57cec5SDimitry Andric LLVMAttributeIndex Idx, 30140b57cec5SDimitry Andric unsigned KindID) { 3015349cc55cSDimitry Andric return wrap(unwrap<CallBase>(C)->getAttributeAtIndex( 3016349cc55cSDimitry Andric Idx, (Attribute::AttrKind)KindID)); 30170b57cec5SDimitry Andric } 30180b57cec5SDimitry Andric 30190b57cec5SDimitry Andric LLVMAttributeRef LLVMGetCallSiteStringAttribute(LLVMValueRef C, 30200b57cec5SDimitry Andric LLVMAttributeIndex Idx, 30210b57cec5SDimitry Andric const char *K, unsigned KLen) { 3022349cc55cSDimitry Andric return wrap( 3023349cc55cSDimitry Andric unwrap<CallBase>(C)->getAttributeAtIndex(Idx, StringRef(K, KLen))); 30240b57cec5SDimitry Andric } 30250b57cec5SDimitry Andric 30260b57cec5SDimitry Andric void LLVMRemoveCallSiteEnumAttribute(LLVMValueRef C, LLVMAttributeIndex Idx, 30270b57cec5SDimitry Andric unsigned KindID) { 3028349cc55cSDimitry Andric unwrap<CallBase>(C)->removeAttributeAtIndex(Idx, (Attribute::AttrKind)KindID); 30290b57cec5SDimitry Andric } 30300b57cec5SDimitry Andric 30310b57cec5SDimitry Andric void LLVMRemoveCallSiteStringAttribute(LLVMValueRef C, LLVMAttributeIndex Idx, 30320b57cec5SDimitry Andric const char *K, unsigned KLen) { 3033349cc55cSDimitry Andric unwrap<CallBase>(C)->removeAttributeAtIndex(Idx, StringRef(K, KLen)); 30340b57cec5SDimitry Andric } 30350b57cec5SDimitry Andric 30360b57cec5SDimitry Andric LLVMValueRef LLVMGetCalledValue(LLVMValueRef Instr) { 30375ffd83dbSDimitry Andric return wrap(unwrap<CallBase>(Instr)->getCalledOperand()); 30380b57cec5SDimitry Andric } 30390b57cec5SDimitry Andric 30400b57cec5SDimitry Andric LLVMTypeRef LLVMGetCalledFunctionType(LLVMValueRef Instr) { 30410b57cec5SDimitry Andric return wrap(unwrap<CallBase>(Instr)->getFunctionType()); 30420b57cec5SDimitry Andric } 30430b57cec5SDimitry Andric 30445f757f3fSDimitry Andric unsigned LLVMGetNumOperandBundles(LLVMValueRef C) { 30455f757f3fSDimitry Andric return unwrap<CallBase>(C)->getNumOperandBundles(); 30465f757f3fSDimitry Andric } 30475f757f3fSDimitry Andric 30485f757f3fSDimitry Andric LLVMOperandBundleRef LLVMGetOperandBundleAtIndex(LLVMValueRef C, 30495f757f3fSDimitry Andric unsigned Index) { 30505f757f3fSDimitry Andric return wrap( 30515f757f3fSDimitry Andric new OperandBundleDef(unwrap<CallBase>(C)->getOperandBundleAt(Index))); 30525f757f3fSDimitry Andric } 30535f757f3fSDimitry Andric 30540b57cec5SDimitry Andric /*--.. Operations on call instructions (only) ..............................--*/ 30550b57cec5SDimitry Andric 30560b57cec5SDimitry Andric LLVMBool LLVMIsTailCall(LLVMValueRef Call) { 30570b57cec5SDimitry Andric return unwrap<CallInst>(Call)->isTailCall(); 30580b57cec5SDimitry Andric } 30590b57cec5SDimitry Andric 30600b57cec5SDimitry Andric void LLVMSetTailCall(LLVMValueRef Call, LLVMBool isTailCall) { 30610b57cec5SDimitry Andric unwrap<CallInst>(Call)->setTailCall(isTailCall); 30620b57cec5SDimitry Andric } 30630b57cec5SDimitry Andric 30645f757f3fSDimitry Andric LLVMTailCallKind LLVMGetTailCallKind(LLVMValueRef Call) { 30655f757f3fSDimitry Andric return (LLVMTailCallKind)unwrap<CallInst>(Call)->getTailCallKind(); 30665f757f3fSDimitry Andric } 30675f757f3fSDimitry Andric 30685f757f3fSDimitry Andric void LLVMSetTailCallKind(LLVMValueRef Call, LLVMTailCallKind kind) { 30695f757f3fSDimitry Andric unwrap<CallInst>(Call)->setTailCallKind((CallInst::TailCallKind)kind); 30705f757f3fSDimitry Andric } 30715f757f3fSDimitry Andric 30720b57cec5SDimitry Andric /*--.. Operations on invoke instructions (only) ............................--*/ 30730b57cec5SDimitry Andric 30740b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetNormalDest(LLVMValueRef Invoke) { 30750b57cec5SDimitry Andric return wrap(unwrap<InvokeInst>(Invoke)->getNormalDest()); 30760b57cec5SDimitry Andric } 30770b57cec5SDimitry Andric 30780b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetUnwindDest(LLVMValueRef Invoke) { 30790b57cec5SDimitry Andric if (CleanupReturnInst *CRI = dyn_cast<CleanupReturnInst>(unwrap(Invoke))) { 30800b57cec5SDimitry Andric return wrap(CRI->getUnwindDest()); 30810b57cec5SDimitry Andric } else if (CatchSwitchInst *CSI = dyn_cast<CatchSwitchInst>(unwrap(Invoke))) { 30820b57cec5SDimitry Andric return wrap(CSI->getUnwindDest()); 30830b57cec5SDimitry Andric } 30840b57cec5SDimitry Andric return wrap(unwrap<InvokeInst>(Invoke)->getUnwindDest()); 30850b57cec5SDimitry Andric } 30860b57cec5SDimitry Andric 30870b57cec5SDimitry Andric void LLVMSetNormalDest(LLVMValueRef Invoke, LLVMBasicBlockRef B) { 30880b57cec5SDimitry Andric unwrap<InvokeInst>(Invoke)->setNormalDest(unwrap(B)); 30890b57cec5SDimitry Andric } 30900b57cec5SDimitry Andric 30910b57cec5SDimitry Andric void LLVMSetUnwindDest(LLVMValueRef Invoke, LLVMBasicBlockRef B) { 30920b57cec5SDimitry Andric if (CleanupReturnInst *CRI = dyn_cast<CleanupReturnInst>(unwrap(Invoke))) { 30930b57cec5SDimitry Andric return CRI->setUnwindDest(unwrap(B)); 30940b57cec5SDimitry Andric } else if (CatchSwitchInst *CSI = dyn_cast<CatchSwitchInst>(unwrap(Invoke))) { 30950b57cec5SDimitry Andric return CSI->setUnwindDest(unwrap(B)); 30960b57cec5SDimitry Andric } 30970b57cec5SDimitry Andric unwrap<InvokeInst>(Invoke)->setUnwindDest(unwrap(B)); 30980b57cec5SDimitry Andric } 30990b57cec5SDimitry Andric 3100*0fca6ea1SDimitry Andric LLVMBasicBlockRef LLVMGetCallBrDefaultDest(LLVMValueRef CallBr) { 3101*0fca6ea1SDimitry Andric return wrap(unwrap<CallBrInst>(CallBr)->getDefaultDest()); 3102*0fca6ea1SDimitry Andric } 3103*0fca6ea1SDimitry Andric 3104*0fca6ea1SDimitry Andric unsigned LLVMGetCallBrNumIndirectDests(LLVMValueRef CallBr) { 3105*0fca6ea1SDimitry Andric return unwrap<CallBrInst>(CallBr)->getNumIndirectDests(); 3106*0fca6ea1SDimitry Andric } 3107*0fca6ea1SDimitry Andric 3108*0fca6ea1SDimitry Andric LLVMBasicBlockRef LLVMGetCallBrIndirectDest(LLVMValueRef CallBr, unsigned Idx) { 3109*0fca6ea1SDimitry Andric return wrap(unwrap<CallBrInst>(CallBr)->getIndirectDest(Idx)); 3110*0fca6ea1SDimitry Andric } 3111*0fca6ea1SDimitry Andric 31120b57cec5SDimitry Andric /*--.. Operations on terminators ...........................................--*/ 31130b57cec5SDimitry Andric 31140b57cec5SDimitry Andric unsigned LLVMGetNumSuccessors(LLVMValueRef Term) { 31150b57cec5SDimitry Andric return unwrap<Instruction>(Term)->getNumSuccessors(); 31160b57cec5SDimitry Andric } 31170b57cec5SDimitry Andric 31180b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetSuccessor(LLVMValueRef Term, unsigned i) { 31190b57cec5SDimitry Andric return wrap(unwrap<Instruction>(Term)->getSuccessor(i)); 31200b57cec5SDimitry Andric } 31210b57cec5SDimitry Andric 31220b57cec5SDimitry Andric void LLVMSetSuccessor(LLVMValueRef Term, unsigned i, LLVMBasicBlockRef block) { 31230b57cec5SDimitry Andric return unwrap<Instruction>(Term)->setSuccessor(i, unwrap(block)); 31240b57cec5SDimitry Andric } 31250b57cec5SDimitry Andric 31260b57cec5SDimitry Andric /*--.. Operations on branch instructions (only) ............................--*/ 31270b57cec5SDimitry Andric 31280b57cec5SDimitry Andric LLVMBool LLVMIsConditional(LLVMValueRef Branch) { 31290b57cec5SDimitry Andric return unwrap<BranchInst>(Branch)->isConditional(); 31300b57cec5SDimitry Andric } 31310b57cec5SDimitry Andric 31320b57cec5SDimitry Andric LLVMValueRef LLVMGetCondition(LLVMValueRef Branch) { 31330b57cec5SDimitry Andric return wrap(unwrap<BranchInst>(Branch)->getCondition()); 31340b57cec5SDimitry Andric } 31350b57cec5SDimitry Andric 31360b57cec5SDimitry Andric void LLVMSetCondition(LLVMValueRef Branch, LLVMValueRef Cond) { 31370b57cec5SDimitry Andric return unwrap<BranchInst>(Branch)->setCondition(unwrap(Cond)); 31380b57cec5SDimitry Andric } 31390b57cec5SDimitry Andric 31400b57cec5SDimitry Andric /*--.. Operations on switch instructions (only) ............................--*/ 31410b57cec5SDimitry Andric 31420b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetSwitchDefaultDest(LLVMValueRef Switch) { 31430b57cec5SDimitry Andric return wrap(unwrap<SwitchInst>(Switch)->getDefaultDest()); 31440b57cec5SDimitry Andric } 31450b57cec5SDimitry Andric 31460b57cec5SDimitry Andric /*--.. Operations on alloca instructions (only) ............................--*/ 31470b57cec5SDimitry Andric 31480b57cec5SDimitry Andric LLVMTypeRef LLVMGetAllocatedType(LLVMValueRef Alloca) { 31490b57cec5SDimitry Andric return wrap(unwrap<AllocaInst>(Alloca)->getAllocatedType()); 31500b57cec5SDimitry Andric } 31510b57cec5SDimitry Andric 31520b57cec5SDimitry Andric /*--.. Operations on gep instructions (only) ...............................--*/ 31530b57cec5SDimitry Andric 31540b57cec5SDimitry Andric LLVMBool LLVMIsInBounds(LLVMValueRef GEP) { 31550eae32dcSDimitry Andric return unwrap<GEPOperator>(GEP)->isInBounds(); 31560b57cec5SDimitry Andric } 31570b57cec5SDimitry Andric 31580b57cec5SDimitry Andric void LLVMSetIsInBounds(LLVMValueRef GEP, LLVMBool InBounds) { 31590b57cec5SDimitry Andric return unwrap<GetElementPtrInst>(GEP)->setIsInBounds(InBounds); 31600b57cec5SDimitry Andric } 31610b57cec5SDimitry Andric 31620eae32dcSDimitry Andric LLVMTypeRef LLVMGetGEPSourceElementType(LLVMValueRef GEP) { 31630eae32dcSDimitry Andric return wrap(unwrap<GEPOperator>(GEP)->getSourceElementType()); 31640eae32dcSDimitry Andric } 31650eae32dcSDimitry Andric 3166*0fca6ea1SDimitry Andric LLVMGEPNoWrapFlags LLVMGEPGetNoWrapFlags(LLVMValueRef GEP) { 3167*0fca6ea1SDimitry Andric GEPOperator *GEPOp = unwrap<GEPOperator>(GEP); 3168*0fca6ea1SDimitry Andric return mapToLLVMGEPNoWrapFlags(GEPOp->getNoWrapFlags()); 3169*0fca6ea1SDimitry Andric } 3170*0fca6ea1SDimitry Andric 3171*0fca6ea1SDimitry Andric void LLVMGEPSetNoWrapFlags(LLVMValueRef GEP, LLVMGEPNoWrapFlags NoWrapFlags) { 3172*0fca6ea1SDimitry Andric GetElementPtrInst *GEPInst = unwrap<GetElementPtrInst>(GEP); 3173*0fca6ea1SDimitry Andric GEPInst->setNoWrapFlags(mapFromLLVMGEPNoWrapFlags(NoWrapFlags)); 3174*0fca6ea1SDimitry Andric } 3175*0fca6ea1SDimitry Andric 31760b57cec5SDimitry Andric /*--.. Operations on phi nodes .............................................--*/ 31770b57cec5SDimitry Andric 31780b57cec5SDimitry Andric void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues, 31790b57cec5SDimitry Andric LLVMBasicBlockRef *IncomingBlocks, unsigned Count) { 31800b57cec5SDimitry Andric PHINode *PhiVal = unwrap<PHINode>(PhiNode); 31810b57cec5SDimitry Andric for (unsigned I = 0; I != Count; ++I) 31820b57cec5SDimitry Andric PhiVal->addIncoming(unwrap(IncomingValues[I]), unwrap(IncomingBlocks[I])); 31830b57cec5SDimitry Andric } 31840b57cec5SDimitry Andric 31850b57cec5SDimitry Andric unsigned LLVMCountIncoming(LLVMValueRef PhiNode) { 31860b57cec5SDimitry Andric return unwrap<PHINode>(PhiNode)->getNumIncomingValues(); 31870b57cec5SDimitry Andric } 31880b57cec5SDimitry Andric 31890b57cec5SDimitry Andric LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index) { 31900b57cec5SDimitry Andric return wrap(unwrap<PHINode>(PhiNode)->getIncomingValue(Index)); 31910b57cec5SDimitry Andric } 31920b57cec5SDimitry Andric 31930b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index) { 31940b57cec5SDimitry Andric return wrap(unwrap<PHINode>(PhiNode)->getIncomingBlock(Index)); 31950b57cec5SDimitry Andric } 31960b57cec5SDimitry Andric 31970b57cec5SDimitry Andric /*--.. Operations on extractvalue and insertvalue nodes ....................--*/ 31980b57cec5SDimitry Andric 31990b57cec5SDimitry Andric unsigned LLVMGetNumIndices(LLVMValueRef Inst) { 32000b57cec5SDimitry Andric auto *I = unwrap(Inst); 32010eae32dcSDimitry Andric if (auto *GEP = dyn_cast<GEPOperator>(I)) 32020b57cec5SDimitry Andric return GEP->getNumIndices(); 32030b57cec5SDimitry Andric if (auto *EV = dyn_cast<ExtractValueInst>(I)) 32040b57cec5SDimitry Andric return EV->getNumIndices(); 32050b57cec5SDimitry Andric if (auto *IV = dyn_cast<InsertValueInst>(I)) 32060b57cec5SDimitry Andric return IV->getNumIndices(); 32070b57cec5SDimitry Andric llvm_unreachable( 32080b57cec5SDimitry Andric "LLVMGetNumIndices applies only to extractvalue and insertvalue!"); 32090b57cec5SDimitry Andric } 32100b57cec5SDimitry Andric 32110b57cec5SDimitry Andric const unsigned *LLVMGetIndices(LLVMValueRef Inst) { 32120b57cec5SDimitry Andric auto *I = unwrap(Inst); 32130b57cec5SDimitry Andric if (auto *EV = dyn_cast<ExtractValueInst>(I)) 32140b57cec5SDimitry Andric return EV->getIndices().data(); 32150b57cec5SDimitry Andric if (auto *IV = dyn_cast<InsertValueInst>(I)) 32160b57cec5SDimitry Andric return IV->getIndices().data(); 32170b57cec5SDimitry Andric llvm_unreachable( 32180b57cec5SDimitry Andric "LLVMGetIndices applies only to extractvalue and insertvalue!"); 32190b57cec5SDimitry Andric } 32200b57cec5SDimitry Andric 32210b57cec5SDimitry Andric 32220b57cec5SDimitry Andric /*===-- Instruction builders ----------------------------------------------===*/ 32230b57cec5SDimitry Andric 32240b57cec5SDimitry Andric LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C) { 32250b57cec5SDimitry Andric return wrap(new IRBuilder<>(*unwrap(C))); 32260b57cec5SDimitry Andric } 32270b57cec5SDimitry Andric 32280b57cec5SDimitry Andric LLVMBuilderRef LLVMCreateBuilder(void) { 32290b57cec5SDimitry Andric return LLVMCreateBuilderInContext(LLVMGetGlobalContext()); 32300b57cec5SDimitry Andric } 32310b57cec5SDimitry Andric 3232*0fca6ea1SDimitry Andric static void LLVMPositionBuilderImpl(IRBuilder<> *Builder, BasicBlock *Block, 3233*0fca6ea1SDimitry Andric Instruction *Instr, bool BeforeDbgRecords) { 3234*0fca6ea1SDimitry Andric BasicBlock::iterator I = Instr ? Instr->getIterator() : Block->end(); 3235*0fca6ea1SDimitry Andric I.setHeadBit(BeforeDbgRecords); 3236*0fca6ea1SDimitry Andric Builder->SetInsertPoint(Block, I); 3237*0fca6ea1SDimitry Andric } 3238*0fca6ea1SDimitry Andric 32390b57cec5SDimitry Andric void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block, 32400b57cec5SDimitry Andric LLVMValueRef Instr) { 3241*0fca6ea1SDimitry Andric return LLVMPositionBuilderImpl(unwrap(Builder), unwrap(Block), 3242*0fca6ea1SDimitry Andric unwrap<Instruction>(Instr), false); 3243*0fca6ea1SDimitry Andric } 3244*0fca6ea1SDimitry Andric 3245*0fca6ea1SDimitry Andric void LLVMPositionBuilderBeforeDbgRecords(LLVMBuilderRef Builder, 3246*0fca6ea1SDimitry Andric LLVMBasicBlockRef Block, 3247*0fca6ea1SDimitry Andric LLVMValueRef Instr) { 3248*0fca6ea1SDimitry Andric return LLVMPositionBuilderImpl(unwrap(Builder), unwrap(Block), 3249*0fca6ea1SDimitry Andric unwrap<Instruction>(Instr), true); 32500b57cec5SDimitry Andric } 32510b57cec5SDimitry Andric 32520b57cec5SDimitry Andric void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr) { 32530b57cec5SDimitry Andric Instruction *I = unwrap<Instruction>(Instr); 3254*0fca6ea1SDimitry Andric return LLVMPositionBuilderImpl(unwrap(Builder), I->getParent(), I, false); 3255*0fca6ea1SDimitry Andric } 3256*0fca6ea1SDimitry Andric 3257*0fca6ea1SDimitry Andric void LLVMPositionBuilderBeforeInstrAndDbgRecords(LLVMBuilderRef Builder, 3258*0fca6ea1SDimitry Andric LLVMValueRef Instr) { 3259*0fca6ea1SDimitry Andric Instruction *I = unwrap<Instruction>(Instr); 3260*0fca6ea1SDimitry Andric return LLVMPositionBuilderImpl(unwrap(Builder), I->getParent(), I, true); 32610b57cec5SDimitry Andric } 32620b57cec5SDimitry Andric 32630b57cec5SDimitry Andric void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block) { 32640b57cec5SDimitry Andric BasicBlock *BB = unwrap(Block); 32650b57cec5SDimitry Andric unwrap(Builder)->SetInsertPoint(BB); 32660b57cec5SDimitry Andric } 32670b57cec5SDimitry Andric 32680b57cec5SDimitry Andric LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder) { 32690b57cec5SDimitry Andric return wrap(unwrap(Builder)->GetInsertBlock()); 32700b57cec5SDimitry Andric } 32710b57cec5SDimitry Andric 32720b57cec5SDimitry Andric void LLVMClearInsertionPosition(LLVMBuilderRef Builder) { 32730b57cec5SDimitry Andric unwrap(Builder)->ClearInsertionPoint(); 32740b57cec5SDimitry Andric } 32750b57cec5SDimitry Andric 32760b57cec5SDimitry Andric void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr) { 32770b57cec5SDimitry Andric unwrap(Builder)->Insert(unwrap<Instruction>(Instr)); 32780b57cec5SDimitry Andric } 32790b57cec5SDimitry Andric 32800b57cec5SDimitry Andric void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr, 32810b57cec5SDimitry Andric const char *Name) { 32820b57cec5SDimitry Andric unwrap(Builder)->Insert(unwrap<Instruction>(Instr), Name); 32830b57cec5SDimitry Andric } 32840b57cec5SDimitry Andric 32850b57cec5SDimitry Andric void LLVMDisposeBuilder(LLVMBuilderRef Builder) { 32860b57cec5SDimitry Andric delete unwrap(Builder); 32870b57cec5SDimitry Andric } 32880b57cec5SDimitry Andric 32890b57cec5SDimitry Andric /*--.. Metadata builders ...................................................--*/ 32900b57cec5SDimitry Andric 32910b57cec5SDimitry Andric LLVMMetadataRef LLVMGetCurrentDebugLocation2(LLVMBuilderRef Builder) { 32920b57cec5SDimitry Andric return wrap(unwrap(Builder)->getCurrentDebugLocation().getAsMDNode()); 32930b57cec5SDimitry Andric } 32940b57cec5SDimitry Andric 32950b57cec5SDimitry Andric void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Builder, LLVMMetadataRef Loc) { 32960b57cec5SDimitry Andric if (Loc) 32970b57cec5SDimitry Andric unwrap(Builder)->SetCurrentDebugLocation(DebugLoc(unwrap<MDNode>(Loc))); 32980b57cec5SDimitry Andric else 32990b57cec5SDimitry Andric unwrap(Builder)->SetCurrentDebugLocation(DebugLoc()); 33000b57cec5SDimitry Andric } 33010b57cec5SDimitry Andric 33020b57cec5SDimitry Andric void LLVMSetCurrentDebugLocation(LLVMBuilderRef Builder, LLVMValueRef L) { 33030b57cec5SDimitry Andric MDNode *Loc = 33040b57cec5SDimitry Andric L ? cast<MDNode>(unwrap<MetadataAsValue>(L)->getMetadata()) : nullptr; 33050b57cec5SDimitry Andric unwrap(Builder)->SetCurrentDebugLocation(DebugLoc(Loc)); 33060b57cec5SDimitry Andric } 33070b57cec5SDimitry Andric 33080b57cec5SDimitry Andric LLVMValueRef LLVMGetCurrentDebugLocation(LLVMBuilderRef Builder) { 33090b57cec5SDimitry Andric LLVMContext &Context = unwrap(Builder)->getContext(); 33100b57cec5SDimitry Andric return wrap(MetadataAsValue::get( 33110b57cec5SDimitry Andric Context, unwrap(Builder)->getCurrentDebugLocation().getAsMDNode())); 33120b57cec5SDimitry Andric } 33130b57cec5SDimitry Andric 33140b57cec5SDimitry Andric void LLVMSetInstDebugLocation(LLVMBuilderRef Builder, LLVMValueRef Inst) { 33150b57cec5SDimitry Andric unwrap(Builder)->SetInstDebugLocation(unwrap<Instruction>(Inst)); 33160b57cec5SDimitry Andric } 33170b57cec5SDimitry Andric 3318349cc55cSDimitry Andric void LLVMAddMetadataToInst(LLVMBuilderRef Builder, LLVMValueRef Inst) { 3319349cc55cSDimitry Andric unwrap(Builder)->AddMetadataToInst(unwrap<Instruction>(Inst)); 3320349cc55cSDimitry Andric } 3321349cc55cSDimitry Andric 33220b57cec5SDimitry Andric void LLVMBuilderSetDefaultFPMathTag(LLVMBuilderRef Builder, 33230b57cec5SDimitry Andric LLVMMetadataRef FPMathTag) { 33240b57cec5SDimitry Andric 33250b57cec5SDimitry Andric unwrap(Builder)->setDefaultFPMathTag(FPMathTag 33260b57cec5SDimitry Andric ? unwrap<MDNode>(FPMathTag) 33270b57cec5SDimitry Andric : nullptr); 33280b57cec5SDimitry Andric } 33290b57cec5SDimitry Andric 33300b57cec5SDimitry Andric LLVMMetadataRef LLVMBuilderGetDefaultFPMathTag(LLVMBuilderRef Builder) { 33310b57cec5SDimitry Andric return wrap(unwrap(Builder)->getDefaultFPMathTag()); 33320b57cec5SDimitry Andric } 33330b57cec5SDimitry Andric 33340b57cec5SDimitry Andric /*--.. Instruction builders ................................................--*/ 33350b57cec5SDimitry Andric 33360b57cec5SDimitry Andric LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef B) { 33370b57cec5SDimitry Andric return wrap(unwrap(B)->CreateRetVoid()); 33380b57cec5SDimitry Andric } 33390b57cec5SDimitry Andric 33400b57cec5SDimitry Andric LLVMValueRef LLVMBuildRet(LLVMBuilderRef B, LLVMValueRef V) { 33410b57cec5SDimitry Andric return wrap(unwrap(B)->CreateRet(unwrap(V))); 33420b57cec5SDimitry Andric } 33430b57cec5SDimitry Andric 33440b57cec5SDimitry Andric LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef B, LLVMValueRef *RetVals, 33450b57cec5SDimitry Andric unsigned N) { 33460b57cec5SDimitry Andric return wrap(unwrap(B)->CreateAggregateRet(unwrap(RetVals), N)); 33470b57cec5SDimitry Andric } 33480b57cec5SDimitry Andric 33490b57cec5SDimitry Andric LLVMValueRef LLVMBuildBr(LLVMBuilderRef B, LLVMBasicBlockRef Dest) { 33500b57cec5SDimitry Andric return wrap(unwrap(B)->CreateBr(unwrap(Dest))); 33510b57cec5SDimitry Andric } 33520b57cec5SDimitry Andric 33530b57cec5SDimitry Andric LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef B, LLVMValueRef If, 33540b57cec5SDimitry Andric LLVMBasicBlockRef Then, LLVMBasicBlockRef Else) { 33550b57cec5SDimitry Andric return wrap(unwrap(B)->CreateCondBr(unwrap(If), unwrap(Then), unwrap(Else))); 33560b57cec5SDimitry Andric } 33570b57cec5SDimitry Andric 33580b57cec5SDimitry Andric LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef B, LLVMValueRef V, 33590b57cec5SDimitry Andric LLVMBasicBlockRef Else, unsigned NumCases) { 33600b57cec5SDimitry Andric return wrap(unwrap(B)->CreateSwitch(unwrap(V), unwrap(Else), NumCases)); 33610b57cec5SDimitry Andric } 33620b57cec5SDimitry Andric 33630b57cec5SDimitry Andric LLVMValueRef LLVMBuildIndirectBr(LLVMBuilderRef B, LLVMValueRef Addr, 33640b57cec5SDimitry Andric unsigned NumDests) { 33650b57cec5SDimitry Andric return wrap(unwrap(B)->CreateIndirectBr(unwrap(Addr), NumDests)); 33660b57cec5SDimitry Andric } 33670b57cec5SDimitry Andric 3368*0fca6ea1SDimitry Andric LLVMValueRef LLVMBuildCallBr(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Fn, 3369*0fca6ea1SDimitry Andric LLVMBasicBlockRef DefaultDest, 3370*0fca6ea1SDimitry Andric LLVMBasicBlockRef *IndirectDests, 3371*0fca6ea1SDimitry Andric unsigned NumIndirectDests, LLVMValueRef *Args, 3372*0fca6ea1SDimitry Andric unsigned NumArgs, LLVMOperandBundleRef *Bundles, 3373*0fca6ea1SDimitry Andric unsigned NumBundles, const char *Name) { 3374*0fca6ea1SDimitry Andric 3375*0fca6ea1SDimitry Andric SmallVector<OperandBundleDef, 8> OBs; 3376*0fca6ea1SDimitry Andric for (auto *Bundle : ArrayRef(Bundles, NumBundles)) { 3377*0fca6ea1SDimitry Andric OperandBundleDef *OB = unwrap(Bundle); 3378*0fca6ea1SDimitry Andric OBs.push_back(*OB); 3379*0fca6ea1SDimitry Andric } 3380*0fca6ea1SDimitry Andric 3381*0fca6ea1SDimitry Andric return wrap(unwrap(B)->CreateCallBr( 3382*0fca6ea1SDimitry Andric unwrap<FunctionType>(Ty), unwrap(Fn), unwrap(DefaultDest), 3383*0fca6ea1SDimitry Andric ArrayRef(unwrap(IndirectDests), NumIndirectDests), 3384*0fca6ea1SDimitry Andric ArrayRef<Value *>(unwrap(Args), NumArgs), OBs, Name)); 3385*0fca6ea1SDimitry Andric } 3386*0fca6ea1SDimitry Andric 33870b57cec5SDimitry Andric LLVMValueRef LLVMBuildInvoke2(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Fn, 33880b57cec5SDimitry Andric LLVMValueRef *Args, unsigned NumArgs, 33890b57cec5SDimitry Andric LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, 33900b57cec5SDimitry Andric const char *Name) { 3391bdd1243dSDimitry Andric return wrap(unwrap(B)->CreateInvoke(unwrap<FunctionType>(Ty), unwrap(Fn), 3392bdd1243dSDimitry Andric unwrap(Then), unwrap(Catch), 3393bdd1243dSDimitry Andric ArrayRef(unwrap(Args), NumArgs), Name)); 33940b57cec5SDimitry Andric } 33950b57cec5SDimitry Andric 33965f757f3fSDimitry Andric LLVMValueRef LLVMBuildInvokeWithOperandBundles( 33975f757f3fSDimitry Andric LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Fn, LLVMValueRef *Args, 33985f757f3fSDimitry Andric unsigned NumArgs, LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch, 33995f757f3fSDimitry Andric LLVMOperandBundleRef *Bundles, unsigned NumBundles, const char *Name) { 34005f757f3fSDimitry Andric SmallVector<OperandBundleDef, 8> OBs; 34015f757f3fSDimitry Andric for (auto *Bundle : ArrayRef(Bundles, NumBundles)) { 34025f757f3fSDimitry Andric OperandBundleDef *OB = unwrap(Bundle); 34035f757f3fSDimitry Andric OBs.push_back(*OB); 34045f757f3fSDimitry Andric } 34055f757f3fSDimitry Andric return wrap(unwrap(B)->CreateInvoke( 34065f757f3fSDimitry Andric unwrap<FunctionType>(Ty), unwrap(Fn), unwrap(Then), unwrap(Catch), 34075f757f3fSDimitry Andric ArrayRef(unwrap(Args), NumArgs), OBs, Name)); 34085f757f3fSDimitry Andric } 34095f757f3fSDimitry Andric 34100b57cec5SDimitry Andric LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty, 34110b57cec5SDimitry Andric LLVMValueRef PersFn, unsigned NumClauses, 34120b57cec5SDimitry Andric const char *Name) { 34130b57cec5SDimitry Andric // The personality used to live on the landingpad instruction, but now it 34140b57cec5SDimitry Andric // lives on the parent function. For compatibility, take the provided 34150b57cec5SDimitry Andric // personality and put it on the parent function. 34160b57cec5SDimitry Andric if (PersFn) 34170b57cec5SDimitry Andric unwrap(B)->GetInsertBlock()->getParent()->setPersonalityFn( 3418bdd1243dSDimitry Andric unwrap<Function>(PersFn)); 34190b57cec5SDimitry Andric return wrap(unwrap(B)->CreateLandingPad(unwrap(Ty), NumClauses, Name)); 34200b57cec5SDimitry Andric } 34210b57cec5SDimitry Andric 34220b57cec5SDimitry Andric LLVMValueRef LLVMBuildCatchPad(LLVMBuilderRef B, LLVMValueRef ParentPad, 34230b57cec5SDimitry Andric LLVMValueRef *Args, unsigned NumArgs, 34240b57cec5SDimitry Andric const char *Name) { 34250b57cec5SDimitry Andric return wrap(unwrap(B)->CreateCatchPad(unwrap(ParentPad), 3426bdd1243dSDimitry Andric ArrayRef(unwrap(Args), NumArgs), Name)); 34270b57cec5SDimitry Andric } 34280b57cec5SDimitry Andric 34290b57cec5SDimitry Andric LLVMValueRef LLVMBuildCleanupPad(LLVMBuilderRef B, LLVMValueRef ParentPad, 34300b57cec5SDimitry Andric LLVMValueRef *Args, unsigned NumArgs, 34310b57cec5SDimitry Andric const char *Name) { 34320b57cec5SDimitry Andric if (ParentPad == nullptr) { 34330b57cec5SDimitry Andric Type *Ty = Type::getTokenTy(unwrap(B)->getContext()); 34340b57cec5SDimitry Andric ParentPad = wrap(Constant::getNullValue(Ty)); 34350b57cec5SDimitry Andric } 3436bdd1243dSDimitry Andric return wrap(unwrap(B)->CreateCleanupPad( 3437bdd1243dSDimitry Andric unwrap(ParentPad), ArrayRef(unwrap(Args), NumArgs), Name)); 34380b57cec5SDimitry Andric } 34390b57cec5SDimitry Andric 34400b57cec5SDimitry Andric LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn) { 34410b57cec5SDimitry Andric return wrap(unwrap(B)->CreateResume(unwrap(Exn))); 34420b57cec5SDimitry Andric } 34430b57cec5SDimitry Andric 34440b57cec5SDimitry Andric LLVMValueRef LLVMBuildCatchSwitch(LLVMBuilderRef B, LLVMValueRef ParentPad, 34450b57cec5SDimitry Andric LLVMBasicBlockRef UnwindBB, 34460b57cec5SDimitry Andric unsigned NumHandlers, const char *Name) { 34470b57cec5SDimitry Andric if (ParentPad == nullptr) { 34480b57cec5SDimitry Andric Type *Ty = Type::getTokenTy(unwrap(B)->getContext()); 34490b57cec5SDimitry Andric ParentPad = wrap(Constant::getNullValue(Ty)); 34500b57cec5SDimitry Andric } 34510b57cec5SDimitry Andric return wrap(unwrap(B)->CreateCatchSwitch(unwrap(ParentPad), unwrap(UnwindBB), 34520b57cec5SDimitry Andric NumHandlers, Name)); 34530b57cec5SDimitry Andric } 34540b57cec5SDimitry Andric 34550b57cec5SDimitry Andric LLVMValueRef LLVMBuildCatchRet(LLVMBuilderRef B, LLVMValueRef CatchPad, 34560b57cec5SDimitry Andric LLVMBasicBlockRef BB) { 34570b57cec5SDimitry Andric return wrap(unwrap(B)->CreateCatchRet(unwrap<CatchPadInst>(CatchPad), 34580b57cec5SDimitry Andric unwrap(BB))); 34590b57cec5SDimitry Andric } 34600b57cec5SDimitry Andric 34610b57cec5SDimitry Andric LLVMValueRef LLVMBuildCleanupRet(LLVMBuilderRef B, LLVMValueRef CatchPad, 34620b57cec5SDimitry Andric LLVMBasicBlockRef BB) { 34630b57cec5SDimitry Andric return wrap(unwrap(B)->CreateCleanupRet(unwrap<CleanupPadInst>(CatchPad), 34640b57cec5SDimitry Andric unwrap(BB))); 34650b57cec5SDimitry Andric } 34660b57cec5SDimitry Andric 34670b57cec5SDimitry Andric LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef B) { 34680b57cec5SDimitry Andric return wrap(unwrap(B)->CreateUnreachable()); 34690b57cec5SDimitry Andric } 34700b57cec5SDimitry Andric 34710b57cec5SDimitry Andric void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal, 34720b57cec5SDimitry Andric LLVMBasicBlockRef Dest) { 34730b57cec5SDimitry Andric unwrap<SwitchInst>(Switch)->addCase(unwrap<ConstantInt>(OnVal), unwrap(Dest)); 34740b57cec5SDimitry Andric } 34750b57cec5SDimitry Andric 34760b57cec5SDimitry Andric void LLVMAddDestination(LLVMValueRef IndirectBr, LLVMBasicBlockRef Dest) { 34770b57cec5SDimitry Andric unwrap<IndirectBrInst>(IndirectBr)->addDestination(unwrap(Dest)); 34780b57cec5SDimitry Andric } 34790b57cec5SDimitry Andric 34800b57cec5SDimitry Andric unsigned LLVMGetNumClauses(LLVMValueRef LandingPad) { 34810b57cec5SDimitry Andric return unwrap<LandingPadInst>(LandingPad)->getNumClauses(); 34820b57cec5SDimitry Andric } 34830b57cec5SDimitry Andric 34840b57cec5SDimitry Andric LLVMValueRef LLVMGetClause(LLVMValueRef LandingPad, unsigned Idx) { 34850b57cec5SDimitry Andric return wrap(unwrap<LandingPadInst>(LandingPad)->getClause(Idx)); 34860b57cec5SDimitry Andric } 34870b57cec5SDimitry Andric 34880b57cec5SDimitry Andric void LLVMAddClause(LLVMValueRef LandingPad, LLVMValueRef ClauseVal) { 3489bdd1243dSDimitry Andric unwrap<LandingPadInst>(LandingPad)->addClause(unwrap<Constant>(ClauseVal)); 34900b57cec5SDimitry Andric } 34910b57cec5SDimitry Andric 34920b57cec5SDimitry Andric LLVMBool LLVMIsCleanup(LLVMValueRef LandingPad) { 34930b57cec5SDimitry Andric return unwrap<LandingPadInst>(LandingPad)->isCleanup(); 34940b57cec5SDimitry Andric } 34950b57cec5SDimitry Andric 34960b57cec5SDimitry Andric void LLVMSetCleanup(LLVMValueRef LandingPad, LLVMBool Val) { 34970b57cec5SDimitry Andric unwrap<LandingPadInst>(LandingPad)->setCleanup(Val); 34980b57cec5SDimitry Andric } 34990b57cec5SDimitry Andric 35000b57cec5SDimitry Andric void LLVMAddHandler(LLVMValueRef CatchSwitch, LLVMBasicBlockRef Dest) { 35010b57cec5SDimitry Andric unwrap<CatchSwitchInst>(CatchSwitch)->addHandler(unwrap(Dest)); 35020b57cec5SDimitry Andric } 35030b57cec5SDimitry Andric 35040b57cec5SDimitry Andric unsigned LLVMGetNumHandlers(LLVMValueRef CatchSwitch) { 35050b57cec5SDimitry Andric return unwrap<CatchSwitchInst>(CatchSwitch)->getNumHandlers(); 35060b57cec5SDimitry Andric } 35070b57cec5SDimitry Andric 35080b57cec5SDimitry Andric void LLVMGetHandlers(LLVMValueRef CatchSwitch, LLVMBasicBlockRef *Handlers) { 35090b57cec5SDimitry Andric CatchSwitchInst *CSI = unwrap<CatchSwitchInst>(CatchSwitch); 3510fe6060f1SDimitry Andric for (const BasicBlock *H : CSI->handlers()) 3511fe6060f1SDimitry Andric *Handlers++ = wrap(H); 35120b57cec5SDimitry Andric } 35130b57cec5SDimitry Andric 35140b57cec5SDimitry Andric LLVMValueRef LLVMGetParentCatchSwitch(LLVMValueRef CatchPad) { 35150b57cec5SDimitry Andric return wrap(unwrap<CatchPadInst>(CatchPad)->getCatchSwitch()); 35160b57cec5SDimitry Andric } 35170b57cec5SDimitry Andric 35180b57cec5SDimitry Andric void LLVMSetParentCatchSwitch(LLVMValueRef CatchPad, LLVMValueRef CatchSwitch) { 35190b57cec5SDimitry Andric unwrap<CatchPadInst>(CatchPad) 35200b57cec5SDimitry Andric ->setCatchSwitch(unwrap<CatchSwitchInst>(CatchSwitch)); 35210b57cec5SDimitry Andric } 35220b57cec5SDimitry Andric 35230b57cec5SDimitry Andric /*--.. Funclets ...........................................................--*/ 35240b57cec5SDimitry Andric 35250b57cec5SDimitry Andric LLVMValueRef LLVMGetArgOperand(LLVMValueRef Funclet, unsigned i) { 35260b57cec5SDimitry Andric return wrap(unwrap<FuncletPadInst>(Funclet)->getArgOperand(i)); 35270b57cec5SDimitry Andric } 35280b57cec5SDimitry Andric 35290b57cec5SDimitry Andric void LLVMSetArgOperand(LLVMValueRef Funclet, unsigned i, LLVMValueRef value) { 35300b57cec5SDimitry Andric unwrap<FuncletPadInst>(Funclet)->setArgOperand(i, unwrap(value)); 35310b57cec5SDimitry Andric } 35320b57cec5SDimitry Andric 35330b57cec5SDimitry Andric /*--.. Arithmetic ..........................................................--*/ 35340b57cec5SDimitry Andric 35355f757f3fSDimitry Andric static FastMathFlags mapFromLLVMFastMathFlags(LLVMFastMathFlags FMF) { 35365f757f3fSDimitry Andric FastMathFlags NewFMF; 35375f757f3fSDimitry Andric NewFMF.setAllowReassoc((FMF & LLVMFastMathAllowReassoc) != 0); 35385f757f3fSDimitry Andric NewFMF.setNoNaNs((FMF & LLVMFastMathNoNaNs) != 0); 35395f757f3fSDimitry Andric NewFMF.setNoInfs((FMF & LLVMFastMathNoInfs) != 0); 35405f757f3fSDimitry Andric NewFMF.setNoSignedZeros((FMF & LLVMFastMathNoSignedZeros) != 0); 35415f757f3fSDimitry Andric NewFMF.setAllowReciprocal((FMF & LLVMFastMathAllowReciprocal) != 0); 35425f757f3fSDimitry Andric NewFMF.setAllowContract((FMF & LLVMFastMathAllowContract) != 0); 35435f757f3fSDimitry Andric NewFMF.setApproxFunc((FMF & LLVMFastMathApproxFunc) != 0); 35445f757f3fSDimitry Andric 35455f757f3fSDimitry Andric return NewFMF; 35465f757f3fSDimitry Andric } 35475f757f3fSDimitry Andric 35485f757f3fSDimitry Andric static LLVMFastMathFlags mapToLLVMFastMathFlags(FastMathFlags FMF) { 35495f757f3fSDimitry Andric LLVMFastMathFlags NewFMF = LLVMFastMathNone; 35505f757f3fSDimitry Andric if (FMF.allowReassoc()) 35515f757f3fSDimitry Andric NewFMF |= LLVMFastMathAllowReassoc; 35525f757f3fSDimitry Andric if (FMF.noNaNs()) 35535f757f3fSDimitry Andric NewFMF |= LLVMFastMathNoNaNs; 35545f757f3fSDimitry Andric if (FMF.noInfs()) 35555f757f3fSDimitry Andric NewFMF |= LLVMFastMathNoInfs; 35565f757f3fSDimitry Andric if (FMF.noSignedZeros()) 35575f757f3fSDimitry Andric NewFMF |= LLVMFastMathNoSignedZeros; 35585f757f3fSDimitry Andric if (FMF.allowReciprocal()) 35595f757f3fSDimitry Andric NewFMF |= LLVMFastMathAllowReciprocal; 35605f757f3fSDimitry Andric if (FMF.allowContract()) 35615f757f3fSDimitry Andric NewFMF |= LLVMFastMathAllowContract; 35625f757f3fSDimitry Andric if (FMF.approxFunc()) 35635f757f3fSDimitry Andric NewFMF |= LLVMFastMathApproxFunc; 35645f757f3fSDimitry Andric 35655f757f3fSDimitry Andric return NewFMF; 35665f757f3fSDimitry Andric } 35675f757f3fSDimitry Andric 35680b57cec5SDimitry Andric LLVMValueRef LLVMBuildAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 35690b57cec5SDimitry Andric const char *Name) { 35700b57cec5SDimitry Andric return wrap(unwrap(B)->CreateAdd(unwrap(LHS), unwrap(RHS), Name)); 35710b57cec5SDimitry Andric } 35720b57cec5SDimitry Andric 35730b57cec5SDimitry Andric LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 35740b57cec5SDimitry Andric const char *Name) { 35750b57cec5SDimitry Andric return wrap(unwrap(B)->CreateNSWAdd(unwrap(LHS), unwrap(RHS), Name)); 35760b57cec5SDimitry Andric } 35770b57cec5SDimitry Andric 35780b57cec5SDimitry Andric LLVMValueRef LLVMBuildNUWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 35790b57cec5SDimitry Andric const char *Name) { 35800b57cec5SDimitry Andric return wrap(unwrap(B)->CreateNUWAdd(unwrap(LHS), unwrap(RHS), Name)); 35810b57cec5SDimitry Andric } 35820b57cec5SDimitry Andric 35830b57cec5SDimitry Andric LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 35840b57cec5SDimitry Andric const char *Name) { 35850b57cec5SDimitry Andric return wrap(unwrap(B)->CreateFAdd(unwrap(LHS), unwrap(RHS), Name)); 35860b57cec5SDimitry Andric } 35870b57cec5SDimitry Andric 35880b57cec5SDimitry Andric LLVMValueRef LLVMBuildSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 35890b57cec5SDimitry Andric const char *Name) { 35900b57cec5SDimitry Andric return wrap(unwrap(B)->CreateSub(unwrap(LHS), unwrap(RHS), Name)); 35910b57cec5SDimitry Andric } 35920b57cec5SDimitry Andric 35930b57cec5SDimitry Andric LLVMValueRef LLVMBuildNSWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 35940b57cec5SDimitry Andric const char *Name) { 35950b57cec5SDimitry Andric return wrap(unwrap(B)->CreateNSWSub(unwrap(LHS), unwrap(RHS), Name)); 35960b57cec5SDimitry Andric } 35970b57cec5SDimitry Andric 35980b57cec5SDimitry Andric LLVMValueRef LLVMBuildNUWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 35990b57cec5SDimitry Andric const char *Name) { 36000b57cec5SDimitry Andric return wrap(unwrap(B)->CreateNUWSub(unwrap(LHS), unwrap(RHS), Name)); 36010b57cec5SDimitry Andric } 36020b57cec5SDimitry Andric 36030b57cec5SDimitry Andric LLVMValueRef LLVMBuildFSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36040b57cec5SDimitry Andric const char *Name) { 36050b57cec5SDimitry Andric return wrap(unwrap(B)->CreateFSub(unwrap(LHS), unwrap(RHS), Name)); 36060b57cec5SDimitry Andric } 36070b57cec5SDimitry Andric 36080b57cec5SDimitry Andric LLVMValueRef LLVMBuildMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36090b57cec5SDimitry Andric const char *Name) { 36100b57cec5SDimitry Andric return wrap(unwrap(B)->CreateMul(unwrap(LHS), unwrap(RHS), Name)); 36110b57cec5SDimitry Andric } 36120b57cec5SDimitry Andric 36130b57cec5SDimitry Andric LLVMValueRef LLVMBuildNSWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36140b57cec5SDimitry Andric const char *Name) { 36150b57cec5SDimitry Andric return wrap(unwrap(B)->CreateNSWMul(unwrap(LHS), unwrap(RHS), Name)); 36160b57cec5SDimitry Andric } 36170b57cec5SDimitry Andric 36180b57cec5SDimitry Andric LLVMValueRef LLVMBuildNUWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36190b57cec5SDimitry Andric const char *Name) { 36200b57cec5SDimitry Andric return wrap(unwrap(B)->CreateNUWMul(unwrap(LHS), unwrap(RHS), Name)); 36210b57cec5SDimitry Andric } 36220b57cec5SDimitry Andric 36230b57cec5SDimitry Andric LLVMValueRef LLVMBuildFMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36240b57cec5SDimitry Andric const char *Name) { 36250b57cec5SDimitry Andric return wrap(unwrap(B)->CreateFMul(unwrap(LHS), unwrap(RHS), Name)); 36260b57cec5SDimitry Andric } 36270b57cec5SDimitry Andric 36280b57cec5SDimitry Andric LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36290b57cec5SDimitry Andric const char *Name) { 36300b57cec5SDimitry Andric return wrap(unwrap(B)->CreateUDiv(unwrap(LHS), unwrap(RHS), Name)); 36310b57cec5SDimitry Andric } 36320b57cec5SDimitry Andric 36330b57cec5SDimitry Andric LLVMValueRef LLVMBuildExactUDiv(LLVMBuilderRef B, LLVMValueRef LHS, 36340b57cec5SDimitry Andric LLVMValueRef RHS, const char *Name) { 36350b57cec5SDimitry Andric return wrap(unwrap(B)->CreateExactUDiv(unwrap(LHS), unwrap(RHS), Name)); 36360b57cec5SDimitry Andric } 36370b57cec5SDimitry Andric 36380b57cec5SDimitry Andric LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36390b57cec5SDimitry Andric const char *Name) { 36400b57cec5SDimitry Andric return wrap(unwrap(B)->CreateSDiv(unwrap(LHS), unwrap(RHS), Name)); 36410b57cec5SDimitry Andric } 36420b57cec5SDimitry Andric 36430b57cec5SDimitry Andric LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef B, LLVMValueRef LHS, 36440b57cec5SDimitry Andric LLVMValueRef RHS, const char *Name) { 36450b57cec5SDimitry Andric return wrap(unwrap(B)->CreateExactSDiv(unwrap(LHS), unwrap(RHS), Name)); 36460b57cec5SDimitry Andric } 36470b57cec5SDimitry Andric 36480b57cec5SDimitry Andric LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36490b57cec5SDimitry Andric const char *Name) { 36500b57cec5SDimitry Andric return wrap(unwrap(B)->CreateFDiv(unwrap(LHS), unwrap(RHS), Name)); 36510b57cec5SDimitry Andric } 36520b57cec5SDimitry Andric 36530b57cec5SDimitry Andric LLVMValueRef LLVMBuildURem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36540b57cec5SDimitry Andric const char *Name) { 36550b57cec5SDimitry Andric return wrap(unwrap(B)->CreateURem(unwrap(LHS), unwrap(RHS), Name)); 36560b57cec5SDimitry Andric } 36570b57cec5SDimitry Andric 36580b57cec5SDimitry Andric LLVMValueRef LLVMBuildSRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36590b57cec5SDimitry Andric const char *Name) { 36600b57cec5SDimitry Andric return wrap(unwrap(B)->CreateSRem(unwrap(LHS), unwrap(RHS), Name)); 36610b57cec5SDimitry Andric } 36620b57cec5SDimitry Andric 36630b57cec5SDimitry Andric LLVMValueRef LLVMBuildFRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36640b57cec5SDimitry Andric const char *Name) { 36650b57cec5SDimitry Andric return wrap(unwrap(B)->CreateFRem(unwrap(LHS), unwrap(RHS), Name)); 36660b57cec5SDimitry Andric } 36670b57cec5SDimitry Andric 36680b57cec5SDimitry Andric LLVMValueRef LLVMBuildShl(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36690b57cec5SDimitry Andric const char *Name) { 36700b57cec5SDimitry Andric return wrap(unwrap(B)->CreateShl(unwrap(LHS), unwrap(RHS), Name)); 36710b57cec5SDimitry Andric } 36720b57cec5SDimitry Andric 36730b57cec5SDimitry Andric LLVMValueRef LLVMBuildLShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36740b57cec5SDimitry Andric const char *Name) { 36750b57cec5SDimitry Andric return wrap(unwrap(B)->CreateLShr(unwrap(LHS), unwrap(RHS), Name)); 36760b57cec5SDimitry Andric } 36770b57cec5SDimitry Andric 36780b57cec5SDimitry Andric LLVMValueRef LLVMBuildAShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36790b57cec5SDimitry Andric const char *Name) { 36800b57cec5SDimitry Andric return wrap(unwrap(B)->CreateAShr(unwrap(LHS), unwrap(RHS), Name)); 36810b57cec5SDimitry Andric } 36820b57cec5SDimitry Andric 36830b57cec5SDimitry Andric LLVMValueRef LLVMBuildAnd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36840b57cec5SDimitry Andric const char *Name) { 36850b57cec5SDimitry Andric return wrap(unwrap(B)->CreateAnd(unwrap(LHS), unwrap(RHS), Name)); 36860b57cec5SDimitry Andric } 36870b57cec5SDimitry Andric 36880b57cec5SDimitry Andric LLVMValueRef LLVMBuildOr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36890b57cec5SDimitry Andric const char *Name) { 36900b57cec5SDimitry Andric return wrap(unwrap(B)->CreateOr(unwrap(LHS), unwrap(RHS), Name)); 36910b57cec5SDimitry Andric } 36920b57cec5SDimitry Andric 36930b57cec5SDimitry Andric LLVMValueRef LLVMBuildXor(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS, 36940b57cec5SDimitry Andric const char *Name) { 36950b57cec5SDimitry Andric return wrap(unwrap(B)->CreateXor(unwrap(LHS), unwrap(RHS), Name)); 36960b57cec5SDimitry Andric } 36970b57cec5SDimitry Andric 36980b57cec5SDimitry Andric LLVMValueRef LLVMBuildBinOp(LLVMBuilderRef B, LLVMOpcode Op, 36990b57cec5SDimitry Andric LLVMValueRef LHS, LLVMValueRef RHS, 37000b57cec5SDimitry Andric const char *Name) { 37010b57cec5SDimitry Andric return wrap(unwrap(B)->CreateBinOp(Instruction::BinaryOps(map_from_llvmopcode(Op)), unwrap(LHS), 37020b57cec5SDimitry Andric unwrap(RHS), Name)); 37030b57cec5SDimitry Andric } 37040b57cec5SDimitry Andric 37050b57cec5SDimitry Andric LLVMValueRef LLVMBuildNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) { 37060b57cec5SDimitry Andric return wrap(unwrap(B)->CreateNeg(unwrap(V), Name)); 37070b57cec5SDimitry Andric } 37080b57cec5SDimitry Andric 37090b57cec5SDimitry Andric LLVMValueRef LLVMBuildNSWNeg(LLVMBuilderRef B, LLVMValueRef V, 37100b57cec5SDimitry Andric const char *Name) { 37110b57cec5SDimitry Andric return wrap(unwrap(B)->CreateNSWNeg(unwrap(V), Name)); 37120b57cec5SDimitry Andric } 37130b57cec5SDimitry Andric 37140b57cec5SDimitry Andric LLVMValueRef LLVMBuildNUWNeg(LLVMBuilderRef B, LLVMValueRef V, 37150b57cec5SDimitry Andric const char *Name) { 3716*0fca6ea1SDimitry Andric Value *Neg = unwrap(B)->CreateNeg(unwrap(V), Name); 3717*0fca6ea1SDimitry Andric if (auto *I = dyn_cast<BinaryOperator>(Neg)) 3718*0fca6ea1SDimitry Andric I->setHasNoUnsignedWrap(); 3719*0fca6ea1SDimitry Andric return wrap(Neg); 37200b57cec5SDimitry Andric } 37210b57cec5SDimitry Andric 37220b57cec5SDimitry Andric LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) { 37230b57cec5SDimitry Andric return wrap(unwrap(B)->CreateFNeg(unwrap(V), Name)); 37240b57cec5SDimitry Andric } 37250b57cec5SDimitry Andric 37260b57cec5SDimitry Andric LLVMValueRef LLVMBuildNot(LLVMBuilderRef B, LLVMValueRef V, const char *Name) { 37270b57cec5SDimitry Andric return wrap(unwrap(B)->CreateNot(unwrap(V), Name)); 37280b57cec5SDimitry Andric } 37290b57cec5SDimitry Andric 373006c3fb27SDimitry Andric LLVMBool LLVMGetNUW(LLVMValueRef ArithInst) { 373106c3fb27SDimitry Andric Value *P = unwrap<Value>(ArithInst); 373206c3fb27SDimitry Andric return cast<Instruction>(P)->hasNoUnsignedWrap(); 373306c3fb27SDimitry Andric } 373406c3fb27SDimitry Andric 373506c3fb27SDimitry Andric void LLVMSetNUW(LLVMValueRef ArithInst, LLVMBool HasNUW) { 373606c3fb27SDimitry Andric Value *P = unwrap<Value>(ArithInst); 373706c3fb27SDimitry Andric cast<Instruction>(P)->setHasNoUnsignedWrap(HasNUW); 373806c3fb27SDimitry Andric } 373906c3fb27SDimitry Andric 374006c3fb27SDimitry Andric LLVMBool LLVMGetNSW(LLVMValueRef ArithInst) { 374106c3fb27SDimitry Andric Value *P = unwrap<Value>(ArithInst); 374206c3fb27SDimitry Andric return cast<Instruction>(P)->hasNoSignedWrap(); 374306c3fb27SDimitry Andric } 374406c3fb27SDimitry Andric 374506c3fb27SDimitry Andric void LLVMSetNSW(LLVMValueRef ArithInst, LLVMBool HasNSW) { 374606c3fb27SDimitry Andric Value *P = unwrap<Value>(ArithInst); 374706c3fb27SDimitry Andric cast<Instruction>(P)->setHasNoSignedWrap(HasNSW); 374806c3fb27SDimitry Andric } 374906c3fb27SDimitry Andric 375006c3fb27SDimitry Andric LLVMBool LLVMGetExact(LLVMValueRef DivOrShrInst) { 375106c3fb27SDimitry Andric Value *P = unwrap<Value>(DivOrShrInst); 375206c3fb27SDimitry Andric return cast<Instruction>(P)->isExact(); 375306c3fb27SDimitry Andric } 375406c3fb27SDimitry Andric 375506c3fb27SDimitry Andric void LLVMSetExact(LLVMValueRef DivOrShrInst, LLVMBool IsExact) { 375606c3fb27SDimitry Andric Value *P = unwrap<Value>(DivOrShrInst); 375706c3fb27SDimitry Andric cast<Instruction>(P)->setIsExact(IsExact); 375806c3fb27SDimitry Andric } 375906c3fb27SDimitry Andric 37605f757f3fSDimitry Andric LLVMBool LLVMGetNNeg(LLVMValueRef NonNegInst) { 37615f757f3fSDimitry Andric Value *P = unwrap<Value>(NonNegInst); 37625f757f3fSDimitry Andric return cast<Instruction>(P)->hasNonNeg(); 37635f757f3fSDimitry Andric } 37645f757f3fSDimitry Andric 37655f757f3fSDimitry Andric void LLVMSetNNeg(LLVMValueRef NonNegInst, LLVMBool IsNonNeg) { 37665f757f3fSDimitry Andric Value *P = unwrap<Value>(NonNegInst); 37675f757f3fSDimitry Andric cast<Instruction>(P)->setNonNeg(IsNonNeg); 37685f757f3fSDimitry Andric } 37695f757f3fSDimitry Andric 37705f757f3fSDimitry Andric LLVMFastMathFlags LLVMGetFastMathFlags(LLVMValueRef FPMathInst) { 37715f757f3fSDimitry Andric Value *P = unwrap<Value>(FPMathInst); 37725f757f3fSDimitry Andric FastMathFlags FMF = cast<Instruction>(P)->getFastMathFlags(); 37735f757f3fSDimitry Andric return mapToLLVMFastMathFlags(FMF); 37745f757f3fSDimitry Andric } 37755f757f3fSDimitry Andric 37765f757f3fSDimitry Andric void LLVMSetFastMathFlags(LLVMValueRef FPMathInst, LLVMFastMathFlags FMF) { 37775f757f3fSDimitry Andric Value *P = unwrap<Value>(FPMathInst); 37785f757f3fSDimitry Andric cast<Instruction>(P)->setFastMathFlags(mapFromLLVMFastMathFlags(FMF)); 37795f757f3fSDimitry Andric } 37805f757f3fSDimitry Andric 37815f757f3fSDimitry Andric LLVMBool LLVMCanValueUseFastMathFlags(LLVMValueRef V) { 37825f757f3fSDimitry Andric Value *Val = unwrap<Value>(V); 37835f757f3fSDimitry Andric return isa<FPMathOperator>(Val); 37845f757f3fSDimitry Andric } 37855f757f3fSDimitry Andric 37865f757f3fSDimitry Andric LLVMBool LLVMGetIsDisjoint(LLVMValueRef Inst) { 37875f757f3fSDimitry Andric Value *P = unwrap<Value>(Inst); 37885f757f3fSDimitry Andric return cast<PossiblyDisjointInst>(P)->isDisjoint(); 37895f757f3fSDimitry Andric } 37905f757f3fSDimitry Andric 37915f757f3fSDimitry Andric void LLVMSetIsDisjoint(LLVMValueRef Inst, LLVMBool IsDisjoint) { 37925f757f3fSDimitry Andric Value *P = unwrap<Value>(Inst); 37935f757f3fSDimitry Andric cast<PossiblyDisjointInst>(P)->setIsDisjoint(IsDisjoint); 37945f757f3fSDimitry Andric } 37955f757f3fSDimitry Andric 37960b57cec5SDimitry Andric /*--.. Memory ..............................................................--*/ 37970b57cec5SDimitry Andric 37980b57cec5SDimitry Andric LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef B, LLVMTypeRef Ty, 37990b57cec5SDimitry Andric const char *Name) { 38000b57cec5SDimitry Andric Type* ITy = Type::getInt32Ty(unwrap(B)->GetInsertBlock()->getContext()); 38010b57cec5SDimitry Andric Constant* AllocSize = ConstantExpr::getSizeOf(unwrap(Ty)); 38020b57cec5SDimitry Andric AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, ITy); 38035f757f3fSDimitry Andric return wrap(unwrap(B)->CreateMalloc(ITy, unwrap(Ty), AllocSize, nullptr, 38045f757f3fSDimitry Andric nullptr, Name)); 38050b57cec5SDimitry Andric } 38060b57cec5SDimitry Andric 38070b57cec5SDimitry Andric LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef B, LLVMTypeRef Ty, 38080b57cec5SDimitry Andric LLVMValueRef Val, const char *Name) { 38090b57cec5SDimitry Andric Type* ITy = Type::getInt32Ty(unwrap(B)->GetInsertBlock()->getContext()); 38100b57cec5SDimitry Andric Constant* AllocSize = ConstantExpr::getSizeOf(unwrap(Ty)); 38110b57cec5SDimitry Andric AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, ITy); 38125f757f3fSDimitry Andric return wrap(unwrap(B)->CreateMalloc(ITy, unwrap(Ty), AllocSize, unwrap(Val), 38135f757f3fSDimitry Andric nullptr, Name)); 38140b57cec5SDimitry Andric } 38150b57cec5SDimitry Andric 38160b57cec5SDimitry Andric LLVMValueRef LLVMBuildMemSet(LLVMBuilderRef B, LLVMValueRef Ptr, 38170b57cec5SDimitry Andric LLVMValueRef Val, LLVMValueRef Len, 38180b57cec5SDimitry Andric unsigned Align) { 3819480093f4SDimitry Andric return wrap(unwrap(B)->CreateMemSet(unwrap(Ptr), unwrap(Val), unwrap(Len), 3820480093f4SDimitry Andric MaybeAlign(Align))); 38210b57cec5SDimitry Andric } 38220b57cec5SDimitry Andric 38230b57cec5SDimitry Andric LLVMValueRef LLVMBuildMemCpy(LLVMBuilderRef B, 38240b57cec5SDimitry Andric LLVMValueRef Dst, unsigned DstAlign, 38250b57cec5SDimitry Andric LLVMValueRef Src, unsigned SrcAlign, 38260b57cec5SDimitry Andric LLVMValueRef Size) { 3827480093f4SDimitry Andric return wrap(unwrap(B)->CreateMemCpy(unwrap(Dst), MaybeAlign(DstAlign), 3828480093f4SDimitry Andric unwrap(Src), MaybeAlign(SrcAlign), 38290b57cec5SDimitry Andric unwrap(Size))); 38300b57cec5SDimitry Andric } 38310b57cec5SDimitry Andric 38320b57cec5SDimitry Andric LLVMValueRef LLVMBuildMemMove(LLVMBuilderRef B, 38330b57cec5SDimitry Andric LLVMValueRef Dst, unsigned DstAlign, 38340b57cec5SDimitry Andric LLVMValueRef Src, unsigned SrcAlign, 38350b57cec5SDimitry Andric LLVMValueRef Size) { 3836480093f4SDimitry Andric return wrap(unwrap(B)->CreateMemMove(unwrap(Dst), MaybeAlign(DstAlign), 3837480093f4SDimitry Andric unwrap(Src), MaybeAlign(SrcAlign), 38380b57cec5SDimitry Andric unwrap(Size))); 38390b57cec5SDimitry Andric } 38400b57cec5SDimitry Andric 38410b57cec5SDimitry Andric LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef B, LLVMTypeRef Ty, 38420b57cec5SDimitry Andric const char *Name) { 38430b57cec5SDimitry Andric return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), nullptr, Name)); 38440b57cec5SDimitry Andric } 38450b57cec5SDimitry Andric 38460b57cec5SDimitry Andric LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef B, LLVMTypeRef Ty, 38470b57cec5SDimitry Andric LLVMValueRef Val, const char *Name) { 38480b57cec5SDimitry Andric return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), unwrap(Val), Name)); 38490b57cec5SDimitry Andric } 38500b57cec5SDimitry Andric 38510b57cec5SDimitry Andric LLVMValueRef LLVMBuildFree(LLVMBuilderRef B, LLVMValueRef PointerVal) { 38525f757f3fSDimitry Andric return wrap(unwrap(B)->CreateFree(unwrap(PointerVal))); 38530b57cec5SDimitry Andric } 38540b57cec5SDimitry Andric 38550b57cec5SDimitry Andric LLVMValueRef LLVMBuildLoad2(LLVMBuilderRef B, LLVMTypeRef Ty, 38560b57cec5SDimitry Andric LLVMValueRef PointerVal, const char *Name) { 38570b57cec5SDimitry Andric return wrap(unwrap(B)->CreateLoad(unwrap(Ty), unwrap(PointerVal), Name)); 38580b57cec5SDimitry Andric } 38590b57cec5SDimitry Andric 38600b57cec5SDimitry Andric LLVMValueRef LLVMBuildStore(LLVMBuilderRef B, LLVMValueRef Val, 38610b57cec5SDimitry Andric LLVMValueRef PointerVal) { 38620b57cec5SDimitry Andric return wrap(unwrap(B)->CreateStore(unwrap(Val), unwrap(PointerVal))); 38630b57cec5SDimitry Andric } 38640b57cec5SDimitry Andric 38650b57cec5SDimitry Andric static AtomicOrdering mapFromLLVMOrdering(LLVMAtomicOrdering Ordering) { 38660b57cec5SDimitry Andric switch (Ordering) { 38670b57cec5SDimitry Andric case LLVMAtomicOrderingNotAtomic: return AtomicOrdering::NotAtomic; 38680b57cec5SDimitry Andric case LLVMAtomicOrderingUnordered: return AtomicOrdering::Unordered; 38690b57cec5SDimitry Andric case LLVMAtomicOrderingMonotonic: return AtomicOrdering::Monotonic; 38700b57cec5SDimitry Andric case LLVMAtomicOrderingAcquire: return AtomicOrdering::Acquire; 38710b57cec5SDimitry Andric case LLVMAtomicOrderingRelease: return AtomicOrdering::Release; 38720b57cec5SDimitry Andric case LLVMAtomicOrderingAcquireRelease: 38730b57cec5SDimitry Andric return AtomicOrdering::AcquireRelease; 38740b57cec5SDimitry Andric case LLVMAtomicOrderingSequentiallyConsistent: 38750b57cec5SDimitry Andric return AtomicOrdering::SequentiallyConsistent; 38760b57cec5SDimitry Andric } 38770b57cec5SDimitry Andric 38780b57cec5SDimitry Andric llvm_unreachable("Invalid LLVMAtomicOrdering value!"); 38790b57cec5SDimitry Andric } 38800b57cec5SDimitry Andric 38810b57cec5SDimitry Andric static LLVMAtomicOrdering mapToLLVMOrdering(AtomicOrdering Ordering) { 38820b57cec5SDimitry Andric switch (Ordering) { 38830b57cec5SDimitry Andric case AtomicOrdering::NotAtomic: return LLVMAtomicOrderingNotAtomic; 38840b57cec5SDimitry Andric case AtomicOrdering::Unordered: return LLVMAtomicOrderingUnordered; 38850b57cec5SDimitry Andric case AtomicOrdering::Monotonic: return LLVMAtomicOrderingMonotonic; 38860b57cec5SDimitry Andric case AtomicOrdering::Acquire: return LLVMAtomicOrderingAcquire; 38870b57cec5SDimitry Andric case AtomicOrdering::Release: return LLVMAtomicOrderingRelease; 38880b57cec5SDimitry Andric case AtomicOrdering::AcquireRelease: 38890b57cec5SDimitry Andric return LLVMAtomicOrderingAcquireRelease; 38900b57cec5SDimitry Andric case AtomicOrdering::SequentiallyConsistent: 38910b57cec5SDimitry Andric return LLVMAtomicOrderingSequentiallyConsistent; 38920b57cec5SDimitry Andric } 38930b57cec5SDimitry Andric 38940b57cec5SDimitry Andric llvm_unreachable("Invalid AtomicOrdering value!"); 38950b57cec5SDimitry Andric } 38960b57cec5SDimitry Andric 38978bcb0991SDimitry Andric static AtomicRMWInst::BinOp mapFromLLVMRMWBinOp(LLVMAtomicRMWBinOp BinOp) { 38988bcb0991SDimitry Andric switch (BinOp) { 38998bcb0991SDimitry Andric case LLVMAtomicRMWBinOpXchg: return AtomicRMWInst::Xchg; 39008bcb0991SDimitry Andric case LLVMAtomicRMWBinOpAdd: return AtomicRMWInst::Add; 39018bcb0991SDimitry Andric case LLVMAtomicRMWBinOpSub: return AtomicRMWInst::Sub; 39028bcb0991SDimitry Andric case LLVMAtomicRMWBinOpAnd: return AtomicRMWInst::And; 39038bcb0991SDimitry Andric case LLVMAtomicRMWBinOpNand: return AtomicRMWInst::Nand; 39048bcb0991SDimitry Andric case LLVMAtomicRMWBinOpOr: return AtomicRMWInst::Or; 39058bcb0991SDimitry Andric case LLVMAtomicRMWBinOpXor: return AtomicRMWInst::Xor; 39068bcb0991SDimitry Andric case LLVMAtomicRMWBinOpMax: return AtomicRMWInst::Max; 39078bcb0991SDimitry Andric case LLVMAtomicRMWBinOpMin: return AtomicRMWInst::Min; 39088bcb0991SDimitry Andric case LLVMAtomicRMWBinOpUMax: return AtomicRMWInst::UMax; 39098bcb0991SDimitry Andric case LLVMAtomicRMWBinOpUMin: return AtomicRMWInst::UMin; 39108bcb0991SDimitry Andric case LLVMAtomicRMWBinOpFAdd: return AtomicRMWInst::FAdd; 39118bcb0991SDimitry Andric case LLVMAtomicRMWBinOpFSub: return AtomicRMWInst::FSub; 3912753f127fSDimitry Andric case LLVMAtomicRMWBinOpFMax: return AtomicRMWInst::FMax; 3913753f127fSDimitry Andric case LLVMAtomicRMWBinOpFMin: return AtomicRMWInst::FMin; 3914*0fca6ea1SDimitry Andric case LLVMAtomicRMWBinOpUIncWrap: 3915*0fca6ea1SDimitry Andric return AtomicRMWInst::UIncWrap; 3916*0fca6ea1SDimitry Andric case LLVMAtomicRMWBinOpUDecWrap: 3917*0fca6ea1SDimitry Andric return AtomicRMWInst::UDecWrap; 39188bcb0991SDimitry Andric } 39198bcb0991SDimitry Andric 39208bcb0991SDimitry Andric llvm_unreachable("Invalid LLVMAtomicRMWBinOp value!"); 39218bcb0991SDimitry Andric } 39228bcb0991SDimitry Andric 39238bcb0991SDimitry Andric static LLVMAtomicRMWBinOp mapToLLVMRMWBinOp(AtomicRMWInst::BinOp BinOp) { 39248bcb0991SDimitry Andric switch (BinOp) { 39258bcb0991SDimitry Andric case AtomicRMWInst::Xchg: return LLVMAtomicRMWBinOpXchg; 39268bcb0991SDimitry Andric case AtomicRMWInst::Add: return LLVMAtomicRMWBinOpAdd; 39278bcb0991SDimitry Andric case AtomicRMWInst::Sub: return LLVMAtomicRMWBinOpSub; 39288bcb0991SDimitry Andric case AtomicRMWInst::And: return LLVMAtomicRMWBinOpAnd; 39298bcb0991SDimitry Andric case AtomicRMWInst::Nand: return LLVMAtomicRMWBinOpNand; 39308bcb0991SDimitry Andric case AtomicRMWInst::Or: return LLVMAtomicRMWBinOpOr; 39318bcb0991SDimitry Andric case AtomicRMWInst::Xor: return LLVMAtomicRMWBinOpXor; 39328bcb0991SDimitry Andric case AtomicRMWInst::Max: return LLVMAtomicRMWBinOpMax; 39338bcb0991SDimitry Andric case AtomicRMWInst::Min: return LLVMAtomicRMWBinOpMin; 39348bcb0991SDimitry Andric case AtomicRMWInst::UMax: return LLVMAtomicRMWBinOpUMax; 39358bcb0991SDimitry Andric case AtomicRMWInst::UMin: return LLVMAtomicRMWBinOpUMin; 39368bcb0991SDimitry Andric case AtomicRMWInst::FAdd: return LLVMAtomicRMWBinOpFAdd; 39378bcb0991SDimitry Andric case AtomicRMWInst::FSub: return LLVMAtomicRMWBinOpFSub; 3938753f127fSDimitry Andric case AtomicRMWInst::FMax: return LLVMAtomicRMWBinOpFMax; 3939753f127fSDimitry Andric case AtomicRMWInst::FMin: return LLVMAtomicRMWBinOpFMin; 3940*0fca6ea1SDimitry Andric case AtomicRMWInst::UIncWrap: 3941*0fca6ea1SDimitry Andric return LLVMAtomicRMWBinOpUIncWrap; 3942*0fca6ea1SDimitry Andric case AtomicRMWInst::UDecWrap: 3943*0fca6ea1SDimitry Andric return LLVMAtomicRMWBinOpUDecWrap; 39448bcb0991SDimitry Andric default: break; 39458bcb0991SDimitry Andric } 39468bcb0991SDimitry Andric 39478bcb0991SDimitry Andric llvm_unreachable("Invalid AtomicRMWBinOp value!"); 39488bcb0991SDimitry Andric } 39498bcb0991SDimitry Andric 39500b57cec5SDimitry Andric // TODO: Should this and other atomic instructions support building with 39510b57cec5SDimitry Andric // "syncscope"? 39520b57cec5SDimitry Andric LLVMValueRef LLVMBuildFence(LLVMBuilderRef B, LLVMAtomicOrdering Ordering, 39530b57cec5SDimitry Andric LLVMBool isSingleThread, const char *Name) { 39540b57cec5SDimitry Andric return wrap( 39550b57cec5SDimitry Andric unwrap(B)->CreateFence(mapFromLLVMOrdering(Ordering), 39560b57cec5SDimitry Andric isSingleThread ? SyncScope::SingleThread 39570b57cec5SDimitry Andric : SyncScope::System, 39580b57cec5SDimitry Andric Name)); 39590b57cec5SDimitry Andric } 39600b57cec5SDimitry Andric 39610b57cec5SDimitry Andric LLVMValueRef LLVMBuildGEP2(LLVMBuilderRef B, LLVMTypeRef Ty, 39620b57cec5SDimitry Andric LLVMValueRef Pointer, LLVMValueRef *Indices, 39630b57cec5SDimitry Andric unsigned NumIndices, const char *Name) { 39640b57cec5SDimitry Andric ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices); 39650b57cec5SDimitry Andric return wrap(unwrap(B)->CreateGEP(unwrap(Ty), unwrap(Pointer), IdxList, Name)); 39660b57cec5SDimitry Andric } 39670b57cec5SDimitry Andric 39680b57cec5SDimitry Andric LLVMValueRef LLVMBuildInBoundsGEP2(LLVMBuilderRef B, LLVMTypeRef Ty, 39690b57cec5SDimitry Andric LLVMValueRef Pointer, LLVMValueRef *Indices, 39700b57cec5SDimitry Andric unsigned NumIndices, const char *Name) { 39710b57cec5SDimitry Andric ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices); 39720b57cec5SDimitry Andric return wrap( 39730b57cec5SDimitry Andric unwrap(B)->CreateInBoundsGEP(unwrap(Ty), unwrap(Pointer), IdxList, Name)); 39740b57cec5SDimitry Andric } 39750b57cec5SDimitry Andric 3976*0fca6ea1SDimitry Andric LLVMValueRef LLVMBuildGEPWithNoWrapFlags(LLVMBuilderRef B, LLVMTypeRef Ty, 3977*0fca6ea1SDimitry Andric LLVMValueRef Pointer, 3978*0fca6ea1SDimitry Andric LLVMValueRef *Indices, 3979*0fca6ea1SDimitry Andric unsigned NumIndices, const char *Name, 3980*0fca6ea1SDimitry Andric LLVMGEPNoWrapFlags NoWrapFlags) { 3981*0fca6ea1SDimitry Andric ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices); 3982*0fca6ea1SDimitry Andric return wrap(unwrap(B)->CreateGEP(unwrap(Ty), unwrap(Pointer), IdxList, Name, 3983*0fca6ea1SDimitry Andric mapFromLLVMGEPNoWrapFlags(NoWrapFlags))); 3984*0fca6ea1SDimitry Andric } 3985*0fca6ea1SDimitry Andric 39860b57cec5SDimitry Andric LLVMValueRef LLVMBuildStructGEP2(LLVMBuilderRef B, LLVMTypeRef Ty, 39870b57cec5SDimitry Andric LLVMValueRef Pointer, unsigned Idx, 39880b57cec5SDimitry Andric const char *Name) { 39890b57cec5SDimitry Andric return wrap( 39900b57cec5SDimitry Andric unwrap(B)->CreateStructGEP(unwrap(Ty), unwrap(Pointer), Idx, Name)); 39910b57cec5SDimitry Andric } 39920b57cec5SDimitry Andric 39930b57cec5SDimitry Andric LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str, 39940b57cec5SDimitry Andric const char *Name) { 39950b57cec5SDimitry Andric return wrap(unwrap(B)->CreateGlobalString(Str, Name)); 39960b57cec5SDimitry Andric } 39970b57cec5SDimitry Andric 39980b57cec5SDimitry Andric LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str, 39990b57cec5SDimitry Andric const char *Name) { 40000b57cec5SDimitry Andric return wrap(unwrap(B)->CreateGlobalStringPtr(Str, Name)); 40010b57cec5SDimitry Andric } 40020b57cec5SDimitry Andric 40030b57cec5SDimitry Andric LLVMBool LLVMGetVolatile(LLVMValueRef MemAccessInst) { 4004bdd1243dSDimitry Andric Value *P = unwrap(MemAccessInst); 40050b57cec5SDimitry Andric if (LoadInst *LI = dyn_cast<LoadInst>(P)) 40060b57cec5SDimitry Andric return LI->isVolatile(); 40078bcb0991SDimitry Andric if (StoreInst *SI = dyn_cast<StoreInst>(P)) 40088bcb0991SDimitry Andric return SI->isVolatile(); 40098bcb0991SDimitry Andric if (AtomicRMWInst *AI = dyn_cast<AtomicRMWInst>(P)) 40108bcb0991SDimitry Andric return AI->isVolatile(); 40118bcb0991SDimitry Andric return cast<AtomicCmpXchgInst>(P)->isVolatile(); 40120b57cec5SDimitry Andric } 40130b57cec5SDimitry Andric 40140b57cec5SDimitry Andric void LLVMSetVolatile(LLVMValueRef MemAccessInst, LLVMBool isVolatile) { 4015bdd1243dSDimitry Andric Value *P = unwrap(MemAccessInst); 40160b57cec5SDimitry Andric if (LoadInst *LI = dyn_cast<LoadInst>(P)) 40170b57cec5SDimitry Andric return LI->setVolatile(isVolatile); 40188bcb0991SDimitry Andric if (StoreInst *SI = dyn_cast<StoreInst>(P)) 40198bcb0991SDimitry Andric return SI->setVolatile(isVolatile); 40208bcb0991SDimitry Andric if (AtomicRMWInst *AI = dyn_cast<AtomicRMWInst>(P)) 40218bcb0991SDimitry Andric return AI->setVolatile(isVolatile); 40228bcb0991SDimitry Andric return cast<AtomicCmpXchgInst>(P)->setVolatile(isVolatile); 40238bcb0991SDimitry Andric } 40248bcb0991SDimitry Andric 40258bcb0991SDimitry Andric LLVMBool LLVMGetWeak(LLVMValueRef CmpXchgInst) { 40268bcb0991SDimitry Andric return unwrap<AtomicCmpXchgInst>(CmpXchgInst)->isWeak(); 40278bcb0991SDimitry Andric } 40288bcb0991SDimitry Andric 40298bcb0991SDimitry Andric void LLVMSetWeak(LLVMValueRef CmpXchgInst, LLVMBool isWeak) { 40308bcb0991SDimitry Andric return unwrap<AtomicCmpXchgInst>(CmpXchgInst)->setWeak(isWeak); 40310b57cec5SDimitry Andric } 40320b57cec5SDimitry Andric 40330b57cec5SDimitry Andric LLVMAtomicOrdering LLVMGetOrdering(LLVMValueRef MemAccessInst) { 4034bdd1243dSDimitry Andric Value *P = unwrap(MemAccessInst); 40350b57cec5SDimitry Andric AtomicOrdering O; 40360b57cec5SDimitry Andric if (LoadInst *LI = dyn_cast<LoadInst>(P)) 40370b57cec5SDimitry Andric O = LI->getOrdering(); 40388bcb0991SDimitry Andric else if (StoreInst *SI = dyn_cast<StoreInst>(P)) 40398bcb0991SDimitry Andric O = SI->getOrdering(); 40405f757f3fSDimitry Andric else if (FenceInst *FI = dyn_cast<FenceInst>(P)) 40415f757f3fSDimitry Andric O = FI->getOrdering(); 40420b57cec5SDimitry Andric else 40438bcb0991SDimitry Andric O = cast<AtomicRMWInst>(P)->getOrdering(); 40440b57cec5SDimitry Andric return mapToLLVMOrdering(O); 40450b57cec5SDimitry Andric } 40460b57cec5SDimitry Andric 40470b57cec5SDimitry Andric void LLVMSetOrdering(LLVMValueRef MemAccessInst, LLVMAtomicOrdering Ordering) { 4048bdd1243dSDimitry Andric Value *P = unwrap(MemAccessInst); 40490b57cec5SDimitry Andric AtomicOrdering O = mapFromLLVMOrdering(Ordering); 40500b57cec5SDimitry Andric 40510b57cec5SDimitry Andric if (LoadInst *LI = dyn_cast<LoadInst>(P)) 40520b57cec5SDimitry Andric return LI->setOrdering(O); 40535f757f3fSDimitry Andric else if (FenceInst *FI = dyn_cast<FenceInst>(P)) 40545f757f3fSDimitry Andric return FI->setOrdering(O); 40555f757f3fSDimitry Andric else if (AtomicRMWInst *ARWI = dyn_cast<AtomicRMWInst>(P)) 40565f757f3fSDimitry Andric return ARWI->setOrdering(O); 40570b57cec5SDimitry Andric return cast<StoreInst>(P)->setOrdering(O); 40580b57cec5SDimitry Andric } 40590b57cec5SDimitry Andric 40608bcb0991SDimitry Andric LLVMAtomicRMWBinOp LLVMGetAtomicRMWBinOp(LLVMValueRef Inst) { 40618bcb0991SDimitry Andric return mapToLLVMRMWBinOp(unwrap<AtomicRMWInst>(Inst)->getOperation()); 40628bcb0991SDimitry Andric } 40638bcb0991SDimitry Andric 40648bcb0991SDimitry Andric void LLVMSetAtomicRMWBinOp(LLVMValueRef Inst, LLVMAtomicRMWBinOp BinOp) { 40658bcb0991SDimitry Andric unwrap<AtomicRMWInst>(Inst)->setOperation(mapFromLLVMRMWBinOp(BinOp)); 40668bcb0991SDimitry Andric } 40678bcb0991SDimitry Andric 40680b57cec5SDimitry Andric /*--.. Casts ...............................................................--*/ 40690b57cec5SDimitry Andric 40700b57cec5SDimitry Andric LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef B, LLVMValueRef Val, 40710b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 40720b57cec5SDimitry Andric return wrap(unwrap(B)->CreateTrunc(unwrap(Val), unwrap(DestTy), Name)); 40730b57cec5SDimitry Andric } 40740b57cec5SDimitry Andric 40750b57cec5SDimitry Andric LLVMValueRef LLVMBuildZExt(LLVMBuilderRef B, LLVMValueRef Val, 40760b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 40770b57cec5SDimitry Andric return wrap(unwrap(B)->CreateZExt(unwrap(Val), unwrap(DestTy), Name)); 40780b57cec5SDimitry Andric } 40790b57cec5SDimitry Andric 40800b57cec5SDimitry Andric LLVMValueRef LLVMBuildSExt(LLVMBuilderRef B, LLVMValueRef Val, 40810b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 40820b57cec5SDimitry Andric return wrap(unwrap(B)->CreateSExt(unwrap(Val), unwrap(DestTy), Name)); 40830b57cec5SDimitry Andric } 40840b57cec5SDimitry Andric 40850b57cec5SDimitry Andric LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef B, LLVMValueRef Val, 40860b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 40870b57cec5SDimitry Andric return wrap(unwrap(B)->CreateFPToUI(unwrap(Val), unwrap(DestTy), Name)); 40880b57cec5SDimitry Andric } 40890b57cec5SDimitry Andric 40900b57cec5SDimitry Andric LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef B, LLVMValueRef Val, 40910b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 40920b57cec5SDimitry Andric return wrap(unwrap(B)->CreateFPToSI(unwrap(Val), unwrap(DestTy), Name)); 40930b57cec5SDimitry Andric } 40940b57cec5SDimitry Andric 40950b57cec5SDimitry Andric LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef B, LLVMValueRef Val, 40960b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 40970b57cec5SDimitry Andric return wrap(unwrap(B)->CreateUIToFP(unwrap(Val), unwrap(DestTy), Name)); 40980b57cec5SDimitry Andric } 40990b57cec5SDimitry Andric 41000b57cec5SDimitry Andric LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef B, LLVMValueRef Val, 41010b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41020b57cec5SDimitry Andric return wrap(unwrap(B)->CreateSIToFP(unwrap(Val), unwrap(DestTy), Name)); 41030b57cec5SDimitry Andric } 41040b57cec5SDimitry Andric 41050b57cec5SDimitry Andric LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef B, LLVMValueRef Val, 41060b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41070b57cec5SDimitry Andric return wrap(unwrap(B)->CreateFPTrunc(unwrap(Val), unwrap(DestTy), Name)); 41080b57cec5SDimitry Andric } 41090b57cec5SDimitry Andric 41100b57cec5SDimitry Andric LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef B, LLVMValueRef Val, 41110b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41120b57cec5SDimitry Andric return wrap(unwrap(B)->CreateFPExt(unwrap(Val), unwrap(DestTy), Name)); 41130b57cec5SDimitry Andric } 41140b57cec5SDimitry Andric 41150b57cec5SDimitry Andric LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef B, LLVMValueRef Val, 41160b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41170b57cec5SDimitry Andric return wrap(unwrap(B)->CreatePtrToInt(unwrap(Val), unwrap(DestTy), Name)); 41180b57cec5SDimitry Andric } 41190b57cec5SDimitry Andric 41200b57cec5SDimitry Andric LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef B, LLVMValueRef Val, 41210b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41220b57cec5SDimitry Andric return wrap(unwrap(B)->CreateIntToPtr(unwrap(Val), unwrap(DestTy), Name)); 41230b57cec5SDimitry Andric } 41240b57cec5SDimitry Andric 41250b57cec5SDimitry Andric LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef B, LLVMValueRef Val, 41260b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41270b57cec5SDimitry Andric return wrap(unwrap(B)->CreateBitCast(unwrap(Val), unwrap(DestTy), Name)); 41280b57cec5SDimitry Andric } 41290b57cec5SDimitry Andric 41300b57cec5SDimitry Andric LLVMValueRef LLVMBuildAddrSpaceCast(LLVMBuilderRef B, LLVMValueRef Val, 41310b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41320b57cec5SDimitry Andric return wrap(unwrap(B)->CreateAddrSpaceCast(unwrap(Val), unwrap(DestTy), Name)); 41330b57cec5SDimitry Andric } 41340b57cec5SDimitry Andric 41350b57cec5SDimitry Andric LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val, 41360b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41370b57cec5SDimitry Andric return wrap(unwrap(B)->CreateZExtOrBitCast(unwrap(Val), unwrap(DestTy), 41380b57cec5SDimitry Andric Name)); 41390b57cec5SDimitry Andric } 41400b57cec5SDimitry Andric 41410b57cec5SDimitry Andric LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val, 41420b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41430b57cec5SDimitry Andric return wrap(unwrap(B)->CreateSExtOrBitCast(unwrap(Val), unwrap(DestTy), 41440b57cec5SDimitry Andric Name)); 41450b57cec5SDimitry Andric } 41460b57cec5SDimitry Andric 41470b57cec5SDimitry Andric LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef B, LLVMValueRef Val, 41480b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41490b57cec5SDimitry Andric return wrap(unwrap(B)->CreateTruncOrBitCast(unwrap(Val), unwrap(DestTy), 41500b57cec5SDimitry Andric Name)); 41510b57cec5SDimitry Andric } 41520b57cec5SDimitry Andric 41530b57cec5SDimitry Andric LLVMValueRef LLVMBuildCast(LLVMBuilderRef B, LLVMOpcode Op, LLVMValueRef Val, 41540b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41550b57cec5SDimitry Andric return wrap(unwrap(B)->CreateCast(Instruction::CastOps(map_from_llvmopcode(Op)), unwrap(Val), 41560b57cec5SDimitry Andric unwrap(DestTy), Name)); 41570b57cec5SDimitry Andric } 41580b57cec5SDimitry Andric 41590b57cec5SDimitry Andric LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef B, LLVMValueRef Val, 41600b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41610b57cec5SDimitry Andric return wrap(unwrap(B)->CreatePointerCast(unwrap(Val), unwrap(DestTy), Name)); 41620b57cec5SDimitry Andric } 41630b57cec5SDimitry Andric 41640b57cec5SDimitry Andric LLVMValueRef LLVMBuildIntCast2(LLVMBuilderRef B, LLVMValueRef Val, 41650b57cec5SDimitry Andric LLVMTypeRef DestTy, LLVMBool IsSigned, 41660b57cec5SDimitry Andric const char *Name) { 41670b57cec5SDimitry Andric return wrap( 41680b57cec5SDimitry Andric unwrap(B)->CreateIntCast(unwrap(Val), unwrap(DestTy), IsSigned, Name)); 41690b57cec5SDimitry Andric } 41700b57cec5SDimitry Andric 41710b57cec5SDimitry Andric LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef B, LLVMValueRef Val, 41720b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41730b57cec5SDimitry Andric return wrap(unwrap(B)->CreateIntCast(unwrap(Val), unwrap(DestTy), 41740b57cec5SDimitry Andric /*isSigned*/true, Name)); 41750b57cec5SDimitry Andric } 41760b57cec5SDimitry Andric 41770b57cec5SDimitry Andric LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef B, LLVMValueRef Val, 41780b57cec5SDimitry Andric LLVMTypeRef DestTy, const char *Name) { 41790b57cec5SDimitry Andric return wrap(unwrap(B)->CreateFPCast(unwrap(Val), unwrap(DestTy), Name)); 41800b57cec5SDimitry Andric } 41810b57cec5SDimitry Andric 418281ad6265SDimitry Andric LLVMOpcode LLVMGetCastOpcode(LLVMValueRef Src, LLVMBool SrcIsSigned, 418381ad6265SDimitry Andric LLVMTypeRef DestTy, LLVMBool DestIsSigned) { 418481ad6265SDimitry Andric return map_to_llvmopcode(CastInst::getCastOpcode( 418581ad6265SDimitry Andric unwrap(Src), SrcIsSigned, unwrap(DestTy), DestIsSigned)); 418681ad6265SDimitry Andric } 418781ad6265SDimitry Andric 41880b57cec5SDimitry Andric /*--.. Comparisons .........................................................--*/ 41890b57cec5SDimitry Andric 41900b57cec5SDimitry Andric LLVMValueRef LLVMBuildICmp(LLVMBuilderRef B, LLVMIntPredicate Op, 41910b57cec5SDimitry Andric LLVMValueRef LHS, LLVMValueRef RHS, 41920b57cec5SDimitry Andric const char *Name) { 41930b57cec5SDimitry Andric return wrap(unwrap(B)->CreateICmp(static_cast<ICmpInst::Predicate>(Op), 41940b57cec5SDimitry Andric unwrap(LHS), unwrap(RHS), Name)); 41950b57cec5SDimitry Andric } 41960b57cec5SDimitry Andric 41970b57cec5SDimitry Andric LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef B, LLVMRealPredicate Op, 41980b57cec5SDimitry Andric LLVMValueRef LHS, LLVMValueRef RHS, 41990b57cec5SDimitry Andric const char *Name) { 42000b57cec5SDimitry Andric return wrap(unwrap(B)->CreateFCmp(static_cast<FCmpInst::Predicate>(Op), 42010b57cec5SDimitry Andric unwrap(LHS), unwrap(RHS), Name)); 42020b57cec5SDimitry Andric } 42030b57cec5SDimitry Andric 42040b57cec5SDimitry Andric /*--.. Miscellaneous instructions ..........................................--*/ 42050b57cec5SDimitry Andric 42060b57cec5SDimitry Andric LLVMValueRef LLVMBuildPhi(LLVMBuilderRef B, LLVMTypeRef Ty, const char *Name) { 42070b57cec5SDimitry Andric return wrap(unwrap(B)->CreatePHI(unwrap(Ty), 0, Name)); 42080b57cec5SDimitry Andric } 42090b57cec5SDimitry Andric 42100b57cec5SDimitry Andric LLVMValueRef LLVMBuildCall2(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Fn, 42110b57cec5SDimitry Andric LLVMValueRef *Args, unsigned NumArgs, 42120b57cec5SDimitry Andric const char *Name) { 42130b57cec5SDimitry Andric FunctionType *FTy = unwrap<FunctionType>(Ty); 42140b57cec5SDimitry Andric return wrap(unwrap(B)->CreateCall(FTy, unwrap(Fn), 4215bdd1243dSDimitry Andric ArrayRef(unwrap(Args), NumArgs), Name)); 42160b57cec5SDimitry Andric } 42170b57cec5SDimitry Andric 42185f757f3fSDimitry Andric LLVMValueRef 42195f757f3fSDimitry Andric LLVMBuildCallWithOperandBundles(LLVMBuilderRef B, LLVMTypeRef Ty, 42205f757f3fSDimitry Andric LLVMValueRef Fn, LLVMValueRef *Args, 42215f757f3fSDimitry Andric unsigned NumArgs, LLVMOperandBundleRef *Bundles, 42225f757f3fSDimitry Andric unsigned NumBundles, const char *Name) { 42235f757f3fSDimitry Andric FunctionType *FTy = unwrap<FunctionType>(Ty); 42245f757f3fSDimitry Andric SmallVector<OperandBundleDef, 8> OBs; 42255f757f3fSDimitry Andric for (auto *Bundle : ArrayRef(Bundles, NumBundles)) { 42265f757f3fSDimitry Andric OperandBundleDef *OB = unwrap(Bundle); 42275f757f3fSDimitry Andric OBs.push_back(*OB); 42285f757f3fSDimitry Andric } 42295f757f3fSDimitry Andric return wrap(unwrap(B)->CreateCall( 42305f757f3fSDimitry Andric FTy, unwrap(Fn), ArrayRef(unwrap(Args), NumArgs), OBs, Name)); 42315f757f3fSDimitry Andric } 42325f757f3fSDimitry Andric 42330b57cec5SDimitry Andric LLVMValueRef LLVMBuildSelect(LLVMBuilderRef B, LLVMValueRef If, 42340b57cec5SDimitry Andric LLVMValueRef Then, LLVMValueRef Else, 42350b57cec5SDimitry Andric const char *Name) { 42360b57cec5SDimitry Andric return wrap(unwrap(B)->CreateSelect(unwrap(If), unwrap(Then), unwrap(Else), 42370b57cec5SDimitry Andric Name)); 42380b57cec5SDimitry Andric } 42390b57cec5SDimitry Andric 42400b57cec5SDimitry Andric LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef B, LLVMValueRef List, 42410b57cec5SDimitry Andric LLVMTypeRef Ty, const char *Name) { 42420b57cec5SDimitry Andric return wrap(unwrap(B)->CreateVAArg(unwrap(List), unwrap(Ty), Name)); 42430b57cec5SDimitry Andric } 42440b57cec5SDimitry Andric 42450b57cec5SDimitry Andric LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef B, LLVMValueRef VecVal, 42460b57cec5SDimitry Andric LLVMValueRef Index, const char *Name) { 42470b57cec5SDimitry Andric return wrap(unwrap(B)->CreateExtractElement(unwrap(VecVal), unwrap(Index), 42480b57cec5SDimitry Andric Name)); 42490b57cec5SDimitry Andric } 42500b57cec5SDimitry Andric 42510b57cec5SDimitry Andric LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef B, LLVMValueRef VecVal, 42520b57cec5SDimitry Andric LLVMValueRef EltVal, LLVMValueRef Index, 42530b57cec5SDimitry Andric const char *Name) { 42540b57cec5SDimitry Andric return wrap(unwrap(B)->CreateInsertElement(unwrap(VecVal), unwrap(EltVal), 42550b57cec5SDimitry Andric unwrap(Index), Name)); 42560b57cec5SDimitry Andric } 42570b57cec5SDimitry Andric 42580b57cec5SDimitry Andric LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef B, LLVMValueRef V1, 42590b57cec5SDimitry Andric LLVMValueRef V2, LLVMValueRef Mask, 42600b57cec5SDimitry Andric const char *Name) { 42610b57cec5SDimitry Andric return wrap(unwrap(B)->CreateShuffleVector(unwrap(V1), unwrap(V2), 42620b57cec5SDimitry Andric unwrap(Mask), Name)); 42630b57cec5SDimitry Andric } 42640b57cec5SDimitry Andric 42650b57cec5SDimitry Andric LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef B, LLVMValueRef AggVal, 42660b57cec5SDimitry Andric unsigned Index, const char *Name) { 42670b57cec5SDimitry Andric return wrap(unwrap(B)->CreateExtractValue(unwrap(AggVal), Index, Name)); 42680b57cec5SDimitry Andric } 42690b57cec5SDimitry Andric 42700b57cec5SDimitry Andric LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef B, LLVMValueRef AggVal, 42710b57cec5SDimitry Andric LLVMValueRef EltVal, unsigned Index, 42720b57cec5SDimitry Andric const char *Name) { 42730b57cec5SDimitry Andric return wrap(unwrap(B)->CreateInsertValue(unwrap(AggVal), unwrap(EltVal), 42740b57cec5SDimitry Andric Index, Name)); 42750b57cec5SDimitry Andric } 42760b57cec5SDimitry Andric 4277480093f4SDimitry Andric LLVMValueRef LLVMBuildFreeze(LLVMBuilderRef B, LLVMValueRef Val, 4278480093f4SDimitry Andric const char *Name) { 4279480093f4SDimitry Andric return wrap(unwrap(B)->CreateFreeze(unwrap(Val), Name)); 4280480093f4SDimitry Andric } 4281480093f4SDimitry Andric 42820b57cec5SDimitry Andric LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef B, LLVMValueRef Val, 42830b57cec5SDimitry Andric const char *Name) { 42840b57cec5SDimitry Andric return wrap(unwrap(B)->CreateIsNull(unwrap(Val), Name)); 42850b57cec5SDimitry Andric } 42860b57cec5SDimitry Andric 42870b57cec5SDimitry Andric LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef B, LLVMValueRef Val, 42880b57cec5SDimitry Andric const char *Name) { 42890b57cec5SDimitry Andric return wrap(unwrap(B)->CreateIsNotNull(unwrap(Val), Name)); 42900b57cec5SDimitry Andric } 42910b57cec5SDimitry Andric 429204eeddc0SDimitry Andric LLVMValueRef LLVMBuildPtrDiff2(LLVMBuilderRef B, LLVMTypeRef ElemTy, 429304eeddc0SDimitry Andric LLVMValueRef LHS, LLVMValueRef RHS, 429404eeddc0SDimitry Andric const char *Name) { 429504eeddc0SDimitry Andric return wrap(unwrap(B)->CreatePtrDiff(unwrap(ElemTy), unwrap(LHS), 429604eeddc0SDimitry Andric unwrap(RHS), Name)); 42970b57cec5SDimitry Andric } 42980b57cec5SDimitry Andric 42990b57cec5SDimitry Andric LLVMValueRef LLVMBuildAtomicRMW(LLVMBuilderRef B,LLVMAtomicRMWBinOp op, 43000b57cec5SDimitry Andric LLVMValueRef PTR, LLVMValueRef Val, 43010b57cec5SDimitry Andric LLVMAtomicOrdering ordering, 43020b57cec5SDimitry Andric LLVMBool singleThread) { 43038bcb0991SDimitry Andric AtomicRMWInst::BinOp intop = mapFromLLVMRMWBinOp(op); 4304fe6060f1SDimitry Andric return wrap(unwrap(B)->CreateAtomicRMW( 4305fe6060f1SDimitry Andric intop, unwrap(PTR), unwrap(Val), MaybeAlign(), 4306fe6060f1SDimitry Andric mapFromLLVMOrdering(ordering), 4307fe6060f1SDimitry Andric singleThread ? SyncScope::SingleThread : SyncScope::System)); 43080b57cec5SDimitry Andric } 43090b57cec5SDimitry Andric 43100b57cec5SDimitry Andric LLVMValueRef LLVMBuildAtomicCmpXchg(LLVMBuilderRef B, LLVMValueRef Ptr, 43110b57cec5SDimitry Andric LLVMValueRef Cmp, LLVMValueRef New, 43120b57cec5SDimitry Andric LLVMAtomicOrdering SuccessOrdering, 43130b57cec5SDimitry Andric LLVMAtomicOrdering FailureOrdering, 43140b57cec5SDimitry Andric LLVMBool singleThread) { 43150b57cec5SDimitry Andric 4316fe6060f1SDimitry Andric return wrap(unwrap(B)->CreateAtomicCmpXchg( 4317fe6060f1SDimitry Andric unwrap(Ptr), unwrap(Cmp), unwrap(New), MaybeAlign(), 4318fe6060f1SDimitry Andric mapFromLLVMOrdering(SuccessOrdering), 43190b57cec5SDimitry Andric mapFromLLVMOrdering(FailureOrdering), 43200b57cec5SDimitry Andric singleThread ? SyncScope::SingleThread : SyncScope::System)); 43210b57cec5SDimitry Andric } 43220b57cec5SDimitry Andric 43238833aad7SDimitry Andric unsigned LLVMGetNumMaskElements(LLVMValueRef SVInst) { 4324bdd1243dSDimitry Andric Value *P = unwrap(SVInst); 43258833aad7SDimitry Andric ShuffleVectorInst *I = cast<ShuffleVectorInst>(P); 43268833aad7SDimitry Andric return I->getShuffleMask().size(); 43278833aad7SDimitry Andric } 43288833aad7SDimitry Andric 43298833aad7SDimitry Andric int LLVMGetMaskValue(LLVMValueRef SVInst, unsigned Elt) { 4330bdd1243dSDimitry Andric Value *P = unwrap(SVInst); 43318833aad7SDimitry Andric ShuffleVectorInst *I = cast<ShuffleVectorInst>(P); 43328833aad7SDimitry Andric return I->getMaskValue(Elt); 43338833aad7SDimitry Andric } 43348833aad7SDimitry Andric 433506c3fb27SDimitry Andric int LLVMGetUndefMaskElem(void) { return PoisonMaskElem; } 43360b57cec5SDimitry Andric 43370b57cec5SDimitry Andric LLVMBool LLVMIsAtomicSingleThread(LLVMValueRef AtomicInst) { 4338bdd1243dSDimitry Andric Value *P = unwrap(AtomicInst); 43390b57cec5SDimitry Andric 43400b57cec5SDimitry Andric if (AtomicRMWInst *I = dyn_cast<AtomicRMWInst>(P)) 43410b57cec5SDimitry Andric return I->getSyncScopeID() == SyncScope::SingleThread; 43425f757f3fSDimitry Andric else if (FenceInst *FI = dyn_cast<FenceInst>(P)) 43435f757f3fSDimitry Andric return FI->getSyncScopeID() == SyncScope::SingleThread; 43445f757f3fSDimitry Andric else if (StoreInst *SI = dyn_cast<StoreInst>(P)) 43455f757f3fSDimitry Andric return SI->getSyncScopeID() == SyncScope::SingleThread; 43465f757f3fSDimitry Andric else if (LoadInst *LI = dyn_cast<LoadInst>(P)) 43475f757f3fSDimitry Andric return LI->getSyncScopeID() == SyncScope::SingleThread; 43480b57cec5SDimitry Andric return cast<AtomicCmpXchgInst>(P)->getSyncScopeID() == 43490b57cec5SDimitry Andric SyncScope::SingleThread; 43500b57cec5SDimitry Andric } 43510b57cec5SDimitry Andric 43520b57cec5SDimitry Andric void LLVMSetAtomicSingleThread(LLVMValueRef AtomicInst, LLVMBool NewValue) { 4353bdd1243dSDimitry Andric Value *P = unwrap(AtomicInst); 43540b57cec5SDimitry Andric SyncScope::ID SSID = NewValue ? SyncScope::SingleThread : SyncScope::System; 43550b57cec5SDimitry Andric 43560b57cec5SDimitry Andric if (AtomicRMWInst *I = dyn_cast<AtomicRMWInst>(P)) 43570b57cec5SDimitry Andric return I->setSyncScopeID(SSID); 43585f757f3fSDimitry Andric else if (FenceInst *FI = dyn_cast<FenceInst>(P)) 43595f757f3fSDimitry Andric return FI->setSyncScopeID(SSID); 43605f757f3fSDimitry Andric else if (StoreInst *SI = dyn_cast<StoreInst>(P)) 43615f757f3fSDimitry Andric return SI->setSyncScopeID(SSID); 43625f757f3fSDimitry Andric else if (LoadInst *LI = dyn_cast<LoadInst>(P)) 43635f757f3fSDimitry Andric return LI->setSyncScopeID(SSID); 43640b57cec5SDimitry Andric return cast<AtomicCmpXchgInst>(P)->setSyncScopeID(SSID); 43650b57cec5SDimitry Andric } 43660b57cec5SDimitry Andric 43670b57cec5SDimitry Andric LLVMAtomicOrdering LLVMGetCmpXchgSuccessOrdering(LLVMValueRef CmpXchgInst) { 4368bdd1243dSDimitry Andric Value *P = unwrap(CmpXchgInst); 43690b57cec5SDimitry Andric return mapToLLVMOrdering(cast<AtomicCmpXchgInst>(P)->getSuccessOrdering()); 43700b57cec5SDimitry Andric } 43710b57cec5SDimitry Andric 43720b57cec5SDimitry Andric void LLVMSetCmpXchgSuccessOrdering(LLVMValueRef CmpXchgInst, 43730b57cec5SDimitry Andric LLVMAtomicOrdering Ordering) { 4374bdd1243dSDimitry Andric Value *P = unwrap(CmpXchgInst); 43750b57cec5SDimitry Andric AtomicOrdering O = mapFromLLVMOrdering(Ordering); 43760b57cec5SDimitry Andric 43770b57cec5SDimitry Andric return cast<AtomicCmpXchgInst>(P)->setSuccessOrdering(O); 43780b57cec5SDimitry Andric } 43790b57cec5SDimitry Andric 43800b57cec5SDimitry Andric LLVMAtomicOrdering LLVMGetCmpXchgFailureOrdering(LLVMValueRef CmpXchgInst) { 4381bdd1243dSDimitry Andric Value *P = unwrap(CmpXchgInst); 43820b57cec5SDimitry Andric return mapToLLVMOrdering(cast<AtomicCmpXchgInst>(P)->getFailureOrdering()); 43830b57cec5SDimitry Andric } 43840b57cec5SDimitry Andric 43850b57cec5SDimitry Andric void LLVMSetCmpXchgFailureOrdering(LLVMValueRef CmpXchgInst, 43860b57cec5SDimitry Andric LLVMAtomicOrdering Ordering) { 4387bdd1243dSDimitry Andric Value *P = unwrap(CmpXchgInst); 43880b57cec5SDimitry Andric AtomicOrdering O = mapFromLLVMOrdering(Ordering); 43890b57cec5SDimitry Andric 43900b57cec5SDimitry Andric return cast<AtomicCmpXchgInst>(P)->setFailureOrdering(O); 43910b57cec5SDimitry Andric } 43920b57cec5SDimitry Andric 43930b57cec5SDimitry Andric /*===-- Module providers --------------------------------------------------===*/ 43940b57cec5SDimitry Andric 43950b57cec5SDimitry Andric LLVMModuleProviderRef 43960b57cec5SDimitry Andric LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M) { 43970b57cec5SDimitry Andric return reinterpret_cast<LLVMModuleProviderRef>(M); 43980b57cec5SDimitry Andric } 43990b57cec5SDimitry Andric 44000b57cec5SDimitry Andric void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP) { 44010b57cec5SDimitry Andric delete unwrap(MP); 44020b57cec5SDimitry Andric } 44030b57cec5SDimitry Andric 44040b57cec5SDimitry Andric 44050b57cec5SDimitry Andric /*===-- Memory buffers ----------------------------------------------------===*/ 44060b57cec5SDimitry Andric 44070b57cec5SDimitry Andric LLVMBool LLVMCreateMemoryBufferWithContentsOfFile( 44080b57cec5SDimitry Andric const char *Path, 44090b57cec5SDimitry Andric LLVMMemoryBufferRef *OutMemBuf, 44100b57cec5SDimitry Andric char **OutMessage) { 44110b57cec5SDimitry Andric 44120b57cec5SDimitry Andric ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr = MemoryBuffer::getFile(Path); 44130b57cec5SDimitry Andric if (std::error_code EC = MBOrErr.getError()) { 44140b57cec5SDimitry Andric *OutMessage = strdup(EC.message().c_str()); 44150b57cec5SDimitry Andric return 1; 44160b57cec5SDimitry Andric } 44170b57cec5SDimitry Andric *OutMemBuf = wrap(MBOrErr.get().release()); 44180b57cec5SDimitry Andric return 0; 44190b57cec5SDimitry Andric } 44200b57cec5SDimitry Andric 44210b57cec5SDimitry Andric LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf, 44220b57cec5SDimitry Andric char **OutMessage) { 44230b57cec5SDimitry Andric ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr = MemoryBuffer::getSTDIN(); 44240b57cec5SDimitry Andric if (std::error_code EC = MBOrErr.getError()) { 44250b57cec5SDimitry Andric *OutMessage = strdup(EC.message().c_str()); 44260b57cec5SDimitry Andric return 1; 44270b57cec5SDimitry Andric } 44280b57cec5SDimitry Andric *OutMemBuf = wrap(MBOrErr.get().release()); 44290b57cec5SDimitry Andric return 0; 44300b57cec5SDimitry Andric } 44310b57cec5SDimitry Andric 44320b57cec5SDimitry Andric LLVMMemoryBufferRef LLVMCreateMemoryBufferWithMemoryRange( 44330b57cec5SDimitry Andric const char *InputData, 44340b57cec5SDimitry Andric size_t InputDataLength, 44350b57cec5SDimitry Andric const char *BufferName, 44360b57cec5SDimitry Andric LLVMBool RequiresNullTerminator) { 44370b57cec5SDimitry Andric 44380b57cec5SDimitry Andric return wrap(MemoryBuffer::getMemBuffer(StringRef(InputData, InputDataLength), 44390b57cec5SDimitry Andric StringRef(BufferName), 44400b57cec5SDimitry Andric RequiresNullTerminator).release()); 44410b57cec5SDimitry Andric } 44420b57cec5SDimitry Andric 44430b57cec5SDimitry Andric LLVMMemoryBufferRef LLVMCreateMemoryBufferWithMemoryRangeCopy( 44440b57cec5SDimitry Andric const char *InputData, 44450b57cec5SDimitry Andric size_t InputDataLength, 44460b57cec5SDimitry Andric const char *BufferName) { 44470b57cec5SDimitry Andric 44480b57cec5SDimitry Andric return wrap( 44490b57cec5SDimitry Andric MemoryBuffer::getMemBufferCopy(StringRef(InputData, InputDataLength), 44500b57cec5SDimitry Andric StringRef(BufferName)).release()); 44510b57cec5SDimitry Andric } 44520b57cec5SDimitry Andric 44530b57cec5SDimitry Andric const char *LLVMGetBufferStart(LLVMMemoryBufferRef MemBuf) { 44540b57cec5SDimitry Andric return unwrap(MemBuf)->getBufferStart(); 44550b57cec5SDimitry Andric } 44560b57cec5SDimitry Andric 44570b57cec5SDimitry Andric size_t LLVMGetBufferSize(LLVMMemoryBufferRef MemBuf) { 44580b57cec5SDimitry Andric return unwrap(MemBuf)->getBufferSize(); 44590b57cec5SDimitry Andric } 44600b57cec5SDimitry Andric 44610b57cec5SDimitry Andric void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf) { 44620b57cec5SDimitry Andric delete unwrap(MemBuf); 44630b57cec5SDimitry Andric } 44640b57cec5SDimitry Andric 44650b57cec5SDimitry Andric /*===-- Pass Manager ------------------------------------------------------===*/ 44660b57cec5SDimitry Andric 44670b57cec5SDimitry Andric LLVMPassManagerRef LLVMCreatePassManager() { 44680b57cec5SDimitry Andric return wrap(new legacy::PassManager()); 44690b57cec5SDimitry Andric } 44700b57cec5SDimitry Andric 44710b57cec5SDimitry Andric LLVMPassManagerRef LLVMCreateFunctionPassManagerForModule(LLVMModuleRef M) { 44720b57cec5SDimitry Andric return wrap(new legacy::FunctionPassManager(unwrap(M))); 44730b57cec5SDimitry Andric } 44740b57cec5SDimitry Andric 44750b57cec5SDimitry Andric LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef P) { 44760b57cec5SDimitry Andric return LLVMCreateFunctionPassManagerForModule( 44770b57cec5SDimitry Andric reinterpret_cast<LLVMModuleRef>(P)); 44780b57cec5SDimitry Andric } 44790b57cec5SDimitry Andric 44800b57cec5SDimitry Andric LLVMBool LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M) { 44810b57cec5SDimitry Andric return unwrap<legacy::PassManager>(PM)->run(*unwrap(M)); 44820b57cec5SDimitry Andric } 44830b57cec5SDimitry Andric 44840b57cec5SDimitry Andric LLVMBool LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM) { 44850b57cec5SDimitry Andric return unwrap<legacy::FunctionPassManager>(FPM)->doInitialization(); 44860b57cec5SDimitry Andric } 44870b57cec5SDimitry Andric 44880b57cec5SDimitry Andric LLVMBool LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F) { 44890b57cec5SDimitry Andric return unwrap<legacy::FunctionPassManager>(FPM)->run(*unwrap<Function>(F)); 44900b57cec5SDimitry Andric } 44910b57cec5SDimitry Andric 44920b57cec5SDimitry Andric LLVMBool LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM) { 44930b57cec5SDimitry Andric return unwrap<legacy::FunctionPassManager>(FPM)->doFinalization(); 44940b57cec5SDimitry Andric } 44950b57cec5SDimitry Andric 44960b57cec5SDimitry Andric void LLVMDisposePassManager(LLVMPassManagerRef PM) { 44970b57cec5SDimitry Andric delete unwrap(PM); 44980b57cec5SDimitry Andric } 44990b57cec5SDimitry Andric 45000b57cec5SDimitry Andric /*===-- Threading ------------------------------------------------------===*/ 45010b57cec5SDimitry Andric 45020b57cec5SDimitry Andric LLVMBool LLVMStartMultithreaded() { 45030b57cec5SDimitry Andric return LLVMIsMultithreaded(); 45040b57cec5SDimitry Andric } 45050b57cec5SDimitry Andric 45060b57cec5SDimitry Andric void LLVMStopMultithreaded() { 45070b57cec5SDimitry Andric } 45080b57cec5SDimitry Andric 45090b57cec5SDimitry Andric LLVMBool LLVMIsMultithreaded() { 45100b57cec5SDimitry Andric return llvm_is_multithreaded(); 45110b57cec5SDimitry Andric } 4512