//===-- Core.cpp ----------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file implements the C bindings for libLLVMCore.a, which implements
// the LLVM intermediate representation.
//
//===----------------------------------------------------------------------===//
#include "llvm-c/Core.h"
#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/Constants.h"
#include "llvm/DerivedTypes.h"
#include "llvm/GlobalVariable.h"
#include "llvm/TypeSymbolTable.h"
#include "llvm/ModuleProvider.h"
#include "llvm/Support/MemoryBuffer.h"
#include <cassert>
#include <cstdlib>
using namespace llvm;
/*===-- Error handling ----------------------------------------------------===*/
void LLVMDisposeMessage(char *Message) {
free(Message);
}
/*===-- Operations on modules ---------------------------------------------===*/
LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID) {
return wrap(new Module(ModuleID));
}
void LLVMDisposeModule(LLVMModuleRef M) {
delete unwrap(M);
}
/*--.. Data layout .........................................................--*/
const char * LLVMGetDataLayout(LLVMModuleRef M) {
return unwrap(M)->getDataLayout().c_str();
}
void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple) {
unwrap(M)->setDataLayout(Triple);
}
/*--.. Target triple .......................................................--*/
const char * LLVMGetTarget(LLVMModuleRef M) {
return unwrap(M)->getTargetTriple().c_str();
}
void LLVMSetTarget(LLVMModuleRef M, const char *Triple) {
unwrap(M)->setTargetTriple(Triple);
}
/*--.. Type names ..........................................................--*/
int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty) {
return unwrap(M)->addTypeName(Name, unwrap(Ty));
}
void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name) {
std::string N(Name);
TypeSymbolTable &TST = unwrap(M)->getTypeSymbolTable();
for (TypeSymbolTable::iterator I = TST.begin(), E = TST.end(); I != E; ++I)
if (I->first == N)
TST.remove(I);
}
/*===-- Operations on types -----------------------------------------------===*/
/*--.. Operations on all types (mostly) ....................................--*/
LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty) {
return static_cast<LLVMTypeKind>(unwrap(Ty)->getTypeID());
}
void LLVMRefineAbstractType(LLVMTypeRef AbstractType, LLVMTypeRef ConcreteType){
DerivedType *Ty = unwrap<DerivedType>(AbstractType);
Ty->refineAbstractTypeTo(unwrap(ConcreteType));
}
/*--.. Operations on integer types .........................................--*/
LLVMTypeRef LLVMInt1Type() { return (LLVMTypeRef) Type::Int1Ty; }
LLVMTypeRef LLVMInt8Type() { return (LLVMTypeRef) Type::Int8Ty; }
LLVMTypeRef LLVMInt16Type() { return (LLVMTypeRef) Type::Int16Ty; }
LLVMTypeRef LLVMInt32Type() { return (LLVMTypeRef) Type::Int32Ty; }
LLVMTypeRef LLVMInt64Type() { return (LLVMTypeRef) Type::Int64Ty; }
LLVMTypeRef LLVMIntType(unsigned NumBits) {
return wrap(IntegerType::get(NumBits));
}
unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy) {
return unwrap<IntegerType>(IntegerTy)->getBitWidth();
}
/*--.. Operations on real types ............................................--*/
LLVMTypeRef LLVMFloatType() { return (LLVMTypeRef) Type::FloatTy; }
LLVMTypeRef LLVMDoubleType() { return (LLVMTypeRef) Type::DoubleTy; }
LLVMTypeRef LLVMX86FP80Type()