]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/llvm/utils/TableGen/InstrInfoEmitter.cpp
MFV 364468:
[FreeBSD/FreeBSD.git] / contrib / llvm-project / llvm / utils / TableGen / InstrInfoEmitter.cpp
1 //===- InstrInfoEmitter.cpp - Generate a Instruction Set Desc. --*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This tablegen backend is responsible for emitting a description of the target
10 // instruction set for the code generator.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "CodeGenDAGPatterns.h"
15 #include "CodeGenInstruction.h"
16 #include "CodeGenSchedule.h"
17 #include "CodeGenTarget.h"
18 #include "PredicateExpander.h"
19 #include "SequenceToOffsetTable.h"
20 #include "TableGenBackends.h"
21 #include "llvm/ADT/ArrayRef.h"
22 #include "llvm/ADT/StringExtras.h"
23 #include "llvm/Support/Casting.h"
24 #include "llvm/Support/raw_ostream.h"
25 #include "llvm/TableGen/Error.h"
26 #include "llvm/TableGen/Record.h"
27 #include "llvm/TableGen/TableGenBackend.h"
28 #include <cassert>
29 #include <cstdint>
30 #include <map>
31 #include <string>
32 #include <utility>
33 #include <vector>
34
35 using namespace llvm;
36
37 namespace {
38
39 class InstrInfoEmitter {
40   RecordKeeper &Records;
41   CodeGenDAGPatterns CDP;
42   const CodeGenSchedModels &SchedModels;
43
44 public:
45   InstrInfoEmitter(RecordKeeper &R):
46     Records(R), CDP(R), SchedModels(CDP.getTargetInfo().getSchedModels()) {}
47
48   // run - Output the instruction set description.
49   void run(raw_ostream &OS);
50
51 private:
52   void emitEnums(raw_ostream &OS);
53
54   typedef std::map<std::vector<std::string>, unsigned> OperandInfoMapTy;
55
56   /// The keys of this map are maps which have OpName enum values as their keys
57   /// and instruction operand indices as their values.  The values of this map
58   /// are lists of instruction names.
59   typedef std::map<std::map<unsigned, unsigned>,
60                    std::vector<std::string>> OpNameMapTy;
61   typedef std::map<std::string, unsigned>::iterator StrUintMapIter;
62
63   /// Generate member functions in the target-specific GenInstrInfo class.
64   ///
65   /// This method is used to custom expand TIIPredicate definitions.
66   /// See file llvm/Target/TargetInstPredicates.td for a description of what is
67   /// a TIIPredicate and how to use it.
68   void emitTIIHelperMethods(raw_ostream &OS, StringRef TargetName,
69                             bool ExpandDefinition = true);
70
71   /// Expand TIIPredicate definitions to functions that accept a const MCInst
72   /// reference.
73   void emitMCIIHelperMethods(raw_ostream &OS, StringRef TargetName);
74   void emitRecord(const CodeGenInstruction &Inst, unsigned Num,
75                   Record *InstrInfo,
76                   std::map<std::vector<Record*>, unsigned> &EL,
77                   const OperandInfoMapTy &OpInfo,
78                   raw_ostream &OS);
79   void emitOperandTypeMappings(
80       raw_ostream &OS, const CodeGenTarget &Target,
81       ArrayRef<const CodeGenInstruction *> NumberedInstructions);
82   void initOperandMapData(
83             ArrayRef<const CodeGenInstruction *> NumberedInstructions,
84             StringRef Namespace,
85             std::map<std::string, unsigned> &Operands,
86             OpNameMapTy &OperandMap);
87   void emitOperandNameMappings(raw_ostream &OS, const CodeGenTarget &Target,
88             ArrayRef<const CodeGenInstruction*> NumberedInstructions);
89
90   // Operand information.
91   void EmitOperandInfo(raw_ostream &OS, OperandInfoMapTy &OperandInfoIDs);
92   std::vector<std::string> GetOperandInfo(const CodeGenInstruction &Inst);
93 };
94
95 } // end anonymous namespace
96
97 static void PrintDefList(const std::vector<Record*> &Uses,
98                          unsigned Num, raw_ostream &OS) {
99   OS << "static const MCPhysReg ImplicitList" << Num << "[] = { ";
100   for (Record *U : Uses)
101     OS << getQualifiedName(U) << ", ";
102   OS << "0 };\n";
103 }
104
105 //===----------------------------------------------------------------------===//
106 // Operand Info Emission.
107 //===----------------------------------------------------------------------===//
108
109 std::vector<std::string>
110 InstrInfoEmitter::GetOperandInfo(const CodeGenInstruction &Inst) {
111   std::vector<std::string> Result;
112
113   for (auto &Op : Inst.Operands) {
114     // Handle aggregate operands and normal operands the same way by expanding
115     // either case into a list of operands for this op.
116     std::vector<CGIOperandList::OperandInfo> OperandList;
117
118     // This might be a multiple operand thing.  Targets like X86 have
119     // registers in their multi-operand operands.  It may also be an anonymous
120     // operand, which has a single operand, but no declared class for the
121     // operand.
122     DagInit *MIOI = Op.MIOperandInfo;
123
124     if (!MIOI || MIOI->getNumArgs() == 0) {
125       // Single, anonymous, operand.
126       OperandList.push_back(Op);
127     } else {
128       for (unsigned j = 0, e = Op.MINumOperands; j != e; ++j) {
129         OperandList.push_back(Op);
130
131         auto *OpR = cast<DefInit>(MIOI->getArg(j))->getDef();
132         OperandList.back().Rec = OpR;
133       }
134     }
135
136     for (unsigned j = 0, e = OperandList.size(); j != e; ++j) {
137       Record *OpR = OperandList[j].Rec;
138       std::string Res;
139
140       if (OpR->isSubClassOf("RegisterOperand"))
141         OpR = OpR->getValueAsDef("RegClass");
142       if (OpR->isSubClassOf("RegisterClass"))
143         Res += getQualifiedName(OpR) + "RegClassID, ";
144       else if (OpR->isSubClassOf("PointerLikeRegClass"))
145         Res += utostr(OpR->getValueAsInt("RegClassKind")) + ", ";
146       else
147         // -1 means the operand does not have a fixed register class.
148         Res += "-1, ";
149
150       // Fill in applicable flags.
151       Res += "0";
152
153       // Ptr value whose register class is resolved via callback.
154       if (OpR->isSubClassOf("PointerLikeRegClass"))
155         Res += "|(1<<MCOI::LookupPtrRegClass)";
156
157       // Predicate operands.  Check to see if the original unexpanded operand
158       // was of type PredicateOp.
159       if (Op.Rec->isSubClassOf("PredicateOp"))
160         Res += "|(1<<MCOI::Predicate)";
161
162       // Optional def operands.  Check to see if the original unexpanded operand
163       // was of type OptionalDefOperand.
164       if (Op.Rec->isSubClassOf("OptionalDefOperand"))
165         Res += "|(1<<MCOI::OptionalDef)";
166
167       // Branch target operands.  Check to see if the original unexpanded
168       // operand was of type BranchTargetOperand.
169       if (Op.Rec->isSubClassOf("BranchTargetOperand"))
170         Res += "|(1<<MCOI::BranchTarget)";
171
172       // Fill in operand type.
173       Res += ", ";
174       assert(!Op.OperandType.empty() && "Invalid operand type.");
175       Res += Op.OperandType;
176
177       // Fill in constraint info.
178       Res += ", ";
179
180       const CGIOperandList::ConstraintInfo &Constraint =
181         Op.Constraints[j];
182       if (Constraint.isNone())
183         Res += "0";
184       else if (Constraint.isEarlyClobber())
185         Res += "(1 << MCOI::EARLY_CLOBBER)";
186       else {
187         assert(Constraint.isTied());
188         Res += "((" + utostr(Constraint.getTiedOperand()) +
189                     " << 16) | (1 << MCOI::TIED_TO))";
190       }
191
192       Result.push_back(Res);
193     }
194   }
195
196   return Result;
197 }
198
199 void InstrInfoEmitter::EmitOperandInfo(raw_ostream &OS,
200                                        OperandInfoMapTy &OperandInfoIDs) {
201   // ID #0 is for no operand info.
202   unsigned OperandListNum = 0;
203   OperandInfoIDs[std::vector<std::string>()] = ++OperandListNum;
204
205   OS << "\n";
206   const CodeGenTarget &Target = CDP.getTargetInfo();
207   for (const CodeGenInstruction *Inst : Target.getInstructionsByEnumValue()) {
208     std::vector<std::string> OperandInfo = GetOperandInfo(*Inst);
209     unsigned &N = OperandInfoIDs[OperandInfo];
210     if (N != 0) continue;
211
212     N = ++OperandListNum;
213     OS << "static const MCOperandInfo OperandInfo" << N << "[] = { ";
214     for (const std::string &Info : OperandInfo)
215       OS << "{ " << Info << " }, ";
216     OS << "};\n";
217   }
218 }
219
220 /// Initialize data structures for generating operand name mappings.
221 ///
222 /// \param Operands [out] A map used to generate the OpName enum with operand
223 ///        names as its keys and operand enum values as its values.
224 /// \param OperandMap [out] A map for representing the operand name mappings for
225 ///        each instructions.  This is used to generate the OperandMap table as
226 ///        well as the getNamedOperandIdx() function.
227 void InstrInfoEmitter::initOperandMapData(
228         ArrayRef<const CodeGenInstruction *> NumberedInstructions,
229         StringRef Namespace,
230         std::map<std::string, unsigned> &Operands,
231         OpNameMapTy &OperandMap) {
232   unsigned NumOperands = 0;
233   for (const CodeGenInstruction *Inst : NumberedInstructions) {
234     if (!Inst->TheDef->getValueAsBit("UseNamedOperandTable"))
235       continue;
236     std::map<unsigned, unsigned> OpList;
237     for (const auto &Info : Inst->Operands) {
238       StrUintMapIter I = Operands.find(Info.Name);
239
240       if (I == Operands.end()) {
241         I = Operands.insert(Operands.begin(),
242                     std::pair<std::string, unsigned>(Info.Name, NumOperands++));
243       }
244       OpList[I->second] = Info.MIOperandNo;
245     }
246     OperandMap[OpList].push_back(Namespace.str() + "::" +
247                                  Inst->TheDef->getName().str());
248   }
249 }
250
251 /// Generate a table and function for looking up the indices of operands by
252 /// name.
253 ///
254 /// This code generates:
255 /// - An enum in the llvm::TargetNamespace::OpName namespace, with one entry
256 ///   for each operand name.
257 /// - A 2-dimensional table called OperandMap for mapping OpName enum values to
258 ///   operand indices.
259 /// - A function called getNamedOperandIdx(uint16_t Opcode, uint16_t NamedIdx)
260 ///   for looking up the operand index for an instruction, given a value from
261 ///   OpName enum
262 void InstrInfoEmitter::emitOperandNameMappings(raw_ostream &OS,
263            const CodeGenTarget &Target,
264            ArrayRef<const CodeGenInstruction*> NumberedInstructions) {
265   StringRef Namespace = Target.getInstNamespace();
266   std::string OpNameNS = "OpName";
267   // Map of operand names to their enumeration value.  This will be used to
268   // generate the OpName enum.
269   std::map<std::string, unsigned> Operands;
270   OpNameMapTy OperandMap;
271
272   initOperandMapData(NumberedInstructions, Namespace, Operands, OperandMap);
273
274   OS << "#ifdef GET_INSTRINFO_OPERAND_ENUM\n";
275   OS << "#undef GET_INSTRINFO_OPERAND_ENUM\n";
276   OS << "namespace llvm {\n";
277   OS << "namespace " << Namespace << " {\n";
278   OS << "namespace " << OpNameNS << " {\n";
279   OS << "enum {\n";
280   for (const auto &Op : Operands)
281     OS << "  " << Op.first << " = " << Op.second << ",\n";
282
283   OS << "OPERAND_LAST";
284   OS << "\n};\n";
285   OS << "} // end namespace OpName\n";
286   OS << "} // end namespace " << Namespace << "\n";
287   OS << "} // end namespace llvm\n";
288   OS << "#endif //GET_INSTRINFO_OPERAND_ENUM\n\n";
289
290   OS << "#ifdef GET_INSTRINFO_NAMED_OPS\n";
291   OS << "#undef GET_INSTRINFO_NAMED_OPS\n";
292   OS << "namespace llvm {\n";
293   OS << "namespace " << Namespace << " {\n";
294   OS << "LLVM_READONLY\n";
295   OS << "int16_t getNamedOperandIdx(uint16_t Opcode, uint16_t NamedIdx) {\n";
296   if (!Operands.empty()) {
297     OS << "  static const int16_t OperandMap [][" << Operands.size()
298        << "] = {\n";
299     for (const auto &Entry : OperandMap) {
300       const std::map<unsigned, unsigned> &OpList = Entry.first;
301       OS << "{";
302
303       // Emit a row of the OperandMap table
304       for (unsigned i = 0, e = Operands.size(); i != e; ++i)
305         OS << (OpList.count(i) == 0 ? -1 : (int)OpList.find(i)->second) << ", ";
306
307       OS << "},\n";
308     }
309     OS << "};\n";
310
311     OS << "  switch(Opcode) {\n";
312     unsigned TableIndex = 0;
313     for (const auto &Entry : OperandMap) {
314       for (const std::string &Name : Entry.second)
315         OS << "  case " << Name << ":\n";
316
317       OS << "    return OperandMap[" << TableIndex++ << "][NamedIdx];\n";
318     }
319     OS << "    default: return -1;\n";
320     OS << "  }\n";
321   } else {
322     // There are no operands, so no need to emit anything
323     OS << "  return -1;\n";
324   }
325   OS << "}\n";
326   OS << "} // end namespace " << Namespace << "\n";
327   OS << "} // end namespace llvm\n";
328   OS << "#endif //GET_INSTRINFO_NAMED_OPS\n\n";
329 }
330
331 /// Generate an enum for all the operand types for this target, under the
332 /// llvm::TargetNamespace::OpTypes namespace.
333 /// Operand types are all definitions derived of the Operand Target.td class.
334 void InstrInfoEmitter::emitOperandTypeMappings(
335     raw_ostream &OS, const CodeGenTarget &Target,
336     ArrayRef<const CodeGenInstruction *> NumberedInstructions) {
337
338   StringRef Namespace = Target.getInstNamespace();
339   std::vector<Record *> Operands = Records.getAllDerivedDefinitions("Operand");
340   std::vector<Record *> RegisterOperands =
341       Records.getAllDerivedDefinitions("RegisterOperand");
342   std::vector<Record *> RegisterClasses =
343       Records.getAllDerivedDefinitions("RegisterClass");
344
345   OS << "#ifdef GET_INSTRINFO_OPERAND_TYPES_ENUM\n";
346   OS << "#undef GET_INSTRINFO_OPERAND_TYPES_ENUM\n";
347   OS << "namespace llvm {\n";
348   OS << "namespace " << Namespace << " {\n";
349   OS << "namespace OpTypes {\n";
350   OS << "enum OperandType {\n";
351
352   unsigned EnumVal = 0;
353   for (const std::vector<Record *> *RecordsToAdd :
354        {&Operands, &RegisterOperands, &RegisterClasses}) {
355     for (const Record *Op : *RecordsToAdd) {
356       if (!Op->isAnonymous())
357         OS << "  " << Op->getName() << " = " << EnumVal << ",\n";
358       ++EnumVal;
359     }
360   }
361
362   OS << "  OPERAND_TYPE_LIST_END" << "\n};\n";
363   OS << "} // end namespace OpTypes\n";
364   OS << "} // end namespace " << Namespace << "\n";
365   OS << "} // end namespace llvm\n";
366   OS << "#endif // GET_INSTRINFO_OPERAND_TYPES_ENUM\n\n";
367
368   OS << "#ifdef GET_INSTRINFO_OPERAND_TYPE\n";
369   OS << "#undef GET_INSTRINFO_OPERAND_TYPE\n";
370   OS << "namespace llvm {\n";
371   OS << "namespace " << Namespace << " {\n";
372   OS << "LLVM_READONLY\n";
373   OS << "static int getOperandType(uint16_t Opcode, uint16_t OpIdx) {\n";
374   // TODO: Factor out instructions with same operands to compress the tables.
375   if (!NumberedInstructions.empty()) {
376     std::vector<int> OperandOffsets;
377     std::vector<Record *> OperandRecords;
378     int CurrentOffset = 0;
379     for (const CodeGenInstruction *Inst : NumberedInstructions) {
380       OperandOffsets.push_back(CurrentOffset);
381       for (const auto &Op : Inst->Operands) {
382         const DagInit *MIOI = Op.MIOperandInfo;
383         if (!MIOI || MIOI->getNumArgs() == 0) {
384           // Single, anonymous, operand.
385           OperandRecords.push_back(Op.Rec);
386           ++CurrentOffset;
387         } else {
388           for (Init *Arg : make_range(MIOI->arg_begin(), MIOI->arg_end())) {
389             OperandRecords.push_back(cast<DefInit>(Arg)->getDef());
390             ++CurrentOffset;
391           }
392         }
393       }
394     }
395
396     // Emit the table of offsets for the opcode lookup.
397     OS << "  const int Offsets[] = {\n";
398     for (int I = 0, E = OperandOffsets.size(); I != E; ++I)
399       OS << "    " << OperandOffsets[I] << ",\n";
400     OS << "  };\n";
401
402     // Add an entry for the end so that we don't need to special case it below.
403     OperandOffsets.push_back(OperandRecords.size());
404     // Emit the actual operand types in a flat table.
405     OS << "  const int OpcodeOperandTypes[] = {\n    ";
406     for (int I = 0, E = OperandRecords.size(), CurOffset = 1; I != E; ++I) {
407       // We print each Opcode's operands in its own row.
408       if (I == OperandOffsets[CurOffset]) {
409         OS << "\n    ";
410         // If there are empty rows, mark them with an empty comment.
411         while (OperandOffsets[++CurOffset] == I)
412           OS << "/**/\n    ";
413       }
414       Record *OpR = OperandRecords[I];
415       if ((OpR->isSubClassOf("Operand") ||
416            OpR->isSubClassOf("RegisterOperand") ||
417            OpR->isSubClassOf("RegisterClass")) &&
418           !OpR->isAnonymous())
419         OS << "OpTypes::" << OpR->getName();
420       else
421         OS << -1;
422       OS << ", ";
423     }
424     OS << "\n  };\n";
425
426     OS << "  return OpcodeOperandTypes[Offsets[Opcode] + OpIdx];\n";
427   } else {
428     OS << "  llvm_unreachable(\"No instructions defined\");\n";
429   }
430   OS << "}\n";
431   OS << "} // end namespace " << Namespace << "\n";
432   OS << "} // end namespace llvm\n";
433   OS << "#endif // GET_INSTRINFO_OPERAND_TYPE\n\n";
434 }
435
436 void InstrInfoEmitter::emitMCIIHelperMethods(raw_ostream &OS,
437                                              StringRef TargetName) {
438   RecVec TIIPredicates = Records.getAllDerivedDefinitions("TIIPredicate");
439   if (TIIPredicates.empty())
440     return;
441
442   OS << "#ifdef GET_INSTRINFO_MC_HELPER_DECLS\n";
443   OS << "#undef GET_INSTRINFO_MC_HELPER_DECLS\n\n";
444
445   OS << "namespace llvm {\n";
446   OS << "class MCInst;\n\n";
447
448   OS << "namespace " << TargetName << "_MC {\n\n";
449
450   for (const Record *Rec : TIIPredicates) {
451     OS << "bool " << Rec->getValueAsString("FunctionName")
452         << "(const MCInst &MI);\n";
453   }
454
455   OS << "\n} // end namespace " << TargetName << "_MC\n";
456   OS << "} // end namespace llvm\n\n";
457
458   OS << "#endif // GET_INSTRINFO_MC_HELPER_DECLS\n\n";
459
460   OS << "#ifdef GET_INSTRINFO_MC_HELPERS\n";
461   OS << "#undef GET_INSTRINFO_MC_HELPERS\n\n";
462
463   OS << "namespace llvm {\n";
464   OS << "namespace " << TargetName << "_MC {\n\n";
465
466   PredicateExpander PE(TargetName);
467   PE.setExpandForMC(true);
468
469   for (const Record *Rec : TIIPredicates) {
470     OS << "bool " << Rec->getValueAsString("FunctionName");
471     OS << "(const MCInst &MI) {\n";
472
473     OS.indent(PE.getIndentLevel() * 2);
474     PE.expandStatement(OS, Rec->getValueAsDef("Body"));
475     OS << "\n}\n\n";
476   }
477
478   OS << "} // end namespace " << TargetName << "_MC\n";
479   OS << "} // end namespace llvm\n\n";
480
481   OS << "#endif // GET_GENISTRINFO_MC_HELPERS\n";
482 }
483
484 void InstrInfoEmitter::emitTIIHelperMethods(raw_ostream &OS,
485                                             StringRef TargetName,
486                                             bool ExpandDefinition) {
487   RecVec TIIPredicates = Records.getAllDerivedDefinitions("TIIPredicate");
488   if (TIIPredicates.empty())
489     return;
490
491   PredicateExpander PE(TargetName);
492   PE.setExpandForMC(false);
493
494   for (const Record *Rec : TIIPredicates) {
495     OS << (ExpandDefinition ? "" : "static ") << "bool ";
496     if (ExpandDefinition)
497       OS << TargetName << "InstrInfo::";
498     OS << Rec->getValueAsString("FunctionName");
499     OS << "(const MachineInstr &MI)";
500     if (!ExpandDefinition) {
501       OS << ";\n";
502       continue;
503     }
504
505     OS << " {\n";
506     OS.indent(PE.getIndentLevel() * 2);
507     PE.expandStatement(OS, Rec->getValueAsDef("Body"));
508     OS << "\n}\n\n";
509   }
510 }
511
512 //===----------------------------------------------------------------------===//
513 // Main Output.
514 //===----------------------------------------------------------------------===//
515
516 // run - Emit the main instruction description records for the target...
517 void InstrInfoEmitter::run(raw_ostream &OS) {
518   emitSourceFileHeader("Target Instruction Enum Values and Descriptors", OS);
519   emitEnums(OS);
520
521   OS << "#ifdef GET_INSTRINFO_MC_DESC\n";
522   OS << "#undef GET_INSTRINFO_MC_DESC\n";
523
524   OS << "namespace llvm {\n\n";
525
526   CodeGenTarget &Target = CDP.getTargetInfo();
527   const std::string &TargetName = std::string(Target.getName());
528   Record *InstrInfo = Target.getInstructionSet();
529
530   // Keep track of all of the def lists we have emitted already.
531   std::map<std::vector<Record*>, unsigned> EmittedLists;
532   unsigned ListNumber = 0;
533
534   // Emit all of the instruction's implicit uses and defs.
535   for (const CodeGenInstruction *II : Target.getInstructionsByEnumValue()) {
536     Record *Inst = II->TheDef;
537     std::vector<Record*> Uses = Inst->getValueAsListOfDefs("Uses");
538     if (!Uses.empty()) {
539       unsigned &IL = EmittedLists[Uses];
540       if (!IL) PrintDefList(Uses, IL = ++ListNumber, OS);
541     }
542     std::vector<Record*> Defs = Inst->getValueAsListOfDefs("Defs");
543     if (!Defs.empty()) {
544       unsigned &IL = EmittedLists[Defs];
545       if (!IL) PrintDefList(Defs, IL = ++ListNumber, OS);
546     }
547   }
548
549   OperandInfoMapTy OperandInfoIDs;
550
551   // Emit all of the operand info records.
552   EmitOperandInfo(OS, OperandInfoIDs);
553
554   // Emit all of the MCInstrDesc records in their ENUM ordering.
555   //
556   OS << "\nextern const MCInstrDesc " << TargetName << "Insts[] = {\n";
557   ArrayRef<const CodeGenInstruction*> NumberedInstructions =
558     Target.getInstructionsByEnumValue();
559
560   SequenceToOffsetTable<std::string> InstrNames;
561   unsigned Num = 0;
562   for (const CodeGenInstruction *Inst : NumberedInstructions) {
563     // Keep a list of the instruction names.
564     InstrNames.add(std::string(Inst->TheDef->getName()));
565     // Emit the record into the table.
566     emitRecord(*Inst, Num++, InstrInfo, EmittedLists, OperandInfoIDs, OS);
567   }
568   OS << "};\n\n";
569
570   // Emit the array of instruction names.
571   InstrNames.layout();
572   InstrNames.emitStringLiteralDef(OS, Twine("extern const char ") + TargetName +
573                                           "InstrNameData[]");
574
575   OS << "extern const unsigned " << TargetName <<"InstrNameIndices[] = {";
576   Num = 0;
577   for (const CodeGenInstruction *Inst : NumberedInstructions) {
578     // Newline every eight entries.
579     if (Num % 8 == 0)
580       OS << "\n    ";
581     OS << InstrNames.get(std::string(Inst->TheDef->getName())) << "U, ";
582     ++Num;
583   }
584   OS << "\n};\n\n";
585
586   bool HasDeprecationFeatures =
587       llvm::any_of(NumberedInstructions, [](const CodeGenInstruction *Inst) {
588         return !Inst->HasComplexDeprecationPredicate &&
589                !Inst->DeprecatedReason.empty();
590       });
591   if (HasDeprecationFeatures) {
592     OS << "extern const uint8_t " << TargetName
593        << "InstrDeprecationFeatures[] = {";
594     Num = 0;
595     for (const CodeGenInstruction *Inst : NumberedInstructions) {
596       if (Num % 8 == 0)
597         OS << "\n    ";
598       if (!Inst->HasComplexDeprecationPredicate &&
599           !Inst->DeprecatedReason.empty())
600         OS << Target.getInstNamespace() << "::" << Inst->DeprecatedReason
601            << ", ";
602       else
603         OS << "uint8_t(-1), ";
604       ++Num;
605     }
606     OS << "\n};\n\n";
607   }
608
609   bool HasComplexDeprecationInfos =
610       llvm::any_of(NumberedInstructions, [](const CodeGenInstruction *Inst) {
611         return Inst->HasComplexDeprecationPredicate;
612       });
613   if (HasComplexDeprecationInfos) {
614     OS << "extern const MCInstrInfo::ComplexDeprecationPredicate " << TargetName
615        << "InstrComplexDeprecationInfos[] = {";
616     Num = 0;
617     for (const CodeGenInstruction *Inst : NumberedInstructions) {
618       if (Num % 8 == 0)
619         OS << "\n    ";
620       if (Inst->HasComplexDeprecationPredicate)
621         // Emit a function pointer to the complex predicate method.
622         OS << "&get" << Inst->DeprecatedReason << "DeprecationInfo, ";
623       else
624         OS << "nullptr, ";
625       ++Num;
626     }
627     OS << "\n};\n\n";
628   }
629
630   // MCInstrInfo initialization routine.
631   OS << "static inline void Init" << TargetName
632      << "MCInstrInfo(MCInstrInfo *II) {\n";
633   OS << "  II->InitMCInstrInfo(" << TargetName << "Insts, " << TargetName
634      << "InstrNameIndices, " << TargetName << "InstrNameData, ";
635   if (HasDeprecationFeatures)
636     OS << TargetName << "InstrDeprecationFeatures, ";
637   else
638     OS << "nullptr, ";
639   if (HasComplexDeprecationInfos)
640     OS << TargetName << "InstrComplexDeprecationInfos, ";
641   else
642     OS << "nullptr, ";
643   OS << NumberedInstructions.size() << ");\n}\n\n";
644
645   OS << "} // end namespace llvm\n";
646
647   OS << "#endif // GET_INSTRINFO_MC_DESC\n\n";
648
649   // Create a TargetInstrInfo subclass to hide the MC layer initialization.
650   OS << "#ifdef GET_INSTRINFO_HEADER\n";
651   OS << "#undef GET_INSTRINFO_HEADER\n";
652
653   std::string ClassName = TargetName + "GenInstrInfo";
654   OS << "namespace llvm {\n";
655   OS << "struct " << ClassName << " : public TargetInstrInfo {\n"
656      << "  explicit " << ClassName
657      << "(int CFSetupOpcode = -1, int CFDestroyOpcode = -1, int CatchRetOpcode = -1, int ReturnOpcode = -1);\n"
658      << "  ~" << ClassName << "() override = default;\n";
659
660
661   OS << "\n};\n} // end namespace llvm\n";
662
663   OS << "#endif // GET_INSTRINFO_HEADER\n\n";
664
665   OS << "#ifdef GET_INSTRINFO_HELPER_DECLS\n";
666   OS << "#undef GET_INSTRINFO_HELPER_DECLS\n\n";
667   emitTIIHelperMethods(OS, TargetName, /* ExpandDefintion = */false);
668   OS << "\n";
669   OS << "#endif // GET_INSTRINFO_HELPER_DECLS\n\n";
670
671   OS << "#ifdef GET_INSTRINFO_HELPERS\n";
672   OS << "#undef GET_INSTRINFO_HELPERS\n\n";
673   emitTIIHelperMethods(OS, TargetName, /* ExpandDefintion = */true);
674   OS << "#endif // GET_INSTRINFO_HELPERS\n\n";
675
676   OS << "#ifdef GET_INSTRINFO_CTOR_DTOR\n";
677   OS << "#undef GET_INSTRINFO_CTOR_DTOR\n";
678
679   OS << "namespace llvm {\n";
680   OS << "extern const MCInstrDesc " << TargetName << "Insts[];\n";
681   OS << "extern const unsigned " << TargetName << "InstrNameIndices[];\n";
682   OS << "extern const char " << TargetName << "InstrNameData[];\n";
683   if (HasDeprecationFeatures)
684     OS << "extern const uint8_t " << TargetName
685        << "InstrDeprecationFeatures[];\n";
686   if (HasComplexDeprecationInfos)
687     OS << "extern const MCInstrInfo::ComplexDeprecationPredicate " << TargetName
688        << "InstrComplexDeprecationInfos[];\n";
689   OS << ClassName << "::" << ClassName
690      << "(int CFSetupOpcode, int CFDestroyOpcode, int CatchRetOpcode, int "
691         "ReturnOpcode)\n"
692      << "  : TargetInstrInfo(CFSetupOpcode, CFDestroyOpcode, CatchRetOpcode, "
693         "ReturnOpcode) {\n"
694      << "  InitMCInstrInfo(" << TargetName << "Insts, " << TargetName
695      << "InstrNameIndices, " << TargetName << "InstrNameData, ";
696   if (HasDeprecationFeatures)
697     OS << TargetName << "InstrDeprecationFeatures, ";
698   else
699     OS << "nullptr, ";
700   if (HasComplexDeprecationInfos)
701     OS << TargetName << "InstrComplexDeprecationInfos, ";
702   else
703     OS << "nullptr, ";
704   OS << NumberedInstructions.size() << ");\n}\n";
705   OS << "} // end namespace llvm\n";
706
707   OS << "#endif // GET_INSTRINFO_CTOR_DTOR\n\n";
708
709   emitOperandNameMappings(OS, Target, NumberedInstructions);
710
711   emitOperandTypeMappings(OS, Target, NumberedInstructions);
712
713   emitMCIIHelperMethods(OS, TargetName);
714 }
715
716 void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
717                                   Record *InstrInfo,
718                          std::map<std::vector<Record*>, unsigned> &EmittedLists,
719                                   const OperandInfoMapTy &OpInfo,
720                                   raw_ostream &OS) {
721   int MinOperands = 0;
722   if (!Inst.Operands.empty())
723     // Each logical operand can be multiple MI operands.
724     MinOperands = Inst.Operands.back().MIOperandNo +
725                   Inst.Operands.back().MINumOperands;
726
727   OS << "  { ";
728   OS << Num << ",\t" << MinOperands << ",\t"
729      << Inst.Operands.NumDefs << ",\t"
730      << Inst.TheDef->getValueAsInt("Size") << ",\t"
731      << SchedModels.getSchedClassIdx(Inst) << ",\t0";
732
733   CodeGenTarget &Target = CDP.getTargetInfo();
734
735   // Emit all of the target independent flags...
736   if (Inst.isPreISelOpcode)    OS << "|(1ULL<<MCID::PreISelOpcode)";
737   if (Inst.isPseudo)           OS << "|(1ULL<<MCID::Pseudo)";
738   if (Inst.isReturn)           OS << "|(1ULL<<MCID::Return)";
739   if (Inst.isEHScopeReturn)    OS << "|(1ULL<<MCID::EHScopeReturn)";
740   if (Inst.isBranch)           OS << "|(1ULL<<MCID::Branch)";
741   if (Inst.isIndirectBranch)   OS << "|(1ULL<<MCID::IndirectBranch)";
742   if (Inst.isCompare)          OS << "|(1ULL<<MCID::Compare)";
743   if (Inst.isMoveImm)          OS << "|(1ULL<<MCID::MoveImm)";
744   if (Inst.isMoveReg)          OS << "|(1ULL<<MCID::MoveReg)";
745   if (Inst.isBitcast)          OS << "|(1ULL<<MCID::Bitcast)";
746   if (Inst.isAdd)              OS << "|(1ULL<<MCID::Add)";
747   if (Inst.isTrap)             OS << "|(1ULL<<MCID::Trap)";
748   if (Inst.isSelect)           OS << "|(1ULL<<MCID::Select)";
749   if (Inst.isBarrier)          OS << "|(1ULL<<MCID::Barrier)";
750   if (Inst.hasDelaySlot)       OS << "|(1ULL<<MCID::DelaySlot)";
751   if (Inst.isCall)             OS << "|(1ULL<<MCID::Call)";
752   if (Inst.canFoldAsLoad)      OS << "|(1ULL<<MCID::FoldableAsLoad)";
753   if (Inst.mayLoad)            OS << "|(1ULL<<MCID::MayLoad)";
754   if (Inst.mayStore)           OS << "|(1ULL<<MCID::MayStore)";
755   if (Inst.mayRaiseFPException) OS << "|(1ULL<<MCID::MayRaiseFPException)";
756   if (Inst.isPredicable)       OS << "|(1ULL<<MCID::Predicable)";
757   if (Inst.isConvertibleToThreeAddress) OS << "|(1ULL<<MCID::ConvertibleTo3Addr)";
758   if (Inst.isCommutable)       OS << "|(1ULL<<MCID::Commutable)";
759   if (Inst.isTerminator)       OS << "|(1ULL<<MCID::Terminator)";
760   if (Inst.isReMaterializable) OS << "|(1ULL<<MCID::Rematerializable)";
761   if (Inst.isNotDuplicable)    OS << "|(1ULL<<MCID::NotDuplicable)";
762   if (Inst.Operands.hasOptionalDef) OS << "|(1ULL<<MCID::HasOptionalDef)";
763   if (Inst.usesCustomInserter) OS << "|(1ULL<<MCID::UsesCustomInserter)";
764   if (Inst.hasPostISelHook)    OS << "|(1ULL<<MCID::HasPostISelHook)";
765   if (Inst.Operands.isVariadic)OS << "|(1ULL<<MCID::Variadic)";
766   if (Inst.hasSideEffects)     OS << "|(1ULL<<MCID::UnmodeledSideEffects)";
767   if (Inst.isAsCheapAsAMove)   OS << "|(1ULL<<MCID::CheapAsAMove)";
768   if (!Target.getAllowRegisterRenaming() || Inst.hasExtraSrcRegAllocReq)
769     OS << "|(1ULL<<MCID::ExtraSrcRegAllocReq)";
770   if (!Target.getAllowRegisterRenaming() || Inst.hasExtraDefRegAllocReq)
771     OS << "|(1ULL<<MCID::ExtraDefRegAllocReq)";
772   if (Inst.isRegSequence) OS << "|(1ULL<<MCID::RegSequence)";
773   if (Inst.isExtractSubreg) OS << "|(1ULL<<MCID::ExtractSubreg)";
774   if (Inst.isInsertSubreg) OS << "|(1ULL<<MCID::InsertSubreg)";
775   if (Inst.isConvergent) OS << "|(1ULL<<MCID::Convergent)";
776   if (Inst.variadicOpsAreDefs) OS << "|(1ULL<<MCID::VariadicOpsAreDefs)";
777   if (Inst.isAuthenticated) OS << "|(1ULL<<MCID::Authenticated)";
778
779   // Emit all of the target-specific flags...
780   BitsInit *TSF = Inst.TheDef->getValueAsBitsInit("TSFlags");
781   if (!TSF)
782     PrintFatalError(Inst.TheDef->getLoc(), "no TSFlags?");
783   uint64_t Value = 0;
784   for (unsigned i = 0, e = TSF->getNumBits(); i != e; ++i) {
785     if (const auto *Bit = dyn_cast<BitInit>(TSF->getBit(i)))
786       Value |= uint64_t(Bit->getValue()) << i;
787     else
788       PrintFatalError(Inst.TheDef->getLoc(),
789                       "Invalid TSFlags bit in " + Inst.TheDef->getName());
790   }
791   OS << ", 0x";
792   OS.write_hex(Value);
793   OS << "ULL, ";
794
795   // Emit the implicit uses and defs lists...
796   std::vector<Record*> UseList = Inst.TheDef->getValueAsListOfDefs("Uses");
797   if (UseList.empty())
798     OS << "nullptr, ";
799   else
800     OS << "ImplicitList" << EmittedLists[UseList] << ", ";
801
802   std::vector<Record*> DefList = Inst.TheDef->getValueAsListOfDefs("Defs");
803   if (DefList.empty())
804     OS << "nullptr, ";
805   else
806     OS << "ImplicitList" << EmittedLists[DefList] << ", ";
807
808   // Emit the operand info.
809   std::vector<std::string> OperandInfo = GetOperandInfo(Inst);
810   if (OperandInfo.empty())
811     OS << "nullptr";
812   else
813     OS << "OperandInfo" << OpInfo.find(OperandInfo)->second;
814
815   OS << " },  // Inst #" << Num << " = " << Inst.TheDef->getName() << "\n";
816 }
817
818 // emitEnums - Print out enum values for all of the instructions.
819 void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
820   OS << "#ifdef GET_INSTRINFO_ENUM\n";
821   OS << "#undef GET_INSTRINFO_ENUM\n";
822
823   OS << "namespace llvm {\n\n";
824
825   const CodeGenTarget &Target = CDP.getTargetInfo();
826
827   // We must emit the PHI opcode first...
828   StringRef Namespace = Target.getInstNamespace();
829
830   if (Namespace.empty())
831     PrintFatalError("No instructions defined!");
832
833   OS << "namespace " << Namespace << " {\n";
834   OS << "  enum {\n";
835   unsigned Num = 0;
836   for (const CodeGenInstruction *Inst : Target.getInstructionsByEnumValue())
837     OS << "    " << Inst->TheDef->getName() << "\t= " << Num++ << ",\n";
838   OS << "    INSTRUCTION_LIST_END = " << Num << "\n";
839   OS << "  };\n\n";
840   OS << "} // end namespace " << Namespace << "\n";
841   OS << "} // end namespace llvm\n";
842   OS << "#endif // GET_INSTRINFO_ENUM\n\n";
843
844   OS << "#ifdef GET_INSTRINFO_SCHED_ENUM\n";
845   OS << "#undef GET_INSTRINFO_SCHED_ENUM\n";
846   OS << "namespace llvm {\n\n";
847   OS << "namespace " << Namespace << " {\n";
848   OS << "namespace Sched {\n";
849   OS << "  enum {\n";
850   Num = 0;
851   for (const auto &Class : SchedModels.explicit_classes())
852     OS << "    " << Class.Name << "\t= " << Num++ << ",\n";
853   OS << "    SCHED_LIST_END = " << Num << "\n";
854   OS << "  };\n";
855   OS << "} // end namespace Sched\n";
856   OS << "} // end namespace " << Namespace << "\n";
857   OS << "} // end namespace llvm\n";
858
859   OS << "#endif // GET_INSTRINFO_SCHED_ENUM\n\n";
860 }
861
862 namespace llvm {
863
864 void EmitInstrInfo(RecordKeeper &RK, raw_ostream &OS) {
865   InstrInfoEmitter(RK).run(OS);
866   EmitMapTable(RK, OS);
867 }
868
869 } // end namespace llvm