RegisterInfoEmitter.cpp (193323) | RegisterInfoEmitter.cpp (195340) |
---|---|
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//===----------------------------------------------------------------------===// --- 5 unchanged lines hidden (view full) --- 14//===----------------------------------------------------------------------===// 15 16#include "RegisterInfoEmitter.h" 17#include "CodeGenTarget.h" 18#include "CodeGenRegisters.h" 19#include "Record.h" 20#include "llvm/ADT/StringExtras.h" 21#include "llvm/ADT/STLExtras.h" | 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//===----------------------------------------------------------------------===// --- 5 unchanged lines hidden (view full) --- 14//===----------------------------------------------------------------------===// 15 16#include "RegisterInfoEmitter.h" 17#include "CodeGenTarget.h" 18#include "CodeGenRegisters.h" 19#include "Record.h" 20#include "llvm/ADT/StringExtras.h" 21#include "llvm/ADT/STLExtras.h" |
22#include "llvm/Support/Streams.h" 23#include <set> | |
24#include <algorithm> | 22#include <algorithm> |
23#include <set> |
|
25using namespace llvm; 26 27// runEnums - Print out enum values for all of the registers. | 24using namespace llvm; 25 26// runEnums - Print out enum values for all of the registers. |
28void RegisterInfoEmitter::runEnums(std::ostream &OS) { | 27void RegisterInfoEmitter::runEnums(raw_ostream &OS) { |
29 CodeGenTarget Target; 30 const std::vector<CodeGenRegister> &Registers = Target.getRegisters(); 31 32 std::string Namespace = Registers[0].TheDef->getValueAsString("Namespace"); 33 34 EmitSourceFileHeader("Target Register Enum Values", OS); 35 OS << "namespace llvm {\n\n"; 36 --- 5 unchanged lines hidden (view full) --- 42 OS << " " << Registers[i].getName() << ", \t// " << i+1 << "\n"; 43 OS << " NUM_TARGET_REGS \t// " << Registers.size()+1 << "\n"; 44 OS << " };\n"; 45 if (!Namespace.empty()) 46 OS << "}\n"; 47 OS << "} // End llvm namespace \n"; 48} 49 | 28 CodeGenTarget Target; 29 const std::vector<CodeGenRegister> &Registers = Target.getRegisters(); 30 31 std::string Namespace = Registers[0].TheDef->getValueAsString("Namespace"); 32 33 EmitSourceFileHeader("Target Register Enum Values", OS); 34 OS << "namespace llvm {\n\n"; 35 --- 5 unchanged lines hidden (view full) --- 41 OS << " " << Registers[i].getName() << ", \t// " << i+1 << "\n"; 42 OS << " NUM_TARGET_REGS \t// " << Registers.size()+1 << "\n"; 43 OS << " };\n"; 44 if (!Namespace.empty()) 45 OS << "}\n"; 46 OS << "} // End llvm namespace \n"; 47} 48 |
50void RegisterInfoEmitter::runHeader(std::ostream &OS) { | 49void RegisterInfoEmitter::runHeader(raw_ostream &OS) { |
51 EmitSourceFileHeader("Register Information Header Fragment", OS); 52 CodeGenTarget Target; 53 const std::string &TargetName = Target.getName(); 54 std::string ClassName = TargetName + "GenRegisterInfo"; 55 56 OS << "#include \"llvm/Target/TargetRegisterInfo.h\"\n"; 57 OS << "#include <string>\n\n"; 58 --- 54 unchanged lines hidden (view full) --- 113 return true; 114} 115 116static void addSuperReg(Record *R, Record *S, 117 std::map<Record*, std::set<Record*>, LessRecord> &SubRegs, 118 std::map<Record*, std::set<Record*>, LessRecord> &SuperRegs, 119 std::map<Record*, std::set<Record*>, LessRecord> &Aliases) { 120 if (R == S) { | 50 EmitSourceFileHeader("Register Information Header Fragment", OS); 51 CodeGenTarget Target; 52 const std::string &TargetName = Target.getName(); 53 std::string ClassName = TargetName + "GenRegisterInfo"; 54 55 OS << "#include \"llvm/Target/TargetRegisterInfo.h\"\n"; 56 OS << "#include <string>\n\n"; 57 --- 54 unchanged lines hidden (view full) --- 112 return true; 113} 114 115static void addSuperReg(Record *R, Record *S, 116 std::map<Record*, std::set<Record*>, LessRecord> &SubRegs, 117 std::map<Record*, std::set<Record*>, LessRecord> &SuperRegs, 118 std::map<Record*, std::set<Record*>, LessRecord> &Aliases) { 119 if (R == S) { |
121 cerr << "Error: recursive sub-register relationship between" 122 << " register " << getQualifiedName(R) 123 << " and its sub-registers?\n"; | 120 errs() << "Error: recursive sub-register relationship between" 121 << " register " << getQualifiedName(R) 122 << " and its sub-registers?\n"; |
124 abort(); 125 } 126 if (!SuperRegs[R].insert(S).second) 127 return; 128 SubRegs[S].insert(R); 129 Aliases[R].insert(S); 130 Aliases[S].insert(R); 131 if (SuperRegs.count(S)) 132 for (std::set<Record*>::iterator I = SuperRegs[S].begin(), 133 E = SuperRegs[S].end(); I != E; ++I) 134 addSuperReg(R, *I, SubRegs, SuperRegs, Aliases); 135} 136 137static void addSubSuperReg(Record *R, Record *S, 138 std::map<Record*, std::set<Record*>, LessRecord> &SubRegs, 139 std::map<Record*, std::set<Record*>, LessRecord> &SuperRegs, 140 std::map<Record*, std::set<Record*>, LessRecord> &Aliases) { 141 if (R == S) { | 123 abort(); 124 } 125 if (!SuperRegs[R].insert(S).second) 126 return; 127 SubRegs[S].insert(R); 128 Aliases[R].insert(S); 129 Aliases[S].insert(R); 130 if (SuperRegs.count(S)) 131 for (std::set<Record*>::iterator I = SuperRegs[S].begin(), 132 E = SuperRegs[S].end(); I != E; ++I) 133 addSuperReg(R, *I, SubRegs, SuperRegs, Aliases); 134} 135 136static void addSubSuperReg(Record *R, Record *S, 137 std::map<Record*, std::set<Record*>, LessRecord> &SubRegs, 138 std::map<Record*, std::set<Record*>, LessRecord> &SuperRegs, 139 std::map<Record*, std::set<Record*>, LessRecord> &Aliases) { 140 if (R == S) { |
142 cerr << "Error: recursive sub-register relationship between" 143 << " register " << getQualifiedName(R) 144 << " and its sub-registers?\n"; | 141 errs() << "Error: recursive sub-register relationship between" 142 << " register " << getQualifiedName(R) 143 << " and its sub-registers?\n"; |
145 abort(); 146 } 147 148 if (!SubRegs[R].insert(S).second) 149 return; 150 addSuperReg(S, R, SubRegs, SuperRegs, Aliases); 151 Aliases[R].insert(S); 152 Aliases[S].insert(R); --- 14 unchanged lines hidden (view full) --- 167 bool operator()(Record *RegA, Record *RegB) { 168 // B is sub-register of A. 169 return RegisterSubRegs.count(RegA) && RegisterSubRegs[RegA].count(RegB); 170 } 171}; 172 173// RegisterInfoEmitter::run - Main register file description emitter. 174// | 144 abort(); 145 } 146 147 if (!SubRegs[R].insert(S).second) 148 return; 149 addSuperReg(S, R, SubRegs, SuperRegs, Aliases); 150 Aliases[R].insert(S); 151 Aliases[S].insert(R); --- 14 unchanged lines hidden (view full) --- 166 bool operator()(Record *RegA, Record *RegB) { 167 // B is sub-register of A. 168 return RegisterSubRegs.count(RegA) && RegisterSubRegs[RegA].count(RegB); 169 } 170}; 171 172// RegisterInfoEmitter::run - Main register file description emitter. 173// |
175void RegisterInfoEmitter::run(std::ostream &OS) { | 174void RegisterInfoEmitter::run(raw_ostream &OS) { |
176 CodeGenTarget Target; 177 EmitSourceFileHeader("Register Information Source Fragment", OS); 178 179 OS << "namespace llvm {\n\n"; 180 181 // Start out by emitting each of the register classes... to do this, we build 182 // a set of registers which belong to a register class, this is to ensure that 183 // each register is only in a single register class. --- 261 unchanged lines hidden (view full) --- 445 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 446 Record *R = Regs[i].TheDef; 447 std::vector<Record*> LI = Regs[i].TheDef->getValueAsListOfDefs("Aliases"); 448 // Add information that R aliases all of the elements in the list... and 449 // that everything in the list aliases R. 450 for (unsigned j = 0, e = LI.size(); j != e; ++j) { 451 Record *Reg = LI[j]; 452 if (RegisterAliases[R].count(Reg)) | 175 CodeGenTarget Target; 176 EmitSourceFileHeader("Register Information Source Fragment", OS); 177 178 OS << "namespace llvm {\n\n"; 179 180 // Start out by emitting each of the register classes... to do this, we build 181 // a set of registers which belong to a register class, this is to ensure that 182 // each register is only in a single register class. --- 261 unchanged lines hidden (view full) --- 444 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 445 Record *R = Regs[i].TheDef; 446 std::vector<Record*> LI = Regs[i].TheDef->getValueAsListOfDefs("Aliases"); 447 // Add information that R aliases all of the elements in the list... and 448 // that everything in the list aliases R. 449 for (unsigned j = 0, e = LI.size(); j != e; ++j) { 450 Record *Reg = LI[j]; 451 if (RegisterAliases[R].count(Reg)) |
453 cerr << "Warning: register alias between " << getQualifiedName(R) 454 << " and " << getQualifiedName(Reg) 455 << " specified multiple times!\n"; | 452 errs() << "Warning: register alias between " << getQualifiedName(R) 453 << " and " << getQualifiedName(Reg) 454 << " specified multiple times!\n"; |
456 RegisterAliases[R].insert(Reg); 457 458 if (RegisterAliases[Reg].count(R)) | 455 RegisterAliases[R].insert(Reg); 456 457 if (RegisterAliases[Reg].count(R)) |
459 cerr << "Warning: register alias between " << getQualifiedName(R) 460 << " and " << getQualifiedName(Reg) 461 << " specified multiple times!\n"; | 458 errs() << "Warning: register alias between " << getQualifiedName(R) 459 << " and " << getQualifiedName(Reg) 460 << " specified multiple times!\n"; |
462 RegisterAliases[Reg].insert(R); 463 } 464 } 465 466 // Process sub-register sets. 467 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 468 Record *R = Regs[i].TheDef; 469 std::vector<Record*> LI = Regs[i].TheDef->getValueAsListOfDefs("SubRegs"); 470 // Process sub-register set and add aliases information. 471 for (unsigned j = 0, e = LI.size(); j != e; ++j) { 472 Record *SubReg = LI[j]; 473 if (RegisterSubRegs[R].count(SubReg)) | 461 RegisterAliases[Reg].insert(R); 462 } 463 } 464 465 // Process sub-register sets. 466 for (unsigned i = 0, e = Regs.size(); i != e; ++i) { 467 Record *R = Regs[i].TheDef; 468 std::vector<Record*> LI = Regs[i].TheDef->getValueAsListOfDefs("SubRegs"); 469 // Process sub-register set and add aliases information. 470 for (unsigned j = 0, e = LI.size(); j != e; ++j) { 471 Record *SubReg = LI[j]; 472 if (RegisterSubRegs[R].count(SubReg)) |
474 cerr << "Warning: register " << getQualifiedName(SubReg) 475 << " specified as a sub-register of " << getQualifiedName(R) 476 << " multiple times!\n"; | 473 errs() << "Warning: register " << getQualifiedName(SubReg) 474 << " specified as a sub-register of " << getQualifiedName(R) 475 << " multiple times!\n"; |
477 addSubSuperReg(R, SubReg, RegisterSubRegs, RegisterSuperRegs, 478 RegisterAliases); 479 } 480 } 481 482 // Print the SubregHashTable, a simple quadratically probed 483 // hash table for determining if a register is a subregister 484 // of another register. --- 318 unchanged lines hidden (view full) --- 803 // Calculate the mapping of subregister+index pairs to physical registers. 804 std::vector<Record*> SubRegs = Records.getAllDerivedDefinitions("SubRegSet"); 805 for (unsigned i = 0, e = SubRegs.size(); i != e; ++i) { 806 int subRegIndex = SubRegs[i]->getValueAsInt("index"); 807 std::vector<Record*> From = SubRegs[i]->getValueAsListOfDefs("From"); 808 std::vector<Record*> To = SubRegs[i]->getValueAsListOfDefs("To"); 809 810 if (From.size() != To.size()) { | 476 addSubSuperReg(R, SubReg, RegisterSubRegs, RegisterSuperRegs, 477 RegisterAliases); 478 } 479 } 480 481 // Print the SubregHashTable, a simple quadratically probed 482 // hash table for determining if a register is a subregister 483 // of another register. --- 318 unchanged lines hidden (view full) --- 802 // Calculate the mapping of subregister+index pairs to physical registers. 803 std::vector<Record*> SubRegs = Records.getAllDerivedDefinitions("SubRegSet"); 804 for (unsigned i = 0, e = SubRegs.size(); i != e; ++i) { 805 int subRegIndex = SubRegs[i]->getValueAsInt("index"); 806 std::vector<Record*> From = SubRegs[i]->getValueAsListOfDefs("From"); 807 std::vector<Record*> To = SubRegs[i]->getValueAsListOfDefs("To"); 808 809 if (From.size() != To.size()) { |
811 cerr << "Error: register list and sub-register list not of equal length" 812 << " in SubRegSet\n"; | 810 errs() << "Error: register list and sub-register list not of equal length" 811 << " in SubRegSet\n"; |
813 exit(1); 814 } 815 816 // For each entry in from/to vectors, insert the to register at index 817 for (unsigned ii = 0, ee = From.size(); ii != ee; ++ii) 818 SubRegVectors[From[ii]].push_back(std::make_pair(subRegIndex, To[ii])); 819 } 820 --- 32 unchanged lines hidden (view full) --- 853 854 // First, just pull all provided information to the map 855 unsigned maxLength = 0; 856 for (unsigned i = 0, e = Registers.size(); i != e; ++i) { 857 Record *Reg = Registers[i].TheDef; 858 std::vector<int64_t> RegNums = Reg->getValueAsListOfInts("DwarfNumbers"); 859 maxLength = std::max((size_t)maxLength, RegNums.size()); 860 if (DwarfRegNums.count(Reg)) | 812 exit(1); 813 } 814 815 // For each entry in from/to vectors, insert the to register at index 816 for (unsigned ii = 0, ee = From.size(); ii != ee; ++ii) 817 SubRegVectors[From[ii]].push_back(std::make_pair(subRegIndex, To[ii])); 818 } 819 --- 32 unchanged lines hidden (view full) --- 852 853 // First, just pull all provided information to the map 854 unsigned maxLength = 0; 855 for (unsigned i = 0, e = Registers.size(); i != e; ++i) { 856 Record *Reg = Registers[i].TheDef; 857 std::vector<int64_t> RegNums = Reg->getValueAsListOfInts("DwarfNumbers"); 858 maxLength = std::max((size_t)maxLength, RegNums.size()); 859 if (DwarfRegNums.count(Reg)) |
861 cerr << "Warning: DWARF numbers for register " << getQualifiedName(Reg) 862 << "specified multiple times\n"; | 860 errs() << "Warning: DWARF numbers for register " << getQualifiedName(Reg) 861 << "specified multiple times\n"; |
863 DwarfRegNums[Reg] = RegNums; 864 } 865 866 // Now we know maximal length of number list. Append -1's, where needed 867 for (DwarfRegNumsMapTy::iterator 868 I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) 869 for (unsigned i = I->second.size(), e = maxLength; i != e; ++i) 870 I->second.push_back(-1); --- 37 unchanged lines hidden --- | 862 DwarfRegNums[Reg] = RegNums; 863 } 864 865 // Now we know maximal length of number list. Append -1's, where needed 866 for (DwarfRegNumsMapTy::iterator 867 I = DwarfRegNums.begin(), E = DwarfRegNums.end(); I != E; ++I) 868 for (unsigned i = I->second.size(), e = maxLength; i != e; ++i) 869 I->second.push_back(-1); --- 37 unchanged lines hidden --- |