1 //===- RegisterInfoEmitter.cpp - Generate a Register File Desc. -*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This tablegen backend is responsible for emitting a description of a target 11 // register file for a code generator. It uses instances of the Register, 12 // RegisterAliases, and RegisterClass classes to gather this information. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #include "RegisterInfoEmitter.h" 17 #include "CodeGenTarget.h" 18 #include "CodeGenRegisters.h" 19 #include "llvm/TableGen/Record.h" 20 #include "llvm/ADT/BitVector.h" 21 #include "llvm/ADT/StringExtras.h" 22 #include "llvm/ADT/STLExtras.h" 23 #include "llvm/Support/Format.h" 24 #include <algorithm> 25 #include <set> 26 using namespace llvm; 27 28 // runEnums - Print out enum values for all of the registers. 29 void 30 RegisterInfoEmitter::runEnums(raw_ostream &OS, 31 CodeGenTarget &Target, CodeGenRegBank &Bank) { 32 const std::vector<CodeGenRegister*> &Registers = Bank.getRegisters(); 33 34 std::string Namespace = Registers[0]->TheDef->getValueAsString("Namespace"); 35 36 EmitSourceFileHeader("Target Register Enum Values", OS); 37 38 OS << "\n#ifdef GET_REGINFO_ENUM\n"; 39 OS << "#undef GET_REGINFO_ENUM\n"; 40 41 OS << "namespace llvm {\n\n"; 42 43 OS << "class MCRegisterClass;\n" 44 << "extern MCRegisterClass " << Namespace << "MCRegisterClasses[];\n\n"; 45 46 if (!Namespace.empty()) 47 OS << "namespace " << Namespace << " {\n"; 48 OS << "enum {\n NoRegister,\n"; 49 50 for (unsigned i = 0, e = Registers.size(); i != e; ++i) 51 OS << " " << Registers[i]->getName() << " = " << 52 Registers[i]->EnumValue << ",\n"; 53 assert(Registers.size() == Registers[Registers.size()-1]->EnumValue && 54 "Register enum value mismatch!"); 55 OS << " NUM_TARGET_REGS \t// " << Registers.size()+1 << "\n"; 56 OS << "};\n"; 57 if (!Namespace.empty()) 58 OS << "}\n"; 59 60 ArrayRef<CodeGenRegisterClass*> RegisterClasses = Bank.getRegClasses(); 61 if (!RegisterClasses.empty()) { 62 OS << "\n// Register classes\n"; 63 if (!Namespace.empty()) 64 OS << "namespace " << Namespace << " {\n"; 65 OS << "enum {\n"; 66 for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) { 67 if (i) OS << ",\n"; 68 OS << " " << RegisterClasses[i]->getName() << "RegClassID"; 69 OS << " = " << i; 70 } 71 OS << "\n };\n"; 72 if (!Namespace.empty()) 73 OS << "}\n"; 74 } 75 76 const std::vector<Record*> RegAltNameIndices = Target.getRegAltNameIndices(); 77 // If the only definition is the default NoRegAltName, we don't need to 78 // emit anything. 79 if (RegAltNameIndices.size() > 1) { 80 OS << "\n// Register alternate name indices\n"; 81 if (!Namespace.empty()) 82 OS << "namespace " << Namespace << " {\n"; 83 OS << "enum {\n"; 84 for (unsigned i = 0, e = RegAltNameIndices.size(); i != e; ++i) 85 OS << " " << RegAltNameIndices[i]->getName() << ",\t// " << i << "\n"; 86 OS << " NUM_TARGET_REG_ALT_NAMES = " << RegAltNameIndices.size() << "\n"; 87 OS << "};\n"; 88 if (!Namespace.empty()) 89 OS << "}\n"; 90 } 91 92 93 OS << "} // End llvm namespace \n"; 94 OS << "#endif // GET_REGINFO_ENUM\n\n"; 95 } 96 97 void 98 RegisterInfoEmitter::EmitRegMapping(raw_ostream &OS, 99 const std::vector<CodeGenRegister*> &Regs, 100 bool isCtor) { 101 102 // Collect all information about dwarf register numbers 103 typedef std::map<Record*, std::vector<int64_t>, LessRecord> DwarfRegNumsMapTy; 104 DwarfRegNumsMapTy DwarfRegNums; 105 106 // First, just pull all provided information to the map 107 unsigned maxLength = 0; 108 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 109 Record *Reg = Regs[i]->TheDef; 110 std::vector<int64_t> RegNums = Reg->getValueAsListOfInts("DwarfNumbers"); 111 maxLength = std::max((size_t)maxLength, RegNums.size()); 112 if (DwarfRegNums.count(Reg)) 113 errs() << "Warning: DWARF numbers for register " << getQualifiedName(Reg) 114 << "specified multiple times\n"; 115 DwarfRegNums[Reg] = RegNums; 116 } 117 118 if (!maxLength) 119 return; 120 121 // Now we know maximal length of number list. Append -1's, where needed 122 for (DwarfRegNumsMapTy::iterator 123 I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) 124 for (unsigned i = I->second.size(), e = maxLength; i != e; ++i) 125 I->second.push_back(-1); 126 127 // Emit reverse information about the dwarf register numbers. 128 for (unsigned j = 0; j < 2; ++j) { 129 OS << " switch ("; 130 if (j == 0) 131 OS << "DwarfFlavour"; 132 else 133 OS << "EHFlavour"; 134 OS << ") {\n" 135 << " default:\n" 136 << " assert(0 && \"Unknown DWARF flavour\");\n" 137 << " break;\n"; 138 139 for (unsigned i = 0, e = maxLength; i != e; ++i) { 140 OS << " case " << i << ":\n"; 141 for (DwarfRegNumsMapTy::iterator 142 I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) { 143 int DwarfRegNo = I->second[i]; 144 if (DwarfRegNo < 0) 145 continue; 146 OS << " "; 147 if (!isCtor) 148 OS << "RI->"; 149 OS << "mapDwarfRegToLLVMReg(" << DwarfRegNo << ", " 150 << getQualifiedName(I->first) << ", "; 151 if (j == 0) 152 OS << "false"; 153 else 154 OS << "true"; 155 OS << " );\n"; 156 } 157 OS << " break;\n"; 158 } 159 OS << " }\n"; 160 } 161 162 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 163 Record *Reg = Regs[i]->TheDef; 164 const RecordVal *V = Reg->getValue("DwarfAlias"); 165 if (!V || !V->getValue()) 166 continue; 167 168 DefInit *DI = dynamic_cast<DefInit*>(V->getValue()); 169 Record *Alias = DI->getDef(); 170 DwarfRegNums[Reg] = DwarfRegNums[Alias]; 171 } 172 173 // Emit information about the dwarf register numbers. 174 for (unsigned j = 0; j < 2; ++j) { 175 OS << " switch ("; 176 if (j == 0) 177 OS << "DwarfFlavour"; 178 else 179 OS << "EHFlavour"; 180 OS << ") {\n" 181 << " default:\n" 182 << " assert(0 && \"Unknown DWARF flavour\");\n" 183 << " break;\n"; 184 185 for (unsigned i = 0, e = maxLength; i != e; ++i) { 186 OS << " case " << i << ":\n"; 187 // Sort by name to get a stable order. 188 for (DwarfRegNumsMapTy::iterator 189 I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) { 190 int RegNo = I->second[i]; 191 OS << " "; 192 if (!isCtor) 193 OS << "RI->"; 194 OS << "mapLLVMRegToDwarfReg(" << getQualifiedName(I->first) << ", " 195 << RegNo << ", "; 196 if (j == 0) 197 OS << "false"; 198 else 199 OS << "true"; 200 OS << " );\n"; 201 } 202 OS << " break;\n"; 203 } 204 OS << " }\n"; 205 } 206 } 207 208 // Print a BitVector as a sequence of hex numbers using a little-endian mapping. 209 // Width is the number of bits per hex number. 210 static void printBitVectorAsHex(raw_ostream &OS, 211 const BitVector &Bits, 212 unsigned Width) { 213 assert(Width <= 32 && "Width too large"); 214 unsigned Digits = (Width + 3) / 4; 215 for (unsigned i = 0, e = Bits.size(); i < e; i += Width) { 216 unsigned Value = 0; 217 for (unsigned j = 0; j != Width && i + j != e; ++j) 218 Value |= Bits.test(i + j) << j; 219 OS << format("0x%0*x, ", Digits, Value); 220 } 221 } 222 223 // Helper to emit a set of bits into a constant byte array. 224 class BitVectorEmitter { 225 BitVector Values; 226 public: 227 void add(unsigned v) { 228 if (v >= Values.size()) 229 Values.resize(((v/8)+1)*8); // Round up to the next byte. 230 Values[v] = true; 231 } 232 233 void print(raw_ostream &OS) { 234 printBitVectorAsHex(OS, Values, 8); 235 } 236 }; 237 238 // 239 // runMCDesc - Print out MC register descriptions. 240 // 241 void 242 RegisterInfoEmitter::runMCDesc(raw_ostream &OS, CodeGenTarget &Target, 243 CodeGenRegBank &RegBank) { 244 EmitSourceFileHeader("MC Register Information", OS); 245 246 OS << "\n#ifdef GET_REGINFO_MC_DESC\n"; 247 OS << "#undef GET_REGINFO_MC_DESC\n"; 248 249 std::map<const CodeGenRegister*, CodeGenRegister::Set> Overlaps; 250 RegBank.computeOverlaps(Overlaps); 251 252 OS << "namespace llvm {\n\n"; 253 254 const std::string &TargetName = Target.getName(); 255 std::string ClassName = TargetName + "GenMCRegisterInfo"; 256 OS << "struct " << ClassName << " : public MCRegisterInfo {\n" 257 << " explicit " << ClassName << "(const MCRegisterDesc *D);\n"; 258 OS << "};\n"; 259 260 OS << "\nnamespace {\n"; 261 262 const std::vector<CodeGenRegister*> &Regs = RegBank.getRegisters(); 263 264 // Emit an overlap list for all registers. 265 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 266 const CodeGenRegister *Reg = Regs[i]; 267 const CodeGenRegister::Set &O = Overlaps[Reg]; 268 // Move Reg to the front so TRI::getAliasSet can share the list. 269 OS << " const unsigned " << Reg->getName() << "_Overlaps[] = { " 270 << getQualifiedName(Reg->TheDef) << ", "; 271 for (CodeGenRegister::Set::const_iterator I = O.begin(), E = O.end(); 272 I != E; ++I) 273 if (*I != Reg) 274 OS << getQualifiedName((*I)->TheDef) << ", "; 275 OS << "0 };\n"; 276 } 277 278 // Emit the empty sub-registers list 279 OS << " const unsigned Empty_SubRegsSet[] = { 0 };\n"; 280 // Loop over all of the registers which have sub-registers, emitting the 281 // sub-registers list to memory. 282 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 283 const CodeGenRegister &Reg = *Regs[i]; 284 if (Reg.getSubRegs().empty()) 285 continue; 286 // getSubRegs() orders by SubRegIndex. We want a topological order. 287 SetVector<CodeGenRegister*> SR; 288 Reg.addSubRegsPreOrder(SR); 289 OS << " const unsigned " << Reg.getName() << "_SubRegsSet[] = { "; 290 for (unsigned j = 0, je = SR.size(); j != je; ++j) 291 OS << getQualifiedName(SR[j]->TheDef) << ", "; 292 OS << "0 };\n"; 293 } 294 295 // Emit the empty super-registers list 296 OS << " const unsigned Empty_SuperRegsSet[] = { 0 };\n"; 297 // Loop over all of the registers which have super-registers, emitting the 298 // super-registers list to memory. 299 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 300 const CodeGenRegister &Reg = *Regs[i]; 301 const CodeGenRegister::SuperRegList &SR = Reg.getSuperRegs(); 302 if (SR.empty()) 303 continue; 304 OS << " const unsigned " << Reg.getName() << "_SuperRegsSet[] = { "; 305 for (unsigned j = 0, je = SR.size(); j != je; ++j) 306 OS << getQualifiedName(SR[j]->TheDef) << ", "; 307 OS << "0 };\n"; 308 } 309 OS << "}\n"; // End of anonymous namespace... 310 311 OS << "\nMCRegisterDesc " << TargetName 312 << "RegDesc[] = { // Descriptors\n"; 313 OS << " { \"NOREG\",\t0,\t0,\t0 },\n"; 314 315 // Now that register alias and sub-registers sets have been emitted, emit the 316 // register descriptors now. 317 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 318 const CodeGenRegister &Reg = *Regs[i]; 319 OS << " { \""; 320 OS << Reg.getName() << "\",\t" << Reg.getName() << "_Overlaps,\t"; 321 if (!Reg.getSubRegs().empty()) 322 OS << Reg.getName() << "_SubRegsSet,\t"; 323 else 324 OS << "Empty_SubRegsSet,\t"; 325 if (!Reg.getSuperRegs().empty()) 326 OS << Reg.getName() << "_SuperRegsSet"; 327 else 328 OS << "Empty_SuperRegsSet"; 329 OS << " },\n"; 330 } 331 OS << "};\n\n"; // End of register descriptors... 332 333 ArrayRef<CodeGenRegisterClass*> RegisterClasses = RegBank.getRegClasses(); 334 335 // Loop over all of the register classes... emitting each one. 336 OS << "namespace { // Register classes...\n"; 337 338 // Emit the register enum value arrays for each RegisterClass 339 for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 340 const CodeGenRegisterClass &RC = *RegisterClasses[rc]; 341 ArrayRef<Record*> Order = RC.getOrder(); 342 343 // Give the register class a legal C name if it's anonymous. 344 std::string Name = RC.getName(); 345 346 // Emit the register list now. 347 OS << " // " << Name << " Register Class...\n" 348 << " static const unsigned " << Name 349 << "[] = {\n "; 350 for (unsigned i = 0, e = Order.size(); i != e; ++i) { 351 Record *Reg = Order[i]; 352 OS << getQualifiedName(Reg) << ", "; 353 } 354 OS << "\n };\n\n"; 355 356 OS << " // " << Name << " Bit set.\n" 357 << " static const unsigned char " << Name 358 << "Bits[] = {\n "; 359 BitVectorEmitter BVE; 360 for (unsigned i = 0, e = Order.size(); i != e; ++i) { 361 Record *Reg = Order[i]; 362 BVE.add(Target.getRegBank().getReg(Reg)->EnumValue); 363 } 364 BVE.print(OS); 365 OS << "\n };\n\n"; 366 367 } 368 OS << "}\n\n"; 369 370 OS << "MCRegisterClass " << TargetName << "MCRegisterClasses[] = {\n"; 371 372 for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 373 const CodeGenRegisterClass &RC = *RegisterClasses[rc]; 374 OS << " MCRegisterClass("; 375 if (!RC.Namespace.empty()) 376 OS << RC.Namespace << "::"; 377 OS << RC.getName() + "RegClassID" << ", " 378 << '\"' << RC.getName() << "\", " 379 << RC.SpillSize/8 << ", " 380 << RC.SpillAlignment/8 << ", " 381 << RC.CopyCost << ", " 382 << RC.Allocatable << ", " 383 << RC.getName() << ", " << RC.getName() << " + " 384 << RC.getOrder().size() << ", " 385 << RC.getName() << "Bits, sizeof(" << RC.getName() << "Bits)" 386 << "),\n"; 387 } 388 389 OS << "};\n\n"; 390 391 // MCRegisterInfo initialization routine. 392 OS << "static inline void Init" << TargetName 393 << "MCRegisterInfo(MCRegisterInfo *RI, unsigned RA, " 394 << "unsigned DwarfFlavour = 0, unsigned EHFlavour = 0) {\n"; 395 OS << " RI->InitMCRegisterInfo(" << TargetName << "RegDesc, " 396 << Regs.size()+1 << ", RA, " << TargetName << "MCRegisterClasses, " 397 << RegisterClasses.size() << ");\n\n"; 398 399 EmitRegMapping(OS, Regs, false); 400 401 OS << "}\n\n"; 402 403 404 OS << "} // End llvm namespace \n"; 405 OS << "#endif // GET_REGINFO_MC_DESC\n\n"; 406 } 407 408 void 409 RegisterInfoEmitter::runTargetHeader(raw_ostream &OS, CodeGenTarget &Target, 410 CodeGenRegBank &RegBank) { 411 EmitSourceFileHeader("Register Information Header Fragment", OS); 412 413 OS << "\n#ifdef GET_REGINFO_HEADER\n"; 414 OS << "#undef GET_REGINFO_HEADER\n"; 415 416 const std::string &TargetName = Target.getName(); 417 std::string ClassName = TargetName + "GenRegisterInfo"; 418 419 OS << "#include \"llvm/Target/TargetRegisterInfo.h\"\n"; 420 OS << "#include <string>\n\n"; 421 422 OS << "namespace llvm {\n\n"; 423 424 OS << "struct " << ClassName << " : public TargetRegisterInfo {\n" 425 << " explicit " << ClassName 426 << "(unsigned RA, unsigned D = 0, unsigned E = 0);\n" 427 << " virtual bool needsStackRealignment(const MachineFunction &) const\n" 428 << " { return false; }\n" 429 << " unsigned getSubReg(unsigned RegNo, unsigned Index) const;\n" 430 << " unsigned getSubRegIndex(unsigned RegNo, unsigned SubRegNo) const;\n" 431 << " unsigned composeSubRegIndices(unsigned, unsigned) const;\n" 432 << "};\n\n"; 433 434 const std::vector<Record*> &SubRegIndices = RegBank.getSubRegIndices(); 435 if (!SubRegIndices.empty()) { 436 OS << "\n// Subregister indices\n"; 437 std::string Namespace = SubRegIndices[0]->getValueAsString("Namespace"); 438 if (!Namespace.empty()) 439 OS << "namespace " << Namespace << " {\n"; 440 OS << "enum {\n NoSubRegister,\n"; 441 for (unsigned i = 0, e = RegBank.getNumNamedIndices(); i != e; ++i) 442 OS << " " << SubRegIndices[i]->getName() << ",\t// " << i+1 << "\n"; 443 OS << " NUM_TARGET_NAMED_SUBREGS = " << SubRegIndices.size()+1 << "\n"; 444 OS << "};\n"; 445 if (!Namespace.empty()) 446 OS << "}\n"; 447 } 448 449 ArrayRef<CodeGenRegisterClass*> RegisterClasses = RegBank.getRegClasses(); 450 451 if (!RegisterClasses.empty()) { 452 OS << "namespace " << RegisterClasses[0]->Namespace 453 << " { // Register classes\n"; 454 455 for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) { 456 const CodeGenRegisterClass &RC = *RegisterClasses[i]; 457 const std::string &Name = RC.getName(); 458 459 // Output the register class definition. 460 OS << " struct " << Name << "Class : public TargetRegisterClass {\n" 461 << " " << Name << "Class();\n"; 462 if (!RC.AltOrderSelect.empty()) 463 OS << " ArrayRef<unsigned> " 464 "getRawAllocationOrder(const MachineFunction&) const;\n"; 465 OS << " };\n"; 466 467 // Output the extern for the instance. 468 OS << " extern " << Name << "Class\t" << Name << "RegClass;\n"; 469 // Output the extern for the pointer to the instance (should remove). 470 OS << " static TargetRegisterClass * const "<< Name <<"RegisterClass = &" 471 << Name << "RegClass;\n"; 472 } 473 OS << "} // end of namespace " << TargetName << "\n\n"; 474 } 475 OS << "} // End llvm namespace \n"; 476 OS << "#endif // GET_REGINFO_HEADER\n\n"; 477 } 478 479 // 480 // runTargetDesc - Output the target register and register file descriptions. 481 // 482 void 483 RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target, 484 CodeGenRegBank &RegBank){ 485 EmitSourceFileHeader("Target Register and Register Classes Information", OS); 486 487 OS << "\n#ifdef GET_REGINFO_TARGET_DESC\n"; 488 OS << "#undef GET_REGINFO_TARGET_DESC\n"; 489 490 OS << "namespace llvm {\n\n"; 491 492 // Get access to MCRegisterClass data. 493 OS << "extern MCRegisterClass " << Target.getName() 494 << "MCRegisterClasses[];\n"; 495 496 // Start out by emitting each of the register classes. 497 ArrayRef<CodeGenRegisterClass*> RegisterClasses = RegBank.getRegClasses(); 498 499 // Collect all registers belonging to any allocatable class. 500 std::set<Record*> AllocatableRegs; 501 502 // Collect allocatable registers. 503 for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 504 const CodeGenRegisterClass &RC = *RegisterClasses[rc]; 505 ArrayRef<Record*> Order = RC.getOrder(); 506 507 if (RC.Allocatable) 508 AllocatableRegs.insert(Order.begin(), Order.end()); 509 } 510 511 OS << "namespace { // Register classes...\n"; 512 513 // Emit the ValueType arrays for each RegisterClass 514 for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 515 const CodeGenRegisterClass &RC = *RegisterClasses[rc]; 516 517 // Give the register class a legal C name if it's anonymous. 518 std::string Name = RC.getName() + "VTs"; 519 520 // Emit the register list now. 521 OS << " // " << Name 522 << " Register Class Value Types...\n" 523 << " static const EVT " << Name 524 << "[] = {\n "; 525 for (unsigned i = 0, e = RC.VTs.size(); i != e; ++i) 526 OS << getEnumName(RC.VTs[i]) << ", "; 527 OS << "MVT::Other\n };\n\n"; 528 } 529 OS << "} // end anonymous namespace\n\n"; 530 531 // Now that all of the structs have been emitted, emit the instances. 532 if (!RegisterClasses.empty()) { 533 OS << "namespace " << RegisterClasses[0]->Namespace 534 << " { // Register class instances\n"; 535 for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) 536 OS << " " << RegisterClasses[i]->getName() << "Class\t" 537 << RegisterClasses[i]->getName() << "RegClass;\n"; 538 539 std::map<unsigned, std::set<unsigned> > SuperRegClassMap; 540 541 OS << "\n static const TargetRegisterClass* const " 542 << "NullRegClasses[] = { NULL };\n\n"; 543 544 unsigned NumSubRegIndices = RegBank.getSubRegIndices().size(); 545 546 if (NumSubRegIndices) { 547 // Emit the sub-register classes for each RegisterClass 548 for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 549 const CodeGenRegisterClass &RC = *RegisterClasses[rc]; 550 std::vector<Record*> SRC(NumSubRegIndices); 551 for (DenseMap<Record*,Record*>::const_iterator 552 i = RC.SubRegClasses.begin(), 553 e = RC.SubRegClasses.end(); i != e; ++i) { 554 // Build SRC array. 555 unsigned idx = RegBank.getSubRegIndexNo(i->first); 556 SRC.at(idx-1) = i->second; 557 558 // Find the register class number of i->second for SuperRegClassMap. 559 for (unsigned rc2 = 0, e2 = RegisterClasses.size(); rc2 != e2; ++rc2) { 560 const CodeGenRegisterClass &RC2 = *RegisterClasses[rc2]; 561 if (RC2.TheDef == i->second) { 562 SuperRegClassMap[rc2].insert(rc); 563 break; 564 } 565 } 566 } 567 568 // Give the register class a legal C name if it's anonymous. 569 std::string Name = RC.TheDef->getName(); 570 571 OS << " // " << Name 572 << " Sub-register Classes...\n" 573 << " static const TargetRegisterClass* const " 574 << Name << "SubRegClasses[] = {\n "; 575 576 for (unsigned idx = 0; idx != NumSubRegIndices; ++idx) { 577 if (idx) 578 OS << ", "; 579 if (SRC[idx]) 580 OS << "&" << getQualifiedName(SRC[idx]) << "RegClass"; 581 else 582 OS << "0"; 583 } 584 OS << "\n };\n\n"; 585 } 586 587 // Emit the super-register classes for each RegisterClass 588 for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 589 const CodeGenRegisterClass &RC = *RegisterClasses[rc]; 590 591 // Give the register class a legal C name if it's anonymous. 592 std::string Name = RC.TheDef->getName(); 593 594 OS << " // " << Name 595 << " Super-register Classes...\n" 596 << " static const TargetRegisterClass* const " 597 << Name << "SuperRegClasses[] = {\n "; 598 599 bool Empty = true; 600 std::map<unsigned, std::set<unsigned> >::iterator I = 601 SuperRegClassMap.find(rc); 602 if (I != SuperRegClassMap.end()) { 603 for (std::set<unsigned>::iterator II = I->second.begin(), 604 EE = I->second.end(); II != EE; ++II) { 605 const CodeGenRegisterClass &RC2 = *RegisterClasses[*II]; 606 if (!Empty) 607 OS << ", "; 608 OS << "&" << getQualifiedName(RC2.TheDef) << "RegClass"; 609 Empty = false; 610 } 611 } 612 613 OS << (!Empty ? ", " : "") << "NULL"; 614 OS << "\n };\n\n"; 615 } 616 } 617 618 // Emit the sub-classes array for each RegisterClass 619 for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 620 const CodeGenRegisterClass &RC = *RegisterClasses[rc]; 621 622 // Give the register class a legal C name if it's anonymous. 623 std::string Name = RC.TheDef->getName(); 624 625 OS << " static const unsigned " << Name << "SubclassMask[] = { "; 626 printBitVectorAsHex(OS, RC.getSubClasses(), 32); 627 OS << "};\n\n"; 628 } 629 630 // Emit NULL terminated super-class lists. 631 for (unsigned rc = 0, e = RegisterClasses.size(); rc != e; ++rc) { 632 const CodeGenRegisterClass &RC = *RegisterClasses[rc]; 633 ArrayRef<CodeGenRegisterClass*> Supers = RC.getSuperClasses(); 634 635 // Skip classes without supers. We can reuse NullRegClasses. 636 if (Supers.empty()) 637 continue; 638 639 OS << " static const TargetRegisterClass* const " 640 << RC.getName() << "Superclasses[] = {\n"; 641 for (unsigned i = 0; i != Supers.size(); ++i) 642 OS << " &" << getQualifiedName(Supers[i]->TheDef) << "RegClass,\n"; 643 OS << " NULL\n };\n\n"; 644 } 645 646 // Emit methods. 647 for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) { 648 const CodeGenRegisterClass &RC = *RegisterClasses[i]; 649 OS << RC.getName() << "Class::" << RC.getName() 650 << "Class() : TargetRegisterClass(&" 651 << Target.getName() << "MCRegisterClasses[" 652 << RC.getName() + "RegClassID" << "], " 653 << RC.getName() + "VTs" << ", " 654 << RC.getName() + "SubclassMask" << ", "; 655 if (RC.getSuperClasses().empty()) 656 OS << "NullRegClasses, "; 657 else 658 OS << RC.getName() + "Superclasses, "; 659 OS << (NumSubRegIndices ? RC.getName() + "Sub" : std::string("Null")) 660 << "RegClasses, " 661 << (NumSubRegIndices ? RC.getName() + "Super" : std::string("Null")) 662 << "RegClasses" 663 << ") {}\n"; 664 if (!RC.AltOrderSelect.empty()) { 665 OS << "\nstatic inline unsigned " << RC.getName() 666 << "AltOrderSelect(const MachineFunction &MF) {" 667 << RC.AltOrderSelect << "}\n\nArrayRef<unsigned> " 668 << RC.getName() << "Class::" 669 << "getRawAllocationOrder(const MachineFunction &MF) const {\n"; 670 for (unsigned oi = 1 , oe = RC.getNumOrders(); oi != oe; ++oi) { 671 ArrayRef<Record*> Elems = RC.getOrder(oi); 672 OS << " static const unsigned AltOrder" << oi << "[] = {"; 673 for (unsigned elem = 0; elem != Elems.size(); ++elem) 674 OS << (elem ? ", " : " ") << getQualifiedName(Elems[elem]); 675 OS << " };\n"; 676 } 677 OS << " const MCRegisterClass &MCR = " << Target.getName() 678 << "MCRegisterClasses["; 679 if (!RC.Namespace.empty()) 680 OS << RC.Namespace << "::"; 681 OS << RC.getName() + "RegClassID];" 682 << " static const ArrayRef<unsigned> Order[] = {\n" 683 << " makeArrayRef(MCR.begin(), MCR.getNumRegs()"; 684 for (unsigned oi = 1, oe = RC.getNumOrders(); oi != oe; ++oi) 685 OS << "),\n makeArrayRef(AltOrder" << oi; 686 OS << ")\n };\n const unsigned Select = " << RC.getName() 687 << "AltOrderSelect(MF);\n assert(Select < " << RC.getNumOrders() 688 << ");\n return Order[Select];\n}\n"; 689 } 690 } 691 692 OS << "}\n"; 693 } 694 695 OS << "\nnamespace {\n"; 696 OS << " const TargetRegisterClass* const RegisterClasses[] = {\n"; 697 for (unsigned i = 0, e = RegisterClasses.size(); i != e; ++i) 698 OS << " &" << getQualifiedName(RegisterClasses[i]->TheDef) 699 << "RegClass,\n"; 700 OS << " };\n"; 701 OS << "}\n"; // End of anonymous namespace... 702 703 // Emit extra information about registers. 704 const std::string &TargetName = Target.getName(); 705 OS << "\n static const TargetRegisterInfoDesc " 706 << TargetName << "RegInfoDesc[] = " 707 << "{ // Extra Descriptors\n"; 708 OS << " { 0, 0 },\n"; 709 710 const std::vector<CodeGenRegister*> &Regs = RegBank.getRegisters(); 711 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 712 const CodeGenRegister &Reg = *Regs[i]; 713 OS << " { "; 714 OS << Reg.CostPerUse << ", " 715 << int(AllocatableRegs.count(Reg.TheDef)) << " },\n"; 716 } 717 OS << " };\n"; // End of register descriptors... 718 719 720 // Calculate the mapping of subregister+index pairs to physical registers. 721 // This will also create further anonymous indexes. 722 unsigned NamedIndices = RegBank.getNumNamedIndices(); 723 724 // Emit SubRegIndex names, skipping 0 725 const std::vector<Record*> &SubRegIndices = RegBank.getSubRegIndices(); 726 OS << "\n static const char *const " << TargetName 727 << "SubRegIndexTable[] = { \""; 728 for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) { 729 OS << SubRegIndices[i]->getName(); 730 if (i+1 != e) 731 OS << "\", \""; 732 } 733 OS << "\" };\n\n"; 734 735 // Emit names of the anonymus subreg indexes. 736 if (SubRegIndices.size() > NamedIndices) { 737 OS << " enum {"; 738 for (unsigned i = NamedIndices, e = SubRegIndices.size(); i != e; ++i) { 739 OS << "\n " << SubRegIndices[i]->getName() << " = " << i+1; 740 if (i+1 != e) 741 OS << ','; 742 } 743 OS << "\n };\n\n"; 744 } 745 OS << "\n"; 746 747 std::string ClassName = Target.getName() + "GenRegisterInfo"; 748 749 // Emit the subregister + index mapping function based on the information 750 // calculated above. 751 OS << "unsigned " << ClassName 752 << "::getSubReg(unsigned RegNo, unsigned Index) const {\n" 753 << " switch (RegNo) {\n" 754 << " default:\n return 0;\n"; 755 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 756 const CodeGenRegister::SubRegMap &SRM = Regs[i]->getSubRegs(); 757 if (SRM.empty()) 758 continue; 759 OS << " case " << getQualifiedName(Regs[i]->TheDef) << ":\n"; 760 OS << " switch (Index) {\n"; 761 OS << " default: return 0;\n"; 762 for (CodeGenRegister::SubRegMap::const_iterator ii = SRM.begin(), 763 ie = SRM.end(); ii != ie; ++ii) 764 OS << " case " << getQualifiedName(ii->first) 765 << ": return " << getQualifiedName(ii->second->TheDef) << ";\n"; 766 OS << " };\n" << " break;\n"; 767 } 768 OS << " };\n"; 769 OS << " return 0;\n"; 770 OS << "}\n\n"; 771 772 OS << "unsigned " << ClassName 773 << "::getSubRegIndex(unsigned RegNo, unsigned SubRegNo) const {\n" 774 << " switch (RegNo) {\n" 775 << " default:\n return 0;\n"; 776 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 777 const CodeGenRegister::SubRegMap &SRM = Regs[i]->getSubRegs(); 778 if (SRM.empty()) 779 continue; 780 OS << " case " << getQualifiedName(Regs[i]->TheDef) << ":\n"; 781 for (CodeGenRegister::SubRegMap::const_iterator ii = SRM.begin(), 782 ie = SRM.end(); ii != ie; ++ii) 783 OS << " if (SubRegNo == " << getQualifiedName(ii->second->TheDef) 784 << ") return " << getQualifiedName(ii->first) << ";\n"; 785 OS << " return 0;\n"; 786 } 787 OS << " };\n"; 788 OS << " return 0;\n"; 789 OS << "}\n\n"; 790 791 // Emit composeSubRegIndices 792 OS << "unsigned " << ClassName 793 << "::composeSubRegIndices(unsigned IdxA, unsigned IdxB) const {\n" 794 << " switch (IdxA) {\n" 795 << " default:\n return IdxB;\n"; 796 for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i) { 797 bool Open = false; 798 for (unsigned j = 0; j != e; ++j) { 799 if (Record *Comp = RegBank.getCompositeSubRegIndex(SubRegIndices[i], 800 SubRegIndices[j])) { 801 if (!Open) { 802 OS << " case " << getQualifiedName(SubRegIndices[i]) 803 << ": switch(IdxB) {\n default: return IdxB;\n"; 804 Open = true; 805 } 806 OS << " case " << getQualifiedName(SubRegIndices[j]) 807 << ": return " << getQualifiedName(Comp) << ";\n"; 808 } 809 } 810 if (Open) 811 OS << " }\n"; 812 } 813 OS << " }\n}\n\n"; 814 815 // Emit the constructor of the class... 816 OS << "extern MCRegisterDesc " << TargetName << "RegDesc[];\n"; 817 818 OS << ClassName << "::" << ClassName 819 << "(unsigned RA, unsigned DwarfFlavour, unsigned EHFlavour)\n" 820 << " : TargetRegisterInfo(" << TargetName << "RegInfoDesc" 821 << ", RegisterClasses, RegisterClasses+" << RegisterClasses.size() <<",\n" 822 << " " << TargetName << "SubRegIndexTable) {\n" 823 << " InitMCRegisterInfo(" << TargetName << "RegDesc, " 824 << Regs.size()+1 << ", RA, " << TargetName << "MCRegisterClasses, " 825 << RegisterClasses.size() << ");\n\n"; 826 827 EmitRegMapping(OS, Regs, true); 828 829 OS << "}\n\n"; 830 831 OS << "} // End llvm namespace \n"; 832 OS << "#endif // GET_REGINFO_TARGET_DESC\n\n"; 833 } 834 835 void RegisterInfoEmitter::run(raw_ostream &OS) { 836 CodeGenTarget Target(Records); 837 CodeGenRegBank &RegBank = Target.getRegBank(); 838 RegBank.computeDerivedInfo(); 839 840 runEnums(OS, Target, RegBank); 841 runMCDesc(OS, Target, RegBank); 842 runTargetHeader(OS, Target, RegBank); 843 runTargetDesc(OS, Target, RegBank); 844 } 845