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