xref: /aosp_15_r20/external/llvm/tools/llvm-diff/DifferenceEngine.h (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- DifferenceEngine.h - Module comparator ------------------*- C++ -*-===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This header defines the interface to the LLVM difference engine,
11*9880d681SAndroid Build Coastguard Worker // which structurally compares functions within a module.
12*9880d681SAndroid Build Coastguard Worker //
13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
14*9880d681SAndroid Build Coastguard Worker 
15*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_TOOLS_LLVM_DIFF_DIFFERENCEENGINE_H
16*9880d681SAndroid Build Coastguard Worker #define LLVM_TOOLS_LLVM_DIFF_DIFFERENCEENGINE_H
17*9880d681SAndroid Build Coastguard Worker 
18*9880d681SAndroid Build Coastguard Worker #include "DiffConsumer.h"
19*9880d681SAndroid Build Coastguard Worker #include "DiffLog.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringRef.h"
21*9880d681SAndroid Build Coastguard Worker #include <utility>
22*9880d681SAndroid Build Coastguard Worker 
23*9880d681SAndroid Build Coastguard Worker namespace llvm {
24*9880d681SAndroid Build Coastguard Worker   class Function;
25*9880d681SAndroid Build Coastguard Worker   class GlobalValue;
26*9880d681SAndroid Build Coastguard Worker   class Instruction;
27*9880d681SAndroid Build Coastguard Worker   class LLVMContext;
28*9880d681SAndroid Build Coastguard Worker   class Module;
29*9880d681SAndroid Build Coastguard Worker   class Twine;
30*9880d681SAndroid Build Coastguard Worker   class Value;
31*9880d681SAndroid Build Coastguard Worker 
32*9880d681SAndroid Build Coastguard Worker   /// A class for performing structural comparisons of LLVM assembly.
33*9880d681SAndroid Build Coastguard Worker   class DifferenceEngine {
34*9880d681SAndroid Build Coastguard Worker   public:
35*9880d681SAndroid Build Coastguard Worker     /// A RAII object for recording the current context.
36*9880d681SAndroid Build Coastguard Worker     struct Context {
ContextContext37*9880d681SAndroid Build Coastguard Worker       Context(DifferenceEngine &Engine, Value *L, Value *R) : Engine(Engine) {
38*9880d681SAndroid Build Coastguard Worker         Engine.consumer.enterContext(L, R);
39*9880d681SAndroid Build Coastguard Worker       }
40*9880d681SAndroid Build Coastguard Worker 
~ContextContext41*9880d681SAndroid Build Coastguard Worker       ~Context() {
42*9880d681SAndroid Build Coastguard Worker         Engine.consumer.exitContext();
43*9880d681SAndroid Build Coastguard Worker       }
44*9880d681SAndroid Build Coastguard Worker 
45*9880d681SAndroid Build Coastguard Worker     private:
46*9880d681SAndroid Build Coastguard Worker       DifferenceEngine &Engine;
47*9880d681SAndroid Build Coastguard Worker     };
48*9880d681SAndroid Build Coastguard Worker 
49*9880d681SAndroid Build Coastguard Worker     /// An oracle for answering whether two values are equivalent as
50*9880d681SAndroid Build Coastguard Worker     /// operands.
51*9880d681SAndroid Build Coastguard Worker     class Oracle {
52*9880d681SAndroid Build Coastguard Worker       virtual void anchor();
53*9880d681SAndroid Build Coastguard Worker     public:
54*9880d681SAndroid Build Coastguard Worker       virtual bool operator()(Value *L, Value *R) = 0;
55*9880d681SAndroid Build Coastguard Worker 
56*9880d681SAndroid Build Coastguard Worker     protected:
~Oracle()57*9880d681SAndroid Build Coastguard Worker       virtual ~Oracle() {}
58*9880d681SAndroid Build Coastguard Worker     };
59*9880d681SAndroid Build Coastguard Worker 
DifferenceEngine(Consumer & consumer)60*9880d681SAndroid Build Coastguard Worker     DifferenceEngine(Consumer &consumer)
61*9880d681SAndroid Build Coastguard Worker       : consumer(consumer), globalValueOracle(nullptr) {}
62*9880d681SAndroid Build Coastguard Worker 
63*9880d681SAndroid Build Coastguard Worker     void diff(Module *L, Module *R);
64*9880d681SAndroid Build Coastguard Worker     void diff(Function *L, Function *R);
log(StringRef text)65*9880d681SAndroid Build Coastguard Worker     void log(StringRef text) {
66*9880d681SAndroid Build Coastguard Worker       consumer.log(text);
67*9880d681SAndroid Build Coastguard Worker     }
logf(StringRef text)68*9880d681SAndroid Build Coastguard Worker     LogBuilder logf(StringRef text) {
69*9880d681SAndroid Build Coastguard Worker       return LogBuilder(consumer, text);
70*9880d681SAndroid Build Coastguard Worker     }
getConsumer()71*9880d681SAndroid Build Coastguard Worker     Consumer& getConsumer() const { return consumer; }
72*9880d681SAndroid Build Coastguard Worker 
73*9880d681SAndroid Build Coastguard Worker     /// Installs an oracle to decide whether two global values are
74*9880d681SAndroid Build Coastguard Worker     /// equivalent as operands.  Without an oracle, global values are
75*9880d681SAndroid Build Coastguard Worker     /// considered equivalent as operands precisely when they have the
76*9880d681SAndroid Build Coastguard Worker     /// same name.
setGlobalValueOracle(Oracle * oracle)77*9880d681SAndroid Build Coastguard Worker     void setGlobalValueOracle(Oracle *oracle) {
78*9880d681SAndroid Build Coastguard Worker       globalValueOracle = oracle;
79*9880d681SAndroid Build Coastguard Worker     }
80*9880d681SAndroid Build Coastguard Worker 
81*9880d681SAndroid Build Coastguard Worker     /// Determines whether two global values are equivalent.
82*9880d681SAndroid Build Coastguard Worker     bool equivalentAsOperands(GlobalValue *L, GlobalValue *R);
83*9880d681SAndroid Build Coastguard Worker 
84*9880d681SAndroid Build Coastguard Worker   private:
85*9880d681SAndroid Build Coastguard Worker     Consumer &consumer;
86*9880d681SAndroid Build Coastguard Worker     Oracle *globalValueOracle;
87*9880d681SAndroid Build Coastguard Worker   };
88*9880d681SAndroid Build Coastguard Worker }
89*9880d681SAndroid Build Coastguard Worker 
90*9880d681SAndroid Build Coastguard Worker #endif
91