TableGen.cpp revision 49de98214b82fefeb8f16efbf8cdd8813a85469b
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,
5249de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen  GenTgtIntrinsic,
53895820da243713e78ff3ee66ba54c4db4ee121acMikhail Glushenkov  GenLLVMCConf,
543b2397211b806e723369f99b0ec674c6f616901bChris Lattner  PrintEnums
55bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner};
56bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner
57bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattnernamespace {
58bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner  cl::opt<ActionType>
59bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner  Action(cl::desc("Action to perform:"),
60bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner         cl::values(clEnumValN(PrintRecords, "print-records",
6185df22568d3eebfde900dd30038c29ae01caf5bdChris Lattner                               "Print all records to stdout (default)"),
62bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner                    clEnumValN(GenEmitter, "gen-emitter",
63bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner                               "Generate machine code emitter"),
6454d156d33324b7715453993f21684915a28e310aChris Lattner                    clEnumValN(GenRegisterEnums, "gen-register-enums",
6554d156d33324b7715453993f21684915a28e310aChris Lattner                               "Generate enum values for registers"),
661d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner                    clEnumValN(GenRegister, "gen-register-desc",
671d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner                               "Generate a register info description"),
681d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner                    clEnumValN(GenRegisterHeader, "gen-register-desc-header",
691d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner                               "Generate a register info description header"),
70169e66bfc23c20a3df7d0364f5f1abb43f33694bChris Lattner                    clEnumValN(GenInstrEnums, "gen-instr-enums",
71169e66bfc23c20a3df7d0364f5f1abb43f33694bChris Lattner                               "Generate enum values for instructions"),
7215de32d706287e1457ab26b74d731f5367083b99Chris Lattner                    clEnumValN(GenInstrs, "gen-instr-desc",
7315de32d706287e1457ab26b74d731f5367083b99Chris Lattner                               "Generate instruction descriptions"),
7450d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner                    clEnumValN(GenCallingConv, "gen-callingconv",
7550d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner                               "Generate calling convention descriptions"),
762e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner                    clEnumValN(GenAsmWriter, "gen-asm-writer",
772e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner                               "Generate assembly writer"),
784a24c645c8402dff59dbf20d5a422227a611e908Chris Lattner                    clEnumValN(GenDAGISel, "gen-dag-isel",
794a24c645c8402dff59dbf20d5a422227a611e908Chris Lattner                               "Generate a DAG instruction selector"),
80b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                    clEnumValN(GenFastISel, "gen-fast-isel",
81b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman                               "Generate a \"fast\" instruction selector"),
82f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey                    clEnumValN(GenSubtarget, "gen-subtarget",
83f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey                               "Generate subtarget enumerations"),
849e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner                    clEnumValN(GenIntrinsic, "gen-intrinsic",
859e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner                               "Generate intrinsic information"),
8649de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen                    clEnumValN(GenTgtIntrinsic, "gen-tgt-intrinsic",
8749de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen                               "Generate target intrinsic information"),
88895820da243713e78ff3ee66ba54c4db4ee121acMikhail Glushenkov                    clEnumValN(GenLLVMCConf, "gen-llvmc",
89895820da243713e78ff3ee66ba54c4db4ee121acMikhail Glushenkov                               "Generate LLVMC configuration library"),
90bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner                    clEnumValN(PrintEnums, "print-enums",
91bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner                               "Print enum values for a class"),
92bd935336d4dd9d9a55feed9d9ef0bd6941060f37Chris Lattner                    clEnumValEnd));
93bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner
94bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner  cl::opt<std::string>
9585df22568d3eebfde900dd30038c29ae01caf5bdChris Lattner  Class("class", cl::desc("Print Enum list for this class"),
9685df22568d3eebfde900dd30038c29ae01caf5bdChris Lattner        cl::value_desc("class name"));
979a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner
9890523906fa31c8f4e156dc7ef4a433a50d4b706dChris Lattner  cl::opt<std::string>
9990523906fa31c8f4e156dc7ef4a433a50d4b706dChris Lattner  OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"),
10090523906fa31c8f4e156dc7ef4a433a50d4b706dChris Lattner                 cl::init("-"));
10190523906fa31c8f4e156dc7ef4a433a50d4b706dChris Lattner
10290523906fa31c8f4e156dc7ef4a433a50d4b706dChris Lattner  cl::opt<std::string>
10390523906fa31c8f4e156dc7ef4a433a50d4b706dChris Lattner  InputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"));
10496b4beda5c180f4091d55752bc22129f15d4030cJohn Criswell
105d9f5d90af198eff5fa78e313d019bd1770db7f03Chris Lattner  cl::list<std::string>
106d9f5d90af198eff5fa78e313d019bd1770db7f03Chris Lattner  IncludeDirs("I", cl::desc("Directory of include files"),
107ed5424196d79746542e14bf959842fb94bc8fb9cChris Lattner              cl::value_desc("directory"), cl::Prefix);
108bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner}
109bc52013e30f69655f941313c3fa1a2c18de5b7abChris Lattner
1102082ebe8b3a5db302748828ab4f79a36d239c1d9Chris LattnerRecordKeeper llvm::Records;
111e62c1185bee05facc25d1d725434f517261d308bChris Lattner
112f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner/// ParseFile - this function begins the parsing of the specified tablegen
113f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner/// file.
114ecbdcf2ae056404cde449783a1ec8ba798c36562Mikhail Glushenkovstatic bool ParseFile(const std::string &Filename,
115f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner                      const std::vector<std::string> &IncludeDirs) {
116f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  std::string ErrorStr;
117038112a4e0a9afd656f415ab397a230ae5921627Chris Lattner  MemoryBuffer *F = MemoryBuffer::getFileOrSTDIN(Filename.c_str(), &ErrorStr);
118f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  if (F == 0) {
119f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    cerr << "Could not open input file '" + Filename + "': " << ErrorStr <<"\n";
120f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return true;
121f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  }
122ecbdcf2ae056404cde449783a1ec8ba798c36562Mikhail Glushenkov
123f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  TGParser Parser(F);
124ecbdcf2ae056404cde449783a1ec8ba798c36562Mikhail Glushenkov
125f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  // Record the location of the include directory so that the lexer can find
126f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  // it later.
127f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  Parser.setIncludeDirs(IncludeDirs);
128ecbdcf2ae056404cde449783a1ec8ba798c36562Mikhail Glushenkov
129f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  return Parser.ParseFile();
130f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner}
131f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
132e62c1185bee05facc25d1d725434f517261d308bChris Lattnerint main(int argc, char **argv) {
133e62c1185bee05facc25d1d725434f517261d308bChris Lattner  cl::ParseCommandLineOptions(argc, argv);
134f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner
135f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  // Parse the input file.
136f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner  if (ParseFile(InputFilename, IncludeDirs))
137f460165a4c1bf4bc762f9b3f12b9ed284b89cc99Chris Lattner    return 1;
138e62c1185bee05facc25d1d725434f517261d308bChris Lattner
139f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling  std::ostream *Out = cout.stream();
1409a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner  if (OutputFilename != "-") {
14142df6d1396d0335621f648b0e4a6e59f13e868f2Chris Lattner    Out = new std::ofstream(OutputFilename.c_str());
1429a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner
1439a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner    if (!Out->good()) {
144f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling      cerr << argv[0] << ": error opening " << OutputFilename << "!\n";
1459a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner      return 1;
1469a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner    }
1479a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner
1489a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner    // Make sure the file gets removed if *gasp* tablegen crashes...
149227b6d00dd1faee07c921c7e2256e0fca737d2e5Reid Spencer    sys::RemoveFileOnSignal(sys::Path(OutputFilename));
1509a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner  }
1519a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner
1521d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner  try {
1531d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner    switch (Action) {
154accd8abeebfa73e0a4cb2d4372ecf42513561460Chris Lattner    case PrintRecords:
155accd8abeebfa73e0a4cb2d4372ecf42513561460Chris Lattner      *Out << Records;           // No argument, dump all contents
156accd8abeebfa73e0a4cb2d4372ecf42513561460Chris Lattner      break;
1571d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner    case GenEmitter:
1581d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      CodeEmitterGen(Records).run(*Out);
1591d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      break;
160169e66bfc23c20a3df7d0364f5f1abb43f33694bChris Lattner
16154d156d33324b7715453993f21684915a28e310aChris Lattner    case GenRegisterEnums:
16254d156d33324b7715453993f21684915a28e310aChris Lattner      RegisterInfoEmitter(Records).runEnums(*Out);
16354d156d33324b7715453993f21684915a28e310aChris Lattner      break;
1641d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner    case GenRegister:
1651d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      RegisterInfoEmitter(Records).run(*Out);
1661d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      break;
1671d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner    case GenRegisterHeader:
1681d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      RegisterInfoEmitter(Records).runHeader(*Out);
1691d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      break;
170169e66bfc23c20a3df7d0364f5f1abb43f33694bChris Lattner
171169e66bfc23c20a3df7d0364f5f1abb43f33694bChris Lattner    case GenInstrEnums:
1727b11712ef2d41631137a3c124a58407702ffa8afChris Lattner      InstrEnumEmitter(Records).run(*Out);
173169e66bfc23c20a3df7d0364f5f1abb43f33694bChris Lattner      break;
17415de32d706287e1457ab26b74d731f5367083b99Chris Lattner    case GenInstrs:
17515de32d706287e1457ab26b74d731f5367083b99Chris Lattner      InstrInfoEmitter(Records).run(*Out);
17615de32d706287e1457ab26b74d731f5367083b99Chris Lattner      break;
17750d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner    case GenCallingConv:
17850d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner      CallingConvEmitter(Records).run(*Out);
17950d456539dea5e61d7a1592a78f1861fb35b0063Chris Lattner      break;
1802e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner    case GenAsmWriter:
1812e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner      AsmWriterEmitter(Records).run(*Out);
1822e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner      break;
1832e1f51b8a583649d74cb666ca5e4cf680cc1ced9Chris Lattner
1844a24c645c8402dff59dbf20d5a422227a611e908Chris Lattner    case GenDAGISel:
1854a24c645c8402dff59dbf20d5a422227a611e908Chris Lattner      DAGISelEmitter(Records).run(*Out);
186f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey      break;
187b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman    case GenFastISel:
188b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman      FastISelEmitter(Records).run(*Out);
189b0cf29c5cfff797284b3660dc233e135feb65d9aDan Gohman      break;
190f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey    case GenSubtarget:
191f5fc2cbd6bcf80cc34c8114007f31d8ffd1d138dJim Laskey      SubtargetEmitter(Records).run(*Out);
1929e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner      break;
1939e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner    case GenIntrinsic:
1949e493cfcc32aee58e6750ce1efa52d5c3bc3f893Chris Lattner      IntrinsicEmitter(Records).run(*Out);
195ac67b7ea8fcd530995d7aefd2ad0f04543789855Anton Korobeynikov      break;
19649de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen    case GenTgtIntrinsic:
19749de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen      IntrinsicEmitter(Records, true).run(*Out);
19849de98214b82fefeb8f16efbf8cdd8813a85469bDale Johannesen      break;
199895820da243713e78ff3ee66ba54c4db4ee121acMikhail Glushenkov    case GenLLVMCConf:
200895820da243713e78ff3ee66ba54c4db4ee121acMikhail Glushenkov      LLVMCConfigurationEmitter(Records).run(*Out);
2013f781341f97da31bfee55bc221ff58b76e7a60dfChris Lattner      break;
2021d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner    case PrintEnums:
203d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke    {
2041d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      std::vector<Record*> Recs = Records.getAllDerivedDefinitions(Class);
2051d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      for (unsigned i = 0, e = Recs.size(); i != e; ++i)
2067b9ee51a55f7f16b54e9839d99841bc2fab71ebeChris Lattner        *Out << Recs[i]->getName() << ", ";
2071d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      *Out << "\n";
2081d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner      break;
209e62c1185bee05facc25d1d725434f517261d308bChris Lattner    }
210d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke    default:
211d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke      assert(1 && "Invalid Action");
212d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke      return 1;
213d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke    }
2141d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner  } catch (const std::string &Error) {
215f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling    cerr << argv[0] << ": " << Error << "\n";
216f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling    if (Out != cout.stream()) {
217f1e366acffbe4bdbb1d4a573c178f5531efdf7f8Chris Lattner      delete Out;                             // Close the file
218f1e366acffbe4bdbb1d4a573c178f5531efdf7f8Chris Lattner      std::remove(OutputFilename.c_str());    // Remove the file, it's broken
219f1e366acffbe4bdbb1d4a573c178f5531efdf7f8Chris Lattner    }
2201d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner    return 1;
221212e6983eb7f209d1308c2b489af7c483bda511eDan Gohman  } catch (const char *Error) {
222212e6983eb7f209d1308c2b489af7c483bda511eDan Gohman    cerr << argv[0] << ": " << Error << "\n";
223212e6983eb7f209d1308c2b489af7c483bda511eDan Gohman    if (Out != cout.stream()) {
224212e6983eb7f209d1308c2b489af7c483bda511eDan Gohman      delete Out;                             // Close the file
225212e6983eb7f209d1308c2b489af7c483bda511eDan Gohman      std::remove(OutputFilename.c_str());    // Remove the file, it's broken
226212e6983eb7f209d1308c2b489af7c483bda511eDan Gohman    }
227212e6983eb7f209d1308c2b489af7c483bda511eDan Gohman    return 1;
22823f7d5131cf9519b90ac4fc2d200671d128b5464Reid Spencer  } catch (...) {
229f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling    cerr << argv[0] << ": Unknown unexpected exception occurred.\n";
230f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling    if (Out != cout.stream()) {
23123f7d5131cf9519b90ac4fc2d200671d128b5464Reid Spencer      delete Out;                             // Close the file
23223f7d5131cf9519b90ac4fc2d200671d128b5464Reid Spencer      std::remove(OutputFilename.c_str());    // Remove the file, it's broken
23323f7d5131cf9519b90ac4fc2d200671d128b5464Reid Spencer    }
23423f7d5131cf9519b90ac4fc2d200671d128b5464Reid Spencer    return 2;
235e62c1185bee05facc25d1d725434f517261d308bChris Lattner  }
2369a886386a4067a2407a284c947bd1044b43e2b1bChris Lattner
237f5da13367f88f06e3b585dc2263ab6e9ca6c4bf8Bill Wendling  if (Out != cout.stream()) {
238e79c72d4cd68fce6ccb30b2cc222069619f7d503Chris Lattner    delete Out;                               // Close the file
239e79c72d4cd68fce6ccb30b2cc222069619f7d503Chris Lattner  }
2401d1adea4937aa5c7b4bd0aa0463fe38fcdd22c7eChris Lattner  return 0;
241e62c1185bee05facc25d1d725434f517261d308bChris Lattner}
242