Creating a printing policy for "half":

Since "half" is an OpenCL keyword and clang accepts __fp16 as an extension for
other languages, error messages and metadata (and hence debug info) should refer
to the half-precision floating point as "__fp16" instead of "half" when
compiling for non-OpenCL languages. This patch creates a new printing policy for
half in a similar manner to what is done for bool and wchar_t.

Differential Revision: http://llvm-reviews.chandlerc.com/D2952



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@204164 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Yunzhong Gao 2014-03-18 17:55:18 +00:00
parent 23f8716a55
commit 8cd1d73f00
8 changed files with 16 additions and 5 deletions

View File

@ -41,7 +41,7 @@ struct PrintingPolicy {
ConstantArraySizeAsWritten(false), AnonymousTagLocations(true), ConstantArraySizeAsWritten(false), AnonymousTagLocations(true),
SuppressStrongLifetime(false), SuppressLifetimeQualifiers(false), SuppressStrongLifetime(false), SuppressLifetimeQualifiers(false),
Bool(LO.Bool), TerseOutput(false), PolishForDeclaration(false), Bool(LO.Bool), TerseOutput(false), PolishForDeclaration(false),
MSWChar(LO.MicrosoftExt && !LO.WChar), Half(LO.Half), MSWChar(LO.MicrosoftExt && !LO.WChar),
IncludeNewlines(true) { } IncludeNewlines(true) { }
/// \brief What language we're printing. /// \brief What language we're printing.
@ -153,6 +153,10 @@ struct PrintingPolicy {
/// ///
unsigned PolishForDeclaration : 1; unsigned PolishForDeclaration : 1;
/// \brief When true, print the half-precision floating-point type as 'half'
/// instead of '__fp16'
unsigned Half : 1;
/// \brief When true, print the built-in wchar_t type as __wchar_t. For use in /// \brief When true, print the built-in wchar_t type as __wchar_t. For use in
/// Microsoft mode when wchar_t is not available. /// Microsoft mode when wchar_t is not available.
unsigned MSWChar : 1; unsigned MSWChar : 1;

View File

@ -61,6 +61,7 @@ BENIGN_LANGOPT(ObjCInferRelatedResultType , 1, 1,
LANGOPT(Trigraphs , 1, 0,"trigraphs") LANGOPT(Trigraphs , 1, 0,"trigraphs")
LANGOPT(LineComment , 1, 0, "'//' comments") LANGOPT(LineComment , 1, 0, "'//' comments")
LANGOPT(Bool , 1, 0, "bool, true, and false keywords") LANGOPT(Bool , 1, 0, "bool, true, and false keywords")
LANGOPT(Half , 1, 0, "half keyword")
LANGOPT(WChar , 1, CPlusPlus, "wchar_t keyword") LANGOPT(WChar , 1, CPlusPlus, "wchar_t keyword")
BENIGN_LANGOPT(DollarIdents , 1, 1, "'$' in identifiers") BENIGN_LANGOPT(DollarIdents , 1, 1, "'$' in identifiers")
BENIGN_LANGOPT(AsmPreprocessor, 1, 0, "preprocessor in asm mode") BENIGN_LANGOPT(AsmPreprocessor, 1, 0, "preprocessor in asm mode")

View File

@ -229,6 +229,7 @@ PUNCTUATOR(greatergreatergreater, ">>>")
// KEYALTIVEC - This is a keyword in AltiVec // KEYALTIVEC - This is a keyword in AltiVec
// KEYBORLAND - This is a keyword if Borland extensions are enabled // KEYBORLAND - This is a keyword if Borland extensions are enabled
// BOOLSUPPORT - This is a keyword if 'bool' is a built-in type // BOOLSUPPORT - This is a keyword if 'bool' is a built-in type
// HALFSUPPORT - This is a keyword if 'half' is a built-in type
// WCHARSUPPORT - This is a keyword if 'wchar_t' is a built-in type // WCHARSUPPORT - This is a keyword if 'wchar_t' is a built-in type
// //
KEYWORD(auto , KEYALL) KEYWORD(auto , KEYALL)
@ -492,7 +493,7 @@ KEYWORD(__pixel , KEYALTIVEC)
ALIAS("__fp16", half , KEYALL) ALIAS("__fp16", half , KEYALL)
// OpenCL Extension. // OpenCL Extension.
KEYWORD(half , KEYOPENCL) KEYWORD(half , HALFSUPPORT)
// Objective-C ARC keywords. // Objective-C ARC keywords.
KEYWORD(__bridge , KEYARC) KEYWORD(__bridge , KEYARC)

View File

@ -1523,7 +1523,7 @@ StringRef BuiltinType::getName(const PrintingPolicy &Policy) const {
case ULong: return "unsigned long"; case ULong: return "unsigned long";
case ULongLong: return "unsigned long long"; case ULongLong: return "unsigned long long";
case UInt128: return "unsigned __int128"; case UInt128: return "unsigned __int128";
case Half: return "half"; case Half: return Policy.Half ? "half" : "__fp16";
case Float: return "float"; case Float: return "float";
case Double: return "double"; case Double: return "double";
case LongDouble: return "long double"; case LongDouble: return "long double";

View File

@ -105,6 +105,7 @@ namespace {
KEYARC = 0x800, KEYARC = 0x800,
KEYNOMS = 0x01000, KEYNOMS = 0x01000,
WCHARSUPPORT = 0x02000, WCHARSUPPORT = 0x02000,
HALFSUPPORT = 0x04000,
KEYALL = (0xffff & ~KEYNOMS) // Because KEYNOMS is used to exclude. KEYALL = (0xffff & ~KEYNOMS) // Because KEYNOMS is used to exclude.
}; };
} }
@ -129,6 +130,7 @@ static void AddKeyword(StringRef Keyword,
else if (LangOpts.MicrosoftExt && (Flags & KEYMS)) AddResult = 1; else if (LangOpts.MicrosoftExt && (Flags & KEYMS)) AddResult = 1;
else if (LangOpts.Borland && (Flags & KEYBORLAND)) AddResult = 1; else if (LangOpts.Borland && (Flags & KEYBORLAND)) AddResult = 1;
else if (LangOpts.Bool && (Flags & BOOLSUPPORT)) AddResult = 2; else if (LangOpts.Bool && (Flags & BOOLSUPPORT)) AddResult = 2;
else if (LangOpts.Half && (Flags && HALFSUPPORT)) AddResult = 2;
else if (LangOpts.WChar && (Flags & WCHARSUPPORT)) AddResult = 2; else if (LangOpts.WChar && (Flags & WCHARSUPPORT)) AddResult = 2;
else if (LangOpts.AltiVec && (Flags & KEYALTIVEC)) AddResult = 2; else if (LangOpts.AltiVec && (Flags & KEYALTIVEC)) AddResult = 2;
else if (LangOpts.OpenCL && (Flags & KEYOPENCL)) AddResult = 2; else if (LangOpts.OpenCL && (Flags & KEYOPENCL)) AddResult = 2;

View File

@ -1116,6 +1116,9 @@ void CompilerInvocation::setLangDefaults(LangOptions &Opts, InputKind IK,
// OpenCL and C++ both have bool, true, false keywords. // OpenCL and C++ both have bool, true, false keywords.
Opts.Bool = Opts.OpenCL || Opts.CPlusPlus; Opts.Bool = Opts.OpenCL || Opts.CPlusPlus;
// OpenCL has half keyword
Opts.Half = Opts.OpenCL;
// C++ has wchar_t keyword. // C++ has wchar_t keyword.
Opts.WChar = Opts.CPlusPlus; Opts.WChar = Opts.CPlusPlus;

View File

@ -138,7 +138,7 @@ namespace UndefinedBehavior {
case (int)(unsigned)(long long)4.4e9: // ok case (int)(unsigned)(long long)4.4e9: // ok
case (int)(float)1e300: // expected-error {{constant expression}} expected-note {{value 1.0E+300 is outside the range of representable values of type 'float'}} expected-error {{duplicate case value '2147483647'}} expected-note {{previous case defined here}} case (int)(float)1e300: // expected-error {{constant expression}} expected-note {{value 1.0E+300 is outside the range of representable values of type 'float'}} expected-error {{duplicate case value '2147483647'}} expected-note {{previous case defined here}}
case (int)((float)1e37 / 1e30): // ok case (int)((float)1e37 / 1e30): // ok
case (int)(__fp16)65536: // expected-error {{constant expression}} expected-note {{value 65536 is outside the range of representable values of type 'half'}} expected-error {{duplicate case value '2147483647'}} case (int)(__fp16)65536: // expected-error {{constant expression}} expected-note {{value 65536 is outside the range of representable values of type '__fp16'}} expected-error {{duplicate case value '2147483647'}}
break; break;
} }
} }

View File

@ -6,7 +6,7 @@ void test_floating_promotion(__fp16 *f16, float f32, double f64) {
variadic(3, *f16, f32, f64); variadic(3, *f16, f32, f64);
// CHECK: ImplicitCastExpr {{.*}} 'double' <FloatingCast> // CHECK: ImplicitCastExpr {{.*}} 'double' <FloatingCast>
// CHECK-NEXT: 'half' // CHECK-NEXT: '__fp16'
// CHECK: ImplicitCastExpr {{.*}} 'double' <FloatingCast> // CHECK: ImplicitCastExpr {{.*}} 'double' <FloatingCast>
// CHECK-NEXT: 'float' // CHECK-NEXT: 'float'