[llvm] c8ab40c - [Remarks] Warn if a remark file is not found when processing static archives

Francis Visoiu Mistrih via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 3 17:02:56 PST 2020


Author: Francis Visoiu Mistrih
Date: 2020-01-03T17:02:10-08:00
New Revision: c8ab40ca0e760b50cc789b7a9d2de8d9eeebd261

URL: https://github.com/llvm/llvm-project/commit/c8ab40ca0e760b50cc789b7a9d2de8d9eeebd261
DIFF: https://github.com/llvm/llvm-project/commit/c8ab40ca0e760b50cc789b7a9d2de8d9eeebd261.diff

LOG: [Remarks] Warn if a remark file is not found when processing static archives

Static archives contain object files which contain sections pointing to
external remark files.

When static archives are shipped without the remark files, dsymutil
shouldn't generate an error.

Instead, generate a warning to inform the user that remarks for that
library won't be available in the .dSYM.

Added: 
    llvm/test/tools/dsymutil/Inputs/remarks/basic.macho.remarks.archive.x86_64
    llvm/test/tools/dsymutil/Inputs/remarks/libbasic.a
    llvm/test/tools/dsymutil/X86/remarks-linking-archive.text

Modified: 
    llvm/include/llvm/Support/Error.h
    llvm/test/tools/dsymutil/Inputs/basic1.c
    llvm/tools/dsymutil/DwarfLinker.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/include/llvm/Support/Error.h b/llvm/include/llvm/Support/Error.h
index 75fca01b1270..44676338808b 100644
--- a/llvm/include/llvm/Support/Error.h
+++ b/llvm/include/llvm/Support/Error.h
@@ -1232,6 +1232,8 @@ class FileError final : public ErrorInfo<FileError> {
     Err->log(OS);
   }
 
+  StringRef getFileName() { return FileName; }
+
   Error takeError() { return Error(std::move(Err)); }
 
   std::error_code convertToErrorCode() const override;

diff  --git a/llvm/test/tools/dsymutil/Inputs/basic1.c b/llvm/test/tools/dsymutil/Inputs/basic1.c
index 20292069f5fb..af96081ded97 100644
--- a/llvm/test/tools/dsymutil/Inputs/basic1.c
+++ b/llvm/test/tools/dsymutil/Inputs/basic1.c
@@ -26,6 +26,10 @@
       done
       clang basic1.macho.remarks.x86_64.o basic2.macho.remarks.x86_64.o basic3.macho.remarks.x86_64.o -o basic.macho.remarks.x86_64 -Wl,-dead_strip
 
+    Remarks archive compilation (after remarks compilation):
+    ar -q libbasic.a basic1.macho.x86_64.o basic2.macho.x86_64.o basic3.macho.x86_64.o
+    clang -lbasic -L. -o basic.macho.remarks.archive.x86_64 -Wl,-dead_strip
+
 */
 
 int foo(int);

diff  --git a/llvm/test/tools/dsymutil/Inputs/remarks/basic.macho.remarks.archive.x86_64 b/llvm/test/tools/dsymutil/Inputs/remarks/basic.macho.remarks.archive.x86_64
new file mode 100755
index 000000000000..f4ab141d1a02
Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/remarks/basic.macho.remarks.archive.x86_64 
diff er

diff  --git a/llvm/test/tools/dsymutil/Inputs/remarks/libbasic.a b/llvm/test/tools/dsymutil/Inputs/remarks/libbasic.a
new file mode 100644
index 000000000000..c6b1dde9cceb
Binary files /dev/null and b/llvm/test/tools/dsymutil/Inputs/remarks/libbasic.a 
diff er

diff  --git a/llvm/test/tools/dsymutil/X86/remarks-linking-archive.text b/llvm/test/tools/dsymutil/X86/remarks-linking-archive.text
new file mode 100644
index 000000000000..117349c78396
--- /dev/null
+++ b/llvm/test/tools/dsymutil/X86/remarks-linking-archive.text
@@ -0,0 +1,43 @@
+RUN: rm -rf %t
+RUN: mkdir -p %t
+RUN: cat %p/../Inputs/remarks/basic.macho.remarks.archive.x86_64 > %t/basic.macho.remarks.archive.x86_64
+
+RUN: dsymutil -oso-prepend-path=%p/../Inputs -remarks-prepend-path=%p/../Inputs %t/basic.macho.remarks.archive.x86_64
+
+Check that the remark file in the bundle exists and is sane:
+RUN: llvm-bcanalyzer -dump %t/basic.macho.remarks.archive.x86_64.dSYM/Contents/Resources/Remarks/basic.macho.remarks.archive.x86_64 | FileCheck %s
+
+Check that we don't error if we're missing remark files from an archive, but we warn instead.
+Instead of creating a new binary, just remove the remarks prepend path.
+RUN: dsymutil -oso-prepend-path=%p/../Inputs %t/basic.macho.remarks.archive.x86_64 2>&1 | FileCheck %s --check-prefix=CHECK-MISSING
+
+CHECK: <Meta
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK: <Remark Num
+CHECK-NOT: <Remark Num
+
+CHECK-MISSING: warning: '/remarks/basic1.macho.remarks.x86_64.opt.bitstream': No such file or directory
+CHECK-MISSING-NEXT: note: while processing {{.*}}libbasic.a(basic1.macho.remarks.x86_64.o)
+CHECK-MISSING-NEXT: warning: '/remarks/basic2.macho.remarks.x86_64.opt.bitstream': No such file or directory
+CHECK-MISSING-NEXT: note: while processing {{.*}}libbasic.a(basic2.macho.remarks.x86_64.o)
+CHECK-MISSING-NEXT: warning: '/remarks/basic3.macho.remarks.x86_64.opt.bitstream': No such file or directory
+CHECK-MISSING-NEXT: note: while processing {{.*}}libbasic.a(basic3.macho.remarks.x86_64.o)

diff  --git a/llvm/tools/dsymutil/DwarfLinker.cpp b/llvm/tools/dsymutil/DwarfLinker.cpp
index 64acab698434..53f6b2899b00 100644
--- a/llvm/tools/dsymutil/DwarfLinker.cpp
+++ b/llvm/tools/dsymutil/DwarfLinker.cpp
@@ -188,6 +188,30 @@ static bool isTypeTag(uint16_t Tag) {
   return false;
 }
 
+static Error remarksErrorHandler(const DebugMapObject &DMO, DwarfLinker &Linker,
+                                 std::unique_ptr<FileError> FE) {
+  bool IsArchive = DMO.getObjectFilename().endswith(")");
+  // Don't report errors for missing remark files from static
+  // archives.
+  if (!IsArchive)
+    return Error(std::move(FE));
+
+  std::string Message = FE->message();
+  Error E = FE->takeError();
+  Error NewE = handleErrors(std::move(E), [&](std::unique_ptr<ECError> EC) {
+    if (EC->convertToErrorCode() != std::errc::no_such_file_or_directory)
+      return Error(std::move(EC));
+
+    Linker.reportWarning(Message, DMO);
+    return Error(Error::success());
+  });
+
+  if (!NewE)
+    return Error::success();
+
+  return createFileError(FE->getFileName(), std::move(NewE));
+}
+
 bool DwarfLinker::DIECloner::getDIENames(const DWARFDie &Die,
                                          AttributesInfo &Info,
                                          OffsetsStringPool &StringPool,
@@ -2946,9 +2970,15 @@ bool DwarfLinker::link(const DebugMap &Map) {
   auto RemarkLinkLambda = [&](size_t i) {
     // Link remarks from one object file.
     auto &LinkContext = ObjectContexts[i];
-    if (const object::ObjectFile *Obj = LinkContext.ObjectFile)
-      if (Error E = RL.link(*Obj))
-        return E;
+    if (const object::ObjectFile *Obj = LinkContext.ObjectFile) {
+      Error E = RL.link(*Obj);
+      if (Error NewE = handleErrors(
+              std::move(E), [&](std::unique_ptr<FileError> EC) -> Error {
+                return remarksErrorHandler(LinkContext.DMO, *this,
+                                           std::move(EC));
+              }))
+        return NewE;
+    }
     return Error(Error::success());
   };
 


        


More information about the llvm-commits mailing list