llvm-mc.cpp revision b23677e076bea7c3bf4763ba14d8ee96faf8a74b
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
15f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner#include "llvm/Support/CommandLine.h"
16f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner#include "llvm/Support/ManagedStatic.h"
17f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner#include "llvm/Support/MemoryBuffer.h"
18f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner#include "llvm/Support/PrettyStackTrace.h"
19b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner#include "llvm/Support/SourceMgr.h"
20f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner#include "llvm/Support/raw_ostream.h"
21f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner#include "llvm/System/Signals.h"
22f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattnerusing namespace llvm;
23f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner
24f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattnerstatic cl::opt<std::string>
25f9f065e45500823cdeb25bde2154d871ab6e9125Chris LattnerInputFilename(cl::Positional, cl::desc("<input file>"), cl::init("-"));
26f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner
27f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattnerstatic cl::opt<std::string>
28f9f065e45500823cdeb25bde2154d871ab6e9125Chris LattnerOutputFilename("o", cl::desc("Output filename"),
29f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner               cl::value_desc("filename"));
30f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner
31b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattnerstatic cl::list<std::string>
32b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris LattnerIncludeDirs("I", cl::desc("Directory of include files"),
33b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner            cl::value_desc("directory"), cl::Prefix);
34f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner
35b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattnerenum ActionType {
36b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  AC_Assemble
37b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner};
38f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner
39b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattnerstatic cl::opt<ActionType>
40b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris LattnerAction(cl::desc("Action to perform:"),
41b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner       cl::values(clEnumValN(AC_Assemble, "assemble",
42b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner                             "Assemble a .s file (default)"),
43b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner                  clEnumValEnd));
44f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner
45b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattnerstatic int AssembleInput(const char *ProgName) {
46b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  std::string ErrorMessage;
47b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFilename,
48b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner                                                      &ErrorMessage);
49f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner  if (Buffer == 0) {
50b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner    errs() << ProgName << ": ";
51f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner    if (ErrorMessage.size())
52f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner      errs() << ErrorMessage << "\n";
53f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner    else
54f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner      errs() << "input file didn't read correctly.\n";
55f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner    return 1;
56f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner  }
57b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner
58b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  SourceMgr SrcMgr;
59b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner
60b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  // Tell SrcMgr about this buffer, which is what TGParser will pick up.
61b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  SrcMgr.AddNewSourceBuffer(Buffer, SMLoc());
62b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner
63b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  // Record the location of the include directories so that the lexer can find
64b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  // it later.
65b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  SrcMgr.setIncludeDirs(IncludeDirs);
66f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner
67b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  //TGParser Parser(SrcMgr);
68b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  //return Parser.ParseFile();
69f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner
70f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner
71b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  return 1;
72b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner}
73b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner
74b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner
75b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattnerint main(int argc, char **argv) {
76b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  // Print a stack trace if we signal out.
77b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  sys::PrintStackTraceOnErrorSignal();
78b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  PrettyStackTraceProgram X(argc, argv);
79b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  llvm_shutdown_obj Y;  // Call llvm_shutdown() on exit.
80b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  cl::ParseCommandLineOptions(argc, argv, "llvm machine code playground\n");
81b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner
82b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  switch (Action) {
83b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  default:
84b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  case AC_Assemble:
85b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner    return AssembleInput(argv[0]);
86b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner  }
87b23677e076bea7c3bf4763ba14d8ee96faf8a74bChris Lattner
88f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner  return 0;
89f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner}
90f9f065e45500823cdeb25bde2154d871ab6e9125Chris Lattner
91