diff options
Diffstat (limited to 'tools/dsymutil/DebugMap.cpp')
| -rw-r--r-- | tools/dsymutil/DebugMap.cpp | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/tools/dsymutil/DebugMap.cpp b/tools/dsymutil/DebugMap.cpp index e5cc87b3f318..4717085f4322 100644 --- a/tools/dsymutil/DebugMap.cpp +++ b/tools/dsymutil/DebugMap.cpp @@ -20,8 +20,9 @@ namespace dsymutil { using namespace llvm::object; -DebugMapObject::DebugMapObject(StringRef ObjectFilename) - : Filename(ObjectFilename) {} +DebugMapObject::DebugMapObject(StringRef ObjectFilename, + sys::TimeValue Timestamp) + : Filename(ObjectFilename), Timestamp(Timestamp) {} bool DebugMapObject::addSymbol(StringRef Name, uint64_t ObjectAddress, uint64_t LinkedAddress, uint32_t Size) { @@ -58,8 +59,9 @@ void DebugMapObject::print(raw_ostream &OS) const { void DebugMapObject::dump() const { print(errs()); } #endif -DebugMapObject &DebugMap::addDebugMapObject(StringRef ObjectFilePath) { - Objects.emplace_back(new DebugMapObject(ObjectFilePath)); +DebugMapObject &DebugMap::addDebugMapObject(StringRef ObjectFilePath, + sys::TimeValue Timestamp) { + Objects.emplace_back(new DebugMapObject(ObjectFilePath, Timestamp)); return *Objects.back(); } @@ -95,7 +97,7 @@ struct YAMLContext { }; } -ErrorOr<std::unique_ptr<DebugMap>> +ErrorOr<std::vector<std::unique_ptr<DebugMap>>> DebugMap::parseYAMLDebugMap(StringRef InputFile, StringRef PrependPath, bool Verbose) { auto ErrOrFile = MemoryBuffer::getFileOrSTDIN(InputFile); @@ -112,8 +114,9 @@ DebugMap::parseYAMLDebugMap(StringRef InputFile, StringRef PrependPath, if (auto EC = yin.error()) return EC; - - return std::move(Res); + std::vector<std::unique_ptr<DebugMap>> Result; + Result.push_back(std::move(Res)); + return std::move(Result); } } @@ -121,11 +124,12 @@ namespace yaml { // Normalize/Denormalize between YAML and a DebugMapObject. struct MappingTraits<dsymutil::DebugMapObject>::YamlDMO { - YamlDMO(IO &io) {} + YamlDMO(IO &io) { Timestamp = 0; } YamlDMO(IO &io, dsymutil::DebugMapObject &Obj); dsymutil::DebugMapObject denormalize(IO &IO); std::string Filename; + sys::TimeValue::SecondsType Timestamp; std::vector<dsymutil::DebugMapObject::YAMLSymbolMapping> Entries; }; @@ -141,6 +145,7 @@ void MappingTraits<dsymutil::DebugMapObject>::mapping( IO &io, dsymutil::DebugMapObject &DMO) { MappingNormalization<YamlDMO, dsymutil::DebugMapObject> Norm(io, DMO); io.mapRequired("filename", Norm->Filename); + io.mapOptional("timestamp", Norm->Timestamp); io.mapRequired("symbols", Norm->Entries); } @@ -174,9 +179,10 @@ SequenceTraits<std::vector<std::unique_ptr<dsymutil::DebugMapObject>>>::element( void MappingTraits<dsymutil::DebugMap>::mapping(IO &io, dsymutil::DebugMap &DM) { io.mapRequired("triple", DM.BinaryTriple); - io.mapOptional("objects", DM.Objects); + io.mapOptional("binary-path", DM.BinaryPath); if (void *Ctxt = io.getContext()) reinterpret_cast<YAMLContext *>(Ctxt)->BinaryTriple = DM.BinaryTriple; + io.mapOptional("objects", DM.Objects); } void MappingTraits<std::unique_ptr<dsymutil::DebugMap>>::mapping( @@ -184,14 +190,16 @@ void MappingTraits<std::unique_ptr<dsymutil::DebugMap>>::mapping( if (!DM) DM.reset(new DebugMap()); io.mapRequired("triple", DM->BinaryTriple); - io.mapOptional("objects", DM->Objects); + io.mapOptional("binary-path", DM->BinaryPath); if (void *Ctxt = io.getContext()) reinterpret_cast<YAMLContext *>(Ctxt)->BinaryTriple = DM->BinaryTriple; + io.mapOptional("objects", DM->Objects); } MappingTraits<dsymutil::DebugMapObject>::YamlDMO::YamlDMO( IO &io, dsymutil::DebugMapObject &Obj) { Filename = Obj.Filename; + Timestamp = Obj.getTimestamp().toEpochTime(); Entries.reserve(Obj.Symbols.size()); for (auto &Entry : Obj.Symbols) Entries.push_back(std::make_pair(Entry.getKey(), Entry.getValue())); @@ -205,11 +213,11 @@ MappingTraits<dsymutil::DebugMapObject>::YamlDMO::denormalize(IO &IO) { StringMap<uint64_t> SymbolAddresses; sys::path::append(Path, Filename); - auto ErrOrObjectFile = BinHolder.GetObjectFile(Path); - if (auto EC = ErrOrObjectFile.getError()) { + auto ErrOrObjectFiles = BinHolder.GetObjectFiles(Path); + if (auto EC = ErrOrObjectFiles.getError()) { llvm::errs() << "warning: Unable to open " << Path << " " << EC.message() << '\n'; - } else { + } else if (auto ErrOrObjectFile = BinHolder.Get(Ctxt.BinaryTriple)) { // Rewrite the object file symbol addresses in the debug map. The // YAML input is mainly used to test llvm-dsymutil without // requiring binaries checked-in. If we generate the object files @@ -224,7 +232,9 @@ MappingTraits<dsymutil::DebugMapObject>::YamlDMO::denormalize(IO &IO) { } } - dsymutil::DebugMapObject Res(Path); + sys::TimeValue TV; + TV.fromEpochTime(Timestamp); + dsymutil::DebugMapObject Res(Path, TV); for (auto &Entry : Entries) { auto &Mapping = Entry.second; uint64_t ObjAddress = Mapping.ObjectAddress; |
