mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-31 08:16:47 +00:00 
			
		
		
		
	git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146960 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //===-- DifferenceEngine.h - Module comparator ------------------*- C++ -*-===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This header defines the interface to the LLVM difference engine,
 | |
| // which structurally compares functions within a module.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| 
 | |
| #ifndef _LLVM_DIFFERENCE_ENGINE_H_
 | |
| #define _LLVM_DIFFERENCE_ENGINE_H_
 | |
| 
 | |
| #include "llvm/ADT/SmallVector.h"
 | |
| #include "llvm/ADT/StringRef.h"
 | |
| #include "DiffLog.h"
 | |
| #include "DiffConsumer.h"
 | |
| 
 | |
| #include <utility>
 | |
| 
 | |
| namespace llvm {
 | |
|   class Function;
 | |
|   class GlobalValue;
 | |
|   class Instruction;
 | |
|   class LLVMContext;
 | |
|   class Module;
 | |
|   class Twine;
 | |
|   class Value;
 | |
| 
 | |
|   /// A class for performing structural comparisons of LLVM assembly.
 | |
|   class DifferenceEngine {
 | |
|   public:
 | |
|     /// A RAII object for recording the current context.
 | |
|     struct Context {
 | |
|       Context(DifferenceEngine &Engine, Value *L, Value *R) : Engine(Engine) {
 | |
|         Engine.consumer.enterContext(L, R);
 | |
|       }
 | |
| 
 | |
|       ~Context() {
 | |
|         Engine.consumer.exitContext();
 | |
|       }
 | |
| 
 | |
|     private:
 | |
|       DifferenceEngine &Engine;
 | |
|     };
 | |
| 
 | |
|     /// An oracle for answering whether two values are equivalent as
 | |
|     /// operands.
 | |
|     class Oracle {
 | |
|       virtual void anchor();
 | |
|     public:
 | |
|       virtual bool operator()(Value *L, Value *R) = 0;
 | |
| 
 | |
|     protected:
 | |
|       virtual ~Oracle() {}
 | |
|     };
 | |
| 
 | |
|     DifferenceEngine(LLVMContext &context, Consumer &consumer)
 | |
|       : context(context), consumer(consumer), globalValueOracle(0) {}
 | |
| 
 | |
|     void diff(Module *L, Module *R);
 | |
|     void diff(Function *L, Function *R);
 | |
|     void log(StringRef text) {
 | |
|       consumer.log(text);
 | |
|     }
 | |
|     LogBuilder logf(StringRef text) {
 | |
|       return LogBuilder(consumer, text);
 | |
|     }
 | |
|     Consumer& getConsumer() const { return consumer; }
 | |
| 
 | |
|     /// Installs an oracle to decide whether two global values are
 | |
|     /// equivalent as operands.  Without an oracle, global values are
 | |
|     /// considered equivalent as operands precisely when they have the
 | |
|     /// same name.
 | |
|     void setGlobalValueOracle(Oracle *oracle) {
 | |
|       globalValueOracle = oracle;
 | |
|     }
 | |
| 
 | |
|     /// Determines whether two global values are equivalent.
 | |
|     bool equivalentAsOperands(GlobalValue *L, GlobalValue *R);
 | |
| 
 | |
|   private:
 | |
|     LLVMContext &context;
 | |
|     Consumer &consumer;
 | |
|     Oracle *globalValueOracle;
 | |
|   };
 | |
| }
 | |
| 
 | |
| #endif
 |