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