diff options
Diffstat (limited to 'tools/llvm-mc/llvm-mc.cpp')
-rw-r--r-- | tools/llvm-mc/llvm-mc.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp index b52edd1ed4..c7f3996c97 100644 --- a/tools/llvm-mc/llvm-mc.cpp +++ b/tools/llvm-mc/llvm-mc.cpp @@ -22,6 +22,8 @@ #include "llvm/Support/SourceMgr.h" #include "llvm/Support/raw_ostream.h" #include "llvm/System/Signals.h" +#include "llvm/Target/TargetRegistry.h" +#include "llvm/Target/TargetSelect.h" #include "AsmParser.h" using namespace llvm; @@ -36,6 +38,11 @@ static cl::list<std::string> IncludeDirs("I", cl::desc("Directory of include files"), cl::value_desc("directory"), cl::Prefix); +static cl::opt<std::string> +Triple("triple", cl::desc("Target triple to assemble for," + "see -version for available targets"), + cl::init("")); + enum ActionType { AC_AsLex, AC_Assemble @@ -137,6 +144,23 @@ static int AsLexInput(const char *ProgName) { } static int AssembleInput(const char *ProgName) { + // Get the target specific parser. + std::string Error; + const Target *TheTarget = + TargetRegistry::getClosestStaticTargetForTriple(Triple, Error); + if (TheTarget == 0) { + errs() << ProgName << ": error: unable to get target for '" << Triple + << "', see --version and --triple.\n"; + return 1; + } + + TargetAsmParser *TAP = TheTarget->createAsmParser(); + if (!TAP) { + errs() << ProgName + << ": error: this target does not support assembly parsing.\n"; + return 1; + } + std::string ErrorMessage; MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFilename, &ErrorMessage); @@ -174,6 +198,11 @@ int main(int argc, char **argv) { sys::PrintStackTraceOnErrorSignal(); PrettyStackTraceProgram X(argc, argv); llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. + + // Initialize targets and assembly parsers. + llvm::InitializeAllTargetInfos(); + llvm::InitializeAllAsmParsers(); + cl::ParseCommandLineOptions(argc, argv, "llvm machine code playground\n"); switch (Action) { |