[PATCH] D93814: [TableGen] Fix bug in !interleave operator
Paul C. Anagnostopoulos via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 28 09:18:03 PST 2020
This revision was automatically updated to reflect the committed changes.
Closed by commit rG4820af99ddc3: [TableGen] Fix bug in !interleave operator (authored by Paul-C-Anagnostopoulos).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D93814/new/
https://reviews.llvm.org/D93814
Files:
llvm/lib/TableGen/Record.cpp
llvm/test/TableGen/interleave.td
Index: llvm/test/TableGen/interleave.td
===================================================================
--- llvm/test/TableGen/interleave.td
+++ llvm/test/TableGen/interleave.td
@@ -77,6 +77,15 @@
code OperatorList = !interleave(!listconcat(Operators, [[{;}]]), ", ");
}
+// CHECK: def Rec7
+// CHECK: str = "foo/bar/zoo";
+
+def Rec7 {
+ string foo = "foo";
+ string zoo = "oops, not zoo";
+ string str = !interleave([foo, "bar", zoo], "/");
+ let zoo = "zoo";
+}
#ifdef ERROR1
def op;
Index: llvm/lib/TableGen/Record.cpp
===================================================================
--- llvm/lib/TableGen/Record.cpp
+++ llvm/lib/TableGen/Record.cpp
@@ -856,14 +856,19 @@
const StringInit *Delim) {
if (List->size() == 0)
return StringInit::get("");
- SmallString<80> Result(cast<StringInit>(List->getElement(0))->getValue());
+ StringInit *Element = dyn_cast<StringInit>(List->getElement(0));
+ if (!Element)
+ return nullptr;
+ SmallString<80> Result(Element->getValue());
StringInit::StringFormat Fmt = StringInit::SF_String;
for (unsigned I = 1, E = List->size(); I < E; ++I) {
Result.append(Delim->getValue());
- auto *StrInit = cast<StringInit>(List->getElement(I));
- Result.append(StrInit->getValue());
- Fmt = StringInit::determineFormat(Fmt, StrInit->getFormat());
+ StringInit *Element = dyn_cast<StringInit>(List->getElement(I));
+ if (!Element)
+ return nullptr;
+ Result.append(Element->getValue());
+ Fmt = StringInit::determineFormat(Fmt, Element->getFormat());
}
return StringInit::get(Result, Fmt);
}
@@ -872,14 +877,21 @@
const StringInit *Delim) {
if (List->size() == 0)
return StringInit::get("");
- SmallString<80> Result(
- cast<IntInit>(List->getElement(0)->getCastTo(IntRecTy::get()))
- ->getAsString());
+ IntInit *Element =
+ dyn_cast_or_null<IntInit>(List->getElement(0)
+ ->convertInitializerTo(IntRecTy::get()));
+ if (!Element)
+ return nullptr;
+ SmallString<80> Result(Element->getAsString());
for (unsigned I = 1, E = List->size(); I < E; ++I) {
Result.append(Delim->getValue());
- Result.append(cast<IntInit>(List->getElement(I)->getCastTo(IntRecTy::get()))
- ->getAsString());
+ IntInit *Element =
+ dyn_cast_or_null<IntInit>(List->getElement(I)
+ ->convertInitializerTo(IntRecTy::get()));
+ if (!Element)
+ return nullptr;
+ Result.append(Element->getAsString());
}
return StringInit::get(Result);
}
@@ -975,10 +987,13 @@
ListInit *List = dyn_cast<ListInit>(LHS);
StringInit *Delim = dyn_cast<StringInit>(RHS);
if (List && Delim) {
+ StringInit *Result;
if (isa<StringRecTy>(List->getElementType()))
- return interleaveStringList(List, Delim);
+ Result = interleaveStringList(List, Delim);
else
- return interleaveIntList(List, Delim);
+ Result = interleaveIntList(List, Delim);
+ if (Result)
+ return Result;
}
break;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D93814.313865.patch
Type: text/x-patch
Size: 3180 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201228/3f9b41eb/attachment.bin>
More information about the llvm-commits
mailing list