xref: /llvm-project/lld/test/MachO/objc.s (revision 141391ad2f22885342935442642c6c892f43e1ed)
1183b0dadSJez Ng# REQUIRES: x86, arm
2a817594dSJez Ng# RUN: rm -rf %t; split-file %s %t
3cf918c80SJez Ng
4cf918c80SJez Ng# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/has-objc-symbol.s -o %t/has-objc-symbol.o
5cf918c80SJez Ng# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/has-objc-category.s -o %t/has-objc-category.o
69b5148d4SJez Ng# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/has-objc-symbol-and-category.s -o %t/has-objc-symbol-and-category.o
7cf918c80SJez Ng# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/has-swift.s -o %t/has-swift.o
8*141391adSNuri Amari# RUN: llvm-as %t/has-swift-ir-loaded.ll -o %t/has-swift-ir-loaded.o
9*141391adSNuri Amari# RUN: llvm-as %t/has-swift-ir-not-loaded.ll -o %t/has-swift-ir-not-loaded.o
10d64bad8fSTapan Thaker# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/has-swift-proto.s -o %t/has-swift-proto.o
11cf918c80SJez Ng# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/no-objc.s -o %t/no-objc.o
12001ba653SJez Ng## Make sure we don't mis-parse a 32-bit file as 64-bit
13001ba653SJez Ng# RUN: llvm-mc -filetype=obj -triple=armv7-apple-watchos %t/no-objc.s -o %t/wrong-arch.o
14*141391adSNuri Amari# RUN: llvm-ar rcs %t/libHasSomeObjC.a %t/no-objc.o %t/has-objc-symbol.o %t/has-objc-category.o %t/has-swift.o %t/has-swift-proto.o %t/has-swift-ir-loaded.o %t/has-swift-ir-not-loaded.o %t/wrong-arch.o
15*141391adSNuri Amari# RUN: llvm-ar rcs %t/libHasSomeObjC2.a %t/no-objc.o %t/has-objc-symbol-and-category.o %t/has-swift.o %t/has-swift-proto.o %t/has-swift-ir-loaded.o %t/has-swift-ir-not-loaded.o %t/wrong-arch.o
16cf918c80SJez Ng
17cf918c80SJez Ng# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/test.s -o %t/test.o
189b5148d4SJez Ng
19001ba653SJez Ng# RUN: %lld -lSystem %t/test.o -o %t/test -L%t -lHasSomeObjC -ObjC
20cf918c80SJez Ng# RUN: llvm-objdump --section-headers --syms %t/test | FileCheck %s --check-prefix=OBJC
21cf918c80SJez Ng
229b5148d4SJez Ng# RUN: %lld -lSystem %t/test.o -o %t/test -L%t -lHasSomeObjC2 -ObjC
239b5148d4SJez Ng# RUN: llvm-objdump --section-headers --syms %t/test | FileCheck %s --check-prefix=OBJC
249b5148d4SJez Ng
25*141391adSNuri Amari# RUN: %no-fatal-warnings-lld -lSystem %t/test.o -o %t/test --start-lib %t/no-objc.o %t/has-objc-symbol.o %t/has-objc-category.o %t/has-swift.o %t/has-swift-proto.o %t/has-swift-ir-loaded.o %t/has-swift-ir-not-loaded.o %t/wrong-arch.o --end-lib -ObjC 2>&1 \
265ba90632SVy Nguyen# RUN:     | FileCheck -check-prefix=WARNING %s
270aae2bf3SFangrui Song# RUN: llvm-objdump --section-headers --syms %t/test | FileCheck %s --check-prefix=OBJC
280aae2bf3SFangrui Song
295ba90632SVy Nguyen# WARNING: {{.+}}wrong-arch.o has architecture armv7 which is incompatible with target architecture x86_64
305ba90632SVy Nguyen# WARNING-NOT: {{.}}
315ba90632SVy Nguyen
32cf918c80SJez Ng# OBJC:       Sections:
33cf918c80SJez Ng# OBJC-NEXT:  Idx Name            Size   VMA  Type
34cf918c80SJez Ng# OBJC-NEXT:    0 __text          {{.*}}      TEXT
35cf918c80SJez Ng# OBJC-NEXT:    1 __swift         {{.*}}      DATA
36d64bad8fSTapan Thaker# OBJC-NEXT:    2 __swift5_fieldmd{{.*}}      DATA
37d64bad8fSTapan Thaker# OBJC-NEXT:    3 __objc_catlist  {{.*}}      DATA
38d64bad8fSTapan Thaker# OBJC-NEXT:    4 has_objc_symbol {{.*}}      DATA
39cf918c80SJez Ng# OBJC-EMPTY:
40cf918c80SJez Ng# OBJC-NEXT:  SYMBOL TABLE:
41*141391adSNuri Amari# OBJC-DAG:   g     O __TEXT,__swift _foo
420aae2bf3SFangrui Song# OBJC-DAG:   g     F __TEXT,__text _main
430aae2bf3SFangrui Song# OBJC-DAG:   g     F __TEXT,__text _OBJC_CLASS_$_MyObject
44d64bad8fSTapan Thaker# OBJC-DAG:   g     O __TEXT,__swift5_fieldmd $s7somelib4Blah_pMF
45cf918c80SJez Ng
46001ba653SJez Ng# RUN: %lld -lSystem %t/test.o -o %t/test -L%t -lHasSomeObjC
47cf918c80SJez Ng# RUN: llvm-objdump --section-headers --syms %t/test | FileCheck %s --check-prefix=NO-OBJC
48cf918c80SJez Ng
49cf918c80SJez Ng# NO-OBJC:       Sections:
50cf918c80SJez Ng# NO-OBJC-NEXT:  Idx Name           Size   VMA  Type
51cf918c80SJez Ng# NO-OBJC-NEXT:    0 __text         {{.*}}      TEXT
52cf918c80SJez Ng# NO-OBJC-EMPTY:
53cf918c80SJez Ng# NO-OBJC-NEXT:  SYMBOL TABLE:
54cf918c80SJez Ng# NO-OBJC-NEXT:  g     F __TEXT,__text _main
55fd28f718SJez Ng# NO-OBJC-NEXT:  g     F __TEXT,__text __mh_execute_header
56c10947b5SNico Weber# NO-OBJC-NEXT:          *UND* dyld_stub_binder
5747fdaa32SJez Ng# NO-OBJC-EMPTY:
58cf918c80SJez Ng
599b5148d4SJez Ng# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/refs-dup.s -o %t/refs-dup.o
609b5148d4SJez Ng# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-darwin %t/refs-objc.s -o %t/refs-objc.o
619b5148d4SJez Ng
629b5148d4SJez Ng## Check that -ObjC causes has-objc-symbol.o to be loaded first, prior to symbol
639b5148d4SJez Ng## resolution. This matches ld64's behavior.
649b5148d4SJez Ng# RUN: %lld -dylib %t/refs-dup.o %t/refs-objc.o -o %t/refs-dup -L%t -lHasSomeObjC -ObjC
659b5148d4SJez Ng# RUN: llvm-objdump --macho --syms %t/refs-dup | FileCheck %s --check-prefix=DUP-FROM-OBJC
669b5148d4SJez Ng# DUP-FROM-OBJC: g     O __DATA,has_objc_symbol _has_dup
679b5148d4SJez Ng
689b5148d4SJez Ng## Without -ObjC, no-objc.o gets loaded first during symbol resolution, causing
699b5148d4SJez Ng## a duplicate symbol error.
709b5148d4SJez Ng# RUN: not %lld -dylib %t/refs-dup.o %t/refs-objc.o -o %t/refs-dup -L%t \
719b5148d4SJez Ng# RUN:   -lHasSomeObjC 2>&1 | FileCheck %s --check-prefix=DUP-ERROR
729b5148d4SJez Ng# DUP-ERROR: error: duplicate symbol: _has_dup
739b5148d4SJez Ng
740aae2bf3SFangrui Song## TODO: Load has-objc-symbol.o prior to symbol resolution to match the archive behavior.
750aae2bf3SFangrui Song# RUN: not %lld -dylib %t/refs-dup.o %t/refs-objc.o -o %t/refs-dup --start-lib %t/no-objc.o \
760aae2bf3SFangrui Song# RUN:   %t/has-objc-symbol.o %t/has-objc-category.o %t/has-swift.o %t/wrong-arch.o --end-lib \
77ea32faeaSVincent Lee# RUN:   -ObjC 2>&1 | FileCheck %s --check-prefix=DUP-ERROR
780aae2bf3SFangrui Song
79cf918c80SJez Ng#--- has-objc-symbol.s
809b5148d4SJez Ng.globl _OBJC_CLASS_$_MyObject, _has_dup
81cf918c80SJez Ng_OBJC_CLASS_$_MyObject:
82cf918c80SJez Ng
839b5148d4SJez Ng.section __DATA,has_objc_symbol
849b5148d4SJez Ng_has_dup:
859b5148d4SJez Ng
86cf918c80SJez Ng#--- has-objc-category.s
87cf918c80SJez Ng.section __DATA,__objc_catlist
88cf918c80SJez Ng.quad 0x1234
89cf918c80SJez Ng
909b5148d4SJez Ng#--- has-objc-symbol-and-category.s
919b5148d4SJez Ng## Make sure we load this archive member exactly once (i.e. no duplicate symbol
929b5148d4SJez Ng## error).
939b5148d4SJez Ng.globl _OBJC_CLASS_$_MyObject, _has_dup
949b5148d4SJez Ng_OBJC_CLASS_$_MyObject:
959b5148d4SJez Ng
969b5148d4SJez Ng.section __DATA,has_objc_symbol
979b5148d4SJez Ng_has_dup:
989b5148d4SJez Ng
999b5148d4SJez Ng.section __DATA,__objc_catlist
1009b5148d4SJez Ng.quad 0x1234
1019b5148d4SJez Ng
102cf918c80SJez Ng#--- has-swift.s
103cf918c80SJez Ng.section __TEXT,__swift
104cf918c80SJez Ng.quad 0x1234
105cf918c80SJez Ng
106*141391adSNuri Amari#--- has-swift-ir-loaded.ll
107*141391adSNuri Amaritarget datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
108*141391adSNuri Amaritarget triple = "x86_64-apple-darwin"
109*141391adSNuri Amari
110*141391adSNuri Amari@foo = global i64 1234, section "__TEXT,__swift"
111*141391adSNuri Amari@llvm.used = appending global [1 x ptr] [ptr @foo]
112*141391adSNuri Amari
113*141391adSNuri Amari#--- has-swift-ir-not-loaded.ll
114*141391adSNuri Amaritarget datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
115*141391adSNuri Amaritarget triple = "x86_64-apple-darwin"
116*141391adSNuri Amari
117*141391adSNuri Amari@bar = global i64 1234
118*141391adSNuri Amari@llvm.used = appending global [1 x ptr] [ptr @bar]
119*141391adSNuri Amari
120d64bad8fSTapan Thaker#--- has-swift-proto.s
121d64bad8fSTapan Thaker.section __TEXT,__swift5_fieldmd
122d64bad8fSTapan Thaker.globl $s7somelib4Blah_pMF
123d64bad8fSTapan Thaker$s7somelib4Blah_pMF:
124d64bad8fSTapan Thaker
125cf918c80SJez Ng#--- no-objc.s
1269b5148d4SJez Ng## This archive member should not be pulled in by -ObjC since it does not
1279b5148d4SJez Ng## contain any ObjC-related data.
1289b5148d4SJez Ng.globl _has_dup
129cf918c80SJez Ng.section __DATA,foo
130001ba653SJez Ng.section __DATA,bar
1319b5148d4SJez Ng.section __DATA,no_objc
1329b5148d4SJez Ng_has_dup:
133001ba653SJez Ng
134cf918c80SJez Ng#--- test.s
135cf918c80SJez Ng.globl _main
136cf918c80SJez Ng_main:
137cf918c80SJez Ng  ret
1389b5148d4SJez Ng
1399b5148d4SJez Ng#--- refs-dup.s
1409b5148d4SJez Ng.data
1419b5148d4SJez Ng.quad _has_dup
1429b5148d4SJez Ng
1439b5148d4SJez Ng#--- refs-objc.s
1449b5148d4SJez Ng.data
1459b5148d4SJez Ng.quad _OBJC_CLASS_$_MyObject
146