|  | //===- tools/dsymutil/RelocationMap.cpp - Relocation map representation---===// | 
|  | // | 
|  | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
|  | // See https://llvm.org/LICENSE.txt for license information. | 
|  | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "RelocationMap.h" | 
|  |  | 
|  | namespace llvm { | 
|  |  | 
|  | namespace dsymutil { | 
|  |  | 
|  | void RelocationMap::print(raw_ostream &OS) const { | 
|  | yaml::Output yout(OS, /* Ctxt = */ nullptr, /* WrapColumn = */ 0); | 
|  | yout << const_cast<RelocationMap &>(*this); | 
|  | } | 
|  |  | 
|  | #ifndef NDEBUG | 
|  | void RelocationMap::dump() const { print(errs()); } | 
|  | #endif | 
|  |  | 
|  | void RelocationMap::addRelocationMapEntry(const ValidReloc &Relocation) { | 
|  | Relocations.push_back(Relocation); | 
|  | } | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | struct YAMLContext { | 
|  | StringRef PrependPath; | 
|  | Triple BinaryTriple; | 
|  | }; | 
|  |  | 
|  | } // end anonymous namespace | 
|  |  | 
|  | ErrorOr<std::unique_ptr<RelocationMap>> | 
|  | RelocationMap::parseYAMLRelocationMap(StringRef InputFile, | 
|  | StringRef PrependPath) { | 
|  | auto ErrOrFile = MemoryBuffer::getFileOrSTDIN(InputFile); | 
|  | if (auto Err = ErrOrFile.getError()) | 
|  | return Err; | 
|  |  | 
|  | YAMLContext Ctxt; | 
|  |  | 
|  | Ctxt.PrependPath = PrependPath; | 
|  |  | 
|  | std::unique_ptr<RelocationMap> Result; | 
|  | yaml::Input yin((*ErrOrFile)->getBuffer(), &Ctxt); | 
|  | yin >> Result; | 
|  |  | 
|  | if (auto EC = yin.error()) | 
|  | return EC; | 
|  | return std::move(Result); | 
|  | } | 
|  |  | 
|  | } // end namespace dsymutil | 
|  |  | 
|  | namespace yaml { | 
|  |  | 
|  | void MappingTraits<dsymutil::ValidReloc>::mapping(IO &io, | 
|  | dsymutil::ValidReloc &VR) { | 
|  | io.mapRequired("offset", VR.Offset); | 
|  | io.mapRequired("size", VR.Size); | 
|  | io.mapRequired("addend", VR.Addend); | 
|  | io.mapRequired("symName", VR.SymbolName); | 
|  | io.mapOptional("symObjAddr", VR.SymbolMapping.ObjectAddress); | 
|  | io.mapRequired("symBinAddr", VR.SymbolMapping.BinaryAddress); | 
|  | io.mapRequired("symSize", VR.SymbolMapping.Size); | 
|  | } | 
|  |  | 
|  | void MappingTraits<dsymutil::RelocationMap>::mapping( | 
|  | IO &io, dsymutil::RelocationMap &RM) { | 
|  | io.mapRequired("triple", RM.BinaryTriple); | 
|  | io.mapRequired("binary-path", RM.BinaryPath); | 
|  | if (void *Ctxt = io.getContext()) | 
|  | reinterpret_cast<YAMLContext *>(Ctxt)->BinaryTriple = RM.BinaryTriple; | 
|  | io.mapRequired("relocations", RM.Relocations); | 
|  | } | 
|  |  | 
|  | void MappingTraits<std::unique_ptr<dsymutil::RelocationMap>>::mapping( | 
|  | IO &io, std::unique_ptr<dsymutil::RelocationMap> &RM) { | 
|  | if (!RM) | 
|  | RM.reset(new RelocationMap()); | 
|  | io.mapRequired("triple", RM->BinaryTriple); | 
|  | io.mapRequired("binary-path", RM->BinaryPath); | 
|  | if (void *Ctxt = io.getContext()) | 
|  | reinterpret_cast<YAMLContext *>(Ctxt)->BinaryTriple = RM->BinaryTriple; | 
|  | io.mapRequired("relocations", RM->Relocations); | 
|  | } | 
|  | } // end namespace yaml | 
|  | } // end namespace llvm |