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