1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

Fix a bug in !subst where TableGen would go and resubstitute text it had

just substituted.  This could cause infinite looping in certain
pathological cases.

llvm-svn: 91843
This commit is contained in:
David Greene 2009-12-21 21:21:34 +00:00
parent 299ec7d3e7
commit 3bfe36b5d9
2 changed files with 18 additions and 1 deletions

15
test/TableGen/subst2.td Normal file
View File

@ -0,0 +1,15 @@
// RUN: tblgen %s | FileCheck %s
// CHECK: No subst
// CHECK: No foo
// CHECK: RECURSE foo
class Recurse<string t> {
string Text = t;
}
class Text<string text> :
Recurse<!subst("RECURSE", "RECURSE", !subst("NORECURSE", "foo", text))>;
def Ok1 : Text<"No subst">;
def Ok2 : Text<"No NORECURSE">;
def Trouble : Text<"RECURSE NORECURSE">;

View File

@ -945,11 +945,13 @@ Init *TernOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) {
std::string Val = RHSs->getValue();
std::string::size_type found;
std::string::size_type idx = 0;
do {
found = Val.find(LHSs->getValue());
found = Val.find(LHSs->getValue(), idx);
if (found != std::string::npos) {
Val.replace(found, LHSs->getValue().size(), MHSs->getValue());
}
idx = found + MHSs->getValue().size();
} while (found != std::string::npos);
return new StringInit(Val);