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/Error.h" 12*47369e19SGeorgii Rymar #include "llvm/Support/raw_ostream.h" 13*47369e19SGeorgii Rymar 14*47369e19SGeorgii Rymar using namespace llvm; 15*47369e19SGeorgii Rymar using namespace ArchYAML; 16*47369e19SGeorgii Rymar 17*47369e19SGeorgii Rymar namespace llvm { 18*47369e19SGeorgii Rymar namespace yaml { 19*47369e19SGeorgii Rymar yaml2archive(ArchYAML::Archive & Doc,raw_ostream & Out,ErrorHandler EH)20*47369e19SGeorgii Rymarbool yaml2archive(ArchYAML::Archive &Doc, raw_ostream &Out, ErrorHandler EH) { 21*47369e19SGeorgii Rymar Out.write(Doc.Magic.data(), Doc.Magic.size()); 22*47369e19SGeorgii Rymar 23*47369e19SGeorgii Rymar if (Doc.Content) { 24*47369e19SGeorgii Rymar Doc.Content->writeAsBinary(Out); 25*47369e19SGeorgii Rymar return true; 26*47369e19SGeorgii Rymar } 27*47369e19SGeorgii Rymar 28*47369e19SGeorgii Rymar if (!Doc.Members) 29*47369e19SGeorgii Rymar return true; 30*47369e19SGeorgii Rymar 31*47369e19SGeorgii Rymar auto WriteField = [&](StringRef Field, uint8_t Size) { 32*47369e19SGeorgii Rymar Out.write(Field.data(), Field.size()); 33*47369e19SGeorgii Rymar for (size_t I = Field.size(); I != Size; ++I) 34*47369e19SGeorgii Rymar Out.write(' '); 35*47369e19SGeorgii Rymar }; 36*47369e19SGeorgii Rymar 37*47369e19SGeorgii Rymar for (const Archive::Child &C : *Doc.Members) { 38*47369e19SGeorgii Rymar for (auto &P : C.Fields) 39*47369e19SGeorgii Rymar WriteField(P.second.Value, P.second.MaxLength); 40*47369e19SGeorgii Rymar 41*47369e19SGeorgii Rymar if (C.Content) 42*47369e19SGeorgii Rymar C.Content->writeAsBinary(Out); 43*47369e19SGeorgii Rymar if (C.PaddingByte) 44*47369e19SGeorgii Rymar Out.write(*C.PaddingByte); 45*47369e19SGeorgii Rymar } 46*47369e19SGeorgii Rymar 47*47369e19SGeorgii Rymar return true; 48*47369e19SGeorgii Rymar } 49*47369e19SGeorgii Rymar 50*47369e19SGeorgii Rymar } // namespace yaml 51*47369e19SGeorgii Rymar } // namespace llvm 52