//===- IRBindings.cpp - Additional bindings for ir ------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines additional C bindings for the ir component. // //===----------------------------------------------------------------------===// #include "IRBindings.h" #include "llvm/IR/Attributes.h" #include "llvm/IR/DebugLoc.h" #include "llvm/IR/DebugInfoMetadata.h" #include "llvm/IR/Function.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/LLVMContext.h" #include "llvm/IR/Module.h" using namespace llvm; LLVMMetadataRef LLVMConstantAsMetadata(LLVMValueRef C) { return wrap(ConstantAsMetadata::get(unwrap(C))); } LLVMMetadataRef LLVMMDString2(LLVMContextRef C, const char *Str, unsigned SLen) { return wrap(MDString::get(*unwrap(C), StringRef(Str, SLen))); } LLVMMetadataRef LLVMMDNode2(LLVMContextRef C, LLVMMetadataRef *MDs, unsigned Count) { return wrap( MDNode::get(*unwrap(C), ArrayRef(unwrap(MDs), Count))); } LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef C, LLVMMetadataRef *MDs, unsigned Count) { return wrap(MDTuple::getTemporary(*unwrap(C), ArrayRef(unwrap(MDs), Count)) .release()); } void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name, LLVMMetadataRef Val) { NamedMDNode *N = unwrap(M)->getOrInsertNamedMetadata(name); if (!N) return; if (!Val) return; N->addOperand(unwrap(Val)); } void LLVMSetMetadata2(LLVMValueRef Inst, unsigned KindID, LLVMMetadataRef MD) { MDNode *N = MD ? unwrap(MD) : nullptr; unwrap(Inst)->setMetadata(KindID, N); } void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef MD, LLVMMetadataRef New) { auto *Node = unwrap(MD); Node->replaceAllUsesWith(unwrap(New)); MDNode::deleteTemporary(Node); } void LLVMSetCurrentDebugLocation2(LLVMBuilderRef Bref, unsigned Line, unsigned Col, LLVMMetadataRef Scope, LLVMMetadataRef InlinedAt) { unwrap(Bref)->SetCurrentDebugLocation( DebugLoc::get(Line, Col, Scope ? unwrap(Scope) : nullptr, InlinedAt ? unwrap(InlinedAt) : nullptr)); } LLVMDebugLocMetadata LLVMGetCurrentDebugLocation2(LLVMBuilderRef Bref) { const auto& Loc = unwrap(Bref)->getCurrentDebugLocation(); const auto* InlinedAt = Loc.getInlinedAt(); const LLVMDebugLocMetadata md{ Loc.getLine(), Loc.getCol(), wrap(Loc.getScope()), InlinedAt == nullptr ? nullptr : wrap(InlinedAt->getRawInlinedAt()), }; return md; } void LLVMSetSubprogram(LLVMValueRef Func, LLVMMetadataRef SP) { unwrap(Func)->setSubprogram(unwrap(SP)); }