diff options
Diffstat (limited to 'clang/utils/TableGen/ClangBuiltinsEmitter.cpp')
-rw-r--r-- | clang/utils/TableGen/ClangBuiltinsEmitter.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/clang/utils/TableGen/ClangBuiltinsEmitter.cpp b/clang/utils/TableGen/ClangBuiltinsEmitter.cpp index 6c3604a..94cc218 100644 --- a/clang/utils/TableGen/ClangBuiltinsEmitter.cpp +++ b/clang/utils/TableGen/ClangBuiltinsEmitter.cpp @@ -25,12 +25,14 @@ enum class BuiltinType { LibBuiltin, LangBuiltin, TargetBuiltin, + TargetLibBuiltin, }; class PrototypeParser { public: PrototypeParser(StringRef Substitution, const Record *Builtin) - : Loc(Builtin->getFieldLoc("Prototype")), Substitution(Substitution) { + : Loc(Builtin->getFieldLoc("Prototype")), Substitution(Substitution), + EnableOpenCLLong(Builtin->getValueAsBit("EnableOpenCLLong")) { ParsePrototype(Builtin->getValueAsString("Prototype")); } @@ -108,9 +110,15 @@ private: } else if (T.consume_back("&")) { ParseType(T); Type += "&"; + } else if (EnableOpenCLLong && T.consume_front("long long")) { + Type += "O"; + ParseType(T); } else if (T.consume_front("long")) { Type += "L"; ParseType(T); + } else if (T.consume_front("signed")) { + Type += "S"; + ParseType(T); } else if (T.consume_front("unsigned")) { Type += "U"; ParseType(T); @@ -155,6 +163,7 @@ private: .Case("__fp16", "h") .Case("__int128_t", "LLLi") .Case("_Float16", "x") + .Case("__bf16", "y") .Case("bool", "b") .Case("char", "c") .Case("constant_CFString", "F") @@ -194,6 +203,7 @@ public: private: SMLoc Loc; StringRef Substitution; + bool EnableOpenCLLong; std::string Type; }; @@ -262,6 +272,9 @@ void EmitBuiltinDef(raw_ostream &OS, StringRef Substitution, case BuiltinType::TargetBuiltin: OS << "TARGET_BUILTIN"; break; + case BuiltinType::TargetLibBuiltin: + OS << "TARGET_HEADER_BUILTIN"; + break; } OS << "(" << Spelling; @@ -279,6 +292,12 @@ void EmitBuiltinDef(raw_ostream &OS, StringRef Substitution, OS << ", " << Builtin->getValueAsString("Languages"); break; } + case BuiltinType::TargetLibBuiltin: { + OS << ", "; + HeaderNameParser{Builtin}.Print(OS); + OS << ", " << Builtin->getValueAsString("Languages"); + [[fallthrough]]; + } case BuiltinType::TargetBuiltin: OS << ", \"" << Builtin->getValueAsString("Features") << "\""; break; @@ -331,6 +350,8 @@ void EmitBuiltin(raw_ostream &OS, const Record *Builtin) { BT = BuiltinType::AtomicBuiltin; } else if (Builtin->isSubClassOf("LangBuiltin")) { BT = BuiltinType::LangBuiltin; + } else if (Builtin->isSubClassOf("TargetLibBuiltin")) { + BT = BuiltinType::TargetLibBuiltin; } else if (Builtin->isSubClassOf("TargetBuiltin")) { BT = BuiltinType::TargetBuiltin; } else if (Builtin->isSubClassOf("LibBuiltin")) { @@ -367,6 +388,10 @@ void clang::EmitClangBuiltins(const RecordKeeper &Records, raw_ostream &OS) { #if defined(BUILTIN) && !defined(TARGET_BUILTIN) # define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) BUILTIN(ID, TYPE, ATTRS) #endif + +#if defined(BUILTIN) && !defined(TARGET_HEADER_BUILTIN) +# define TARGET_HEADER_BUILTIN(ID, TYPE, ATTRS, HEADER, LANG, FEATURE) BUILTIN(ID, TYPE, ATTRS) +#endif )c++"; // AtomicBuiltins are order dependent @@ -390,5 +415,6 @@ void clang::EmitClangBuiltins(const RecordKeeper &Records, raw_ostream &OS) { #undef LIBBUILTIN #undef LANGBUILTIN #undef TARGET_BUILTIN +#undef TARGET_HEADER_BUILTIN )c++"; } |