aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Greene <greened@obbligato.org>2009-12-21 21:21:34 +0000
committerDavid Greene <greened@obbligato.org>2009-12-21 21:21:34 +0000
commitf660802f348e4e57ef9df8d30be74b894259badb (patch)
tree4ad5603c0f42c4d15e5b60b3c5a3464cf1842ab9
parent7b1eb8a4091ff4e76323ce2d4a42d5d14b5e3f50 (diff)
downloadexternal_llvm-f660802f348e4e57ef9df8d30be74b894259badb.zip
external_llvm-f660802f348e4e57ef9df8d30be74b894259badb.tar.gz
external_llvm-f660802f348e4e57ef9df8d30be74b894259badb.tar.bz2
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@91843 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--test/TableGen/subst2.td15
-rw-r--r--utils/TableGen/Record.cpp4
2 files changed, 18 insertions, 1 deletions
diff --git a/test/TableGen/subst2.td b/test/TableGen/subst2.td
new file mode 100644
index 0000000..3366c9d
--- /dev/null
+++ b/test/TableGen/subst2.td
@@ -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">;
diff --git a/utils/TableGen/Record.cpp b/utils/TableGen/Record.cpp
index 53f9014..542735e 100644
--- a/utils/TableGen/Record.cpp
+++ b/utils/TableGen/Record.cpp
@@ -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);