diff --git a/llvm/docs/CommandGuide/llvm-libtool-darwin.rst b/llvm/docs/CommandGuide/llvm-libtool-darwin.rst --- a/llvm/docs/CommandGuide/llvm-libtool-darwin.rst +++ b/llvm/docs/CommandGuide/llvm-libtool-darwin.rst @@ -64,6 +64,10 @@ :option:`-L` and before the default search path. The default search path includes directories `/lib`, `/usr/lib` and `/usr/local/lib`. +.. option:: -no_warning_for_no_symbols + + Do not warn about files that have no symbols. + .. option:: -o Specify the output file name. Must be specified exactly once. diff --git a/llvm/test/tools/llvm-libtool-darwin/no-symbols-warning.test b/llvm/test/tools/llvm-libtool-darwin/no-symbols-warning.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/llvm-libtool-darwin/no-symbols-warning.test @@ -0,0 +1,50 @@ +## This test verifies that the tool emits a warning for object files +## without symbols. + +# RUN: yaml2obj --docnum=1 %s -o %t-x86_64-empty.o +# RUN: yaml2obj --docnum=2 %s -o %t-armv7-empty.o +# RUN: echo 'target triple = "arm64-apple-ios8.0.0"' | llvm-as -o %t-empty.bc +# RUN: yaml2obj %S/Inputs/input1.yaml -o %t-non-empty.o + +# RUN: llvm-libtool-darwin -static -o %t.lib %t-x86_64-empty.o 2>&1 | \ +# RUN: FileCheck --check-prefix=WARNING %s -DPREFIX=%basename_t.tmp + +# WARNING: warning: [[PREFIX]]-x86_64-empty.o has no symbols + +# RUN: llvm-libtool-darwin -no_warning_for_no_symbols -static -o %t.lib \ +# RUN: %t-x86_64-empty.o 2>&1 | \ +# RUN: FileCheck %s --allow-empty --implicit-check-not='warning:' + +# RUN: llvm-libtool-darwin -static -o %t.lib %t-non-empty.o 2>&1 | \ +# RUN: FileCheck %s --allow-empty --implicit-check-not='warning:' + +# RUN: llvm-libtool-darwin -arch_only x86_64 -static -o %t.lib \ +# RUN: %t-non-empty.o %t-armv7-empty.o 2>&1 | \ +# RUN: FileCheck %s --allow-empty --implicit-check-not='warning:' + +# RUN: llvm-libtool-darwin -static -o %t.lib %t-empty.bc 2>&1 | \ +# RUN: FileCheck %s --allow-empty --implicit-check-not='warning:' + +## x86_64 +--- !mach-o +FileHeader: + magic: 0xFEEDFACF + cputype: 0x1000007 + cpusubtype: 0x3 + filetype: 0x1 + ncmds: 0 + sizeofcmds: 0 + flags: 0x2000 + reserved: 0x0 +... + +## armv7 +--- !mach-o +FileHeader: + magic: 0xFEEDFACE + cputype: 0x0000000C + cpusubtype: 0x00000009 + filetype: 0x00000001 + ncmds: 0 + sizeofcmds: 0 + flags: 0x00002000 diff --git a/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp b/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp --- a/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp +++ b/llvm/tools/llvm-libtool-darwin/llvm-libtool-darwin.cpp @@ -89,6 +89,11 @@ VersionOption("V", cl::desc("Print the version number and exit"), cl::cat(LibtoolCategory)); +static cl::opt NoWarningForNoSymbols( + "no_warning_for_no_symbols", + cl::desc("Do not warn about files that have no symbols"), + cl::cat(LibtoolCategory), cl::init(false)); + static const std::array StandardSearchDirs{ "/lib", "/usr/lib", @@ -251,6 +256,9 @@ return Error::success(); } + if (!NoWarningForNoSymbols && O->symbols().empty()) + WithColor::warning() << Member.MemberName + " has no symbols\n"; + uint64_t FileCPUID = getCPUID(FileCPUType, FileCPUSubtype); Members[FileCPUID].push_back(std::move(Member)); return Error::success();