xref: /llvm-project/llvm/tools/llvm-diff/lib/DiffConsumer.h (revision 39809eb1b33a5c13ce839cfa8145a5305e9d8133)
14d293f21SBill Wendling //===-- DiffConsumer.h - Difference Consumer --------------------*- C++ -*-===//
24d293f21SBill Wendling //
34d293f21SBill Wendling // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
44d293f21SBill Wendling // See https://llvm.org/LICENSE.txt for license information.
54d293f21SBill Wendling // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
64d293f21SBill Wendling //
74d293f21SBill Wendling //===----------------------------------------------------------------------===//
84d293f21SBill Wendling //
94d293f21SBill Wendling // This header defines the interface to the LLVM difference Consumer
104d293f21SBill Wendling //
114d293f21SBill Wendling //===----------------------------------------------------------------------===//
124d293f21SBill Wendling 
134d293f21SBill Wendling #ifndef LLVM_TOOLS_LLVM_DIFF_DIFFCONSUMER_H
144d293f21SBill Wendling #define LLVM_TOOLS_LLVM_DIFF_DIFFCONSUMER_H
154d293f21SBill Wendling 
164d293f21SBill Wendling #include "DiffLog.h"
174d293f21SBill Wendling #include "llvm/ADT/DenseMap.h"
184d293f21SBill Wendling #include "llvm/ADT/SmallVector.h"
194d293f21SBill Wendling #include "llvm/IR/Value.h"
204d293f21SBill Wendling #include "llvm/Support/Casting.h"
214d293f21SBill Wendling #include "llvm/Support/raw_ostream.h"
224d293f21SBill Wendling 
234d293f21SBill Wendling namespace llvm {
244d293f21SBill Wendling class StringRef;
254d293f21SBill Wendling   class Module;
264d293f21SBill Wendling   class Value;
274d293f21SBill Wendling   class Function;
284d293f21SBill Wendling 
294d293f21SBill Wendling   /// The interface for consumers of difference data.
304d293f21SBill Wendling   class Consumer {
314d293f21SBill Wendling     virtual void anchor();
324d293f21SBill Wendling   public:
334d293f21SBill Wendling     /// Record that a local context has been entered.  Left and
344d293f21SBill Wendling     /// Right are IR "containers" of some sort which are being
354d293f21SBill Wendling     /// considered for structural equivalence: global variables,
364d293f21SBill Wendling     /// functions, blocks, instructions, etc.
374d293f21SBill Wendling     virtual void enterContext(const Value *Left, const Value *Right) = 0;
384d293f21SBill Wendling 
394d293f21SBill Wendling     /// Record that a local context has been exited.
404d293f21SBill Wendling     virtual void exitContext() = 0;
414d293f21SBill Wendling 
424d293f21SBill Wendling     /// Record a difference within the current context.
434d293f21SBill Wendling     virtual void log(StringRef Text) = 0;
444d293f21SBill Wendling 
454d293f21SBill Wendling     /// Record a formatted difference within the current context.
464d293f21SBill Wendling     virtual void logf(const LogBuilder &Log) = 0;
474d293f21SBill Wendling 
484d293f21SBill Wendling     /// Record a line-by-line instruction diff.
494d293f21SBill Wendling     virtual void logd(const DiffLogBuilder &Log) = 0;
504d293f21SBill Wendling 
514d293f21SBill Wendling   protected:
~Consumer()524d293f21SBill Wendling     virtual ~Consumer() {}
534d293f21SBill Wendling   };
544d293f21SBill Wendling 
554d293f21SBill Wendling   class DiffConsumer : public Consumer {
564d293f21SBill Wendling   private:
574d293f21SBill Wendling     struct DiffContext {
DiffContextDiffContext584d293f21SBill Wendling       DiffContext(const Value *L, const Value *R)
594d293f21SBill Wendling           : L(L), R(R), Differences(false), IsFunction(isa<Function>(L)) {}
604d293f21SBill Wendling       const Value *L;
614d293f21SBill Wendling       const Value *R;
624d293f21SBill Wendling       bool Differences;
634d293f21SBill Wendling       bool IsFunction;
644d293f21SBill Wendling       DenseMap<const Value *, unsigned> LNumbering;
654d293f21SBill Wendling       DenseMap<const Value *, unsigned> RNumbering;
664d293f21SBill Wendling     };
674d293f21SBill Wendling 
684d293f21SBill Wendling     raw_ostream &out;
694d293f21SBill Wendling     SmallVector<DiffContext, 5> contexts;
704d293f21SBill Wendling     bool Differences;
714d293f21SBill Wendling     unsigned Indent;
724d293f21SBill Wendling 
734d293f21SBill Wendling     void printValue(const Value *V, bool isL);
744d293f21SBill Wendling     void header();
754d293f21SBill Wendling     void indent();
764d293f21SBill Wendling 
774d293f21SBill Wendling   public:
DiffConsumer()784d293f21SBill Wendling     DiffConsumer()
794d293f21SBill Wendling       : out(errs()), Differences(false), Indent(0) {}
804d293f21SBill Wendling 
81*39809eb1SBill Wendling     void reset();
824d293f21SBill Wendling     bool hadDifferences() const;
834d293f21SBill Wendling     void enterContext(const Value *L, const Value *R) override;
844d293f21SBill Wendling     void exitContext() override;
854d293f21SBill Wendling     void log(StringRef text) override;
864d293f21SBill Wendling     void logf(const LogBuilder &Log) override;
874d293f21SBill Wendling     void logd(const DiffLogBuilder &Log) override;
884d293f21SBill Wendling   };
894d293f21SBill Wendling }
904d293f21SBill Wendling 
914d293f21SBill Wendling #endif
92