137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===- IRBindings.cpp - Additional bindings for ir ------------------------===//
237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//                     The LLVM Compiler Infrastructure
437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// This file is distributed under the University of Illinois Open Source
637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// License. See LICENSE.TXT for details.
737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===//
937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
1037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines// This file defines additional C bindings for the ir component.
1137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//
1237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines//===----------------------------------------------------------------------===//
1337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
1437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "IRBindings.h"
1537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/IR/Attributes.h"
16ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/DebugLoc.h"
1737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/IR/Function.h"
18ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/IRBuilder.h"
19ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/LLVMContext.h"
20ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/IR/Module.h"
2137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesusing namespace llvm;
2337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
2437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid LLVMAddFunctionAttr2(LLVMValueRef Fn, uint64_t PA) {
2537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Function *Func = unwrap<Function>(Fn);
2637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const AttributeSet PAL = Func->getAttributes();
2737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  AttrBuilder B(PA);
2837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const AttributeSet PALnew =
2937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    PAL.addAttributes(Func->getContext(), AttributeSet::FunctionIndex,
3037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                      AttributeSet::get(Func->getContext(),
3137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                        AttributeSet::FunctionIndex, B));
3237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Func->setAttributes(PALnew);
3337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
3437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
3537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesuint64_t LLVMGetFunctionAttr2(LLVMValueRef Fn) {
3637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Function *Func = unwrap<Function>(Fn);
3737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const AttributeSet PAL = Func->getAttributes();
3837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  return PAL.Raw(AttributeSet::FunctionIndex);
3937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
4037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines
4137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesvoid LLVMRemoveFunctionAttr2(LLVMValueRef Fn, uint64_t PA) {
4237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Function *Func = unwrap<Function>(Fn);
4337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const AttributeSet PAL = Func->getAttributes();
4437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  AttrBuilder B(PA);
4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  const AttributeSet PALnew =
4637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines    PAL.removeAttributes(Func->getContext(), AttributeSet::FunctionIndex,
4737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                         AttributeSet::get(Func->getContext(),
4837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines                                           AttributeSet::FunctionIndex, B));
4937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines  Func->setAttributes(PALnew);
5037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines}
51ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
52ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesLLVMMetadataRef LLVMConstantAsMetadata(LLVMValueRef C) {
53ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return wrap(ConstantAsMetadata::get(unwrap<Constant>(C)));
54ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
55ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
56ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesLLVMMetadataRef LLVMMDString2(LLVMContextRef C, const char *Str, unsigned SLen) {
57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return wrap(MDString::get(*unwrap(C), StringRef(Str, SLen)));
58ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
59ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
60ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesLLVMMetadataRef LLVMMDNode2(LLVMContextRef C, LLVMMetadataRef *MDs,
61ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                            unsigned Count) {
62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return wrap(
63ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      MDNode::get(*unwrap(C), ArrayRef<Metadata *>(unwrap(MDs), Count)));
64ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
65ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
66ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesLLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef C, LLVMMetadataRef *MDs,
67ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                    unsigned Count) {
68ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  return wrap(MDTuple::getTemporary(*unwrap(C),
69ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                    ArrayRef<Metadata *>(unwrap(MDs), Count))
70ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                  .release());
71ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
72ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
73ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesvoid LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name,
74ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                  LLVMMetadataRef Val) {
75ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  NamedMDNode *N = unwrap(M)->getOrInsertNamedMetadata(name);
76ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (!N)
77ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return;
78ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (!Val)
79ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    return;
80ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  N->addOperand(unwrap<MDNode>(Val));
81ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
82ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
83ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesvoid LLVMSetMetadata2(LLVMValueRef Inst, unsigned KindID, LLVMMetadataRef MD) {
84ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MDNode *N = MD ? unwrap<MDNode>(MD) : nullptr;
85ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  unwrap<Instruction>(Inst)->setMetadata(KindID, N);
86ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
87ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
88ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesvoid LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef MD, LLVMMetadataRef New) {
894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  auto *Node = unwrap<MDNode>(MD);
904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar  Node->replaceAllUsesWith(unwrap<Metadata>(New));
91ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  MDNode::deleteTemporary(Node);
92ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
93ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines
94ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesvoid LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line,
95ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                  unsigned Col, LLVMMetadataRef Scope,
96ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                                  LLVMMetadataRef InlinedAt) {
97ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  unwrap(Bref)->SetCurrentDebugLocation(
98ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines      DebugLoc::get(Line, Col, Scope ? unwrap<MDNode>(Scope) : nullptr,
99ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines                    InlinedAt ? unwrap<MDNode>(InlinedAt) : nullptr));
100ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines}
101