Register ARMAlgorithm::DoCleanup() to be called on exit to free the memory
authorJohnny Chen <johnny.chen@apple.com>
Sat, 3 Apr 2010 01:09:47 +0000 (01:09 +0000)
committerJohnny Chen <johnny.chen@apple.com>
Sat, 3 Apr 2010 01:09:47 +0000 (01:09 +0000)
occuplied by the cached ARMAlgorithm objects.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100258 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp
lib/Target/ARM/Disassembler/ARMDisassemblerCore.h

index 41c8c228914c7984919d307d05963a522a35bca8..9f41455797c7c9d7f9c3f013cd356e63cfc14e3e 100644 (file)
@@ -3130,6 +3130,13 @@ static const DisassembleFP FuncPtrs[] = {
 /// Algorithms - Algorithms stores a map from Format to ARMAlgorithm*.
 static std::vector<ARMAlgorithm*> Algorithms;
 
+/// DoCleanup - Do cleanup of Algorithms upon exit.
+void ARMAlgorithm::DoCleanup() {
+  for (unsigned i = 0; i < array_lengthof(FuncPtrs); ++i)
+    if (Algorithms[i])
+      delete Algorithms[i];
+}
+
 /// GetInstance - GetInstance returns an instance of ARMAlgorithm given the
 /// encoding Format.  API clients should not free up the returned instance.
 ARMAlgorithm *ARMAlgorithm::GetInstance(ARMFormat Format) {
@@ -3141,11 +3148,13 @@ ARMAlgorithm *ARMAlgorithm::GetInstance(ARMFormat Format) {
         Algorithms[i] = new ARMAlgorithm(FuncPtrs[i]);
       else
         Algorithms[i] = NULL;
+
+    // Register cleanup routine.
+    atexit(DoCleanup);
   }
   return Algorithms[Format];
 }
 
-
 /// BuildIt - BuildIt performs the build step for this ARM Basic MC Builder.
 /// The general idea is to set the Opcode for the MCInst, followed by adding
 /// the appropriate MCOperands to the MCInst.  ARM Basic MC Builder delegates
index 1409a120e48f916d6628c6dc4b578d727cb439d7..6d742512f8318650197bf63c2b89d4556ba6d01b 100644 (file)
@@ -181,6 +181,9 @@ public:
   /// encoding Format.  API clients should not free up the returned instance.
   static ARMAlgorithm *GetInstance(ARMFormat Format);
 
+  /// DoCleanup - DoCleanup is meant to be called upon exit as an exit handler.
+  static void DoCleanup();
+
   /// Return true if this algorithm successfully disassembles the instruction.
   /// NumOpsAdded is updated to reflect the number of operands added by the
   /// algorithm.  NumOpsAdded may be less than NumOps, in which case, there are