From 4890a71f021fa521163d45f8e8af5d9e1fa6f34f Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Wed, 24 Jan 2018 22:35:11 +0000 Subject: [PATCH] [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. llvm-svn: 323383 --- llvm/utils/TableGen/CodeGenSchedule.cpp | 9 ++++----- llvm/utils/TableGen/CodeGenTarget.cpp | 15 +++++++++++---- llvm/utils/TableGen/CodeGenTarget.h | 3 +++ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/llvm/utils/TableGen/CodeGenSchedule.cpp b/llvm/utils/TableGen/CodeGenSchedule.cpp index 93409104313e..076b891f91f5 100644 --- a/llvm/utils/TableGen/CodeGenSchedule.cpp +++ b/llvm/utils/TableGen/CodeGenSchedule.cpp @@ -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::Operator { 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::Operator { } ArrayRef 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. diff --git a/llvm/utils/TableGen/CodeGenTarget.cpp b/llvm/utils/TableGen/CodeGenTarget.cpp index 168bd690831f..2f1f20d47720 100644 --- a/llvm/utils/TableGen/CodeGenTarget.cpp +++ b/llvm/utils/TableGen/CodeGenTarget.cpp @@ -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() const { 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(); diff --git a/llvm/utils/TableGen/CodeGenTarget.h b/llvm/utils/TableGen/CodeGenTarget.h index 7280d707fba6..4d5a0ed685c6 100644 --- a/llvm/utils/TableGen/CodeGenTarget.h +++ b/llvm/utils/TableGen/CodeGenTarget.h @@ -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