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