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