Skip to content

Commit 3cfeaa4

Browse files
committed
[yaml2obj] Move core yaml2obj code into lib and include for use in unit tests
Reviewers: jhenderson, rupprecht, MaskRay, grimar, labath Reviewed By: rupprecht Subscribers: seiya, mgorny, sbc100, hiraditya, aheejin, jakehehrlich, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D65255 llvm-svn: 368021
1 parent 4e79097 commit 3cfeaa4

File tree

16 files changed

+290
-149
lines changed

16 files changed

+290
-149
lines changed

llvm/tools/yaml2obj/yaml2obj.h renamed to llvm/include/llvm/ObjectYAML/yaml2obj.h

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,18 @@
1111
#ifndef LLVM_TOOLS_YAML2OBJ_YAML2OBJ_H
1212
#define LLVM_TOOLS_YAML2OBJ_YAML2OBJ_H
1313

14+
#include "llvm/ADT/StringRef.h"
15+
#include "llvm/Support/Error.h"
16+
#include <memory>
17+
1418
namespace llvm {
1519
class raw_ostream;
20+
template <typename T> class SmallVectorImpl;
21+
template <typename T> class Expected;
22+
23+
namespace object {
24+
class ObjectFile;
25+
}
1626

1727
namespace COFFYAML {
1828
struct Object;
@@ -33,13 +43,20 @@ struct Object;
3343
namespace yaml {
3444
class Input;
3545
struct YamlObjectFile;
36-
}
37-
}
3846

39-
int yaml2coff(llvm::COFFYAML::Object &Doc, llvm::raw_ostream &Out);
40-
int yaml2elf(llvm::ELFYAML::Object &Doc, llvm::raw_ostream &Out);
41-
int yaml2macho(llvm::yaml::YamlObjectFile &Doc, llvm::raw_ostream &Out);
42-
int yaml2minidump(llvm::MinidumpYAML::Object &Doc, llvm::raw_ostream &Out);
43-
int yaml2wasm(llvm::WasmYAML::Object &Doc, llvm::raw_ostream &Out);
47+
int yaml2coff(COFFYAML::Object &Doc, raw_ostream &Out);
48+
int yaml2elf(ELFYAML::Object &Doc, raw_ostream &Out);
49+
int yaml2macho(YamlObjectFile &Doc, raw_ostream &Out);
50+
int yaml2minidump(MinidumpYAML::Object &Doc, raw_ostream &Out);
51+
int yaml2wasm(WasmYAML::Object &Doc, raw_ostream &Out);
52+
53+
Error convertYAML(Input &YIn, raw_ostream &Out, unsigned DocNum = 1);
54+
55+
/// Convenience function for tests.
56+
Expected<std::unique_ptr<object::ObjectFile>>
57+
yaml2ObjectFile(SmallVectorImpl<char> &Storage, StringRef Yaml);
58+
59+
} // namespace yaml
60+
} // namespace llvm
4461

4562
#endif

llvm/lib/ObjectYAML/CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,24 @@ add_llvm_library(LLVMObjectYAML
33
CodeViewYAMLSymbols.cpp
44
CodeViewYAMLTypeHashing.cpp
55
CodeViewYAMLTypes.cpp
6+
COFFEmitter.cpp
67
COFFYAML.cpp
78
DWARFEmitter.cpp
89
DWARFVisitor.cpp
910
DWARFYAML.cpp
11+
ELFEmitter.cpp
1012
ELFYAML.cpp
13+
MachOEmitter.cpp
1114
MachOYAML.cpp
1215
ObjectYAML.cpp
16+
MinidumpEmitter.cpp
1317
MinidumpYAML.cpp
18+
WasmEmitter.cpp
1419
WasmYAML.cpp
1520
XCOFFYAML.cpp
1621
YAML.cpp
22+
yaml2obj.cpp
23+
24+
ADDITIONAL_HEADER_DIRS
25+
${LLVM_MAIN_INCLUDE_DIR}/llvm/ObjectYAML
1726
)

llvm/tools/yaml2obj/yaml2coff.cpp renamed to llvm/lib/ObjectYAML/COFFEmitter.cpp

Lines changed: 44 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
///
1212
//===----------------------------------------------------------------------===//
1313

14-
#include "yaml2obj.h"
1514
#include "llvm/ADT/STLExtras.h"
1615
#include "llvm/ADT/StringExtras.h"
1716
#include "llvm/ADT/StringMap.h"
@@ -20,6 +19,7 @@
2019
#include "llvm/DebugInfo/CodeView/StringsAndChecksums.h"
2120
#include "llvm/Object/COFF.h"
2221
#include "llvm/ObjectYAML/ObjectYAML.h"
22+
#include "llvm/ObjectYAML/yaml2obj.h"
2323
#include "llvm/Support/Endian.h"
2424
#include "llvm/Support/MemoryBuffer.h"
2525
#include "llvm/Support/SourceMgr.h"
@@ -29,6 +29,8 @@
2929

3030
using namespace llvm;
3131

32+
namespace {
33+
3234
/// This parses a yaml stream that represents a COFF object file.
3335
/// See docs/yaml2obj for the yaml scheema.
3436
struct COFFParser {
@@ -64,7 +66,8 @@ struct COFFParser {
6466

6567
bool parseSections() {
6668
for (std::vector<COFFYAML::Section>::iterator i = Obj.Sections.begin(),
67-
e = Obj.Sections.end(); i != e; ++i) {
69+
e = Obj.Sections.end();
70+
i != e; ++i) {
6871
COFFYAML::Section &Sec = *i;
6972

7073
// If the name is less than 8 bytes, store it in place, otherwise
@@ -102,7 +105,8 @@ struct COFFParser {
102105

103106
bool parseSymbols() {
104107
for (std::vector<COFFYAML::Symbol>::iterator i = Obj.Symbols.begin(),
105-
e = Obj.Symbols.end(); i != e; ++i) {
108+
e = Obj.Symbols.end();
109+
i != e; ++i) {
106110
COFFYAML::Symbol &Sym = *i;
107111

108112
// If the name is less than 8 bytes, store it in place, otherwise
@@ -113,8 +117,8 @@ struct COFFParser {
113117
} else {
114118
// Add string to the string table and format the index for output.
115119
unsigned Index = getStringIndex(Name);
116-
*reinterpret_cast<support::aligned_ulittle32_t*>(
117-
Sym.Header.Name + 4) = Index;
120+
*reinterpret_cast<support::aligned_ulittle32_t *>(Sym.Header.Name + 4) =
121+
Index;
118122
}
119123

120124
Sym.Header.Type = Sym.SimpleType;
@@ -153,6 +157,10 @@ struct COFFParser {
153157
uint32_t SectionTableSize;
154158
};
155159

160+
enum { DOSStubSize = 128 };
161+
162+
} // end anonymous namespace
163+
156164
// Take a CP and assign addresses and sizes to everything. Returns false if the
157165
// layout is not valid to do.
158166
static bool layoutOptionalHeader(COFFParser &CP) {
@@ -166,10 +174,6 @@ static bool layoutOptionalHeader(COFFParser &CP) {
166174
return true;
167175
}
168176

169-
namespace {
170-
enum { DOSStubSize = 128 };
171-
}
172-
173177
static yaml::BinaryRef
174178
toDebugS(ArrayRef<CodeViewYAML::YAMLDebugSubsection> Subsections,
175179
const codeview::StringsAndChecksums &SC, BumpPtrAllocator &Allocator) {
@@ -271,7 +275,7 @@ static bool layoutCOFF(COFFParser &CP) {
271275
uint32_t NumberOfSymbols = 0;
272276
for (std::vector<COFFYAML::Symbol>::iterator i = CP.Obj.Symbols.begin(),
273277
e = CP.Obj.Symbols.end();
274-
i != e; ++i) {
278+
i != e; ++i) {
275279
uint32_t NumberOfAuxSymbols = 0;
276280
if (i->FunctionDefinition)
277281
NumberOfAuxSymbols += 1;
@@ -298,24 +302,23 @@ static bool layoutCOFF(COFFParser &CP) {
298302
else
299303
CP.Obj.Header.PointerToSymbolTable = 0;
300304

301-
*reinterpret_cast<support::ulittle32_t *>(&CP.StringTable[0])
302-
= CP.StringTable.size();
305+
*reinterpret_cast<support::ulittle32_t *>(&CP.StringTable[0]) =
306+
CP.StringTable.size();
303307

304308
return true;
305309
}
306310

307-
template <typename value_type>
308-
struct binary_le_impl {
311+
template <typename value_type> struct binary_le_impl {
309312
value_type Value;
310313
binary_le_impl(value_type V) : Value(V) {}
311314
};
312315

313316
template <typename value_type>
314-
raw_ostream &operator <<( raw_ostream &OS
315-
, const binary_le_impl<value_type> &BLE) {
317+
raw_ostream &operator<<(raw_ostream &OS,
318+
const binary_le_impl<value_type> &BLE) {
316319
char Buffer[sizeof(BLE.Value)];
317320
support::endian::write<value_type, support::little, support::unaligned>(
318-
Buffer, BLE.Value);
321+
Buffer, BLE.Value);
319322
OS.write(Buffer, sizeof(BLE.Value));
320323
return OS;
321324
}
@@ -335,13 +338,13 @@ raw_ostream &operator<<(raw_ostream &OS, const zeros_impl<NumBytes> &) {
335338
return OS;
336339
}
337340

338-
template <typename T>
339-
zeros_impl<sizeof(T)> zeros(const T &) {
341+
template <typename T> zeros_impl<sizeof(T)> zeros(const T &) {
340342
return zeros_impl<sizeof(T)>();
341343
}
342344

343345
template <typename T>
344-
static uint32_t initializeOptionalHeader(COFFParser &CP, uint16_t Magic, T Header) {
346+
static uint32_t initializeOptionalHeader(COFFParser &CP, uint16_t Magic,
347+
T Header) {
345348
memset(Header, 0, sizeof(*Header));
346349
Header->Magic = Magic;
347350
Header->SectionAlignment = CP.Obj.OptionalHeader->Header.SectionAlignment;
@@ -376,10 +379,8 @@ static uint32_t initializeOptionalHeader(COFFParser &CP, uint16_t Magic, T Heade
376379
CP.Obj.OptionalHeader->Header.MajorOperatingSystemVersion;
377380
Header->MinorOperatingSystemVersion =
378381
CP.Obj.OptionalHeader->Header.MinorOperatingSystemVersion;
379-
Header->MajorImageVersion =
380-
CP.Obj.OptionalHeader->Header.MajorImageVersion;
381-
Header->MinorImageVersion =
382-
CP.Obj.OptionalHeader->Header.MinorImageVersion;
382+
Header->MajorImageVersion = CP.Obj.OptionalHeader->Header.MajorImageVersion;
383+
Header->MinorImageVersion = CP.Obj.OptionalHeader->Header.MinorImageVersion;
383384
Header->MajorSubsystemVersion =
384385
CP.Obj.OptionalHeader->Header.MajorSubsystemVersion;
385386
Header->MinorSubsystemVersion =
@@ -423,15 +424,13 @@ static bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
423424
if (CP.useBigObj()) {
424425
OS << binary_le(static_cast<uint16_t>(COFF::IMAGE_FILE_MACHINE_UNKNOWN))
425426
<< binary_le(static_cast<uint16_t>(0xffff))
426-
<< binary_le(static_cast<uint16_t>(COFF::BigObjHeader::MinBigObjectVersion))
427+
<< binary_le(
428+
static_cast<uint16_t>(COFF::BigObjHeader::MinBigObjectVersion))
427429
<< binary_le(CP.Obj.Header.Machine)
428430
<< binary_le(CP.Obj.Header.TimeDateStamp);
429431
OS.write(COFF::BigObjMagic, sizeof(COFF::BigObjMagic));
430-
OS << zeros(uint32_t(0))
431-
<< zeros(uint32_t(0))
432-
<< zeros(uint32_t(0))
433-
<< zeros(uint32_t(0))
434-
<< binary_le(CP.Obj.Header.NumberOfSections)
432+
OS << zeros(uint32_t(0)) << zeros(uint32_t(0)) << zeros(uint32_t(0))
433+
<< zeros(uint32_t(0)) << binary_le(CP.Obj.Header.NumberOfSections)
435434
<< binary_le(CP.Obj.Header.PointerToSymbolTable)
436435
<< binary_le(CP.Obj.Header.NumberOfSymbols);
437436
} else {
@@ -450,7 +449,8 @@ static bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
450449
OS.write(reinterpret_cast<char *>(&PEH), sizeof(PEH));
451450
} else {
452451
object::pe32_header PEH;
453-
uint32_t BaseOfData = initializeOptionalHeader(CP, COFF::PE32Header::PE32, &PEH);
452+
uint32_t BaseOfData =
453+
initializeOptionalHeader(CP, COFF::PE32Header::PE32, &PEH);
454454
PEH.BaseOfData = BaseOfData;
455455
OS.write(reinterpret_cast<char *>(&PEH), sizeof(PEH));
456456
}
@@ -472,7 +472,7 @@ static bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
472472
// Output section table.
473473
for (std::vector<COFFYAML::Section>::iterator i = CP.Obj.Sections.begin(),
474474
e = CP.Obj.Sections.end();
475-
i != e; ++i) {
475+
i != e; ++i) {
476476
OS.write(i->Header.Name, COFF::NameSize);
477477
OS << binary_le(i->Header.VirtualSize)
478478
<< binary_le(i->Header.VirtualAddress)
@@ -514,8 +514,7 @@ static bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
514514
} else {
515515
SymbolTableIndex = SymbolTableIndexMap[R.SymbolName];
516516
}
517-
OS << binary_le(R.VirtualAddress)
518-
<< binary_le(SymbolTableIndex)
517+
OS << binary_le(R.VirtualAddress) << binary_le(SymbolTableIndex)
519518
<< binary_le(R.Type);
520519
}
521520
}
@@ -524,15 +523,14 @@ static bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
524523

525524
for (std::vector<COFFYAML::Symbol>::const_iterator i = CP.Obj.Symbols.begin(),
526525
e = CP.Obj.Symbols.end();
527-
i != e; ++i) {
526+
i != e; ++i) {
528527
OS.write(i->Header.Name, COFF::NameSize);
529528
OS << binary_le(i->Header.Value);
530529
if (CP.useBigObj())
531-
OS << binary_le(i->Header.SectionNumber);
530+
OS << binary_le(i->Header.SectionNumber);
532531
else
533-
OS << binary_le(static_cast<int16_t>(i->Header.SectionNumber));
534-
OS << binary_le(i->Header.Type)
535-
<< binary_le(i->Header.StorageClass)
532+
OS << binary_le(static_cast<int16_t>(i->Header.SectionNumber));
533+
OS << binary_le(i->Header.Type) << binary_le(i->Header.StorageClass)
536534
<< binary_le(i->Header.NumberOfAuxSymbols);
537535

538536
if (i->FunctionDefinition) {
@@ -578,8 +576,7 @@ static bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
578576
OS.write_zeros(CP.getSymbolSize() - COFF::Symbol16Size);
579577
}
580578
if (i->CLRToken) {
581-
OS << binary_le(i->CLRToken->AuxType)
582-
<< zeros(i->CLRToken->unused1)
579+
OS << binary_le(i->CLRToken->AuxType) << zeros(i->CLRToken->unused1)
583580
<< binary_le(i->CLRToken->SymbolTableIndex)
584581
<< zeros(i->CLRToken->unused2);
585582
OS.write_zeros(CP.getSymbolSize() - COFF::Symbol16Size);
@@ -592,6 +589,9 @@ static bool writeCOFF(COFFParser &CP, raw_ostream &OS) {
592589
return true;
593590
}
594591

592+
namespace llvm {
593+
namespace yaml {
594+
595595
int yaml2coff(llvm::COFFYAML::Object &Doc, raw_ostream &Out) {
596596
COFFParser CP(Doc);
597597
if (!CP.parse()) {
@@ -614,3 +614,6 @@ int yaml2coff(llvm::COFFYAML::Object &Doc, raw_ostream &Out) {
614614
}
615615
return 0;
616616
}
617+
618+
} // namespace yaml
619+
} // namespace llvm

0 commit comments

Comments
 (0)