aboutsummaryrefslogtreecommitdiff
path: root/clang/utils/TableGen/ClangBuiltinsEmitter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/utils/TableGen/ClangBuiltinsEmitter.cpp')
-rw-r--r--clang/utils/TableGen/ClangBuiltinsEmitter.cpp28
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++";
}