diff --git a/include/llvm-c/Core.h b/include/llvm-c/Core.h index 50985e90646..0bcab83aed9 100644 --- a/include/llvm-c/Core.h +++ b/include/llvm-c/Core.h @@ -33,6 +33,8 @@ #ifndef LLVM_C_CORE_H #define LLVM_C_CORE_H +#include "llvm/Support/DataTypes.h" + #ifdef __cplusplus /* Need these includes to support the LLVM 'cast' template for the C++ 'wrap' @@ -435,8 +437,15 @@ LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty); /* Operations on scalar constants */ LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N, int SignExtend); +LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char *Text, + uint8_t Radix); +LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char *Text, + unsigned SLen, uint8_t Radix); LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N); LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text); +LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char *Text, + unsigned SLen); + /* Operations on composite constants */ LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str, diff --git a/lib/VMCore/Core.cpp b/lib/VMCore/Core.cpp index 1144e53a4d6..b2aa9f45370 100644 --- a/lib/VMCore/Core.cpp +++ b/lib/VMCore/Core.cpp @@ -440,32 +440,29 @@ LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N, return wrap(ConstantInt::get(unwrap(IntTy), N, SignExtend != 0)); } -static const fltSemantics &SemanticsForType(Type *Ty) { - assert(Ty->isFloatingPoint() && "Type is not floating point!"); - if (Ty == Type::getFloatTy(Ty->getContext())) - return APFloat::IEEEsingle; - if (Ty == Type::getDoubleTy(Ty->getContext())) - return APFloat::IEEEdouble; - if (Ty == Type::getX86_FP80Ty(Ty->getContext())) - return APFloat::x87DoubleExtended; - if (Ty == Type::getFP128Ty(Ty->getContext())) - return APFloat::IEEEquad; - if (Ty == Type::getPPC_FP128Ty(Ty->getContext())) - return APFloat::PPCDoubleDouble; - return APFloat::Bogus; +LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char Str[], + uint8_t Radix) { + return wrap(ConstantInt::get(unwrap(IntTy), StringRef(Str), + Radix)); +} + +LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char Str[], + unsigned SLen, uint8_t Radix) { + return wrap(ConstantInt::get(unwrap(IntTy), StringRef(Str, SLen), + Radix)); } LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N) { - APFloat APN(N); - bool ignored; - APN.convert(SemanticsForType(unwrap(RealTy)), APFloat::rmNearestTiesToEven, - &ignored); - return wrap(ConstantFP::get(getGlobalContext(), APN)); + return wrap(ConstantFP::get(unwrap(RealTy), N)); } LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text) { - return wrap(ConstantFP::get(getGlobalContext(), - APFloat(SemanticsForType(unwrap(RealTy)), Text))); + return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Text))); +} + +LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char Str[], + unsigned SLen) { + return wrap(ConstantFP::get(unwrap(RealTy), StringRef(Str, SLen))); } /*--.. Operations on composite constants ...................................--*/