packages feed

llvm-general-3.2.0.3: src/LLVM/General/Internal/FFI/ModuleC.cpp

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

#include "llvm-c/Core.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Bitcode/ReaderWriter.h"

using namespace llvm;

extern "C" {

char *LLVM_General_GetModuleIdentifier(LLVMModuleRef val) {
	return strdup(unwrap(val)->getModuleIdentifier().c_str());
}

LLVMValueRef LLVM_General_GetFirstAlias(LLVMModuleRef m) {
	Module *mod = unwrap(m);
	Module::alias_iterator i = mod->alias_begin();
	return i == mod->alias_end() ? 0 : wrap(i);
}

LLVMValueRef LLVM_General_GetNextAlias(LLVMValueRef a) {
	GlobalAlias *alias = unwrap<GlobalAlias>(a);
	Module::alias_iterator i = alias;
	if (++i == alias->getParent()->alias_end()) return 0;
	return wrap(i);
}

LLVMValueRef LLVM_General_JustAddAlias(LLVMModuleRef m, LLVMTypeRef ty, const char *name) {
	return wrap(new GlobalAlias(unwrap(ty), GlobalValue::ExternalLinkage, name, 0, unwrap(m)));
}

NamedMDNode *LLVM_General_GetOrAddNamedMetadata(LLVMModuleRef m, const char *name) {
	return unwrap(m)->getOrInsertNamedMetadata(name);
}

NamedMDNode *LLVM_General_GetFirstNamedMetadata(LLVMModuleRef m) {
	Module *mod = unwrap(m);
	Module::named_metadata_iterator i = mod->named_metadata_begin();
	return i == mod->named_metadata_end() ? 0 : i;
}

NamedMDNode *LLVM_General_GetNextNamedMetadata(NamedMDNode *a) {
	Module::named_metadata_iterator i = a;
	if (++i == a->getParent()->named_metadata_end()) return 0;
	return i;
}

void LLVM_General_ModuleAppendInlineAsm(LLVMModuleRef m, const char *s, unsigned l) {
	unwrap(m)->appendModuleInlineAsm(StringRef(s,l));
}

const char *LLVM_General_ModuleGetInlineAsm(LLVMModuleRef m) {
	return unwrap(m)->getModuleInlineAsm().c_str();
}

LLVMBool LLVM_General_WriteBitcodeToFile(LLVMModuleRef m, const char *path, char **error) {
  std::string ErrorInfo;
  raw_fd_ostream OS(path, ErrorInfo, raw_fd_ostream::F_Binary);

  if (!ErrorInfo.empty()) {
    *error = strdup(ErrorInfo.c_str());
    return -1;
  }

  WriteBitcodeToFile(unwrap(m), OS);
  return 0;
}

}