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