summaryrefslogtreecommitdiff
path: root/tools/llvm-mc/llvm-mc.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-07-28 20:47:52 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-07-28 20:47:52 +0000
commita2edbabcb86f213eca6daeda5d801f8c7b1e44b2 (patch)
tree39706b60d8a13250bebc838e11b961a4613b513f /tools/llvm-mc/llvm-mc.cpp
parentd2f79a13463f8797fbffa0e5d577c5bddc9126fb (diff)
downloadllvm-a2edbabcb86f213eca6daeda5d801f8c7b1e44b2.tar.gz
llvm-a2edbabcb86f213eca6daeda5d801f8c7b1e44b2.tar.bz2
llvm-a2edbabcb86f213eca6daeda5d801f8c7b1e44b2.tar.xz
Provide generic MCAsmParser when constructing target specific parsers.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77362 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvm-mc/llvm-mc.cpp')
-rw-r--r--tools/llvm-mc/llvm-mc.cpp34
1 files changed, 20 insertions, 14 deletions
diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp
index a64c8a6505..e148e35c2d 100644
--- a/tools/llvm-mc/llvm-mc.cpp
+++ b/tools/llvm-mc/llvm-mc.cpp
@@ -22,6 +22,7 @@
#include "llvm/Support/SourceMgr.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/System/Signals.h"
+#include "llvm/Target/TargetAsmParser.h"
#include "llvm/Target/TargetRegistry.h"
#include "llvm/Target/TargetSelect.h"
#include "AsmParser.h"
@@ -140,7 +141,8 @@ static int AsLexInput(const char *ProgName) {
return Error;
}
-static int AssembleInput(const char *ProgName) {
+static TargetAsmParser *GetTargetAsmParser(const char *ProgName,
+ MCAsmParser &Parser) {
// Get the target specific parser.
std::string Error;
const Target *TheTarget =
@@ -151,23 +153,24 @@ static int AssembleInput(const char *ProgName) {
if (TheTarget == 0) {
errs() << ProgName << ": error: unable to get target for '" << TripleName
<< "', see --version and --triple.\n";
- return 1;
+ return 0;
}
- TargetAsmParser *TAP = TheTarget->createAsmParser();
- if (!TAP) {
- errs() << ProgName
- << ": error: this target does not support assembly parsing.\n";
- return 1;
- }
+ if (TargetAsmParser *TAP = TheTarget->createAsmParser(Parser))
+ return TAP;
+
+ errs() << ProgName
+ << ": error: this target does not support assembly parsing.\n";
+ return 0;
+}
- std::string ErrorMessage;
- MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFilename,
- &ErrorMessage);
+static int AssembleInput(const char *ProgName) {
+ std::string Error;
+ MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFilename, &Error);
if (Buffer == 0) {
errs() << ProgName << ": ";
- if (ErrorMessage.size())
- errs() << ErrorMessage << "\n";
+ if (Error.size())
+ errs() << Error << "\n";
else
errs() << "input file didn't read correctly.\n";
return 1;
@@ -189,7 +192,10 @@ static int AssembleInput(const char *ProgName) {
Str.get()->SwitchSection(Ctx.GetSection("__TEXT,__text,"
"regular,pure_instructions"));
- AsmParser Parser(SrcMgr, Ctx, *Str.get(), *TAP);
+ AsmParser Parser(SrcMgr, Ctx, *Str.get());
+ OwningPtr<TargetAsmParser> TAP(GetTargetAsmParser(ProgName, Parser));
+ if (!TAP)
+ return 1;
return Parser.Run();
}