[lld] 74cbd71 - [lld-macho] Mark dylib symbols coming from -weak_framework as weak-ref.

Vy Nguyen via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 30 06:55:20 PST 2021


Author: Vy Nguyen
Date: 2021-11-30T09:54:59-05:00
New Revision: 74cbd71072de4f20c5cb9852dc4cf96ac7a4b5a4

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

LOG: [lld-macho] Mark dylib symbols coming from -weak_framework as weak-ref.

PR:52564

Differential Revision: https://reviews.llvm.org/D114397

Added: 
    

Modified: 
    lld/MachO/Symbols.h
    lld/test/MachO/weak-import.s

Removed: 
    


################################################################################
diff  --git a/lld/MachO/Symbols.h b/lld/MachO/Symbols.h
index cc6f51cc5fd3a..d1182a0a2d326 100644
--- a/lld/MachO/Symbols.h
+++ b/lld/MachO/Symbols.h
@@ -236,7 +236,12 @@ class DylibSymbol : public Symbol {
 
   uint64_t getVA() const override;
   bool isWeakDef() const override { return weakDef; }
-  bool isWeakRef() const override { return refState == RefState::Weak; }
+
+  // Symbols from weak libraries/frameworks are also weakly-referenced.
+  bool isWeakRef() const override {
+    return refState == RefState::Weak ||
+           (file && getFile()->umbrella->forceWeakImport);
+  }
   bool isReferenced() const { return refState != RefState::Unreferenced; }
   bool isTlv() const override { return tlv; }
   bool isDynamicLookup() const { return file == nullptr; }

diff  --git a/lld/test/MachO/weak-import.s b/lld/test/MachO/weak-import.s
index 6051a60f1cf0d..5b1f3b3c960b1 100644
--- a/lld/test/MachO/weak-import.s
+++ b/lld/test/MachO/weak-import.s
@@ -6,15 +6,17 @@
 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/mixed-ref.s -o %t/mixed-ref.o
 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/foo.s -o %t/foo.o
 # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/bar.s -o %t/bar.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/weak-reexport.s -o %t/weak-reexport.o
+
 # RUN: %lld -lSystem -dylib %t/bar.o -o %t/libbar.dylib
 # RUN: %lld -lSystem -dylib %t/foo.o %t/libbar.dylib -sub_library libbar -o %t/libfoo.dylib
 
-# RUN: %lld -weak-lSystem %t/test.o -weak_framework CoreFoundation -weak_library %t/libfoo.dylib -o %t/test
-# RUN: llvm-objdump --macho --all-headers %t/test | FileCheck %s -DDIR=%t --check-prefixes=WEAK-SYS,WEAK-FOO
+# RUN: %lld -weak-lSystem %t/test.o -weak_framework CoreFoundation -weak_library %t/libfoo.dylib -o %t/basic
+# RUN: llvm-objdump --macho --all-headers %t/basic | FileCheck %s -DDIR=%t --check-prefixes=WEAK-SYS,WEAK-FOO
 # RUN: %lld -weak-lSystem %t/test.o \
 # RUN:   -framework CoreFoundation -weak_framework CoreFoundation -framework CoreFoundation \
-# RUN:   %t/libfoo.dylib -weak_library %t/libfoo.dylib %t/libfoo.dylib -o %t/test
-# RUN: llvm-objdump --macho --all-headers %t/test | FileCheck %s -DDIR=%t --check-prefixes=WEAK-SYS,WEAK-FOO
+# RUN:   %t/libfoo.dylib -weak_library %t/libfoo.dylib %t/libfoo.dylib -o %t/basic-weak-strong
+# RUN: llvm-objdump --macho --all-headers %t/basic-weak-strong | FileCheck %s -DDIR=%t --check-prefixes=WEAK-SYS,WEAK-FOO
 # RUN: %lld -lSystem -dylib %t/libfoo.dylib %t/weak-ref-only.o -o %t/weak-ref-only
 # RUN: llvm-objdump --macho --all-headers %t/weak-ref-only | FileCheck %s -DDIR=%t --check-prefixes=SYS,WEAK-FOO
 # RUN: %lld -lSystem -dylib %t/libfoo.dylib %t/weak-ref-sub-library.o -o %t/weak-ref-sub-library
@@ -22,6 +24,16 @@
 # RUN: %lld -lSystem -dylib %t/libfoo.dylib %t/mixed-ref.o -o %t/mixed-ref
 # RUN: llvm-objdump --macho --all-headers %t/mixed-ref | FileCheck %s -DDIR=%t --check-prefixes=SYS,FOO
 
+# RUN: %lld -framework CoreFoundation %t/test.o -weak_framework CoreFoundation -o %t/strong-weak-import.out
+# RUN: llvm-objdump --macho --bind %t/strong-weak-import.out | FileCheck %s --check-prefix=WEAK-IMP
+# RUN: llvm-objdump --macho --bind %t/basic-weak-strong | FileCheck %s --check-prefix=WEAK-IMP
+
+## This references the gxx_personality_v0 symbol, which is defined in libc++abi, which is then
+## reexported by libc++.
+## Check that reexported symbols from weak libraries are also weakly-referenced.
+# RUN: %lld -weak-lc++ %t/weak-reexport.o -o %t/weak-reexport.out
+# RUN: llvm-objdump --macho --bind %t/weak-reexport.out | FileCheck %s --check-prefix=WEAK-REEXPORT
+
 # WEAK-SYS:          cmd LC_LOAD_WEAK_DYLIB
 # WEAK-SYS-NEXT: cmdsize
 # WEAK-SYS-NEXT:    name /usr/lib/libSystem.dylib
@@ -42,6 +54,8 @@
 # FOO-NEXT:      cmdsize
 # FOO-NEXT:         name [[DIR]]/libfoo.dylib
 
+# WEAK-IMP: {{.+}} pointer         0 CoreFoundation   __CFBigNumGetInt128 (weak_import)
+# WEAK-REEXPORT: {{.+}} pointer    0 libc++abi        ___gxx_personality_v0 (weak_import)
 #--- foo.s
 .globl _foo
 _foo:
@@ -69,4 +83,12 @@ _bar:
 #--- test.s
 .globl _main
 _main:
+  movq __CFBigNumGetInt128 at GOTPCREL(%rip), %rax        
   ret
+
+#--- weak-reexport.s
+.globl _main
+_main:
+
+.data
+.quad ___gxx_personality_v0


        


More information about the llvm-commits mailing list