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 20namespace 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