DiffLog.h revision 221337
1169691Skan//===-- DiffLog.h - Difference Log Builder and accessories ------*- C++ -*-===// 2169691Skan// 3169691Skan// The LLVM Compiler Infrastructure 4169691Skan// 5169691Skan// This file is distributed under the University of Illinois Open Source 6169691Skan// License. See LICENSE.TXT for details. 7169691Skan// 8169691Skan//===----------------------------------------------------------------------===// 9169691Skan// 10169691Skan// This header defines the interface to the LLVM difference log builder. 11169691Skan// 12169691Skan//===----------------------------------------------------------------------===// 13169691Skan 14169691Skan#ifndef _LLVM_DIFFLOG_H_ 15169691Skan#define _LLVM_DIFFLOG_H_ 16169691Skan 17169691Skan#include "llvm/ADT/SmallVector.h" 18169691Skan#include "llvm/ADT/StringRef.h" 19169691Skan 20169691Skannamespace llvm { 21169691Skan class Instruction; 22169691Skan class Value; 23169691Skan class Consumer; 24169691Skan 25169691Skan /// Trichotomy assumption 26169691Skan enum DiffChange { DC_match, DC_left, DC_right }; 27169691Skan 28169691Skan /// A temporary-object class for building up log messages. 29169691Skan class LogBuilder { 30169691Skan Consumer &consumer; 31169691Skan 32169691Skan /// The use of a stored StringRef here is okay because 33169691Skan /// LogBuilder should be used only as a temporary, and as a 34169691Skan /// temporary it will be destructed before whatever temporary 35169691Skan /// might be initializing this format. 36169691Skan StringRef Format; 37169691Skan 38169691Skan SmallVector<Value*, 4> Arguments; 39169691Skan 40169691Skan public: 41169691Skan LogBuilder(Consumer &c, StringRef Format) 42169691Skan : consumer(c), Format(Format) {} 43169691Skan 44169691Skan LogBuilder &operator<<(Value *V) { 45169691Skan Arguments.push_back(V); 46169691Skan return *this; 47169691Skan } 48169691Skan 49169691Skan ~LogBuilder(); 50169691Skan 51169691Skan StringRef getFormat() const; 52169691Skan unsigned getNumArguments() const; 53169691Skan Value *getArgument(unsigned I) const; 54169691Skan }; 55169691Skan 56169691Skan /// A temporary-object class for building up diff messages. 57169691Skan class DiffLogBuilder { 58169691Skan typedef std::pair<Instruction*,Instruction*> DiffRecord; 59169691Skan SmallVector<DiffRecord, 20> Diff; 60169691Skan 61169691Skan Consumer &consumer; 62169691Skan 63169691Skan public: 64169691Skan DiffLogBuilder(Consumer &c) : consumer(c) {} 65169691Skan ~DiffLogBuilder(); 66169691Skan 67169691Skan void addMatch(Instruction *L, Instruction *R); 68169691Skan // HACK: VS 2010 has a bug in the stdlib that requires this. 69169691Skan void addLeft(Instruction *L); 70169691Skan void addRight(Instruction *R); 71169691Skan 72169691Skan unsigned getNumLines() const; 73169691Skan DiffChange getLineKind(unsigned I) const; 74169691Skan Instruction *getLeft(unsigned I) const; 75169691Skan Instruction *getRight(unsigned I) const; 76169691Skan }; 77169691Skan 78169691Skan} 79169691Skan 80169691Skan#endif 81169691Skan