From 926273d496caccc5dbe239cc4987d7ada0d0ad5c Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Thu, 15 May 2014 16:14:02 +0000 Subject: [yaml2obj] Add "-o" command line option to specify an output file name. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208900 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/yaml2obj/yaml2elf.cpp | 8 ++++---- tools/yaml2obj/yaml2obj.cpp | 34 +++++++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 11 deletions(-) (limited to 'tools') diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index 1d2beda713..3190b27d32 100644 --- a/tools/yaml2obj/yaml2elf.cpp +++ b/tools/yaml2obj/yaml2elf.cpp @@ -477,13 +477,13 @@ int yaml2elf(llvm::raw_ostream &Out, llvm::MemoryBuffer *Buf) { typedef ELFType BE32; if (is64Bit(Doc)) { if (isLittleEndian(Doc)) - return ELFState::writeELF(outs(), Doc); + return ELFState::writeELF(Out, Doc); else - return ELFState::writeELF(outs(), Doc); + return ELFState::writeELF(Out, Doc); } else { if (isLittleEndian(Doc)) - return ELFState::writeELF(outs(), Doc); + return ELFState::writeELF(Out, Doc); else - return ELFState::writeELF(outs(), Doc); + return ELFState::writeELF(Out, Doc); } } diff --git a/tools/yaml2obj/yaml2obj.cpp b/tools/yaml2obj/yaml2obj.cpp index cc0fecc3c6..2493b48699 100644 --- a/tools/yaml2obj/yaml2obj.cpp +++ b/tools/yaml2obj/yaml2obj.cpp @@ -16,12 +16,14 @@ #include "yaml2obj.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/FileSystem.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/Signals.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Support/system_error.h" +#include "llvm/Support/ToolOutputFile.h" using namespace llvm; @@ -49,6 +51,8 @@ cl::opt Format( clEnumValN(YOF_ELF, "elf", "ELF object file format"), clEnumValEnd)); +static cl::opt OutputFilename("o", cl::desc("Output filename"), + cl::value_desc("filename")); int main(int argc, char **argv) { cl::ParseCommandLineOptions(argc, argv); @@ -56,15 +60,31 @@ int main(int argc, char **argv) { PrettyStackTraceProgram X(argc, argv); llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. + if (OutputFilename.empty()) + OutputFilename = "-"; + + std::string ErrorInfo; + std::unique_ptr Out( + new tool_output_file(OutputFilename.c_str(), ErrorInfo, sys::fs::F_None)); + if (!ErrorInfo.empty()) { + errs() << ErrorInfo << '\n'; + return 1; + } + std::unique_ptr Buf; if (MemoryBuffer::getFileOrSTDIN(Input, Buf)) return 1; - if (Format == YOF_COFF) { - return yaml2coff(outs(), Buf.get()); - } else if (Format == YOF_ELF) { - return yaml2elf(outs(), Buf.get()); - } else { + + int Res = 1; + if (Format == YOF_COFF) + Res = yaml2coff(Out->os(), Buf.get()); + else if (Format == YOF_ELF) + Res = yaml2elf(Out->os(), Buf.get()); + else errs() << "Not yet implemented\n"; - return 1; - } + + if (Res == 0) + Out->keep(); + + return Res; } -- cgit v1.2.3