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