about summary refs log tree commit diff homepage
path: root/lib/Module
diff options
context:
space:
mode:
authorDan Liew <daniel.liew@imperial.ac.uk>2014-02-14 14:00:11 +0000
committerDan Liew <daniel.liew@imperial.ac.uk>2014-02-14 14:00:11 +0000
commit3c49bee67765e3b58ff5cfd2dcc26568509e275b (patch)
treecbe3111891effdf3da687810afc31db27ba97447 /lib/Module
parent360f372b46478d4f94f8696f4931cd85c20beb88 (diff)
downloadklee-3c49bee67765e3b58ff5cfd2dcc26568509e275b.tar.gz
Refactor cleaning up memory in linkBCA() so that if linking fails
then clean up is performed.
Diffstat (limited to 'lib/Module')
-rw-r--r--lib/Module/ModuleUtil.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/lib/Module/ModuleUtil.cpp b/lib/Module/ModuleUtil.cpp
index 7a0e18d2..349defb3 100644
--- a/lib/Module/ModuleUtil.cpp
+++ b/lib/Module/ModuleUtil.cpp
@@ -152,6 +152,17 @@ GetAllUndefinedSymbols(Module *M, std::set<std::string> &UndefinedSymbols) {
 }
 
 
+/*!  A helper function for linkBCA() which cleans up
+ *   memory allocated by that function.
+ */
+static void CleanUpLinkBCA(std::vector<Module*> &archiveModules)
+{
+  for (std::vector<Module*>::iterator I = archiveModules.begin(), E = archiveModules.end();
+      I != E; ++I)
+  {
+    delete (*I);
+  }
+}
 
 /*! A helper function for klee::linkWithLibrary() that links in an archive of bitcode
  *  modules into a composite bitcode module
@@ -290,7 +301,7 @@ static bool linkBCA(object::Archive* archive, Module* composite, std::string& er
             // Linking failed
             SS << "Linking archive module with composite failed:" << errorMessage;
             SS.flush();
-            delete M;
+            CleanUpLinkBCA(archiveModules);
             return false;
           }
           else
@@ -320,13 +331,9 @@ static bool linkBCA(object::Archive* archive, Module* composite, std::string& er
                 archiveModules.size() << " modules left.\n");
   } while (undefinedSymbols != previouslyUndefinedSymbols); // Iterate until we reach a fixed point
 
-  // What's left in archiveModules we don't want to link in so free it
-  for (std::vector<Module*>::iterator I = archiveModules.begin(), E = archiveModules.end();
-      I != E; ++I)
-  {
-    delete (*I);
-  }
 
+  // What's left in archiveModules we don't want to link in so free it
+  CleanUpLinkBCA(archiveModules);
 
   return true;