Home | History | Annotate | Download | only in llvm-diff
      1 //===-- DiffLog.h - Difference Log Builder and accessories ------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This header defines the interface to the LLVM difference log builder.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #ifndef _LLVM_DIFFLOG_H_
     15 #define _LLVM_DIFFLOG_H_
     16 
     17 #include "llvm/ADT/SmallVector.h"
     18 #include "llvm/ADT/StringRef.h"
     19 
     20 namespace llvm {
     21   class Instruction;
     22   class Value;
     23   class Consumer;
     24 
     25   /// Trichotomy assumption
     26   enum DiffChange { DC_match, DC_left, DC_right };
     27 
     28   /// A temporary-object class for building up log messages.
     29   class LogBuilder {
     30     Consumer &consumer;
     31 
     32     /// The use of a stored StringRef here is okay because
     33     /// LogBuilder should be used only as a temporary, and as a
     34     /// temporary it will be destructed before whatever temporary
     35     /// might be initializing this format.
     36     StringRef Format;
     37 
     38     SmallVector<Value*, 4> Arguments;
     39 
     40   public:
     41     LogBuilder(Consumer &c, StringRef Format)
     42       : consumer(c), Format(Format) {}
     43 
     44     LogBuilder &operator<<(Value *V) {
     45       Arguments.push_back(V);
     46       return *this;
     47     }
     48 
     49     ~LogBuilder();
     50 
     51     StringRef getFormat() const;
     52     unsigned getNumArguments() const;
     53     Value *getArgument(unsigned I) const;
     54   };
     55 
     56   /// A temporary-object class for building up diff messages.
     57   class DiffLogBuilder {
     58     typedef std::pair<Instruction*,Instruction*> DiffRecord;
     59     SmallVector<DiffRecord, 20> Diff;
     60 
     61     Consumer &consumer;
     62 
     63   public:
     64     DiffLogBuilder(Consumer &c) : consumer(c) {}
     65     ~DiffLogBuilder();
     66 
     67     void addMatch(Instruction *L, Instruction *R);
     68     // HACK: VS 2010 has a bug in the stdlib that requires this.
     69     void addLeft(Instruction *L);
     70     void addRight(Instruction *R);
     71 
     72     unsigned getNumLines() const;
     73     DiffChange getLineKind(unsigned I) const;
     74     Instruction *getLeft(unsigned I) const;
     75     Instruction *getRight(unsigned I) const;
     76   };
     77 
     78 }
     79 
     80 #endif
     81