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