mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-24 12:19:53 +00:00
[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:
parent
44c6354015
commit
df96c562a5
@ -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
|
||||
|
@ -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) {
|
||||
|
91
test/Object/yaml2obj-coff-multi-doc.test
Normal file
91
test/Object/yaml2obj-coff-multi-doc.test
Normal 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
|
||||
...
|
56
test/Object/yaml2obj-elf-multi-doc.test
Normal file
56
test/Object/yaml2obj-elf-multi-doc.test
Normal 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
|
||||
...
|
@ -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()) {
|
||||
|
@ -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()) {
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user