Fix the way field bit references are resolved, also allow resolution of field references overall!

llvm-svn: 7470
This commit is contained in:
Chris Lattner 2003-08-01 05:58:58 +00:00
parent 75c817a482
commit cf268a5060
2 changed files with 18 additions and 8 deletions

View File

@ -316,7 +316,7 @@ Init *VarInit::getFieldInit(Record &R, const std::string &FieldName) const {
if (Init *I = RV->getValue()->getFieldInit(R, FieldName)) if (Init *I = RV->getValue()->getFieldInit(R, FieldName))
return I; return I;
else else
return (Init*)this; return 0;
return 0; return 0;
} }
@ -373,14 +373,22 @@ Init *FieldInit::convertInitializerBitRange(const std::vector<unsigned> &Bits) {
Init *FieldInit::resolveBitReference(Record &R, unsigned Bit) { Init *FieldInit::resolveBitReference(Record &R, unsigned Bit) {
Init *BitsVal = Rec->getFieldInit(R, FieldName); Init *BitsVal = Rec->getFieldInit(R, FieldName);
assert(BitsVal && "No initializer found!"); if (BitsVal)
if (BitsInit *BI = dynamic_cast<BitsInit*>(BitsVal)) {
assert(Bit < BI->getNumBits() && "Bit reference out of range!");
Init *B = BI->getBit(Bit);
if (dynamic_cast<BitInit*>(B)) // If the bit is set...
return B; // Replace the VarBitInit with it.
}
return this;
}
if (BitsInit *BI = dynamic_cast<BitsInit*>(BitsVal)) { Init *FieldInit::resolveReferences(Record &R) {
assert(Bit < BI->getNumBits() && "Bit reference out of range!"); Init *BitsVal = Rec->getFieldInit(R, FieldName);
Init *B = BI->getBit(Bit); if (BitsVal) {
Init *BVR = BitsVal->resolveReferences(R);
if (dynamic_cast<BitInit*>(B)) // If the bit is set... return BVR->isComplete() ? BVR : this;
return B; // Replace the VarBitInit with it.
} }
return this; return this;
} }

View File

@ -480,6 +480,8 @@ public:
virtual Init *resolveBitReference(Record &R, unsigned Bit); virtual Init *resolveBitReference(Record &R, unsigned Bit);
virtual Init *resolveReferences(Record &R);
virtual void print(std::ostream &OS) const { virtual void print(std::ostream &OS) const {
Rec->print(OS); OS << "." << FieldName; Rec->print(OS); OS << "." << FieldName;
} }