mirror of
https://github.com/intel/llvm.git
synced 2026-01-31 07:27:33 +08:00
The OpenCL standard specifies the sizes and alignments of various types than other C-family
languages, as well as specifying errno is not set by the math functions. Make the clang front-end set those appropriately when the OpenCL language option is set. Patch by Erik Schnetter! llvm-svn: 190296
This commit is contained in:
@@ -354,11 +354,11 @@ public:
|
||||
unsigned getUnwindWordWidth() const { return getPointerWidth(0); }
|
||||
|
||||
/// \brief Return the "preferred" register width on this target.
|
||||
uint64_t getRegisterWidth() const {
|
||||
unsigned getRegisterWidth() const {
|
||||
// Currently we assume the register width on the target matches the pointer
|
||||
// width, we can introduce a new variable for this if/when some target wants
|
||||
// it.
|
||||
return LongWidth;
|
||||
return PointerWidth;
|
||||
}
|
||||
|
||||
/// \brief Returns the default value of the __USER_LABEL_PREFIX__ macro,
|
||||
|
||||
@@ -233,6 +233,35 @@ void TargetInfo::setForcedLangOptions(LangOptions &Opts) {
|
||||
UseBitFieldTypeAlignment = false;
|
||||
if (Opts.ShortWChar)
|
||||
WCharType = UnsignedShort;
|
||||
|
||||
if (Opts.OpenCL) {
|
||||
// OpenCL C requires specific widths for types, irrespective of
|
||||
// what these normally are for the target.
|
||||
// We also define long long and long double here, although the
|
||||
// OpenCL standard only mentions these as "reserved".
|
||||
IntWidth = IntAlign = 32;
|
||||
LongWidth = LongAlign = 64;
|
||||
LongLongWidth = LongLongAlign = 128;
|
||||
HalfWidth = HalfAlign = 16;
|
||||
FloatWidth = FloatAlign = 32;
|
||||
DoubleWidth = DoubleAlign = 64;
|
||||
LongDoubleWidth = LongDoubleAlign = 128;
|
||||
|
||||
assert(PointerWidth == 32 || PointerWidth == 64);
|
||||
bool is32BitArch = PointerWidth == 32;
|
||||
SizeType = is32BitArch ? UnsignedInt : UnsignedLong;
|
||||
PtrDiffType = is32BitArch ? SignedInt : SignedLong;
|
||||
IntPtrType = is32BitArch ? SignedInt : SignedLong;
|
||||
|
||||
IntMaxType = SignedLongLong;
|
||||
UIntMaxType = UnsignedLongLong;
|
||||
Int64Type = SignedLong;
|
||||
|
||||
HalfFormat = &llvm::APFloat::IEEEhalf;
|
||||
FloatFormat = &llvm::APFloat::IEEEsingle;
|
||||
DoubleFormat = &llvm::APFloat::IEEEdouble;
|
||||
LongDoubleFormat = &llvm::APFloat::IEEEquad;
|
||||
}
|
||||
}
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
@@ -1274,7 +1274,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
|
||||
Opts.Blocks = Args.hasArg(OPT_fblocks);
|
||||
Opts.BlocksRuntimeOptional = Args.hasArg(OPT_fblocks_runtime_optional);
|
||||
Opts.Modules = Args.hasArg(OPT_fmodules);
|
||||
Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char);
|
||||
Opts.CharIsSigned = Opts.OpenCL || !Args.hasArg(OPT_fno_signed_char);
|
||||
Opts.WChar = Opts.CPlusPlus && !Args.hasArg(OPT_fno_wchar);
|
||||
Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar);
|
||||
Opts.ShortEnums = Args.hasArg(OPT_fshort_enums);
|
||||
@@ -1285,7 +1285,7 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK,
|
||||
Opts.HeinousExtensions = Args.hasArg(OPT_fheinous_gnu_extensions);
|
||||
Opts.AccessControl = !Args.hasArg(OPT_fno_access_control);
|
||||
Opts.ElideConstructors = !Args.hasArg(OPT_fno_elide_constructors);
|
||||
Opts.MathErrno = Args.hasArg(OPT_fmath_errno);
|
||||
Opts.MathErrno = !Opts.OpenCL && Args.hasArg(OPT_fmath_errno);
|
||||
Opts.InstantiationDepth =
|
||||
getLastArgIntValue(Args, OPT_ftemplate_depth, 256, Diags);
|
||||
Opts.ConstexprCallDepth =
|
||||
|
||||
Reference in New Issue
Block a user