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