Make synthesized sub-register indexes available in the target namespace.
TableGen sometimes synthesizes missing sub-register indexes. Emit these indexes as enumerators in the target namespace along with the user-defined ones. Also take this opportunity to stop creating new Record objects for synthetic indexes. llvm-svn: 161964
This commit is contained in:
parent
1fb908f745
commit
70a0bbcad2
|
|
@ -28,19 +28,15 @@ using namespace llvm;
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
CodeGenSubRegIndex::CodeGenSubRegIndex(Record *R, unsigned Enum)
|
CodeGenSubRegIndex::CodeGenSubRegIndex(Record *R, unsigned Enum)
|
||||||
: TheDef(R),
|
: TheDef(R), EnumValue(Enum) {
|
||||||
EnumValue(Enum)
|
Name = R->getName();
|
||||||
{}
|
if (R->getValue("Namespace"))
|
||||||
|
Namespace = R->getValueAsString("Namespace");
|
||||||
std::string CodeGenSubRegIndex::getNamespace() const {
|
|
||||||
if (TheDef->getValue("Namespace"))
|
|
||||||
return TheDef->getValueAsString("Namespace");
|
|
||||||
else
|
|
||||||
return "";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::string &CodeGenSubRegIndex::getName() const {
|
CodeGenSubRegIndex::CodeGenSubRegIndex(StringRef N, StringRef Nspace,
|
||||||
return TheDef->getName();
|
unsigned Enum)
|
||||||
|
: TheDef(0), Name(N), Namespace(Nspace), EnumValue(Enum) {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string CodeGenSubRegIndex::getQualifiedName() const {
|
std::string CodeGenSubRegIndex::getQualifiedName() const {
|
||||||
|
|
@ -52,6 +48,8 @@ std::string CodeGenSubRegIndex::getQualifiedName() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeGenSubRegIndex::updateComponents(CodeGenRegBank &RegBank) {
|
void CodeGenSubRegIndex::updateComponents(CodeGenRegBank &RegBank) {
|
||||||
|
if (!TheDef)
|
||||||
|
return;
|
||||||
std::vector<Record*> Comps = TheDef->getValueAsListOfDefs("ComposedOf");
|
std::vector<Record*> Comps = TheDef->getValueAsListOfDefs("ComposedOf");
|
||||||
if (Comps.empty())
|
if (Comps.empty())
|
||||||
return;
|
return;
|
||||||
|
|
@ -937,7 +935,7 @@ void CodeGenRegisterClass::buildRegUnitSet(
|
||||||
// CodeGenRegBank
|
// CodeGenRegBank
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records) : Records(Records) {
|
CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records) {
|
||||||
// Configure register Sets to understand register classes and tuples.
|
// Configure register Sets to understand register classes and tuples.
|
||||||
Sets.addFieldExpander("RegisterClass", "MemberList");
|
Sets.addFieldExpander("RegisterClass", "MemberList");
|
||||||
Sets.addFieldExpander("CalleeSavedRegs", "SaveList");
|
Sets.addFieldExpander("CalleeSavedRegs", "SaveList");
|
||||||
|
|
@ -947,7 +945,6 @@ CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records) : Records(Records) {
|
||||||
// More indices will be synthesized later.
|
// More indices will be synthesized later.
|
||||||
std::vector<Record*> SRIs = Records.getAllDerivedDefinitions("SubRegIndex");
|
std::vector<Record*> SRIs = Records.getAllDerivedDefinitions("SubRegIndex");
|
||||||
std::sort(SRIs.begin(), SRIs.end(), LessRecord());
|
std::sort(SRIs.begin(), SRIs.end(), LessRecord());
|
||||||
NumNamedIndices = SRIs.size();
|
|
||||||
for (unsigned i = 0, e = SRIs.size(); i != e; ++i)
|
for (unsigned i = 0, e = SRIs.size(); i != e; ++i)
|
||||||
getSubRegIdx(SRIs[i]);
|
getSubRegIdx(SRIs[i]);
|
||||||
// Build composite maps from ComposedOf fields.
|
// Build composite maps from ComposedOf fields.
|
||||||
|
|
@ -1015,6 +1012,15 @@ CodeGenRegBank::CodeGenRegBank(RecordKeeper &Records) : Records(Records) {
|
||||||
CodeGenRegisterClass::computeSubClasses(*this);
|
CodeGenRegisterClass::computeSubClasses(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create a synthetic CodeGenSubRegIndex without a corresponding Record.
|
||||||
|
CodeGenSubRegIndex*
|
||||||
|
CodeGenRegBank::createSubRegIndex(StringRef Name, StringRef Namespace) {
|
||||||
|
CodeGenSubRegIndex *Idx = new CodeGenSubRegIndex(Name, Namespace,
|
||||||
|
SubRegIndices.size() + 1);
|
||||||
|
SubRegIndices.push_back(Idx);
|
||||||
|
return Idx;
|
||||||
|
}
|
||||||
|
|
||||||
CodeGenSubRegIndex *CodeGenRegBank::getSubRegIdx(Record *Def) {
|
CodeGenSubRegIndex *CodeGenRegBank::getSubRegIdx(Record *Def) {
|
||||||
CodeGenSubRegIndex *&Idx = Def2SubRegIdx[Def];
|
CodeGenSubRegIndex *&Idx = Def2SubRegIdx[Def];
|
||||||
if (Idx)
|
if (Idx)
|
||||||
|
|
@ -1079,7 +1085,7 @@ CodeGenRegBank::getCompositeSubRegIndex(CodeGenSubRegIndex *A,
|
||||||
|
|
||||||
// None exists, synthesize one.
|
// None exists, synthesize one.
|
||||||
std::string Name = A->getName() + "_then_" + B->getName();
|
std::string Name = A->getName() + "_then_" + B->getName();
|
||||||
Comp = getSubRegIdx(new Record(Name, SMLoc(), Records));
|
Comp = createSubRegIndex(Name, A->getNamespace());
|
||||||
A->addComposite(B, Comp);
|
A->addComposite(B, Comp);
|
||||||
return Comp;
|
return Comp;
|
||||||
}
|
}
|
||||||
|
|
@ -1099,7 +1105,7 @@ getConcatSubRegIndex(const SmallVector<CodeGenSubRegIndex*, 8> &Parts) {
|
||||||
Name += '_';
|
Name += '_';
|
||||||
Name += Parts[i]->getName();
|
Name += Parts[i]->getName();
|
||||||
}
|
}
|
||||||
return Idx = getSubRegIdx(new Record(Name, SMLoc(), Records));
|
return Idx = createSubRegIndex(Name, Parts.front()->getNamespace());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CodeGenRegBank::computeComposites() {
|
void CodeGenRegBank::computeComposites() {
|
||||||
|
|
|
||||||
|
|
@ -35,14 +35,17 @@ namespace llvm {
|
||||||
/// CodeGenSubRegIndex - Represents a sub-register index.
|
/// CodeGenSubRegIndex - Represents a sub-register index.
|
||||||
class CodeGenSubRegIndex {
|
class CodeGenSubRegIndex {
|
||||||
Record *const TheDef;
|
Record *const TheDef;
|
||||||
|
std::string Name;
|
||||||
|
std::string Namespace;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
const unsigned EnumValue;
|
const unsigned EnumValue;
|
||||||
|
|
||||||
CodeGenSubRegIndex(Record *R, unsigned Enum);
|
CodeGenSubRegIndex(Record *R, unsigned Enum);
|
||||||
|
CodeGenSubRegIndex(StringRef N, StringRef Nspace, unsigned Enum);
|
||||||
|
|
||||||
const std::string &getName() const;
|
const std::string &getName() const { return Name; }
|
||||||
std::string getNamespace() const;
|
const std::string &getNamespace() const { return Namespace; }
|
||||||
std::string getQualifiedName() const;
|
std::string getQualifiedName() const;
|
||||||
|
|
||||||
// Order CodeGenSubRegIndex pointers by EnumValue.
|
// Order CodeGenSubRegIndex pointers by EnumValue.
|
||||||
|
|
@ -422,13 +425,13 @@ namespace llvm {
|
||||||
// CodeGenRegBank - Represent a target's registers and the relations between
|
// CodeGenRegBank - Represent a target's registers and the relations between
|
||||||
// them.
|
// them.
|
||||||
class CodeGenRegBank {
|
class CodeGenRegBank {
|
||||||
RecordKeeper &Records;
|
|
||||||
SetTheory Sets;
|
SetTheory Sets;
|
||||||
|
|
||||||
// SubRegIndices.
|
// SubRegIndices.
|
||||||
std::vector<CodeGenSubRegIndex*> SubRegIndices;
|
std::vector<CodeGenSubRegIndex*> SubRegIndices;
|
||||||
DenseMap<Record*, CodeGenSubRegIndex*> Def2SubRegIdx;
|
DenseMap<Record*, CodeGenSubRegIndex*> Def2SubRegIdx;
|
||||||
unsigned NumNamedIndices;
|
|
||||||
|
CodeGenSubRegIndex *createSubRegIndex(StringRef Name, StringRef NameSpace);
|
||||||
|
|
||||||
typedef std::map<SmallVector<CodeGenSubRegIndex*, 8>,
|
typedef std::map<SmallVector<CodeGenSubRegIndex*, 8>,
|
||||||
CodeGenSubRegIndex*> ConcatIdxMap;
|
CodeGenSubRegIndex*> ConcatIdxMap;
|
||||||
|
|
@ -495,7 +498,6 @@ namespace llvm {
|
||||||
// in the .td files. The rest are synthesized such that all sub-registers
|
// in the .td files. The rest are synthesized such that all sub-registers
|
||||||
// have a unique name.
|
// have a unique name.
|
||||||
ArrayRef<CodeGenSubRegIndex*> getSubRegIndices() { return SubRegIndices; }
|
ArrayRef<CodeGenSubRegIndex*> getSubRegIndices() { return SubRegIndices; }
|
||||||
unsigned getNumNamedIndices() { return NumNamedIndices; }
|
|
||||||
|
|
||||||
// Find a SubRegIndex form its Record def.
|
// Find a SubRegIndex form its Record def.
|
||||||
CodeGenSubRegIndex *getSubRegIdx(Record*);
|
CodeGenSubRegIndex *getSubRegIdx(Record*);
|
||||||
|
|
|
||||||
|
|
@ -145,9 +145,9 @@ void RegisterInfoEmitter::runEnums(raw_ostream &OS,
|
||||||
if (!Namespace.empty())
|
if (!Namespace.empty())
|
||||||
OS << "namespace " << Namespace << " {\n";
|
OS << "namespace " << Namespace << " {\n";
|
||||||
OS << "enum {\n NoSubRegister,\n";
|
OS << "enum {\n NoSubRegister,\n";
|
||||||
for (unsigned i = 0, e = Bank.getNumNamedIndices(); i != e; ++i)
|
for (unsigned i = 0, e = SubRegIndices.size(); i != e; ++i)
|
||||||
OS << " " << SubRegIndices[i]->getName() << ",\t// " << i+1 << "\n";
|
OS << " " << SubRegIndices[i]->getName() << ",\t// " << i+1 << "\n";
|
||||||
OS << " NUM_TARGET_NAMED_SUBREGS\n};\n";
|
OS << " NUM_TARGET_SUBREGS\n};\n";
|
||||||
if (!Namespace.empty())
|
if (!Namespace.empty())
|
||||||
OS << "}\n";
|
OS << "}\n";
|
||||||
}
|
}
|
||||||
|
|
@ -885,17 +885,6 @@ RegisterInfoEmitter::runTargetDesc(raw_ostream &OS, CodeGenTarget &Target,
|
||||||
}
|
}
|
||||||
OS << "\" };\n\n";
|
OS << "\" };\n\n";
|
||||||
|
|
||||||
// Emit names of the anonymous subreg indices.
|
|
||||||
unsigned NamedIndices = RegBank.getNumNamedIndices();
|
|
||||||
if (SubRegIndices.size() > NamedIndices) {
|
|
||||||
OS << " enum {";
|
|
||||||
for (unsigned i = NamedIndices, e = SubRegIndices.size(); i != e; ++i) {
|
|
||||||
OS << "\n " << SubRegIndices[i]->getName() << " = " << i+1;
|
|
||||||
if (i+1 != e)
|
|
||||||
OS << ',';
|
|
||||||
}
|
|
||||||
OS << "\n };\n\n";
|
|
||||||
}
|
|
||||||
OS << "\n";
|
OS << "\n";
|
||||||
|
|
||||||
// Now that all of the structs have been emitted, emit the instances.
|
// Now that all of the structs have been emitted, emit the instances.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue