mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-10 04:33:40 +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
|
// These are only used by operator>>. They could be private
|
||||||
// if those templated things could be made friends.
|
// if those templated things could be made friends.
|
||||||
bool setCurrentDocument();
|
bool setCurrentDocument();
|
||||||
void nextDocument();
|
bool nextDocument();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
llvm::SourceMgr SrcMgr; // must be before Strm
|
llvm::SourceMgr SrcMgr; // must be before Strm
|
||||||
|
@ -90,8 +90,8 @@ bool Input::setCurrentDocument() {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Input::nextDocument() {
|
bool Input::nextDocument() {
|
||||||
++DocIterator;
|
return ++DocIterator != Strm->end();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Input::mapTag(StringRef Tag, bool Default) {
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int yaml2coff(llvm::raw_ostream &Out, llvm::MemoryBuffer *Buf) {
|
int yaml2coff(yaml::Input &YIn, raw_ostream &Out) {
|
||||||
yaml::Input YIn(Buf->getBuffer());
|
|
||||||
COFFYAML::Object Doc;
|
COFFYAML::Object Doc;
|
||||||
YIn >> Doc;
|
YIn >> Doc;
|
||||||
if (YIn.error()) {
|
if (YIn.error()) {
|
||||||
|
@ -467,8 +467,7 @@ static bool isLittleEndian(const ELFYAML::Object &Doc) {
|
|||||||
return Doc.Header.Data == ELFYAML::ELF_ELFDATA(ELF::ELFDATA2LSB);
|
return Doc.Header.Data == ELFYAML::ELF_ELFDATA(ELF::ELFDATA2LSB);
|
||||||
}
|
}
|
||||||
|
|
||||||
int yaml2elf(llvm::raw_ostream &Out, llvm::MemoryBuffer *Buf) {
|
int yaml2elf(yaml::Input &YIn, raw_ostream &Out) {
|
||||||
yaml::Input YIn(Buf->getBuffer());
|
|
||||||
ELFYAML::Object Doc;
|
ELFYAML::Object Doc;
|
||||||
YIn >> Doc;
|
YIn >> Doc;
|
||||||
if (YIn.error()) {
|
if (YIn.error()) {
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "yaml2obj.h"
|
#include "yaml2obj.h"
|
||||||
|
#include "llvm/ADT/StringExtras.h"
|
||||||
#include "llvm/Support/CommandLine.h"
|
#include "llvm/Support/CommandLine.h"
|
||||||
#include "llvm/Support/FileSystem.h"
|
#include "llvm/Support/FileSystem.h"
|
||||||
#include "llvm/Support/ManagedStatic.h"
|
#include "llvm/Support/ManagedStatic.h"
|
||||||
@ -24,6 +25,7 @@
|
|||||||
#include "llvm/Support/raw_ostream.h"
|
#include "llvm/Support/raw_ostream.h"
|
||||||
#include "llvm/Support/system_error.h"
|
#include "llvm/Support/system_error.h"
|
||||||
#include "llvm/Support/ToolOutputFile.h"
|
#include "llvm/Support/ToolOutputFile.h"
|
||||||
|
#include "llvm/Support/YAMLTraits.h"
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
@ -51,9 +53,27 @@ cl::opt<YAMLObjectFormat> Format(
|
|||||||
clEnumValN(YOF_ELF, "elf", "ELF object file format"),
|
clEnumValN(YOF_ELF, "elf", "ELF object file format"),
|
||||||
clEnumValEnd));
|
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"),
|
static cl::opt<std::string> OutputFilename("o", cl::desc("Output filename"),
|
||||||
cl::value_desc("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) {
|
int main(int argc, char **argv) {
|
||||||
cl::ParseCommandLineOptions(argc, argv);
|
cl::ParseCommandLineOptions(argc, argv);
|
||||||
sys::PrintStackTraceOnErrorSignal();
|
sys::PrintStackTraceOnErrorSignal();
|
||||||
@ -75,14 +95,19 @@ int main(int argc, char **argv) {
|
|||||||
if (MemoryBuffer::getFileOrSTDIN(Input, Buf))
|
if (MemoryBuffer::getFileOrSTDIN(Input, Buf))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
int Res = 1;
|
ConvertFuncPtr Convert = nullptr;
|
||||||
if (Format == YOF_COFF)
|
if (Format == YOF_COFF)
|
||||||
Res = yaml2coff(Out->os(), Buf.get());
|
Convert = yaml2coff;
|
||||||
else if (Format == YOF_ELF)
|
else if (Format == YOF_ELF)
|
||||||
Res = yaml2elf(Out->os(), Buf.get());
|
Convert = yaml2elf;
|
||||||
else
|
else {
|
||||||
errs() << "Not yet implemented\n";
|
errs() << "Not yet implemented\n";
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
yaml::Input YIn(Buf->getBuffer());
|
||||||
|
|
||||||
|
int Res = convertYAML(YIn, Out->os(), Convert);
|
||||||
if (Res == 0)
|
if (Res == 0)
|
||||||
Out->keep();
|
Out->keep();
|
||||||
|
|
||||||
|
@ -13,10 +13,12 @@
|
|||||||
#define LLVM_TOOLS_YAML2OBJ_H
|
#define LLVM_TOOLS_YAML2OBJ_H
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
class raw_ostream;
|
class raw_ostream;
|
||||||
class MemoryBuffer;
|
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
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user