# REQUIRES: x86 # RUN: rm -rf %t; split-file %s %t # RUN: mkdir -p %t/bin # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos -o %t/weak.o %t/weak.s # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos -o %t/strong_a.o %t/strong_a.s # RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos -o %t/strong_b.o %t/strong_b.s # --- Test Case 1: No overrides # RUN: %lld %t/weak.o -o %t/bin/alone -e _s # RUN: llvm-nm -am %t/bin/alone | FileCheck --check-prefix=NM_ALONE %s # NM_ALONE: [[#%x, P_ADDR:]] (__TEXT,__const) weak external _placeholder_int # NM_ALONE: [[#P_ADDR]] (__TEXT,__const) weak external _weak_a # NM_ALONE: [[#P_ADDR]] (__TEXT,__const) weak external _weak_b # --- Test Case 2: Override weak_a # RUN: %lld %t/weak.o %t/strong_a.o -o %t/bin/with_a -e _s # RUN: llvm-nm -am %t/bin/with_a | FileCheck --check-prefix=NM_WITH_A %s # RUN: llvm-nm -am %t/bin/with_a | FileCheck --check-prefix=NM_WITH_A_BAD %s # NM_WITH_A: [[#%x, P_ADDR:]] (__TEXT,__const) weak external _placeholder_int # NM_WITH_A: [[#%x, A_ADDR:]] (__TEXT,__const) external _strong_a # NM_WITH_A: [[#A_ADDR]] (__TEXT,__const) external _weak_a # NM_WITH_A: [[#P_ADDR]] (__TEXT,__const) weak external _weak_b # --- Addresses of _placeholder_int and _strong_a must not match. # NM_WITH_A_BAD: [[#%x, P_ADDR:]] (__TEXT,__const) weak external _placeholder_int # NM_WITH_A_BAD-NOT: [[#P_ADDR]] (__TEXT,__const) external _strong_a # --- Test Case 3: Override weak_b # RUN: %lld %t/weak.o %t/strong_b.o -o %t/bin/with_b -e _s # RUN: llvm-nm -am %t/bin/with_b | FileCheck --check-prefix=NM_WITH_B %s # RUN: llvm-nm -am %t/bin/with_b | FileCheck --check-prefix=NM_WITH_B_BAD %s # NM_WITH_B: [[#%x, P_ADDR:]] (__TEXT,__const) weak external _placeholder_int # NM_WITH_B: [[#%x, B_ADDR:]] (__TEXT,__const) external _strong_b # NM_WITH_B: [[#P_ADDR]] (__TEXT,__const) weak external _weak_a # NM_WITH_B: [[#B_ADDR]] (__TEXT,__const) external _weak_b # --- Addresses of _placeholder_int and _strong_a must not match. # NM_WITH_B_BAD: [[#%x, P_ADDR:]] (__TEXT,__const) weak external _placeholder_int # NM_WITH_B_BAD-NOT: [[#P_ADDR]] (__TEXT,__const) external _strong_b # --- Test Case 4: Override weak_a and weak_b # RUN: %lld %t/weak.o %t/strong_a.o %t/strong_b.o -o %t/bin/with_ab -e _s # RUN: llvm-nm -am %t/bin/with_ab | FileCheck --check-prefix=NM_WITH_AB %s # RUN: llvm-nm -am %t/bin/with_ab | FileCheck --check-prefix=NM_WITH_AB_BAD %s # NM_WITH_AB: [[#%x, P_ADDR:]] (__TEXT,__const) weak external _placeholder_int # NM_WITH_AB: [[#%x, A_ADDR:]] (__TEXT,__const) external _strong_a # NM_WITH_AB: [[#%x, B_ADDR:]] (__TEXT,__const) external _strong_b # NM_WITH_AB: [[#A_ADDR]] (__TEXT,__const) external _weak_a # NM_WITH_AB: [[#B_ADDR]] (__TEXT,__const) external _weak_b # --- Addresses of _placeholder_int, _strong_a, and _strong_b must all be distinct # NM_WITH_AB_BAD: [[#%x, P_ADDR:]] (__TEXT,__const) weak external _placeholder_int # NM_WITH_AB_BAD-NOT: [[#P_ADDR]] (__TEXT,__const) external _strong_a # NM_WITH_AB_BAD-NOT: [[#P_ADDR]] (__TEXT,__const) external _strong_b #--- weak.s .section __TEXT,__const .globl _placeholder_int .weak_definition _placeholder_int _placeholder_int: .long 0 .globl _weak_a .set _weak_a, _placeholder_int .weak_definition _weak_a .globl _weak_b .set _weak_b, _placeholder_int .weak_definition _weak_b .globl _s _s: .quad _weak_a .quad _weak_b #--- strong_a.s .section __TEXT,__const .globl _strong_a _strong_a: .long 1 .globl _weak_a _weak_a = _strong_a #--- strong_b.s .section __TEXT,__const .globl _strong_b _strong_b: .long 2 .globl _weak_b _weak_b = _strong_b