summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrancis Visoiu Mistrih <francisvm@yahoo.com>2020-01-03 14:50:19 -0800
committerFrancis Visoiu Mistrih <francisvm@yahoo.com>2020-01-03 17:02:10 -0800
commitc8ab40ca0e760b50cc789b7a9d2de8d9eeebd261 (patch)
tree37ac0ae0780c585f2ac67fc7265ecae4b5991d0a
parent6c87623615b3befdf62e3a5cd6c408a698f1c2d9 (diff)
downloadbcm5719-llvm-c8ab40ca0e760b50cc789b7a9d2de8d9eeebd261.tar.gz
bcm5719-llvm-c8ab40ca0e760b50cc789b7a9d2de8d9eeebd261.zip
[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.
-rw-r--r--llvm/include/llvm/Support/Error.h2
-rw-r--r--llvm/test/tools/dsymutil/Inputs/basic1.c4
-rwxr-xr-xllvm/test/tools/dsymutil/Inputs/remarks/basic.macho.remarks.archive.x86_64bin0 -> 9320 bytes
-rw-r--r--llvm/test/tools/dsymutil/Inputs/remarks/libbasic.abin0 -> 9152 bytes
-rw-r--r--llvm/test/tools/dsymutil/X86/remarks-linking-archive.text43
-rw-r--r--llvm/tools/dsymutil/DwarfLinker.cpp36
6 files changed, 82 insertions, 3 deletions
diff --git a/llvm/include/llvm/Support/Error.h b/llvm/include/llvm/Support/Error.h
index 75fca01b127..44676338808 100644
--- a/llvm/include/llvm/Support/Error.h
+++ b/llvm/include/llvm/Support/Error.h
@@ -1232,6 +1232,8 @@ public:
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 20292069f5f..af96081ded9 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 00000000000..f4ab141d1a0
--- /dev/null
+++ b/llvm/test/tools/dsymutil/Inputs/remarks/basic.macho.remarks.archive.x86_64
Binary files differ
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 00000000000..c6b1dde9cce
--- /dev/null
+++ b/llvm/test/tools/dsymutil/Inputs/remarks/libbasic.a
Binary files differ
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 00000000000..117349c7839
--- /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 64acab69843..53f6b2899b0 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());
};
OpenPOWER on IntegriCloud