xref: /aosp_15_r20/external/llvm/tools/dsymutil/DebugMap.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===- tools/dsymutil/DebugMap.cpp - Generic debug map representation -----===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                             The LLVM Linker
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker #include "DebugMap.h"
10*9880d681SAndroid Build Coastguard Worker #include "BinaryHolder.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/STLExtras.h"
12*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/iterator_range.h"
13*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/DataTypes.h"
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Format.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
16*9880d681SAndroid Build Coastguard Worker #include <algorithm>
17*9880d681SAndroid Build Coastguard Worker 
18*9880d681SAndroid Build Coastguard Worker namespace llvm {
19*9880d681SAndroid Build Coastguard Worker namespace dsymutil {
20*9880d681SAndroid Build Coastguard Worker 
21*9880d681SAndroid Build Coastguard Worker using namespace llvm::object;
22*9880d681SAndroid Build Coastguard Worker 
DebugMapObject(StringRef ObjectFilename,sys::TimeValue Timestamp)23*9880d681SAndroid Build Coastguard Worker DebugMapObject::DebugMapObject(StringRef ObjectFilename,
24*9880d681SAndroid Build Coastguard Worker                                sys::TimeValue Timestamp)
25*9880d681SAndroid Build Coastguard Worker     : Filename(ObjectFilename), Timestamp(Timestamp) {}
26*9880d681SAndroid Build Coastguard Worker 
addSymbol(StringRef Name,Optional<uint64_t> ObjectAddress,uint64_t LinkedAddress,uint32_t Size)27*9880d681SAndroid Build Coastguard Worker bool DebugMapObject::addSymbol(StringRef Name, Optional<uint64_t> ObjectAddress,
28*9880d681SAndroid Build Coastguard Worker                                uint64_t LinkedAddress, uint32_t Size) {
29*9880d681SAndroid Build Coastguard Worker   auto InsertResult = Symbols.insert(
30*9880d681SAndroid Build Coastguard Worker       std::make_pair(Name, SymbolMapping(ObjectAddress, LinkedAddress, Size)));
31*9880d681SAndroid Build Coastguard Worker 
32*9880d681SAndroid Build Coastguard Worker   if (ObjectAddress && InsertResult.second)
33*9880d681SAndroid Build Coastguard Worker     AddressToMapping[*ObjectAddress] = &*InsertResult.first;
34*9880d681SAndroid Build Coastguard Worker   return InsertResult.second;
35*9880d681SAndroid Build Coastguard Worker }
36*9880d681SAndroid Build Coastguard Worker 
print(raw_ostream & OS) const37*9880d681SAndroid Build Coastguard Worker void DebugMapObject::print(raw_ostream &OS) const {
38*9880d681SAndroid Build Coastguard Worker   OS << getObjectFilename() << ":\n";
39*9880d681SAndroid Build Coastguard Worker   // Sort the symbols in alphabetical order, like llvm-nm (and to get
40*9880d681SAndroid Build Coastguard Worker   // deterministic output for testing).
41*9880d681SAndroid Build Coastguard Worker   typedef std::pair<StringRef, SymbolMapping> Entry;
42*9880d681SAndroid Build Coastguard Worker   std::vector<Entry> Entries;
43*9880d681SAndroid Build Coastguard Worker   Entries.reserve(Symbols.getNumItems());
44*9880d681SAndroid Build Coastguard Worker   for (const auto &Sym : make_range(Symbols.begin(), Symbols.end()))
45*9880d681SAndroid Build Coastguard Worker     Entries.push_back(std::make_pair(Sym.getKey(), Sym.getValue()));
46*9880d681SAndroid Build Coastguard Worker   std::sort(
47*9880d681SAndroid Build Coastguard Worker       Entries.begin(), Entries.end(),
48*9880d681SAndroid Build Coastguard Worker       [](const Entry &LHS, const Entry &RHS) { return LHS.first < RHS.first; });
49*9880d681SAndroid Build Coastguard Worker   for (const auto &Sym : Entries) {
50*9880d681SAndroid Build Coastguard Worker     if (Sym.second.ObjectAddress)
51*9880d681SAndroid Build Coastguard Worker       OS << format("\t%016" PRIx64, uint64_t(*Sym.second.ObjectAddress));
52*9880d681SAndroid Build Coastguard Worker     else
53*9880d681SAndroid Build Coastguard Worker       OS << "\t????????????????";
54*9880d681SAndroid Build Coastguard Worker     OS << format(" => %016" PRIx64 "+0x%x\t%s\n",
55*9880d681SAndroid Build Coastguard Worker                  uint64_t(Sym.second.BinaryAddress), uint32_t(Sym.second.Size),
56*9880d681SAndroid Build Coastguard Worker                  Sym.first.data());
57*9880d681SAndroid Build Coastguard Worker   }
58*9880d681SAndroid Build Coastguard Worker   OS << '\n';
59*9880d681SAndroid Build Coastguard Worker }
60*9880d681SAndroid Build Coastguard Worker 
61*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
dump() const62*9880d681SAndroid Build Coastguard Worker void DebugMapObject::dump() const { print(errs()); }
63*9880d681SAndroid Build Coastguard Worker #endif
64*9880d681SAndroid Build Coastguard Worker 
addDebugMapObject(StringRef ObjectFilePath,sys::TimeValue Timestamp)65*9880d681SAndroid Build Coastguard Worker DebugMapObject &DebugMap::addDebugMapObject(StringRef ObjectFilePath,
66*9880d681SAndroid Build Coastguard Worker                                             sys::TimeValue Timestamp) {
67*9880d681SAndroid Build Coastguard Worker   Objects.emplace_back(new DebugMapObject(ObjectFilePath, Timestamp));
68*9880d681SAndroid Build Coastguard Worker   return *Objects.back();
69*9880d681SAndroid Build Coastguard Worker }
70*9880d681SAndroid Build Coastguard Worker 
71*9880d681SAndroid Build Coastguard Worker const DebugMapObject::DebugMapEntry *
lookupSymbol(StringRef SymbolName) const72*9880d681SAndroid Build Coastguard Worker DebugMapObject::lookupSymbol(StringRef SymbolName) const {
73*9880d681SAndroid Build Coastguard Worker   StringMap<SymbolMapping>::const_iterator Sym = Symbols.find(SymbolName);
74*9880d681SAndroid Build Coastguard Worker   if (Sym == Symbols.end())
75*9880d681SAndroid Build Coastguard Worker     return nullptr;
76*9880d681SAndroid Build Coastguard Worker   return &*Sym;
77*9880d681SAndroid Build Coastguard Worker }
78*9880d681SAndroid Build Coastguard Worker 
79*9880d681SAndroid Build Coastguard Worker const DebugMapObject::DebugMapEntry *
lookupObjectAddress(uint64_t Address) const80*9880d681SAndroid Build Coastguard Worker DebugMapObject::lookupObjectAddress(uint64_t Address) const {
81*9880d681SAndroid Build Coastguard Worker   auto Mapping = AddressToMapping.find(Address);
82*9880d681SAndroid Build Coastguard Worker   if (Mapping == AddressToMapping.end())
83*9880d681SAndroid Build Coastguard Worker     return nullptr;
84*9880d681SAndroid Build Coastguard Worker   return Mapping->getSecond();
85*9880d681SAndroid Build Coastguard Worker }
86*9880d681SAndroid Build Coastguard Worker 
print(raw_ostream & OS) const87*9880d681SAndroid Build Coastguard Worker void DebugMap::print(raw_ostream &OS) const {
88*9880d681SAndroid Build Coastguard Worker   yaml::Output yout(OS, /* Ctxt = */ nullptr, /* WrapColumn = */ 0);
89*9880d681SAndroid Build Coastguard Worker   yout << const_cast<DebugMap &>(*this);
90*9880d681SAndroid Build Coastguard Worker }
91*9880d681SAndroid Build Coastguard Worker 
92*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
dump() const93*9880d681SAndroid Build Coastguard Worker void DebugMap::dump() const { print(errs()); }
94*9880d681SAndroid Build Coastguard Worker #endif
95*9880d681SAndroid Build Coastguard Worker 
96*9880d681SAndroid Build Coastguard Worker namespace {
97*9880d681SAndroid Build Coastguard Worker struct YAMLContext {
98*9880d681SAndroid Build Coastguard Worker   StringRef PrependPath;
99*9880d681SAndroid Build Coastguard Worker   Triple BinaryTriple;
100*9880d681SAndroid Build Coastguard Worker };
101*9880d681SAndroid Build Coastguard Worker }
102*9880d681SAndroid Build Coastguard Worker 
103*9880d681SAndroid Build Coastguard Worker ErrorOr<std::vector<std::unique_ptr<DebugMap>>>
parseYAMLDebugMap(StringRef InputFile,StringRef PrependPath,bool Verbose)104*9880d681SAndroid Build Coastguard Worker DebugMap::parseYAMLDebugMap(StringRef InputFile, StringRef PrependPath,
105*9880d681SAndroid Build Coastguard Worker                             bool Verbose) {
106*9880d681SAndroid Build Coastguard Worker   auto ErrOrFile = MemoryBuffer::getFileOrSTDIN(InputFile);
107*9880d681SAndroid Build Coastguard Worker   if (auto Err = ErrOrFile.getError())
108*9880d681SAndroid Build Coastguard Worker     return Err;
109*9880d681SAndroid Build Coastguard Worker 
110*9880d681SAndroid Build Coastguard Worker   YAMLContext Ctxt;
111*9880d681SAndroid Build Coastguard Worker 
112*9880d681SAndroid Build Coastguard Worker   Ctxt.PrependPath = PrependPath;
113*9880d681SAndroid Build Coastguard Worker 
114*9880d681SAndroid Build Coastguard Worker   std::unique_ptr<DebugMap> Res;
115*9880d681SAndroid Build Coastguard Worker   yaml::Input yin((*ErrOrFile)->getBuffer(), &Ctxt);
116*9880d681SAndroid Build Coastguard Worker   yin >> Res;
117*9880d681SAndroid Build Coastguard Worker 
118*9880d681SAndroid Build Coastguard Worker   if (auto EC = yin.error())
119*9880d681SAndroid Build Coastguard Worker     return EC;
120*9880d681SAndroid Build Coastguard Worker   std::vector<std::unique_ptr<DebugMap>> Result;
121*9880d681SAndroid Build Coastguard Worker   Result.push_back(std::move(Res));
122*9880d681SAndroid Build Coastguard Worker   return std::move(Result);
123*9880d681SAndroid Build Coastguard Worker }
124*9880d681SAndroid Build Coastguard Worker }
125*9880d681SAndroid Build Coastguard Worker 
126*9880d681SAndroid Build Coastguard Worker namespace yaml {
127*9880d681SAndroid Build Coastguard Worker 
128*9880d681SAndroid Build Coastguard Worker // Normalize/Denormalize between YAML and a DebugMapObject.
129*9880d681SAndroid Build Coastguard Worker struct MappingTraits<dsymutil::DebugMapObject>::YamlDMO {
YamlDMOllvm::yaml::MappingTraits::YamlDMO130*9880d681SAndroid Build Coastguard Worker   YamlDMO(IO &io) { Timestamp = 0; }
131*9880d681SAndroid Build Coastguard Worker   YamlDMO(IO &io, dsymutil::DebugMapObject &Obj);
132*9880d681SAndroid Build Coastguard Worker   dsymutil::DebugMapObject denormalize(IO &IO);
133*9880d681SAndroid Build Coastguard Worker 
134*9880d681SAndroid Build Coastguard Worker   std::string Filename;
135*9880d681SAndroid Build Coastguard Worker   sys::TimeValue::SecondsType Timestamp;
136*9880d681SAndroid Build Coastguard Worker   std::vector<dsymutil::DebugMapObject::YAMLSymbolMapping> Entries;
137*9880d681SAndroid Build Coastguard Worker };
138*9880d681SAndroid Build Coastguard Worker 
139*9880d681SAndroid Build Coastguard Worker void MappingTraits<std::pair<std::string, DebugMapObject::SymbolMapping>>::
mapping(IO & io,std::pair<std::string,DebugMapObject::SymbolMapping> & s)140*9880d681SAndroid Build Coastguard Worker     mapping(IO &io, std::pair<std::string, DebugMapObject::SymbolMapping> &s) {
141*9880d681SAndroid Build Coastguard Worker   io.mapRequired("sym", s.first);
142*9880d681SAndroid Build Coastguard Worker   io.mapOptional("objAddr", s.second.ObjectAddress);
143*9880d681SAndroid Build Coastguard Worker   io.mapRequired("binAddr", s.second.BinaryAddress);
144*9880d681SAndroid Build Coastguard Worker   io.mapOptional("size", s.second.Size);
145*9880d681SAndroid Build Coastguard Worker }
146*9880d681SAndroid Build Coastguard Worker 
mapping(IO & io,dsymutil::DebugMapObject & DMO)147*9880d681SAndroid Build Coastguard Worker void MappingTraits<dsymutil::DebugMapObject>::mapping(
148*9880d681SAndroid Build Coastguard Worker     IO &io, dsymutil::DebugMapObject &DMO) {
149*9880d681SAndroid Build Coastguard Worker   MappingNormalization<YamlDMO, dsymutil::DebugMapObject> Norm(io, DMO);
150*9880d681SAndroid Build Coastguard Worker   io.mapRequired("filename", Norm->Filename);
151*9880d681SAndroid Build Coastguard Worker   io.mapOptional("timestamp", Norm->Timestamp);
152*9880d681SAndroid Build Coastguard Worker   io.mapRequired("symbols", Norm->Entries);
153*9880d681SAndroid Build Coastguard Worker }
154*9880d681SAndroid Build Coastguard Worker 
output(const Triple & val,void *,llvm::raw_ostream & out)155*9880d681SAndroid Build Coastguard Worker void ScalarTraits<Triple>::output(const Triple &val, void *,
156*9880d681SAndroid Build Coastguard Worker                                   llvm::raw_ostream &out) {
157*9880d681SAndroid Build Coastguard Worker   out << val.str();
158*9880d681SAndroid Build Coastguard Worker }
159*9880d681SAndroid Build Coastguard Worker 
input(StringRef scalar,void *,Triple & value)160*9880d681SAndroid Build Coastguard Worker StringRef ScalarTraits<Triple>::input(StringRef scalar, void *, Triple &value) {
161*9880d681SAndroid Build Coastguard Worker   value = Triple(scalar);
162*9880d681SAndroid Build Coastguard Worker   return StringRef();
163*9880d681SAndroid Build Coastguard Worker }
164*9880d681SAndroid Build Coastguard Worker 
165*9880d681SAndroid Build Coastguard Worker size_t
size(IO & io,std::vector<std::unique_ptr<dsymutil::DebugMapObject>> & seq)166*9880d681SAndroid Build Coastguard Worker SequenceTraits<std::vector<std::unique_ptr<dsymutil::DebugMapObject>>>::size(
167*9880d681SAndroid Build Coastguard Worker     IO &io, std::vector<std::unique_ptr<dsymutil::DebugMapObject>> &seq) {
168*9880d681SAndroid Build Coastguard Worker   return seq.size();
169*9880d681SAndroid Build Coastguard Worker }
170*9880d681SAndroid Build Coastguard Worker 
171*9880d681SAndroid Build Coastguard Worker dsymutil::DebugMapObject &
element(IO &,std::vector<std::unique_ptr<dsymutil::DebugMapObject>> & seq,size_t index)172*9880d681SAndroid Build Coastguard Worker SequenceTraits<std::vector<std::unique_ptr<dsymutil::DebugMapObject>>>::element(
173*9880d681SAndroid Build Coastguard Worker     IO &, std::vector<std::unique_ptr<dsymutil::DebugMapObject>> &seq,
174*9880d681SAndroid Build Coastguard Worker     size_t index) {
175*9880d681SAndroid Build Coastguard Worker   if (index >= seq.size()) {
176*9880d681SAndroid Build Coastguard Worker     seq.resize(index + 1);
177*9880d681SAndroid Build Coastguard Worker     seq[index].reset(new dsymutil::DebugMapObject);
178*9880d681SAndroid Build Coastguard Worker   }
179*9880d681SAndroid Build Coastguard Worker   return *seq[index];
180*9880d681SAndroid Build Coastguard Worker }
181*9880d681SAndroid Build Coastguard Worker 
mapping(IO & io,dsymutil::DebugMap & DM)182*9880d681SAndroid Build Coastguard Worker void MappingTraits<dsymutil::DebugMap>::mapping(IO &io,
183*9880d681SAndroid Build Coastguard Worker                                                 dsymutil::DebugMap &DM) {
184*9880d681SAndroid Build Coastguard Worker   io.mapRequired("triple", DM.BinaryTriple);
185*9880d681SAndroid Build Coastguard Worker   io.mapOptional("binary-path", DM.BinaryPath);
186*9880d681SAndroid Build Coastguard Worker   if (void *Ctxt = io.getContext())
187*9880d681SAndroid Build Coastguard Worker     reinterpret_cast<YAMLContext *>(Ctxt)->BinaryTriple = DM.BinaryTriple;
188*9880d681SAndroid Build Coastguard Worker   io.mapOptional("objects", DM.Objects);
189*9880d681SAndroid Build Coastguard Worker }
190*9880d681SAndroid Build Coastguard Worker 
mapping(IO & io,std::unique_ptr<dsymutil::DebugMap> & DM)191*9880d681SAndroid Build Coastguard Worker void MappingTraits<std::unique_ptr<dsymutil::DebugMap>>::mapping(
192*9880d681SAndroid Build Coastguard Worker     IO &io, std::unique_ptr<dsymutil::DebugMap> &DM) {
193*9880d681SAndroid Build Coastguard Worker   if (!DM)
194*9880d681SAndroid Build Coastguard Worker     DM.reset(new DebugMap());
195*9880d681SAndroid Build Coastguard Worker   io.mapRequired("triple", DM->BinaryTriple);
196*9880d681SAndroid Build Coastguard Worker   io.mapOptional("binary-path", DM->BinaryPath);
197*9880d681SAndroid Build Coastguard Worker   if (void *Ctxt = io.getContext())
198*9880d681SAndroid Build Coastguard Worker     reinterpret_cast<YAMLContext *>(Ctxt)->BinaryTriple = DM->BinaryTriple;
199*9880d681SAndroid Build Coastguard Worker   io.mapOptional("objects", DM->Objects);
200*9880d681SAndroid Build Coastguard Worker }
201*9880d681SAndroid Build Coastguard Worker 
YamlDMO(IO & io,dsymutil::DebugMapObject & Obj)202*9880d681SAndroid Build Coastguard Worker MappingTraits<dsymutil::DebugMapObject>::YamlDMO::YamlDMO(
203*9880d681SAndroid Build Coastguard Worker     IO &io, dsymutil::DebugMapObject &Obj) {
204*9880d681SAndroid Build Coastguard Worker   Filename = Obj.Filename;
205*9880d681SAndroid Build Coastguard Worker   Timestamp = Obj.getTimestamp().toEpochTime();
206*9880d681SAndroid Build Coastguard Worker   Entries.reserve(Obj.Symbols.size());
207*9880d681SAndroid Build Coastguard Worker   for (auto &Entry : Obj.Symbols)
208*9880d681SAndroid Build Coastguard Worker     Entries.push_back(std::make_pair(Entry.getKey(), Entry.getValue()));
209*9880d681SAndroid Build Coastguard Worker }
210*9880d681SAndroid Build Coastguard Worker 
211*9880d681SAndroid Build Coastguard Worker dsymutil::DebugMapObject
denormalize(IO & IO)212*9880d681SAndroid Build Coastguard Worker MappingTraits<dsymutil::DebugMapObject>::YamlDMO::denormalize(IO &IO) {
213*9880d681SAndroid Build Coastguard Worker   BinaryHolder BinHolder(/* Verbose =*/false);
214*9880d681SAndroid Build Coastguard Worker   const auto &Ctxt = *reinterpret_cast<YAMLContext *>(IO.getContext());
215*9880d681SAndroid Build Coastguard Worker   SmallString<80> Path(Ctxt.PrependPath);
216*9880d681SAndroid Build Coastguard Worker   StringMap<uint64_t> SymbolAddresses;
217*9880d681SAndroid Build Coastguard Worker 
218*9880d681SAndroid Build Coastguard Worker   sys::path::append(Path, Filename);
219*9880d681SAndroid Build Coastguard Worker   auto ErrOrObjectFiles = BinHolder.GetObjectFiles(Path);
220*9880d681SAndroid Build Coastguard Worker   if (auto EC = ErrOrObjectFiles.getError()) {
221*9880d681SAndroid Build Coastguard Worker     llvm::errs() << "warning: Unable to open " << Path << " " << EC.message()
222*9880d681SAndroid Build Coastguard Worker                  << '\n';
223*9880d681SAndroid Build Coastguard Worker   } else if (auto ErrOrObjectFile = BinHolder.Get(Ctxt.BinaryTriple)) {
224*9880d681SAndroid Build Coastguard Worker     // Rewrite the object file symbol addresses in the debug map. The
225*9880d681SAndroid Build Coastguard Worker     // YAML input is mainly used to test llvm-dsymutil without
226*9880d681SAndroid Build Coastguard Worker     // requiring binaries checked-in. If we generate the object files
227*9880d681SAndroid Build Coastguard Worker     // during the test, we can't hardcode the symbols addresses, so
228*9880d681SAndroid Build Coastguard Worker     // look them up here and rewrite them.
229*9880d681SAndroid Build Coastguard Worker     for (const auto &Sym : ErrOrObjectFile->symbols()) {
230*9880d681SAndroid Build Coastguard Worker       uint64_t Address = Sym.getValue();
231*9880d681SAndroid Build Coastguard Worker       Expected<StringRef> Name = Sym.getName();
232*9880d681SAndroid Build Coastguard Worker       if (!Name ||
233*9880d681SAndroid Build Coastguard Worker           (Sym.getFlags() & (SymbolRef::SF_Absolute | SymbolRef::SF_Common))) {
234*9880d681SAndroid Build Coastguard Worker         // TODO: Actually report errors helpfully.
235*9880d681SAndroid Build Coastguard Worker         if (!Name)
236*9880d681SAndroid Build Coastguard Worker           consumeError(Name.takeError());
237*9880d681SAndroid Build Coastguard Worker         continue;
238*9880d681SAndroid Build Coastguard Worker       }
239*9880d681SAndroid Build Coastguard Worker       SymbolAddresses[*Name] = Address;
240*9880d681SAndroid Build Coastguard Worker     }
241*9880d681SAndroid Build Coastguard Worker   }
242*9880d681SAndroid Build Coastguard Worker 
243*9880d681SAndroid Build Coastguard Worker   sys::TimeValue TV;
244*9880d681SAndroid Build Coastguard Worker   TV.fromEpochTime(Timestamp);
245*9880d681SAndroid Build Coastguard Worker   dsymutil::DebugMapObject Res(Path, TV);
246*9880d681SAndroid Build Coastguard Worker   for (auto &Entry : Entries) {
247*9880d681SAndroid Build Coastguard Worker     auto &Mapping = Entry.second;
248*9880d681SAndroid Build Coastguard Worker     Optional<uint64_t> ObjAddress;
249*9880d681SAndroid Build Coastguard Worker     if (Mapping.ObjectAddress)
250*9880d681SAndroid Build Coastguard Worker       ObjAddress = *Mapping.ObjectAddress;
251*9880d681SAndroid Build Coastguard Worker     auto AddressIt = SymbolAddresses.find(Entry.first);
252*9880d681SAndroid Build Coastguard Worker     if (AddressIt != SymbolAddresses.end())
253*9880d681SAndroid Build Coastguard Worker       ObjAddress = AddressIt->getValue();
254*9880d681SAndroid Build Coastguard Worker     Res.addSymbol(Entry.first, ObjAddress, Mapping.BinaryAddress, Mapping.Size);
255*9880d681SAndroid Build Coastguard Worker   }
256*9880d681SAndroid Build Coastguard Worker   return Res;
257*9880d681SAndroid Build Coastguard Worker }
258*9880d681SAndroid Build Coastguard Worker }
259*9880d681SAndroid Build Coastguard Worker }
260