From 855d3cb8e3e831a48378865575bf950deda1ecf1 Mon Sep 17 00:00:00 2001 From: Jez Ng Date: Fri, 31 Mar 2023 13:19:48 -0400 Subject: [PATCH] [lld-macho] Gate category checking behind --check-category-conflicts @oontvoo reports that the current implementation crashes on a bunch of their builds. Let's leave it disabled by default for now. Reviewed By: #lld-macho, oontvoo Differential Revision: https://reviews.llvm.org/D147341 --- lld/MachO/Driver.cpp | 3 ++- lld/MachO/Options.td | 3 +++ lld/test/MachO/objc-category-conflicts.s | 12 ++++++++---- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lld/MachO/Driver.cpp b/lld/MachO/Driver.cpp index 9262fff..49f6651 100644 --- a/lld/MachO/Driver.cpp +++ b/lld/MachO/Driver.cpp @@ -1921,7 +1921,8 @@ bool macho::link(ArrayRef argsArr, llvm::raw_ostream &stdoutOS, if (config->deadStrip) markLive(); - objc::checkCategories(); + if (args.hasArg(OPT_check_category_conflicts)) + objc::checkCategories(); // ICF assumes that all literals have been folded already, so we must run // foldIdenticalLiterals before foldIdenticalSections. diff --git a/lld/MachO/Options.td b/lld/MachO/Options.td index 408be46..ec747d0 100644 --- a/lld/MachO/Options.td +++ b/lld/MachO/Options.td @@ -121,6 +121,9 @@ def ignore_auto_link_option_eq : Joined<["--"], "ignore-auto-link-option=">, def strict_auto_link : Flag<["--"], "strict-auto-link">, HelpText<"Always warn for missing frameworks or libraries if they are loaded via LC_LINKER_OPTIONS">, Group; +def check_category_conflicts : Flag<["--"], "check-category-conflicts">, + HelpText<"Check for conflicts between category & class methods">, + Group; // This is a complete Options.td compiled from Apple's ld(1) manpage // dated 2018-03-07 and cross checked with ld64 source code in repo diff --git a/lld/test/MachO/objc-category-conflicts.s b/lld/test/MachO/objc-category-conflicts.s index da1b0c6..59a9ed5 100644 --- a/lld/test/MachO/objc-category-conflicts.s +++ b/lld/test/MachO/objc-category-conflicts.s @@ -9,21 +9,25 @@ # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos11.0 -I %t %t/klass-with-no-rodata.s -o %t/klass-with-no-rodata.o # RUN: %lld -dylib -lobjc %t/klass.o -o %t/libklass.dylib -# RUN: %no-fatal-warnings-lld -dylib -lobjc %t/klass.o %t/cat1.o %t/cat2.o -o \ +# RUN: %no-fatal-warnings-lld --check-category-conflicts -dylib -lobjc %t/klass.o %t/cat1.o %t/cat2.o -o \ # RUN: /dev/null 2>&1 | FileCheck %s --check-prefixes=CATCLS,CATCAT -# RUN: %no-fatal-warnings-lld -dylib -lobjc %t/libklass.dylib %t/cat1.o \ +# RUN: %no-fatal-warnings-lld --check-category-conflicts -dylib -lobjc %t/libklass.dylib %t/cat1.o \ # RUN: %t/cat2.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=CATCAT ## Check that we don't emit spurious warnings around the +load method while ## still emitting the other warnings. Note that we have made separate ## `*-with-load.s` files for ease of comparison with ld64; ld64 will not warn ## at all if multiple +load methods are present. -# RUN: %no-fatal-warnings-lld -dylib -lobjc %t/klass-with-load.o \ +# RUN: %no-fatal-warnings-lld --check-category-conflicts -dylib -lobjc %t/klass-with-load.o \ # RUN: %t/cat1-with-load.o %t/cat2-with-load.o -o /dev/null 2>&1 | \ # RUN: FileCheck %s --check-prefixes=CATCLS,CATCAT --implicit-check-not '+load' ## Regression test: Check that we don't crash. -# RUN: %no-fatal-warnings-lld -dylib -lobjc %t/klass-with-no-rodata.o -o /dev/null +# RUN: %no-fatal-warnings-lld --check-category-conflicts -dylib -lobjc %t/klass-with-no-rodata.o -o /dev/null + +## Check that we don't emit any warnings without --check-category-conflicts. +# RUN: %no-fatal-warnings-lld -dylib -lobjc %t/klass.o %t/cat1.o %t/cat2.o -o \ +# RUN: /dev/null 2>&1 | FileCheck %s --implicit-check-not 'warning' --allow-empty # CATCLS: warning: method '+s1' has conflicting definitions: # CATCLS-NEXT: >>> defined in category Cat1 from {{.*}}cat1{{.*}}.o -- 2.7.4