packages feed

llvm-general-0.1: src/LLVM/General/Internal/FFI/MetadataC.cpp

#define __STDC_LIMIT_MACROS
#include "llvm/LLVMContext.h"
#include "llvm/Metadata.h"

#include "llvm-c/Core.h"

using namespace llvm;

extern "C" {

unsigned LLVM_General_GetMDKindNames(
	LLVMContextRef c,
	const char **s,
	unsigned *l,
	unsigned n
) {
	SmallVector<StringRef, 16> ns;
	unwrap(c)->getMDKindNames(ns);
	if (ns.size() <= n) {
		for(unsigned i=0; i < ns.size(); ++i) {
			s[i] = ns[i].data();
			l[i] = ns[i].size();
		}
	}
	return ns.size();
}

unsigned LLVM_General_GetMDNodeNumOperands(LLVMValueRef v) {
	return unwrap<MDNode>(v)->getNumOperands();
}

unsigned LLVM_General_MDNodeIsFunctionLocal(LLVMValueRef v) {
	return unwrap<MDNode>(v)->isFunctionLocal();
}

void LLVM_General_NamedMetadataAddOperands(
	NamedMDNode *n,
	LLVMValueRef *ops,
	unsigned nOps
) {
	for(unsigned i = 0; i != nOps; ++i) n->addOperand(unwrap<MDNode>(ops[i]));
}

const char *LLVM_General_GetNamedMetadataName(
	NamedMDNode *n,
	unsigned *len
) {
	StringRef s = n->getName();
	*len = s.size();
	return s.data();
}

unsigned LLVM_General_GetNamedMetadataNumOperands(NamedMDNode *n) {
	return n->getNumOperands();
}

void LLVM_General_GetNamedMetadataOperands(NamedMDNode *n, LLVMValueRef *dest) {
	for(unsigned i = 0; i != n->getNumOperands(); ++i)
		dest[i] = wrap(n->getOperand(i));
}

LLVMValueRef LLVM_General_CreateTemporaryMDNodeInContext(LLVMContextRef c) {
	return wrap(MDNode::getTemporary(*unwrap(c), ArrayRef<Value *>()));
}

void LLVM_General_DestroyTemporaryMDNode(LLVMValueRef v) {
	MDNode::deleteTemporary(unwrap<MDNode>(v));
}

}