92 lines
2.7 KiB
C++
92 lines
2.7 KiB
C++
//===- 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
|