17d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin//===-- DiffLog.h - Difference Log Builder and accessories ------*- C++ -*-===// 27d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin// 37d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin// The LLVM Compiler Infrastructure 47d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin// 57d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin// This file is distributed under the University of Illinois Open Source 67d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin// License. See LICENSE.TXT for details. 77d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin// 87d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin//===----------------------------------------------------------------------===// 97d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin// 107d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin// This header defines the interface to the LLVM difference log builder. 117d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin// 127d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin//===----------------------------------------------------------------------===// 137d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 147d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin#ifndef _LLVM_DIFFLOG_H_ 157d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin#define _LLVM_DIFFLOG_H_ 167d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 177d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin#include "llvm/ADT/SmallVector.h" 187d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin#include "llvm/ADT/StringRef.h" 197d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 207d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golinnamespace llvm { 217d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin class Instruction; 227d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin class Value; 237d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin class Consumer; 247d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 257d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin /// Trichotomy assumption 267d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin enum DiffChange { DC_match, DC_left, DC_right }; 277d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 287d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin /// A temporary-object class for building up log messages. 297d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin class LogBuilder { 307d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin Consumer &consumer; 317d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 327d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin /// The use of a stored StringRef here is okay because 337d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin /// LogBuilder should be used only as a temporary, and as a 347d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin /// temporary it will be destructed before whatever temporary 357d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin /// might be initializing this format. 367d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin StringRef Format; 377d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 387d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin SmallVector<Value*, 4> Arguments; 397d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 407d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin public: 417d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin LogBuilder(Consumer &c, StringRef Format) 427d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin : consumer(c), Format(Format) {} 437d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 447d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin LogBuilder &operator<<(Value *V) { 457d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin Arguments.push_back(V); 467d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin return *this; 477d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin } 487d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 497d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin ~LogBuilder(); 507d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 517d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin StringRef getFormat() const; 527d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin unsigned getNumArguments() const; 537d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin Value *getArgument(unsigned I) const; 547d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin }; 557d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 567d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin /// A temporary-object class for building up diff messages. 577d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin class DiffLogBuilder { 587d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin typedef std::pair<Instruction*,Instruction*> DiffRecord; 597d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin SmallVector<DiffRecord, 20> Diff; 607d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 617d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin Consumer &consumer; 627d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 637d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin public: 647d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin DiffLogBuilder(Consumer &c) : consumer(c) {} 657d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin ~DiffLogBuilder(); 667d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 677d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin void addMatch(Instruction *L, Instruction *R); 687d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin // HACK: VS 2010 has a bug in the stdlib that requires this. 697d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin void addLeft(Instruction *L); 707d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin void addRight(Instruction *R); 717d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 727d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin unsigned getNumLines() const; 737d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin DiffChange getLineKind(unsigned I) const; 747d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin Instruction *getLeft(unsigned I) const; 757d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin Instruction *getRight(unsigned I) const; 767d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin }; 777d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 787d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin} 797d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin 807d4fc4fb345ee8a1de15c718a854b5f38c1e6e46Renato Golin#endif 81