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