]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm-project/llvm/utils/TableGen/InstrInfoEmitter.cpp
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[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 = 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(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   OS << "extern const char " << TargetName << "InstrNameData[] = {\n";
573   InstrNames.emit(OS, printChar);
574   OS << "};\n\n";
575
576   OS << "extern const unsigned " << TargetName <<"InstrNameIndices[] = {";
577   Num = 0;
578   for (const CodeGenInstruction *Inst : NumberedInstructions) {
579     // Newline every eight entries.
580     if (Num % 8 == 0)
581       OS << "\n    ";
582     OS << InstrNames.get(Inst->TheDef->getName()) << "U, ";
583     ++Num;
584   }
585
586   OS << "\n};\n\n";
587
588   // MCInstrInfo initialization routine.
589   OS << "static inline void Init" << TargetName
590      << "MCInstrInfo(MCInstrInfo *II) {\n";
591   OS << "  II->InitMCInstrInfo(" << TargetName << "Insts, "
592      << TargetName << "InstrNameIndices, " << TargetName << "InstrNameData, "
593      << NumberedInstructions.size() << ");\n}\n\n";
594
595   OS << "} // end namespace llvm\n";
596
597   OS << "#endif // GET_INSTRINFO_MC_DESC\n\n";
598
599   // Create a TargetInstrInfo subclass to hide the MC layer initialization.
600   OS << "#ifdef GET_INSTRINFO_HEADER\n";
601   OS << "#undef GET_INSTRINFO_HEADER\n";
602
603   std::string ClassName = TargetName + "GenInstrInfo";
604   OS << "namespace llvm {\n";
605   OS << "struct " << ClassName << " : public TargetInstrInfo {\n"
606      << "  explicit " << ClassName
607      << "(int CFSetupOpcode = -1, int CFDestroyOpcode = -1, int CatchRetOpcode = -1, int ReturnOpcode = -1);\n"
608      << "  ~" << ClassName << "() override = default;\n";
609
610
611   OS << "\n};\n} // end namespace llvm\n";
612
613   OS << "#endif // GET_INSTRINFO_HEADER\n\n";
614
615   OS << "#ifdef GET_INSTRINFO_HELPER_DECLS\n";
616   OS << "#undef GET_INSTRINFO_HELPER_DECLS\n\n";
617   emitTIIHelperMethods(OS, TargetName, /* ExpandDefintion = */false);
618   OS << "\n";
619   OS << "#endif // GET_INSTRINFO_HELPER_DECLS\n\n";
620
621   OS << "#ifdef GET_INSTRINFO_HELPERS\n";
622   OS << "#undef GET_INSTRINFO_HELPERS\n\n";
623   emitTIIHelperMethods(OS, TargetName, /* ExpandDefintion = */true);
624   OS << "#endif // GET_INSTRINFO_HELPERS\n\n";
625
626   OS << "#ifdef GET_INSTRINFO_CTOR_DTOR\n";
627   OS << "#undef GET_INSTRINFO_CTOR_DTOR\n";
628
629   OS << "namespace llvm {\n";
630   OS << "extern const MCInstrDesc " << TargetName << "Insts[];\n";
631   OS << "extern const unsigned " << TargetName << "InstrNameIndices[];\n";
632   OS << "extern const char " << TargetName << "InstrNameData[];\n";
633   OS << ClassName << "::" << ClassName
634      << "(int CFSetupOpcode, int CFDestroyOpcode, int CatchRetOpcode, int ReturnOpcode)\n"
635      << "  : TargetInstrInfo(CFSetupOpcode, CFDestroyOpcode, CatchRetOpcode, ReturnOpcode) {\n"
636      << "  InitMCInstrInfo(" << TargetName << "Insts, " << TargetName
637      << "InstrNameIndices, " << TargetName << "InstrNameData, "
638      << NumberedInstructions.size() << ");\n}\n";
639   OS << "} // end namespace llvm\n";
640
641   OS << "#endif // GET_INSTRINFO_CTOR_DTOR\n\n";
642
643   emitOperandNameMappings(OS, Target, NumberedInstructions);
644
645   emitOperandTypeMappings(OS, Target, NumberedInstructions);
646
647   emitMCIIHelperMethods(OS, TargetName);
648 }
649
650 void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
651                                   Record *InstrInfo,
652                          std::map<std::vector<Record*>, unsigned> &EmittedLists,
653                                   const OperandInfoMapTy &OpInfo,
654                                   raw_ostream &OS) {
655   int MinOperands = 0;
656   if (!Inst.Operands.empty())
657     // Each logical operand can be multiple MI operands.
658     MinOperands = Inst.Operands.back().MIOperandNo +
659                   Inst.Operands.back().MINumOperands;
660
661   OS << "  { ";
662   OS << Num << ",\t" << MinOperands << ",\t"
663      << Inst.Operands.NumDefs << ",\t"
664      << Inst.TheDef->getValueAsInt("Size") << ",\t"
665      << SchedModels.getSchedClassIdx(Inst) << ",\t0";
666
667   CodeGenTarget &Target = CDP.getTargetInfo();
668
669   // Emit all of the target independent flags...
670   if (Inst.isPreISelOpcode)    OS << "|(1ULL<<MCID::PreISelOpcode)";
671   if (Inst.isPseudo)           OS << "|(1ULL<<MCID::Pseudo)";
672   if (Inst.isReturn)           OS << "|(1ULL<<MCID::Return)";
673   if (Inst.isEHScopeReturn)    OS << "|(1ULL<<MCID::EHScopeReturn)";
674   if (Inst.isBranch)           OS << "|(1ULL<<MCID::Branch)";
675   if (Inst.isIndirectBranch)   OS << "|(1ULL<<MCID::IndirectBranch)";
676   if (Inst.isCompare)          OS << "|(1ULL<<MCID::Compare)";
677   if (Inst.isMoveImm)          OS << "|(1ULL<<MCID::MoveImm)";
678   if (Inst.isMoveReg)          OS << "|(1ULL<<MCID::MoveReg)";
679   if (Inst.isBitcast)          OS << "|(1ULL<<MCID::Bitcast)";
680   if (Inst.isAdd)              OS << "|(1ULL<<MCID::Add)";
681   if (Inst.isTrap)             OS << "|(1ULL<<MCID::Trap)";
682   if (Inst.isSelect)           OS << "|(1ULL<<MCID::Select)";
683   if (Inst.isBarrier)          OS << "|(1ULL<<MCID::Barrier)";
684   if (Inst.hasDelaySlot)       OS << "|(1ULL<<MCID::DelaySlot)";
685   if (Inst.isCall)             OS << "|(1ULL<<MCID::Call)";
686   if (Inst.canFoldAsLoad)      OS << "|(1ULL<<MCID::FoldableAsLoad)";
687   if (Inst.mayLoad)            OS << "|(1ULL<<MCID::MayLoad)";
688   if (Inst.mayStore)           OS << "|(1ULL<<MCID::MayStore)";
689   if (Inst.mayRaiseFPException) OS << "|(1ULL<<MCID::MayRaiseFPException)";
690   if (Inst.isPredicable)       OS << "|(1ULL<<MCID::Predicable)";
691   if (Inst.isConvertibleToThreeAddress) OS << "|(1ULL<<MCID::ConvertibleTo3Addr)";
692   if (Inst.isCommutable)       OS << "|(1ULL<<MCID::Commutable)";
693   if (Inst.isTerminator)       OS << "|(1ULL<<MCID::Terminator)";
694   if (Inst.isReMaterializable) OS << "|(1ULL<<MCID::Rematerializable)";
695   if (Inst.isNotDuplicable)    OS << "|(1ULL<<MCID::NotDuplicable)";
696   if (Inst.Operands.hasOptionalDef) OS << "|(1ULL<<MCID::HasOptionalDef)";
697   if (Inst.usesCustomInserter) OS << "|(1ULL<<MCID::UsesCustomInserter)";
698   if (Inst.hasPostISelHook)    OS << "|(1ULL<<MCID::HasPostISelHook)";
699   if (Inst.Operands.isVariadic)OS << "|(1ULL<<MCID::Variadic)";
700   if (Inst.hasSideEffects)     OS << "|(1ULL<<MCID::UnmodeledSideEffects)";
701   if (Inst.isAsCheapAsAMove)   OS << "|(1ULL<<MCID::CheapAsAMove)";
702   if (!Target.getAllowRegisterRenaming() || Inst.hasExtraSrcRegAllocReq)
703     OS << "|(1ULL<<MCID::ExtraSrcRegAllocReq)";
704   if (!Target.getAllowRegisterRenaming() || Inst.hasExtraDefRegAllocReq)
705     OS << "|(1ULL<<MCID::ExtraDefRegAllocReq)";
706   if (Inst.isRegSequence) OS << "|(1ULL<<MCID::RegSequence)";
707   if (Inst.isExtractSubreg) OS << "|(1ULL<<MCID::ExtractSubreg)";
708   if (Inst.isInsertSubreg) OS << "|(1ULL<<MCID::InsertSubreg)";
709   if (Inst.isConvergent) OS << "|(1ULL<<MCID::Convergent)";
710   if (Inst.variadicOpsAreDefs) OS << "|(1ULL<<MCID::VariadicOpsAreDefs)";
711   if (Inst.isAuthenticated) OS << "|(1ULL<<MCID::Authenticated)";
712
713   // Emit all of the target-specific flags...
714   BitsInit *TSF = Inst.TheDef->getValueAsBitsInit("TSFlags");
715   if (!TSF)
716     PrintFatalError(Inst.TheDef->getLoc(), "no TSFlags?");
717   uint64_t Value = 0;
718   for (unsigned i = 0, e = TSF->getNumBits(); i != e; ++i) {
719     if (const auto *Bit = dyn_cast<BitInit>(TSF->getBit(i)))
720       Value |= uint64_t(Bit->getValue()) << i;
721     else
722       PrintFatalError(Inst.TheDef->getLoc(),
723                       "Invalid TSFlags bit in " + Inst.TheDef->getName());
724   }
725   OS << ", 0x";
726   OS.write_hex(Value);
727   OS << "ULL, ";
728
729   // Emit the implicit uses and defs lists...
730   std::vector<Record*> UseList = Inst.TheDef->getValueAsListOfDefs("Uses");
731   if (UseList.empty())
732     OS << "nullptr, ";
733   else
734     OS << "ImplicitList" << EmittedLists[UseList] << ", ";
735
736   std::vector<Record*> DefList = Inst.TheDef->getValueAsListOfDefs("Defs");
737   if (DefList.empty())
738     OS << "nullptr, ";
739   else
740     OS << "ImplicitList" << EmittedLists[DefList] << ", ";
741
742   // Emit the operand info.
743   std::vector<std::string> OperandInfo = GetOperandInfo(Inst);
744   if (OperandInfo.empty())
745     OS << "nullptr";
746   else
747     OS << "OperandInfo" << OpInfo.find(OperandInfo)->second;
748
749   if (Inst.HasComplexDeprecationPredicate)
750     // Emit a function pointer to the complex predicate method.
751     OS << ", -1 "
752        << ",&get" << Inst.DeprecatedReason << "DeprecationInfo";
753   else if (!Inst.DeprecatedReason.empty())
754     // Emit the Subtarget feature.
755     OS << ", " << Target.getInstNamespace() << "::" << Inst.DeprecatedReason
756        << " ,nullptr";
757   else
758     // Instruction isn't deprecated.
759     OS << ", -1 ,nullptr";
760
761   OS << " },  // Inst #" << Num << " = " << Inst.TheDef->getName() << "\n";
762 }
763
764 // emitEnums - Print out enum values for all of the instructions.
765 void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
766   OS << "#ifdef GET_INSTRINFO_ENUM\n";
767   OS << "#undef GET_INSTRINFO_ENUM\n";
768
769   OS << "namespace llvm {\n\n";
770
771   CodeGenTarget Target(Records);
772
773   // We must emit the PHI opcode first...
774   StringRef Namespace = Target.getInstNamespace();
775
776   if (Namespace.empty())
777     PrintFatalError("No instructions defined!");
778
779   OS << "namespace " << Namespace << " {\n";
780   OS << "  enum {\n";
781   unsigned Num = 0;
782   for (const CodeGenInstruction *Inst : Target.getInstructionsByEnumValue())
783     OS << "    " << Inst->TheDef->getName() << "\t= " << Num++ << ",\n";
784   OS << "    INSTRUCTION_LIST_END = " << Num << "\n";
785   OS << "  };\n\n";
786   OS << "} // end namespace " << Namespace << "\n";
787   OS << "} // end namespace llvm\n";
788   OS << "#endif // GET_INSTRINFO_ENUM\n\n";
789
790   OS << "#ifdef GET_INSTRINFO_SCHED_ENUM\n";
791   OS << "#undef GET_INSTRINFO_SCHED_ENUM\n";
792   OS << "namespace llvm {\n\n";
793   OS << "namespace " << Namespace << " {\n";
794   OS << "namespace Sched {\n";
795   OS << "  enum {\n";
796   Num = 0;
797   for (const auto &Class : SchedModels.explicit_classes())
798     OS << "    " << Class.Name << "\t= " << Num++ << ",\n";
799   OS << "    SCHED_LIST_END = " << Num << "\n";
800   OS << "  };\n";
801   OS << "} // end namespace Sched\n";
802   OS << "} // end namespace " << Namespace << "\n";
803   OS << "} // end namespace llvm\n";
804
805   OS << "#endif // GET_INSTRINFO_SCHED_ENUM\n\n";
806 }
807
808 namespace llvm {
809
810 void EmitInstrInfo(RecordKeeper &RK, raw_ostream &OS) {
811   InstrInfoEmitter(RK).run(OS);
812   EmitMapTable(RK, OS);
813 }
814
815 } // end namespace llvm