diff options
author | Nicolai Haehnle <nhaehnle@gmail.com> | 2018-03-19 14:13:37 +0000 |
---|---|---|
committer | Nicolai Haehnle <nhaehnle@gmail.com> | 2018-03-19 14:13:37 +0000 |
commit | 9b3c4f334bb38cd8b343c96f8b662d978c3e2a7c (patch) | |
tree | b9accf82c5568ded0e77302d5429b2ceb19de9d0 /llvm/lib/TableGen | |
parent | 22955ac98da091b8801a2efd678a44d5819c063b (diff) |
TableGen: Remove the cast-from-string-to-variable-reference feature
Summary:
Cast-from-string for records isn't going away, but cast-from-string for
variables is a pretty dodgy feature to have, especially when referencing
template arguments. It's doubtful that this ever worked in a reliable
way, and nobody seems to be using it, so let's get rid of it and get
some related cleanups.
Change-Id: I395ac8a43fef4cf98e611f2f552300d21e99b66a
Reviewers: arsenm, craig.topper, tra, MartinO
Subscribers: wdng, llvm-commits
Differential Revision: https://reviews.llvm.org/D44195
Diffstat (limited to 'llvm/lib/TableGen')
-rw-r--r-- | llvm/lib/TableGen/Record.cpp | 61 | ||||
-rw-r--r-- | llvm/lib/TableGen/TGParser.cpp | 28 |
2 files changed, 27 insertions, 62 deletions
diff --git a/llvm/lib/TableGen/Record.cpp b/llvm/lib/TableGen/Record.cpp index f3f9c6767ba..3bc398ff2d3 100644 --- a/llvm/lib/TableGen/Record.cpp +++ b/llvm/lib/TableGen/Record.cpp @@ -700,7 +700,7 @@ void UnOpInit::Profile(FoldingSetNodeID &ID) const { ProfileUnOpInit(ID, getOpcode(), getOperand(), getType()); } -Init *UnOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const { +Init *UnOpInit::Fold(Record *CurRec) const { switch (getOpcode()) { case CAST: if (isa<StringRecTy>(getType())) { @@ -714,48 +714,13 @@ Init *UnOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const { return StringInit::get(LHSi->getAsString()); } else if (isa<RecordRecTy>(getType())) { if (StringInit *Name = dyn_cast<StringInit>(LHS)) { - // From TGParser::ParseIDValue - if (CurRec) { - if (const RecordVal *RV = CurRec->getValue(Name)) { - if (RV->getType() != getType()) - PrintFatalError("type mismatch in cast"); - return VarInit::get(Name, RV->getType()); - } - - Init *TemplateArgName = QualifyName(*CurRec, CurMultiClass, Name, - ":"); - - if (CurRec->isTemplateArg(TemplateArgName)) { - const RecordVal *RV = CurRec->getValue(TemplateArgName); - assert(RV && "Template arg doesn't exist??"); - - if (RV->getType() != getType()) - PrintFatalError("type mismatch in cast"); - - return VarInit::get(TemplateArgName, RV->getType()); - } - } - - if (CurMultiClass) { - Init *MCName = QualifyName(CurMultiClass->Rec, CurMultiClass, Name, - "::"); - - if (CurMultiClass->Rec.isTemplateArg(MCName)) { - const RecordVal *RV = CurMultiClass->Rec.getValue(MCName); - assert(RV && "Template arg doesn't exist??"); - - if (RV->getType() != getType()) - PrintFatalError("type mismatch in cast"); - - return VarInit::get(MCName, RV->getType()); - } - } assert(CurRec && "NULL pointer"); if (Record *D = (CurRec->getRecords()).getDef(Name->getValue())) return DefInit::get(D); PrintFatalError(CurRec->getLoc(), - "Undefined reference:'" + Name->getValue() + "'\n"); + Twine("Undefined reference to record: '") + + Name->getValue() + "'\n"); } } @@ -799,8 +764,8 @@ Init *UnOpInit::resolveReferences(Resolver &R) const { if (LHS != lhs) return (UnOpInit::get(getOpcode(), lhs, getType())) - ->Fold(R.getCurrentRecord(), nullptr); - return Fold(R.getCurrentRecord(), nullptr); + ->Fold(R.getCurrentRecord()); + return Fold(R.getCurrentRecord()); } std::string UnOpInit::getAsString() const { @@ -851,7 +816,7 @@ static StringInit *ConcatStringInits(const StringInit *I0, return StringInit::get(Concat); } -Init *BinOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const { +Init *BinOpInit::Fold(Record *CurRec) const { switch (getOpcode()) { case CONCAT: { DagInit *LHSs = dyn_cast<DagInit>(LHS); @@ -974,8 +939,8 @@ Init *BinOpInit::resolveReferences(Resolver &R) const { if (LHS != lhs || RHS != rhs) return (BinOpInit::get(getOpcode(), lhs, rhs, getType())) - ->Fold(R.getCurrentRecord(), nullptr); - return Fold(R.getCurrentRecord(), nullptr); + ->Fold(R.getCurrentRecord()); + return Fold(R.getCurrentRecord()); } std::string BinOpInit::getAsString() const { @@ -1084,7 +1049,7 @@ static Init *ForeachHelper(Init *LHS, Init *MHS, Init *RHS, RecTy *Type, return nullptr; } -Init *TernOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const { +Init *TernOpInit::Fold(Record *CurRec) const { switch (getOpcode()) { case SUBST: { DefInit *LHSd = dyn_cast<DefInit>(LHS); @@ -1199,8 +1164,8 @@ Init *TernOpInit::resolveReferences(Resolver &R) const { if (LHS != lhs || MHS != mhs || RHS != rhs) return (TernOpInit::get(getOpcode(), lhs, mhs, rhs, getType())) - ->Fold(R.getCurrentRecord(), nullptr); - return Fold(R.getCurrentRecord(), nullptr); + ->Fold(R.getCurrentRecord()); + return Fold(R.getCurrentRecord()); } std::string TernOpInit::getAsString() const { @@ -1401,7 +1366,7 @@ Init *TypedInit::getCastTo(RecTy *Ty) const { return nullptr; return UnOpInit::get(UnOpInit::CAST, const_cast<TypedInit *>(this), Ty) - ->Fold(nullptr, nullptr); + ->Fold(nullptr); } Init *TypedInit::convertInitListSlice(ArrayRef<unsigned> Elements) const { @@ -2202,7 +2167,7 @@ Init *llvm::QualifyName(Record &CurRec, MultiClass *CurMultiClass, } if (BinOpInit *BinOp = dyn_cast<BinOpInit>(NewName)) - NewName = BinOp->Fold(&CurRec, CurMultiClass); + NewName = BinOp->Fold(&CurRec); return NewName; } diff --git a/llvm/lib/TableGen/TGParser.cpp b/llvm/lib/TableGen/TGParser.cpp index 3bf99e943bc..4a4a510eefe 100644 --- a/llvm/lib/TableGen/TGParser.cpp +++ b/llvm/lib/TableGen/TGParser.cpp @@ -936,7 +936,7 @@ Init *TGParser::ParseOperation(Record *CurRec, RecTy *ItemType) { return nullptr; } Lex.Lex(); // eat the ')' - return (UnOpInit::get(Code, LHS, Type))->Fold(CurRec, CurMultiClass); + return (UnOpInit::get(Code, LHS, Type))->Fold(CurRec); } case tgtok::XIsA: { @@ -1124,15 +1124,14 @@ Init *TGParser::ParseOperation(Record *CurRec, RecTy *ItemType) { Code == BinOpInit::AND || Code == BinOpInit::OR) { while (InitList.size() > 2) { Init *RHS = InitList.pop_back_val(); - RHS = (BinOpInit::get(Code, InitList.back(), RHS, Type)) - ->Fold(CurRec, CurMultiClass); + RHS = (BinOpInit::get(Code, InitList.back(), RHS, Type))->Fold(CurRec); InitList.back() = RHS; } } if (InitList.size() == 2) return (BinOpInit::get(Code, InitList[0], InitList[1], Type)) - ->Fold(CurRec, CurMultiClass); + ->Fold(CurRec); Error(OpLoc, "expected two operands to operator"); return nullptr; @@ -1237,7 +1236,7 @@ Init *TGParser::ParseOperation(Record *CurRec, RecTy *ItemType) { } return (TernOpInit::get(TernOpInit::FOREACH, LHS, MHS, RHS, OutType)) - ->Fold(CurRec, CurMultiClass); + ->Fold(CurRec); } case tgtok::XDag: @@ -1378,8 +1377,7 @@ Init *TGParser::ParseOperation(Record *CurRec, RecTy *ItemType) { break; } } - return (TernOpInit::get(Code, LHS, MHS, RHS, Type))->Fold(CurRec, - CurMultiClass); + return (TernOpInit::get(Code, LHS, MHS, RHS, Type))->Fold(CurRec); } case tgtok::XFoldl: { @@ -1996,8 +1994,9 @@ Init *TGParser::ParseValue(Record *CurRec, RecTy *ItemType, IDParseMode Mode) { break; } - Result = BinOpInit::get(BinOpInit::STRCONCAT, LHS, RHS, - StringRecTy::get())->Fold(CurRec, CurMultiClass); + Result = + BinOpInit::get(BinOpInit::STRCONCAT, LHS, RHS, StringRecTy::get()) + ->Fold(CurRec); break; } } @@ -2832,11 +2831,12 @@ Record *TGParser::InstantiateMulticlassDef(MultiClass &MC, Record *DefProto, if (DefNameString) { // We have a fully expanded string so there are no operators to // resolve. We should concatenate the given prefix and name. - DefName = - BinOpInit::get(BinOpInit::STRCONCAT, - UnOpInit::get(UnOpInit::CAST, DefmPrefix, - StringRecTy::get())->Fold(DefProto, &MC), - DefName, StringRecTy::get())->Fold(DefProto, &MC); + DefName = BinOpInit::get( + BinOpInit::STRCONCAT, + UnOpInit::get(UnOpInit::CAST, DefmPrefix, StringRecTy::get()) + ->Fold(DefProto), + DefName, StringRecTy::get()) + ->Fold(DefProto); } // Make a trail of SMLocs from the multiclass instantiations. |