summaryrefslogtreecommitdiff
path: root/utils/TableGen/SubtargetEmitter.cpp
diff options
context:
space:
mode:
authorJim Laskey <jlaskey@mac.com>2005-10-21 19:00:04 +0000
committerJim Laskey <jlaskey@mac.com>2005-10-21 19:00:04 +0000
commit4bb9cbb73075c350eadaf51d2dab8403764c9a60 (patch)
tree2dacb5ff800c0fa52f6b24b0de129d557bd3a92f /utils/TableGen/SubtargetEmitter.cpp
parentd2fc54edc45b5a4984d78004448c906f0cc2b7da (diff)
downloadllvm-4bb9cbb73075c350eadaf51d2dab8403764c9a60.tar.gz
llvm-4bb9cbb73075c350eadaf51d2dab8403764c9a60.tar.bz2
llvm-4bb9cbb73075c350eadaf51d2dab8403764c9a60.tar.xz
New TableGen backends for subtarget information. Only command line stuff
active now. Scheduling itinerary next. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23869 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/SubtargetEmitter.cpp')
-rw-r--r--utils/TableGen/SubtargetEmitter.cpp111
1 files changed, 111 insertions, 0 deletions
diff --git a/utils/TableGen/SubtargetEmitter.cpp b/utils/TableGen/SubtargetEmitter.cpp
new file mode 100644
index 0000000000..8af7166a3d
--- /dev/null
+++ b/utils/TableGen/SubtargetEmitter.cpp
@@ -0,0 +1,111 @@
+//===- SubtargetEmitter.cpp - Generate subtarget enumerations -------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by James M. Laskey and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This tablegen backend emits subtarget enumerations.
+//
+//===----------------------------------------------------------------------===//
+
+#include "SubtargetEmitter.h"
+#include "CodeGenTarget.h"
+#include "Record.h"
+#include "llvm/ADT/StringExtras.h"
+#include "llvm/Support/Debug.h"
+#include <algorithm>
+#include <set>
+using namespace llvm;
+
+// Convenience types
+typedef std::vector<Record*> RecordList;
+typedef std::vector<Record*>::iterator RecordListIter;
+
+
+// SubtargetEmitter::run - Main subtarget enumeration emitter.
+//
+void SubtargetEmitter::run(std::ostream &OS) {
+ EmitSourceFileHeader("Subtarget Enumeration Source Fragment", OS);
+ RecordList Features = Records.getAllDerivedDefinitions("SubtargetFeature");
+ RecordList Processors = Records.getAllDerivedDefinitions("Processor");
+
+ OS << "namespace llvm {\n\n";
+
+ { // Feature enumeration
+ int i = 0;
+
+ OS << "enum {\n";
+
+ for (RecordListIter RI = Features.begin(), E = Features.end(); RI != E;){
+ Record *R = *RI++;
+ std::string Instance = R->getName();
+ OS << " "
+ << Instance
+ << " = "
+ << " 1 << " << i++
+ << ((RI != E) ? ",\n" : "\n");
+ }
+
+ OS << "};\n";
+ }
+
+ { // Feature key values
+ OS << "\n\n"
+ << "/// Sorted (by key) array of values for CPU features.\n"
+ << "static SubtargetFeatureKV FeatureKV[] = {\n";
+ for (RecordListIter RI = Features.begin(), E = Features.end(); RI != E;) {
+ Record *R = *RI++;
+ std::string Instance = R->getName();
+ std::string Name = R->getValueAsString("Name");
+ std::string Desc = R->getValueAsString("Desc");
+ OS << " { "
+ << "\"" << Name << "\", "
+ << "\"" << Desc << "\", "
+ << Instance
+ << ((RI != E) ? " },\n" : " }\n");
+ }
+ OS << "};\n";
+ }
+
+ { // Feature key values
+ OS << "\n\n"
+ << "/// Sorted (by key) array of values for CPU subtype.\n"
+ << "static const SubtargetFeatureKV SubTypeKV[] = {\n";
+ for (RecordListIter RI = Processors.begin(), E = Processors.end();
+ RI != E;) {
+ Record *R = *RI++;
+ std::string Name = R->getValueAsString("Name");
+ Record *ProcItin = R->getValueAsDef("ProcItin");
+ ListInit *Features = R->getValueAsListInit("Features");
+ unsigned N = Features->getSize();
+ OS << " { "
+ << "\"" << Name << "\", "
+ << "\"Select the " << Name << " processor\", ";
+
+
+ if (N == 0) {
+ OS << "0";
+ } else {
+ for (unsigned i = 0; i < N; ) {
+ if (DefInit *DI = dynamic_cast<DefInit*>(Features->getElement(i++))) {
+ Record *Feature = DI->getDef();
+ std::string Name = Feature->getName();
+ OS << Name;
+ if (i != N) OS << " | ";
+ } else {
+ throw "Feature: " + Name +
+ " expected feature in processor feature list!";
+ }
+ }
+ }
+
+ OS << ((RI != E) ? " },\n" : " }\n");
+ }
+ OS << "};\n";
+ }
+
+ OS << "\n} // End llvm namespace \n";
+}