xref: /llvm-project/llvm/tools/dsymutil/RelocationMap.cpp (revision 88d00a6897d71fded96a4f806ce5ebc46fd2a0de)
1*88d00a68SAlpha Abdoulaye //===- tools/dsymutil/RelocationMap.cpp - Relocation map representation---===//
2*88d00a68SAlpha Abdoulaye //
3*88d00a68SAlpha Abdoulaye // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*88d00a68SAlpha Abdoulaye // See https://llvm.org/LICENSE.txt for license information.
5*88d00a68SAlpha Abdoulaye // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*88d00a68SAlpha Abdoulaye //
7*88d00a68SAlpha Abdoulaye //===----------------------------------------------------------------------===//
8*88d00a68SAlpha Abdoulaye 
9*88d00a68SAlpha Abdoulaye #include "RelocationMap.h"
10*88d00a68SAlpha Abdoulaye 
11*88d00a68SAlpha Abdoulaye namespace llvm {
12*88d00a68SAlpha Abdoulaye 
13*88d00a68SAlpha Abdoulaye namespace dsymutil {
14*88d00a68SAlpha Abdoulaye 
print(raw_ostream & OS) const15*88d00a68SAlpha Abdoulaye void RelocationMap::print(raw_ostream &OS) const {
16*88d00a68SAlpha Abdoulaye   yaml::Output yout(OS, /* Ctxt = */ nullptr, /* WrapColumn = */ 0);
17*88d00a68SAlpha Abdoulaye   yout << const_cast<RelocationMap &>(*this);
18*88d00a68SAlpha Abdoulaye }
19*88d00a68SAlpha Abdoulaye 
20*88d00a68SAlpha Abdoulaye #ifndef NDEBUG
dump() const21*88d00a68SAlpha Abdoulaye void RelocationMap::dump() const { print(errs()); }
22*88d00a68SAlpha Abdoulaye #endif
23*88d00a68SAlpha Abdoulaye 
addRelocationMapEntry(const ValidReloc & Relocation)24*88d00a68SAlpha Abdoulaye void RelocationMap::addRelocationMapEntry(const ValidReloc &Relocation) {
25*88d00a68SAlpha Abdoulaye   Relocations.push_back(Relocation);
26*88d00a68SAlpha Abdoulaye }
27*88d00a68SAlpha Abdoulaye 
28*88d00a68SAlpha Abdoulaye namespace {
29*88d00a68SAlpha Abdoulaye 
30*88d00a68SAlpha Abdoulaye struct YAMLContext {
31*88d00a68SAlpha Abdoulaye   StringRef PrependPath;
32*88d00a68SAlpha Abdoulaye   Triple BinaryTriple;
33*88d00a68SAlpha Abdoulaye };
34*88d00a68SAlpha Abdoulaye 
35*88d00a68SAlpha Abdoulaye } // end anonymous namespace
36*88d00a68SAlpha Abdoulaye 
37*88d00a68SAlpha Abdoulaye ErrorOr<std::unique_ptr<RelocationMap>>
parseYAMLRelocationMap(StringRef InputFile,StringRef PrependPath)38*88d00a68SAlpha Abdoulaye RelocationMap::parseYAMLRelocationMap(StringRef InputFile,
39*88d00a68SAlpha Abdoulaye                                       StringRef PrependPath) {
40*88d00a68SAlpha Abdoulaye   auto ErrOrFile = MemoryBuffer::getFileOrSTDIN(InputFile);
41*88d00a68SAlpha Abdoulaye   if (auto Err = ErrOrFile.getError())
42*88d00a68SAlpha Abdoulaye     return Err;
43*88d00a68SAlpha Abdoulaye 
44*88d00a68SAlpha Abdoulaye   YAMLContext Ctxt;
45*88d00a68SAlpha Abdoulaye 
46*88d00a68SAlpha Abdoulaye   Ctxt.PrependPath = PrependPath;
47*88d00a68SAlpha Abdoulaye 
48*88d00a68SAlpha Abdoulaye   std::unique_ptr<RelocationMap> Result;
49*88d00a68SAlpha Abdoulaye   yaml::Input yin((*ErrOrFile)->getBuffer(), &Ctxt);
50*88d00a68SAlpha Abdoulaye   yin >> Result;
51*88d00a68SAlpha Abdoulaye 
52*88d00a68SAlpha Abdoulaye   if (auto EC = yin.error())
53*88d00a68SAlpha Abdoulaye     return EC;
54*88d00a68SAlpha Abdoulaye   return std::move(Result);
55*88d00a68SAlpha Abdoulaye }
56*88d00a68SAlpha Abdoulaye 
57*88d00a68SAlpha Abdoulaye } // end namespace dsymutil
58*88d00a68SAlpha Abdoulaye 
59*88d00a68SAlpha Abdoulaye namespace yaml {
60*88d00a68SAlpha Abdoulaye 
mapping(IO & io,dsymutil::ValidReloc & VR)61*88d00a68SAlpha Abdoulaye void MappingTraits<dsymutil::ValidReloc>::mapping(IO &io,
62*88d00a68SAlpha Abdoulaye                                                   dsymutil::ValidReloc &VR) {
63*88d00a68SAlpha Abdoulaye   io.mapRequired("offset", VR.Offset);
64*88d00a68SAlpha Abdoulaye   io.mapRequired("size", VR.Size);
65*88d00a68SAlpha Abdoulaye   io.mapRequired("addend", VR.Addend);
66*88d00a68SAlpha Abdoulaye   io.mapRequired("symName", VR.SymbolName);
67*88d00a68SAlpha Abdoulaye   io.mapOptional("symObjAddr", VR.SymbolMapping.ObjectAddress);
68*88d00a68SAlpha Abdoulaye   io.mapRequired("symBinAddr", VR.SymbolMapping.BinaryAddress);
69*88d00a68SAlpha Abdoulaye   io.mapRequired("symSize", VR.SymbolMapping.Size);
70*88d00a68SAlpha Abdoulaye }
71*88d00a68SAlpha Abdoulaye 
mapping(IO & io,dsymutil::RelocationMap & RM)72*88d00a68SAlpha Abdoulaye void MappingTraits<dsymutil::RelocationMap>::mapping(
73*88d00a68SAlpha Abdoulaye     IO &io, dsymutil::RelocationMap &RM) {
74*88d00a68SAlpha Abdoulaye   io.mapRequired("triple", RM.BinaryTriple);
75*88d00a68SAlpha Abdoulaye   io.mapRequired("binary-path", RM.BinaryPath);
76*88d00a68SAlpha Abdoulaye   if (void *Ctxt = io.getContext())
77*88d00a68SAlpha Abdoulaye     reinterpret_cast<YAMLContext *>(Ctxt)->BinaryTriple = RM.BinaryTriple;
78*88d00a68SAlpha Abdoulaye   io.mapRequired("relocations", RM.Relocations);
79*88d00a68SAlpha Abdoulaye }
80*88d00a68SAlpha Abdoulaye 
mapping(IO & io,std::unique_ptr<dsymutil::RelocationMap> & RM)81*88d00a68SAlpha Abdoulaye void MappingTraits<std::unique_ptr<dsymutil::RelocationMap>>::mapping(
82*88d00a68SAlpha Abdoulaye     IO &io, std::unique_ptr<dsymutil::RelocationMap> &RM) {
83*88d00a68SAlpha Abdoulaye   if (!RM)
84*88d00a68SAlpha Abdoulaye     RM.reset(new RelocationMap());
85*88d00a68SAlpha Abdoulaye   io.mapRequired("triple", RM->BinaryTriple);
86*88d00a68SAlpha Abdoulaye   io.mapRequired("binary-path", RM->BinaryPath);
87*88d00a68SAlpha Abdoulaye   if (void *Ctxt = io.getContext())
88*88d00a68SAlpha Abdoulaye     reinterpret_cast<YAMLContext *>(Ctxt)->BinaryTriple = RM->BinaryTriple;
89*88d00a68SAlpha Abdoulaye   io.mapRequired("relocations", RM->Relocations);
90*88d00a68SAlpha Abdoulaye }
91*88d00a68SAlpha Abdoulaye } // end namespace yaml
92*88d00a68SAlpha Abdoulaye } // end namespace llvm
93