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