From 926273d496caccc5dbe239cc4987d7ada0d0ad5c Mon Sep 17 00:00:00 2001 From: Simon Atanasyan Date: Thu, 15 May 2014 16:14:02 +0000 Subject: [PATCH] [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 --- test/Object/yaml2obj-elf-section-basic.yaml | 3 ++ test/Object/yaml2obj-readobj.test | 3 ++ tools/yaml2obj/yaml2elf.cpp | 8 ++--- tools/yaml2obj/yaml2obj.cpp | 34 ++++++++++++++++----- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/test/Object/yaml2obj-elf-section-basic.yaml b/test/Object/yaml2obj-elf-section-basic.yaml index 7264b7a5761..7316b7f5bc7 100644 --- a/test/Object/yaml2obj-elf-section-basic.yaml +++ b/test/Object/yaml2obj-elf-section-basic.yaml @@ -1,4 +1,7 @@ # RUN: yaml2obj -format=elf %s | llvm-readobj -sections -section-data - | FileCheck %s +# RUN: yaml2obj -format=elf -o %t %s +# RUN: llvm-readobj -sections -section-data %t | FileCheck %s + !ELF FileHeader: Class: ELFCLASS64 diff --git a/test/Object/yaml2obj-readobj.test b/test/Object/yaml2obj-readobj.test index 3031f5ed31b..3bd0c6b0269 100644 --- a/test/Object/yaml2obj-readobj.test +++ b/test/Object/yaml2obj-readobj.test @@ -1,4 +1,7 @@ RUN: yaml2obj %p/Inputs/COFF/i386.yaml | llvm-readobj -file-headers -relocations -expand-relocs - | FileCheck %s --check-prefix COFF-I386 +RUN: yaml2obj -o %t %p/Inputs/COFF/i386.yaml +RUN: llvm-readobj -file-headers -relocations -expand-relocs %t \ +RUN: | FileCheck %s --check-prefix COFF-I386 // COFF-I386: Characteristics [ (0x200) // COFF-I386-NEXT: IMAGE_FILE_DEBUG_STRIPPED (0x200) diff --git a/tools/yaml2obj/yaml2elf.cpp b/tools/yaml2obj/yaml2elf.cpp index 1d2beda7136..3190b27d324 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 cc0fecc3c63..2493b486993 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; }