1 //===- SubtargetEmitter.cpp - Generate subtarget enumerations -------------===//
3 // The LLVM Compiler Infrastructure
5 // This file was developed by James M. Laskey and is distributed under
6 // the University of Illinois Open Source License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This tablegen backend emits subtarget enumerations.
12 //===----------------------------------------------------------------------===//
14 #include "SubtargetEmitter.h"
15 #include "CodeGenTarget.h"
17 #include "llvm/ADT/StringExtras.h"
18 #include "llvm/Support/Debug.h"
26 typedef std::vector<Record*> RecordList;
27 typedef std::vector<Record*>::iterator RecordListIter;
30 // Record sort by name function.
33 bool operator()(const Record *Rec1, const Record *Rec2) const {
34 return Rec1->getName() < Rec2->getName();
39 // Record sort by field "Name" function.
41 struct LessRecordFieldName {
42 bool operator()(const Record *Rec1, const Record *Rec2) const {
43 return Rec1->getValueAsString("Name") < Rec2->getValueAsString("Name");
49 // SubtargetEmitter::run - Main subtarget enumeration emitter.
51 void SubtargetEmitter::run(std::ostream &OS) {
52 EmitSourceFileHeader("Subtarget Enumeration Source Fragment", OS);
54 RecordList Features = Records.getAllDerivedDefinitions("SubtargetFeature");
55 sort(Features.begin(), Features.end(), LessRecord());
57 RecordList Processors = Records.getAllDerivedDefinitions("Processor");
58 sort(Processors.begin(), Processors.end(), LessRecordFieldName());
60 OS << "#include \"llvm/Target/SubtargetFeature.h\"\n\n";
62 { // Feature enumeration
67 for (RecordListIter RI = Features.begin(), E = Features.end(); RI != E;){
69 std::string Instance = R->getName();
74 << ((RI != E) ? ",\n" : "\n");
80 { // Feature key values
82 << "// Sorted (by key) array of values for CPU features.\n"
83 << "static llvm::SubtargetFeatureKV FeatureKV[] = {\n";
84 for (RecordListIter RI = Features.begin(), E = Features.end(); RI != E;) {
86 std::string Instance = R->getName();
87 std::string Name = R->getValueAsString("Name");
88 std::string Desc = R->getValueAsString("Desc");
90 << "\"" << Name << "\", "
91 << "\"" << Desc << "\", "
93 << ((RI != E) ? " },\n" : " }\n");
100 << "// Sorted (by key) array of values for CPU subtype.\n"
101 << "static const llvm::SubtargetFeatureKV SubTypeKV[] = {\n";
102 for (RecordListIter RI = Processors.begin(), E = Processors.end();
105 std::string Name = R->getValueAsString("Name");
106 Record *ProcItin = R->getValueAsDef("ProcItin");
107 ListInit *Features = R->getValueAsListInit("Features");
108 unsigned N = Features->getSize();
110 << "\"" << Name << "\", "
111 << "\"Select the " << Name << " processor\", ";
117 for (unsigned i = 0; i < N; ) {
118 if (DefInit *DI = dynamic_cast<DefInit*>(Features->getElement(i++))) {
119 Record *Feature = DI->getDef();
120 std::string Name = Feature->getName();
122 if (i != N) OS << " | ";
124 throw "Feature: " + Name +
125 " expected feature in processor feature list!";
130 OS << ((RI != E) ? " },\n" : " }\n");
136 OS<<" FeatureKVSize = sizeof(FeatureKV)/sizeof(llvm::SubtargetFeatureKV),\n";
137 OS<<" SubTypeKVSize = sizeof(SubTypeKV)/sizeof(llvm::SubtargetFeatureKV)\n";