summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2009-03-11 17:08:13 +0000
committerChris Lattner <sabre@nondot.org>2009-03-11 17:08:13 +0000
commitbe0d672ac4cd654bc0836a58c04746ae99d9b257 (patch)
tree47c97e0a9420318b561dac3985287c92fc65597f
parent26897467058db53eb3446af4904c7dbb80897ada (diff)
downloadbcm5719-llvm-be0d672ac4cd654bc0836a58c04746ae99d9b257.tar.gz
bcm5719-llvm-be0d672ac4cd654bc0836a58c04746ae99d9b257.zip
implement support for C-style string literal concatenation in td files.
llvm-svn: 66663
-rw-r--r--llvm/test/TableGen/strconcat.td3
-rw-r--r--llvm/utils/TableGen/TGParser.cpp16
2 files changed, 17 insertions, 2 deletions
diff --git a/llvm/test/TableGen/strconcat.td b/llvm/test/TableGen/strconcat.td
index cdf3928f04d..fc0d80596c9 100644
--- a/llvm/test/TableGen/strconcat.td
+++ b/llvm/test/TableGen/strconcat.td
@@ -2,6 +2,9 @@
class Y<string S> {
string T = !strconcat(S, "foo");
+
+ // String values concatenate lexically, as in C.
+ string S = "foo" "bar";
}
def Z : Y<"fu">;
diff --git a/llvm/utils/TableGen/TGParser.cpp b/llvm/utils/TableGen/TGParser.cpp
index 1ea6b9816f6..d31e2a50ee2 100644
--- a/llvm/utils/TableGen/TGParser.cpp
+++ b/llvm/utils/TableGen/TGParser.cpp
@@ -505,7 +505,7 @@ Init *TGParser::ParseIDValue(Record *CurRec,
///
/// SimpleValue ::= IDValue
/// SimpleValue ::= INTVAL
-/// SimpleValue ::= STRVAL
+/// SimpleValue ::= STRVAL+
/// SimpleValue ::= CODEFRAGMENT
/// SimpleValue ::= '?'
/// SimpleValue ::= '{' ValueList '}'
@@ -523,7 +523,19 @@ Init *TGParser::ParseSimpleValue(Record *CurRec) {
switch (Lex.getCode()) {
default: TokError("Unknown token when parsing a value"); break;
case tgtok::IntVal: R = new IntInit(Lex.getCurIntVal()); Lex.Lex(); break;
- case tgtok::StrVal: R = new StringInit(Lex.getCurStrVal()); Lex.Lex(); break;
+ case tgtok::StrVal: {
+ std::string Val = Lex.getCurStrVal();
+ Lex.Lex();
+
+ // Handle multiple consequtive concatenated strings.
+ while (Lex.getCode() == tgtok::StrVal) {
+ Val += Lex.getCurStrVal();
+ Lex.Lex();
+ }
+
+ R = new StringInit(Val);
+ break;
+ }
case tgtok::CodeFragment:
R = new CodeInit(Lex.getCurStrVal()); Lex.Lex(); break;
case tgtok::question: R = new UnsetInit(); Lex.Lex(); break;
OpenPOWER on IntegriCloud