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