From 01095a5d43bbfde13731688ddcf6048ebb8b7721 Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Sat, 23 Jul 2016 20:41:05 +0000 Subject: Vendor import of llvm release_39 branch r276489: https://llvm.org/svn/llvm-project/llvm/branches/release_39@276489 --- tools/dsymutil/DebugMap.cpp | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) (limited to 'tools/dsymutil/DebugMap.cpp') 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 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::YamlDMO { void MappingTraits>:: mapping(IO &io, std::pair &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::YamlDMO::denormalize(IO &IO) { // look them up here and rewrite them. for (const auto &Sym : ErrOrObjectFile->symbols()) { uint64_t Address = Sym.getValue(); - ErrorOr Name = Sym.getName(); - if (!Name) + Expected 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::YamlDMO::denormalize(IO &IO) { dsymutil::DebugMapObject Res(Path, TV); for (auto &Entry : Entries) { auto &Mapping = Entry.second; - uint64_t ObjAddress = Mapping.ObjectAddress; + Optional ObjAddress; + if (Mapping.ObjectAddress) + ObjAddress = *Mapping.ObjectAddress; auto AddressIt = SymbolAddresses.find(Entry.first); if (AddressIt != SymbolAddresses.end()) ObjAddress = AddressIt->getValue(); -- cgit v1.3