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_TOOLS_LLVM_DIFF_DIFFLOG_H 15 #define LLVM_TOOLS_LLVM_DIFF_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: LogBuilder(Consumer & c,StringRef Format)41 LogBuilder(Consumer &c, StringRef Format) : consumer(&c), Format(Format) {} LogBuilder(LogBuilder && L)42 LogBuilder(LogBuilder &&L) 43 : consumer(L.consumer), Format(L.Format), 44 Arguments(std::move(L.Arguments)) { 45 L.consumer = nullptr; 46 } 47 48 LogBuilder &operator<<(Value *V) { 49 Arguments.push_back(V); 50 return *this; 51 } 52 53 ~LogBuilder(); 54 55 StringRef getFormat() const; 56 unsigned getNumArguments() const; 57 Value *getArgument(unsigned I) const; 58 }; 59 60 /// A temporary-object class for building up diff messages. 61 class DiffLogBuilder { 62 typedef std::pair<Instruction*,Instruction*> DiffRecord; 63 SmallVector<DiffRecord, 20> Diff; 64 65 Consumer &consumer; 66 67 public: DiffLogBuilder(Consumer & c)68 DiffLogBuilder(Consumer &c) : consumer(c) {} 69 ~DiffLogBuilder(); 70 71 void addMatch(Instruction *L, Instruction *R); 72 // HACK: VS 2010 has a bug in the stdlib that requires this. 73 void addLeft(Instruction *L); 74 void addRight(Instruction *R); 75 76 unsigned getNumLines() const; 77 DiffChange getLineKind(unsigned I) const; 78 Instruction *getLeft(unsigned I) const; 79 Instruction *getRight(unsigned I) const; 80 }; 81 82 } 83 84 #endif 85