diff options
author | Bill Wendling <isanbard@gmail.com> | 2021-08-03 12:49:39 -0700 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2021-08-05 10:36:01 -0700 |
commit | 9854f2f30f84123ca78aa3603102e7cef4ec33c8 (patch) | |
tree | 0c4707fea08b3b428cebb84dde8938b7dbd58635 /llvm/tools/llvm-diff/lib/DiffConsumer.h | |
parent | 72d070b4db2da7216f63f09407bd96f49dc90bd1 (diff) | |
download | llvm-9854f2f30f84123ca78aa3603102e7cef4ec33c8.zip llvm-9854f2f30f84123ca78aa3603102e7cef4ec33c8.tar.gz llvm-9854f2f30f84123ca78aa3603102e7cef4ec33c8.tar.bz2 |
[llvm-diff] Create libLLVMDiff library
Some tools may want to use the LLVM "diff" code. Move the code into a
library for easy use.
No functionality change intende.
Differential Revision: https://reviews.llvm.org/D107392
Diffstat (limited to 'llvm/tools/llvm-diff/lib/DiffConsumer.h')
-rw-r--r-- | llvm/tools/llvm-diff/lib/DiffConsumer.h | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/llvm/tools/llvm-diff/lib/DiffConsumer.h b/llvm/tools/llvm-diff/lib/DiffConsumer.h new file mode 100644 index 0000000..f7b2f24 --- /dev/null +++ b/llvm/tools/llvm-diff/lib/DiffConsumer.h @@ -0,0 +1,90 @@ +//===-- DiffConsumer.h - Difference Consumer --------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This header defines the interface to the LLVM difference Consumer +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_TOOLS_LLVM_DIFF_DIFFCONSUMER_H +#define LLVM_TOOLS_LLVM_DIFF_DIFFCONSUMER_H + +#include "DiffLog.h" +#include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/IR/Value.h" +#include "llvm/Support/Casting.h" +#include "llvm/Support/raw_ostream.h" + +namespace llvm { +class StringRef; + class Module; + class Value; + class Function; + + /// The interface for consumers of difference data. + class Consumer { + virtual void anchor(); + 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(const Value *Left, const 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(const Value *L, const Value *R) + : L(L), R(R), Differences(false), IsFunction(isa<Function>(L)) {} + const Value *L; + const Value *R; + bool Differences; + bool IsFunction; + DenseMap<const Value *, unsigned> LNumbering; + DenseMap<const Value *, unsigned> RNumbering; + }; + + raw_ostream &out; + SmallVector<DiffContext, 5> contexts; + bool Differences; + unsigned Indent; + + void printValue(const Value *V, bool isL); + void header(); + void indent(); + + public: + DiffConsumer() + : out(errs()), Differences(false), Indent(0) {} + + bool hadDifferences() const; + void enterContext(const Value *L, const Value *R) override; + void exitContext() override; + void log(StringRef text) override; + void logf(const LogBuilder &Log) override; + void logd(const DiffLogBuilder &Log) override; + }; +} + +#endif |