//===- IRBindings.cpp - Additional bindings for ir ------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // 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))); } 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 LLVMGoSetCurrentDebugLocation(LLVMBuilderRef Bref, unsigned Line, unsigned Col, LLVMMetadataRef Scope, LLVMMetadataRef InlinedAt) { if (!Scope) unwrap(Bref)->SetCurrentDebugLocation(DebugLoc()); else unwrap(Bref)->SetCurrentDebugLocation(DILocation::get( unwrap(Scope)->getContext(), Line, Col, unwrap(Scope), InlinedAt ? unwrap(InlinedAt) : nullptr)); } LLVMDebugLocMetadata LLVMGoGetCurrentDebugLocation(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; }