Generalize tblgen's dag parsing logic to handle arbitrary expressions
authorChris Lattner <sabre@nondot.org>
Wed, 6 Oct 2010 04:55:48 +0000 (04:55 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 6 Oct 2010 04:55:48 +0000 (04:55 +0000)
as the operator of the dag.  Specifically, this allows parsing things
like (F.x 4) in addition to just (a 4).

Unfortunately, this runs afoul of an idiom being used by llvmc.  It
is using dags like (foo [1,2,3]) to represent a list of stuff being
passed into foo.  With this change, this is parsed as a [1,2,3]
subscript on foo instead of being the first argument to the dag.
Cope with this in the short term by requiring a "-llvmc-temp-hack"
argument to tblgen to get the old parsing behavior.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115742 91177308-0d34-0410-b5e6-96231b3b80d8

Makefile.rules
test/LLVMC/MultipleOutputLanguages.td
test/LLVMC/OptionPreprocessor.td
test/TableGen/Dag.td
utils/TableGen/TGParser.cpp

index 261578f35f72e7ce9699ef14d4f3626e4a809991..62718b73f7aafa6bddf1011fd8a4305bee019880 100644 (file)
@@ -1779,7 +1779,7 @@ $(INCTMPFiles) : $(TBLGEN) $(TDFiles)
 
 $(ObjDir)/%.inc.tmp: %.td $(ObjDir)/.dir
        $(Echo) "Building LLVMC compilation graph description with tblgen"
-       $(Verb) $(TableGen) -gen-llvmc -o $(call SYSPATH, $@) $<
+       $(Verb) $(TableGen) -gen-llvmc -llvmc-temp-hack -o $(call SYSPATH, $@) $<
 
 clean-local::
        -$(Verb) $(RM) -f $(INCFiles)
index 02512c2db7cf2b0da48860d658f8268909340a26..16ce6be85c800ba88776816907ecff2122a4e5d0 100644 (file)
@@ -1,5 +1,5 @@
 // Check that multiple output languages work.
-// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
+// RUN: tblgen -I %p/../../include -llvmc-temp-hack --gen-llvmc %s -o %t
 // RUN: FileCheck -input-file %t %s
 // RUN: %compile_cxx %t
 // XFAIL: vg_leak
index 8019c42634f30a865d8677e0438b5416b7432765..44670cee932fcf1c19d197c7d9b212a72f93d65c 100644 (file)
@@ -1,5 +1,5 @@
 // Test for the OptionPreprocessor and related functionality.
-// RUN: tblgen -I %p/../../include --gen-llvmc %s -o %t
+// RUN: tblgen -I %p/../../include -llvmc-temp-hack --gen-llvmc %s -o %t
 // RUN: FileCheck -input-file %t %s
 // RUN: %compile_cxx %t
 // XFAIL: vg_leak
index 8b406a59d34bf9b157ee033870d961aa633bf2e3..d3481a550c34d45184727d1ca82ec5d6c8db5f75 100644 (file)
@@ -33,3 +33,39 @@ def VAL2 : C2<Y2>;
 // CHECK-NEXT: dag d = (X2 Y2)
 // CHECK-NEXT: dag e = (Y2 X2)
 
+
+//===----------------------------------------------------------------------===//
+// Complex dag operator (F.TheOp).
+
+class operator;
+def somedef1 : operator;
+def somedef2 : operator;
+
+class foo<operator a> {
+ operator TheOp = a;
+}
+
+class bar<foo F, operator a> {
+  dag Dag1 = (somedef1 1);
+  dag Dag2 = (a 2);
+  dag Dag3 = (F.TheOp 2);
+}
+
+def foo1 : foo<somedef1>;
+def foo2 : foo<somedef2>;
+
+def VAL3 : bar<foo1, somedef1>;
+
+// CHECK:     def VAL3 {       // bar
+// CHECK-NEXT:  dag Dag1 = (somedef1 1);
+// CHECK-NEXT:  dag Dag2 = (somedef1 2);
+// CHECK-NEXT:  dag Dag3 = (somedef1 2);
+// CHECK-NEXT: }
+
+
+def VAL4 : bar<foo2, somedef2>;
+// CHECK:      def VAL4 {
+// CHECK-NEXT:  dag Dag1 = (somedef1 1);
+// CHECK-NEXT:  dag Dag2 = (somedef2 2);
+// CHECK-NEXT:  dag Dag3 = (somedef2 2);
+// CHECK-NEXT: }
index b0389ddb7296c90ee5452ee1b9fd7a8995008336..188ba4d2b1be6dbf34856ea9ed63631b2e1ea857 100644 (file)
 #include <algorithm>
 #include <sstream>
 #include "llvm/ADT/SmallVector.h"
+#include "llvm/Support/CommandLine.h"
 using namespace llvm;
 
+/// LLVMCHack - This is a temporary hack that changes how "(foo [1, 2, 3])"
+/// parses.
+/// FIXME: REMOVE THIS.
+static cl::opt<bool> LLVMCHack("llvmc-temp-hack", cl::ReallyHidden);
+
 //===----------------------------------------------------------------------===//
 // Support Code for the Semantic Actions.
 //===----------------------------------------------------------------------===//
@@ -1213,11 +1219,18 @@ Init *TGParser::ParseSimpleValue(Record *CurRec, RecTy *ItemType) {
       return 0;
     }
 
-    Init *Operator = 0;
-    if (Lex.getCode() == tgtok::Id)
-      Operator = ParseIDValue(CurRec);
-    else
-      Operator = ParseOperation(CurRec);
+    Init *Operator;
+    /// LLVMC Requires an old grammar and I don't know how to update it, placate
+    /// it in the short term by changing the grammar specifically for llvmc.
+    /// FIXME: REMOVE THIS.
+    if (!LLVMCHack)
+      Operator = ParseValue(CurRec);
+    else {
+      if (Lex.getCode() == tgtok::Id)
+        Operator = ParseIDValue(CurRec);
+      else
+        Operator = ParseOperation(CurRec);
+    }
     if (Operator == 0) return 0;
 
     // If the operator name is present, parse it.