//===- 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(*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> 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 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::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::mapping( IO &io, dsymutil::RelocationMap &RM) { io.mapRequired("triple", RM.BinaryTriple); io.mapRequired("binary-path", RM.BinaryPath); if (void *Ctxt = io.getContext()) reinterpret_cast(Ctxt)->BinaryTriple = RM.BinaryTriple; io.mapRequired("relocations", RM.Relocations); } void MappingTraits>::mapping( IO &io, std::unique_ptr &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(Ctxt)->BinaryTriple = RM->BinaryTriple; io.mapRequired("relocations", RM->Relocations); } } // end namespace yaml } // end namespace llvm