llvm-mc.cpp revision b4b53e5c13167925d6315a6f57c7b863e4e2b704
1bb4688a9cf385ccada90ebeb04b3ba5827bf213dChris Lattner//===-- llvm-mc.cpp - Machine Code Hacking Driver -------------------------===// 2f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner// 3f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner// The LLVM Compiler Infrastructure 4f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner// 5f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner// This file is distributed under the University of Illinois Open Source 6f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner// License. See LICENSE.TXT for details. 7f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner// 8f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner//===----------------------------------------------------------------------===// 9f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner// 10bb4688a9cf385ccada90ebeb04b3ba5827bf213dChris Lattner// This utility is a simple driver that allows command line hacking on machine 11bb4688a9cf385ccada90ebeb04b3ba5827bf213dChris Lattner// code. 12f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner// 13f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner//===----------------------------------------------------------------------===// 14f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner 15cbc23f75cd8cd6889fd02f65b63f6c02512460bdChris Lattner#include "llvm/MC/MCContext.h" 16cbc23f75cd8cd6889fd02f65b63f6c02512460bdChris Lattner#include "llvm/MC/MCStreamer.h" 17cbc23f75cd8cd6889fd02f65b63f6c02512460bdChris Lattner#include "llvm/ADT/OwningPtr.h" 18f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner#include "llvm/Support/CommandLine.h" 19f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner#include "llvm/Support/ManagedStatic.h" 20f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner#include "llvm/Support/MemoryBuffer.h" 21f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner#include "llvm/Support/PrettyStackTrace.h" 22b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner#include "llvm/Support/SourceMgr.h" 23f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner#include "llvm/Support/raw_ostream.h" 24f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner#include "llvm/System/Signals.h" 25b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar#include "llvm/Target/TargetRegistry.h" 26b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar#include "llvm/Target/TargetSelect.h" 2727aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner#include "AsmParser.h" 28f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattnerusing namespace llvm; 29f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner 30f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattnerstatic cl::opt<std::string> 31f9f065e45500823cdeb25bde2154d871ab6e9125Chris LattnerInputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-")); 32f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner 33f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattnerstatic cl::opt<std::string> 34f9f065e45500823cdeb25bde2154d871ab6e9125Chris LattnerOutputFilename("o", cl::desc("Output filename"), 35f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner cl::value_desc("filename")); 36f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner 37b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattnerstatic cl::list<std::string> 38b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris LattnerIncludeDirs("I", cl::desc("Directory of include files"), 39b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner cl::value_desc("directory"), cl::Prefix); 40f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner 41b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbarstatic cl::opt<std::string> 42b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel DunbarTriple("triple", cl::desc("Target triple to assemble for," 43b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar "see -version for available targets"), 44b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar cl::init("")); 45b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar 46b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattnerenum ActionType { 4727aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner AC_AsLex, 48b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner AC_Assemble 49b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner}; 50f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner 51b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattnerstatic cl::opt<ActionType> 52b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris LattnerAction(cl::desc("Action to perform:"), 5327aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner cl::init(AC_Assemble), 5427aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner cl::values(clEnumValN(AC_AsLex, "as-lex", 5527aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner "Lex tokens from a .s file"), 5627aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner clEnumValN(AC_Assemble, "assemble", 57b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner "Assemble a .s file (default)"), 58b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner clEnumValEnd)); 59f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner 6027aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattnerstatic int AsLexInput(const char *ProgName) { 61b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner std::string ErrorMessage; 62b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFilename, 63b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner &ErrorMessage); 64f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner if (Buffer == 0) { 65b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner errs() << ProgName << ": "; 66f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner if (ErrorMessage.size()) 67f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner errs() << ErrorMessage << "\n"; 68f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner else 69f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner errs() << "input file didn't read correctly.\n"; 70f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner return 1; 71f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner } 72b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner 73b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner SourceMgr SrcMgr; 74b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner 75b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner // Tell SrcMgr about this buffer, which is what TGParser will pick up. 76b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); 77b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner 78b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner // Record the location of the include directories so that the lexer can find 79b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner // it later. 80b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner SrcMgr.setIncludeDirs(IncludeDirs); 81a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner 82a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner AsmLexer Lexer(SrcMgr); 83f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner 8427aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner bool Error = false; 8527aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner 86a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner asmtok::TokKind Tok = Lexer.Lex(); 87a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner while (Tok != asmtok::Eof) { 88a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner switch (Tok) { 8927aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner default: 903fb7683bec8c8edb24e80c95f3b0668c6ecc0ae6Daniel Dunbar Lexer.PrintMessage(Lexer.getLoc(), "unknown token", "warning"); 9127aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner Error = true; 9227aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner break; 934651bca31bdad27184fa0d36640bf5ef1d83cf5cChris Lattner case asmtok::Error: 9427aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner Error = true; // error already printed. 954651bca31bdad27184fa0d36640bf5ef1d83cf5cChris Lattner break; 96a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner case asmtok::Identifier: 97a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner outs() << "identifier: " << Lexer.getCurStrVal() << '\n'; 98a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner break; 994651bca31bdad27184fa0d36640bf5ef1d83cf5cChris Lattner case asmtok::Register: 1004651bca31bdad27184fa0d36640bf5ef1d83cf5cChris Lattner outs() << "register: " << Lexer.getCurStrVal() << '\n'; 1014651bca31bdad27184fa0d36640bf5ef1d83cf5cChris Lattner break; 10210a907d70fb54c40eecabb889e81c79b44092221Chris Lattner case asmtok::String: 10310a907d70fb54c40eecabb889e81c79b44092221Chris Lattner outs() << "string: " << Lexer.getCurStrVal() << '\n'; 10410a907d70fb54c40eecabb889e81c79b44092221Chris Lattner break; 105a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner case asmtok::IntVal: 106a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner outs() << "int: " << Lexer.getCurIntVal() << '\n'; 107a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner break; 108165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar 109165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::Amp: outs() << "Amp\n"; break; 110165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::AmpAmp: outs() << "AmpAmp\n"; break; 111165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::Caret: outs() << "Caret\n"; break; 11287380cb0e0d6157b8845d59a50bc2ba94a38ebd1Chris Lattner case asmtok::Colon: outs() << "Colon\n"; break; 11387380cb0e0d6157b8845d59a50bc2ba94a38ebd1Chris Lattner case asmtok::Comma: outs() << "Comma\n"; break; 11487380cb0e0d6157b8845d59a50bc2ba94a38ebd1Chris Lattner case asmtok::Dollar: outs() << "Dollar\n"; break; 115165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::EndOfStatement: outs() << "EndOfStatement\n"; break; 116165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::Eof: outs() << "Eof\n"; break; 11787380cb0e0d6157b8845d59a50bc2ba94a38ebd1Chris Lattner case asmtok::Equal: outs() << "Equal\n"; break; 11887380cb0e0d6157b8845d59a50bc2ba94a38ebd1Chris Lattner case asmtok::EqualEqual: outs() << "EqualEqual\n"; break; 119165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::Exclaim: outs() << "Exclaim\n"; break; 120165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::ExclaimEqual: outs() << "ExclaimEqual\n"; break; 121165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::Greater: outs() << "Greater\n"; break; 122165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::GreaterEqual: outs() << "GreaterEqual\n"; break; 123165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::GreaterGreater: outs() << "GreaterGreater\n"; break; 124165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::LParen: outs() << "LParen\n"; break; 125165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::Less: outs() << "Less\n"; break; 126165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::LessEqual: outs() << "LessEqual\n"; break; 127165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::LessGreater: outs() << "LessGreater\n"; break; 128165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::LessLess: outs() << "LessLess\n"; break; 129165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::Minus: outs() << "Minus\n"; break; 130165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::Percent: outs() << "Percent\n"; break; 13187380cb0e0d6157b8845d59a50bc2ba94a38ebd1Chris Lattner case asmtok::Pipe: outs() << "Pipe\n"; break; 13287380cb0e0d6157b8845d59a50bc2ba94a38ebd1Chris Lattner case asmtok::PipePipe: outs() << "PipePipe\n"; break; 133165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::Plus: outs() << "Plus\n"; break; 134165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::RParen: outs() << "RParen\n"; break; 135165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::Slash: outs() << "Slash\n"; break; 136165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::Star: outs() << "Star\n"; break; 137165e8344d833147268810bbec18276dafe0122b9Daniel Dunbar case asmtok::Tilde: outs() << "Tilde\n"; break; 138a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner } 139a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner 140a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner Tok = Lexer.Lex(); 141a59e8779964992457ada1af6a5f48068523cfd42Chris Lattner } 142f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner 14327aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner return Error; 144b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner} 145b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner 14627aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattnerstatic int AssembleInput(const char *ProgName) { 147b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar // Get the target specific parser. 148b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar std::string Error; 149b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar const Target *TheTarget = 150b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar TargetRegistry::getClosestStaticTargetForTriple(Triple, Error); 151b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar if (TheTarget == 0) { 152b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar errs() << ProgName << ": error: unable to get target for '" << Triple 153b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar << "', see --version and --triple.\n"; 154b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar return 1; 155b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar } 156b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar 157b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar TargetAsmParser *TAP = TheTarget->createAsmParser(); 158b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar if (!TAP) { 159b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar errs() << ProgName 160b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar << ": error: this target does not support assembly parsing.\n"; 161b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar return 1; 162b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar } 163b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar 16427aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner std::string ErrorMessage; 16527aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFilename, 16627aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner &ErrorMessage); 16727aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner if (Buffer == 0) { 16827aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner errs() << ProgName << ": "; 16927aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner if (ErrorMessage.size()) 17027aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner errs() << ErrorMessage << "\n"; 17127aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner else 17227aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner errs() << "input file didn't read correctly.\n"; 17327aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner return 1; 17427aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner } 17527aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner 17627aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner SourceMgr SrcMgr; 17727aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner 17827aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner // Tell SrcMgr about this buffer, which is what TGParser will pick up. 17927aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner SrcMgr.AddNewSourceBuffer(Buffer, SMLoc()); 18027aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner 18127aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner // Record the location of the include directories so that the lexer can find 18227aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner // it later. 18327aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner SrcMgr.setIncludeDirs(IncludeDirs); 18427aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner 185cbc23f75cd8cd6889fd02f65b63f6c02512460bdChris Lattner MCContext Ctx; 186cbc23f75cd8cd6889fd02f65b63f6c02512460bdChris Lattner OwningPtr<MCStreamer> Str(createAsmStreamer(Ctx, outs())); 187a0d1426af0bd05e1ae69481cdb75d2913e7e1ac1Daniel Dunbar 188a0d1426af0bd05e1ae69481cdb75d2913e7e1ac1Daniel Dunbar // FIXME: Target hook & command line option for initial section. 189a0d1426af0bd05e1ae69481cdb75d2913e7e1ac1Daniel Dunbar Str.get()->SwitchSection(Ctx.GetSection("__TEXT,__text,regular,pure_instructions")); 190a0d1426af0bd05e1ae69481cdb75d2913e7e1ac1Daniel Dunbar 191c69485e34d57e17fe2c3acab64e519d6a6945197Chris Lattner AsmParser Parser(SrcMgr, Ctx, *Str.get()); 19227aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner return Parser.Run(); 19327aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner} 19427aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner 195b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner 196b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattnerint main(int argc, char **argv) { 197b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner // Print a stack trace if we signal out. 198b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner sys::PrintStackTraceOnErrorSignal(); 199b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner PrettyStackTraceProgram X(argc, argv); 200b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. 201b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar 202b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar // Initialize targets and assembly parsers. 203b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar llvm::InitializeAllTargetInfos(); 204b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar llvm::InitializeAllAsmParsers(); 205b4b53e5c13167925d6315a6f57c7b863e4e2b704Daniel Dunbar 206b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner cl::ParseCommandLineOptions(argc, argv, "llvm machine code playground\n"); 207b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner 208b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner switch (Action) { 209b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner default: 21027aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner case AC_AsLex: 21127aa7d259b416a9d1bf837ed2c3c11463367b11cChris Lattner return AsLexInput(argv[0]); 212b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner case AC_Assemble: 213b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner return AssembleInput(argv[0]); 214b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner } 215b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner 216f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner return 0; 217f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner} 218f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner 219