forked from OSchip/llvm-project
[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.
This commit is contained in:
parent
6c87623615
commit
c8ab40ca0e
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -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)
|
|
@ -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());
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue