xref: /llvm-project/llvm/lib/ObjectYAML/ArchiveEmitter.cpp (revision 5b7102d1f37eab7a8f17b7bf4124ca76fbdbd66d)
1*47369e19SGeorgii Rymar //===- ArchiveEmitter.cpp ---------------------------- --------------------===//
2*47369e19SGeorgii Rymar //
3*47369e19SGeorgii Rymar // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*47369e19SGeorgii Rymar // See https://llvm.org/LICENSE.txt for license information.
5*47369e19SGeorgii Rymar // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*47369e19SGeorgii Rymar //
7*47369e19SGeorgii Rymar //===----------------------------------------------------------------------===//
8*47369e19SGeorgii Rymar 
9*47369e19SGeorgii Rymar #include "llvm/ObjectYAML/ArchiveYAML.h"
10*47369e19SGeorgii Rymar #include "llvm/ObjectYAML/yaml2obj.h"
11*47369e19SGeorgii Rymar #include "llvm/Support/raw_ostream.h"
12*47369e19SGeorgii Rymar 
13*47369e19SGeorgii Rymar using namespace llvm;
14*47369e19SGeorgii Rymar using namespace ArchYAML;
15*47369e19SGeorgii Rymar 
16*47369e19SGeorgii Rymar namespace llvm {
17*47369e19SGeorgii Rymar namespace yaml {
18*47369e19SGeorgii Rymar 
19*47369e19SGeorgii Rymar bool yaml2archive(ArchYAML::Archive &Doc, raw_ostream &Out, ErrorHandler EH) {
20*47369e19SGeorgii Rymar   Out.write(Doc.Magic.data(), Doc.Magic.size());
21*47369e19SGeorgii Rymar 
22*47369e19SGeorgii Rymar   if (Doc.Content) {
23*47369e19SGeorgii Rymar     Doc.Content->writeAsBinary(Out);
24*47369e19SGeorgii Rymar     return true;
25*47369e19SGeorgii Rymar   }
26*47369e19SGeorgii Rymar 
27*47369e19SGeorgii Rymar   if (!Doc.Members)
28*47369e19SGeorgii Rymar     return true;
29*47369e19SGeorgii Rymar 
30*47369e19SGeorgii Rymar   auto WriteField = [&](StringRef Field, uint8_t Size) {
31*47369e19SGeorgii Rymar     Out.write(Field.data(), Field.size());
32*47369e19SGeorgii Rymar     for (size_t I = Field.size(); I != Size; ++I)
33*47369e19SGeorgii Rymar       Out.write(' ');
34*47369e19SGeorgii Rymar   };
35*47369e19SGeorgii Rymar 
36*47369e19SGeorgii Rymar   for (const Archive::Child &C : *Doc.Members) {
37*47369e19SGeorgii Rymar     for (auto &P : C.Fields)
38*47369e19SGeorgii Rymar       WriteField(P.second.Value, P.second.MaxLength);
39*47369e19SGeorgii Rymar 
40*47369e19SGeorgii Rymar     if (C.Content)
41*47369e19SGeorgii Rymar       C.Content->writeAsBinary(Out);
42*47369e19SGeorgii Rymar     if (C.PaddingByte)
43*47369e19SGeorgii Rymar       Out.write(*C.PaddingByte);
44*47369e19SGeorgii Rymar   }
45*47369e19SGeorgii Rymar 
46*47369e19SGeorgii Rymar   return true;
47*47369e19SGeorgii Rymar }
48*47369e19SGeorgii Rymar 
49*47369e19SGeorgii Rymar } // namespace yaml
50*47369e19SGeorgii Rymar } // namespace llvm
51