[AVX] Make Inits Foldable

Manage Inits in a FoldingSet.  This provides several benefits:

- Memory for Inits is properly managed

- Duplicate Inits are folded into Flyweights, saving memory

- It enforces const-correctness, protecting against certain classes
  of bugs

The above benefits allow Inits to be used in more contexts, which in
turn provides more dynamism to TableGen.  This enhanced capability
will be used by the AVX code generator to a fold common patterns
together.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@134907 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/utils/TableGen/TableGen.cpp b/utils/TableGen/TableGen.cpp
index e8eacb8..23a67c0 100644
--- a/utils/TableGen/TableGen.cpp
+++ b/utils/TableGen/TableGen.cpp
@@ -208,6 +208,7 @@
     if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputFilename.c_str(), File)) {
       errs() << "Could not open input file '" << InputFilename << "': "
              << ec.message() <<"\n";
+      Init::ReleaseMemory();
       return 1;
     }
     MemoryBuffer *F = File.take();
@@ -221,25 +222,30 @@
 
     TGParser Parser(SrcMgr, Records);
 
-    if (Parser.ParseFile())
+    if (Parser.ParseFile()) {
+      Init::ReleaseMemory();
       return 1;
+    }
 
     std::string Error;
     tool_output_file Out(OutputFilename.c_str(), Error);
     if (!Error.empty()) {
       errs() << argv[0] << ": error opening " << OutputFilename
         << ":" << Error << "\n";
+      Init::ReleaseMemory();
       return 1;
     }
     if (!DependFilename.empty()) {
       if (OutputFilename == "-") {
         errs() << argv[0] << ": the option -d must be used together with -o\n";
+        Init::ReleaseMemory();
         return 1;
       }
       tool_output_file DepOut(DependFilename.c_str(), Error);
       if (!Error.empty()) {
         errs() << argv[0] << ": error opening " << DependFilename
           << ":" << Error << "\n";
+        Init::ReleaseMemory();
         return 1;
       }
       DepOut.os() << DependFilename << ":";
@@ -382,11 +388,14 @@
     }
     default:
       assert(1 && "Invalid Action");
+      Init::ReleaseMemory();
       return 1;
     }
 
     // Declare success.
     Out.keep();
+
+    Init::ReleaseMemory();
     return 0;
 
   } catch (const TGError &Error) {
@@ -399,5 +408,7 @@
     errs() << argv[0] << ": Unknown unexpected exception occurred.\n";
   }
 
+  Init::ReleaseMemory();
+
   return 1;
 }