From e5553b9a6ab9f02f382a31cc5117b52c3bfaf77a Mon Sep 17 00:00:00 2001 From: Jonas Devlieghere Date: Tue, 12 Jan 2021 18:50:57 -0800 Subject: [PATCH] [dsymutil] Warn on timestmap mismatch between object file and debug map Add a warning when the timestmap doesn't match between the object file and the debug map entry. We were already emitting such warnings for archive members and swift interface files. This patch also unifies the warning across all three. rdar://65614640 Differential revision: https://reviews.llvm.org/D94536 --- .../dsymutil/Inputs/basic.macho.x86_64.o | 0 .../tools/dsymutil/X86/swift-ast-x86_64.test | 2 +- .../tools/dsymutil/debug-map-parsing.test | 2 ++ llvm/tools/dsymutil/BinaryHolder.cpp | 22 ++++++++++++++++--- llvm/tools/dsymutil/BinaryHolder.h | 2 +- llvm/tools/dsymutil/DwarfLinkerForBinary.cpp | 7 +++--- 6 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 llvm/test/tools/dsymutil/Inputs/basic.macho.x86_64.o diff --git a/llvm/test/tools/dsymutil/Inputs/basic.macho.x86_64.o b/llvm/test/tools/dsymutil/Inputs/basic.macho.x86_64.o new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test b/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test index 626208ff3496..43d930af7128 100644 --- a/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test +++ b/llvm/test/tools/dsymutil/X86/swift-ast-x86_64.test @@ -20,7 +20,7 @@ READOBJ-NEXT: |.| DWARFDUMP: __swift_ast RUN: dsymutil -oso-prepend-path %p/.. %p/../Inputs/swift-ast.macho.x86_64 -no-output -verbose 2>&1 | FileCheck %s --check-prefix=TIMESTAMP -TIMESTAMP: warning: Timestamp mismatch +TIMESTAMP: warning: {{.*}}/swift-ast.swiftmodule: timestamp mismatch between swift interface file ({{.*}}) and debug map ({{.*}}) RUN: dsymutil -s %T/swift-ast.dSYM/Contents/Resources/DWARF/swift-ast.macho.x86_64 | FileCheck %s --check-prefix=NAST NAST-NOT: N_AST diff --git a/llvm/test/tools/dsymutil/debug-map-parsing.test b/llvm/test/tools/dsymutil/debug-map-parsing.test index fb4226093da1..703934d38503 100644 --- a/llvm/test/tools/dsymutil/debug-map-parsing.test +++ b/llvm/test/tools/dsymutil/debug-map-parsing.test @@ -1,3 +1,4 @@ +RUN: touch %p/Inputs/basic.macho.x86_64.o RUN: dsymutil -dump-debug-map -oso-prepend-path=%p %p/Inputs/basic.macho.x86_64 | FileCheck %s RUN: dsymutil -dump-debug-map -oso-prepend-path=%p %p/Inputs/basic-lto.macho.x86_64 | FileCheck %s --check-prefix=CHECK-LTO RUN: dsymutil -verbose -dump-debug-map -oso-prepend-path=%p %p/Inputs/basic-archive.macho.x86_64 2>&1 | FileCheck %s --check-prefix=CHECK-ARCHIVE @@ -46,6 +47,7 @@ opening the archive once if mulitple of its members are used). CHECK-ARCHIVE: trying to open {{.*}}basic-archive.macho.x86_64' CHECK-ARCHIVE-NEXT: loaded object. CHECK-ARCHIVE-NEXT: trying to open {{.*}}/Inputs/basic1.macho.x86_64.o' +CHECK-ARCHIVE-NEXT: warning: {{.*}}/Inputs/basic1.macho.x86_64.o: timestamp mismatch between object file ({{.*}}) and debug map ({{.*}}) CHECK-ARCHIVE-NEXT: loaded object. CHECK-ARCHIVE-NEXT: trying to open {{.*}}/libbasic.a(basic2.macho.x86_64.o)' CHECK-ARCHIVE-NEXT: loaded archive {{.*}}/libbasic.a' diff --git a/llvm/tools/dsymutil/BinaryHolder.cpp b/llvm/tools/dsymutil/BinaryHolder.cpp index df3cb7161a81..b401d519718c 100644 --- a/llvm/tools/dsymutil/BinaryHolder.cpp +++ b/llvm/tools/dsymutil/BinaryHolder.cpp @@ -87,7 +87,8 @@ Error BinaryHolder::ArchiveEntry::load(IntrusiveRefCntPtr VFS, } Error BinaryHolder::ObjectEntry::load(IntrusiveRefCntPtr VFS, - StringRef Filename, bool Verbose) { + StringRef Filename, TimestampTy Timestamp, + bool Verbose) { // Try to load regular binary and force it to be memory mapped. auto ErrOrBuff = (Filename == "-") ? MemoryBuffer::getSTDIN() @@ -95,6 +96,17 @@ Error BinaryHolder::ObjectEntry::load(IntrusiveRefCntPtr VFS, if (auto Err = ErrOrBuff.getError()) return errorCodeToError(Err); + if (Filename != "-" && Timestamp != sys::TimePoint<>()) { + llvm::ErrorOr Stat = VFS->status(Filename); + if (!Stat) + return errorCodeToError(Stat.getError()); + if (Timestamp != Stat->getLastModificationTime()) + WithColor::warning() << Filename + << ": timestamp mismatch between object file (" + << Stat->getLastModificationTime() + << ") and debug map (" << Timestamp << ")\n"; + } + MemBuffer = std::move(*ErrOrBuff); if (Verbose) @@ -182,7 +194,11 @@ BinaryHolder::ArchiveEntry::getObjectEntry(StringRef Filename, if (Timestamp != sys::TimePoint<>() && Timestamp != ModTimeOrErr.get()) { if (Verbose) - WithColor::warning() << "member has timestamp mismatch.\n"; + WithColor::warning() + << *NameOrErr + << ": timestamp mismatch between archive member (" + << ModTimeOrErr.get() << ") and debug map (" << Timestamp + << ")\n"; continue; } @@ -246,7 +262,7 @@ BinaryHolder::getObjectEntry(StringRef Filename, TimestampTy Timestamp) { std::lock_guard Lock(ObjectCacheMutex); if (!ObjectCache.count(Filename)) { ObjectEntry &OE = ObjectCache[Filename]; - auto Err = OE.load(VFS, Filename, Verbose); + auto Err = OE.load(VFS, Filename, Timestamp, Verbose); if (Err) { ObjectCache.erase(Filename); return std::move(Err); diff --git a/llvm/tools/dsymutil/BinaryHolder.h b/llvm/tools/dsymutil/BinaryHolder.h index dee944d826a1..5e81fe4b93b1 100644 --- a/llvm/tools/dsymutil/BinaryHolder.h +++ b/llvm/tools/dsymutil/BinaryHolder.h @@ -58,7 +58,7 @@ public: public: /// Load the given object binary in memory. Error load(IntrusiveRefCntPtr VFS, StringRef Filename, - bool Verbose = false); + TimestampTy Timestamp, bool Verbose = false); /// Access all owned ObjectFiles. std::vector getObjects() const; diff --git a/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp b/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp index 891c38cd1e66..bd9529c4cd0f 100644 --- a/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp +++ b/llvm/tools/dsymutil/DwarfLinkerForBinary.cpp @@ -412,9 +412,10 @@ bool DwarfLinkerForBinary::link(const DebugMap &Map) { Stat.getLastModificationTime()); if (ModificationTime != Obj->getTimestamp()) { // Not using the helper here as we can easily stream TimePoint<>. - WithColor::warning() << "Timestamp mismatch for " << File << ": " - << Stat.getLastModificationTime() << " and " - << sys::TimePoint<>(Obj->getTimestamp()) << "\n"; + WithColor::warning() + << File << ": timestamp mismatch between swift interface file (" + << sys::TimePoint<>(Obj->getTimestamp()) << ") and debug map (" + << sys::TimePoint<>(Obj->getTimestamp()) << ")\n"; continue; } }