| //===-- llvm/ModuleProvider.h - Interface for module providers --*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file was developed by the LLVM research group and is distributed under |
| // the University of Illinois Open Source License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file provides an abstract interface for loading a module from some |
| // place. This interface allows incremental or random access loading of |
| // functions from the file. This is useful for applications like JIT compilers |
| // or interprocedural optimizers that do not need the entire program in memory |
| // at the same time. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef MODULEPROVIDER_H |
| #define MODULEPROVIDER_H |
| |
| namespace llvm { |
| |
| class Function; |
| class Module; |
| |
| class ModuleProvider { |
| protected: |
| Module *TheModule; |
| ModuleProvider(); |
| |
| public: |
| virtual ~ModuleProvider(); |
| |
| /// getModule - returns the module this provider is encapsulating. |
| /// |
| Module* getModule() { return TheModule; } |
| |
| /// materializeFunction - make sure the given function is fully read. Note |
| /// that this can throw an exception if the module is corrupt! |
| /// |
| virtual void materializeFunction(Function *F) = 0; |
| |
| /// materializeModule - make sure the entire Module has been completely read. |
| /// Note that this can throw an exception if the module is corrupt! |
| /// |
| virtual Module* materializeModule() = 0; |
| |
| /// releaseModule - no longer delete the Module* when provider is destroyed. |
| /// Note that this can throw an exception if the module is corrupt! |
| /// |
| virtual Module* releaseModule() { |
| // Since we're losing control of this Module, we must hand it back complete |
| materializeModule(); |
| Module *tempM = TheModule; |
| TheModule = 0; |
| return tempM; |
| } |
| }; |
| |
| |
| /// ExistingModuleProvider - Allow conversion from a fully materialized Module |
| /// into a ModuleProvider, allowing code that expects a ModuleProvider to work |
| /// if we just have a Module. Note that the ModuleProvider takes ownership of |
| /// the Module specified. |
| struct ExistingModuleProvider : public ModuleProvider { |
| ExistingModuleProvider(Module *M) { |
| TheModule = M; |
| } |
| void materializeFunction(Function *F) {} |
| Module* materializeModule() { return TheModule; } |
| }; |
| |
| } // End llvm namespace |
| |
| #endif |