Add support for deleting a module provider from a JIT in such a way that it does...
authorNate Begeman <natebegeman@mac.com>
Fri, 23 Jan 2009 19:27:28 +0000 (19:27 +0000)
committerNate Begeman <natebegeman@mac.com>
Fri, 23 Jan 2009 19:27:28 +0000 (19:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@62864 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ExecutionEngine/ExecutionEngine.h
lib/ExecutionEngine/ExecutionEngine.cpp
lib/ExecutionEngine/JIT/JIT.cpp
lib/ExecutionEngine/JIT/JIT.h

index a26c755ee76a6434e5ed487da54401096739c118..3559ede31c34ed37fc509f8b06e63a7375c6816c 100644 (file)
@@ -143,10 +143,16 @@ public:
 
 
   /// removeModuleProvider - Remove a ModuleProvider from the list of modules.
-  /// Release module from ModuleProvider.
+  /// Relases the Module from the ModuleProvider, materializing it in the
+  /// process, and returns the materialized Module.
   virtual Module* removeModuleProvider(ModuleProvider *P,
                                        std::string *ErrInfo = 0);
 
+  /// deleteModuleProvider - Remove a ModuleProvider from the list of modules,
+  /// and deletes the ModuleProvider and owned Module.  Avoids materializing 
+  /// the underlying module.
+  virtual void deleteModuleProvider(ModuleProvider *P,std::string *ErrInfo = 0);
+
   /// FindFunctionNamed - Search all of the active modules to find the one that
   /// defines FnName.  This is very slow operation and shouldn't be used for
   /// general code.
index d1a406c99607d27411bb661d96a117dc82eee0cf..9fea1f5753f8fd6093b27870724da06b2b038d78 100644 (file)
@@ -59,7 +59,8 @@ char* ExecutionEngine::getMemoryForGV(const GlobalVariable* GV) {
 }
 
 /// removeModuleProvider - Remove a ModuleProvider from the list of modules.
-/// Release module from ModuleProvider.
+/// Relases the Module from the ModuleProvider, materializing it in the
+/// process, and returns the materialized Module.
 Module* ExecutionEngine::removeModuleProvider(ModuleProvider *P, 
                                               std::string *ErrInfo) {
   for(SmallVector<ModuleProvider *, 1>::iterator I = Modules.begin(), 
@@ -74,6 +75,23 @@ Module* ExecutionEngine::removeModuleProvider(ModuleProvider *P,
   return NULL;
 }
 
+/// deleteModuleProvider - Remove a ModuleProvider from the list of modules,
+/// and deletes the ModuleProvider and owned Module.  Avoids materializing 
+/// the underlying module.
+void ExecutionEngine::deleteModuleProvider(ModuleProvider *P, 
+                                           std::string *ErrInfo) {
+  for(SmallVector<ModuleProvider *, 1>::iterator I = Modules.begin(), 
+      E = Modules.end(); I != E; ++I) {
+    ModuleProvider *MP = *I;
+    if (MP == P) {
+      Modules.erase(I);
+      clearGlobalMappingsFromModule(MP->getModule());
+      delete MP;
+      return;
+    }
+  }
+}
+
 /// FindFunctionNamed - Search all of the active modules to find the one that
 /// defines FnName.  This is very slow operation and shouldn't be used for
 /// general code.
index fd69e69c44d5d711e8e8e6fe2db47c152b5ae90a..7fc7b2fdceb43ba7e9f3b5ad5cf8c86a3859a24e 100644 (file)
@@ -297,6 +297,19 @@ Module *JIT::removeModuleProvider(ModuleProvider *MP, std::string *E) {
   return result;
 }
 
+/// deleteModuleProvider - Remove a ModuleProvider from the list of modules,
+/// and deletes the ModuleProvider and owned Module.  Avoids materializing 
+/// the underlying module.
+void JIT::deleteModuleProvider(ModuleProvider *MP, std::string *E) {
+  ExecutionEngine::deleteModuleProvider(MP, E);
+  
+  MutexGuard locked(lock);
+  if (Modules.empty()) {
+    delete jitstate;
+    jitstate = 0;
+  }
+}
+
 /// run - Start execution with the specified function and arguments.
 ///
 GenericValue JIT::runFunction(Function *F,
index b92999960331ac1651e2d92993851618f6385545..7c085e360e20bdb4ab78ddbe6f4a832ca90b383d 100644 (file)
@@ -77,9 +77,18 @@ public:
   }
 
   virtual void addModuleProvider(ModuleProvider *MP);
+  
+  /// removeModuleProvider - Remove a ModuleProvider from the list of modules.
+  /// Relases the Module from the ModuleProvider, materializing it in the
+  /// process, and returns the materialized Module.
   virtual Module *removeModuleProvider(ModuleProvider *MP,
                                        std::string *ErrInfo = 0);
 
+  /// deleteModuleProvider - Remove a ModuleProvider from the list of modules,
+  /// and deletes the ModuleProvider and owned Module.  Avoids materializing 
+  /// the underlying module.
+  virtual void deleteModuleProvider(ModuleProvider *P,std::string *ErrInfo = 0);
+
   /// runFunction - Start execution with the specified function and arguments.
   ///
   virtual GenericValue runFunction(Function *F,