diff options
-rw-r--r-- | clang/lib/Basic/TargetInfo.cpp | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index d0ed6e6b161..7ee2706d3e1 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -244,7 +244,14 @@ void TargetInfo::setForcedLangOptions(LangOptions &Opts) { LongLongWidth = LongLongAlign = 128; HalfWidth = HalfAlign = 16; FloatWidth = FloatAlign = 32; - DoubleWidth = DoubleAlign = 64; + + // Embedded 32-bit targets (OpenCL EP) might have double C type + // defined as float. Let's not override this as it might lead + // to generating illegal code that uses 64bit doubles. + if (DoubleWidth != FloatWidth) { + DoubleWidth = DoubleAlign = 64; + DoubleFormat = &llvm::APFloat::IEEEdouble; + } LongDoubleWidth = LongDoubleAlign = 128; assert(PointerWidth == 32 || PointerWidth == 64); @@ -259,7 +266,6 @@ void TargetInfo::setForcedLangOptions(LangOptions &Opts) { HalfFormat = &llvm::APFloat::IEEEhalf; FloatFormat = &llvm::APFloat::IEEEsingle; - DoubleFormat = &llvm::APFloat::IEEEdouble; LongDoubleFormat = &llvm::APFloat::IEEEquad; } } |