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