diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2016-07-23 20:41:05 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2016-07-23 20:41:05 +0000 |
| commit | 01095a5d43bbfde13731688ddcf6048ebb8b7721 (patch) | |
| tree | 4def12e759965de927d963ac65840d663ef9d1ea /tools/dsymutil/DebugMap.cpp | |
| parent | f0f4822ed4b66e3579e92a89f368f8fb860e218e (diff) | |
Notes
Diffstat (limited to 'tools/dsymutil/DebugMap.cpp')
| -rw-r--r-- | tools/dsymutil/DebugMap.cpp | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/tools/dsymutil/DebugMap.cpp b/tools/dsymutil/DebugMap.cpp index 4717085f4322..5130cd62ed2f 100644 --- a/tools/dsymutil/DebugMap.cpp +++ b/tools/dsymutil/DebugMap.cpp @@ -24,13 +24,13 @@ DebugMapObject::DebugMapObject(StringRef ObjectFilename, sys::TimeValue Timestamp) : Filename(ObjectFilename), Timestamp(Timestamp) {} -bool DebugMapObject::addSymbol(StringRef Name, uint64_t ObjectAddress, +bool DebugMapObject::addSymbol(StringRef Name, Optional<uint64_t> ObjectAddress, uint64_t LinkedAddress, uint32_t Size) { auto InsertResult = Symbols.insert( std::make_pair(Name, SymbolMapping(ObjectAddress, LinkedAddress, Size))); - if (InsertResult.second) - AddressToMapping[ObjectAddress] = &*InsertResult.first; + if (ObjectAddress && InsertResult.second) + AddressToMapping[*ObjectAddress] = &*InsertResult.first; return InsertResult.second; } @@ -47,8 +47,11 @@ void DebugMapObject::print(raw_ostream &OS) const { Entries.begin(), Entries.end(), [](const Entry &LHS, const Entry &RHS) { return LHS.first < RHS.first; }); for (const auto &Sym : Entries) { - OS << format("\t%016" PRIx64 " => %016" PRIx64 "+0x%x\t%s\n", - uint64_t(Sym.second.ObjectAddress), + if (Sym.second.ObjectAddress) + OS << format("\t%016" PRIx64, uint64_t(*Sym.second.ObjectAddress)); + else + OS << "\t????????????????"; + OS << format(" => %016" PRIx64 "+0x%x\t%s\n", uint64_t(Sym.second.BinaryAddress), uint32_t(Sym.second.Size), Sym.first.data()); } @@ -136,7 +139,7 @@ struct MappingTraits<dsymutil::DebugMapObject>::YamlDMO { void MappingTraits<std::pair<std::string, DebugMapObject::SymbolMapping>>:: mapping(IO &io, std::pair<std::string, DebugMapObject::SymbolMapping> &s) { io.mapRequired("sym", s.first); - io.mapRequired("objAddr", s.second.ObjectAddress); + io.mapOptional("objAddr", s.second.ObjectAddress); io.mapRequired("binAddr", s.second.BinaryAddress); io.mapOptional("size", s.second.Size); } @@ -225,9 +228,14 @@ MappingTraits<dsymutil::DebugMapObject>::YamlDMO::denormalize(IO &IO) { // look them up here and rewrite them. for (const auto &Sym : ErrOrObjectFile->symbols()) { uint64_t Address = Sym.getValue(); - ErrorOr<StringRef> Name = Sym.getName(); - if (!Name) + Expected<StringRef> Name = Sym.getName(); + if (!Name || + (Sym.getFlags() & (SymbolRef::SF_Absolute | SymbolRef::SF_Common))) { + // TODO: Actually report errors helpfully. + if (!Name) + consumeError(Name.takeError()); continue; + } SymbolAddresses[*Name] = Address; } } @@ -237,7 +245,9 @@ MappingTraits<dsymutil::DebugMapObject>::YamlDMO::denormalize(IO &IO) { dsymutil::DebugMapObject Res(Path, TV); for (auto &Entry : Entries) { auto &Mapping = Entry.second; - uint64_t ObjAddress = Mapping.ObjectAddress; + Optional<uint64_t> ObjAddress; + if (Mapping.ObjectAddress) + ObjAddress = *Mapping.ObjectAddress; auto AddressIt = SymbolAddresses.find(Entry.first); if (AddressIt != SymbolAddresses.end()) ObjAddress = AddressIt->getValue(); |
