| //===-- DiffConsumer.h - Difference Consumer --------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This header defines the interface to the LLVM difference Consumer |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef _LLVM_DIFFCONSUMER_H_ |
| #define _LLVM_DIFFCONSUMER_H_ |
| |
| #include "DiffLog.h" |
| |
| #include "llvm/ADT/SmallVector.h" |
| #include "llvm/ADT/DenseMap.h" |
| #include "llvm/ADT/StringRef.h" |
| #include "llvm/Support/raw_ostream.h" |
| #include "llvm/Support/Casting.h" |
| |
| namespace llvm { |
| class Module; |
| class Value; |
| class Function; |
| |
| /// The interface for consumers of difference data. |
| class Consumer { |
| public: |
| /// Record that a local context has been entered. Left and |
| /// Right are IR "containers" of some sort which are being |
| /// considered for structural equivalence: global variables, |
| /// functions, blocks, instructions, etc. |
| virtual void enterContext(Value *Left, Value *Right) = 0; |
| |
| /// Record that a local context has been exited. |
| virtual void exitContext() = 0; |
| |
| /// Record a difference within the current context. |
| virtual void log(StringRef Text) = 0; |
| |
| /// Record a formatted difference within the current context. |
| virtual void logf(const LogBuilder &Log) = 0; |
| |
| /// Record a line-by-line instruction diff. |
| virtual void logd(const DiffLogBuilder &Log) = 0; |
| |
| protected: |
| virtual ~Consumer() {} |
| }; |
| |
| class DiffConsumer : public Consumer { |
| private: |
| struct DiffContext { |
| DiffContext(Value *L, Value *R) |
| : L(L), R(R), Differences(false), IsFunction(isa<Function>(L)) {} |
| Value *L; |
| Value *R; |
| bool Differences; |
| bool IsFunction; |
| DenseMap<Value*,unsigned> LNumbering; |
| DenseMap<Value*,unsigned> RNumbering; |
| }; |
| |
| raw_ostream &out; |
| Module *LModule; |
| Module *RModule; |
| SmallVector<DiffContext, 5> contexts; |
| bool Differences; |
| unsigned Indent; |
| |
| void printValue(Value *V, bool isL); |
| void header(); |
| void indent(); |
| |
| public: |
| DiffConsumer(Module *L, Module *R) |
| : out(errs()), LModule(L), RModule(R), Differences(false), Indent(0) {} |
| |
| bool hadDifferences() const; |
| void enterContext(Value *L, Value *R); |
| void exitContext(); |
| void log(StringRef text); |
| void logf(const LogBuilder &Log); |
| void logd(const DiffLogBuilder &Log); |
| }; |
| } |
| |
| #endif |