-
Notifications
You must be signed in to change notification settings - Fork 14.3k
Remove the CustomEntry
escape hatch from builtin TableGen
#120861
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang Author: Chandler Carruth (chandlerc) ChangesThis was an especially challenging escape hatch because it directly forced the use of a specific X-macro structure and prevented any other form of TableGen emission. The problematic feature that motivated this is a case where a builtin's prototype can't be represented in the mini-language used by TableGen. Instead of adding a complete custom entry for this, this PR just teaches the prototype handling to do the same thing the X-macros did in this case: emit an empty string and let the Clang builtin handling respond appropriately. This should produce identical results while preserving all the rest of the structured representation in the builtin TableGen code. Full diff: https://github.com/llvm/llvm-project/pull/120861.diff 3 Files Affected:
diff --git a/clang/include/clang/Basic/Builtins.td b/clang/include/clang/Basic/Builtins.td
index d64a66fc9d9cf7..9f5647dc719f33 100644
--- a/clang/include/clang/Basic/Builtins.td
+++ b/clang/include/clang/Basic/Builtins.td
@@ -3347,10 +3347,12 @@ def VFork : LibBuiltin<"unistd.h"> {
}
// POSIX pthread.h
-// FIXME: This should be a GNULibBuiltin, but it's currently missing the prototype.
-def PthreadCreate : CustomEntry {
- let Entry = "LIBBUILTIN(pthread_create, \"\", \"fC<2,3>\", PTHREAD_H, ALL_GNU_LANGUAGES)";
+def PthreadCreate : GNULibBuiltin<"pthread.h"> {
+ let Spellings = ["pthread_create"];
+ let Attributes = [FunctionWithoutBuiltinPrefix, Callback<[2, 3]>];
+ // Note that we don't have an expressable prototype so we leave it empty.
+ let Prototype = "";
}
def SigSetJmp : LibBuiltin<"setjmp.h"> {
diff --git a/clang/include/clang/Basic/BuiltinsBase.td b/clang/include/clang/Basic/BuiltinsBase.td
index cff182f3f282cb..8a3f024c20f446 100644
--- a/clang/include/clang/Basic/BuiltinsBase.td
+++ b/clang/include/clang/Basic/BuiltinsBase.td
@@ -17,6 +17,11 @@ class IndexedAttribute<string baseMangling, int I> : Attribute<baseMangling> {
int Index = I;
}
+class MultiIndexAttribute<string baseMangling, list<int> Is>
+ : Attribute<baseMangling> {
+ list<int> Indices = Is;
+}
+
// Standard Attributes
// -------------------
def NoReturn : Attribute<"r">;
@@ -77,6 +82,10 @@ def Constexpr : Attribute<"E">;
// Builtin is immediate and must be constant evaluated. Implies Constexpr, and will only be supported in C++20 mode.
def Consteval : Attribute<"EG">;
+// Callback behavior: the first index argument is called with the arguments
+// indicated by the remaining indices.
+class Callback<list<int> ArgIndices> : MultiIndexAttribute<"C", ArgIndices>;
+
// Builtin kinds
// =============
@@ -90,10 +99,6 @@ class Builtin {
bit RequiresUndef = 0;
}
-class CustomEntry {
- string Entry;
-}
-
class AtomicBuiltin : Builtin;
class TargetBuiltin : Builtin {
string Features = "";
diff --git a/clang/utils/TableGen/ClangBuiltinsEmitter.cpp b/clang/utils/TableGen/ClangBuiltinsEmitter.cpp
index 6c3604adc92b99..f675dd154a7c97 100644
--- a/clang/utils/TableGen/ClangBuiltinsEmitter.cpp
+++ b/clang/utils/TableGen/ClangBuiltinsEmitter.cpp
@@ -11,6 +11,7 @@
//===----------------------------------------------------------------------===//
#include "TableGenBackends.h"
+#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/TableGen/Error.h"
#include "llvm/TableGen/Record.h"
@@ -37,6 +38,14 @@ class PrototypeParser {
private:
void ParsePrototype(StringRef Prototype) {
Prototype = Prototype.trim();
+
+ // Some builtins don't have an expressible prototype, simply emit an empty
+ // string for them.
+ if (Prototype.empty()) {
+ Type = "";
+ return;
+ }
+
ParseTypes(Prototype);
}
@@ -236,8 +245,15 @@ void PrintAttributes(const Record *Builtin, BuiltinType BT, raw_ostream &OS) {
for (const auto *Attr : Builtin->getValueAsListOfDefs("Attributes")) {
OS << Attr->getValueAsString("Mangling");
- if (Attr->isSubClassOf("IndexedAttribute"))
+ if (Attr->isSubClassOf("IndexedAttribute")) {
OS << ':' << Attr->getValueAsInt("Index") << ':';
+ } else if (Attr->isSubClassOf("MultiIndexAttribute")) {
+ OS << '<';
+ llvm::ListSeparator Sep(",");
+ for (int64_t Index : Attr->getValueAsListOfInts("Indices"))
+ OS << Sep << Index;
+ OS << '>';
+ }
}
OS << '\"';
}
@@ -380,10 +396,6 @@ void clang::EmitClangBuiltins(const RecordKeeper &Records, raw_ostream &OS) {
EmitBuiltin(OS, Builtin);
}
- for (const auto *Entry : Records.getAllDerivedDefinitions("CustomEntry")) {
- OS << Entry->getValueAsString("Entry") << '\n';
- }
-
OS << R"c++(
#undef ATOMIC_BUILTIN
#undef BUILTIN
|
This was an especially challenging escape hatch because it directly forced the use of a specific X-macro structure and prevented any other form of TableGen emission. The problematic feature that motivated this is a case where a builtin's prototype can't be represented in the mini-language used by TableGen. Instead of adding a complete custom entry for this, this PR just teaches the prototype handling to do the same thing the X-macros did in this case: emit an empty string and let the Clang builtin handling respond appropriately. This should produce identical results while preserving all the rest of the structured representation in the builtin TableGen code.
b803cab
to
e50a1dc
Compare
Rebased -- ping for a review in the new year maybe? I think this one is pretty simple... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
This was an especially challenging escape hatch because it directly forced the use of a specific X-macro structure and prevented any other form of TableGen emission.
The problematic feature that motivated this is a case where a builtin's prototype can't be represented in the mini-language used by TableGen. Instead of adding a complete custom entry for this, this PR just teaches the prototype handling to do the same thing the X-macros did in this case: emit an empty string and let the Clang builtin handling respond appropriately.
This should produce identical results while preserving all the rest of the structured representation in the builtin TableGen code.