Revert "[NFC] Refactor TableGen for attributes"
authorTyker <tyker1@outlook.com>
Sun, 2 Feb 2020 14:03:37 +0000 (15:03 +0100)
committerTyker <tyker1@outlook.com>
Sun, 2 Feb 2020 14:05:33 +0000 (15:05 +0100)
This reverts commit 4dba14cf37abda16ab33cb748a5c762dae2e95e9.

llvm/include/llvm/IR/Attributes.h
llvm/lib/IR/Attributes.cpp
llvm/lib/IR/AttributesCompatFunc.td [new file with mode: 0644]
llvm/lib/IR/CMakeLists.txt
llvm/lib/IR/Core.cpp
llvm/utils/TableGen/Attributes.cpp

index cb4b5b7..619c1f0 100644 (file)
@@ -70,8 +70,7 @@ public:
   enum AttrKind {
     // IR-Level Attributes
     None,                  ///< No attributes have been set
-    #define GET_ATTR_NAMES
-    #define ATTRIBUTE_ENUM(ENUM_NAME, OTHER) ENUM_NAME,
+    #define GET_ATTR_ENUM
     #include "llvm/IR/Attributes.inc"
     EndAttrKinds           ///< Sentinal value useful for loops
   };
index b184aca..efc7168 100644 (file)
@@ -1850,49 +1850,8 @@ adjustNullPointerValidAttr(Function &Caller, const Function &Callee) {
   }
 }
 
-struct EnumAttr {
-  static bool isSet(const Function &Fn,
-                    Attribute::AttrKind Kind) {
-    return Fn.hasFnAttribute(Kind);
-  }
-
-  static void set(Function &Fn,
-                  Attribute::AttrKind Kind, bool Val) {
-    if (Val)
-      Fn.addFnAttr(Kind);
-    else
-      Fn.removeFnAttr(Kind);
-  }
-};
-
-struct StrBoolAttr {
-  static bool isSet(const Function &Fn,
-                    StringRef Kind) {
-    auto A = Fn.getFnAttribute(Kind);
-    return A.getValueAsString().equals("true");
-  }
-
-  static void set(Function &Fn,
-                  StringRef Kind, bool Val) {
-    Fn.addFnAttr(Kind, Val ? "true" : "false");
-  }
-};
-
-#define GET_ATTR_NAMES
-#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME)                                \
-  struct ENUM_NAME##Attr : EnumAttr {                                          \
-    static enum Attribute::AttrKind getKind() {                                \
-      return llvm::Attribute::ENUM_NAME;                                       \
-    }                                                                          \
-  };
-#define ATTRIBUTE_STRBOOL(ENUM_NAME, DISPLAY_NAME)                             \
-  struct ENUM_NAME##Attr : StrBoolAttr {                                       \
-    static StringRef getKind() { return #DISPLAY_NAME; }                       \
-  };
-#include "llvm/IR/Attributes.inc"
-
 #define GET_ATTR_COMPAT_FUNC
-#include "llvm/IR/Attributes.inc"
+#include "AttributesCompatFunc.inc"
 
 bool AttributeFuncs::areInlineCompatible(const Function &Caller,
                                          const Function &Callee) {
diff --git a/llvm/lib/IR/AttributesCompatFunc.td b/llvm/lib/IR/AttributesCompatFunc.td
new file mode 100644 (file)
index 0000000..7c85b3d
--- /dev/null
@@ -0,0 +1 @@
+include "llvm/IR/Attributes.td"
index 1a36acd..b1fe5e1 100644 (file)
@@ -1,3 +1,7 @@
+set(LLVM_TARGET_DEFINITIONS AttributesCompatFunc.td)
+tablegen(LLVM AttributesCompatFunc.inc -gen-attrs)
+add_public_tablegen_target(AttributeCompatFuncTableGen)
+
 add_llvm_component_library(LLVMCore
   AbstractCallSite.cpp
   AsmWriter.cpp
index 11deab8..04e34a9 100644 (file)
@@ -127,14 +127,8 @@ unsigned LLVMGetMDKindID(const char *Name, unsigned SLen) {
   return LLVMGetMDKindIDInContext(LLVMGetGlobalContext(), Name, SLen);
 }
 
-static Attribute::AttrKind getAttrKindFromName(StringRef AttrName) {
-  return StringSwitch<Attribute::AttrKind>(AttrName)
-#define GET_ATTR_NAMES
-#define ATTRIBUTE_ENUM(ENUM_NAME, DISPLAY_NAME)                                \
-  .Case(#DISPLAY_NAME, Attribute::ENUM_NAME)
-#include "llvm/IR/Attributes.inc"
-      .Default(Attribute::None);
-}
+#define GET_ATTR_KIND_FROM_NAME
+#include "AttributesCompatFunc.inc"
 
 unsigned LLVMGetEnumAttributeKindForName(const char *Name, size_t SLen) {
   return getAttrKindFromName(StringRef(Name, SLen));
index b784f53..6fbc595 100644 (file)
@@ -23,41 +23,51 @@ public:
   void emit(raw_ostream &OS);
 
 private:
-  void emitTargetIndependentNames(raw_ostream &OS);
+  void emitTargetIndependentEnums(raw_ostream &OS);
+  void emitConversionFn(raw_ostream &OS);
   void emitFnAttrCompatCheck(raw_ostream &OS, bool IsStringAttr);
 
+  void printEnumAttrClasses(raw_ostream &OS,
+                            const std::vector<Record *> &Records);
+  void printStrBoolAttrClasses(raw_ostream &OS,
+                               const std::vector<Record *> &Records);
+
   RecordKeeper &Records;
 };
 
 } // End anonymous namespace.
 
-void Attributes::emitTargetIndependentNames(raw_ostream &OS) {
-  OS << "#ifdef GET_ATTR_NAMES\n";
-  OS << "#undef GET_ATTR_NAMES\n";
+void Attributes::emitTargetIndependentEnums(raw_ostream &OS) {
+  OS << "#ifdef GET_ATTR_ENUM\n";
+  OS << "#undef GET_ATTR_ENUM\n";
 
-  OS << "#ifndef ATTRIBUTE_ALL\n";
-  OS << "#define ATTRIBUTE_ALL(FIRST, SECOND)\n";
-  OS << "#endif\n\n";
+  std::vector<Record*> Attrs =
+      Records.getAllDerivedDefinitions("EnumAttr");
 
-  auto Emiter = [&](StringRef KindName, StringRef MacroName) {
-    std::vector<Record *> Attrs = Records.getAllDerivedDefinitions(KindName);
+  for (auto A : Attrs)
+    OS << A->getName() << ",\n";
 
-    OS << "#ifndef " << MacroName << "\n";
-    OS << "#define " << MacroName << "(FIRST, SECOND) ATTRIBUTE_ALL(FIRST, "
-          "SECOND)\n";
-    OS << "#endif\n\n";
+  OS << "#endif\n";
+}
 
-    for (auto A : Attrs) {
-      OS << "" << MacroName << "(" << A->getName() << ","
-         << A->getValueAsString("AttrString") << ")\n";
-    }
-    OS << "#undef " << MacroName << "\n\n";
-  };
+void Attributes::emitConversionFn(raw_ostream &OS) {
+  OS << "#ifdef GET_ATTR_KIND_FROM_NAME\n";
+  OS << "#undef GET_ATTR_KIND_FROM_NAME\n";
 
-  Emiter("EnumAttr", "ATTRIBUTE_ENUM");
-  Emiter("StrBoolAttr", "ATTRIBUTE_STRBOOL");
+  std::vector<Record*> Attrs =
+      Records.getAllDerivedDefinitions("EnumAttr");
+
+  OS << "static Attribute::AttrKind getAttrKindFromName(StringRef AttrName) {\n";
+  OS << "  return StringSwitch<Attribute::AttrKind>(AttrName)\n";
+
+  for (auto A : Attrs) {
+    OS << "    .Case(\"" << A->getValueAsString("AttrString");
+    OS << "\", Attribute::" << A->getName() << ")\n";
+  }
+
+  OS << "    .Default(Attribute::None);\n";
+  OS << "}\n\n";
 
-  OS << "#undef ATTRIBUTE_ALL\n";
   OS << "#endif\n";
 }
 
@@ -65,6 +75,35 @@ void Attributes::emitFnAttrCompatCheck(raw_ostream &OS, bool IsStringAttr) {
   OS << "#ifdef GET_ATTR_COMPAT_FUNC\n";
   OS << "#undef GET_ATTR_COMPAT_FUNC\n";
 
+  OS << "struct EnumAttr {\n";
+  OS << "  static bool isSet(const Function &Fn,\n";
+  OS << "                    Attribute::AttrKind Kind) {\n";
+  OS << "    return Fn.hasFnAttribute(Kind);\n";
+  OS << "  }\n\n";
+  OS << "  static void set(Function &Fn,\n";
+  OS << "                  Attribute::AttrKind Kind, bool Val) {\n";
+  OS << "    if (Val)\n";
+  OS << "      Fn.addFnAttr(Kind);\n";
+  OS << "    else\n";
+  OS << "      Fn.removeFnAttr(Kind);\n";
+  OS << "  }\n";
+  OS << "};\n\n";
+
+  OS << "struct StrBoolAttr {\n";
+  OS << "  static bool isSet(const Function &Fn,\n";
+  OS << "                    StringRef Kind) {\n";
+  OS << "    auto A = Fn.getFnAttribute(Kind);\n";
+  OS << "    return A.getValueAsString().equals(\"true\");\n";
+  OS << "  }\n\n";
+  OS << "  static void set(Function &Fn,\n";
+  OS << "                  StringRef Kind, bool Val) {\n";
+  OS << "    Fn.addFnAttr(Kind, Val ? \"true\" : \"false\");\n";
+  OS << "  }\n";
+  OS << "};\n\n";
+
+  printEnumAttrClasses(OS ,Records.getAllDerivedDefinitions("EnumAttr"));
+  printStrBoolAttrClasses(OS , Records.getAllDerivedDefinitions("StrBoolAttr"));
+
   OS << "static inline bool hasCompatibleFnAttrs(const Function &Caller,\n"
      << "                                        const Function &Callee) {\n";
   OS << "  bool Ret = true;\n\n";
@@ -96,8 +135,35 @@ void Attributes::emitFnAttrCompatCheck(raw_ostream &OS, bool IsStringAttr) {
   OS << "#endif\n";
 }
 
+void Attributes::printEnumAttrClasses(raw_ostream &OS,
+                                      const std::vector<Record *> &Records) {
+  OS << "// EnumAttr classes\n";
+  for (const auto *R : Records) {
+    OS << "struct " << R->getName() << "Attr : EnumAttr {\n";
+    OS << "  static enum Attribute::AttrKind getKind() {\n";
+    OS << "    return llvm::Attribute::" << R->getName() << ";\n";
+    OS << "  }\n";
+    OS << "};\n";
+  }
+  OS << "\n";
+}
+
+void Attributes::printStrBoolAttrClasses(raw_ostream &OS,
+                                         const std::vector<Record *> &Records) {
+  OS << "// StrBoolAttr classes\n";
+  for (const auto *R : Records) {
+    OS << "struct " << R->getName() << "Attr : StrBoolAttr {\n";
+    OS << "  static StringRef getKind() {\n";
+    OS << "    return \"" << R->getValueAsString("AttrString") << "\";\n";
+    OS << "  }\n";
+    OS << "};\n";
+  }
+  OS << "\n";
+}
+
 void Attributes::emit(raw_ostream &OS) {
-  emitTargetIndependentNames(OS);
+  emitTargetIndependentEnums(OS);
+  emitConversionFn(OS);
   emitFnAttrCompatCheck(OS, false);
 }