diff options
-rw-r--r-- | test/Object/yaml2obj-elf-section-basic.yaml | 3 | ||||
-rw-r--r-- | test/Object/yaml2obj-readobj.test | 3 | ||||
-rw-r--r-- | tools/yaml2obj/yaml2elf.cpp | 8 | ||||
-rw-r--r-- | 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<support::big, 4, false> BE32; if (is64Bit(Doc)) { if (isLittleEndian(Doc)) - return ELFState<LE64>::writeELF(outs(), Doc); + return ELFState<LE64>::writeELF(Out, Doc); else - return ELFState<BE64>::writeELF(outs(), Doc); + return ELFState<BE64>::writeELF(Out, Doc); } else { if (isLittleEndian(Doc)) - return ELFState<LE32>::writeELF(outs(), Doc); + return ELFState<LE32>::writeELF(Out, Doc); else - return ELFState<BE32>::writeELF(outs(), Doc); + return ELFState<BE32>::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<YAMLObjectFormat> Format( clEnumValN(YOF_ELF, "elf", "ELF object file format"), clEnumValEnd)); +static cl::opt<std::string> 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<tool_output_file> Out( + new tool_output_file(OutputFilename.c_str(), ErrorInfo, sys::fs::F_None)); + if (!ErrorInfo.empty()) { + errs() << ErrorInfo << '\n'; + return 1; + } + std::unique_ptr<MemoryBuffer> 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; } |