mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Fix the way field bit references are resolved, also allow resolution of field references overall!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7470 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
de04dd746f
commit
24151a6888
@ -316,7 +316,7 @@ Init *VarInit::getFieldInit(Record &R, const std::string &FieldName) const {
|
||||
if (Init *I = RV->getValue()->getFieldInit(R, FieldName))
|
||||
return I;
|
||||
else
|
||||
return (Init*)this;
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -373,14 +373,22 @@ Init *FieldInit::convertInitializerBitRange(const std::vector<unsigned> &Bits) {
|
||||
|
||||
Init *FieldInit::resolveBitReference(Record &R, unsigned Bit) {
|
||||
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)) {
|
||||
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.
|
||||
Init *FieldInit::resolveReferences(Record &R) {
|
||||
Init *BitsVal = Rec->getFieldInit(R, FieldName);
|
||||
if (BitsVal) {
|
||||
Init *BVR = BitsVal->resolveReferences(R);
|
||||
return BVR->isComplete() ? BVR : this;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
@ -480,6 +480,8 @@ public:
|
||||
|
||||
virtual Init *resolveBitReference(Record &R, unsigned Bit);
|
||||
|
||||
virtual Init *resolveReferences(Record &R);
|
||||
|
||||
virtual void print(std::ostream &OS) const {
|
||||
Rec->print(OS); OS << "." << FieldName;
|
||||
}
|
||||
|
@ -316,7 +316,7 @@ Init *VarInit::getFieldInit(Record &R, const std::string &FieldName) const {
|
||||
if (Init *I = RV->getValue()->getFieldInit(R, FieldName))
|
||||
return I;
|
||||
else
|
||||
return (Init*)this;
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -373,14 +373,22 @@ Init *FieldInit::convertInitializerBitRange(const std::vector<unsigned> &Bits) {
|
||||
|
||||
Init *FieldInit::resolveBitReference(Record &R, unsigned Bit) {
|
||||
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)) {
|
||||
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.
|
||||
Init *FieldInit::resolveReferences(Record &R) {
|
||||
Init *BitsVal = Rec->getFieldInit(R, FieldName);
|
||||
if (BitsVal) {
|
||||
Init *BVR = BitsVal->resolveReferences(R);
|
||||
return BVR->isComplete() ? BVR : this;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
@ -480,6 +480,8 @@ public:
|
||||
|
||||
virtual Init *resolveBitReference(Record &R, unsigned Bit);
|
||||
|
||||
virtual Init *resolveReferences(Record &R);
|
||||
|
||||
virtual void print(std::ostream &OS) const {
|
||||
Rec->print(OS); OS << "." << FieldName;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user