diff options
author | Jush Lu <jush.msn@gmail.com> | 2011-03-09 19:39:16 +0800 |
---|---|---|
committer | Jush Lu <jush.msn@gmail.com> | 2011-03-09 19:39:16 +0800 |
commit | b5530586d68bd25831a6796b5d3199cb0769a35c (patch) | |
tree | fac4a03b53b6a64b0c00f433e4d8b3c9f2bc67cd /tools/llvm-mc/llvm-mc.cpp | |
parent | b4e17c5bf4361bbdeced39aa071150d7fa9c3c10 (diff) | |
parent | d01f50f42ce60207ed6d27fb1778e456d83be06c (diff) | |
download | external_llvm-b5530586d68bd25831a6796b5d3199cb0769a35c.zip external_llvm-b5530586d68bd25831a6796b5d3199cb0769a35c.tar.gz external_llvm-b5530586d68bd25831a6796b5d3199cb0769a35c.tar.bz2 |
Merge upstream r127116
Diffstat (limited to 'tools/llvm-mc/llvm-mc.cpp')
-rw-r--r-- | tools/llvm-mc/llvm-mc.cpp | 82 |
1 files changed, 42 insertions, 40 deletions
diff --git a/tools/llvm-mc/llvm-mc.cpp b/tools/llvm-mc/llvm-mc.cpp index 67bb06b..2c22bed 100644 --- a/tools/llvm-mc/llvm-mc.cpp +++ b/tools/llvm-mc/llvm-mc.cpp @@ -24,6 +24,9 @@ #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetRegistry.h" #include "llvm/Target/SubtargetFeature.h" // FIXME. +#include "llvm/Target/TargetAsmInfo.h" // FIXME. +#include "llvm/Target/TargetLowering.h" // FIXME. +#include "llvm/Target/TargetLoweringObjectFile.h" // FIXME. #include "llvm/Target/TargetMachine.h" // FIXME. #include "llvm/Target/TargetSelect.h" #include "llvm/ADT/OwningPtr.h" @@ -35,8 +38,9 @@ #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/ToolOutputFile.h" -#include "llvm/System/Host.h" -#include "llvm/System/Signals.h" +#include "llvm/Support/Host.h" +#include "llvm/Support/Signals.h" +#include "llvm/Support/system_error.h" #include "Disassembler.h" using namespace llvm; @@ -65,6 +69,9 @@ static cl::opt<bool> RelaxAll("mc-relax-all", cl::desc("Relax all fixups")); static cl::opt<bool> +NoExecStack("mc-no-exec-stack", cl::desc("File doesn't need an exec stack")); + +static cl::opt<bool> EnableLogging("enable-api-logging", cl::desc("Enable MC API logging")); enum OutputFileType { @@ -164,17 +171,12 @@ static tool_output_file *GetOutputStream() { } static int AsLexInput(const char *ProgName) { - std::string ErrorMessage; - MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFilename, - &ErrorMessage); - if (Buffer == 0) { - errs() << ProgName << ": "; - if (ErrorMessage.size()) - errs() << ErrorMessage << "\n"; - else - errs() << "input file didn't read correctly.\n"; + OwningPtr<MemoryBuffer> BufferPtr; + if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputFilename, BufferPtr)) { + errs() << ProgName << ": " << ec.message() << '\n'; return 1; } + MemoryBuffer *Buffer = BufferPtr.take(); SourceMgr SrcMgr; @@ -282,16 +284,12 @@ static int AssembleInput(const char *ProgName) { if (!TheTarget) return 1; - std::string Error; - MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFilename, &Error); - if (Buffer == 0) { - errs() << ProgName << ": "; - if (Error.size()) - errs() << Error << "\n"; - else - errs() << "input file didn't read correctly.\n"; + OwningPtr<MemoryBuffer> BufferPtr; + if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputFilename, BufferPtr)) { + errs() << ProgName << ": " << ec.message() << '\n'; return 1; } + MemoryBuffer *Buffer = BufferPtr.take(); SourceMgr SrcMgr; @@ -306,8 +304,6 @@ static int AssembleInput(const char *ProgName) { llvm::OwningPtr<MCAsmInfo> MAI(TheTarget->createAsmInfo(TripleName)); assert(MAI && "Unable to create target asm info!"); - MCContext Ctx(*MAI); - // Package up features to be passed to target/subtarget std::string FeaturesStr; if (MCPU.size()) { @@ -329,6 +325,9 @@ static int AssembleInput(const char *ProgName) { return 1; } + const TargetAsmInfo *tai = new TargetAsmInfo(*TM); + MCContext Ctx(*MAI, tai); + OwningPtr<tool_output_file> Out(GetOutputStream()); if (!Out) return 1; @@ -336,15 +335,23 @@ static int AssembleInput(const char *ProgName) { formatted_raw_ostream FOS(Out->os()); OwningPtr<MCStreamer> Str; + const TargetLoweringObjectFile &TLOF = + TM->getTargetLowering()->getObjFileLowering(); + const_cast<TargetLoweringObjectFile&>(TLOF).Initialize(Ctx, *TM); + + // FIXME: There is a bit of code duplication with addPassesToEmitFile. if (FileType == OFT_AssemblyFile) { MCInstPrinter *IP = TheTarget->createMCInstPrinter(OutputAsmVariant, *MAI); MCCodeEmitter *CE = 0; - if (ShowEncoding) + TargetAsmBackend *TAB = 0; + if (ShowEncoding) { CE = TheTarget->createCodeEmitter(*TM, Ctx); - Str.reset(TheTarget->createAsmStreamer(Ctx, FOS, - TM->getTargetData()->isLittleEndian(), - /*asmverbose*/true, IP, CE, ShowInst)); + TAB = TheTarget->createAsmBackend(TripleName); + } + Str.reset(TheTarget->createAsmStreamer(Ctx, FOS, /*asmverbose*/true, + /*useLoc*/ true, IP, CE, TAB, + ShowInst)); } else if (FileType == OFT_Null) { Str.reset(createNullStreamer(Ctx)); } else { @@ -352,7 +359,8 @@ static int AssembleInput(const char *ProgName) { MCCodeEmitter *CE = TheTarget->createCodeEmitter(*TM, Ctx); TargetAsmBackend *TAB = TheTarget->createAsmBackend(TripleName); Str.reset(TheTarget->createObjectStreamer(TripleName, Ctx, *TAB, - FOS, CE, RelaxAll)); + FOS, CE, RelaxAll, + NoExecStack)); } if (EnableLogging) { @@ -383,18 +391,10 @@ static int DisassembleInput(const char *ProgName, bool Enhanced) { const Target *TheTarget = GetTarget(ProgName); if (!TheTarget) return 0; - - std::string ErrorMessage; - - MemoryBuffer *Buffer = MemoryBuffer::getFileOrSTDIN(InputFilename, - &ErrorMessage); - - if (Buffer == 0) { - errs() << ProgName << ": "; - if (ErrorMessage.size()) - errs() << ErrorMessage << "\n"; - else - errs() << "input file didn't read correctly.\n"; + + OwningPtr<MemoryBuffer> Buffer; + if (error_code ec = MemoryBuffer::getFileOrSTDIN(InputFilename, Buffer)) { + errs() << ProgName << ": " << ec.message() << '\n'; return 1; } @@ -404,9 +404,11 @@ static int DisassembleInput(const char *ProgName, bool Enhanced) { int Res; if (Enhanced) - Res = Disassembler::disassembleEnhanced(TripleName, *Buffer, Out->os()); + Res = + Disassembler::disassembleEnhanced(TripleName, *Buffer.take(), Out->os()); else - Res = Disassembler::disassemble(*TheTarget, TripleName, *Buffer, Out->os()); + Res = Disassembler::disassemble(*TheTarget, TripleName, + *Buffer.take(), Out->os()); // Keep output if no errors. if (Res == 0) Out->keep(); |