author | Jan Vrany <jan.vrany@fit.cvut.cz> |
Wed, 12 Aug 2015 06:45:40 +0100 | |
changeset 26 | f6379df4b5ea |
child 31 | 5280c546bd37 |
permissions | -rw-r--r-- |
26
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
1 |
//===- IRBindings.cpp - Additional bindings for ir ------------------------===// |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
2 |
// |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
3 |
// The LLVM Compiler Infrastructure |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
4 |
// |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
5 |
// This file is distributed under the University of Illinois Open Source |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
6 |
// License. See LICENSE.TXT for details. |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
7 |
// |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
8 |
//===----------------------------------------------------------------------===// |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
9 |
// |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
10 |
// This file defines additional C bindings for the ir component. |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
11 |
// |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
12 |
//===----------------------------------------------------------------------===// |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
13 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
14 |
/* |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
15 |
* Shamelessly based on IRBindings.cpp from LLVM's GO bindings. The original |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
16 |
* file could be found at bindings/go/llvm/IRBindings.cpp in LLVM source tree. |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
17 |
*/ |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
18 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
19 |
#include <llvm-c-ext/CoreExt.h> |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
20 |
#include "llvm/IR/Attributes.h" |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
21 |
#include "llvm/IR/DebugLoc.h" |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
22 |
#include "llvm/IR/Function.h" |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
23 |
#include "llvm/IR/IRBuilder.h" |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
24 |
#include "llvm/IR/LLVMContext.h" |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
25 |
#include "llvm/IR/Module.h" |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
26 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
27 |
using namespace llvm; |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
28 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
29 |
void LLVMAddFunctionAttr2(LLVMValueRef Fn, uint64_t PA) { |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
30 |
Function *Func = unwrap<Function>(Fn); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
31 |
const AttributeSet PAL = Func->getAttributes(); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
32 |
AttrBuilder B(PA); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
33 |
const AttributeSet PALnew = |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
34 |
PAL.addAttributes(Func->getContext(), AttributeSet::FunctionIndex, |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
35 |
AttributeSet::get(Func->getContext(), |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
36 |
AttributeSet::FunctionIndex, B)); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
37 |
Func->setAttributes(PALnew); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
38 |
} |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
39 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
40 |
uint64_t LLVMGetFunctionAttr2(LLVMValueRef Fn) { |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
41 |
Function *Func = unwrap<Function>(Fn); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
42 |
const AttributeSet PAL = Func->getAttributes(); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
43 |
return PAL.Raw(AttributeSet::FunctionIndex); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
44 |
} |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
45 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
46 |
void LLVMRemoveFunctionAttr2(LLVMValueRef Fn, uint64_t PA) { |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
47 |
Function *Func = unwrap<Function>(Fn); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
48 |
const AttributeSet PAL = Func->getAttributes(); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
49 |
AttrBuilder B(PA); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
50 |
const AttributeSet PALnew = |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
51 |
PAL.removeAttributes(Func->getContext(), AttributeSet::FunctionIndex, |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
52 |
AttributeSet::get(Func->getContext(), |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
53 |
AttributeSet::FunctionIndex, B)); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
54 |
Func->setAttributes(PALnew); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
55 |
} |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
56 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
57 |
LLVMMetadataRef LLVMConstantAsMetadata(LLVMValueRef C) { |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
58 |
return wrap(ConstantAsMetadata::get(unwrap<Constant>(C))); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
59 |
} |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
60 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
61 |
LLVMMetadataRef LLVMMDString2(LLVMContextRef C, const char *Str, unsigned SLen) { |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
62 |
return wrap(MDString::get(*unwrap(C), StringRef(Str, SLen))); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
63 |
} |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
64 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
65 |
LLVMMetadataRef LLVMMDNode2(LLVMContextRef C, LLVMMetadataRef *MDs, |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
66 |
unsigned Count) { |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
67 |
return wrap( |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
68 |
MDNode::get(*unwrap(C), ArrayRef<Metadata *>(unwrap(MDs), Count))); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
69 |
} |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
70 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
71 |
LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef C, LLVMMetadataRef *MDs, |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
72 |
unsigned Count) { |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
73 |
return wrap(MDTuple::getTemporary(*unwrap(C), |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
74 |
ArrayRef<Metadata *>(unwrap(MDs), Count)) |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
75 |
.release()); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
76 |
} |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
77 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
78 |
void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name, |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
79 |
LLVMMetadataRef Val) { |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
80 |
NamedMDNode *N = unwrap(M)->getOrInsertNamedMetadata(name); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
81 |
if (!N) |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
82 |
return; |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
83 |
if (!Val) |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
84 |
return; |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
85 |
N->addOperand(unwrap<MDNode>(Val)); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
86 |
} |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
87 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
88 |
void LLVMSetMetadata2(LLVMValueRef Inst, unsigned KindID, LLVMMetadataRef MD) { |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
89 |
MDNode *N = MD ? unwrap<MDNode>(MD) : nullptr; |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
90 |
unwrap<Instruction>(Inst)->setMetadata(KindID, N); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
91 |
} |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
92 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
93 |
void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef MD, LLVMMetadataRef New) { |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
94 |
auto *Node = unwrap<MDNode>(MD); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
95 |
Node->replaceAllUsesWith(unwrap<Metadata>(New)); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
96 |
MDNode::deleteTemporary(Node); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
97 |
} |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
98 |
|
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
99 |
void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line, |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
100 |
unsigned Col, LLVMMetadataRef Scope, |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
101 |
LLVMMetadataRef InlinedAt) { |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
102 |
unwrap(Bref)->SetCurrentDebugLocation( |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
103 |
DebugLoc::get(Line, Col, Scope ? unwrap<MDNode>(Scope) : nullptr, |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
104 |
InlinedAt ? unwrap<MDNode>(InlinedAt) : nullptr)); |
f6379df4b5ea
Added DIBuilder API to LLVM C Ext library
Jan Vrany <jan.vrany@fit.cvut.cz>
parents:
diff
changeset
|
105 |
} |