Add source Record* reference to PatternToMatch. Allows better diagnostics.
authorJim Grosbach <grosbach@apple.com>
Tue, 7 Dec 2010 23:05:49 +0000 (23:05 +0000)
committerJim Grosbach <grosbach@apple.com>
Tue, 7 Dec 2010 23:05:49 +0000 (23:05 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121196 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/CodeGenDAGPatterns.cpp
utils/TableGen/CodeGenDAGPatterns.h
utils/TableGen/FastISelEmitter.cpp

index 6c89453ce4cb8a240a61e8671fcd4b5d3a3ad2d5..a70b5044491016b0c392e7f14e062b97af94ddf5 100644 (file)
@@ -2482,7 +2482,8 @@ void CodeGenDAGPatterns::ParseInstructions() {
     
     Record *Instr = II->first;
     AddPatternToMatch(I,
-                      PatternToMatch(Instr->getValueAsListInit("Predicates"),
+                      PatternToMatch(Instr,
+                                     Instr->getValueAsListInit("Predicates"),
                                      SrcPattern,
                                      TheInst.getResultPattern(),
                                      TheInst.getImpResults(),
@@ -2714,7 +2715,8 @@ void CodeGenDAGPatterns::ParsePatterns() {
 
     
     AddPatternToMatch(Pattern,
-                    PatternToMatch(CurPattern->getValueAsListInit("Predicates"),
+                    PatternToMatch(CurPattern,
+                                   CurPattern->getValueAsListInit("Predicates"),
                                    Pattern->getTree(0),
                                    Temp.getOnlyTree(), InstImpResults,
                                    CurPattern->getValueAsInt("AddedComplexity"),
@@ -3013,7 +3015,8 @@ void CodeGenDAGPatterns::GenerateVariants() {
 
       // Otherwise, add it to the list of patterns we have.
       PatternsToMatch.
-        push_back(PatternToMatch(PatternsToMatch[i].getPredicates(),
+        push_back(PatternToMatch(PatternsToMatch[i].getSrcRecord(),
+                                 PatternsToMatch[i].getPredicates(),
                                  Variant, PatternsToMatch[i].getDstPattern(),
                                  PatternsToMatch[i].getDstRegs(),
                                  PatternsToMatch[i].getAddedComplexity(),
index 0a1362ab2494fa2a1a4fde57c37869ce8c7266b9..97f51d89566e509bd9e72fec7db5005b23939b36 100644 (file)
@@ -568,13 +568,14 @@ public:
 /// processed to produce isel.
 class PatternToMatch {
 public:
-  PatternToMatch(ListInit *preds,
+  PatternToMatch(Record *srcrecord, ListInit *preds,
                  TreePatternNode *src, TreePatternNode *dst,
                  const std::vector<Record*> &dstregs,
                  unsigned complexity, unsigned uid)
-    : Predicates(preds), SrcPattern(src), DstPattern(dst),
+    : SrcRecord(srcrecord), Predicates(preds), SrcPattern(src), DstPattern(dst),
       Dstregs(dstregs), AddedComplexity(complexity), ID(uid) {}
 
+  Record          *SrcRecord;   // Originating Record for the pattern.
   ListInit        *Predicates;  // Top level predicate conditions to match.
   TreePatternNode *SrcPattern;  // Source pattern to match.
   TreePatternNode *DstPattern;  // Resulting pattern.
@@ -582,6 +583,7 @@ public:
   unsigned         AddedComplexity; // Add to matching pattern complexity.
   unsigned         ID;          // Unique ID for the record.
 
+  Record          *getSrcRecord()  const { return SrcRecord; }
   ListInit        *getPredicates() const { return Predicates; }
   TreePatternNode *getSrcPattern() const { return SrcPattern; }
   TreePatternNode *getDstPattern() const { return DstPattern; }
index 399894f78d6170103eb60ee3f710d2ecdfd0e5fd..f01de1dcfce600a9f86730ab06d4260443d6c480 100644 (file)
@@ -381,14 +381,10 @@ void FastISelMap::CollectPatterns(CodeGenDAGPatterns &CGP) {
       SubRegNo,
       PhysRegInputs
     };
-    // FIXME: Source location information for the diagnostic.
     if (SimplePatterns[Operands][OpcodeName][VT][RetVT]
-            .count(PredicateCheck)) {
-      SmallString<128> PatText;
-      raw_svector_ostream OS(PatText);
-      Pattern.SrcPattern->print(OS);
-      throw "Duplicate record: " + OS.str().str();
-    }
+            .count(PredicateCheck))
+      throw TGError(Pattern.getSrcRecord()->getLoc(), "Duplicate record!");
+
     SimplePatterns[Operands][OpcodeName][VT][RetVT][PredicateCheck] = Memo;
   }
 }