• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
InstrInfoEmitter(RecordKeeper & R)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 
PrintDefList(const std::vector<Record * > & Uses,unsigned Num,raw_ostream & OS)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>
GetOperandInfo(const CodeGenInstruction & Inst)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 
EmitOperandInfo(raw_ostream & OS,OperandInfoMapTy & OperandInfoIDs)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.
initOperandMapData(ArrayRef<const CodeGenInstruction * > NumberedInstructions,StringRef Namespace,std::map<std::string,unsigned> & Operands,OpNameMapTy & OperandMap)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
emitOperandNameMappings(raw_ostream & OS,const CodeGenTarget & Target,ArrayRef<const CodeGenInstruction * > NumberedInstructions)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.
emitOperandTypeMappings(raw_ostream & OS,const CodeGenTarget & Target,ArrayRef<const CodeGenInstruction * > NumberedInstructions)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 
emitMCIIHelperMethods(raw_ostream & OS,StringRef TargetName)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 
emitTIIHelperMethods(raw_ostream & OS,StringRef TargetName,bool ExpandDefinition)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...
run(raw_ostream & OS)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   Records.startTimer("Emit uses/defs");
536   for (const CodeGenInstruction *II : Target.getInstructionsByEnumValue()) {
537     Record *Inst = II->TheDef;
538     std::vector<Record*> Uses = Inst->getValueAsListOfDefs("Uses");
539     if (!Uses.empty()) {
540       unsigned &IL = EmittedLists[Uses];
541       if (!IL) PrintDefList(Uses, IL = ++ListNumber, OS);
542     }
543     std::vector<Record*> Defs = Inst->getValueAsListOfDefs("Defs");
544     if (!Defs.empty()) {
545       unsigned &IL = EmittedLists[Defs];
546       if (!IL) PrintDefList(Defs, IL = ++ListNumber, OS);
547     }
548   }
549 
550   OperandInfoMapTy OperandInfoIDs;
551 
552   // Emit all of the operand info records.
553   Records.startTimer("Emit operand info");
554   EmitOperandInfo(OS, OperandInfoIDs);
555 
556   // Emit all of the MCInstrDesc records in their ENUM ordering.
557   //
558   Records.startTimer("Emit InstrDesc records");
559   OS << "\nextern const MCInstrDesc " << TargetName << "Insts[] = {\n";
560   ArrayRef<const CodeGenInstruction*> NumberedInstructions =
561     Target.getInstructionsByEnumValue();
562 
563   SequenceToOffsetTable<std::string> InstrNames;
564   unsigned Num = 0;
565   for (const CodeGenInstruction *Inst : NumberedInstructions) {
566     // Keep a list of the instruction names.
567     InstrNames.add(std::string(Inst->TheDef->getName()));
568     // Emit the record into the table.
569     emitRecord(*Inst, Num++, InstrInfo, EmittedLists, OperandInfoIDs, OS);
570   }
571   OS << "};\n\n";
572 
573   // Emit the array of instruction names.
574   Records.startTimer("Emit instruction names");
575   InstrNames.layout();
576   InstrNames.emitStringLiteralDef(OS, Twine("extern const char ") + TargetName +
577                                           "InstrNameData[]");
578 
579   OS << "extern const unsigned " << TargetName <<"InstrNameIndices[] = {";
580   Num = 0;
581   for (const CodeGenInstruction *Inst : NumberedInstructions) {
582     // Newline every eight entries.
583     if (Num % 8 == 0)
584       OS << "\n    ";
585     OS << InstrNames.get(std::string(Inst->TheDef->getName())) << "U, ";
586     ++Num;
587   }
588   OS << "\n};\n\n";
589 
590   bool HasDeprecationFeatures =
591       llvm::any_of(NumberedInstructions, [](const CodeGenInstruction *Inst) {
592         return !Inst->HasComplexDeprecationPredicate &&
593                !Inst->DeprecatedReason.empty();
594       });
595   if (HasDeprecationFeatures) {
596     OS << "extern const uint8_t " << TargetName
597        << "InstrDeprecationFeatures[] = {";
598     Num = 0;
599     for (const CodeGenInstruction *Inst : NumberedInstructions) {
600       if (Num % 8 == 0)
601         OS << "\n    ";
602       if (!Inst->HasComplexDeprecationPredicate &&
603           !Inst->DeprecatedReason.empty())
604         OS << Target.getInstNamespace() << "::" << Inst->DeprecatedReason
605            << ", ";
606       else
607         OS << "uint8_t(-1), ";
608       ++Num;
609     }
610     OS << "\n};\n\n";
611   }
612 
613   bool HasComplexDeprecationInfos =
614       llvm::any_of(NumberedInstructions, [](const CodeGenInstruction *Inst) {
615         return Inst->HasComplexDeprecationPredicate;
616       });
617   if (HasComplexDeprecationInfos) {
618     OS << "extern const MCInstrInfo::ComplexDeprecationPredicate " << TargetName
619        << "InstrComplexDeprecationInfos[] = {";
620     Num = 0;
621     for (const CodeGenInstruction *Inst : NumberedInstructions) {
622       if (Num % 8 == 0)
623         OS << "\n    ";
624       if (Inst->HasComplexDeprecationPredicate)
625         // Emit a function pointer to the complex predicate method.
626         OS << "&get" << Inst->DeprecatedReason << "DeprecationInfo, ";
627       else
628         OS << "nullptr, ";
629       ++Num;
630     }
631     OS << "\n};\n\n";
632   }
633 
634   // MCInstrInfo initialization routine.
635   Records.startTimer("Emit initialization routine");
636   OS << "static inline void Init" << TargetName
637      << "MCInstrInfo(MCInstrInfo *II) {\n";
638   OS << "  II->InitMCInstrInfo(" << TargetName << "Insts, " << TargetName
639      << "InstrNameIndices, " << TargetName << "InstrNameData, ";
640   if (HasDeprecationFeatures)
641     OS << TargetName << "InstrDeprecationFeatures, ";
642   else
643     OS << "nullptr, ";
644   if (HasComplexDeprecationInfos)
645     OS << TargetName << "InstrComplexDeprecationInfos, ";
646   else
647     OS << "nullptr, ";
648   OS << NumberedInstructions.size() << ");\n}\n\n";
649 
650   OS << "} // end namespace llvm\n";
651 
652   OS << "#endif // GET_INSTRINFO_MC_DESC\n\n";
653 
654   // Create a TargetInstrInfo subclass to hide the MC layer initialization.
655   OS << "#ifdef GET_INSTRINFO_HEADER\n";
656   OS << "#undef GET_INSTRINFO_HEADER\n";
657 
658   std::string ClassName = TargetName + "GenInstrInfo";
659   OS << "namespace llvm {\n";
660   OS << "struct " << ClassName << " : public TargetInstrInfo {\n"
661      << "  explicit " << ClassName
662      << "(int CFSetupOpcode = -1, int CFDestroyOpcode = -1, int CatchRetOpcode = -1, int ReturnOpcode = -1);\n"
663      << "  ~" << ClassName << "() override = default;\n";
664 
665 
666   OS << "\n};\n} // end namespace llvm\n";
667 
668   OS << "#endif // GET_INSTRINFO_HEADER\n\n";
669 
670   OS << "#ifdef GET_INSTRINFO_HELPER_DECLS\n";
671   OS << "#undef GET_INSTRINFO_HELPER_DECLS\n\n";
672   emitTIIHelperMethods(OS, TargetName, /* ExpandDefintion = */false);
673   OS << "\n";
674   OS << "#endif // GET_INSTRINFO_HELPER_DECLS\n\n";
675 
676   OS << "#ifdef GET_INSTRINFO_HELPERS\n";
677   OS << "#undef GET_INSTRINFO_HELPERS\n\n";
678   emitTIIHelperMethods(OS, TargetName, /* ExpandDefintion = */true);
679   OS << "#endif // GET_INSTRINFO_HELPERS\n\n";
680 
681   OS << "#ifdef GET_INSTRINFO_CTOR_DTOR\n";
682   OS << "#undef GET_INSTRINFO_CTOR_DTOR\n";
683 
684   OS << "namespace llvm {\n";
685   OS << "extern const MCInstrDesc " << TargetName << "Insts[];\n";
686   OS << "extern const unsigned " << TargetName << "InstrNameIndices[];\n";
687   OS << "extern const char " << TargetName << "InstrNameData[];\n";
688   if (HasDeprecationFeatures)
689     OS << "extern const uint8_t " << TargetName
690        << "InstrDeprecationFeatures[];\n";
691   if (HasComplexDeprecationInfos)
692     OS << "extern const MCInstrInfo::ComplexDeprecationPredicate " << TargetName
693        << "InstrComplexDeprecationInfos[];\n";
694   OS << ClassName << "::" << ClassName
695      << "(int CFSetupOpcode, int CFDestroyOpcode, int CatchRetOpcode, int "
696         "ReturnOpcode)\n"
697      << "  : TargetInstrInfo(CFSetupOpcode, CFDestroyOpcode, CatchRetOpcode, "
698         "ReturnOpcode) {\n"
699      << "  InitMCInstrInfo(" << TargetName << "Insts, " << TargetName
700      << "InstrNameIndices, " << TargetName << "InstrNameData, ";
701   if (HasDeprecationFeatures)
702     OS << TargetName << "InstrDeprecationFeatures, ";
703   else
704     OS << "nullptr, ";
705   if (HasComplexDeprecationInfos)
706     OS << TargetName << "InstrComplexDeprecationInfos, ";
707   else
708     OS << "nullptr, ";
709   OS << NumberedInstructions.size() << ");\n}\n";
710   OS << "} // end namespace llvm\n";
711 
712   OS << "#endif // GET_INSTRINFO_CTOR_DTOR\n\n";
713 
714   Records.startTimer("Emit operand name mappings");
715   emitOperandNameMappings(OS, Target, NumberedInstructions);
716 
717   Records.startTimer("Emit operand type mappings");
718   emitOperandTypeMappings(OS, Target, NumberedInstructions);
719 
720   Records.startTimer("Emit helper methods");
721   emitMCIIHelperMethods(OS, TargetName);
722 }
723 
emitRecord(const CodeGenInstruction & Inst,unsigned Num,Record * InstrInfo,std::map<std::vector<Record * >,unsigned> & EmittedLists,const OperandInfoMapTy & OpInfo,raw_ostream & OS)724 void InstrInfoEmitter::emitRecord(const CodeGenInstruction &Inst, unsigned Num,
725                                   Record *InstrInfo,
726                          std::map<std::vector<Record*>, unsigned> &EmittedLists,
727                                   const OperandInfoMapTy &OpInfo,
728                                   raw_ostream &OS) {
729   int MinOperands = 0;
730   if (!Inst.Operands.empty())
731     // Each logical operand can be multiple MI operands.
732     MinOperands = Inst.Operands.back().MIOperandNo +
733                   Inst.Operands.back().MINumOperands;
734 
735   OS << "  { ";
736   OS << Num << ",\t" << MinOperands << ",\t"
737      << Inst.Operands.NumDefs << ",\t"
738      << Inst.TheDef->getValueAsInt("Size") << ",\t"
739      << SchedModels.getSchedClassIdx(Inst) << ",\t0";
740 
741   CodeGenTarget &Target = CDP.getTargetInfo();
742 
743   // Emit all of the target independent flags...
744   if (Inst.isPreISelOpcode)    OS << "|(1ULL<<MCID::PreISelOpcode)";
745   if (Inst.isPseudo)           OS << "|(1ULL<<MCID::Pseudo)";
746   if (Inst.isReturn)           OS << "|(1ULL<<MCID::Return)";
747   if (Inst.isEHScopeReturn)    OS << "|(1ULL<<MCID::EHScopeReturn)";
748   if (Inst.isBranch)           OS << "|(1ULL<<MCID::Branch)";
749   if (Inst.isIndirectBranch)   OS << "|(1ULL<<MCID::IndirectBranch)";
750   if (Inst.isCompare)          OS << "|(1ULL<<MCID::Compare)";
751   if (Inst.isMoveImm)          OS << "|(1ULL<<MCID::MoveImm)";
752   if (Inst.isMoveReg)          OS << "|(1ULL<<MCID::MoveReg)";
753   if (Inst.isBitcast)          OS << "|(1ULL<<MCID::Bitcast)";
754   if (Inst.isAdd)              OS << "|(1ULL<<MCID::Add)";
755   if (Inst.isTrap)             OS << "|(1ULL<<MCID::Trap)";
756   if (Inst.isSelect)           OS << "|(1ULL<<MCID::Select)";
757   if (Inst.isBarrier)          OS << "|(1ULL<<MCID::Barrier)";
758   if (Inst.hasDelaySlot)       OS << "|(1ULL<<MCID::DelaySlot)";
759   if (Inst.isCall)             OS << "|(1ULL<<MCID::Call)";
760   if (Inst.canFoldAsLoad)      OS << "|(1ULL<<MCID::FoldableAsLoad)";
761   if (Inst.mayLoad)            OS << "|(1ULL<<MCID::MayLoad)";
762   if (Inst.mayStore)           OS << "|(1ULL<<MCID::MayStore)";
763   if (Inst.mayRaiseFPException) OS << "|(1ULL<<MCID::MayRaiseFPException)";
764   if (Inst.isPredicable)       OS << "|(1ULL<<MCID::Predicable)";
765   if (Inst.isConvertibleToThreeAddress) OS << "|(1ULL<<MCID::ConvertibleTo3Addr)";
766   if (Inst.isCommutable)       OS << "|(1ULL<<MCID::Commutable)";
767   if (Inst.isTerminator)       OS << "|(1ULL<<MCID::Terminator)";
768   if (Inst.isReMaterializable) OS << "|(1ULL<<MCID::Rematerializable)";
769   if (Inst.isNotDuplicable)    OS << "|(1ULL<<MCID::NotDuplicable)";
770   if (Inst.Operands.hasOptionalDef) OS << "|(1ULL<<MCID::HasOptionalDef)";
771   if (Inst.usesCustomInserter) OS << "|(1ULL<<MCID::UsesCustomInserter)";
772   if (Inst.hasPostISelHook)    OS << "|(1ULL<<MCID::HasPostISelHook)";
773   if (Inst.Operands.isVariadic)OS << "|(1ULL<<MCID::Variadic)";
774   if (Inst.hasSideEffects)     OS << "|(1ULL<<MCID::UnmodeledSideEffects)";
775   if (Inst.isAsCheapAsAMove)   OS << "|(1ULL<<MCID::CheapAsAMove)";
776   if (!Target.getAllowRegisterRenaming() || Inst.hasExtraSrcRegAllocReq)
777     OS << "|(1ULL<<MCID::ExtraSrcRegAllocReq)";
778   if (!Target.getAllowRegisterRenaming() || Inst.hasExtraDefRegAllocReq)
779     OS << "|(1ULL<<MCID::ExtraDefRegAllocReq)";
780   if (Inst.isRegSequence) OS << "|(1ULL<<MCID::RegSequence)";
781   if (Inst.isExtractSubreg) OS << "|(1ULL<<MCID::ExtractSubreg)";
782   if (Inst.isInsertSubreg) OS << "|(1ULL<<MCID::InsertSubreg)";
783   if (Inst.isConvergent) OS << "|(1ULL<<MCID::Convergent)";
784   if (Inst.variadicOpsAreDefs) OS << "|(1ULL<<MCID::VariadicOpsAreDefs)";
785   if (Inst.isAuthenticated) OS << "|(1ULL<<MCID::Authenticated)";
786 
787   // Emit all of the target-specific flags...
788   BitsInit *TSF = Inst.TheDef->getValueAsBitsInit("TSFlags");
789   if (!TSF)
790     PrintFatalError(Inst.TheDef->getLoc(), "no TSFlags?");
791   uint64_t Value = 0;
792   for (unsigned i = 0, e = TSF->getNumBits(); i != e; ++i) {
793     if (const auto *Bit = dyn_cast<BitInit>(TSF->getBit(i)))
794       Value |= uint64_t(Bit->getValue()) << i;
795     else
796       PrintFatalError(Inst.TheDef->getLoc(),
797                       "Invalid TSFlags bit in " + Inst.TheDef->getName());
798   }
799   OS << ", 0x";
800   OS.write_hex(Value);
801   OS << "ULL, ";
802 
803   // Emit the implicit uses and defs lists...
804   std::vector<Record*> UseList = Inst.TheDef->getValueAsListOfDefs("Uses");
805   if (UseList.empty())
806     OS << "nullptr, ";
807   else
808     OS << "ImplicitList" << EmittedLists[UseList] << ", ";
809 
810   std::vector<Record*> DefList = Inst.TheDef->getValueAsListOfDefs("Defs");
811   if (DefList.empty())
812     OS << "nullptr, ";
813   else
814     OS << "ImplicitList" << EmittedLists[DefList] << ", ";
815 
816   // Emit the operand info.
817   std::vector<std::string> OperandInfo = GetOperandInfo(Inst);
818   if (OperandInfo.empty())
819     OS << "nullptr";
820   else
821     OS << "OperandInfo" << OpInfo.find(OperandInfo)->second;
822 
823   OS << " },  // Inst #" << Num << " = " << Inst.TheDef->getName() << "\n";
824 }
825 
826 // emitEnums - Print out enum values for all of the instructions.
emitEnums(raw_ostream & OS)827 void InstrInfoEmitter::emitEnums(raw_ostream &OS) {
828   OS << "#ifdef GET_INSTRINFO_ENUM\n";
829   OS << "#undef GET_INSTRINFO_ENUM\n";
830 
831   OS << "namespace llvm {\n\n";
832 
833   const CodeGenTarget &Target = CDP.getTargetInfo();
834 
835   // We must emit the PHI opcode first...
836   StringRef Namespace = Target.getInstNamespace();
837 
838   if (Namespace.empty())
839     PrintFatalError("No instructions defined!");
840 
841   OS << "namespace " << Namespace << " {\n";
842   OS << "  enum {\n";
843   unsigned Num = 0;
844   for (const CodeGenInstruction *Inst : Target.getInstructionsByEnumValue())
845     OS << "    " << Inst->TheDef->getName() << "\t= " << Num++ << ",\n";
846   OS << "    INSTRUCTION_LIST_END = " << Num << "\n";
847   OS << "  };\n\n";
848   OS << "} // end namespace " << Namespace << "\n";
849   OS << "} // end namespace llvm\n";
850   OS << "#endif // GET_INSTRINFO_ENUM\n\n";
851 
852   OS << "#ifdef GET_INSTRINFO_SCHED_ENUM\n";
853   OS << "#undef GET_INSTRINFO_SCHED_ENUM\n";
854   OS << "namespace llvm {\n\n";
855   OS << "namespace " << Namespace << " {\n";
856   OS << "namespace Sched {\n";
857   OS << "  enum {\n";
858   Num = 0;
859   for (const auto &Class : SchedModels.explicit_classes())
860     OS << "    " << Class.Name << "\t= " << Num++ << ",\n";
861   OS << "    SCHED_LIST_END = " << Num << "\n";
862   OS << "  };\n";
863   OS << "} // end namespace Sched\n";
864   OS << "} // end namespace " << Namespace << "\n";
865   OS << "} // end namespace llvm\n";
866 
867   OS << "#endif // GET_INSTRINFO_SCHED_ENUM\n\n";
868 }
869 
870 namespace llvm {
871 
EmitInstrInfo(RecordKeeper & RK,raw_ostream & OS)872 void EmitInstrInfo(RecordKeeper &RK, raw_ostream &OS) {
873   RK.startTimer("Analyze DAG patterns");
874   InstrInfoEmitter(RK).run(OS);
875   RK.startTimer("Emit map table");
876   EmitMapTable(RK, OS);
877 }
878 
879 } // end namespace llvm
880