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