From 24151a6888c752ff1d7fc80b500f5a836c9ac528 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Fri, 1 Aug 2003 05:58:58 +0000 Subject: [PATCH] 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 --- support/tools/TableGen/Record.cpp | 24 ++++++++++++++++-------- support/tools/TableGen/Record.h | 2 ++ utils/TableGen/Record.cpp | 24 ++++++++++++++++-------- utils/TableGen/Record.h | 2 ++ 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/support/tools/TableGen/Record.cpp b/support/tools/TableGen/Record.cpp index acb61ec1852..fc035aceb38 100644 --- a/support/tools/TableGen/Record.cpp +++ b/support/tools/TableGen/Record.cpp @@ -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 &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(BitsVal)) { + assert(Bit < BI->getNumBits() && "Bit reference out of range!"); + Init *B = BI->getBit(Bit); + + if (dynamic_cast(B)) // If the bit is set... + return B; // Replace the VarBitInit with it. + } + return this; +} - if (BitsInit *BI = dynamic_cast(BitsVal)) { - assert(Bit < BI->getNumBits() && "Bit reference out of range!"); - Init *B = BI->getBit(Bit); - - if (dynamic_cast(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; } diff --git a/support/tools/TableGen/Record.h b/support/tools/TableGen/Record.h index 130bf5aa366..5dbd9b9c562 100644 --- a/support/tools/TableGen/Record.h +++ b/support/tools/TableGen/Record.h @@ -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; } diff --git a/utils/TableGen/Record.cpp b/utils/TableGen/Record.cpp index acb61ec1852..fc035aceb38 100644 --- a/utils/TableGen/Record.cpp +++ b/utils/TableGen/Record.cpp @@ -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 &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(BitsVal)) { + assert(Bit < BI->getNumBits() && "Bit reference out of range!"); + Init *B = BI->getBit(Bit); + + if (dynamic_cast(B)) // If the bit is set... + return B; // Replace the VarBitInit with it. + } + return this; +} - if (BitsInit *BI = dynamic_cast(BitsVal)) { - assert(Bit < BI->getNumBits() && "Bit reference out of range!"); - Init *B = BI->getBit(Bit); - - if (dynamic_cast(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; } diff --git a/utils/TableGen/Record.h b/utils/TableGen/Record.h index 130bf5aa366..5dbd9b9c562 100644 --- a/utils/TableGen/Record.h +++ b/utils/TableGen/Record.h @@ -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; }