Home | History | Annotate | Line # | Download | only in IR
      1 //===-- Core.cpp ----------------------------------------------------------===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 //
      9 // This file implements the common infrastructure (including the C bindings)
     10 // for libLLVMCore.a, which implements the LLVM intermediate representation.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "llvm-c/Core.h"
     15 #include "llvm/IR/Attributes.h"
     16 #include "llvm/IR/Constants.h"
     17 #include "llvm/IR/DebugInfoMetadata.h"
     18 #include "llvm/IR/DerivedTypes.h"
     19 #include "llvm/IR/DiagnosticInfo.h"
     20 #include "llvm/IR/DiagnosticPrinter.h"
     21 #include "llvm/IR/GlobalAlias.h"
     22 #include "llvm/IR/GlobalVariable.h"
     23 #include "llvm/IR/IRBuilder.h"
     24 #include "llvm/IR/InlineAsm.h"
     25 #include "llvm/IR/IntrinsicInst.h"
     26 #include "llvm/IR/LLVMContext.h"
     27 #include "llvm/IR/LegacyPassManager.h"
     28 #include "llvm/IR/Module.h"
     29 #include "llvm/InitializePasses.h"
     30 #include "llvm/Support/Debug.h"
     31 #include "llvm/Support/ErrorHandling.h"
     32 #include "llvm/Support/FileSystem.h"
     33 #include "llvm/Support/ManagedStatic.h"
     34 #include "llvm/Support/MemoryBuffer.h"
     35 #include "llvm/Support/Threading.h"
     36 #include "llvm/Support/raw_ostream.h"
     37 #include <cassert>
     38 #include <cstdlib>
     39 #include <cstring>
     40 #include <system_error>
     41 
     42 using namespace llvm;
     43 
     44 #define DEBUG_TYPE "ir"
     45 
     46 void llvm::initializeCore(PassRegistry &Registry) {
     47   initializeDominatorTreeWrapperPassPass(Registry);
     48   initializePrintModulePassWrapperPass(Registry);
     49   initializePrintFunctionPassWrapperPass(Registry);
     50   initializeSafepointIRVerifierPass(Registry);
     51   initializeVerifierLegacyPassPass(Registry);
     52 }
     53 
     54 void LLVMInitializeCore(LLVMPassRegistryRef R) {
     55   initializeCore(*unwrap(R));
     56 }
     57 
     58 void LLVMShutdown() {
     59   llvm_shutdown();
     60 }
     61 
     62 /*===-- Error handling ----------------------------------------------------===*/
     63 
     64 char *LLVMCreateMessage(const char *Message) {
     65   return strdup(Message);
     66 }
     67 
     68 void LLVMDisposeMessage(char *Message) {
     69   free(Message);
     70 }
     71 
     72 
     73 /*===-- Operations on contexts --------------------------------------------===*/
     74 
     75 static ManagedStatic<LLVMContext> GlobalContext;
     76 
     77 LLVMContextRef LLVMContextCreate() {
     78   return wrap(new LLVMContext());
     79 }
     80 
     81 LLVMContextRef LLVMGetGlobalContext() { return wrap(&*GlobalContext); }
     82 
     83 void LLVMContextSetDiagnosticHandler(LLVMContextRef C,
     84                                      LLVMDiagnosticHandler Handler,
     85                                      void *DiagnosticContext) {
     86   unwrap(C)->setDiagnosticHandlerCallBack(
     87       LLVM_EXTENSION reinterpret_cast<DiagnosticHandler::DiagnosticHandlerTy>(
     88           Handler),
     89       DiagnosticContext);
     90 }
     91 
     92 LLVMDiagnosticHandler LLVMContextGetDiagnosticHandler(LLVMContextRef C) {
     93   return LLVM_EXTENSION reinterpret_cast<LLVMDiagnosticHandler>(
     94       unwrap(C)->getDiagnosticHandlerCallBack());
     95 }
     96 
     97 void *LLVMContextGetDiagnosticContext(LLVMContextRef C) {
     98   return unwrap(C)->getDiagnosticContext();
     99 }
    100 
    101 void LLVMContextSetYieldCallback(LLVMContextRef C, LLVMYieldCallback Callback,
    102                                  void *OpaqueHandle) {
    103   auto YieldCallback =
    104     LLVM_EXTENSION reinterpret_cast<LLVMContext::YieldCallbackTy>(Callback);
    105   unwrap(C)->setYieldCallback(YieldCallback, OpaqueHandle);
    106 }
    107 
    108 LLVMBool LLVMContextShouldDiscardValueNames(LLVMContextRef C) {
    109   return unwrap(C)->shouldDiscardValueNames();
    110 }
    111 
    112 void LLVMContextSetDiscardValueNames(LLVMContextRef C, LLVMBool Discard) {
    113   unwrap(C)->setDiscardValueNames(Discard);
    114 }
    115 
    116 void LLVMContextDispose(LLVMContextRef C) {
    117   delete unwrap(C);
    118 }
    119 
    120 unsigned LLVMGetMDKindIDInContext(LLVMContextRef C, const char *Name,
    121                                   unsigned SLen) {
    122   return unwrap(C)->getMDKindID(StringRef(Name, SLen));
    123 }
    124 
    125 unsigned LLVMGetMDKindID(const char *Name, unsigned SLen) {
    126   return LLVMGetMDKindIDInContext(LLVMGetGlobalContext(), Name, SLen);
    127 }
    128 
    129 unsigned LLVMGetEnumAttributeKindForName(const char *Name, size_t SLen) {
    130   return Attribute::getAttrKindFromName(StringRef(Name, SLen));
    131 }
    132 
    133 unsigned LLVMGetLastEnumAttributeKind(void) {
    134   return Attribute::AttrKind::EndAttrKinds;
    135 }
    136 
    137 LLVMAttributeRef LLVMCreateEnumAttribute(LLVMContextRef C, unsigned KindID,
    138                                          uint64_t Val) {
    139   auto &Ctx = *unwrap(C);
    140   auto AttrKind = (Attribute::AttrKind)KindID;
    141 
    142   if (AttrKind == Attribute::AttrKind::ByVal) {
    143     // After r362128, byval attributes need to have a type attribute. Provide a
    144     // NULL one until a proper API is added for this.
    145     return wrap(Attribute::getWithByValType(Ctx, NULL));
    146   }
    147 
    148   if (AttrKind == Attribute::AttrKind::StructRet) {
    149     // Same as byval.
    150     return wrap(Attribute::getWithStructRetType(Ctx, NULL));
    151   }
    152 
    153   return wrap(Attribute::get(Ctx, AttrKind, Val));
    154 }
    155 
    156 unsigned LLVMGetEnumAttributeKind(LLVMAttributeRef A) {
    157   return unwrap(A).getKindAsEnum();
    158 }
    159 
    160 uint64_t LLVMGetEnumAttributeValue(LLVMAttributeRef A) {
    161   auto Attr = unwrap(A);
    162   if (Attr.isEnumAttribute())
    163     return 0;
    164   return Attr.getValueAsInt();
    165 }
    166 
    167 LLVMAttributeRef LLVMCreateTypeAttribute(LLVMContextRef C, unsigned KindID,
    168                                          LLVMTypeRef type_ref) {
    169   auto &Ctx = *unwrap(C);
    170   auto AttrKind = (Attribute::AttrKind)KindID;
    171   return wrap(Attribute::get(Ctx, AttrKind, unwrap(type_ref)));
    172 }
    173 
    174 LLVMTypeRef LLVMGetTypeAttributeValue(LLVMAttributeRef A) {
    175   auto Attr = unwrap(A);
    176   return wrap(Attr.getValueAsType());
    177 }
    178 
    179 LLVMAttributeRef LLVMCreateStringAttribute(LLVMContextRef C,
    180                                            const char *K, unsigned KLength,
    181                                            const char *V, unsigned VLength) {
    182   return wrap(Attribute::get(*unwrap(C), StringRef(K, KLength),
    183                              StringRef(V, VLength)));
    184 }
    185 
    186 const char *LLVMGetStringAttributeKind(LLVMAttributeRef A,
    187                                        unsigned *Length) {
    188   auto S = unwrap(A).getKindAsString();
    189   *Length = S.size();
    190   return S.data();
    191 }
    192 
    193 const char *LLVMGetStringAttributeValue(LLVMAttributeRef A,
    194                                         unsigned *Length) {
    195   auto S = unwrap(A).getValueAsString();
    196   *Length = S.size();
    197   return S.data();
    198 }
    199 
    200 LLVMBool LLVMIsEnumAttribute(LLVMAttributeRef A) {
    201   auto Attr = unwrap(A);
    202   return Attr.isEnumAttribute() || Attr.isIntAttribute();
    203 }
    204 
    205 LLVMBool LLVMIsStringAttribute(LLVMAttributeRef A) {
    206   return unwrap(A).isStringAttribute();
    207 }
    208 
    209 LLVMBool LLVMIsTypeAttribute(LLVMAttributeRef A) {
    210   return unwrap(A).isTypeAttribute();
    211 }
    212 
    213 char *LLVMGetDiagInfoDescription(LLVMDiagnosticInfoRef DI) {
    214   std::string MsgStorage;
    215   raw_string_ostream Stream(MsgStorage);
    216   DiagnosticPrinterRawOStream DP(Stream);
    217 
    218   unwrap(DI)->print(DP);
    219   Stream.flush();
    220 
    221   return LLVMCreateMessage(MsgStorage.c_str());
    222 }
    223 
    224 LLVMDiagnosticSeverity LLVMGetDiagInfoSeverity(LLVMDiagnosticInfoRef DI) {
    225     LLVMDiagnosticSeverity severity;
    226 
    227     switch(unwrap(DI)->getSeverity()) {
    228     default:
    229       severity = LLVMDSError;
    230       break;
    231     case DS_Warning:
    232       severity = LLVMDSWarning;
    233       break;
    234     case DS_Remark:
    235       severity = LLVMDSRemark;
    236       break;
    237     case DS_Note:
    238       severity = LLVMDSNote;
    239       break;
    240     }
    241 
    242     return severity;
    243 }
    244 
    245 /*===-- Operations on modules ---------------------------------------------===*/
    246 
    247 LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID) {
    248   return wrap(new Module(ModuleID, *GlobalContext));
    249 }
    250 
    251 LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID,
    252                                                 LLVMContextRef C) {
    253   return wrap(new Module(ModuleID, *unwrap(C)));
    254 }
    255 
    256 void LLVMDisposeModule(LLVMModuleRef M) {
    257   delete unwrap(M);
    258 }
    259 
    260 const char *LLVMGetModuleIdentifier(LLVMModuleRef M, size_t *Len) {
    261   auto &Str = unwrap(M)->getModuleIdentifier();
    262   *Len = Str.length();
    263   return Str.c_str();
    264 }
    265 
    266 void LLVMSetModuleIdentifier(LLVMModuleRef M, const char *Ident, size_t Len) {
    267   unwrap(M)->setModuleIdentifier(StringRef(Ident, Len));
    268 }
    269 
    270 const char *LLVMGetSourceFileName(LLVMModuleRef M, size_t *Len) {
    271   auto &Str = unwrap(M)->getSourceFileName();
    272   *Len = Str.length();
    273   return Str.c_str();
    274 }
    275 
    276 void LLVMSetSourceFileName(LLVMModuleRef M, const char *Name, size_t Len) {
    277   unwrap(M)->setSourceFileName(StringRef(Name, Len));
    278 }
    279 
    280 /*--.. Data layout .........................................................--*/
    281 const char *LLVMGetDataLayoutStr(LLVMModuleRef M) {
    282   return unwrap(M)->getDataLayoutStr().c_str();
    283 }
    284 
    285 const char *LLVMGetDataLayout(LLVMModuleRef M) {
    286   return LLVMGetDataLayoutStr(M);
    287 }
    288 
    289 void LLVMSetDataLayout(LLVMModuleRef M, const char *DataLayoutStr) {
    290   unwrap(M)->setDataLayout(DataLayoutStr);
    291 }
    292 
    293 /*--.. Target triple .......................................................--*/
    294 const char * LLVMGetTarget(LLVMModuleRef M) {
    295   return unwrap(M)->getTargetTriple().c_str();
    296 }
    297 
    298 void LLVMSetTarget(LLVMModuleRef M, const char *Triple) {
    299   unwrap(M)->setTargetTriple(Triple);
    300 }
    301 
    302 /*--.. Module flags ........................................................--*/
    303 struct LLVMOpaqueModuleFlagEntry {
    304   LLVMModuleFlagBehavior Behavior;
    305   const char *Key;
    306   size_t KeyLen;
    307   LLVMMetadataRef Metadata;
    308 };
    309 
    310 static Module::ModFlagBehavior
    311 map_to_llvmModFlagBehavior(LLVMModuleFlagBehavior Behavior) {
    312   switch (Behavior) {
    313   case LLVMModuleFlagBehaviorError:
    314     return Module::ModFlagBehavior::Error;
    315   case LLVMModuleFlagBehaviorWarning:
    316     return Module::ModFlagBehavior::Warning;
    317   case LLVMModuleFlagBehaviorRequire:
    318     return Module::ModFlagBehavior::Require;
    319   case LLVMModuleFlagBehaviorOverride:
    320     return Module::ModFlagBehavior::Override;
    321   case LLVMModuleFlagBehaviorAppend:
    322     return Module::ModFlagBehavior::Append;
    323   case LLVMModuleFlagBehaviorAppendUnique:
    324     return Module::ModFlagBehavior::AppendUnique;
    325   }
    326   llvm_unreachable("Unknown LLVMModuleFlagBehavior");
    327 }
    328 
    329 static LLVMModuleFlagBehavior
    330 map_from_llvmModFlagBehavior(Module::ModFlagBehavior Behavior) {
    331   switch (Behavior) {
    332   case Module::ModFlagBehavior::Error:
    333     return LLVMModuleFlagBehaviorError;
    334   case Module::ModFlagBehavior::Warning:
    335     return LLVMModuleFlagBehaviorWarning;
    336   case Module::ModFlagBehavior::Require:
    337     return LLVMModuleFlagBehaviorRequire;
    338   case Module::ModFlagBehavior::Override:
    339     return LLVMModuleFlagBehaviorOverride;
    340   case Module::ModFlagBehavior::Append:
    341     return LLVMModuleFlagBehaviorAppend;
    342   case Module::ModFlagBehavior::AppendUnique:
    343     return LLVMModuleFlagBehaviorAppendUnique;
    344   default:
    345     llvm_unreachable("Unhandled Flag Behavior");
    346   }
    347 }
    348 
    349 LLVMModuleFlagEntry *LLVMCopyModuleFlagsMetadata(LLVMModuleRef M, size_t *Len) {
    350   SmallVector<Module::ModuleFlagEntry, 8> MFEs;
    351   unwrap(M)->getModuleFlagsMetadata(MFEs);
    352 
    353   LLVMOpaqueModuleFlagEntry *Result = static_cast<LLVMOpaqueModuleFlagEntry *>(
    354       safe_malloc(MFEs.size() * sizeof(LLVMOpaqueModuleFlagEntry)));
    355   for (unsigned i = 0; i < MFEs.size(); ++i) {
    356     const auto &ModuleFlag = MFEs[i];
    357     Result[i].Behavior = map_from_llvmModFlagBehavior(ModuleFlag.Behavior);
    358     Result[i].Key = ModuleFlag.Key->getString().data();
    359     Result[i].KeyLen = ModuleFlag.Key->getString().size();
    360     Result[i].Metadata = wrap(ModuleFlag.Val);
    361   }
    362   *Len = MFEs.size();
    363   return Result;
    364 }
    365 
    366 void LLVMDisposeModuleFlagsMetadata(LLVMModuleFlagEntry *Entries) {
    367   free(Entries);
    368 }
    369 
    370 LLVMModuleFlagBehavior
    371 LLVMModuleFlagEntriesGetFlagBehavior(LLVMModuleFlagEntry *Entries,
    372                                      unsigned Index) {
    373   LLVMOpaqueModuleFlagEntry MFE =
    374       static_cast<LLVMOpaqueModuleFlagEntry>(Entries[Index]);
    375   return MFE.Behavior;
    376 }
    377 
    378 const char *LLVMModuleFlagEntriesGetKey(LLVMModuleFlagEntry *Entries,
    379                                         unsigned Index, size_t *Len) {
    380   LLVMOpaqueModuleFlagEntry MFE =
    381       static_cast<LLVMOpaqueModuleFlagEntry>(Entries[Index]);
    382   *Len = MFE.KeyLen;
    383   return MFE.Key;
    384 }
    385 
    386 LLVMMetadataRef LLVMModuleFlagEntriesGetMetadata(LLVMModuleFlagEntry *Entries,
    387                                                  unsigned Index) {
    388   LLVMOpaqueModuleFlagEntry MFE =
    389       static_cast<LLVMOpaqueModuleFlagEntry>(Entries[Index]);
    390   return MFE.Metadata;
    391 }
    392 
    393 LLVMMetadataRef LLVMGetModuleFlag(LLVMModuleRef M,
    394                                   const char *Key, size_t KeyLen) {
    395   return wrap(unwrap(M)->getModuleFlag({Key, KeyLen}));
    396 }
    397 
    398 void LLVMAddModuleFlag(LLVMModuleRef M, LLVMModuleFlagBehavior Behavior,
    399                        const char *Key, size_t KeyLen,
    400                        LLVMMetadataRef Val) {
    401   unwrap(M)->addModuleFlag(map_to_llvmModFlagBehavior(Behavior),
    402                            {Key, KeyLen}, unwrap(Val));
    403 }
    404 
    405 /*--.. Printing modules ....................................................--*/
    406 
    407 void LLVMDumpModule(LLVMModuleRef M) {
    408   unwrap(M)->print(errs(), nullptr,
    409                    /*ShouldPreserveUseListOrder=*/false, /*IsForDebug=*/true);
    410 }
    411 
    412 LLVMBool LLVMPrintModuleToFile(LLVMModuleRef M, const char *Filename,
    413                                char **ErrorMessage) {
    414   std::error_code EC;
    415   raw_fd_ostream dest(Filename, EC, sys::fs::OF_TextWithCRLF);
    416   if (EC) {
    417     *ErrorMessage = strdup(EC.message().c_str());
    418     return true;
    419   }
    420 
    421   unwrap(M)->print(dest, nullptr);
    422 
    423   dest.close();
    424 
    425   if (dest.has_error()) {
    426     std::string E = "Error printing to file: " + dest.error().message();
    427     *ErrorMessage = strdup(E.c_str());
    428     return true;
    429   }
    430 
    431   return false;
    432 }
    433 
    434 char *LLVMPrintModuleToString(LLVMModuleRef M) {
    435   std::string buf;
    436   raw_string_ostream os(buf);
    437 
    438   unwrap(M)->print(os, nullptr);
    439   os.flush();
    440 
    441   return strdup(buf.c_str());
    442 }
    443 
    444 /*--.. Operations on inline assembler ......................................--*/
    445 void LLVMSetModuleInlineAsm2(LLVMModuleRef M, const char *Asm, size_t Len) {
    446   unwrap(M)->setModuleInlineAsm(StringRef(Asm, Len));
    447 }
    448 
    449 void LLVMSetModuleInlineAsm(LLVMModuleRef M, const char *Asm) {
    450   unwrap(M)->setModuleInlineAsm(StringRef(Asm));
    451 }
    452 
    453 void LLVMAppendModuleInlineAsm(LLVMModuleRef M, const char *Asm, size_t Len) {
    454   unwrap(M)->appendModuleInlineAsm(StringRef(Asm, Len));
    455 }
    456 
    457 const char *LLVMGetModuleInlineAsm(LLVMModuleRef M, size_t *Len) {
    458   auto &Str = unwrap(M)->getModuleInlineAsm();
    459   *Len = Str.length();
    460   return Str.c_str();
    461 }
    462 
    463 LLVMValueRef LLVMGetInlineAsm(LLVMTypeRef Ty, char *AsmString,
    464                               size_t AsmStringSize, char *Constraints,
    465                               size_t ConstraintsSize, LLVMBool HasSideEffects,
    466                               LLVMBool IsAlignStack,
    467                               LLVMInlineAsmDialect Dialect, LLVMBool CanThrow) {
    468   InlineAsm::AsmDialect AD;
    469   switch (Dialect) {
    470   case LLVMInlineAsmDialectATT:
    471     AD = InlineAsm::AD_ATT;
    472     break;
    473   case LLVMInlineAsmDialectIntel:
    474     AD = InlineAsm::AD_Intel;
    475     break;
    476   }
    477   return wrap(InlineAsm::get(unwrap<FunctionType>(Ty),
    478                              StringRef(AsmString, AsmStringSize),
    479                              StringRef(Constraints, ConstraintsSize),
    480                              HasSideEffects, IsAlignStack, AD, CanThrow));
    481 }
    482 
    483 /*--.. Operations on module contexts ......................................--*/
    484 LLVMContextRef LLVMGetModuleContext(LLVMModuleRef M) {
    485   return wrap(&unwrap(M)->getContext());
    486 }
    487 
    488 
    489 /*===-- Operations on types -----------------------------------------------===*/
    490 
    491 /*--.. Operations on all types (mostly) ....................................--*/
    492 
    493 LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty) {
    494   switch (unwrap(Ty)->getTypeID()) {
    495   case Type::VoidTyID:
    496     return LLVMVoidTypeKind;
    497   case Type::HalfTyID:
    498     return LLVMHalfTypeKind;
    499   case Type::BFloatTyID:
    500     return LLVMBFloatTypeKind;
    501   case Type::FloatTyID:
    502     return LLVMFloatTypeKind;
    503   case Type::DoubleTyID:
    504     return LLVMDoubleTypeKind;
    505   case Type::X86_FP80TyID:
    506     return LLVMX86_FP80TypeKind;
    507   case Type::FP128TyID:
    508     return LLVMFP128TypeKind;
    509   case Type::PPC_FP128TyID:
    510     return LLVMPPC_FP128TypeKind;
    511   case Type::LabelTyID:
    512     return LLVMLabelTypeKind;
    513   case Type::MetadataTyID:
    514     return LLVMMetadataTypeKind;
    515   case Type::IntegerTyID:
    516     return LLVMIntegerTypeKind;
    517   case Type::FunctionTyID:
    518     return LLVMFunctionTypeKind;
    519   case Type::StructTyID:
    520     return LLVMStructTypeKind;
    521   case Type::ArrayTyID:
    522     return LLVMArrayTypeKind;
    523   case Type::PointerTyID:
    524     return LLVMPointerTypeKind;
    525   case Type::FixedVectorTyID:
    526     return LLVMVectorTypeKind;
    527   case Type::X86_MMXTyID:
    528     return LLVMX86_MMXTypeKind;
    529   case Type::X86_AMXTyID:
    530     return LLVMX86_AMXTypeKind;
    531   case Type::TokenTyID:
    532     return LLVMTokenTypeKind;
    533   case Type::ScalableVectorTyID:
    534     return LLVMScalableVectorTypeKind;
    535   }
    536   llvm_unreachable("Unhandled TypeID.");
    537 }
    538 
    539 LLVMBool LLVMTypeIsSized(LLVMTypeRef Ty)
    540 {
    541     return unwrap(Ty)->isSized();
    542 }
    543 
    544 LLVMContextRef LLVMGetTypeContext(LLVMTypeRef Ty) {
    545   return wrap(&unwrap(Ty)->getContext());
    546 }
    547 
    548 void LLVMDumpType(LLVMTypeRef Ty) {
    549   return unwrap(Ty)->print(errs(), /*IsForDebug=*/true);
    550 }
    551 
    552 char *LLVMPrintTypeToString(LLVMTypeRef Ty) {
    553   std::string buf;
    554   raw_string_ostream os(buf);
    555 
    556   if (unwrap(Ty))
    557     unwrap(Ty)->print(os);
    558   else
    559     os << "Printing <null> Type";
    560 
    561   os.flush();
    562 
    563   return strdup(buf.c_str());
    564 }
    565 
    566 /*--.. Operations on integer types .........................................--*/
    567 
    568 LLVMTypeRef LLVMInt1TypeInContext(LLVMContextRef C)  {
    569   return (LLVMTypeRef) Type::getInt1Ty(*unwrap(C));
    570 }
    571 LLVMTypeRef LLVMInt8TypeInContext(LLVMContextRef C)  {
    572   return (LLVMTypeRef) Type::getInt8Ty(*unwrap(C));
    573 }
    574 LLVMTypeRef LLVMInt16TypeInContext(LLVMContextRef C) {
    575   return (LLVMTypeRef) Type::getInt16Ty(*unwrap(C));
    576 }
    577 LLVMTypeRef LLVMInt32TypeInContext(LLVMContextRef C) {
    578   return (LLVMTypeRef) Type::getInt32Ty(*unwrap(C));
    579 }
    580 LLVMTypeRef LLVMInt64TypeInContext(LLVMContextRef C) {
    581   return (LLVMTypeRef) Type::getInt64Ty(*unwrap(C));
    582 }
    583 LLVMTypeRef LLVMInt128TypeInContext(LLVMContextRef C) {
    584   return (LLVMTypeRef) Type::getInt128Ty(*unwrap(C));
    585 }
    586 LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits) {
    587   return wrap(IntegerType::get(*unwrap(C), NumBits));
    588 }
    589 
    590 LLVMTypeRef LLVMInt1Type(void)  {
    591   return LLVMInt1TypeInContext(LLVMGetGlobalContext());
    592 }
    593 LLVMTypeRef LLVMInt8Type(void)  {
    594   return LLVMInt8TypeInContext(LLVMGetGlobalContext());
    595 }
    596 LLVMTypeRef LLVMInt16Type(void) {
    597   return LLVMInt16TypeInContext(LLVMGetGlobalContext());
    598 }
    599 LLVMTypeRef LLVMInt32Type(void) {
    600   return LLVMInt32TypeInContext(LLVMGetGlobalContext());
    601 }
    602 LLVMTypeRef LLVMInt64Type(void) {
    603   return LLVMInt64TypeInContext(LLVMGetGlobalContext());
    604 }
    605 LLVMTypeRef LLVMInt128Type(void) {
    606   return LLVMInt128TypeInContext(LLVMGetGlobalContext());
    607 }
    608 LLVMTypeRef LLVMIntType(unsigned NumBits) {
    609   return LLVMIntTypeInContext(LLVMGetGlobalContext(), NumBits);
    610 }
    611 
    612 unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy) {
    613   return unwrap<IntegerType>(IntegerTy)->getBitWidth();
    614 }
    615 
    616 /*--.. Operations on real types ............................................--*/
    617 
    618 LLVMTypeRef LLVMHalfTypeInContext(LLVMContextRef C) {
    619   return (LLVMTypeRef) Type::getHalfTy(*unwrap(C));
    620 }
    621 LLVMTypeRef LLVMBFloatTypeInContext(LLVMContextRef C) {
    622   return (LLVMTypeRef) Type::getBFloatTy(*unwrap(C));
    623 }
    624 LLVMTypeRef LLVMFloatTypeInContext(LLVMContextRef C) {
    625   return (LLVMTypeRef) Type::getFloatTy(*unwrap(C));
    626 }
    627 LLVMTypeRef LLVMDoubleTypeInContext(LLVMContextRef C) {
    628   return (LLVMTypeRef) Type::getDoubleTy(*unwrap(C));
    629 }
    630 LLVMTypeRef LLVMX86FP80TypeInContext(LLVMContextRef C) {
    631   return (LLVMTypeRef) Type::getX86_FP80Ty(*unwrap(C));
    632 }
    633 LLVMTypeRef LLVMFP128TypeInContext(LLVMContextRef C) {
    634   return (LLVMTypeRef) Type::getFP128Ty(*unwrap(C));
    635 }
    636 LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C) {
    637   return (LLVMTypeRef) Type::getPPC_FP128Ty(*unwrap(C));
    638 }
    639 LLVMTypeRef LLVMX86MMXTypeInContext(LLVMContextRef C) {
    640   return (LLVMTypeRef) Type::getX86_MMXTy(*unwrap(C));
    641 }
    642 LLVMTypeRef LLVMX86AMXTypeInContext(LLVMContextRef C) {
    643   return (LLVMTypeRef) Type::getX86_AMXTy(*unwrap(C));
    644 }
    645 
    646 LLVMTypeRef LLVMHalfType(void) {
    647   return LLVMHalfTypeInContext(LLVMGetGlobalContext());
    648 }
    649 LLVMTypeRef LLVMBFloatType(void) {
    650   return LLVMBFloatTypeInContext(LLVMGetGlobalContext());
    651 }
    652 LLVMTypeRef LLVMFloatType(void) {
    653   return LLVMFloatTypeInContext(LLVMGetGlobalContext());
    654 }
    655 LLVMTypeRef LLVMDoubleType(void) {
    656   return LLVMDoubleTypeInContext(LLVMGetGlobalContext());
    657 }
    658 LLVMTypeRef LLVMX86FP80Type(void) {
    659   return LLVMX86FP80TypeInContext(LLVMGetGlobalContext());
    660 }
    661 LLVMTypeRef LLVMFP128Type(void) {
    662   return LLVMFP128TypeInContext(LLVMGetGlobalContext());
    663 }
    664 LLVMTypeRef LLVMPPCFP128Type(void) {
    665   return LLVMPPCFP128TypeInContext(LLVMGetGlobalContext());
    666 }
    667 LLVMTypeRef LLVMX86MMXType(void) {
    668   return LLVMX86MMXTypeInContext(LLVMGetGlobalContext());
    669 }
    670 LLVMTypeRef LLVMX86AMXType(void) {
    671   return LLVMX86AMXTypeInContext(LLVMGetGlobalContext());
    672 }
    673 
    674 /*--.. Operations on function types ........................................--*/
    675 
    676 LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
    677                              LLVMTypeRef *ParamTypes, unsigned ParamCount,
    678                              LLVMBool IsVarArg) {
    679   ArrayRef<Type*> Tys(unwrap(ParamTypes), ParamCount);
    680   return wrap(FunctionType::get(unwrap(ReturnType), Tys, IsVarArg != 0));
    681 }
    682 
    683 LLVMBool LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy) {
    684   return unwrap<FunctionType>(FunctionTy)->isVarArg();
    685 }
    686 
    687 LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy) {
    688   return wrap(unwrap<FunctionType>(FunctionTy)->getReturnType());
    689 }
    690 
    691 unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy) {
    692   return unwrap<FunctionType>(FunctionTy)->getNumParams();
    693 }
    694 
    695 void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest) {
    696   FunctionType *Ty = unwrap<FunctionType>(FunctionTy);
    697   for (Type *T : Ty->params())
    698     *Dest++ = wrap(T);
    699 }
    700 
    701 /*--.. Operations on struct types ..........................................--*/
    702 
    703 LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
    704                            unsigned ElementCount, LLVMBool Packed) {
    705   ArrayRef<Type*> Tys(unwrap(ElementTypes), ElementCount);
    706   return wrap(StructType::get(*unwrap(C), Tys, Packed != 0));
    707 }
    708 
    709 LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes,
    710                            unsigned ElementCount, LLVMBool Packed) {
    711   return LLVMStructTypeInContext(LLVMGetGlobalContext(), ElementTypes,
    712                                  ElementCount, Packed);
    713 }
    714 
    715 LLVMTypeRef LLVMStructCreateNamed(LLVMContextRef C, const char *Name)
    716 {
    717   return wrap(StructType::create(*unwrap(C), Name));
    718 }
    719 
    720 const char *LLVMGetStructName(LLVMTypeRef Ty)
    721 {
    722   StructType *Type = unwrap<StructType>(Ty);
    723   if (!Type->hasName())
    724     return nullptr;
    725   return Type->getName().data();
    726 }
    727 
    728 void LLVMStructSetBody(LLVMTypeRef StructTy, LLVMTypeRef *ElementTypes,
    729                        unsigned ElementCount, LLVMBool Packed) {
    730   ArrayRef<Type*> Tys(unwrap(ElementTypes), ElementCount);
    731   unwrap<StructType>(StructTy)->setBody(Tys, Packed != 0);
    732 }
    733 
    734 unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy) {
    735   return unwrap<StructType>(StructTy)->getNumElements();
    736 }
    737 
    738 void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest) {
    739   StructType *Ty = unwrap<StructType>(StructTy);
    740   for (Type *T : Ty->elements())
    741     *Dest++ = wrap(T);
    742 }
    743 
    744 LLVMTypeRef LLVMStructGetTypeAtIndex(LLVMTypeRef StructTy, unsigned i) {
    745   StructType *Ty = unwrap<StructType>(StructTy);
    746   return wrap(Ty->getTypeAtIndex(i));
    747 }
    748 
    749 LLVMBool LLVMIsPackedStruct(LLVMTypeRef StructTy) {
    750   return unwrap<StructType>(StructTy)->isPacked();
    751 }
    752 
    753 LLVMBool LLVMIsOpaqueStruct(LLVMTypeRef StructTy) {
    754   return unwrap<StructType>(StructTy)->isOpaque();
    755 }
    756 
    757 LLVMBool LLVMIsLiteralStruct(LLVMTypeRef StructTy) {
    758   return unwrap<StructType>(StructTy)->isLiteral();
    759 }
    760 
    761 LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name) {
    762   return wrap(StructType::getTypeByName(unwrap(M)->getContext(), Name));
    763 }
    764 
    765 LLVMTypeRef LLVMGetTypeByName2(LLVMContextRef C, const char *Name) {
    766   return wrap(StructType::getTypeByName(*unwrap(C), Name));
    767 }
    768 
    769 /*--.. Operations on array, pointer, and vector types (sequence types) .....--*/
    770 
    771 void LLVMGetSubtypes(LLVMTypeRef Tp, LLVMTypeRef *Arr) {
    772     int i = 0;
    773     for (auto *T : unwrap(Tp)->subtypes()) {
    774         Arr[i] = wrap(T);
    775         i++;
    776     }
    777 }
    778 
    779 LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount) {
    780   return wrap(ArrayType::get(unwrap(ElementType), ElementCount));
    781 }
    782 
    783 LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace) {
    784   return wrap(PointerType::get(unwrap(ElementType), AddressSpace));
    785 }
    786 
    787 LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount) {
    788   return wrap(FixedVectorType::get(unwrap(ElementType), ElementCount));
    789 }
    790 
    791 LLVMTypeRef LLVMScalableVectorType(LLVMTypeRef ElementType,
    792                                    unsigned ElementCount) {
    793   return wrap(ScalableVectorType::get(unwrap(ElementType), ElementCount));
    794 }
    795 
    796 LLVMTypeRef LLVMGetElementType(LLVMTypeRef WrappedTy) {
    797   auto *Ty = unwrap<Type>(WrappedTy);
    798   if (auto *PTy = dyn_cast<PointerType>(Ty))
    799     return wrap(PTy->getElementType());
    800   if (auto *ATy = dyn_cast<ArrayType>(Ty))
    801     return wrap(ATy->getElementType());
    802   return wrap(cast<VectorType>(Ty)->getElementType());
    803 }
    804 
    805 unsigned LLVMGetNumContainedTypes(LLVMTypeRef Tp) {
    806     return unwrap(Tp)->getNumContainedTypes();
    807 }
    808 
    809 unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy) {
    810   return unwrap<ArrayType>(ArrayTy)->getNumElements();
    811 }
    812 
    813 unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy) {
    814   return unwrap<PointerType>(PointerTy)->getAddressSpace();
    815 }
    816 
    817 unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy) {
    818   return unwrap<VectorType>(VectorTy)->getElementCount().getKnownMinValue();
    819 }
    820 
    821 /*--.. Operations on other types ...........................................--*/
    822 
    823 LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C)  {
    824   return wrap(Type::getVoidTy(*unwrap(C)));
    825 }
    826 LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C) {
    827   return wrap(Type::getLabelTy(*unwrap(C)));
    828 }
    829 LLVMTypeRef LLVMTokenTypeInContext(LLVMContextRef C) {
    830   return wrap(Type::getTokenTy(*unwrap(C)));
    831 }
    832 LLVMTypeRef LLVMMetadataTypeInContext(LLVMContextRef C) {
    833   return wrap(Type::getMetadataTy(*unwrap(C)));
    834 }
    835 
    836 LLVMTypeRef LLVMVoidType(void)  {
    837   return LLVMVoidTypeInContext(LLVMGetGlobalContext());
    838 }
    839 LLVMTypeRef LLVMLabelType(void) {
    840   return LLVMLabelTypeInContext(LLVMGetGlobalContext());
    841 }
    842 
    843 /*===-- Operations on values ----------------------------------------------===*/
    844 
    845 /*--.. Operations on all values ............................................--*/
    846 
    847 LLVMTypeRef LLVMTypeOf(LLVMValueRef Val) {
    848   return wrap(unwrap(Val)->getType());
    849 }
    850 
    851 LLVMValueKind LLVMGetValueKind(LLVMValueRef Val) {
    852     switch(unwrap(Val)->getValueID()) {
    853 #define LLVM_C_API 1
    854 #define HANDLE_VALUE(Name) \
    855   case Value::Name##Val: \
    856     return LLVM##Name##ValueKind;
    857 #include "llvm/IR/Value.def"
    858   default:
    859     return LLVMInstructionValueKind;
    860   }
    861 }
    862 
    863 const char *LLVMGetValueName2(LLVMValueRef Val, size_t *Length) {
    864   auto *V = unwrap(Val);
    865   *Length = V->getName().size();
    866   return V->getName().data();
    867 }
    868 
    869 void LLVMSetValueName2(LLVMValueRef Val, const char *Name, size_t NameLen) {
    870   unwrap(Val)->setName(StringRef(Name, NameLen));
    871 }
    872 
    873 const char *LLVMGetValueName(LLVMValueRef Val) {
    874   return unwrap(Val)->getName().data();
    875 }
    876 
    877 void LLVMSetValueName(LLVMValueRef Val, const char *Name) {
    878   unwrap(Val)->setName(Name);
    879 }
    880 
    881 void LLVMDumpValue(LLVMValueRef Val) {
    882   unwrap(Val)->print(errs(), /*IsForDebug=*/true);
    883 }
    884 
    885 char* LLVMPrintValueToString(LLVMValueRef Val) {
    886   std::string buf;
    887   raw_string_ostream os(buf);
    888 
    889   if (unwrap(Val))
    890     unwrap(Val)->print(os);
    891   else
    892     os << "Printing <null> Value";
    893 
    894   os.flush();
    895 
    896   return strdup(buf.c_str());
    897 }
    898 
    899 void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal) {
    900   unwrap(OldVal)->replaceAllUsesWith(unwrap(NewVal));
    901 }
    902 
    903 int LLVMHasMetadata(LLVMValueRef Inst) {
    904   return unwrap<Instruction>(Inst)->hasMetadata();
    905 }
    906 
    907 LLVMValueRef LLVMGetMetadata(LLVMValueRef Inst, unsigned KindID) {
    908   auto *I = unwrap<Instruction>(Inst);
    909   assert(I && "Expected instruction");
    910   if (auto *MD = I->getMetadata(KindID))
    911     return wrap(MetadataAsValue::get(I->getContext(), MD));
    912   return nullptr;
    913 }
    914 
    915 // MetadataAsValue uses a canonical format which strips the actual MDNode for
    916 // MDNode with just a single constant value, storing just a ConstantAsMetadata
    917 // This undoes this canonicalization, reconstructing the MDNode.
    918 static MDNode *extractMDNode(MetadataAsValue *MAV) {
    919   Metadata *MD = MAV->getMetadata();
    920   assert((isa<MDNode>(MD) || isa<ConstantAsMetadata>(MD)) &&
    921       "Expected a metadata node or a canonicalized constant");
    922 
    923   if (MDNode *N = dyn_cast<MDNode>(MD))
    924     return N;
    925 
    926   return MDNode::get(MAV->getContext(), MD);
    927 }
    928 
    929 void LLVMSetMetadata(LLVMValueRef Inst, unsigned KindID, LLVMValueRef Val) {
    930   MDNode *N = Val ? extractMDNode(unwrap<MetadataAsValue>(Val)) : nullptr;
    931 
    932   unwrap<Instruction>(Inst)->setMetadata(KindID, N);
    933 }
    934 
    935 struct LLVMOpaqueValueMetadataEntry {
    936   unsigned Kind;
    937   LLVMMetadataRef Metadata;
    938 };
    939 
    940 using MetadataEntries = SmallVectorImpl<std::pair<unsigned, MDNode *>>;
    941 static LLVMValueMetadataEntry *
    942 llvm_getMetadata(size_t *NumEntries,
    943                  llvm::function_ref<void(MetadataEntries &)> AccessMD) {
    944   SmallVector<std::pair<unsigned, MDNode *>, 8> MVEs;
    945   AccessMD(MVEs);
    946 
    947   LLVMOpaqueValueMetadataEntry *Result =
    948   static_cast<LLVMOpaqueValueMetadataEntry *>(
    949                                               safe_malloc(MVEs.size() * sizeof(LLVMOpaqueValueMetadataEntry)));
    950   for (unsigned i = 0; i < MVEs.size(); ++i) {
    951     const auto &ModuleFlag = MVEs[i];
    952     Result[i].Kind = ModuleFlag.first;
    953     Result[i].Metadata = wrap(ModuleFlag.second);
    954   }
    955   *NumEntries = MVEs.size();
    956   return Result;
    957 }
    958 
    959 LLVMValueMetadataEntry *
    960 LLVMInstructionGetAllMetadataOtherThanDebugLoc(LLVMValueRef Value,
    961                                                size_t *NumEntries) {
    962   return llvm_getMetadata(NumEntries, [&Value](MetadataEntries &Entries) {
    963     Entries.clear();
    964     unwrap<Instruction>(Value)->getAllMetadata(Entries);
    965   });
    966 }
    967 
    968 /*--.. Conversion functions ................................................--*/
    969 
    970 #define LLVM_DEFINE_VALUE_CAST(name)                                       \
    971   LLVMValueRef LLVMIsA##name(LLVMValueRef Val) {                           \
    972     return wrap(static_cast<Value*>(dyn_cast_or_null<name>(unwrap(Val)))); \
    973   }
    974 
    975 LLVM_FOR_EACH_VALUE_SUBCLASS(LLVM_DEFINE_VALUE_CAST)
    976 
    977 LLVMValueRef LLVMIsAMDNode(LLVMValueRef Val) {
    978   if (auto *MD = dyn_cast_or_null<MetadataAsValue>(unwrap(Val)))
    979     if (isa<MDNode>(MD->getMetadata()) ||
    980         isa<ValueAsMetadata>(MD->getMetadata()))
    981       return Val;
    982   return nullptr;
    983 }
    984 
    985 LLVMValueRef LLVMIsAMDString(LLVMValueRef Val) {
    986   if (auto *MD = dyn_cast_or_null<MetadataAsValue>(unwrap(Val)))
    987     if (isa<MDString>(MD->getMetadata()))
    988       return Val;
    989   return nullptr;
    990 }
    991 
    992 /*--.. Operations on Uses ..................................................--*/
    993 LLVMUseRef LLVMGetFirstUse(LLVMValueRef Val) {
    994   Value *V = unwrap(Val);
    995   Value::use_iterator I = V->use_begin();
    996   if (I == V->use_end())
    997     return nullptr;
    998   return wrap(&*I);
    999 }
   1000 
   1001 LLVMUseRef LLVMGetNextUse(LLVMUseRef U) {
   1002   Use *Next = unwrap(U)->getNext();
   1003   if (Next)
   1004     return wrap(Next);
   1005   return nullptr;
   1006 }
   1007 
   1008 LLVMValueRef LLVMGetUser(LLVMUseRef U) {
   1009   return wrap(unwrap(U)->getUser());
   1010 }
   1011 
   1012 LLVMValueRef LLVMGetUsedValue(LLVMUseRef U) {
   1013   return wrap(unwrap(U)->get());
   1014 }
   1015 
   1016 /*--.. Operations on Users .................................................--*/
   1017 
   1018 static LLVMValueRef getMDNodeOperandImpl(LLVMContext &Context, const MDNode *N,
   1019                                          unsigned Index) {
   1020   Metadata *Op = N->getOperand(Index);
   1021   if (!Op)
   1022     return nullptr;
   1023   if (auto *C = dyn_cast<ConstantAsMetadata>(Op))
   1024     return wrap(C->getValue());
   1025   return wrap(MetadataAsValue::get(Context, Op));
   1026 }
   1027 
   1028 LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index) {
   1029   Value *V = unwrap(Val);
   1030   if (auto *MD = dyn_cast<MetadataAsValue>(V)) {
   1031     if (auto *L = dyn_cast<ValueAsMetadata>(MD->getMetadata())) {
   1032       assert(Index == 0 && "Function-local metadata can only have one operand");
   1033       return wrap(L->getValue());
   1034     }
   1035     return getMDNodeOperandImpl(V->getContext(),
   1036                                 cast<MDNode>(MD->getMetadata()), Index);
   1037   }
   1038 
   1039   return wrap(cast<User>(V)->getOperand(Index));
   1040 }
   1041 
   1042 LLVMUseRef LLVMGetOperandUse(LLVMValueRef Val, unsigned Index) {
   1043   Value *V = unwrap(Val);
   1044   return wrap(&cast<User>(V)->getOperandUse(Index));
   1045 }
   1046 
   1047 void LLVMSetOperand(LLVMValueRef Val, unsigned Index, LLVMValueRef Op) {
   1048   unwrap<User>(Val)->setOperand(Index, unwrap(Op));
   1049 }
   1050 
   1051 int LLVMGetNumOperands(LLVMValueRef Val) {
   1052   Value *V = unwrap(Val);
   1053   if (isa<MetadataAsValue>(V))
   1054     return LLVMGetMDNodeNumOperands(Val);
   1055 
   1056   return cast<User>(V)->getNumOperands();
   1057 }
   1058 
   1059 /*--.. Operations on constants of any type .................................--*/
   1060 
   1061 LLVMValueRef LLVMConstNull(LLVMTypeRef Ty) {
   1062   return wrap(Constant::getNullValue(unwrap(Ty)));
   1063 }
   1064 
   1065 LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty) {
   1066   return wrap(Constant::getAllOnesValue(unwrap(Ty)));
   1067 }
   1068 
   1069 LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty) {
   1070   return wrap(UndefValue::get(unwrap(Ty)));
   1071 }
   1072 
   1073 LLVMValueRef LLVMGetPoison(LLVMTypeRef Ty) {
   1074   return wrap(PoisonValue::get(unwrap(Ty)));
   1075 }
   1076 
   1077 LLVMBool LLVMIsConstant(LLVMValueRef Ty) {
   1078   return isa<Constant>(unwrap(Ty));
   1079 }
   1080 
   1081 LLVMBool LLVMIsNull(LLVMValueRef Val) {
   1082   if (Constant *C = dyn_cast<Constant>(unwrap(Val)))
   1083     return C->isNullValue();
   1084   return false;
   1085 }
   1086 
   1087 LLVMBool LLVMIsUndef(LLVMValueRef Val) {
   1088   return isa<UndefValue>(unwrap(Val));
   1089 }
   1090 
   1091 LLVMBool LLVMIsPoison(LLVMValueRef Val) {
   1092   return isa<PoisonValue>(unwrap(Val));
   1093 }
   1094 
   1095 LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty) {
   1096   return wrap(ConstantPointerNull::get(unwrap<PointerType>(Ty)));
   1097 }
   1098 
   1099 /*--.. Operations on metadata nodes ........................................--*/
   1100 
   1101 LLVMMetadataRef LLVMMDStringInContext2(LLVMContextRef C, const char *Str,
   1102                                        size_t SLen) {
   1103   return wrap(MDString::get(*unwrap(C), StringRef(Str, SLen)));
   1104 }
   1105 
   1106 LLVMMetadataRef LLVMMDNodeInContext2(LLVMContextRef C, LLVMMetadataRef *MDs,
   1107                                      size_t Count) {
   1108   return wrap(MDNode::get(*unwrap(C), ArrayRef<Metadata*>(unwrap(MDs), Count)));
   1109 }
   1110 
   1111 LLVMValueRef LLVMMDStringInContext(LLVMContextRef C, const char *Str,
   1112                                    unsigned SLen) {
   1113   LLVMContext &Context = *unwrap(C);
   1114   return wrap(MetadataAsValue::get(
   1115       Context, MDString::get(Context, StringRef(Str, SLen))));
   1116 }
   1117 
   1118 LLVMValueRef LLVMMDString(const char *Str, unsigned SLen) {
   1119   return LLVMMDStringInContext(LLVMGetGlobalContext(), Str, SLen);
   1120 }
   1121 
   1122 LLVMValueRef LLVMMDNodeInContext(LLVMContextRef C, LLVMValueRef *Vals,
   1123                                  unsigned Count) {
   1124   LLVMContext &Context = *unwrap(C);
   1125   SmallVector<Metadata *, 8> MDs;
   1126   for (auto *OV : makeArrayRef(Vals, Count)) {
   1127     Value *V = unwrap(OV);
   1128     Metadata *MD;
   1129     if (!V)
   1130       MD = nullptr;
   1131     else if (auto *C = dyn_cast<Constant>(V))
   1132       MD = ConstantAsMetadata::get(C);
   1133     else if (auto *MDV = dyn_cast<MetadataAsValue>(V)) {
   1134       MD = MDV->getMetadata();
   1135       assert(!isa<LocalAsMetadata>(MD) && "Unexpected function-local metadata "
   1136                                           "outside of direct argument to call");
   1137     } else {
   1138       // This is function-local metadata.  Pretend to make an MDNode.
   1139       assert(Count == 1 &&
   1140              "Expected only one operand to function-local metadata");
   1141       return wrap(MetadataAsValue::get(Context, LocalAsMetadata::get(V)));
   1142     }
   1143 
   1144     MDs.push_back(MD);
   1145   }
   1146   return wrap(MetadataAsValue::get(Context, MDNode::get(Context, MDs)));
   1147 }
   1148 
   1149 LLVMValueRef LLVMMDNode(LLVMValueRef *Vals, unsigned Count) {
   1150   return LLVMMDNodeInContext(LLVMGetGlobalContext(), Vals, Count);
   1151 }
   1152 
   1153 LLVMValueRef LLVMMetadataAsValue(LLVMContextRef C, LLVMMetadataRef MD) {
   1154   return wrap(MetadataAsValue::get(*unwrap(C), unwrap(MD)));
   1155 }
   1156 
   1157 LLVMMetadataRef LLVMValueAsMetadata(LLVMValueRef Val) {
   1158   auto *V = unwrap(Val);
   1159   if (auto *C = dyn_cast<Constant>(V))
   1160     return wrap(ConstantAsMetadata::get(C));
   1161   if (auto *MAV = dyn_cast<MetadataAsValue>(V))
   1162     return wrap(MAV->getMetadata());
   1163   return wrap(ValueAsMetadata::get(V));
   1164 }
   1165 
   1166 const char *LLVMGetMDString(LLVMValueRef V, unsigned *Length) {
   1167   if (const auto *MD = dyn_cast<MetadataAsValue>(unwrap(V)))
   1168     if (const MDString *S = dyn_cast<MDString>(MD->getMetadata())) {
   1169       *Length = S->getString().size();
   1170       return S->getString().data();
   1171     }
   1172   *Length = 0;
   1173   return nullptr;
   1174 }
   1175 
   1176 unsigned LLVMGetMDNodeNumOperands(LLVMValueRef V) {
   1177   auto *MD = cast<MetadataAsValue>(unwrap(V));
   1178   if (isa<ValueAsMetadata>(MD->getMetadata()))
   1179     return 1;
   1180   return cast<MDNode>(MD->getMetadata())->getNumOperands();
   1181 }
   1182 
   1183 LLVMNamedMDNodeRef LLVMGetFirstNamedMetadata(LLVMModuleRef M) {
   1184   Module *Mod = unwrap(M);
   1185   Module::named_metadata_iterator I = Mod->named_metadata_begin();
   1186   if (I == Mod->named_metadata_end())
   1187     return nullptr;
   1188   return wrap(&*I);
   1189 }
   1190 
   1191 LLVMNamedMDNodeRef LLVMGetLastNamedMetadata(LLVMModuleRef M) {
   1192   Module *Mod = unwrap(M);
   1193   Module::named_metadata_iterator I = Mod->named_metadata_end();
   1194   if (I == Mod->named_metadata_begin())
   1195     return nullptr;
   1196   return wrap(&*--I);
   1197 }
   1198 
   1199 LLVMNamedMDNodeRef LLVMGetNextNamedMetadata(LLVMNamedMDNodeRef NMD) {
   1200   NamedMDNode *NamedNode = unwrap<NamedMDNode>(NMD);
   1201   Module::named_metadata_iterator I(NamedNode);
   1202   if (++I == NamedNode->getParent()->named_metadata_end())
   1203     return nullptr;
   1204   return wrap(&*I);
   1205 }
   1206 
   1207 LLVMNamedMDNodeRef LLVMGetPreviousNamedMetadata(LLVMNamedMDNodeRef NMD) {
   1208   NamedMDNode *NamedNode = unwrap<NamedMDNode>(NMD);
   1209   Module::named_metadata_iterator I(NamedNode);
   1210   if (I == NamedNode->getParent()->named_metadata_begin())
   1211     return nullptr;
   1212   return wrap(&*--I);
   1213 }
   1214 
   1215 LLVMNamedMDNodeRef LLVMGetNamedMetadata(LLVMModuleRef M,
   1216                                         const char *Name, size_t NameLen) {
   1217   return wrap(unwrap(M)->getNamedMetadata(StringRef(Name, NameLen)));
   1218 }
   1219 
   1220 LLVMNamedMDNodeRef LLVMGetOrInsertNamedMetadata(LLVMModuleRef M,
   1221                                                 const char *Name, size_t NameLen) {
   1222   return wrap(unwrap(M)->getOrInsertNamedMetadata({Name, NameLen}));
   1223 }
   1224 
   1225 const char *LLVMGetNamedMetadataName(LLVMNamedMDNodeRef NMD, size_t *NameLen) {
   1226   NamedMDNode *NamedNode = unwrap<NamedMDNode>(NMD);
   1227   *NameLen = NamedNode->getName().size();
   1228   return NamedNode->getName().data();
   1229 }
   1230 
   1231 void LLVMGetMDNodeOperands(LLVMValueRef V, LLVMValueRef *Dest) {
   1232   auto *MD = cast<MetadataAsValue>(unwrap(V));
   1233   if (auto *MDV = dyn_cast<ValueAsMetadata>(MD->getMetadata())) {
   1234     *Dest = wrap(MDV->getValue());
   1235     return;
   1236   }
   1237   const auto *N = cast<MDNode>(MD->getMetadata());
   1238   const unsigned numOperands = N->getNumOperands();
   1239   LLVMContext &Context = unwrap(V)->getContext();
   1240   for (unsigned i = 0; i < numOperands; i++)
   1241     Dest[i] = getMDNodeOperandImpl(Context, N, i);
   1242 }
   1243 
   1244 unsigned LLVMGetNamedMetadataNumOperands(LLVMModuleRef M, const char *Name) {
   1245   if (NamedMDNode *N = unwrap(M)->getNamedMetadata(Name)) {
   1246     return N->getNumOperands();
   1247   }
   1248   return 0;
   1249 }
   1250 
   1251 void LLVMGetNamedMetadataOperands(LLVMModuleRef M, const char *Name,
   1252                                   LLVMValueRef *Dest) {
   1253   NamedMDNode *N = unwrap(M)->getNamedMetadata(Name);
   1254   if (!N)
   1255     return;
   1256   LLVMContext &Context = unwrap(M)->getContext();
   1257   for (unsigned i=0;i<N->getNumOperands();i++)
   1258     Dest[i] = wrap(MetadataAsValue::get(Context, N->getOperand(i)));
   1259 }
   1260 
   1261 void LLVMAddNamedMetadataOperand(LLVMModuleRef M, const char *Name,
   1262                                  LLVMValueRef Val) {
   1263   NamedMDNode *N = unwrap(M)->getOrInsertNamedMetadata(Name);
   1264   if (!N)
   1265     return;
   1266   if (!Val)
   1267     return;
   1268   N->addOperand(extractMDNode(unwrap<MetadataAsValue>(Val)));
   1269 }
   1270 
   1271 const char *LLVMGetDebugLocDirectory(LLVMValueRef Val, unsigned *Length) {
   1272   if (!Length) return nullptr;
   1273   StringRef S;
   1274   if (const auto *I = dyn_cast<Instruction>(unwrap(Val))) {
   1275     if (const auto &DL = I->getDebugLoc()) {
   1276       S = DL->getDirectory();
   1277     }
   1278   } else if (const auto *GV = dyn_cast<GlobalVariable>(unwrap(Val))) {
   1279     SmallVector<DIGlobalVariableExpression *, 1> GVEs;
   1280     GV->getDebugInfo(GVEs);
   1281     if (GVEs.size())
   1282       if (const DIGlobalVariable *DGV = GVEs[0]->getVariable())
   1283         S = DGV->getDirectory();
   1284   } else if (const auto *F = dyn_cast<Function>(unwrap(Val))) {
   1285     if (const DISubprogram *DSP = F->getSubprogram())
   1286       S = DSP->getDirectory();
   1287   } else {
   1288     assert(0 && "Expected Instruction, GlobalVariable or Function");
   1289     return nullptr;
   1290   }
   1291   *Length = S.size();
   1292   return S.data();
   1293 }
   1294 
   1295 const char *LLVMGetDebugLocFilename(LLVMValueRef Val, unsigned *Length) {
   1296   if (!Length) return nullptr;
   1297   StringRef S;
   1298   if (const auto *I = dyn_cast<Instruction>(unwrap(Val))) {
   1299     if (const auto &DL = I->getDebugLoc()) {
   1300       S = DL->getFilename();
   1301     }
   1302   } else if (const auto *GV = dyn_cast<GlobalVariable>(unwrap(Val))) {
   1303     SmallVector<DIGlobalVariableExpression *, 1> GVEs;
   1304     GV->getDebugInfo(GVEs);
   1305     if (GVEs.size())
   1306       if (const DIGlobalVariable *DGV = GVEs[0]->getVariable())
   1307         S = DGV->getFilename();
   1308   } else if (const auto *F = dyn_cast<Function>(unwrap(Val))) {
   1309     if (const DISubprogram *DSP = F->getSubprogram())
   1310       S = DSP->getFilename();
   1311   } else {
   1312     assert(0 && "Expected Instruction, GlobalVariable or Function");
   1313     return nullptr;
   1314   }
   1315   *Length = S.size();
   1316   return S.data();
   1317 }
   1318 
   1319 unsigned LLVMGetDebugLocLine(LLVMValueRef Val) {
   1320   unsigned L = 0;
   1321   if (const auto *I = dyn_cast<Instruction>(unwrap(Val))) {
   1322     if (const auto &DL = I->getDebugLoc()) {
   1323       L = DL->getLine();
   1324     }
   1325   } else if (const auto *GV = dyn_cast<GlobalVariable>(unwrap(Val))) {
   1326     SmallVector<DIGlobalVariableExpression *, 1> GVEs;
   1327     GV->getDebugInfo(GVEs);
   1328     if (GVEs.size())
   1329       if (const DIGlobalVariable *DGV = GVEs[0]->getVariable())
   1330         L = DGV->getLine();
   1331   } else if (const auto *F = dyn_cast<Function>(unwrap(Val))) {
   1332     if (const DISubprogram *DSP = F->getSubprogram())
   1333       L = DSP->getLine();
   1334   } else {
   1335     assert(0 && "Expected Instruction, GlobalVariable or Function");
   1336     return -1;
   1337   }
   1338   return L;
   1339 }
   1340 
   1341 unsigned LLVMGetDebugLocColumn(LLVMValueRef Val) {
   1342   unsigned C = 0;
   1343   if (const auto *I = dyn_cast<Instruction>(unwrap(Val)))
   1344     if (const auto &DL = I->getDebugLoc())
   1345       C = DL->getColumn();
   1346   return C;
   1347 }
   1348 
   1349 /*--.. Operations on scalar constants ......................................--*/
   1350 
   1351 LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
   1352                           LLVMBool SignExtend) {
   1353   return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), N, SignExtend != 0));
   1354 }
   1355 
   1356 LLVMValueRef LLVMConstIntOfArbitraryPrecision(LLVMTypeRef IntTy,
   1357                                               unsigned NumWords,
   1358                                               const uint64_t Words[]) {
   1359     IntegerType *Ty = unwrap<IntegerType>(IntTy);
   1360     return wrap(ConstantInt::get(Ty->getContext(),
   1361                                  APInt(Ty->getBitWidth(),
   1362                                        makeArrayRef(Words, NumWords))));
   1363 }
   1364 
   1365 LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char Str[],
   1366                                   uint8_t Radix) {
   1367   return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str),
   1368                                Radix));
   1369 }
   1370 
   1371 LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char Str[],
   1372                                          unsigned SLen, uint8_t Radix) {
   1373   return wrap(ConstantInt::get(unwrap<IntegerType>(IntTy), StringRef(Str, SLen),
   1374                                Radix));
   1375 }
   1376 
   1377 LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N) {
   1378   return wrap(ConstantFP::get(unwrap(RealTy), N));
   1379 }
   1380 
   1381 LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text) {
   1382   return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Text)));
   1383 }
   1384 
   1385 LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char Str[],
   1386                                           unsigned SLen) {
   1387   return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Str, SLen)));
   1388 }
   1389 
   1390 unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal) {
   1391   return unwrap<ConstantInt>(ConstantVal)->getZExtValue();
   1392 }
   1393 
   1394 long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal) {
   1395   return unwrap<ConstantInt>(ConstantVal)->getSExtValue();
   1396 }
   1397 
   1398 double LLVMConstRealGetDouble(LLVMValueRef ConstantVal, LLVMBool *LosesInfo) {
   1399   ConstantFP *cFP = unwrap<ConstantFP>(ConstantVal) ;
   1400   Type *Ty = cFP->getType();
   1401 
   1402   if (Ty->isHalfTy() || Ty->isBFloatTy() || Ty->isFloatTy() ||
   1403       Ty->isDoubleTy()) {
   1404     *LosesInfo = false;
   1405     return cFP->getValueAPF().convertToDouble();
   1406   }
   1407 
   1408   bool APFLosesInfo;
   1409   APFloat APF = cFP->getValueAPF();
   1410   APF.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &APFLosesInfo);
   1411   *LosesInfo = APFLosesInfo;
   1412   return APF.convertToDouble();
   1413 }
   1414 
   1415 /*--.. Operations on composite constants ...................................--*/
   1416 
   1417 LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
   1418                                       unsigned Length,
   1419                                       LLVMBool DontNullTerminate) {
   1420   /* Inverted the sense of AddNull because ', 0)' is a
   1421      better mnemonic for null termination than ', 1)'. */
   1422   return wrap(ConstantDataArray::getString(*unwrap(C), StringRef(Str, Length),
   1423                                            DontNullTerminate == 0));
   1424 }
   1425 
   1426 LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
   1427                              LLVMBool DontNullTerminate) {
   1428   return LLVMConstStringInContext(LLVMGetGlobalContext(), Str, Length,
   1429                                   DontNullTerminate);
   1430 }
   1431 
   1432 LLVMValueRef LLVMGetElementAsConstant(LLVMValueRef C, unsigned idx) {
   1433   return wrap(unwrap<ConstantDataSequential>(C)->getElementAsConstant(idx));
   1434 }
   1435 
   1436 LLVMBool LLVMIsConstantString(LLVMValueRef C) {
   1437   return unwrap<ConstantDataSequential>(C)->isString();
   1438 }
   1439 
   1440 const char *LLVMGetAsString(LLVMValueRef C, size_t *Length) {
   1441   StringRef Str = unwrap<ConstantDataSequential>(C)->getAsString();
   1442   *Length = Str.size();
   1443   return Str.data();
   1444 }
   1445 
   1446 LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
   1447                             LLVMValueRef *ConstantVals, unsigned Length) {
   1448   ArrayRef<Constant*> V(unwrap<Constant>(ConstantVals, Length), Length);
   1449   return wrap(ConstantArray::get(ArrayType::get(unwrap(ElementTy), Length), V));
   1450 }
   1451 
   1452 LLVMValueRef LLVMConstStructInContext(LLVMContextRef C,
   1453                                       LLVMValueRef *ConstantVals,
   1454                                       unsigned Count, LLVMBool Packed) {
   1455   Constant **Elements = unwrap<Constant>(ConstantVals, Count);
   1456   return wrap(ConstantStruct::getAnon(*unwrap(C), makeArrayRef(Elements, Count),
   1457                                       Packed != 0));
   1458 }
   1459 
   1460 LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
   1461                              LLVMBool Packed) {
   1462   return LLVMConstStructInContext(LLVMGetGlobalContext(), ConstantVals, Count,
   1463                                   Packed);
   1464 }
   1465 
   1466 LLVMValueRef LLVMConstNamedStruct(LLVMTypeRef StructTy,
   1467                                   LLVMValueRef *ConstantVals,
   1468                                   unsigned Count) {
   1469   Constant **Elements = unwrap<Constant>(ConstantVals, Count);
   1470   StructType *Ty = cast<StructType>(unwrap(StructTy));
   1471 
   1472   return wrap(ConstantStruct::get(Ty, makeArrayRef(Elements, Count)));
   1473 }
   1474 
   1475 LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size) {
   1476   return wrap(ConstantVector::get(makeArrayRef(
   1477                             unwrap<Constant>(ScalarConstantVals, Size), Size)));
   1478 }
   1479 
   1480 /*-- Opcode mapping */
   1481 
   1482 static LLVMOpcode map_to_llvmopcode(int opcode)
   1483 {
   1484     switch (opcode) {
   1485       default: llvm_unreachable("Unhandled Opcode.");
   1486 #define HANDLE_INST(num, opc, clas) case num: return LLVM##opc;
   1487 #include "llvm/IR/Instruction.def"
   1488 #undef HANDLE_INST
   1489     }
   1490 }
   1491 
   1492 static int map_from_llvmopcode(LLVMOpcode code)
   1493 {
   1494     switch (code) {
   1495 #define HANDLE_INST(num, opc, clas) case LLVM##opc: return num;
   1496 #include "llvm/IR/Instruction.def"
   1497 #undef HANDLE_INST
   1498     }
   1499     llvm_unreachable("Unhandled Opcode.");
   1500 }
   1501 
   1502 /*--.. Constant expressions ................................................--*/
   1503 
   1504 LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal) {
   1505   return map_to_llvmopcode(unwrap<ConstantExpr>(ConstantVal)->getOpcode());
   1506 }
   1507 
   1508 LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty) {
   1509   return wrap(ConstantExpr::getAlignOf(unwrap(Ty)));
   1510 }
   1511 
   1512 LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty) {
   1513   return wrap(ConstantExpr::getSizeOf(unwrap(Ty)));
   1514 }
   1515 
   1516 LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal) {
   1517   return wrap(ConstantExpr::getNeg(unwrap<Constant>(ConstantVal)));
   1518 }
   1519 
   1520 LLVMValueRef LLVMConstNSWNeg(LLVMValueRef ConstantVal) {
   1521   return wrap(ConstantExpr::getNSWNeg(unwrap<Constant>(ConstantVal)));
   1522 }
   1523 
   1524 LLVMValueRef LLVMConstNUWNeg(LLVMValueRef ConstantVal) {
   1525   return wrap(ConstantExpr::getNUWNeg(unwrap<Constant>(ConstantVal)));
   1526 }
   1527 
   1528 
   1529 LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal) {
   1530   return wrap(ConstantExpr::getFNeg(unwrap<Constant>(ConstantVal)));
   1531 }
   1532 
   1533 LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal) {
   1534   return wrap(ConstantExpr::getNot(unwrap<Constant>(ConstantVal)));
   1535 }
   1536 
   1537 LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1538   return wrap(ConstantExpr::getAdd(unwrap<Constant>(LHSConstant),
   1539                                    unwrap<Constant>(RHSConstant)));
   1540 }
   1541 
   1542 LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant,
   1543                              LLVMValueRef RHSConstant) {
   1544   return wrap(ConstantExpr::getNSWAdd(unwrap<Constant>(LHSConstant),
   1545                                       unwrap<Constant>(RHSConstant)));
   1546 }
   1547 
   1548 LLVMValueRef LLVMConstNUWAdd(LLVMValueRef LHSConstant,
   1549                              LLVMValueRef RHSConstant) {
   1550   return wrap(ConstantExpr::getNUWAdd(unwrap<Constant>(LHSConstant),
   1551                                       unwrap<Constant>(RHSConstant)));
   1552 }
   1553 
   1554 LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1555   return wrap(ConstantExpr::getFAdd(unwrap<Constant>(LHSConstant),
   1556                                     unwrap<Constant>(RHSConstant)));
   1557 }
   1558 
   1559 LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1560   return wrap(ConstantExpr::getSub(unwrap<Constant>(LHSConstant),
   1561                                    unwrap<Constant>(RHSConstant)));
   1562 }
   1563 
   1564 LLVMValueRef LLVMConstNSWSub(LLVMValueRef LHSConstant,
   1565                              LLVMValueRef RHSConstant) {
   1566   return wrap(ConstantExpr::getNSWSub(unwrap<Constant>(LHSConstant),
   1567                                       unwrap<Constant>(RHSConstant)));
   1568 }
   1569 
   1570 LLVMValueRef LLVMConstNUWSub(LLVMValueRef LHSConstant,
   1571                              LLVMValueRef RHSConstant) {
   1572   return wrap(ConstantExpr::getNUWSub(unwrap<Constant>(LHSConstant),
   1573                                       unwrap<Constant>(RHSConstant)));
   1574 }
   1575 
   1576 LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1577   return wrap(ConstantExpr::getFSub(unwrap<Constant>(LHSConstant),
   1578                                     unwrap<Constant>(RHSConstant)));
   1579 }
   1580 
   1581 LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1582   return wrap(ConstantExpr::getMul(unwrap<Constant>(LHSConstant),
   1583                                    unwrap<Constant>(RHSConstant)));
   1584 }
   1585 
   1586 LLVMValueRef LLVMConstNSWMul(LLVMValueRef LHSConstant,
   1587                              LLVMValueRef RHSConstant) {
   1588   return wrap(ConstantExpr::getNSWMul(unwrap<Constant>(LHSConstant),
   1589                                       unwrap<Constant>(RHSConstant)));
   1590 }
   1591 
   1592 LLVMValueRef LLVMConstNUWMul(LLVMValueRef LHSConstant,
   1593                              LLVMValueRef RHSConstant) {
   1594   return wrap(ConstantExpr::getNUWMul(unwrap<Constant>(LHSConstant),
   1595                                       unwrap<Constant>(RHSConstant)));
   1596 }
   1597 
   1598 LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1599   return wrap(ConstantExpr::getFMul(unwrap<Constant>(LHSConstant),
   1600                                     unwrap<Constant>(RHSConstant)));
   1601 }
   1602 
   1603 LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1604   return wrap(ConstantExpr::getUDiv(unwrap<Constant>(LHSConstant),
   1605                                     unwrap<Constant>(RHSConstant)));
   1606 }
   1607 
   1608 LLVMValueRef LLVMConstExactUDiv(LLVMValueRef LHSConstant,
   1609                                 LLVMValueRef RHSConstant) {
   1610   return wrap(ConstantExpr::getExactUDiv(unwrap<Constant>(LHSConstant),
   1611                                          unwrap<Constant>(RHSConstant)));
   1612 }
   1613 
   1614 LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1615   return wrap(ConstantExpr::getSDiv(unwrap<Constant>(LHSConstant),
   1616                                     unwrap<Constant>(RHSConstant)));
   1617 }
   1618 
   1619 LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant,
   1620                                 LLVMValueRef RHSConstant) {
   1621   return wrap(ConstantExpr::getExactSDiv(unwrap<Constant>(LHSConstant),
   1622                                          unwrap<Constant>(RHSConstant)));
   1623 }
   1624 
   1625 LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1626   return wrap(ConstantExpr::getFDiv(unwrap<Constant>(LHSConstant),
   1627                                     unwrap<Constant>(RHSConstant)));
   1628 }
   1629 
   1630 LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1631   return wrap(ConstantExpr::getURem(unwrap<Constant>(LHSConstant),
   1632                                     unwrap<Constant>(RHSConstant)));
   1633 }
   1634 
   1635 LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1636   return wrap(ConstantExpr::getSRem(unwrap<Constant>(LHSConstant),
   1637                                     unwrap<Constant>(RHSConstant)));
   1638 }
   1639 
   1640 LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1641   return wrap(ConstantExpr::getFRem(unwrap<Constant>(LHSConstant),
   1642                                     unwrap<Constant>(RHSConstant)));
   1643 }
   1644 
   1645 LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1646   return wrap(ConstantExpr::getAnd(unwrap<Constant>(LHSConstant),
   1647                                    unwrap<Constant>(RHSConstant)));
   1648 }
   1649 
   1650 LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1651   return wrap(ConstantExpr::getOr(unwrap<Constant>(LHSConstant),
   1652                                   unwrap<Constant>(RHSConstant)));
   1653 }
   1654 
   1655 LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1656   return wrap(ConstantExpr::getXor(unwrap<Constant>(LHSConstant),
   1657                                    unwrap<Constant>(RHSConstant)));
   1658 }
   1659 
   1660 LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
   1661                            LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1662   return wrap(ConstantExpr::getICmp(Predicate,
   1663                                     unwrap<Constant>(LHSConstant),
   1664                                     unwrap<Constant>(RHSConstant)));
   1665 }
   1666 
   1667 LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
   1668                            LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1669   return wrap(ConstantExpr::getFCmp(Predicate,
   1670                                     unwrap<Constant>(LHSConstant),
   1671                                     unwrap<Constant>(RHSConstant)));
   1672 }
   1673 
   1674 LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1675   return wrap(ConstantExpr::getShl(unwrap<Constant>(LHSConstant),
   1676                                    unwrap<Constant>(RHSConstant)));
   1677 }
   1678 
   1679 LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1680   return wrap(ConstantExpr::getLShr(unwrap<Constant>(LHSConstant),
   1681                                     unwrap<Constant>(RHSConstant)));
   1682 }
   1683 
   1684 LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant) {
   1685   return wrap(ConstantExpr::getAShr(unwrap<Constant>(LHSConstant),
   1686                                     unwrap<Constant>(RHSConstant)));
   1687 }
   1688 
   1689 LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
   1690                           LLVMValueRef *ConstantIndices, unsigned NumIndices) {
   1691   ArrayRef<Constant *> IdxList(unwrap<Constant>(ConstantIndices, NumIndices),
   1692                                NumIndices);
   1693   Constant *Val = unwrap<Constant>(ConstantVal);
   1694   Type *Ty =
   1695       cast<PointerType>(Val->getType()->getScalarType())->getElementType();
   1696   return wrap(ConstantExpr::getGetElementPtr(Ty, Val, IdxList));
   1697 }
   1698 
   1699 LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
   1700                                   LLVMValueRef *ConstantIndices,
   1701                                   unsigned NumIndices) {
   1702   ArrayRef<Constant *> IdxList(unwrap<Constant>(ConstantIndices, NumIndices),
   1703                                NumIndices);
   1704   Constant *Val = unwrap<Constant>(ConstantVal);
   1705   Type *Ty =
   1706       cast<PointerType>(Val->getType()->getScalarType())->getElementType();
   1707   return wrap(ConstantExpr::getInBoundsGetElementPtr(Ty, Val, IdxList));
   1708 }
   1709 
   1710 LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
   1711   return wrap(ConstantExpr::getTrunc(unwrap<Constant>(ConstantVal),
   1712                                      unwrap(ToType)));
   1713 }
   1714 
   1715 LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
   1716   return wrap(ConstantExpr::getSExt(unwrap<Constant>(ConstantVal),
   1717                                     unwrap(ToType)));
   1718 }
   1719 
   1720 LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
   1721   return wrap(ConstantExpr::getZExt(unwrap<Constant>(ConstantVal),
   1722                                     unwrap(ToType)));
   1723 }
   1724 
   1725 LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
   1726   return wrap(ConstantExpr::getFPTrunc(unwrap<Constant>(ConstantVal),
   1727                                        unwrap(ToType)));
   1728 }
   1729 
   1730 LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
   1731   return wrap(ConstantExpr::getFPExtend(unwrap<Constant>(ConstantVal),
   1732                                         unwrap(ToType)));
   1733 }
   1734 
   1735 LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
   1736   return wrap(ConstantExpr::getUIToFP(unwrap<Constant>(ConstantVal),
   1737                                       unwrap(ToType)));
   1738 }
   1739 
   1740 LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
   1741   return wrap(ConstantExpr::getSIToFP(unwrap<Constant>(ConstantVal),
   1742                                       unwrap(ToType)));
   1743 }
   1744 
   1745 LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
   1746   return wrap(ConstantExpr::getFPToUI(unwrap<Constant>(ConstantVal),
   1747                                       unwrap(ToType)));
   1748 }
   1749 
   1750 LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
   1751   return wrap(ConstantExpr::getFPToSI(unwrap<Constant>(ConstantVal),
   1752                                       unwrap(ToType)));
   1753 }
   1754 
   1755 LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
   1756   return wrap(ConstantExpr::getPtrToInt(unwrap<Constant>(ConstantVal),
   1757                                         unwrap(ToType)));
   1758 }
   1759 
   1760 LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
   1761   return wrap(ConstantExpr::getIntToPtr(unwrap<Constant>(ConstantVal),
   1762                                         unwrap(ToType)));
   1763 }
   1764 
   1765 LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
   1766   return wrap(ConstantExpr::getBitCast(unwrap<Constant>(ConstantVal),
   1767                                        unwrap(ToType)));
   1768 }
   1769 
   1770 LLVMValueRef LLVMConstAddrSpaceCast(LLVMValueRef ConstantVal,
   1771                                     LLVMTypeRef ToType) {
   1772   return wrap(ConstantExpr::getAddrSpaceCast(unwrap<Constant>(ConstantVal),
   1773                                              unwrap(ToType)));
   1774 }
   1775 
   1776 LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
   1777                                     LLVMTypeRef ToType) {
   1778   return wrap(ConstantExpr::getZExtOrBitCast(unwrap<Constant>(ConstantVal),
   1779                                              unwrap(ToType)));
   1780 }
   1781 
   1782 LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
   1783                                     LLVMTypeRef ToType) {
   1784   return wrap(ConstantExpr::getSExtOrBitCast(unwrap<Constant>(ConstantVal),
   1785                                              unwrap(ToType)));
   1786 }
   1787 
   1788 LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
   1789                                      LLVMTypeRef ToType) {
   1790   return wrap(ConstantExpr::getTruncOrBitCast(unwrap<Constant>(ConstantVal),
   1791                                               unwrap(ToType)));
   1792 }
   1793 
   1794 LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
   1795                                   LLVMTypeRef ToType) {
   1796   return wrap(ConstantExpr::getPointerCast(unwrap<Constant>(ConstantVal),
   1797                                            unwrap(ToType)));
   1798 }
   1799 
   1800 LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
   1801                               LLVMBool isSigned) {
   1802   return wrap(ConstantExpr::getIntegerCast(unwrap<Constant>(ConstantVal),
   1803                                            unwrap(ToType), isSigned));
   1804 }
   1805 
   1806 LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType) {
   1807   return wrap(ConstantExpr::getFPCast(unwrap<Constant>(ConstantVal),
   1808                                       unwrap(ToType)));
   1809 }
   1810 
   1811 LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
   1812                              LLVMValueRef ConstantIfTrue,
   1813                              LLVMValueRef ConstantIfFalse) {
   1814   return wrap(ConstantExpr::getSelect(unwrap<Constant>(ConstantCondition),
   1815                                       unwrap<Constant>(ConstantIfTrue),
   1816                                       unwrap<Constant>(ConstantIfFalse)));
   1817 }
   1818 
   1819 LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
   1820                                      LLVMValueRef IndexConstant) {
   1821   return wrap(ConstantExpr::getExtractElement(unwrap<Constant>(VectorConstant),
   1822                                               unwrap<Constant>(IndexConstant)));
   1823 }
   1824 
   1825 LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
   1826                                     LLVMValueRef ElementValueConstant,
   1827                                     LLVMValueRef IndexConstant) {
   1828   return wrap(ConstantExpr::getInsertElement(unwrap<Constant>(VectorConstant),
   1829                                          unwrap<Constant>(ElementValueConstant),
   1830                                              unwrap<Constant>(IndexConstant)));
   1831 }
   1832 
   1833 LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
   1834                                     LLVMValueRef VectorBConstant,
   1835                                     LLVMValueRef MaskConstant) {
   1836   SmallVector<int, 16> IntMask;
   1837   ShuffleVectorInst::getShuffleMask(unwrap<Constant>(MaskConstant), IntMask);
   1838   return wrap(ConstantExpr::getShuffleVector(unwrap<Constant>(VectorAConstant),
   1839                                              unwrap<Constant>(VectorBConstant),
   1840                                              IntMask));
   1841 }
   1842 
   1843 LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
   1844                                    unsigned NumIdx) {
   1845   return wrap(ConstantExpr::getExtractValue(unwrap<Constant>(AggConstant),
   1846                                             makeArrayRef(IdxList, NumIdx)));
   1847 }
   1848 
   1849 LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
   1850                                   LLVMValueRef ElementValueConstant,
   1851                                   unsigned *IdxList, unsigned NumIdx) {
   1852   return wrap(ConstantExpr::getInsertValue(unwrap<Constant>(AggConstant),
   1853                                          unwrap<Constant>(ElementValueConstant),
   1854                                            makeArrayRef(IdxList, NumIdx)));
   1855 }
   1856 
   1857 LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString,
   1858                                 const char *Constraints,
   1859                                 LLVMBool HasSideEffects,
   1860                                 LLVMBool IsAlignStack) {
   1861   return wrap(InlineAsm::get(dyn_cast<FunctionType>(unwrap(Ty)), AsmString,
   1862                              Constraints, HasSideEffects, IsAlignStack));
   1863 }
   1864 
   1865 LLVMValueRef LLVMBlockAddress(LLVMValueRef F, LLVMBasicBlockRef BB) {
   1866   return wrap(BlockAddress::get(unwrap<Function>(F), unwrap(BB)));
   1867 }
   1868 
   1869 /*--.. Operations on global variables, functions, and aliases (globals) ....--*/
   1870 
   1871 LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global) {
   1872   return wrap(unwrap<GlobalValue>(Global)->getParent());
   1873 }
   1874 
   1875 LLVMBool LLVMIsDeclaration(LLVMValueRef Global) {
   1876   return unwrap<GlobalValue>(Global)->isDeclaration();
   1877 }
   1878 
   1879 LLVMLinkage LLVMGetLinkage(LLVMValueRef Global) {
   1880   switch (unwrap<GlobalValue>(Global)->getLinkage()) {
   1881   case GlobalValue::ExternalLinkage:
   1882     return LLVMExternalLinkage;
   1883   case GlobalValue::AvailableExternallyLinkage:
   1884     return LLVMAvailableExternallyLinkage;
   1885   case GlobalValue::LinkOnceAnyLinkage:
   1886     return LLVMLinkOnceAnyLinkage;
   1887   case GlobalValue::LinkOnceODRLinkage:
   1888     return LLVMLinkOnceODRLinkage;
   1889   case GlobalValue::WeakAnyLinkage:
   1890     return LLVMWeakAnyLinkage;
   1891   case GlobalValue::WeakODRLinkage:
   1892     return LLVMWeakODRLinkage;
   1893   case GlobalValue::AppendingLinkage:
   1894     return LLVMAppendingLinkage;
   1895   case GlobalValue::InternalLinkage:
   1896     return LLVMInternalLinkage;
   1897   case GlobalValue::PrivateLinkage:
   1898     return LLVMPrivateLinkage;
   1899   case GlobalValue::ExternalWeakLinkage:
   1900     return LLVMExternalWeakLinkage;
   1901   case GlobalValue::CommonLinkage:
   1902     return LLVMCommonLinkage;
   1903   }
   1904 
   1905   llvm_unreachable("Invalid GlobalValue linkage!");
   1906 }
   1907 
   1908 void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage) {
   1909   GlobalValue *GV = unwrap<GlobalValue>(Global);
   1910 
   1911   switch (Linkage) {
   1912   case LLVMExternalLinkage:
   1913     GV->setLinkage(GlobalValue::ExternalLinkage);
   1914     break;
   1915   case LLVMAvailableExternallyLinkage:
   1916     GV->setLinkage(GlobalValue::AvailableExternallyLinkage);
   1917     break;
   1918   case LLVMLinkOnceAnyLinkage:
   1919     GV->setLinkage(GlobalValue::LinkOnceAnyLinkage);
   1920     break;
   1921   case LLVMLinkOnceODRLinkage:
   1922     GV->setLinkage(GlobalValue::LinkOnceODRLinkage);
   1923     break;
   1924   case LLVMLinkOnceODRAutoHideLinkage:
   1925     LLVM_DEBUG(
   1926         errs() << "LLVMSetLinkage(): LLVMLinkOnceODRAutoHideLinkage is no "
   1927                   "longer supported.");
   1928     break;
   1929   case LLVMWeakAnyLinkage:
   1930     GV->setLinkage(GlobalValue::WeakAnyLinkage);
   1931     break;
   1932   case LLVMWeakODRLinkage:
   1933     GV->setLinkage(GlobalValue::WeakODRLinkage);
   1934     break;
   1935   case LLVMAppendingLinkage:
   1936     GV->setLinkage(GlobalValue::AppendingLinkage);
   1937     break;
   1938   case LLVMInternalLinkage:
   1939     GV->setLinkage(GlobalValue::InternalLinkage);
   1940     break;
   1941   case LLVMPrivateLinkage:
   1942     GV->setLinkage(GlobalValue::PrivateLinkage);
   1943     break;
   1944   case LLVMLinkerPrivateLinkage:
   1945     GV->setLinkage(GlobalValue::PrivateLinkage);
   1946     break;
   1947   case LLVMLinkerPrivateWeakLinkage:
   1948     GV->setLinkage(GlobalValue::PrivateLinkage);
   1949     break;
   1950   case LLVMDLLImportLinkage:
   1951     LLVM_DEBUG(
   1952         errs()
   1953         << "LLVMSetLinkage(): LLVMDLLImportLinkage is no longer supported.");
   1954     break;
   1955   case LLVMDLLExportLinkage:
   1956     LLVM_DEBUG(
   1957         errs()
   1958         << "LLVMSetLinkage(): LLVMDLLExportLinkage is no longer supported.");
   1959     break;
   1960   case LLVMExternalWeakLinkage:
   1961     GV->setLinkage(GlobalValue::ExternalWeakLinkage);
   1962     break;
   1963   case LLVMGhostLinkage:
   1964     LLVM_DEBUG(
   1965         errs() << "LLVMSetLinkage(): LLVMGhostLinkage is no longer supported.");
   1966     break;
   1967   case LLVMCommonLinkage:
   1968     GV->setLinkage(GlobalValue::CommonLinkage);
   1969     break;
   1970   }
   1971 }
   1972 
   1973 const char *LLVMGetSection(LLVMValueRef Global) {
   1974   // Using .data() is safe because of how GlobalObject::setSection is
   1975   // implemented.
   1976   return unwrap<GlobalValue>(Global)->getSection().data();
   1977 }
   1978 
   1979 void LLVMSetSection(LLVMValueRef Global, const char *Section) {
   1980   unwrap<GlobalObject>(Global)->setSection(Section);
   1981 }
   1982 
   1983 LLVMVisibility LLVMGetVisibility(LLVMValueRef Global) {
   1984   return static_cast<LLVMVisibility>(
   1985     unwrap<GlobalValue>(Global)->getVisibility());
   1986 }
   1987 
   1988 void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz) {
   1989   unwrap<GlobalValue>(Global)
   1990     ->setVisibility(static_cast<GlobalValue::VisibilityTypes>(Viz));
   1991 }
   1992 
   1993 LLVMDLLStorageClass LLVMGetDLLStorageClass(LLVMValueRef Global) {
   1994   return static_cast<LLVMDLLStorageClass>(
   1995       unwrap<GlobalValue>(Global)->getDLLStorageClass());
   1996 }
   1997 
   1998 void LLVMSetDLLStorageClass(LLVMValueRef Global, LLVMDLLStorageClass Class) {
   1999   unwrap<GlobalValue>(Global)->setDLLStorageClass(
   2000       static_cast<GlobalValue::DLLStorageClassTypes>(Class));
   2001 }
   2002 
   2003 LLVMUnnamedAddr LLVMGetUnnamedAddress(LLVMValueRef Global) {
   2004   switch (unwrap<GlobalValue>(Global)->getUnnamedAddr()) {
   2005   case GlobalVariable::UnnamedAddr::None:
   2006     return LLVMNoUnnamedAddr;
   2007   case GlobalVariable::UnnamedAddr::Local:
   2008     return LLVMLocalUnnamedAddr;
   2009   case GlobalVariable::UnnamedAddr::Global:
   2010     return LLVMGlobalUnnamedAddr;
   2011   }
   2012   llvm_unreachable("Unknown UnnamedAddr kind!");
   2013 }
   2014 
   2015 void LLVMSetUnnamedAddress(LLVMValueRef Global, LLVMUnnamedAddr UnnamedAddr) {
   2016   GlobalValue *GV = unwrap<GlobalValue>(Global);
   2017 
   2018   switch (UnnamedAddr) {
   2019   case LLVMNoUnnamedAddr:
   2020     return GV->setUnnamedAddr(GlobalVariable::UnnamedAddr::None);
   2021   case LLVMLocalUnnamedAddr:
   2022     return GV->setUnnamedAddr(GlobalVariable::UnnamedAddr::Local);
   2023   case LLVMGlobalUnnamedAddr:
   2024     return GV->setUnnamedAddr(GlobalVariable::UnnamedAddr::Global);
   2025   }
   2026 }
   2027 
   2028 LLVMBool LLVMHasUnnamedAddr(LLVMValueRef Global) {
   2029   return unwrap<GlobalValue>(Global)->hasGlobalUnnamedAddr();
   2030 }
   2031 
   2032 void LLVMSetUnnamedAddr(LLVMValueRef Global, LLVMBool HasUnnamedAddr) {
   2033   unwrap<GlobalValue>(Global)->setUnnamedAddr(
   2034       HasUnnamedAddr ? GlobalValue::UnnamedAddr::Global
   2035                      : GlobalValue::UnnamedAddr::None);
   2036 }
   2037 
   2038 LLVMTypeRef LLVMGlobalGetValueType(LLVMValueRef Global) {
   2039   return wrap(unwrap<GlobalValue>(Global)->getValueType());
   2040 }
   2041 
   2042 /*--.. Operations on global variables, load and store instructions .........--*/
   2043 
   2044 unsigned LLVMGetAlignment(LLVMValueRef V) {
   2045   Value *P = unwrap<Value>(V);
   2046   if (GlobalObject *GV = dyn_cast<GlobalObject>(P))
   2047     return GV->getAlignment();
   2048   if (AllocaInst *AI = dyn_cast<AllocaInst>(P))
   2049     return AI->getAlignment();
   2050   if (LoadInst *LI = dyn_cast<LoadInst>(P))
   2051     return LI->getAlignment();
   2052   if (StoreInst *SI = dyn_cast<StoreInst>(P))
   2053     return SI->getAlignment();
   2054   if (AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(P))
   2055     return RMWI->getAlign().value();
   2056   if (AtomicCmpXchgInst *CXI = dyn_cast<AtomicCmpXchgInst>(P))
   2057     return CXI->getAlign().value();
   2058 
   2059   llvm_unreachable(
   2060       "only GlobalValue, AllocaInst, LoadInst, StoreInst, AtomicRMWInst, "
   2061       "and AtomicCmpXchgInst have alignment");
   2062 }
   2063 
   2064 void LLVMSetAlignment(LLVMValueRef V, unsigned Bytes) {
   2065   Value *P = unwrap<Value>(V);
   2066   if (GlobalObject *GV = dyn_cast<GlobalObject>(P))
   2067     GV->setAlignment(MaybeAlign(Bytes));
   2068   else if (AllocaInst *AI = dyn_cast<AllocaInst>(P))
   2069     AI->setAlignment(Align(Bytes));
   2070   else if (LoadInst *LI = dyn_cast<LoadInst>(P))
   2071     LI->setAlignment(Align(Bytes));
   2072   else if (StoreInst *SI = dyn_cast<StoreInst>(P))
   2073     SI->setAlignment(Align(Bytes));
   2074   else if (AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(P))
   2075     RMWI->setAlignment(Align(Bytes));
   2076   else if (AtomicCmpXchgInst *CXI = dyn_cast<AtomicCmpXchgInst>(P))
   2077     CXI->setAlignment(Align(Bytes));
   2078   else
   2079     llvm_unreachable(
   2080         "only GlobalValue, AllocaInst, LoadInst, StoreInst, AtomicRMWInst, and "
   2081         "and AtomicCmpXchgInst have alignment");
   2082 }
   2083 
   2084 LLVMValueMetadataEntry *LLVMGlobalCopyAllMetadata(LLVMValueRef Value,
   2085                                                   size_t *NumEntries) {
   2086   return llvm_getMetadata(NumEntries, [&Value](MetadataEntries &Entries) {
   2087     Entries.clear();
   2088     if (Instruction *Instr = dyn_cast<Instruction>(unwrap(Value))) {
   2089       Instr->getAllMetadata(Entries);
   2090     } else {
   2091       unwrap<GlobalObject>(Value)->getAllMetadata(Entries);
   2092     }
   2093   });
   2094 }
   2095 
   2096 unsigned LLVMValueMetadataEntriesGetKind(LLVMValueMetadataEntry *Entries,
   2097                                          unsigned Index) {
   2098   LLVMOpaqueValueMetadataEntry MVE =
   2099       static_cast<LLVMOpaqueValueMetadataEntry>(Entries[Index]);
   2100   return MVE.Kind;
   2101 }
   2102 
   2103 LLVMMetadataRef
   2104 LLVMValueMetadataEntriesGetMetadata(LLVMValueMetadataEntry *Entries,
   2105                                     unsigned Index) {
   2106   LLVMOpaqueValueMetadataEntry MVE =
   2107       static_cast<LLVMOpaqueValueMetadataEntry>(Entries[Index]);
   2108   return MVE.Metadata;
   2109 }
   2110 
   2111 void LLVMDisposeValueMetadataEntries(LLVMValueMetadataEntry *Entries) {
   2112   free(Entries);
   2113 }
   2114 
   2115 void LLVMGlobalSetMetadata(LLVMValueRef Global, unsigned Kind,
   2116                            LLVMMetadataRef MD) {
   2117   unwrap<GlobalObject>(Global)->setMetadata(Kind, unwrap<MDNode>(MD));
   2118 }
   2119 
   2120 void LLVMGlobalEraseMetadata(LLVMValueRef Global, unsigned Kind) {
   2121   unwrap<GlobalObject>(Global)->eraseMetadata(Kind);
   2122 }
   2123 
   2124 void LLVMGlobalClearMetadata(LLVMValueRef Global) {
   2125   unwrap<GlobalObject>(Global)->clearMetadata();
   2126 }
   2127 
   2128 /*--.. Operations on global variables ......................................--*/
   2129 
   2130 LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name) {
   2131   return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false,
   2132                                  GlobalValue::ExternalLinkage, nullptr, Name));
   2133 }
   2134 
   2135 LLVMValueRef LLVMAddGlobalInAddressSpace(LLVMModuleRef M, LLVMTypeRef Ty,
   2136                                          const char *Name,
   2137                                          unsigned AddressSpace) {
   2138   return wrap(new GlobalVariable(*unwrap(M), unwrap(Ty), false,
   2139                                  GlobalValue::ExternalLinkage, nullptr, Name,
   2140                                  nullptr, GlobalVariable::NotThreadLocal,
   2141                                  AddressSpace));
   2142 }
   2143 
   2144 LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name) {
   2145   return wrap(unwrap(M)->getNamedGlobal(Name));
   2146 }
   2147 
   2148 LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M) {
   2149   Module *Mod = unwrap(M);
   2150   Module::global_iterator I = Mod->global_begin();
   2151   if (I == Mod->global_end())
   2152     return nullptr;
   2153   return wrap(&*I);
   2154 }
   2155 
   2156 LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M) {
   2157   Module *Mod = unwrap(M);
   2158   Module::global_iterator I = Mod->global_end();
   2159   if (I == Mod->global_begin())
   2160     return nullptr;
   2161   return wrap(&*--I);
   2162 }
   2163 
   2164 LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar) {
   2165   GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
   2166   Module::global_iterator I(GV);
   2167   if (++I == GV->getParent()->global_end())
   2168     return nullptr;
   2169   return wrap(&*I);
   2170 }
   2171 
   2172 LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar) {
   2173   GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
   2174   Module::global_iterator I(GV);
   2175   if (I == GV->getParent()->global_begin())
   2176     return nullptr;
   2177   return wrap(&*--I);
   2178 }
   2179 
   2180 void LLVMDeleteGlobal(LLVMValueRef GlobalVar) {
   2181   unwrap<GlobalVariable>(GlobalVar)->eraseFromParent();
   2182 }
   2183 
   2184 LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar) {
   2185   GlobalVariable* GV = unwrap<GlobalVariable>(GlobalVar);
   2186   if ( !GV->hasInitializer() )
   2187     return nullptr;
   2188   return wrap(GV->getInitializer());
   2189 }
   2190 
   2191 void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal) {
   2192   unwrap<GlobalVariable>(GlobalVar)
   2193     ->setInitializer(unwrap<Constant>(ConstantVal));
   2194 }
   2195 
   2196 LLVMBool LLVMIsThreadLocal(LLVMValueRef GlobalVar) {
   2197   return unwrap<GlobalVariable>(GlobalVar)->isThreadLocal();
   2198 }
   2199 
   2200 void LLVMSetThreadLocal(LLVMValueRef GlobalVar, LLVMBool IsThreadLocal) {
   2201   unwrap<GlobalVariable>(GlobalVar)->setThreadLocal(IsThreadLocal != 0);
   2202 }
   2203 
   2204 LLVMBool LLVMIsGlobalConstant(LLVMValueRef GlobalVar) {
   2205   return unwrap<GlobalVariable>(GlobalVar)->isConstant();
   2206 }
   2207 
   2208 void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, LLVMBool IsConstant) {
   2209   unwrap<GlobalVariable>(GlobalVar)->setConstant(IsConstant != 0);
   2210 }
   2211 
   2212 LLVMThreadLocalMode LLVMGetThreadLocalMode(LLVMValueRef GlobalVar) {
   2213   switch (unwrap<GlobalVariable>(GlobalVar)->getThreadLocalMode()) {
   2214   case GlobalVariable::NotThreadLocal:
   2215     return LLVMNotThreadLocal;
   2216   case GlobalVariable::GeneralDynamicTLSModel:
   2217     return LLVMGeneralDynamicTLSModel;
   2218   case GlobalVariable::LocalDynamicTLSModel:
   2219     return LLVMLocalDynamicTLSModel;
   2220   case GlobalVariable::InitialExecTLSModel:
   2221     return LLVMInitialExecTLSModel;
   2222   case GlobalVariable::LocalExecTLSModel:
   2223     return LLVMLocalExecTLSModel;
   2224   }
   2225 
   2226   llvm_unreachable("Invalid GlobalVariable thread local mode");
   2227 }
   2228 
   2229 void LLVMSetThreadLocalMode(LLVMValueRef GlobalVar, LLVMThreadLocalMode Mode) {
   2230   GlobalVariable *GV = unwrap<GlobalVariable>(GlobalVar);
   2231 
   2232   switch (Mode) {
   2233   case LLVMNotThreadLocal:
   2234     GV->setThreadLocalMode(GlobalVariable::NotThreadLocal);
   2235     break;
   2236   case LLVMGeneralDynamicTLSModel:
   2237     GV->setThreadLocalMode(GlobalVariable::GeneralDynamicTLSModel);
   2238     break;
   2239   case LLVMLocalDynamicTLSModel:
   2240     GV->setThreadLocalMode(GlobalVariable::LocalDynamicTLSModel);
   2241     break;
   2242   case LLVMInitialExecTLSModel:
   2243     GV->setThreadLocalMode(GlobalVariable::InitialExecTLSModel);
   2244     break;
   2245   case LLVMLocalExecTLSModel:
   2246     GV->setThreadLocalMode(GlobalVariable::LocalExecTLSModel);
   2247     break;
   2248   }
   2249 }
   2250 
   2251 LLVMBool LLVMIsExternallyInitialized(LLVMValueRef GlobalVar) {
   2252   return unwrap<GlobalVariable>(GlobalVar)->isExternallyInitialized();
   2253 }
   2254 
   2255 void LLVMSetExternallyInitialized(LLVMValueRef GlobalVar, LLVMBool IsExtInit) {
   2256   unwrap<GlobalVariable>(GlobalVar)->setExternallyInitialized(IsExtInit);
   2257 }
   2258 
   2259 /*--.. Operations on aliases ......................................--*/
   2260 
   2261 LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
   2262                           const char *Name) {
   2263   auto *PTy = cast<PointerType>(unwrap(Ty));
   2264   return wrap(GlobalAlias::create(PTy->getElementType(), PTy->getAddressSpace(),
   2265                                   GlobalValue::ExternalLinkage, Name,
   2266                                   unwrap<Constant>(Aliasee), unwrap(M)));
   2267 }
   2268 
   2269 LLVMValueRef LLVMGetNamedGlobalAlias(LLVMModuleRef M,
   2270                                      const char *Name, size_t NameLen) {
   2271   return wrap(unwrap(M)->getNamedAlias(Name));
   2272 }
   2273 
   2274 LLVMValueRef LLVMGetFirstGlobalAlias(LLVMModuleRef M) {
   2275   Module *Mod = unwrap(M);
   2276   Module::alias_iterator I = Mod->alias_begin();
   2277   if (I == Mod->alias_end())
   2278     return nullptr;
   2279   return wrap(&*I);
   2280 }
   2281 
   2282 LLVMValueRef LLVMGetLastGlobalAlias(LLVMModuleRef M) {
   2283   Module *Mod = unwrap(M);
   2284   Module::alias_iterator I = Mod->alias_end();
   2285   if (I == Mod->alias_begin())
   2286     return nullptr;
   2287   return wrap(&*--I);
   2288 }
   2289 
   2290 LLVMValueRef LLVMGetNextGlobalAlias(LLVMValueRef GA) {
   2291   GlobalAlias *Alias = unwrap<GlobalAlias>(GA);
   2292   Module::alias_iterator I(Alias);
   2293   if (++I == Alias->getParent()->alias_end())
   2294     return nullptr;
   2295   return wrap(&*I);
   2296 }
   2297 
   2298 LLVMValueRef LLVMGetPreviousGlobalAlias(LLVMValueRef GA) {
   2299   GlobalAlias *Alias = unwrap<GlobalAlias>(GA);
   2300   Module::alias_iterator I(Alias);
   2301   if (I == Alias->getParent()->alias_begin())
   2302     return nullptr;
   2303   return wrap(&*--I);
   2304 }
   2305 
   2306 LLVMValueRef LLVMAliasGetAliasee(LLVMValueRef Alias) {
   2307   return wrap(unwrap<GlobalAlias>(Alias)->getAliasee());
   2308 }
   2309 
   2310 void LLVMAliasSetAliasee(LLVMValueRef Alias, LLVMValueRef Aliasee) {
   2311   unwrap<GlobalAlias>(Alias)->setAliasee(unwrap<Constant>(Aliasee));
   2312 }
   2313 
   2314 /*--.. Operations on functions .............................................--*/
   2315 
   2316 LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
   2317                              LLVMTypeRef FunctionTy) {
   2318   return wrap(Function::Create(unwrap<FunctionType>(FunctionTy),
   2319                                GlobalValue::ExternalLinkage, Name, unwrap(M)));
   2320 }
   2321 
   2322 LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name) {
   2323   return wrap(unwrap(M)->getFunction(Name));
   2324 }
   2325 
   2326 LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M) {
   2327   Module *Mod = unwrap(M);
   2328   Module::iterator I = Mod->begin();
   2329   if (I == Mod->end())
   2330     return nullptr;
   2331   return wrap(&*I);
   2332 }
   2333 
   2334 LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M) {
   2335   Module *Mod = unwrap(M);
   2336   Module::iterator I = Mod->end();
   2337   if (I == Mod->begin())
   2338     return nullptr;
   2339   return wrap(&*--I);
   2340 }
   2341 
   2342 LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn) {
   2343   Function *Func = unwrap<Function>(Fn);
   2344   Module::iterator I(Func);
   2345   if (++I == Func->getParent()->end())
   2346     return nullptr;
   2347   return wrap(&*I);
   2348 }
   2349 
   2350 LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn) {
   2351   Function *Func = unwrap<Function>(Fn);
   2352   Module::iterator I(Func);
   2353   if (I == Func->getParent()->begin())
   2354     return nullptr;
   2355   return wrap(&*--I);
   2356 }
   2357 
   2358 void LLVMDeleteFunction(LLVMValueRef Fn) {
   2359   unwrap<Function>(Fn)->eraseFromParent();
   2360 }
   2361 
   2362 LLVMBool LLVMHasPersonalityFn(LLVMValueRef Fn) {
   2363   return unwrap<Function>(Fn)->hasPersonalityFn();
   2364 }
   2365 
   2366 LLVMValueRef LLVMGetPersonalityFn(LLVMValueRef Fn) {
   2367   return wrap(unwrap<Function>(Fn)->getPersonalityFn());
   2368 }
   2369 
   2370 void LLVMSetPersonalityFn(LLVMValueRef Fn, LLVMValueRef PersonalityFn) {
   2371   unwrap<Function>(Fn)->setPersonalityFn(unwrap<Constant>(PersonalityFn));
   2372 }
   2373 
   2374 unsigned LLVMGetIntrinsicID(LLVMValueRef Fn) {
   2375   if (Function *F = dyn_cast<Function>(unwrap(Fn)))
   2376     return F->getIntrinsicID();
   2377   return 0;
   2378 }
   2379 
   2380 static Intrinsic::ID llvm_map_to_intrinsic_id(unsigned ID) {
   2381   assert(ID < llvm::Intrinsic::num_intrinsics && "Intrinsic ID out of range");
   2382   return llvm::Intrinsic::ID(ID);
   2383 }
   2384 
   2385 LLVMValueRef LLVMGetIntrinsicDeclaration(LLVMModuleRef Mod,
   2386                                          unsigned ID,
   2387                                          LLVMTypeRef *ParamTypes,
   2388                                          size_t ParamCount) {
   2389   ArrayRef<Type*> Tys(unwrap(ParamTypes), ParamCount);
   2390   auto IID = llvm_map_to_intrinsic_id(ID);
   2391   return wrap(llvm::Intrinsic::getDeclaration(unwrap(Mod), IID, Tys));
   2392 }
   2393 
   2394 const char *LLVMIntrinsicGetName(unsigned ID, size_t *NameLength) {
   2395   auto IID = llvm_map_to_intrinsic_id(ID);
   2396   auto Str = llvm::Intrinsic::getName(IID);
   2397   *NameLength = Str.size();
   2398   return Str.data();
   2399 }
   2400 
   2401 LLVMTypeRef LLVMIntrinsicGetType(LLVMContextRef Ctx, unsigned ID,
   2402                                  LLVMTypeRef *ParamTypes, size_t ParamCount) {
   2403   auto IID = llvm_map_to_intrinsic_id(ID);
   2404   ArrayRef<Type*> Tys(unwrap(ParamTypes), ParamCount);
   2405   return wrap(llvm::Intrinsic::getType(*unwrap(Ctx), IID, Tys));
   2406 }
   2407 
   2408 const char *LLVMIntrinsicCopyOverloadedName(unsigned ID,
   2409                                             LLVMTypeRef *ParamTypes,
   2410                                             size_t ParamCount,
   2411                                             size_t *NameLength) {
   2412   auto IID = llvm_map_to_intrinsic_id(ID);
   2413   ArrayRef<Type*> Tys(unwrap(ParamTypes), ParamCount);
   2414   auto Str = llvm::Intrinsic::getName(IID, Tys);
   2415   *NameLength = Str.length();
   2416   return strdup(Str.c_str());
   2417 }
   2418 
   2419 unsigned LLVMLookupIntrinsicID(const char *Name, size_t NameLen) {
   2420   return Function::lookupIntrinsicID({Name, NameLen});
   2421 }
   2422 
   2423 LLVMBool LLVMIntrinsicIsOverloaded(unsigned ID) {
   2424   auto IID = llvm_map_to_intrinsic_id(ID);
   2425   return llvm::Intrinsic::isOverloaded(IID);
   2426 }
   2427 
   2428 unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn) {
   2429   return unwrap<Function>(Fn)->getCallingConv();
   2430 }
   2431 
   2432 void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC) {
   2433   return unwrap<Function>(Fn)->setCallingConv(
   2434     static_cast<CallingConv::ID>(CC));
   2435 }
   2436 
   2437 const char *LLVMGetGC(LLVMValueRef Fn) {
   2438   Function *F = unwrap<Function>(Fn);
   2439   return F->hasGC()? F->getGC().c_str() : nullptr;
   2440 }
   2441 
   2442 void LLVMSetGC(LLVMValueRef Fn, const char *GC) {
   2443   Function *F = unwrap<Function>(Fn);
   2444   if (GC)
   2445     F->setGC(GC);
   2446   else
   2447     F->clearGC();
   2448 }
   2449 
   2450 void LLVMAddAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx,
   2451                              LLVMAttributeRef A) {
   2452   unwrap<Function>(F)->addAttribute(Idx, unwrap(A));
   2453 }
   2454 
   2455 unsigned LLVMGetAttributeCountAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx) {
   2456   auto AS = unwrap<Function>(F)->getAttributes().getAttributes(Idx);
   2457   return AS.getNumAttributes();
   2458 }
   2459 
   2460 void LLVMGetAttributesAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx,
   2461                               LLVMAttributeRef *Attrs) {
   2462   auto AS = unwrap<Function>(F)->getAttributes().getAttributes(Idx);
   2463   for (auto A : AS)
   2464     *Attrs++ = wrap(A);
   2465 }
   2466 
   2467 LLVMAttributeRef LLVMGetEnumAttributeAtIndex(LLVMValueRef F,
   2468                                              LLVMAttributeIndex Idx,
   2469                                              unsigned KindID) {
   2470   return wrap(unwrap<Function>(F)->getAttribute(Idx,
   2471                                                 (Attribute::AttrKind)KindID));
   2472 }
   2473 
   2474 LLVMAttributeRef LLVMGetStringAttributeAtIndex(LLVMValueRef F,
   2475                                                LLVMAttributeIndex Idx,
   2476                                                const char *K, unsigned KLen) {
   2477   return wrap(unwrap<Function>(F)->getAttribute(Idx, StringRef(K, KLen)));
   2478 }
   2479 
   2480 void LLVMRemoveEnumAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx,
   2481                                     unsigned KindID) {
   2482   unwrap<Function>(F)->removeAttribute(Idx, (Attribute::AttrKind)KindID);
   2483 }
   2484 
   2485 void LLVMRemoveStringAttributeAtIndex(LLVMValueRef F, LLVMAttributeIndex Idx,
   2486                                       const char *K, unsigned KLen) {
   2487   unwrap<Function>(F)->removeAttribute(Idx, StringRef(K, KLen));
   2488 }
   2489 
   2490 void LLVMAddTargetDependentFunctionAttr(LLVMValueRef Fn, const char *A,
   2491                                         const char *V) {
   2492   Function *Func = unwrap<Function>(Fn);
   2493   Attribute Attr = Attribute::get(Func->getContext(), A, V);
   2494   Func->addAttribute(AttributeList::FunctionIndex, Attr);
   2495 }
   2496 
   2497 /*--.. Operations on parameters ............................................--*/
   2498 
   2499 unsigned LLVMCountParams(LLVMValueRef FnRef) {
   2500   // This function is strictly redundant to
   2501   //   LLVMCountParamTypes(LLVMGetElementType(LLVMTypeOf(FnRef)))
   2502   return unwrap<Function>(FnRef)->arg_size();
   2503 }
   2504 
   2505 void LLVMGetParams(LLVMValueRef FnRef, LLVMValueRef *ParamRefs) {
   2506   Function *Fn = unwrap<Function>(FnRef);
   2507   for (Argument &A : Fn->args())
   2508     *ParamRefs++ = wrap(&A);
   2509 }
   2510 
   2511 LLVMValueRef LLVMGetParam(LLVMValueRef FnRef, unsigned index) {
   2512   Function *Fn = unwrap<Function>(FnRef);
   2513   return wrap(&Fn->arg_begin()[index]);
   2514 }
   2515 
   2516 LLVMValueRef LLVMGetParamParent(LLVMValueRef V) {
   2517   return wrap(unwrap<Argument>(V)->getParent());
   2518 }
   2519 
   2520 LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn) {
   2521   Function *Func = unwrap<Function>(Fn);
   2522   Function::arg_iterator I = Func->arg_begin();
   2523   if (I == Func->arg_end())
   2524     return nullptr;
   2525   return wrap(&*I);
   2526 }
   2527 
   2528 LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn) {
   2529   Function *Func = unwrap<Function>(Fn);
   2530   Function::arg_iterator I = Func->arg_end();
   2531   if (I == Func->arg_begin())
   2532     return nullptr;
   2533   return wrap(&*--I);
   2534 }
   2535 
   2536 LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg) {
   2537   Argument *A = unwrap<Argument>(Arg);
   2538   Function *Fn = A->getParent();
   2539   if (A->getArgNo() + 1 >= Fn->arg_size())
   2540     return nullptr;
   2541   return wrap(&Fn->arg_begin()[A->getArgNo() + 1]);
   2542 }
   2543 
   2544 LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg) {
   2545   Argument *A = unwrap<Argument>(Arg);
   2546   if (A->getArgNo() == 0)
   2547     return nullptr;
   2548   return wrap(&A->getParent()->arg_begin()[A->getArgNo() - 1]);
   2549 }
   2550 
   2551 void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align) {
   2552   Argument *A = unwrap<Argument>(Arg);
   2553   A->addAttr(Attribute::getWithAlignment(A->getContext(), Align(align)));
   2554 }
   2555 
   2556 /*--.. Operations on ifuncs ................................................--*/
   2557 
   2558 LLVMValueRef LLVMAddGlobalIFunc(LLVMModuleRef M,
   2559                                 const char *Name, size_t NameLen,
   2560                                 LLVMTypeRef Ty, unsigned AddrSpace,
   2561                                 LLVMValueRef Resolver) {
   2562   return wrap(GlobalIFunc::create(unwrap(Ty), AddrSpace,
   2563                                   GlobalValue::ExternalLinkage,
   2564                                   StringRef(Name, NameLen),
   2565                                   unwrap<Constant>(Resolver), unwrap(M)));
   2566 }
   2567 
   2568 LLVMValueRef LLVMGetNamedGlobalIFunc(LLVMModuleRef M,
   2569                                      const char *Name, size_t NameLen) {
   2570   return wrap(unwrap(M)->getNamedIFunc(StringRef(Name, NameLen)));
   2571 }
   2572 
   2573 LLVMValueRef LLVMGetFirstGlobalIFunc(LLVMModuleRef M) {
   2574   Module *Mod = unwrap(M);
   2575   Module::ifunc_iterator I = Mod->ifunc_begin();
   2576   if (I == Mod->ifunc_end())
   2577     return nullptr;
   2578   return wrap(&*I);
   2579 }
   2580 
   2581 LLVMValueRef LLVMGetLastGlobalIFunc(LLVMModuleRef M) {
   2582   Module *Mod = unwrap(M);
   2583   Module::ifunc_iterator I = Mod->ifunc_end();
   2584   if (I == Mod->ifunc_begin())
   2585     return nullptr;
   2586   return wrap(&*--I);
   2587 }
   2588 
   2589 LLVMValueRef LLVMGetNextGlobalIFunc(LLVMValueRef IFunc) {
   2590   GlobalIFunc *GIF = unwrap<GlobalIFunc>(IFunc);
   2591   Module::ifunc_iterator I(GIF);
   2592   if (++I == GIF->getParent()->ifunc_end())
   2593     return nullptr;
   2594   return wrap(&*I);
   2595 }
   2596 
   2597 LLVMValueRef LLVMGetPreviousGlobalIFunc(LLVMValueRef IFunc) {
   2598   GlobalIFunc *GIF = unwrap<GlobalIFunc>(IFunc);
   2599   Module::ifunc_iterator I(GIF);
   2600   if (I == GIF->getParent()->ifunc_begin())
   2601     return nullptr;
   2602   return wrap(&*--I);
   2603 }
   2604 
   2605 LLVMValueRef LLVMGetGlobalIFuncResolver(LLVMValueRef IFunc) {
   2606   return wrap(unwrap<GlobalIFunc>(IFunc)->getResolver());
   2607 }
   2608 
   2609 void LLVMSetGlobalIFuncResolver(LLVMValueRef IFunc, LLVMValueRef Resolver) {
   2610   unwrap<GlobalIFunc>(IFunc)->setResolver(unwrap<Constant>(Resolver));
   2611 }
   2612 
   2613 void LLVMEraseGlobalIFunc(LLVMValueRef IFunc) {
   2614   unwrap<GlobalIFunc>(IFunc)->eraseFromParent();
   2615 }
   2616 
   2617 void LLVMRemoveGlobalIFunc(LLVMValueRef IFunc) {
   2618   unwrap<GlobalIFunc>(IFunc)->removeFromParent();
   2619 }
   2620 
   2621 /*--.. Operations on basic blocks ..........................................--*/
   2622 
   2623 LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB) {
   2624   return wrap(static_cast<Value*>(unwrap(BB)));
   2625 }
   2626 
   2627 LLVMBool LLVMValueIsBasicBlock(LLVMValueRef Val) {
   2628   return isa<BasicBlock>(unwrap(Val));
   2629 }
   2630 
   2631 LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val) {
   2632   return wrap(unwrap<BasicBlock>(Val));
   2633 }
   2634 
   2635 const char *LLVMGetBasicBlockName(LLVMBasicBlockRef BB) {
   2636   return unwrap(BB)->getName().data();
   2637 }
   2638 
   2639 LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB) {
   2640   return wrap(unwrap(BB)->getParent());
   2641 }
   2642 
   2643 LLVMValueRef LLVMGetBasicBlockTerminator(LLVMBasicBlockRef BB) {
   2644   return wrap(unwrap(BB)->getTerminator());
   2645 }
   2646 
   2647 unsigned LLVMCountBasicBlocks(LLVMValueRef FnRef) {
   2648   return unwrap<Function>(FnRef)->size();
   2649 }
   2650 
   2651 void LLVMGetBasicBlocks(LLVMValueRef FnRef, LLVMBasicBlockRef *BasicBlocksRefs){
   2652   Function *Fn = unwrap<Function>(FnRef);
   2653   for (BasicBlock &BB : *Fn)
   2654     *BasicBlocksRefs++ = wrap(&BB);
   2655 }
   2656 
   2657 LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn) {
   2658   return wrap(&unwrap<Function>(Fn)->getEntryBlock());
   2659 }
   2660 
   2661 LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn) {
   2662   Function *Func = unwrap<Function>(Fn);
   2663   Function::iterator I = Func->begin();
   2664   if (I == Func->end())
   2665     return nullptr;
   2666   return wrap(&*I);
   2667 }
   2668 
   2669 LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn) {
   2670   Function *Func = unwrap<Function>(Fn);
   2671   Function::iterator I = Func->end();
   2672   if (I == Func->begin())
   2673     return nullptr;
   2674   return wrap(&*--I);
   2675 }
   2676 
   2677 LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB) {
   2678   BasicBlock *Block = unwrap(BB);
   2679   Function::iterator I(Block);
   2680   if (++I == Block->getParent()->end())
   2681     return nullptr;
   2682   return wrap(&*I);
   2683 }
   2684 
   2685 LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB) {
   2686   BasicBlock *Block = unwrap(BB);
   2687   Function::iterator I(Block);
   2688   if (I == Block->getParent()->begin())
   2689     return nullptr;
   2690   return wrap(&*--I);
   2691 }
   2692 
   2693 LLVMBasicBlockRef LLVMCreateBasicBlockInContext(LLVMContextRef C,
   2694                                                 const char *Name) {
   2695   return wrap(llvm::BasicBlock::Create(*unwrap(C), Name));
   2696 }
   2697 
   2698 void LLVMInsertExistingBasicBlockAfterInsertBlock(LLVMBuilderRef Builder,
   2699                                                   LLVMBasicBlockRef BB) {
   2700   BasicBlock *ToInsert = unwrap(BB);
   2701   BasicBlock *CurBB = unwrap(Builder)->GetInsertBlock();
   2702   assert(CurBB && "current insertion point is invalid!");
   2703   CurBB->getParent()->getBasicBlockList().insertAfter(CurBB->getIterator(),
   2704                                                       ToInsert);
   2705 }
   2706 
   2707 void LLVMAppendExistingBasicBlock(LLVMValueRef Fn,
   2708                                   LLVMBasicBlockRef BB) {
   2709   unwrap<Function>(Fn)->getBasicBlockList().push_back(unwrap(BB));
   2710 }
   2711 
   2712 LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
   2713                                                 LLVMValueRef FnRef,
   2714                                                 const char *Name) {
   2715   return wrap(BasicBlock::Create(*unwrap(C), Name, unwrap<Function>(FnRef)));
   2716 }
   2717 
   2718 LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef FnRef, const char *Name) {
   2719   return LLVMAppendBasicBlockInContext(LLVMGetGlobalContext(), FnRef, Name);
   2720 }
   2721 
   2722 LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
   2723                                                 LLVMBasicBlockRef BBRef,
   2724                                                 const char *Name) {
   2725   BasicBlock *BB = unwrap(BBRef);
   2726   return wrap(BasicBlock::Create(*unwrap(C), Name, BB->getParent(), BB));
   2727 }
   2728 
   2729 LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef BBRef,
   2730                                        const char *Name) {
   2731   return LLVMInsertBasicBlockInContext(LLVMGetGlobalContext(), BBRef, Name);
   2732 }
   2733 
   2734 void LLVMDeleteBasicBlock(LLVMBasicBlockRef BBRef) {
   2735   unwrap(BBRef)->eraseFromParent();
   2736 }
   2737 
   2738 void LLVMRemoveBasicBlockFromParent(LLVMBasicBlockRef BBRef) {
   2739   unwrap(BBRef)->removeFromParent();
   2740 }
   2741 
   2742 void LLVMMoveBasicBlockBefore(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) {
   2743   unwrap(BB)->moveBefore(unwrap(MovePos));
   2744 }
   2745 
   2746 void LLVMMoveBasicBlockAfter(LLVMBasicBlockRef BB, LLVMBasicBlockRef MovePos) {
   2747   unwrap(BB)->moveAfter(unwrap(MovePos));
   2748 }
   2749 
   2750 /*--.. Operations on instructions ..........................................--*/
   2751 
   2752 LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst) {
   2753   return wrap(unwrap<Instruction>(Inst)->getParent());
   2754 }
   2755 
   2756 LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB) {
   2757   BasicBlock *Block = unwrap(BB);
   2758   BasicBlock::iterator I = Block->begin();
   2759   if (I == Block->end())
   2760     return nullptr;
   2761   return wrap(&*I);
   2762 }
   2763 
   2764 LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB) {
   2765   BasicBlock *Block = unwrap(BB);
   2766   BasicBlock::iterator I = Block->end();
   2767   if (I == Block->begin())
   2768     return nullptr;
   2769   return wrap(&*--I);
   2770 }
   2771 
   2772 LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst) {
   2773   Instruction *Instr = unwrap<Instruction>(Inst);
   2774   BasicBlock::iterator I(Instr);
   2775   if (++I == Instr->getParent()->end())
   2776     return nullptr;
   2777   return wrap(&*I);
   2778 }
   2779 
   2780 LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst) {
   2781   Instruction *Instr = unwrap<Instruction>(Inst);
   2782   BasicBlock::iterator I(Instr);
   2783   if (I == Instr->getParent()->begin())
   2784     return nullptr;
   2785   return wrap(&*--I);
   2786 }
   2787 
   2788 void LLVMInstructionRemoveFromParent(LLVMValueRef Inst) {
   2789   unwrap<Instruction>(Inst)->removeFromParent();
   2790 }
   2791 
   2792 void LLVMInstructionEraseFromParent(LLVMValueRef Inst) {
   2793   unwrap<Instruction>(Inst)->eraseFromParent();
   2794 }
   2795 
   2796 LLVMIntPredicate LLVMGetICmpPredicate(LLVMValueRef Inst) {
   2797   if (ICmpInst *I = dyn_cast<ICmpInst>(unwrap(Inst)))
   2798     return (LLVMIntPredicate)I->getPredicate();
   2799   if (ConstantExpr *CE = dyn_cast<ConstantExpr>(unwrap(Inst)))
   2800     if (CE->getOpcode() == Instruction::ICmp)
   2801       return (LLVMIntPredicate)CE->getPredicate();
   2802   return (LLVMIntPredicate)0;
   2803 }
   2804 
   2805 LLVMRealPredicate LLVMGetFCmpPredicate(LLVMValueRef Inst) {
   2806   if (FCmpInst *I = dyn_cast<FCmpInst>(unwrap(Inst)))
   2807     return (LLVMRealPredicate)I->getPredicate();
   2808   if (ConstantExpr *CE = dyn_cast<ConstantExpr>(unwrap(Inst)))
   2809     if (CE->getOpcode() == Instruction::FCmp)
   2810       return (LLVMRealPredicate)CE->getPredicate();
   2811   return (LLVMRealPredicate)0;
   2812 }
   2813 
   2814 LLVMOpcode LLVMGetInstructionOpcode(LLVMValueRef Inst) {
   2815   if (Instruction *C = dyn_cast<Instruction>(unwrap(Inst)))
   2816     return map_to_llvmopcode(C->getOpcode());
   2817   return (LLVMOpcode)0;
   2818 }
   2819 
   2820 LLVMValueRef LLVMInstructionClone(LLVMValueRef Inst) {
   2821   if (Instruction *C = dyn_cast<Instruction>(unwrap(Inst)))
   2822     return wrap(C->clone());
   2823   return nullptr;
   2824 }
   2825 
   2826 LLVMValueRef LLVMIsATerminatorInst(LLVMValueRef Inst) {
   2827   Instruction *I = dyn_cast<Instruction>(unwrap(Inst));
   2828   return (I && I->isTerminator()) ? wrap(I) : nullptr;
   2829 }
   2830 
   2831 unsigned LLVMGetNumArgOperands(LLVMValueRef Instr) {
   2832   if (FuncletPadInst *FPI = dyn_cast<FuncletPadInst>(unwrap(Instr))) {
   2833     return FPI->getNumArgOperands();
   2834   }
   2835   return unwrap<CallBase>(Instr)->getNumArgOperands();
   2836 }
   2837 
   2838 /*--.. Call and invoke instructions ........................................--*/
   2839 
   2840 unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr) {
   2841   return unwrap<CallBase>(Instr)->getCallingConv();
   2842 }
   2843 
   2844 void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC) {
   2845   return unwrap<CallBase>(Instr)->setCallingConv(
   2846       static_cast<CallingConv::ID>(CC));
   2847 }
   2848 
   2849 void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index,
   2850                                 unsigned align) {
   2851   auto *Call = unwrap<CallBase>(Instr);
   2852   Attribute AlignAttr =
   2853       Attribute::getWithAlignment(Call->getContext(), Align(align));
   2854   Call->addAttribute(index, AlignAttr);
   2855 }
   2856 
   2857 void LLVMAddCallSiteAttribute(LLVMValueRef C, LLVMAttributeIndex Idx,
   2858                               LLVMAttributeRef A) {
   2859   unwrap<CallBase>(C)->addAttribute(Idx, unwrap(A));
   2860 }
   2861 
   2862 unsigned LLVMGetCallSiteAttributeCount(LLVMValueRef C,
   2863                                        LLVMAttributeIndex Idx) {
   2864   auto *Call = unwrap<CallBase>(C);
   2865   auto AS = Call->getAttributes().getAttributes(Idx);
   2866   return AS.getNumAttributes();
   2867 }
   2868 
   2869 void LLVMGetCallSiteAttributes(LLVMValueRef C, LLVMAttributeIndex Idx,
   2870                                LLVMAttributeRef *Attrs) {
   2871   auto *Call = unwrap<CallBase>(C);
   2872   auto AS = Call->getAttributes().getAttributes(Idx);
   2873   for (auto A : AS)
   2874     *Attrs++ = wrap(A);
   2875 }
   2876 
   2877 LLVMAttributeRef LLVMGetCallSiteEnumAttribute(LLVMValueRef C,
   2878                                               LLVMAttributeIndex Idx,
   2879                                               unsigned KindID) {
   2880   return wrap(
   2881       unwrap<CallBase>(C)->getAttribute(Idx, (Attribute::AttrKind)KindID));
   2882 }
   2883 
   2884 LLVMAttributeRef LLVMGetCallSiteStringAttribute(LLVMValueRef C,
   2885                                                 LLVMAttributeIndex Idx,
   2886                                                 const char *K, unsigned KLen) {
   2887   return wrap(unwrap<CallBase>(C)->getAttribute(Idx, StringRef(K, KLen)));
   2888 }
   2889 
   2890 void LLVMRemoveCallSiteEnumAttribute(LLVMValueRef C, LLVMAttributeIndex Idx,
   2891                                      unsigned KindID) {
   2892   unwrap<CallBase>(C)->removeAttribute(Idx, (Attribute::AttrKind)KindID);
   2893 }
   2894 
   2895 void LLVMRemoveCallSiteStringAttribute(LLVMValueRef C, LLVMAttributeIndex Idx,
   2896                                        const char *K, unsigned KLen) {
   2897   unwrap<CallBase>(C)->removeAttribute(Idx, StringRef(K, KLen));
   2898 }
   2899 
   2900 LLVMValueRef LLVMGetCalledValue(LLVMValueRef Instr) {
   2901   return wrap(unwrap<CallBase>(Instr)->getCalledOperand());
   2902 }
   2903 
   2904 LLVMTypeRef LLVMGetCalledFunctionType(LLVMValueRef Instr) {
   2905   return wrap(unwrap<CallBase>(Instr)->getFunctionType());
   2906 }
   2907 
   2908 /*--.. Operations on call instructions (only) ..............................--*/
   2909 
   2910 LLVMBool LLVMIsTailCall(LLVMValueRef Call) {
   2911   return unwrap<CallInst>(Call)->isTailCall();
   2912 }
   2913 
   2914 void LLVMSetTailCall(LLVMValueRef Call, LLVMBool isTailCall) {
   2915   unwrap<CallInst>(Call)->setTailCall(isTailCall);
   2916 }
   2917 
   2918 /*--.. Operations on invoke instructions (only) ............................--*/
   2919 
   2920 LLVMBasicBlockRef LLVMGetNormalDest(LLVMValueRef Invoke) {
   2921   return wrap(unwrap<InvokeInst>(Invoke)->getNormalDest());
   2922 }
   2923 
   2924 LLVMBasicBlockRef LLVMGetUnwindDest(LLVMValueRef Invoke) {
   2925   if (CleanupReturnInst *CRI = dyn_cast<CleanupReturnInst>(unwrap(Invoke))) {
   2926     return wrap(CRI->getUnwindDest());
   2927   } else if (CatchSwitchInst *CSI = dyn_cast<CatchSwitchInst>(unwrap(Invoke))) {
   2928     return wrap(CSI->getUnwindDest());
   2929   }
   2930   return wrap(unwrap<InvokeInst>(Invoke)->getUnwindDest());
   2931 }
   2932 
   2933 void LLVMSetNormalDest(LLVMValueRef Invoke, LLVMBasicBlockRef B) {
   2934   unwrap<InvokeInst>(Invoke)->setNormalDest(unwrap(B));
   2935 }
   2936 
   2937 void LLVMSetUnwindDest(LLVMValueRef Invoke, LLVMBasicBlockRef B) {
   2938   if (CleanupReturnInst *CRI = dyn_cast<CleanupReturnInst>(unwrap(Invoke))) {
   2939     return CRI->setUnwindDest(unwrap(B));
   2940   } else if (CatchSwitchInst *CSI = dyn_cast<CatchSwitchInst>(unwrap(Invoke))) {
   2941     return CSI->setUnwindDest(unwrap(B));
   2942   }
   2943   unwrap<InvokeInst>(Invoke)->setUnwindDest(unwrap(B));
   2944 }
   2945 
   2946 /*--.. Operations on terminators ...........................................--*/
   2947 
   2948 unsigned LLVMGetNumSuccessors(LLVMValueRef Term) {
   2949   return unwrap<Instruction>(Term)->getNumSuccessors();
   2950 }
   2951 
   2952 LLVMBasicBlockRef LLVMGetSuccessor(LLVMValueRef Term, unsigned i) {
   2953   return wrap(unwrap<Instruction>(Term)->getSuccessor(i));
   2954 }
   2955 
   2956 void LLVMSetSuccessor(LLVMValueRef Term, unsigned i, LLVMBasicBlockRef block) {
   2957   return unwrap<Instruction>(Term)->setSuccessor(i, unwrap(block));
   2958 }
   2959 
   2960 /*--.. Operations on branch instructions (only) ............................--*/
   2961 
   2962 LLVMBool LLVMIsConditional(LLVMValueRef Branch) {
   2963   return unwrap<BranchInst>(Branch)->isConditional();
   2964 }
   2965 
   2966 LLVMValueRef LLVMGetCondition(LLVMValueRef Branch) {
   2967   return wrap(unwrap<BranchInst>(Branch)->getCondition());
   2968 }
   2969 
   2970 void LLVMSetCondition(LLVMValueRef Branch, LLVMValueRef Cond) {
   2971   return unwrap<BranchInst>(Branch)->setCondition(unwrap(Cond));
   2972 }
   2973 
   2974 /*--.. Operations on switch instructions (only) ............................--*/
   2975 
   2976 LLVMBasicBlockRef LLVMGetSwitchDefaultDest(LLVMValueRef Switch) {
   2977   return wrap(unwrap<SwitchInst>(Switch)->getDefaultDest());
   2978 }
   2979 
   2980 /*--.. Operations on alloca instructions (only) ............................--*/
   2981 
   2982 LLVMTypeRef LLVMGetAllocatedType(LLVMValueRef Alloca) {
   2983   return wrap(unwrap<AllocaInst>(Alloca)->getAllocatedType());
   2984 }
   2985 
   2986 /*--.. Operations on gep instructions (only) ...............................--*/
   2987 
   2988 LLVMBool LLVMIsInBounds(LLVMValueRef GEP) {
   2989   return unwrap<GetElementPtrInst>(GEP)->isInBounds();
   2990 }
   2991 
   2992 void LLVMSetIsInBounds(LLVMValueRef GEP, LLVMBool InBounds) {
   2993   return unwrap<GetElementPtrInst>(GEP)->setIsInBounds(InBounds);
   2994 }
   2995 
   2996 /*--.. Operations on phi nodes .............................................--*/
   2997 
   2998 void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
   2999                      LLVMBasicBlockRef *IncomingBlocks, unsigned Count) {
   3000   PHINode *PhiVal = unwrap<PHINode>(PhiNode);
   3001   for (unsigned I = 0; I != Count; ++I)
   3002     PhiVal->addIncoming(unwrap(IncomingValues[I]), unwrap(IncomingBlocks[I]));
   3003 }
   3004 
   3005 unsigned LLVMCountIncoming(LLVMValueRef PhiNode) {
   3006   return unwrap<PHINode>(PhiNode)->getNumIncomingValues();
   3007 }
   3008 
   3009 LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index) {
   3010   return wrap(unwrap<PHINode>(PhiNode)->getIncomingValue(Index));
   3011 }
   3012 
   3013 LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index) {
   3014   return wrap(unwrap<PHINode>(PhiNode)->getIncomingBlock(Index));
   3015 }
   3016 
   3017 /*--.. Operations on extractvalue and insertvalue nodes ....................--*/
   3018 
   3019 unsigned LLVMGetNumIndices(LLVMValueRef Inst) {
   3020   auto *I = unwrap(Inst);
   3021   if (auto *GEP = dyn_cast<GetElementPtrInst>(I))
   3022     return GEP->getNumIndices();
   3023   if (auto *EV = dyn_cast<ExtractValueInst>(I))
   3024     return EV->getNumIndices();
   3025   if (auto *IV = dyn_cast<InsertValueInst>(I))
   3026     return IV->getNumIndices();
   3027   if (auto *CE = dyn_cast<ConstantExpr>(I))
   3028     return CE->getIndices().size();
   3029   llvm_unreachable(
   3030     "LLVMGetNumIndices applies only to extractvalue and insertvalue!");
   3031 }
   3032 
   3033 const unsigned *LLVMGetIndices(LLVMValueRef Inst) {
   3034   auto *I = unwrap(Inst);
   3035   if (auto *EV = dyn_cast<ExtractValueInst>(I))
   3036     return EV->getIndices().data();
   3037   if (auto *IV = dyn_cast<InsertValueInst>(I))
   3038     return IV->getIndices().data();
   3039   if (auto *CE = dyn_cast<ConstantExpr>(I))
   3040     return CE->getIndices().data();
   3041   llvm_unreachable(
   3042     "LLVMGetIndices applies only to extractvalue and insertvalue!");
   3043 }
   3044 
   3045 
   3046 /*===-- Instruction builders ----------------------------------------------===*/
   3047 
   3048 LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C) {
   3049   return wrap(new IRBuilder<>(*unwrap(C)));
   3050 }
   3051 
   3052 LLVMBuilderRef LLVMCreateBuilder(void) {
   3053   return LLVMCreateBuilderInContext(LLVMGetGlobalContext());
   3054 }
   3055 
   3056 void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
   3057                          LLVMValueRef Instr) {
   3058   BasicBlock *BB = unwrap(Block);
   3059   auto I = Instr ? unwrap<Instruction>(Instr)->getIterator() : BB->end();
   3060   unwrap(Builder)->SetInsertPoint(BB, I);
   3061 }
   3062 
   3063 void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr) {
   3064   Instruction *I = unwrap<Instruction>(Instr);
   3065   unwrap(Builder)->SetInsertPoint(I->getParent(), I->getIterator());
   3066 }
   3067 
   3068 void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block) {
   3069   BasicBlock *BB = unwrap(Block);
   3070   unwrap(Builder)->SetInsertPoint(BB);
   3071 }
   3072 
   3073 LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder) {
   3074    return wrap(unwrap(Builder)->GetInsertBlock());
   3075 }
   3076 
   3077 void LLVMClearInsertionPosition(LLVMBuilderRef Builder) {
   3078   unwrap(Builder)->ClearInsertionPoint();
   3079 }
   3080 
   3081 void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr) {
   3082   unwrap(Builder)->Insert(unwrap<Instruction>(Instr));
   3083 }
   3084 
   3085 void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
   3086                                    const char *Name) {
   3087   unwrap(Builder)->Insert(unwrap<Instruction>(Instr), Name);
   3088 }
   3089 
   3090 void LLVMDisposeBuilder(LLVMBuilderRef Builder) {
   3091   delete unwrap(Builder);
   3092 }
   3093 
   3094 /*--.. Metadata builders ...................................................--*/
   3095 
   3096 LLVMMetadataRef LLVMGetCurrentDebugLocation2(LLVMBuilderRef Builder) {
   3097   return wrap(unwrap(Builder)->getCurrentDebugLocation().getAsMDNode());
   3098 }
   3099 
   3100 void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Builder, LLVMMetadataRef Loc) {
   3101   if (Loc)
   3102     unwrap(Builder)->SetCurrentDebugLocation(DebugLoc(unwrap<MDNode>(Loc)));
   3103   else
   3104     unwrap(Builder)->SetCurrentDebugLocation(DebugLoc());
   3105 }
   3106 
   3107 void LLVMSetCurrentDebugLocation(LLVMBuilderRef Builder, LLVMValueRef L) {
   3108   MDNode *Loc =
   3109       L ? cast<MDNode>(unwrap<MetadataAsValue>(L)->getMetadata()) : nullptr;
   3110   unwrap(Builder)->SetCurrentDebugLocation(DebugLoc(Loc));
   3111 }
   3112 
   3113 LLVMValueRef LLVMGetCurrentDebugLocation(LLVMBuilderRef Builder) {
   3114   LLVMContext &Context = unwrap(Builder)->getContext();
   3115   return wrap(MetadataAsValue::get(
   3116       Context, unwrap(Builder)->getCurrentDebugLocation().getAsMDNode()));
   3117 }
   3118 
   3119 void LLVMSetInstDebugLocation(LLVMBuilderRef Builder, LLVMValueRef Inst) {
   3120   unwrap(Builder)->SetInstDebugLocation(unwrap<Instruction>(Inst));
   3121 }
   3122 
   3123 void LLVMBuilderSetDefaultFPMathTag(LLVMBuilderRef Builder,
   3124                                     LLVMMetadataRef FPMathTag) {
   3125 
   3126   unwrap(Builder)->setDefaultFPMathTag(FPMathTag
   3127                                        ? unwrap<MDNode>(FPMathTag)
   3128                                        : nullptr);
   3129 }
   3130 
   3131 LLVMMetadataRef LLVMBuilderGetDefaultFPMathTag(LLVMBuilderRef Builder) {
   3132   return wrap(unwrap(Builder)->getDefaultFPMathTag());
   3133 }
   3134 
   3135 /*--.. Instruction builders ................................................--*/
   3136 
   3137 LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef B) {
   3138   return wrap(unwrap(B)->CreateRetVoid());
   3139 }
   3140 
   3141 LLVMValueRef LLVMBuildRet(LLVMBuilderRef B, LLVMValueRef V) {
   3142   return wrap(unwrap(B)->CreateRet(unwrap(V)));
   3143 }
   3144 
   3145 LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef B, LLVMValueRef *RetVals,
   3146                                    unsigned N) {
   3147   return wrap(unwrap(B)->CreateAggregateRet(unwrap(RetVals), N));
   3148 }
   3149 
   3150 LLVMValueRef LLVMBuildBr(LLVMBuilderRef B, LLVMBasicBlockRef Dest) {
   3151   return wrap(unwrap(B)->CreateBr(unwrap(Dest)));
   3152 }
   3153 
   3154 LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef B, LLVMValueRef If,
   3155                              LLVMBasicBlockRef Then, LLVMBasicBlockRef Else) {
   3156   return wrap(unwrap(B)->CreateCondBr(unwrap(If), unwrap(Then), unwrap(Else)));
   3157 }
   3158 
   3159 LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef B, LLVMValueRef V,
   3160                              LLVMBasicBlockRef Else, unsigned NumCases) {
   3161   return wrap(unwrap(B)->CreateSwitch(unwrap(V), unwrap(Else), NumCases));
   3162 }
   3163 
   3164 LLVMValueRef LLVMBuildIndirectBr(LLVMBuilderRef B, LLVMValueRef Addr,
   3165                                  unsigned NumDests) {
   3166   return wrap(unwrap(B)->CreateIndirectBr(unwrap(Addr), NumDests));
   3167 }
   3168 
   3169 LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef B, LLVMValueRef Fn,
   3170                              LLVMValueRef *Args, unsigned NumArgs,
   3171                              LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
   3172                              const char *Name) {
   3173   Value *V = unwrap(Fn);
   3174   FunctionType *FnT =
   3175       cast<FunctionType>(cast<PointerType>(V->getType())->getElementType());
   3176 
   3177   return wrap(
   3178       unwrap(B)->CreateInvoke(FnT, unwrap(Fn), unwrap(Then), unwrap(Catch),
   3179                               makeArrayRef(unwrap(Args), NumArgs), Name));
   3180 }
   3181 
   3182 LLVMValueRef LLVMBuildInvoke2(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Fn,
   3183                               LLVMValueRef *Args, unsigned NumArgs,
   3184                               LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
   3185                               const char *Name) {
   3186   return wrap(unwrap(B)->CreateInvoke(
   3187       unwrap<FunctionType>(Ty), unwrap(Fn), unwrap(Then), unwrap(Catch),
   3188       makeArrayRef(unwrap(Args), NumArgs), Name));
   3189 }
   3190 
   3191 LLVMValueRef LLVMBuildLandingPad(LLVMBuilderRef B, LLVMTypeRef Ty,
   3192                                  LLVMValueRef PersFn, unsigned NumClauses,
   3193                                  const char *Name) {
   3194   // The personality used to live on the landingpad instruction, but now it
   3195   // lives on the parent function. For compatibility, take the provided
   3196   // personality and put it on the parent function.
   3197   if (PersFn)
   3198     unwrap(B)->GetInsertBlock()->getParent()->setPersonalityFn(
   3199         cast<Function>(unwrap(PersFn)));
   3200   return wrap(unwrap(B)->CreateLandingPad(unwrap(Ty), NumClauses, Name));
   3201 }
   3202 
   3203 LLVMValueRef LLVMBuildCatchPad(LLVMBuilderRef B, LLVMValueRef ParentPad,
   3204                                LLVMValueRef *Args, unsigned NumArgs,
   3205                                const char *Name) {
   3206   return wrap(unwrap(B)->CreateCatchPad(unwrap(ParentPad),
   3207                                         makeArrayRef(unwrap(Args), NumArgs),
   3208                                         Name));
   3209 }
   3210 
   3211 LLVMValueRef LLVMBuildCleanupPad(LLVMBuilderRef B, LLVMValueRef ParentPad,
   3212                                  LLVMValueRef *Args, unsigned NumArgs,
   3213                                  const char *Name) {
   3214   if (ParentPad == nullptr) {
   3215     Type *Ty = Type::getTokenTy(unwrap(B)->getContext());
   3216     ParentPad = wrap(Constant::getNullValue(Ty));
   3217   }
   3218   return wrap(unwrap(B)->CreateCleanupPad(unwrap(ParentPad),
   3219                                           makeArrayRef(unwrap(Args), NumArgs),
   3220                                           Name));
   3221 }
   3222 
   3223 LLVMValueRef LLVMBuildResume(LLVMBuilderRef B, LLVMValueRef Exn) {
   3224   return wrap(unwrap(B)->CreateResume(unwrap(Exn)));
   3225 }
   3226 
   3227 LLVMValueRef LLVMBuildCatchSwitch(LLVMBuilderRef B, LLVMValueRef ParentPad,
   3228                                   LLVMBasicBlockRef UnwindBB,
   3229                                   unsigned NumHandlers, const char *Name) {
   3230   if (ParentPad == nullptr) {
   3231     Type *Ty = Type::getTokenTy(unwrap(B)->getContext());
   3232     ParentPad = wrap(Constant::getNullValue(Ty));
   3233   }
   3234   return wrap(unwrap(B)->CreateCatchSwitch(unwrap(ParentPad), unwrap(UnwindBB),
   3235                                            NumHandlers, Name));
   3236 }
   3237 
   3238 LLVMValueRef LLVMBuildCatchRet(LLVMBuilderRef B, LLVMValueRef CatchPad,
   3239                                LLVMBasicBlockRef BB) {
   3240   return wrap(unwrap(B)->CreateCatchRet(unwrap<CatchPadInst>(CatchPad),
   3241                                         unwrap(BB)));
   3242 }
   3243 
   3244 LLVMValueRef LLVMBuildCleanupRet(LLVMBuilderRef B, LLVMValueRef CatchPad,
   3245                                  LLVMBasicBlockRef BB) {
   3246   return wrap(unwrap(B)->CreateCleanupRet(unwrap<CleanupPadInst>(CatchPad),
   3247                                           unwrap(BB)));
   3248 }
   3249 
   3250 LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef B) {
   3251   return wrap(unwrap(B)->CreateUnreachable());
   3252 }
   3253 
   3254 void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
   3255                  LLVMBasicBlockRef Dest) {
   3256   unwrap<SwitchInst>(Switch)->addCase(unwrap<ConstantInt>(OnVal), unwrap(Dest));
   3257 }
   3258 
   3259 void LLVMAddDestination(LLVMValueRef IndirectBr, LLVMBasicBlockRef Dest) {
   3260   unwrap<IndirectBrInst>(IndirectBr)->addDestination(unwrap(Dest));
   3261 }
   3262 
   3263 unsigned LLVMGetNumClauses(LLVMValueRef LandingPad) {
   3264   return unwrap<LandingPadInst>(LandingPad)->getNumClauses();
   3265 }
   3266 
   3267 LLVMValueRef LLVMGetClause(LLVMValueRef LandingPad, unsigned Idx) {
   3268   return wrap(unwrap<LandingPadInst>(LandingPad)->getClause(Idx));
   3269 }
   3270 
   3271 void LLVMAddClause(LLVMValueRef LandingPad, LLVMValueRef ClauseVal) {
   3272   unwrap<LandingPadInst>(LandingPad)->
   3273     addClause(cast<Constant>(unwrap(ClauseVal)));
   3274 }
   3275 
   3276 LLVMBool LLVMIsCleanup(LLVMValueRef LandingPad) {
   3277   return unwrap<LandingPadInst>(LandingPad)->isCleanup();
   3278 }
   3279 
   3280 void LLVMSetCleanup(LLVMValueRef LandingPad, LLVMBool Val) {
   3281   unwrap<LandingPadInst>(LandingPad)->setCleanup(Val);
   3282 }
   3283 
   3284 void LLVMAddHandler(LLVMValueRef CatchSwitch, LLVMBasicBlockRef Dest) {
   3285   unwrap<CatchSwitchInst>(CatchSwitch)->addHandler(unwrap(Dest));
   3286 }
   3287 
   3288 unsigned LLVMGetNumHandlers(LLVMValueRef CatchSwitch) {
   3289   return unwrap<CatchSwitchInst>(CatchSwitch)->getNumHandlers();
   3290 }
   3291 
   3292 void LLVMGetHandlers(LLVMValueRef CatchSwitch, LLVMBasicBlockRef *Handlers) {
   3293   CatchSwitchInst *CSI = unwrap<CatchSwitchInst>(CatchSwitch);
   3294   for (const BasicBlock *H : CSI->handlers())
   3295     *Handlers++ = wrap(H);
   3296 }
   3297 
   3298 LLVMValueRef LLVMGetParentCatchSwitch(LLVMValueRef CatchPad) {
   3299   return wrap(unwrap<CatchPadInst>(CatchPad)->getCatchSwitch());
   3300 }
   3301 
   3302 void LLVMSetParentCatchSwitch(LLVMValueRef CatchPad, LLVMValueRef CatchSwitch) {
   3303   unwrap<CatchPadInst>(CatchPad)
   3304     ->setCatchSwitch(unwrap<CatchSwitchInst>(CatchSwitch));
   3305 }
   3306 
   3307 /*--.. Funclets ...........................................................--*/
   3308 
   3309 LLVMValueRef LLVMGetArgOperand(LLVMValueRef Funclet, unsigned i) {
   3310   return wrap(unwrap<FuncletPadInst>(Funclet)->getArgOperand(i));
   3311 }
   3312 
   3313 void LLVMSetArgOperand(LLVMValueRef Funclet, unsigned i, LLVMValueRef value) {
   3314   unwrap<FuncletPadInst>(Funclet)->setArgOperand(i, unwrap(value));
   3315 }
   3316 
   3317 /*--.. Arithmetic ..........................................................--*/
   3318 
   3319 LLVMValueRef LLVMBuildAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3320                           const char *Name) {
   3321   return wrap(unwrap(B)->CreateAdd(unwrap(LHS), unwrap(RHS), Name));
   3322 }
   3323 
   3324 LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3325                           const char *Name) {
   3326   return wrap(unwrap(B)->CreateNSWAdd(unwrap(LHS), unwrap(RHS), Name));
   3327 }
   3328 
   3329 LLVMValueRef LLVMBuildNUWAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3330                           const char *Name) {
   3331   return wrap(unwrap(B)->CreateNUWAdd(unwrap(LHS), unwrap(RHS), Name));
   3332 }
   3333 
   3334 LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3335                           const char *Name) {
   3336   return wrap(unwrap(B)->CreateFAdd(unwrap(LHS), unwrap(RHS), Name));
   3337 }
   3338 
   3339 LLVMValueRef LLVMBuildSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3340                           const char *Name) {
   3341   return wrap(unwrap(B)->CreateSub(unwrap(LHS), unwrap(RHS), Name));
   3342 }
   3343 
   3344 LLVMValueRef LLVMBuildNSWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3345                           const char *Name) {
   3346   return wrap(unwrap(B)->CreateNSWSub(unwrap(LHS), unwrap(RHS), Name));
   3347 }
   3348 
   3349 LLVMValueRef LLVMBuildNUWSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3350                           const char *Name) {
   3351   return wrap(unwrap(B)->CreateNUWSub(unwrap(LHS), unwrap(RHS), Name));
   3352 }
   3353 
   3354 LLVMValueRef LLVMBuildFSub(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3355                           const char *Name) {
   3356   return wrap(unwrap(B)->CreateFSub(unwrap(LHS), unwrap(RHS), Name));
   3357 }
   3358 
   3359 LLVMValueRef LLVMBuildMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3360                           const char *Name) {
   3361   return wrap(unwrap(B)->CreateMul(unwrap(LHS), unwrap(RHS), Name));
   3362 }
   3363 
   3364 LLVMValueRef LLVMBuildNSWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3365                           const char *Name) {
   3366   return wrap(unwrap(B)->CreateNSWMul(unwrap(LHS), unwrap(RHS), Name));
   3367 }
   3368 
   3369 LLVMValueRef LLVMBuildNUWMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3370                           const char *Name) {
   3371   return wrap(unwrap(B)->CreateNUWMul(unwrap(LHS), unwrap(RHS), Name));
   3372 }
   3373 
   3374 LLVMValueRef LLVMBuildFMul(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3375                           const char *Name) {
   3376   return wrap(unwrap(B)->CreateFMul(unwrap(LHS), unwrap(RHS), Name));
   3377 }
   3378 
   3379 LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3380                            const char *Name) {
   3381   return wrap(unwrap(B)->CreateUDiv(unwrap(LHS), unwrap(RHS), Name));
   3382 }
   3383 
   3384 LLVMValueRef LLVMBuildExactUDiv(LLVMBuilderRef B, LLVMValueRef LHS,
   3385                                 LLVMValueRef RHS, const char *Name) {
   3386   return wrap(unwrap(B)->CreateExactUDiv(unwrap(LHS), unwrap(RHS), Name));
   3387 }
   3388 
   3389 LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3390                            const char *Name) {
   3391   return wrap(unwrap(B)->CreateSDiv(unwrap(LHS), unwrap(RHS), Name));
   3392 }
   3393 
   3394 LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef B, LLVMValueRef LHS,
   3395                                 LLVMValueRef RHS, const char *Name) {
   3396   return wrap(unwrap(B)->CreateExactSDiv(unwrap(LHS), unwrap(RHS), Name));
   3397 }
   3398 
   3399 LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3400                            const char *Name) {
   3401   return wrap(unwrap(B)->CreateFDiv(unwrap(LHS), unwrap(RHS), Name));
   3402 }
   3403 
   3404 LLVMValueRef LLVMBuildURem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3405                            const char *Name) {
   3406   return wrap(unwrap(B)->CreateURem(unwrap(LHS), unwrap(RHS), Name));
   3407 }
   3408 
   3409 LLVMValueRef LLVMBuildSRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3410                            const char *Name) {
   3411   return wrap(unwrap(B)->CreateSRem(unwrap(LHS), unwrap(RHS), Name));
   3412 }
   3413 
   3414 LLVMValueRef LLVMBuildFRem(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3415                            const char *Name) {
   3416   return wrap(unwrap(B)->CreateFRem(unwrap(LHS), unwrap(RHS), Name));
   3417 }
   3418 
   3419 LLVMValueRef LLVMBuildShl(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3420                           const char *Name) {
   3421   return wrap(unwrap(B)->CreateShl(unwrap(LHS), unwrap(RHS), Name));
   3422 }
   3423 
   3424 LLVMValueRef LLVMBuildLShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3425                            const char *Name) {
   3426   return wrap(unwrap(B)->CreateLShr(unwrap(LHS), unwrap(RHS), Name));
   3427 }
   3428 
   3429 LLVMValueRef LLVMBuildAShr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3430                            const char *Name) {
   3431   return wrap(unwrap(B)->CreateAShr(unwrap(LHS), unwrap(RHS), Name));
   3432 }
   3433 
   3434 LLVMValueRef LLVMBuildAnd(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3435                           const char *Name) {
   3436   return wrap(unwrap(B)->CreateAnd(unwrap(LHS), unwrap(RHS), Name));
   3437 }
   3438 
   3439 LLVMValueRef LLVMBuildOr(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3440                          const char *Name) {
   3441   return wrap(unwrap(B)->CreateOr(unwrap(LHS), unwrap(RHS), Name));
   3442 }
   3443 
   3444 LLVMValueRef LLVMBuildXor(LLVMBuilderRef B, LLVMValueRef LHS, LLVMValueRef RHS,
   3445                           const char *Name) {
   3446   return wrap(unwrap(B)->CreateXor(unwrap(LHS), unwrap(RHS), Name));
   3447 }
   3448 
   3449 LLVMValueRef LLVMBuildBinOp(LLVMBuilderRef B, LLVMOpcode Op,
   3450                             LLVMValueRef LHS, LLVMValueRef RHS,
   3451                             const char *Name) {
   3452   return wrap(unwrap(B)->CreateBinOp(Instruction::BinaryOps(map_from_llvmopcode(Op)), unwrap(LHS),
   3453                                      unwrap(RHS), Name));
   3454 }
   3455 
   3456 LLVMValueRef LLVMBuildNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
   3457   return wrap(unwrap(B)->CreateNeg(unwrap(V), Name));
   3458 }
   3459 
   3460 LLVMValueRef LLVMBuildNSWNeg(LLVMBuilderRef B, LLVMValueRef V,
   3461                              const char *Name) {
   3462   return wrap(unwrap(B)->CreateNSWNeg(unwrap(V), Name));
   3463 }
   3464 
   3465 LLVMValueRef LLVMBuildNUWNeg(LLVMBuilderRef B, LLVMValueRef V,
   3466                              const char *Name) {
   3467   return wrap(unwrap(B)->CreateNUWNeg(unwrap(V), Name));
   3468 }
   3469 
   3470 LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
   3471   return wrap(unwrap(B)->CreateFNeg(unwrap(V), Name));
   3472 }
   3473 
   3474 LLVMValueRef LLVMBuildNot(LLVMBuilderRef B, LLVMValueRef V, const char *Name) {
   3475   return wrap(unwrap(B)->CreateNot(unwrap(V), Name));
   3476 }
   3477 
   3478 /*--.. Memory ..............................................................--*/
   3479 
   3480 LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
   3481                              const char *Name) {
   3482   Type* ITy = Type::getInt32Ty(unwrap(B)->GetInsertBlock()->getContext());
   3483   Constant* AllocSize = ConstantExpr::getSizeOf(unwrap(Ty));
   3484   AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, ITy);
   3485   Instruction* Malloc = CallInst::CreateMalloc(unwrap(B)->GetInsertBlock(),
   3486                                                ITy, unwrap(Ty), AllocSize,
   3487                                                nullptr, nullptr, "");
   3488   return wrap(unwrap(B)->Insert(Malloc, Twine(Name)));
   3489 }
   3490 
   3491 LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef B, LLVMTypeRef Ty,
   3492                                   LLVMValueRef Val, const char *Name) {
   3493   Type* ITy = Type::getInt32Ty(unwrap(B)->GetInsertBlock()->getContext());
   3494   Constant* AllocSize = ConstantExpr::getSizeOf(unwrap(Ty));
   3495   AllocSize = ConstantExpr::getTruncOrBitCast(AllocSize, ITy);
   3496   Instruction* Malloc = CallInst::CreateMalloc(unwrap(B)->GetInsertBlock(),
   3497                                                ITy, unwrap(Ty), AllocSize,
   3498                                                unwrap(Val), nullptr, "");
   3499   return wrap(unwrap(B)->Insert(Malloc, Twine(Name)));
   3500 }
   3501 
   3502 LLVMValueRef LLVMBuildMemSet(LLVMBuilderRef B, LLVMValueRef Ptr,
   3503                              LLVMValueRef Val, LLVMValueRef Len,
   3504                              unsigned Align) {
   3505   return wrap(unwrap(B)->CreateMemSet(unwrap(Ptr), unwrap(Val), unwrap(Len),
   3506                                       MaybeAlign(Align)));
   3507 }
   3508 
   3509 LLVMValueRef LLVMBuildMemCpy(LLVMBuilderRef B,
   3510                              LLVMValueRef Dst, unsigned DstAlign,
   3511                              LLVMValueRef Src, unsigned SrcAlign,
   3512                              LLVMValueRef Size) {
   3513   return wrap(unwrap(B)->CreateMemCpy(unwrap(Dst), MaybeAlign(DstAlign),
   3514                                       unwrap(Src), MaybeAlign(SrcAlign),
   3515                                       unwrap(Size)));
   3516 }
   3517 
   3518 LLVMValueRef LLVMBuildMemMove(LLVMBuilderRef B,
   3519                               LLVMValueRef Dst, unsigned DstAlign,
   3520                               LLVMValueRef Src, unsigned SrcAlign,
   3521                               LLVMValueRef Size) {
   3522   return wrap(unwrap(B)->CreateMemMove(unwrap(Dst), MaybeAlign(DstAlign),
   3523                                        unwrap(Src), MaybeAlign(SrcAlign),
   3524                                        unwrap(Size)));
   3525 }
   3526 
   3527 LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
   3528                              const char *Name) {
   3529   return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), nullptr, Name));
   3530 }
   3531 
   3532 LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef B, LLVMTypeRef Ty,
   3533                                   LLVMValueRef Val, const char *Name) {
   3534   return wrap(unwrap(B)->CreateAlloca(unwrap(Ty), unwrap(Val), Name));
   3535 }
   3536 
   3537 LLVMValueRef LLVMBuildFree(LLVMBuilderRef B, LLVMValueRef PointerVal) {
   3538   return wrap(unwrap(B)->Insert(
   3539      CallInst::CreateFree(unwrap(PointerVal), unwrap(B)->GetInsertBlock())));
   3540 }
   3541 
   3542 LLVMValueRef LLVMBuildLoad(LLVMBuilderRef B, LLVMValueRef PointerVal,
   3543                            const char *Name) {
   3544   Value *V = unwrap(PointerVal);
   3545   PointerType *Ty = cast<PointerType>(V->getType());
   3546 
   3547   return wrap(unwrap(B)->CreateLoad(Ty->getElementType(), V, Name));
   3548 }
   3549 
   3550 LLVMValueRef LLVMBuildLoad2(LLVMBuilderRef B, LLVMTypeRef Ty,
   3551                             LLVMValueRef PointerVal, const char *Name) {
   3552   return wrap(unwrap(B)->CreateLoad(unwrap(Ty), unwrap(PointerVal), Name));
   3553 }
   3554 
   3555 LLVMValueRef LLVMBuildStore(LLVMBuilderRef B, LLVMValueRef Val,
   3556                             LLVMValueRef PointerVal) {
   3557   return wrap(unwrap(B)->CreateStore(unwrap(Val), unwrap(PointerVal)));
   3558 }
   3559 
   3560 static AtomicOrdering mapFromLLVMOrdering(LLVMAtomicOrdering Ordering) {
   3561   switch (Ordering) {
   3562     case LLVMAtomicOrderingNotAtomic: return AtomicOrdering::NotAtomic;
   3563     case LLVMAtomicOrderingUnordered: return AtomicOrdering::Unordered;
   3564     case LLVMAtomicOrderingMonotonic: return AtomicOrdering::Monotonic;
   3565     case LLVMAtomicOrderingAcquire: return AtomicOrdering::Acquire;
   3566     case LLVMAtomicOrderingRelease: return AtomicOrdering::Release;
   3567     case LLVMAtomicOrderingAcquireRelease:
   3568       return AtomicOrdering::AcquireRelease;
   3569     case LLVMAtomicOrderingSequentiallyConsistent:
   3570       return AtomicOrdering::SequentiallyConsistent;
   3571   }
   3572 
   3573   llvm_unreachable("Invalid LLVMAtomicOrdering value!");
   3574 }
   3575 
   3576 static LLVMAtomicOrdering mapToLLVMOrdering(AtomicOrdering Ordering) {
   3577   switch (Ordering) {
   3578     case AtomicOrdering::NotAtomic: return LLVMAtomicOrderingNotAtomic;
   3579     case AtomicOrdering::Unordered: return LLVMAtomicOrderingUnordered;
   3580     case AtomicOrdering::Monotonic: return LLVMAtomicOrderingMonotonic;
   3581     case AtomicOrdering::Acquire: return LLVMAtomicOrderingAcquire;
   3582     case AtomicOrdering::Release: return LLVMAtomicOrderingRelease;
   3583     case AtomicOrdering::AcquireRelease:
   3584       return LLVMAtomicOrderingAcquireRelease;
   3585     case AtomicOrdering::SequentiallyConsistent:
   3586       return LLVMAtomicOrderingSequentiallyConsistent;
   3587   }
   3588 
   3589   llvm_unreachable("Invalid AtomicOrdering value!");
   3590 }
   3591 
   3592 static AtomicRMWInst::BinOp mapFromLLVMRMWBinOp(LLVMAtomicRMWBinOp BinOp) {
   3593   switch (BinOp) {
   3594     case LLVMAtomicRMWBinOpXchg: return AtomicRMWInst::Xchg;
   3595     case LLVMAtomicRMWBinOpAdd: return AtomicRMWInst::Add;
   3596     case LLVMAtomicRMWBinOpSub: return AtomicRMWInst::Sub;
   3597     case LLVMAtomicRMWBinOpAnd: return AtomicRMWInst::And;
   3598     case LLVMAtomicRMWBinOpNand: return AtomicRMWInst::Nand;
   3599     case LLVMAtomicRMWBinOpOr: return AtomicRMWInst::Or;
   3600     case LLVMAtomicRMWBinOpXor: return AtomicRMWInst::Xor;
   3601     case LLVMAtomicRMWBinOpMax: return AtomicRMWInst::Max;
   3602     case LLVMAtomicRMWBinOpMin: return AtomicRMWInst::Min;
   3603     case LLVMAtomicRMWBinOpUMax: return AtomicRMWInst::UMax;
   3604     case LLVMAtomicRMWBinOpUMin: return AtomicRMWInst::UMin;
   3605     case LLVMAtomicRMWBinOpFAdd: return AtomicRMWInst::FAdd;
   3606     case LLVMAtomicRMWBinOpFSub: return AtomicRMWInst::FSub;
   3607   }
   3608 
   3609   llvm_unreachable("Invalid LLVMAtomicRMWBinOp value!");
   3610 }
   3611 
   3612 static LLVMAtomicRMWBinOp mapToLLVMRMWBinOp(AtomicRMWInst::BinOp BinOp) {
   3613   switch (BinOp) {
   3614     case AtomicRMWInst::Xchg: return LLVMAtomicRMWBinOpXchg;
   3615     case AtomicRMWInst::Add: return LLVMAtomicRMWBinOpAdd;
   3616     case AtomicRMWInst::Sub: return LLVMAtomicRMWBinOpSub;
   3617     case AtomicRMWInst::And: return LLVMAtomicRMWBinOpAnd;
   3618     case AtomicRMWInst::Nand: return LLVMAtomicRMWBinOpNand;
   3619     case AtomicRMWInst::Or: return LLVMAtomicRMWBinOpOr;
   3620     case AtomicRMWInst::Xor: return LLVMAtomicRMWBinOpXor;
   3621     case AtomicRMWInst::Max: return LLVMAtomicRMWBinOpMax;
   3622     case AtomicRMWInst::Min: return LLVMAtomicRMWBinOpMin;
   3623     case AtomicRMWInst::UMax: return LLVMAtomicRMWBinOpUMax;
   3624     case AtomicRMWInst::UMin: return LLVMAtomicRMWBinOpUMin;
   3625     case AtomicRMWInst::FAdd: return LLVMAtomicRMWBinOpFAdd;
   3626     case AtomicRMWInst::FSub: return LLVMAtomicRMWBinOpFSub;
   3627     default: break;
   3628   }
   3629 
   3630   llvm_unreachable("Invalid AtomicRMWBinOp value!");
   3631 }
   3632 
   3633 // TODO: Should this and other atomic instructions support building with
   3634 // "syncscope"?
   3635 LLVMValueRef LLVMBuildFence(LLVMBuilderRef B, LLVMAtomicOrdering Ordering,
   3636                             LLVMBool isSingleThread, const char *Name) {
   3637   return wrap(
   3638     unwrap(B)->CreateFence(mapFromLLVMOrdering(Ordering),
   3639                            isSingleThread ? SyncScope::SingleThread
   3640                                           : SyncScope::System,
   3641                            Name));
   3642 }
   3643 
   3644 LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
   3645                           LLVMValueRef *Indices, unsigned NumIndices,
   3646                           const char *Name) {
   3647   ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices);
   3648   Value *Val = unwrap(Pointer);
   3649   Type *Ty =
   3650       cast<PointerType>(Val->getType()->getScalarType())->getElementType();
   3651   return wrap(unwrap(B)->CreateGEP(Ty, Val, IdxList, Name));
   3652 }
   3653 
   3654 LLVMValueRef LLVMBuildGEP2(LLVMBuilderRef B, LLVMTypeRef Ty,
   3655                            LLVMValueRef Pointer, LLVMValueRef *Indices,
   3656                            unsigned NumIndices, const char *Name) {
   3657   ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices);
   3658   return wrap(unwrap(B)->CreateGEP(unwrap(Ty), unwrap(Pointer), IdxList, Name));
   3659 }
   3660 
   3661 LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
   3662                                   LLVMValueRef *Indices, unsigned NumIndices,
   3663                                   const char *Name) {
   3664   ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices);
   3665   Value *Val = unwrap(Pointer);
   3666   Type *Ty =
   3667       cast<PointerType>(Val->getType()->getScalarType())->getElementType();
   3668   return wrap(unwrap(B)->CreateInBoundsGEP(Ty, Val, IdxList, Name));
   3669 }
   3670 
   3671 LLVMValueRef LLVMBuildInBoundsGEP2(LLVMBuilderRef B, LLVMTypeRef Ty,
   3672                                    LLVMValueRef Pointer, LLVMValueRef *Indices,
   3673                                    unsigned NumIndices, const char *Name) {
   3674   ArrayRef<Value *> IdxList(unwrap(Indices), NumIndices);
   3675   return wrap(
   3676       unwrap(B)->CreateInBoundsGEP(unwrap(Ty), unwrap(Pointer), IdxList, Name));
   3677 }
   3678 
   3679 LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
   3680                                 unsigned Idx, const char *Name) {
   3681   Value *Val = unwrap(Pointer);
   3682   Type *Ty =
   3683       cast<PointerType>(Val->getType()->getScalarType())->getElementType();
   3684   return wrap(unwrap(B)->CreateStructGEP(Ty, Val, Idx, Name));
   3685 }
   3686 
   3687 LLVMValueRef LLVMBuildStructGEP2(LLVMBuilderRef B, LLVMTypeRef Ty,
   3688                                  LLVMValueRef Pointer, unsigned Idx,
   3689                                  const char *Name) {
   3690   return wrap(
   3691       unwrap(B)->CreateStructGEP(unwrap(Ty), unwrap(Pointer), Idx, Name));
   3692 }
   3693 
   3694 LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
   3695                                    const char *Name) {
   3696   return wrap(unwrap(B)->CreateGlobalString(Str, Name));
   3697 }
   3698 
   3699 LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
   3700                                       const char *Name) {
   3701   return wrap(unwrap(B)->CreateGlobalStringPtr(Str, Name));
   3702 }
   3703 
   3704 LLVMBool LLVMGetVolatile(LLVMValueRef MemAccessInst) {
   3705   Value *P = unwrap<Value>(MemAccessInst);
   3706   if (LoadInst *LI = dyn_cast<LoadInst>(P))
   3707     return LI->isVolatile();
   3708   if (StoreInst *SI = dyn_cast<StoreInst>(P))
   3709     return SI->isVolatile();
   3710   if (AtomicRMWInst *AI = dyn_cast<AtomicRMWInst>(P))
   3711     return AI->isVolatile();
   3712   return cast<AtomicCmpXchgInst>(P)->isVolatile();
   3713 }
   3714 
   3715 void LLVMSetVolatile(LLVMValueRef MemAccessInst, LLVMBool isVolatile) {
   3716   Value *P = unwrap<Value>(MemAccessInst);
   3717   if (LoadInst *LI = dyn_cast<LoadInst>(P))
   3718     return LI->setVolatile(isVolatile);
   3719   if (StoreInst *SI = dyn_cast<StoreInst>(P))
   3720     return SI->setVolatile(isVolatile);
   3721   if (AtomicRMWInst *AI = dyn_cast<AtomicRMWInst>(P))
   3722     return AI->setVolatile(isVolatile);
   3723   return cast<AtomicCmpXchgInst>(P)->setVolatile(isVolatile);
   3724 }
   3725 
   3726 LLVMBool LLVMGetWeak(LLVMValueRef CmpXchgInst) {
   3727   return unwrap<AtomicCmpXchgInst>(CmpXchgInst)->isWeak();
   3728 }
   3729 
   3730 void LLVMSetWeak(LLVMValueRef CmpXchgInst, LLVMBool isWeak) {
   3731   return unwrap<AtomicCmpXchgInst>(CmpXchgInst)->setWeak(isWeak);
   3732 }
   3733 
   3734 LLVMAtomicOrdering LLVMGetOrdering(LLVMValueRef MemAccessInst) {
   3735   Value *P = unwrap<Value>(MemAccessInst);
   3736   AtomicOrdering O;
   3737   if (LoadInst *LI = dyn_cast<LoadInst>(P))
   3738     O = LI->getOrdering();
   3739   else if (StoreInst *SI = dyn_cast<StoreInst>(P))
   3740     O = SI->getOrdering();
   3741   else
   3742     O = cast<AtomicRMWInst>(P)->getOrdering();
   3743   return mapToLLVMOrdering(O);
   3744 }
   3745 
   3746 void LLVMSetOrdering(LLVMValueRef MemAccessInst, LLVMAtomicOrdering Ordering) {
   3747   Value *P = unwrap<Value>(MemAccessInst);
   3748   AtomicOrdering O = mapFromLLVMOrdering(Ordering);
   3749 
   3750   if (LoadInst *LI = dyn_cast<LoadInst>(P))
   3751     return LI->setOrdering(O);
   3752   return cast<StoreInst>(P)->setOrdering(O);
   3753 }
   3754 
   3755 LLVMAtomicRMWBinOp LLVMGetAtomicRMWBinOp(LLVMValueRef Inst) {
   3756   return mapToLLVMRMWBinOp(unwrap<AtomicRMWInst>(Inst)->getOperation());
   3757 }
   3758 
   3759 void LLVMSetAtomicRMWBinOp(LLVMValueRef Inst, LLVMAtomicRMWBinOp BinOp) {
   3760   unwrap<AtomicRMWInst>(Inst)->setOperation(mapFromLLVMRMWBinOp(BinOp));
   3761 }
   3762 
   3763 /*--.. Casts ...............................................................--*/
   3764 
   3765 LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef B, LLVMValueRef Val,
   3766                             LLVMTypeRef DestTy, const char *Name) {
   3767   return wrap(unwrap(B)->CreateTrunc(unwrap(Val), unwrap(DestTy), Name));
   3768 }
   3769 
   3770 LLVMValueRef LLVMBuildZExt(LLVMBuilderRef B, LLVMValueRef Val,
   3771                            LLVMTypeRef DestTy, const char *Name) {
   3772   return wrap(unwrap(B)->CreateZExt(unwrap(Val), unwrap(DestTy), Name));
   3773 }
   3774 
   3775 LLVMValueRef LLVMBuildSExt(LLVMBuilderRef B, LLVMValueRef Val,
   3776                            LLVMTypeRef DestTy, const char *Name) {
   3777   return wrap(unwrap(B)->CreateSExt(unwrap(Val), unwrap(DestTy), Name));
   3778 }
   3779 
   3780 LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef B, LLVMValueRef Val,
   3781                              LLVMTypeRef DestTy, const char *Name) {
   3782   return wrap(unwrap(B)->CreateFPToUI(unwrap(Val), unwrap(DestTy), Name));
   3783 }
   3784 
   3785 LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef B, LLVMValueRef Val,
   3786                              LLVMTypeRef DestTy, const char *Name) {
   3787   return wrap(unwrap(B)->CreateFPToSI(unwrap(Val), unwrap(DestTy), Name));
   3788 }
   3789 
   3790 LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef B, LLVMValueRef Val,
   3791                              LLVMTypeRef DestTy, const char *Name) {
   3792   return wrap(unwrap(B)->CreateUIToFP(unwrap(Val), unwrap(DestTy), Name));
   3793 }
   3794 
   3795 LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef B, LLVMValueRef Val,
   3796                              LLVMTypeRef DestTy, const char *Name) {
   3797   return wrap(unwrap(B)->CreateSIToFP(unwrap(Val), unwrap(DestTy), Name));
   3798 }
   3799 
   3800 LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef B, LLVMValueRef Val,
   3801                               LLVMTypeRef DestTy, const char *Name) {
   3802   return wrap(unwrap(B)->CreateFPTrunc(unwrap(Val), unwrap(DestTy), Name));
   3803 }
   3804 
   3805 LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef B, LLVMValueRef Val,
   3806                             LLVMTypeRef DestTy, const char *Name) {
   3807   return wrap(unwrap(B)->CreateFPExt(unwrap(Val), unwrap(DestTy), Name));
   3808 }
   3809 
   3810 LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef B, LLVMValueRef Val,
   3811                                LLVMTypeRef DestTy, const char *Name) {
   3812   return wrap(unwrap(B)->CreatePtrToInt(unwrap(Val), unwrap(DestTy), Name));
   3813 }
   3814 
   3815 LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef B, LLVMValueRef Val,
   3816                                LLVMTypeRef DestTy, const char *Name) {
   3817   return wrap(unwrap(B)->CreateIntToPtr(unwrap(Val), unwrap(DestTy), Name));
   3818 }
   3819 
   3820 LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef B, LLVMValueRef Val,
   3821                               LLVMTypeRef DestTy, const char *Name) {
   3822   return wrap(unwrap(B)->CreateBitCast(unwrap(Val), unwrap(DestTy), Name));
   3823 }
   3824 
   3825 LLVMValueRef LLVMBuildAddrSpaceCast(LLVMBuilderRef B, LLVMValueRef Val,
   3826                                     LLVMTypeRef DestTy, const char *Name) {
   3827   return wrap(unwrap(B)->CreateAddrSpaceCast(unwrap(Val), unwrap(DestTy), Name));
   3828 }
   3829 
   3830 LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
   3831                                     LLVMTypeRef DestTy, const char *Name) {
   3832   return wrap(unwrap(B)->CreateZExtOrBitCast(unwrap(Val), unwrap(DestTy),
   3833                                              Name));
   3834 }
   3835 
   3836 LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
   3837                                     LLVMTypeRef DestTy, const char *Name) {
   3838   return wrap(unwrap(B)->CreateSExtOrBitCast(unwrap(Val), unwrap(DestTy),
   3839                                              Name));
   3840 }
   3841 
   3842 LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef B, LLVMValueRef Val,
   3843                                      LLVMTypeRef DestTy, const char *Name) {
   3844   return wrap(unwrap(B)->CreateTruncOrBitCast(unwrap(Val), unwrap(DestTy),
   3845                                               Name));
   3846 }
   3847 
   3848 LLVMValueRef LLVMBuildCast(LLVMBuilderRef B, LLVMOpcode Op, LLVMValueRef Val,
   3849                            LLVMTypeRef DestTy, const char *Name) {
   3850   return wrap(unwrap(B)->CreateCast(Instruction::CastOps(map_from_llvmopcode(Op)), unwrap(Val),
   3851                                     unwrap(DestTy), Name));
   3852 }
   3853 
   3854 LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef B, LLVMValueRef Val,
   3855                                   LLVMTypeRef DestTy, const char *Name) {
   3856   return wrap(unwrap(B)->CreatePointerCast(unwrap(Val), unwrap(DestTy), Name));
   3857 }
   3858 
   3859 LLVMValueRef LLVMBuildIntCast2(LLVMBuilderRef B, LLVMValueRef Val,
   3860                                LLVMTypeRef DestTy, LLVMBool IsSigned,
   3861                                const char *Name) {
   3862   return wrap(
   3863       unwrap(B)->CreateIntCast(unwrap(Val), unwrap(DestTy), IsSigned, Name));
   3864 }
   3865 
   3866 LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef B, LLVMValueRef Val,
   3867                               LLVMTypeRef DestTy, const char *Name) {
   3868   return wrap(unwrap(B)->CreateIntCast(unwrap(Val), unwrap(DestTy),
   3869                                        /*isSigned*/true, Name));
   3870 }
   3871 
   3872 LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef B, LLVMValueRef Val,
   3873                              LLVMTypeRef DestTy, const char *Name) {
   3874   return wrap(unwrap(B)->CreateFPCast(unwrap(Val), unwrap(DestTy), Name));
   3875 }
   3876 
   3877 /*--.. Comparisons .........................................................--*/
   3878 
   3879 LLVMValueRef LLVMBuildICmp(LLVMBuilderRef B, LLVMIntPredicate Op,
   3880                            LLVMValueRef LHS, LLVMValueRef RHS,
   3881                            const char *Name) {
   3882   return wrap(unwrap(B)->CreateICmp(static_cast<ICmpInst::Predicate>(Op),
   3883                                     unwrap(LHS), unwrap(RHS), Name));
   3884 }
   3885 
   3886 LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef B, LLVMRealPredicate Op,
   3887                            LLVMValueRef LHS, LLVMValueRef RHS,
   3888                            const char *Name) {
   3889   return wrap(unwrap(B)->CreateFCmp(static_cast<FCmpInst::Predicate>(Op),
   3890                                     unwrap(LHS), unwrap(RHS), Name));
   3891 }
   3892 
   3893 /*--.. Miscellaneous instructions ..........................................--*/
   3894 
   3895 LLVMValueRef LLVMBuildPhi(LLVMBuilderRef B, LLVMTypeRef Ty, const char *Name) {
   3896   return wrap(unwrap(B)->CreatePHI(unwrap(Ty), 0, Name));
   3897 }
   3898 
   3899 LLVMValueRef LLVMBuildCall(LLVMBuilderRef B, LLVMValueRef Fn,
   3900                            LLVMValueRef *Args, unsigned NumArgs,
   3901                            const char *Name) {
   3902   Value *V = unwrap(Fn);
   3903   FunctionType *FnT =
   3904       cast<FunctionType>(cast<PointerType>(V->getType())->getElementType());
   3905 
   3906   return wrap(unwrap(B)->CreateCall(FnT, unwrap(Fn),
   3907                                     makeArrayRef(unwrap(Args), NumArgs), Name));
   3908 }
   3909 
   3910 LLVMValueRef LLVMBuildCall2(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Fn,
   3911                             LLVMValueRef *Args, unsigned NumArgs,
   3912                             const char *Name) {
   3913   FunctionType *FTy = unwrap<FunctionType>(Ty);
   3914   return wrap(unwrap(B)->CreateCall(FTy, unwrap(Fn),
   3915                                     makeArrayRef(unwrap(Args), NumArgs), Name));
   3916 }
   3917 
   3918 LLVMValueRef LLVMBuildSelect(LLVMBuilderRef B, LLVMValueRef If,
   3919                              LLVMValueRef Then, LLVMValueRef Else,
   3920                              const char *Name) {
   3921   return wrap(unwrap(B)->CreateSelect(unwrap(If), unwrap(Then), unwrap(Else),
   3922                                       Name));
   3923 }
   3924 
   3925 LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef B, LLVMValueRef List,
   3926                             LLVMTypeRef Ty, const char *Name) {
   3927   return wrap(unwrap(B)->CreateVAArg(unwrap(List), unwrap(Ty), Name));
   3928 }
   3929 
   3930 LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef B, LLVMValueRef VecVal,
   3931                                       LLVMValueRef Index, const char *Name) {
   3932   return wrap(unwrap(B)->CreateExtractElement(unwrap(VecVal), unwrap(Index),
   3933                                               Name));
   3934 }
   3935 
   3936 LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef B, LLVMValueRef VecVal,
   3937                                     LLVMValueRef EltVal, LLVMValueRef Index,
   3938                                     const char *Name) {
   3939   return wrap(unwrap(B)->CreateInsertElement(unwrap(VecVal), unwrap(EltVal),
   3940                                              unwrap(Index), Name));
   3941 }
   3942 
   3943 LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef B, LLVMValueRef V1,
   3944                                     LLVMValueRef V2, LLVMValueRef Mask,
   3945                                     const char *Name) {
   3946   return wrap(unwrap(B)->CreateShuffleVector(unwrap(V1), unwrap(V2),
   3947                                              unwrap(Mask), Name));
   3948 }
   3949 
   3950 LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef B, LLVMValueRef AggVal,
   3951                                    unsigned Index, const char *Name) {
   3952   return wrap(unwrap(B)->CreateExtractValue(unwrap(AggVal), Index, Name));
   3953 }
   3954 
   3955 LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef B, LLVMValueRef AggVal,
   3956                                   LLVMValueRef EltVal, unsigned Index,
   3957                                   const char *Name) {
   3958   return wrap(unwrap(B)->CreateInsertValue(unwrap(AggVal), unwrap(EltVal),
   3959                                            Index, Name));
   3960 }
   3961 
   3962 LLVMValueRef LLVMBuildFreeze(LLVMBuilderRef B, LLVMValueRef Val,
   3963                              const char *Name) {
   3964   return wrap(unwrap(B)->CreateFreeze(unwrap(Val), Name));
   3965 }
   3966 
   3967 LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef B, LLVMValueRef Val,
   3968                              const char *Name) {
   3969   return wrap(unwrap(B)->CreateIsNull(unwrap(Val), Name));
   3970 }
   3971 
   3972 LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef B, LLVMValueRef Val,
   3973                                 const char *Name) {
   3974   return wrap(unwrap(B)->CreateIsNotNull(unwrap(Val), Name));
   3975 }
   3976 
   3977 LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef B, LLVMValueRef LHS,
   3978                               LLVMValueRef RHS, const char *Name) {
   3979   return wrap(unwrap(B)->CreatePtrDiff(unwrap(LHS), unwrap(RHS), Name));
   3980 }
   3981 
   3982 LLVMValueRef LLVMBuildAtomicRMW(LLVMBuilderRef B,LLVMAtomicRMWBinOp op,
   3983                                LLVMValueRef PTR, LLVMValueRef Val,
   3984                                LLVMAtomicOrdering ordering,
   3985                                LLVMBool singleThread) {
   3986   AtomicRMWInst::BinOp intop = mapFromLLVMRMWBinOp(op);
   3987   return wrap(unwrap(B)->CreateAtomicRMW(
   3988       intop, unwrap(PTR), unwrap(Val), MaybeAlign(),
   3989       mapFromLLVMOrdering(ordering),
   3990       singleThread ? SyncScope::SingleThread : SyncScope::System));
   3991 }
   3992 
   3993 LLVMValueRef LLVMBuildAtomicCmpXchg(LLVMBuilderRef B, LLVMValueRef Ptr,
   3994                                     LLVMValueRef Cmp, LLVMValueRef New,
   3995                                     LLVMAtomicOrdering SuccessOrdering,
   3996                                     LLVMAtomicOrdering FailureOrdering,
   3997                                     LLVMBool singleThread) {
   3998 
   3999   return wrap(unwrap(B)->CreateAtomicCmpXchg(
   4000       unwrap(Ptr), unwrap(Cmp), unwrap(New), MaybeAlign(),
   4001       mapFromLLVMOrdering(SuccessOrdering),
   4002       mapFromLLVMOrdering(FailureOrdering),
   4003       singleThread ? SyncScope::SingleThread : SyncScope::System));
   4004 }
   4005 
   4006 unsigned LLVMGetNumMaskElements(LLVMValueRef SVInst) {
   4007   Value *P = unwrap<Value>(SVInst);
   4008   ShuffleVectorInst *I = cast<ShuffleVectorInst>(P);
   4009   return I->getShuffleMask().size();
   4010 }
   4011 
   4012 int LLVMGetMaskValue(LLVMValueRef SVInst, unsigned Elt) {
   4013   Value *P = unwrap<Value>(SVInst);
   4014   ShuffleVectorInst *I = cast<ShuffleVectorInst>(P);
   4015   return I->getMaskValue(Elt);
   4016 }
   4017 
   4018 int LLVMGetUndefMaskElem(void) { return UndefMaskElem; }
   4019 
   4020 LLVMBool LLVMIsAtomicSingleThread(LLVMValueRef AtomicInst) {
   4021   Value *P = unwrap<Value>(AtomicInst);
   4022 
   4023   if (AtomicRMWInst *I = dyn_cast<AtomicRMWInst>(P))
   4024     return I->getSyncScopeID() == SyncScope::SingleThread;
   4025   return cast<AtomicCmpXchgInst>(P)->getSyncScopeID() ==
   4026              SyncScope::SingleThread;
   4027 }
   4028 
   4029 void LLVMSetAtomicSingleThread(LLVMValueRef AtomicInst, LLVMBool NewValue) {
   4030   Value *P = unwrap<Value>(AtomicInst);
   4031   SyncScope::ID SSID = NewValue ? SyncScope::SingleThread : SyncScope::System;
   4032 
   4033   if (AtomicRMWInst *I = dyn_cast<AtomicRMWInst>(P))
   4034     return I->setSyncScopeID(SSID);
   4035   return cast<AtomicCmpXchgInst>(P)->setSyncScopeID(SSID);
   4036 }
   4037 
   4038 LLVMAtomicOrdering LLVMGetCmpXchgSuccessOrdering(LLVMValueRef CmpXchgInst)  {
   4039   Value *P = unwrap<Value>(CmpXchgInst);
   4040   return mapToLLVMOrdering(cast<AtomicCmpXchgInst>(P)->getSuccessOrdering());
   4041 }
   4042 
   4043 void LLVMSetCmpXchgSuccessOrdering(LLVMValueRef CmpXchgInst,
   4044                                    LLVMAtomicOrdering Ordering) {
   4045   Value *P = unwrap<Value>(CmpXchgInst);
   4046   AtomicOrdering O = mapFromLLVMOrdering(Ordering);
   4047 
   4048   return cast<AtomicCmpXchgInst>(P)->setSuccessOrdering(O);
   4049 }
   4050 
   4051 LLVMAtomicOrdering LLVMGetCmpXchgFailureOrdering(LLVMValueRef CmpXchgInst)  {
   4052   Value *P = unwrap<Value>(CmpXchgInst);
   4053   return mapToLLVMOrdering(cast<AtomicCmpXchgInst>(P)->getFailureOrdering());
   4054 }
   4055 
   4056 void LLVMSetCmpXchgFailureOrdering(LLVMValueRef CmpXchgInst,
   4057                                    LLVMAtomicOrdering Ordering) {
   4058   Value *P = unwrap<Value>(CmpXchgInst);
   4059   AtomicOrdering O = mapFromLLVMOrdering(Ordering);
   4060 
   4061   return cast<AtomicCmpXchgInst>(P)->setFailureOrdering(O);
   4062 }
   4063 
   4064 /*===-- Module providers --------------------------------------------------===*/
   4065 
   4066 LLVMModuleProviderRef
   4067 LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M) {
   4068   return reinterpret_cast<LLVMModuleProviderRef>(M);
   4069 }
   4070 
   4071 void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP) {
   4072   delete unwrap(MP);
   4073 }
   4074 
   4075 
   4076 /*===-- Memory buffers ----------------------------------------------------===*/
   4077 
   4078 LLVMBool LLVMCreateMemoryBufferWithContentsOfFile(
   4079     const char *Path,
   4080     LLVMMemoryBufferRef *OutMemBuf,
   4081     char **OutMessage) {
   4082 
   4083   ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr = MemoryBuffer::getFile(Path);
   4084   if (std::error_code EC = MBOrErr.getError()) {
   4085     *OutMessage = strdup(EC.message().c_str());
   4086     return 1;
   4087   }
   4088   *OutMemBuf = wrap(MBOrErr.get().release());
   4089   return 0;
   4090 }
   4091 
   4092 LLVMBool LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
   4093                                          char **OutMessage) {
   4094   ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr = MemoryBuffer::getSTDIN();
   4095   if (std::error_code EC = MBOrErr.getError()) {
   4096     *OutMessage = strdup(EC.message().c_str());
   4097     return 1;
   4098   }
   4099   *OutMemBuf = wrap(MBOrErr.get().release());
   4100   return 0;
   4101 }
   4102 
   4103 LLVMMemoryBufferRef LLVMCreateMemoryBufferWithMemoryRange(
   4104     const char *InputData,
   4105     size_t InputDataLength,
   4106     const char *BufferName,
   4107     LLVMBool RequiresNullTerminator) {
   4108 
   4109   return wrap(MemoryBuffer::getMemBuffer(StringRef(InputData, InputDataLength),
   4110                                          StringRef(BufferName),
   4111                                          RequiresNullTerminator).release());
   4112 }
   4113 
   4114 LLVMMemoryBufferRef LLVMCreateMemoryBufferWithMemoryRangeCopy(
   4115     const char *InputData,
   4116     size_t InputDataLength,
   4117     const char *BufferName) {
   4118 
   4119   return wrap(
   4120       MemoryBuffer::getMemBufferCopy(StringRef(InputData, InputDataLength),
   4121                                      StringRef(BufferName)).release());
   4122 }
   4123 
   4124 const char *LLVMGetBufferStart(LLVMMemoryBufferRef MemBuf) {
   4125   return unwrap(MemBuf)->getBufferStart();
   4126 }
   4127 
   4128 size_t LLVMGetBufferSize(LLVMMemoryBufferRef MemBuf) {
   4129   return unwrap(MemBuf)->getBufferSize();
   4130 }
   4131 
   4132 void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf) {
   4133   delete unwrap(MemBuf);
   4134 }
   4135 
   4136 /*===-- Pass Registry -----------------------------------------------------===*/
   4137 
   4138 LLVMPassRegistryRef LLVMGetGlobalPassRegistry(void) {
   4139   return wrap(PassRegistry::getPassRegistry());
   4140 }
   4141 
   4142 /*===-- Pass Manager ------------------------------------------------------===*/
   4143 
   4144 LLVMPassManagerRef LLVMCreatePassManager() {
   4145   return wrap(new legacy::PassManager());
   4146 }
   4147 
   4148 LLVMPassManagerRef LLVMCreateFunctionPassManagerForModule(LLVMModuleRef M) {
   4149   return wrap(new legacy::FunctionPassManager(unwrap(M)));
   4150 }
   4151 
   4152 LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef P) {
   4153   return LLVMCreateFunctionPassManagerForModule(
   4154                                             reinterpret_cast<LLVMModuleRef>(P));
   4155 }
   4156 
   4157 LLVMBool LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M) {
   4158   return unwrap<legacy::PassManager>(PM)->run(*unwrap(M));
   4159 }
   4160 
   4161 LLVMBool LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM) {
   4162   return unwrap<legacy::FunctionPassManager>(FPM)->doInitialization();
   4163 }
   4164 
   4165 LLVMBool LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F) {
   4166   return unwrap<legacy::FunctionPassManager>(FPM)->run(*unwrap<Function>(F));
   4167 }
   4168 
   4169 LLVMBool LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM) {
   4170   return unwrap<legacy::FunctionPassManager>(FPM)->doFinalization();
   4171 }
   4172 
   4173 void LLVMDisposePassManager(LLVMPassManagerRef PM) {
   4174   delete unwrap(PM);
   4175 }
   4176 
   4177 /*===-- Threading ------------------------------------------------------===*/
   4178 
   4179 LLVMBool LLVMStartMultithreaded() {
   4180   return LLVMIsMultithreaded();
   4181 }
   4182 
   4183 void LLVMStopMultithreaded() {
   4184 }
   4185 
   4186 LLVMBool LLVMIsMultithreaded() {
   4187   return llvm_is_multithreaded();
   4188 }
   4189