[llvm-commits] [llvm] r109740 - in /llvm/trunk/tools/llvm-diff: DifferenceEngine.cpp llvm-diff.cpp

John McCall rjmccall at apple.com
Thu Jul 29 01:14:41 PDT 2010


Author: rjmccall
Date: Thu Jul 29 03:14:41 2010
New Revision: 109740

URL: http://llvm.org/viewvc/llvm-project?rev=109740&view=rev
Log:
Cache the result of errs() and implement formatted logging.


Modified:
    llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp
    llvm/trunk/tools/llvm-diff/llvm-diff.cpp

Modified: llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp?rev=109740&r1=109739&r2=109740&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp (original)
+++ llvm/trunk/tools/llvm-diff/DifferenceEngine.cpp Thu Jul 29 03:14:41 2010
@@ -162,8 +162,8 @@
     if (Ref) {
       if (Ref == R) return false;
 
-      Engine.logf("successor %s cannot be equivalent to %s; "
-                  "it's already equivalent to %s")
+      Engine.logf("successor %l cannot be equivalent to %r; "
+                  "it's already equivalent to %r")
         << L << R << Ref;
       return true;
     }
@@ -220,7 +220,7 @@
     for (unsigned I = 0, E = L.arg_size(); I != E; ++I)
       if (!equivalentAsOperands(L.getArgument(I), R.getArgument(I))) {
         if (Complain)
-          Engine.logf("arguments %s and %s differ")
+          Engine.logf("arguments %l and %r differ")
             << L.getArgument(I) << R.getArgument(I);
         return true;
       }
@@ -309,7 +309,7 @@
           LCases.erase(CaseValue);
         } else if (!Difference) {
           if (Complain)
-            Engine.logf("right switch has extra case %s") << CaseValue;
+            Engine.logf("right switch has extra case %r") << CaseValue;
           Difference = true;
         }
       }
@@ -317,7 +317,7 @@
         for (DenseMap<ConstantInt*,BasicBlock*>::iterator
                I = LCases.begin(), E = LCases.end(); I != E; ++I) {
           if (Complain)
-            Engine.logf("left switch has extra case %s") << I->first;
+            Engine.logf("left switch has extra case %l") << I->first;
           Difference = true;
         }
       return Difference;
@@ -333,7 +333,7 @@
     for (unsigned I = 0, E = L->getNumOperands(); I != E; ++I) {
       Value *LO = L->getOperand(I), *RO = R->getOperand(I);
       if (!equivalentAsOperands(LO, RO)) {
-        if (Complain) Engine.logf("operands %s and %s differ") << LO << RO;
+        if (Complain) Engine.logf("operands %l and %r differ") << LO << RO;
         return true;
       }
     }
@@ -580,13 +580,13 @@
     if (Function *RFn = R->getFunction(LFn->getName()))
       Queue.push_back(std::make_pair(LFn, RFn));
     else
-      logf("function %s exists only in left module") << LFn;
+      logf("function %l exists only in left module") << LFn;
   }
 
   for (Module::iterator I = R->begin(), E = R->end(); I != E; ++I) {
     Function *RFn = &*I;
     if (!LNames.count(RFn->getName()))
-      logf("function %s exists only in right module") << RFn;
+      logf("function %r exists only in right module") << RFn;
   }
 
   for (SmallVectorImpl<std::pair<Function*,Function*> >::iterator

Modified: llvm/trunk/tools/llvm-diff/llvm-diff.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-diff/llvm-diff.cpp?rev=109740&r1=109739&r2=109740&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-diff/llvm-diff.cpp (original)
+++ llvm/trunk/tools/llvm-diff/llvm-diff.cpp Thu Jul 29 03:14:41 2010
@@ -14,6 +14,7 @@
 #include <llvm/Bitcode/ReaderWriter.h>
 
 #include <llvm/Support/raw_ostream.h>
+#include <llvm/Support/ErrorHandling.h>
 #include <llvm/LLVMContext.h>
 #include <llvm/Module.h>
 #include <llvm/Type.h>
@@ -99,6 +100,7 @@
 
 class DiffConsumer : public DifferenceEngine::Consumer {
 private:
+  raw_ostream &out;
   Module *LModule;
   Module *RModule;
   SmallVector<DiffContext, 5> contexts;
@@ -107,21 +109,21 @@
 
   void printValue(Value *V, bool isL) {
     if (V->hasName()) {
-      errs() << (isa<GlobalValue>(V) ? '@' : '%') << V->getName();
+      out << (isa<GlobalValue>(V) ? '@' : '%') << V->getName();
       return;
     }
     if (V->getType()->isVoidTy()) {
       if (isa<StoreInst>(V)) {
-        errs() << "store to ";
+        out << "store to ";
         printValue(cast<StoreInst>(V)->getPointerOperand(), isL);
       } else if (isa<CallInst>(V)) {
-        errs() << "call to ";
+        out << "call to ";
         printValue(cast<CallInst>(V)->getCalledValue(), isL);
       } else if (isa<InvokeInst>(V)) {
-        errs() << "invoke to ";
+        out << "invoke to ";
         printValue(cast<InvokeInst>(V)->getCalledValue(), isL);
       } else {
-        errs() << *V;
+        out << *V;
       }
       return;
     }
@@ -134,17 +136,17 @@
       if (isL) {
         if (ctxt.LNumbering.empty())
           ComputeNumbering(cast<Function>(ctxt.L), ctxt.LNumbering);
-        errs() << '%' << ctxt.LNumbering[V];
+        out << '%' << ctxt.LNumbering[V];
         return;
       } else {
         if (ctxt.RNumbering.empty())
           ComputeNumbering(cast<Function>(ctxt.R), ctxt.RNumbering);
-        errs() << '%' << ctxt.RNumbering[V];
+        out << '%' << ctxt.RNumbering[V];
         return;
       }
     }
 
-    errs() << "<anonymous>";
+    out << "<anonymous>";
   }
 
   void header() {
@@ -154,28 +156,28 @@
       if (I->Differences) continue;
       if (isa<Function>(I->L)) {
         // Extra newline between functions.
-        if (Differences) errs() << "\n";
+        if (Differences) out << "\n";
 
         Function *L = cast<Function>(I->L);
         Function *R = cast<Function>(I->R);
         if (L->getName() != R->getName())
-          errs() << "in function " << L->getName() << " / " << R->getName() << ":\n";
+          out << "in function " << L->getName() << " / " << R->getName() << ":\n";
         else
-          errs() << "in function " << L->getName() << ":\n";
+          out << "in function " << L->getName() << ":\n";
       } else if (isa<BasicBlock>(I->L)) {
         BasicBlock *L = cast<BasicBlock>(I->L);
         BasicBlock *R = cast<BasicBlock>(I->R);
-        errs() << "  in block ";
+        out << "  in block ";
         printValue(L, true);
-        errs() << " / ";
+        out << " / ";
         printValue(R, false);
-        errs() << ":\n";
+        out << ":\n";
       } else if (isa<Instruction>(I->L)) {
-        errs() << "    in instruction ";
+        out << "    in instruction ";
         printValue(I->L, true);
-        errs() << " / ";
+        out << " / ";
         printValue(I->R, false);
-        errs() << ":\n";
+        out << ":\n";
       }
 
       I->Differences = true;
@@ -184,12 +186,12 @@
 
   void indent() {
     unsigned N = Indent;
-    while (N--) errs() << ' ';
+    while (N--) out << ' ';
   }
 
 public:
   DiffConsumer(Module *L, Module *R)
-    : LModule(L), RModule(R), Differences(false), Indent(0) {}
+    : out(errs()), LModule(L), RModule(R), Differences(false), Indent(0) {}
 
   bool hadDifferences() const { return Differences; }
 
@@ -206,18 +208,37 @@
   void log(StringRef text) {
     header();
     indent();
-    errs() << text << "\n";
+    out << text << '\n';
   }
 
   void logf(const DifferenceEngine::LogBuilder &Log) {
     header();
     indent();
 
-    // FIXME: we don't know whether these are l-values or r-values (ha!)
-    // Print them in some saner way!
-    errs() << Log.getFormat() << "\n";
-    for (unsigned I = 0, E = Log.getNumArguments(); I != E; ++I)
-      Log.getArgument(I)->dump();
+    unsigned arg = 0;
+
+    StringRef format = Log.getFormat();
+    while (true) {
+      size_t percent = format.find('%');
+      if (percent == StringRef::npos) {
+        out << format;
+        break;
+      }
+      assert(format[percent] == '%');
+
+      if (percent > 0) out << format.substr(0, percent);
+
+      switch (format[percent+1]) {
+      case '%': out << '%'; break;
+      case 'l': printValue(Log.getArgument(arg++), true); break;
+      case 'r': printValue(Log.getArgument(arg++), false); break;
+      default: llvm_unreachable("unknown format character");
+      }
+
+      format = format.substr(percent+2);
+    }
+
+    out << '\n';
   }
 
   void logd(const DifferenceEngine::DiffLogBuilder &Log) {
@@ -227,22 +248,22 @@
       indent();
       switch (Log.getLineKind(I)) {
       case DifferenceEngine::DC_match:
-        errs() << "  ";
+        out << "  ";
         Log.getLeft(I)->dump();
         //printValue(Log.getLeft(I), true);
         break;
       case DifferenceEngine::DC_left:
-        errs() << "< ";
+        out << "< ";
         Log.getLeft(I)->dump();
         //printValue(Log.getLeft(I), true);
         break;
       case DifferenceEngine::DC_right:
-        errs() << "> ";
+        out << "> ";
         Log.getRight(I)->dump();
         //printValue(Log.getRight(I), false);
         break;
       }
-      //errs() << "\n";
+      //out << "\n";
     }
   }
   





More information about the llvm-commits mailing list