TableGen.cpp revision b0cf29c5cfff797284b3660dc233e135feb65d9a
11d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner//===- TableGen.cpp - Top-Level TableGen implementation -------------------===//
23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//                     The LLVM Compiler Infrastructure
401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//
53060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// This file is distributed under the University of Illinois Open Source
63060910e290949a9ac5eda8726d030790c4d60ffChris Lattner// License. See LICENSE.TXT for details.
73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman//
801d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//===----------------------------------------------------------------------===//
91d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner//
101d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner// TableGen is a tool which can be used to build up a description of something,
111d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner// then invoke one or more "tablegen backends" to emit information about the
121d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner// description in some predefined format.  In practice, this is used by the LLVM
131d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner// code generators to automate generation of a code generator through a
141d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner// high-level description of the target.
151d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner//
161d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner//===----------------------------------------------------------------------===//
171d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner
18e62c1185bee05facc25d1d725434f517261d308bChris Lattner#include "Record.h"
19f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#include "TGParser.h"
20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/CommandLine.h"
21f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling#include "llvm/Support/Streams.h"
22bed85ff010b95923646ed4e187a5d432cedf67daChris Lattner#include "llvm/System/Signals.h"
23551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/FileUtilities.h"
24f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner#include "llvm/Support/MemoryBuffer.h"
2550d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner#include "CallingConvEmitter.h"
26f00ce8bc29c3194485b7251dd3e234cead10008eMisha Brukman#include "CodeEmitterGen.h"
271d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner#include "RegisterInfoEmitter.h"
28169e66bfc23c20a3df7d0364f5f1abb43f33694bChris Lattner#include "InstrInfoEmitter.h"
297b11712ef2d41631137a3c124a58407702ffa8afChris Lattner#include "InstrEnumEmitter.h"
302e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner#include "AsmWriterEmitter.h"
314a24c645c8402dff59dbf20d5a422227a611e908Chris Lattner#include "DAGISelEmitter.h"
32b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman#include "FastISelEmitter.h"
33f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey#include "SubtargetEmitter.h"
349e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner#include "IntrinsicEmitter.h"
35ecbdcf2ae056404cde449783a1ec8ba798c36562Mikhail Glushenkov#include "LLVMCConfigurationEmitter.h"
36e62c1185bee05facc25d1d725434f517261d308bChris Lattner#include <algorithm>
37c3fe45b2f577eaf4d12cb7890773af3a8dea73c7Misha Brukman#include <cstdio>
389a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner#include <fstream>
396fb9a84e79212f550981b6545aa435e7ca0cd794Duraid Madina#include <ios>
402082ebe8b3a5db302748828ab4f79a36d239c1d9Chris Lattnerusing namespace llvm;
41d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
42bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattnerenum ActionType {
43bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner  PrintRecords,
44bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner  GenEmitter,
4554d156d33324b7715453993f21684915a28e310aChris Lattner  GenRegisterEnums, GenRegister, GenRegisterHeader,
46ac67b7ea8fcd530995d7aefd2ad0f04543789855Anton Korobeynikov  GenInstrEnums, GenInstrs, GenAsmWriter,
4750d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner  GenCallingConv,
484a24c645c8402dff59dbf20d5a422227a611e908Chris Lattner  GenDAGISel,
49b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman  GenFastISel,
50f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey  GenSubtarget,
519e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner  GenIntrinsic,
52895820da243713e78ff3ee66ba54c4db4ee121acMikhail Glushenkov  GenLLVMCConf,
533b2397211b806e723369f99b0ec674c6f616901bChris Lattner  PrintEnums
54bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner};
55bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner
56bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattnernamespace {
57bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner  cl::opt<ActionType>
58bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner  Action(cl::desc("Action to perform:"),
59bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner         cl::values(clEnumValN(PrintRecords, "print-records",
6085df22568d3eebfde900dd30038c29ae01caf5bdChris Lattner                               "Print all records to stdout (default)"),
61bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner                    clEnumValN(GenEmitter, "gen-emitter",
62bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner                               "Generate machine code emitter"),
6354d156d33324b7715453993f21684915a28e310aChris Lattner                    clEnumValN(GenRegisterEnums, "gen-register-enums",
6454d156d33324b7715453993f21684915a28e310aChris Lattner                               "Generate enum values for registers"),
651d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner                    clEnumValN(GenRegister, "gen-register-desc",
661d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner                               "Generate a register info description"),
671d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner                    clEnumValN(GenRegisterHeader, "gen-register-desc-header",
681d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner                               "Generate a register info description header"),
69169e66bfc23c20a3df7d0364f5f1abb43f33694bChris Lattner                    clEnumValN(GenInstrEnums, "gen-instr-enums",
70169e66bfc23c20a3df7d0364f5f1abb43f33694bChris Lattner                               "Generate enum values for instructions"),
7115de32d706287e1457ab26b74d731f5367083b99Chris Lattner                    clEnumValN(GenInstrs, "gen-instr-desc",
7215de32d706287e1457ab26b74d731f5367083b99Chris Lattner                               "Generate instruction descriptions"),
7350d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner                    clEnumValN(GenCallingConv, "gen-callingconv",
7450d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner                               "Generate calling convention descriptions"),
752e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner                    clEnumValN(GenAsmWriter, "gen-asm-writer",
762e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner                               "Generate assembly writer"),
774a24c645c8402dff59dbf20d5a422227a611e908Chris Lattner                    clEnumValN(GenDAGISel, "gen-dag-isel",
784a24c645c8402dff59dbf20d5a422227a611e908Chris Lattner                               "Generate a DAG instruction selector"),
79b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                    clEnumValN(GenFastISel, "gen-fast-isel",
80b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                               "Generate a \"fast\" instruction selector"),
81f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey                    clEnumValN(GenSubtarget, "gen-subtarget",
82f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey                               "Generate subtarget enumerations"),
839e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner                    clEnumValN(GenIntrinsic, "gen-intrinsic",
849e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner                               "Generate intrinsic information"),
85895820da243713e78ff3ee66ba54c4db4ee121acMikhail Glushenkov                    clEnumValN(GenLLVMCConf, "gen-llvmc",
86895820da243713e78ff3ee66ba54c4db4ee121acMikhail Glushenkov                               "Generate LLVMC configuration library"),
87bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner                    clEnumValN(PrintEnums, "print-enums",
88bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner                               "Print enum values for a class"),
89bd935336d4dd9d9a55feed9d9ef0bd6941060f37Chris Lattner                    clEnumValEnd));
90bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner
91bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner  cl::opt<std::string>
9285df22568d3eebfde900dd30038c29ae01caf5bdChris Lattner  Class("class", cl::desc("Print Enum list for this class"),
9385df22568d3eebfde900dd30038c29ae01caf5bdChris Lattner        cl::value_desc("class name"));
949a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner
9590523906fa31c8f4e156dc7ef4a433a50d4b706dChris Lattner  cl::opt<std::string>
9690523906fa31c8f4e156dc7ef4a433a50d4b706dChris Lattner  OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"),
9790523906fa31c8f4e156dc7ef4a433a50d4b706dChris Lattner                 cl::init("-"));
9890523906fa31c8f4e156dc7ef4a433a50d4b706dChris Lattner
9990523906fa31c8f4e156dc7ef4a433a50d4b706dChris Lattner  cl::opt<std::string>
10090523906fa31c8f4e156dc7ef4a433a50d4b706dChris Lattner  InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"));
10196b4beda5c180f4091d55752bc22129f15d4030cJohn Criswell
102d9f5d90af198eff5fa78e313d019bd1770db7f03Chris Lattner  cl::list<std::string>
103d9f5d90af198eff5fa78e313d019bd1770db7f03Chris Lattner  IncludeDirs("I", cl::desc("Directory of include files"),
104ed5424196d79746542e14bf959842fb94bc8fb9cChris Lattner              cl::value_desc("directory"), cl::Prefix);
105bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner}
106bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner
1072082ebe8b3a5db302748828ab4f79a36d239c1d9Chris LattnerRecordKeeper llvm::Records;
108e62c1185bee05facc25d1d725434f517261d308bChris Lattner
109f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner/// ParseFile - this function begins the parsing of the specified tablegen
110f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner/// file.
111ecbdcf2ae056404cde449783a1ec8ba798c36562Mikhail Glushenkovstatic bool ParseFile(const std::string &Filename,
112f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner                      const std::vector<std::string> &IncludeDirs) {
113f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::string ErrorStr;
114038112a4e0a9afd656f415ab397a230ae5921627Chris Lattner  MemoryBuffer *F = MemoryBuffer::getFileOrSTDIN(Filename.c_str(), &ErrorStr);
115f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  if (F == 0) {
116f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    cerr << "Could not open input file '" + Filename + "': " << ErrorStr <<"\n";
117f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return true;
118f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  }
119ecbdcf2ae056404cde449783a1ec8ba798c36562Mikhail Glushenkov
120f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  TGParser Parser(F);
121ecbdcf2ae056404cde449783a1ec8ba798c36562Mikhail Glushenkov
122f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  // Record the location of the include directory so that the lexer can find
123f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  // it later.
124f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  Parser.setIncludeDirs(IncludeDirs);
125ecbdcf2ae056404cde449783a1ec8ba798c36562Mikhail Glushenkov
126f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  return Parser.ParseFile();
127f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner}
128f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
129e62c1185bee05facc25d1d725434f517261d308bChris Lattnerint main(int argc, char **argv) {
130e62c1185bee05facc25d1d725434f517261d308bChris Lattner  cl::ParseCommandLineOptions(argc, argv);
131f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
132f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  // Parse the input file.
133f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  if (ParseFile(InputFilename, IncludeDirs))
134f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return 1;
135e62c1185bee05facc25d1d725434f517261d308bChris Lattner
136f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling  std::ostream *Out = cout.stream();
1379a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner  if (OutputFilename != "-") {
13842df6d1396d0335621f648b0e4a6e59f13e868f2Chris Lattner    Out = new std::ofstream(OutputFilename.c_str());
1399a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner
1409a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner    if (!Out->good()) {
141f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling      cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
1429a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner      return 1;
1439a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner    }
1449a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner
1459a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner    // Make sure the file gets removed if *gasp* tablegen crashes...
146227b6d00dd1faee07c921c7e2256e0fca737d2e5Reid Spencer    sys::RemoveFileOnSignal(sys::Path(OutputFilename));
1479a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner  }
1489a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner
1491d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner  try {
1501d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner    switch (Action) {
151accd8abeebfa73e0a4cb2d4372ecf42513561460Chris Lattner    case PrintRecords:
152accd8abeebfa73e0a4cb2d4372ecf42513561460Chris Lattner      *Out << Records;           // No argument, dump all contents
153accd8abeebfa73e0a4cb2d4372ecf42513561460Chris Lattner      break;
1541d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner    case GenEmitter:
1551d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      CodeEmitterGen(Records).run(*Out);
1561d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      break;
157169e66bfc23c20a3df7d0364f5f1abb43f33694bChris Lattner
15854d156d33324b7715453993f21684915a28e310aChris Lattner    case GenRegisterEnums:
15954d156d33324b7715453993f21684915a28e310aChris Lattner      RegisterInfoEmitter(Records).runEnums(*Out);
16054d156d33324b7715453993f21684915a28e310aChris Lattner      break;
1611d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner    case GenRegister:
1621d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      RegisterInfoEmitter(Records).run(*Out);
1631d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      break;
1641d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner    case GenRegisterHeader:
1651d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      RegisterInfoEmitter(Records).runHeader(*Out);
1661d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      break;
167169e66bfc23c20a3df7d0364f5f1abb43f33694bChris Lattner
168169e66bfc23c20a3df7d0364f5f1abb43f33694bChris Lattner    case GenInstrEnums:
1697b11712ef2d41631137a3c124a58407702ffa8afChris Lattner      InstrEnumEmitter(Records).run(*Out);
170169e66bfc23c20a3df7d0364f5f1abb43f33694bChris Lattner      break;
17115de32d706287e1457ab26b74d731f5367083b99Chris Lattner    case GenInstrs:
17215de32d706287e1457ab26b74d731f5367083b99Chris Lattner      InstrInfoEmitter(Records).run(*Out);
17315de32d706287e1457ab26b74d731f5367083b99Chris Lattner      break;
17450d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner    case GenCallingConv:
17550d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner      CallingConvEmitter(Records).run(*Out);
17650d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner      break;
1772e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner    case GenAsmWriter:
1782e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner      AsmWriterEmitter(Records).run(*Out);
1792e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner      break;
1802e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner
1814a24c645c8402dff59dbf20d5a422227a611e908Chris Lattner    case GenDAGISel:
1824a24c645c8402dff59dbf20d5a422227a611e908Chris Lattner      DAGISelEmitter(Records).run(*Out);
183f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey      break;
184b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman    case GenFastISel:
185b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman      FastISelEmitter(Records).run(*Out);
186b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman      break;
187f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey    case GenSubtarget:
188f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey      SubtargetEmitter(Records).run(*Out);
1899e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner      break;
1909e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner    case GenIntrinsic:
1919e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner      IntrinsicEmitter(Records).run(*Out);
192ac67b7ea8fcd530995d7aefd2ad0f04543789855Anton Korobeynikov      break;
193895820da243713e78ff3ee66ba54c4db4ee121acMikhail Glushenkov    case GenLLVMCConf:
194895820da243713e78ff3ee66ba54c4db4ee121acMikhail Glushenkov      LLVMCConfigurationEmitter(Records).run(*Out);
1953f781341f97da31bfee55bc221ff58b76e7a60dfChris Lattner      break;
1961d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner    case PrintEnums:
197d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke    {
1981d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      std::vector<Record*> Recs = Records.getAllDerivedDefinitions(Class);
1991d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      for (unsigned i = 0, e = Recs.size(); i != e; ++i)
2007b9ee51a55f7f16b54e9839d99841bc2fab71ebeChris Lattner        *Out << Recs[i]->getName() << ", ";
2011d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      *Out << "\n";
2021d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      break;
203e62c1185bee05facc25d1d725434f517261d308bChris Lattner    }
204d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke    default:
205d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke      assert(1 && "Invalid Action");
206d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke      return 1;
207d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke    }
2081d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner  } catch (const std::string &Error) {
209f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling    cerr << argv[0] << ": " << Error << "\n";
210f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling    if (Out != cout.stream()) {
211f1e366acffbe4bdbb1d4a573c178f5531efdf7f8Chris Lattner      delete Out;                             // Close the file
212f1e366acffbe4bdbb1d4a573c178f5531efdf7f8Chris Lattner      std::remove(OutputFilename.c_str());    // Remove the file, it's broken
213f1e366acffbe4bdbb1d4a573c178f5531efdf7f8Chris Lattner    }
2141d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner    return 1;
21523f7d5131cf9519b90ac4fc2d200671d128b5464Reid Spencer  } catch (...) {
216f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling    cerr << argv[0] << ": Unknown unexpected exception occurred.\n";
217f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling    if (Out != cout.stream()) {
21823f7d5131cf9519b90ac4fc2d200671d128b5464Reid Spencer      delete Out;                             // Close the file
21923f7d5131cf9519b90ac4fc2d200671d128b5464Reid Spencer      std::remove(OutputFilename.c_str());    // Remove the file, it's broken
22023f7d5131cf9519b90ac4fc2d200671d128b5464Reid Spencer    }
22123f7d5131cf9519b90ac4fc2d200671d128b5464Reid Spencer    return 2;
222e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
2239a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner
224f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling  if (Out != cout.stream()) {
225e79c72d4cd68fce6ccb30b2cc222069619f7d503Chris Lattner    delete Out;                               // Close the file
226e79c72d4cd68fce6ccb30b2cc222069619f7d503Chris Lattner  }
2271d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner  return 0;
228e62c1185bee05facc25d1d725434f517261d308bChris Lattner}
229