[yaml2obj] Add new command line option -docnum.

Input YAML file might contain multiple object file definitions.
New option `-docnum` allows to specify an ordinal number (starting from 1)
of definition used for an object file generation.

Patch reviewed by Sean Silva.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209967 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Simon Atanasyan 2014-05-31 04:51:07 +00:00
parent 44c6354015
commit df96c562a5
8 changed files with 187 additions and 15 deletions

View File

@ -982,7 +982,7 @@ public:
// These are only used by operator>>. They could be private
// if those templated things could be made friends.
bool setCurrentDocument();
void nextDocument();
bool nextDocument();
private:
llvm::SourceMgr SrcMgr; // must be before Strm

View File

@ -90,8 +90,8 @@ bool Input::setCurrentDocument() {
return false;
}
void Input::nextDocument() {
++DocIterator;
bool Input::nextDocument() {
return ++DocIterator != Strm->end();
}
bool Input::mapTag(StringRef Tag, bool Default) {

View File

@ -0,0 +1,91 @@
# RUN: yaml2obj -format=coff -docnum=1 %s \
# RUN: | llvm-readobj -symbols - | FileCheck -check-prefix=DOC1 %s
# RUN: yaml2obj -format=coff -docnum=2 %s \
# RUN: | llvm-readobj -symbols - | FileCheck -check-prefix=DOC2 %s
# RUN: not yaml2obj -format=coff -docnum=3 %s 2>&1 \
# RUN: | FileCheck -check-prefix=DOC3 %s
# DOC1: Name: _sym1
# DOC2: Name: _sym2
# DOC3: yaml2obj: Cannot find the 3rd document
---
header:
Machine: IMAGE_FILE_MACHINE_I386
Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ]
sections:
- Name: .text
Alignment: 16
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE,
IMAGE_SCN_MEM_READ ]
SectionData: "00000000"
symbols:
- Name: .text
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 36
NumberOfRelocations: 3
NumberOfLinenumbers: 0
CheckSum: 0
Number: 1
- Name: _main
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: _sym1
Value: 0
SectionNumber: 0
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
---
header:
Machine: IMAGE_FILE_MACHINE_I386
Characteristics: [ IMAGE_FILE_DEBUG_STRIPPED ]
sections:
- Name: .text
Alignment: 16
Characteristics: [ IMAGE_SCN_CNT_CODE, IMAGE_SCN_MEM_EXECUTE,
IMAGE_SCN_MEM_READ ]
SectionData: "00000000"
symbols:
- Name: .text
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_STATIC
SectionDefinition:
Length: 36
NumberOfRelocations: 3
NumberOfLinenumbers: 0
CheckSum: 0
Number: 1
- Name: _main
Value: 0
SectionNumber: 1
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_FUNCTION
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
- Name: _sym2
Value: 0
SectionNumber: 0
SimpleType: IMAGE_SYM_TYPE_NULL
ComplexType: IMAGE_SYM_DTYPE_NULL
StorageClass: IMAGE_SYM_CLASS_EXTERNAL
...

View File

@ -0,0 +1,56 @@
# RUN: yaml2obj -format=elf -docnum=1 %s \
# RUN: | llvm-readobj -symbols - | FileCheck -check-prefix=DOC1 %s
# RUN: yaml2obj -format=elf -docnum=2 %s \
# RUN: | llvm-readobj -symbols - | FileCheck -check-prefix=DOC2 %s
# RUN: not yaml2obj -format=elf -docnum=3 %s 2>&1 \
# RUN: | FileCheck -check-prefix=DOC3 %s
# DOC1: Name: T1 (1)
# DOC2: Name: T2 (1)
# DOC3: yaml2obj: Cannot find the 3rd document
--- !ELF
FileHeader: !FileHeader
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_MIPS
Flags: [EF_MIPS_CPIC]
Sections:
- Name: .text
Type: SHT_PROGBITS
Content: "0000000000000000"
AddressAlign: 16
Flags: [SHF_EXECINSTR, SHF_ALLOC]
Symbols:
Global:
- Name: T1
Section: .text
Type: STT_FUNC
Value: 0x0
Size: 8
--- !ELF
FileHeader: !FileHeader
Class: ELFCLASS32
Data: ELFDATA2LSB
Type: ET_REL
Machine: EM_MIPS
Sections:
- Name: .text
Type: SHT_PROGBITS
Content: "00000000"
AddressAlign: 16
Flags: [SHF_EXECINSTR, SHF_ALLOC]
Symbols:
Global:
- Name: T2
Section: .text
Type: STT_FUNC
Value: 0x0
Size: 4
...

View File

@ -327,8 +327,7 @@ bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
return true;
}
int yaml2coff(llvm::raw_ostream &Out, llvm::MemoryBuffer *Buf) {
yaml::Input YIn(Buf->getBuffer());
int yaml2coff(yaml::Input &YIn, raw_ostream &Out) {
COFFYAML::Object Doc;
YIn >> Doc;
if (YIn.error()) {

View File

@ -467,8 +467,7 @@ static bool isLittleEndian(const ELFYAML::Object &Doc) {
return Doc.Header.Data == ELFYAML::ELF_ELFDATA(ELF::ELFDATA2LSB);
}
int yaml2elf(llvm::raw_ostream &Out, llvm::MemoryBuffer *Buf) {
yaml::Input YIn(Buf->getBuffer());
int yaml2elf(yaml::Input &YIn, raw_ostream &Out) {
ELFYAML::Object Doc;
YIn >> Doc;
if (YIn.error()) {

View File

@ -15,6 +15,7 @@
//===----------------------------------------------------------------------===//
#include "yaml2obj.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/ManagedStatic.h"
@ -24,6 +25,7 @@
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/system_error.h"
#include "llvm/Support/ToolOutputFile.h"
#include "llvm/Support/YAMLTraits.h"
using namespace llvm;
@ -51,9 +53,27 @@ cl::opt<YAMLObjectFormat> Format(
clEnumValN(YOF_ELF, "elf", "ELF object file format"),
clEnumValEnd));
cl::opt<unsigned>
DocNum("docnum", cl::init(1),
cl::desc("Read specified document from input (default = 1)"));
static cl::opt<std::string> OutputFilename("o", cl::desc("Output filename"),
cl::value_desc("filename"));
typedef int (*ConvertFuncPtr)(yaml::Input & YIn, raw_ostream &Out);
int convertYAML(yaml::Input & YIn, raw_ostream &Out, ConvertFuncPtr Convert) {
unsigned CurDocNum = 0;
do {
if (++CurDocNum == DocNum)
return Convert(YIn, Out);
} while (YIn.nextDocument());
errs() << "yaml2obj: Cannot find the " << DocNum
<< llvm::getOrdinalSuffix(DocNum) << " document\n";
return 1;
}
int main(int argc, char **argv) {
cl::ParseCommandLineOptions(argc, argv);
sys::PrintStackTraceOnErrorSignal();
@ -75,14 +95,19 @@ int main(int argc, char **argv) {
if (MemoryBuffer::getFileOrSTDIN(Input, Buf))
return 1;
int Res = 1;
ConvertFuncPtr Convert = nullptr;
if (Format == YOF_COFF)
Res = yaml2coff(Out->os(), Buf.get());
Convert = yaml2coff;
else if (Format == YOF_ELF)
Res = yaml2elf(Out->os(), Buf.get());
else
Convert = yaml2elf;
else {
errs() << "Not yet implemented\n";
return 1;
}
yaml::Input YIn(Buf->getBuffer());
int Res = convertYAML(YIn, Out->os(), Convert);
if (Res == 0)
Out->keep();

View File

@ -13,10 +13,12 @@
#define LLVM_TOOLS_YAML2OBJ_H
namespace llvm {
class raw_ostream;
class MemoryBuffer;
class raw_ostream;
namespace yaml {
class Input;
}
int yaml2coff(llvm::raw_ostream &Out, llvm::MemoryBuffer *Buf);
int yaml2elf(llvm::raw_ostream &Out, llvm::MemoryBuffer *Buf);
}
int yaml2coff(llvm::yaml::Input &YIn, llvm::raw_ostream &Out);
int yaml2elf(llvm::yaml::Input &YIn, llvm::raw_ostream &Out);
#endif