Generalize the previous binary operator support and add a string concatenation
operation.  This implements Regression/TableGen/strconcat.td.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27312 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/utils/TableGen/FileParser.y b/utils/TableGen/FileParser.y
index 11fda1d..aa86139 100644
--- a/utils/TableGen/FileParser.y
+++ b/utils/TableGen/FileParser.y
@@ -200,7 +200,7 @@
 };
 
 %token INT BIT STRING BITS LIST CODE DAG CLASS DEF FIELD LET IN
-%token SHLTOK SRATOK SRLTOK
+%token SHLTOK SRATOK SRLTOK STRCONCATTOK
 %token <IntVal>      INTVAL
 %token <StrVal>      ID VARNAME STRVAL CODEFRAGMENT
 
@@ -352,23 +352,13 @@
     }
     delete $3;
   } | SHLTOK '(' Value ',' Value ')' {
-    $$ = $3->getBinaryOp(Init::SHL, $5);
-    if ($$ == 0) {
-      err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n";
-      exit(1);
-    }
+    $$ = (new BinOpInit(BinOpInit::SHL, $3, $5))->Fold();
   } | SRATOK '(' Value ',' Value ')' {
-    $$ = $3->getBinaryOp(Init::SRA, $5);
-    if ($$ == 0) {
-      err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n";
-      exit(1);
-    }
+    $$ = (new BinOpInit(BinOpInit::SRA, $3, $5))->Fold();
   } | SRLTOK '(' Value ',' Value ')' {
-    $$ = $3->getBinaryOp(Init::SRL, $5);
-    if ($$ == 0) {
-      err() << "Cannot shift values '" << *$3 << "' and '" << *$5 << "'!\n";
-      exit(1);
-    }
+    $$ = (new BinOpInit(BinOpInit::SRL, $3, $5))->Fold();
+  } | STRCONCATTOK '(' Value ',' Value ')' {
+    $$ = (new BinOpInit(BinOpInit::STRCONCAT, $3, $5))->Fold();
   };
 
 OptVarName : /* empty */ {