Index: llvm/trunk/include/llvm/TableGen/Record.h =================================================================== --- llvm/trunk/include/llvm/TableGen/Record.h +++ llvm/trunk/include/llvm/TableGen/Record.h @@ -821,6 +821,7 @@ static BinOpInit *get(BinaryOp opc, Init *lhs, Init *rhs, RecTy *Type); + static Init *getStrConcat(Init *lhs, Init *rhs); void Profile(FoldingSetNodeID &ID) const; Index: llvm/trunk/lib/TableGen/Record.cpp =================================================================== --- llvm/trunk/lib/TableGen/Record.cpp +++ llvm/trunk/lib/TableGen/Record.cpp @@ -816,6 +816,14 @@ return StringInit::get(Concat); } +Init *BinOpInit::getStrConcat(Init *I0, Init *I1) { + // Shortcut for the common case of concatenating two strings. + if (const StringInit *I0s = dyn_cast(I0)) + if (const StringInit *I1s = dyn_cast(I1)) + return ConcatStringInits(I0s, I1s); + return BinOpInit::get(BinOpInit::STRCONCAT, I0, I1, StringRecTy::get()); +} + Init *BinOpInit::Fold(Record *CurRec) const { switch (getOpcode()) { case CONCAT: { @@ -2148,22 +2156,15 @@ return Defs; } -static Init *GetStrConcat(Init *I0, Init *I1) { - // Shortcut for the common case of concatenating two strings. - if (const StringInit *I0s = dyn_cast(I0)) - if (const StringInit *I1s = dyn_cast(I1)) - return ConcatStringInits(I0s, I1s); - return BinOpInit::get(BinOpInit::STRCONCAT, I0, I1, StringRecTy::get()); -} - Init *llvm::QualifyName(Record &CurRec, MultiClass *CurMultiClass, Init *Name, StringRef Scoper) { - Init *NewName = GetStrConcat(CurRec.getNameInit(), StringInit::get(Scoper)); - NewName = GetStrConcat(NewName, Name); + Init *NewName = + BinOpInit::getStrConcat(CurRec.getNameInit(), StringInit::get(Scoper)); + NewName = BinOpInit::getStrConcat(NewName, Name); if (CurMultiClass && Scoper != "::") { - Init *Prefix = GetStrConcat(CurMultiClass->Rec.getNameInit(), - StringInit::get("::")); - NewName = GetStrConcat(Prefix, NewName); + Init *Prefix = BinOpInit::getStrConcat(CurMultiClass->Rec.getNameInit(), + StringInit::get("::")); + NewName = BinOpInit::getStrConcat(Prefix, NewName); } if (BinOpInit *BinOp = dyn_cast(NewName)) Index: llvm/trunk/lib/TableGen/TGParser.cpp =================================================================== --- llvm/trunk/lib/TableGen/TGParser.cpp +++ llvm/trunk/lib/TableGen/TGParser.cpp @@ -1994,9 +1994,7 @@ break; } - Result = - BinOpInit::get(BinOpInit::STRCONCAT, LHS, RHS, StringRecTy::get()) - ->Fold(CurRec); + Result = BinOpInit::getStrConcat(LHS, RHS); break; } } @@ -2831,12 +2829,10 @@ 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), - DefName, StringRecTy::get()) - ->Fold(DefProto); + DefName = BinOpInit::getStrConcat( + UnOpInit::get(UnOpInit::CAST, DefmPrefix, StringRecTy::get()) + ->Fold(DefProto), + DefName); } // Make a trail of SMLocs from the multiclass instantiations.