[llvm] r323383 - [TableGen] Add a way of getting the number of generic opcodes without including modular CodeGen headers.

Benjamin Kramer via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 24 14:35:11 PST 2018


Author: d0k
Date: Wed Jan 24 14:35:11 2018
New Revision: 323383

URL: http://llvm.org/viewvc/llvm-project?rev=323383&view=rev
Log:
[TableGen] Add a way of getting the number of generic opcodes without including modular CodeGen headers.

This is a bit of a hack, but removes a cycle that broke modular builds
of LLVM. Of course the cycle is still there in form of a dependency
on the .def file.

Modified:
    llvm/trunk/utils/TableGen/CodeGenSchedule.cpp
    llvm/trunk/utils/TableGen/CodeGenTarget.cpp
    llvm/trunk/utils/TableGen/CodeGenTarget.h

Modified: llvm/trunk/utils/TableGen/CodeGenSchedule.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenSchedule.cpp?rev=323383&r1=323382&r2=323383&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/CodeGenSchedule.cpp (original)
+++ llvm/trunk/utils/TableGen/CodeGenSchedule.cpp Wed Jan 24 14:35:11 2018
@@ -19,7 +19,6 @@
 #include "llvm/ADT/SmallPtrSet.h"
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/SmallVector.h"
-#include "llvm/CodeGen/TargetOpcodes.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/Regex.h"
@@ -104,9 +103,10 @@ struct InstRegexOp : public SetTheory::O
       RegexList.push_back(std::make_pair(Prefix, Regex(pat)));
     }
     for (auto &R : RegexList) {
+      unsigned NumGeneric = Target.getNumFixedInstructions();
       // The generic opcodes are unsorted, handle them manually.
-      for (auto *Inst : Target.getInstructionsByEnumValue().slice(
-               0, TargetOpcode::GENERIC_OP_END + 1)) {
+      for (auto *Inst :
+           Target.getInstructionsByEnumValue().slice(0, NumGeneric + 1)) {
         if (Inst->TheDef->getName().startswith(R.first) &&
             (!R.second ||
              R.second->match(Inst->TheDef->getName().substr(R.first.size()))))
@@ -114,8 +114,7 @@ struct InstRegexOp : public SetTheory::O
       }
 
       ArrayRef<const CodeGenInstruction *> Instructions =
-          Target.getInstructionsByEnumValue().slice(
-              TargetOpcode::GENERIC_OP_END + 1);
+          Target.getInstructionsByEnumValue().slice(NumGeneric + 1);
 
       // Target instructions are sorted. Find the range that starts with our
       // prefix.

Modified: llvm/trunk/utils/TableGen/CodeGenTarget.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenTarget.cpp?rev=323383&r1=323382&r2=323383&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/CodeGenTarget.cpp (original)
+++ llvm/trunk/utils/TableGen/CodeGenTarget.cpp Wed Jan 24 14:35:11 2018
@@ -345,13 +345,18 @@ GetInstByName(const char *Name,
   return I->second.get();
 }
 
+static const char *const FixedInstrs[] = {
+#define HANDLE_TARGET_OPCODE(OPC) #OPC,
+#include "llvm/CodeGen/TargetOpcodes.def"
+    nullptr};
+
+unsigned CodeGenTarget::getNumFixedInstructions() {
+  return array_lengthof(FixedInstrs) - 1;
+}
+
 /// \brief Return all of the instructions defined by the target, ordered by
 /// their enum value.
 void CodeGenTarget::ComputeInstrsByEnum() const {
-  static const char *const FixedInstrs[] = {
-#define HANDLE_TARGET_OPCODE(OPC) #OPC,
-#include "llvm/CodeGen/TargetOpcodes.def"
-      nullptr};
   const auto &Insts = getInstructions();
   for (const char *const *p = FixedInstrs; *p; ++p) {
     const CodeGenInstruction *Instr = GetInstByName(*p, Insts, Records);
@@ -360,6 +365,8 @@ void CodeGenTarget::ComputeInstrsByEnum(
     InstrsByEnum.push_back(Instr);
   }
   unsigned EndOfPredefines = InstrsByEnum.size();
+  assert(EndOfPredefines == getNumFixedInstructions() &&
+         "Missing generic opcode");
 
   for (const auto &I : Insts) {
     const CodeGenInstruction *CGI = I.second.get();

Modified: llvm/trunk/utils/TableGen/CodeGenTarget.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/utils/TableGen/CodeGenTarget.h?rev=323383&r1=323382&r2=323383&view=diff
==============================================================================
--- llvm/trunk/utils/TableGen/CodeGenTarget.h (original)
+++ llvm/trunk/utils/TableGen/CodeGenTarget.h Wed Jan 24 14:35:11 2018
@@ -140,6 +140,9 @@ public:
     return *I->second;
   }
 
+  /// Returns the number of predefined instructions.
+  static unsigned getNumFixedInstructions();
+
   /// getInstructionsByEnumValue - Return all of the instructions defined by the
   /// target, ordered by their enum value.
   ArrayRef<const CodeGenInstruction *>




More information about the llvm-commits mailing list