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