364 lines · plain
1# REQUIRES: x862# RUN: rm -rf %t; split-file %s %t3# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos11.0 -I %t %t/cat1.s -o %t/cat1.o4# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos11.0 -I %t %t/cat2.s -o %t/cat2.o5# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos11.0 -I %t %t/klass.s -o %t/klass.o6# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos11.0 -I %t %t/cat1.s -g -o %t/cat1_w_sym.o7# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos11.0 -I %t %t/cat2.s -g -o %t/cat2_w_sym.o8# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos11.0 -I %t %t/klass.s -g -o %t/klass_w_sym.o9# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos11.0 -I %t %t/cat1.s --defsym MAKE_LOAD_METHOD=1 -o %t/cat1-with-load.o10# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos11.0 -I %t %t/cat2.s --defsym MAKE_LOAD_METHOD=1 -o %t/cat2-with-load.o11# RUN: llvm-mc -filetype=obj -triple=x86_64-apple-macos11.0 -I %t %t/klass.s --defsym MAKE_LOAD_METHOD=1 -o %t/klass-with-load.o12# 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.o13# RUN: %lld -no_objc_relative_method_lists -dylib -lobjc %t/klass.o -o %t/libklass.dylib14 15# RUN: %no-fatal-warnings-lld -no_objc_relative_method_lists --check-category-conflicts -dylib -lobjc %t/klass.o %t/cat1.o %t/cat2.o -o \16# RUN: /dev/null 2>&1 | FileCheck %s --check-prefixes=CATCLS,CATCAT17# RUN: %no-fatal-warnings-lld -no_objc_relative_method_lists --check-category-conflicts -dylib -lobjc %t/libklass.dylib %t/cat1.o \18# RUN: %t/cat2.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=CATCAT19 20# RUN: %no-fatal-warnings-lld -no_objc_relative_method_lists --check-category-conflicts -dylib -lobjc %t/klass_w_sym.o %t/cat1_w_sym.o %t/cat2_w_sym.o -o \21# RUN: /dev/null 2>&1 | FileCheck %s --check-prefixes=CATCLS_W_SYM,CATCAT_W_SYM22# RUN: %no-fatal-warnings-lld -no_objc_relative_method_lists --check-category-conflicts -dylib -lobjc %t/libklass.dylib %t/cat1_w_sym.o \23# RUN: %t/cat2_w_sym.o -o /dev/null 2>&1 | FileCheck %s --check-prefix=CATCAT_W_SYM24 25## Check that we don't emit spurious warnings around the +load method while26## still emitting the other warnings. Note that we have made separate27## `*-with-load.s` files for ease of comparison with ld64; ld64 will not warn28## at all if multiple +load methods are present.29# RUN: %no-fatal-warnings-lld -no_objc_relative_method_lists --check-category-conflicts -dylib -lobjc %t/klass-with-load.o \30# RUN: %t/cat1-with-load.o %t/cat2-with-load.o -o /dev/null 2>&1 | \31# RUN: FileCheck %s --check-prefixes=CATCLS,CATCAT --implicit-check-not '+load'32 33## Regression test: Check that we don't crash.34# RUN: %no-fatal-warnings-lld -no_objc_relative_method_lists --check-category-conflicts -dylib -lobjc %t/klass-with-no-rodata.o -o /dev/null35 36## Check that we don't emit any warnings without --check-category-conflicts.37# RUN: %no-fatal-warnings-lld -no_objc_relative_method_lists -dylib -lobjc %t/klass.o %t/cat1.o %t/cat2.o -o \38# RUN: /dev/null 2>&1 | FileCheck %s --implicit-check-not 'warning' --allow-empty39 40# CATCLS: warning: method '+s1' has conflicting definitions:41# CATCLS-NEXT: >>> defined in category Cat1 from {{.*}}cat1{{.*}}.o42# CATCLS-NEXT: >>> defined in class Foo from {{.*}}klass{{.*}}.o43 44# CATCLS: warning: method '-m1' has conflicting definitions:45# CATCLS-NEXT: >>> defined in category Cat1 from {{.*}}cat1{{.*}}.o46# CATCLS-NEXT: >>> defined in class Foo from {{.*}}klass{{.*}}.o47 48# CATCAT: warning: method '+s2' has conflicting definitions:49# CATCAT-NEXT: >>> defined in category Cat2 from {{.*}}cat2{{.*}}.o50# CATCAT-NEXT: >>> defined in category Cat1 from {{.*}}cat1{{.*}}.o51 52# CATCAT: warning: method '-m2' has conflicting definitions:53# CATCAT-NEXT: >>> defined in category Cat2 from {{.*}}cat2{{.*}}.o54# CATCAT-NEXT: >>> defined in category Cat1 from {{.*}}cat1{{.*}}.o55 56 57# CATCLS_W_SYM: warning: method '+s1' has conflicting definitions:58# CATCLS_W_SYM-NEXT: >>> defined in category Cat1 from {{.*}}cat1_w_sym{{.*}}.o ({{.*}}cat1.s{{.*}})59# CATCLS_W_SYM-NEXT: >>> defined in class Foo from {{.*}}klass_w_sym{{.*}}.o ({{.*}}klass.s{{.*}})60 61# CATCLS_W_SYM: warning: method '-m1' has conflicting definitions:62# CATCLS_W_SYM-NEXT: >>> defined in category Cat1 from {{.*}}cat1_w_sym{{.*}}.o ({{.*}}cat1.s{{.*}})63# CATCLS_W_SYM-NEXT: >>> defined in class Foo from {{.*}}klass_w_sym{{.*}}.o ({{.*}}klass.s{{.*}})64 65# CATCAT_W_SYM: warning: method '+s2' has conflicting definitions:66# CATCAT_W_SYM-NEXT: >>> defined in category Cat2 from {{.*}}cat2_w_sym{{.*}}.o ({{.*}}cat2.s{{.*}})67# CATCAT_W_SYM-NEXT: >>> defined in category Cat1 from {{.*}}cat1_w_sym{{.*}}.o ({{.*}}cat1.s{{.*}})68 69# CATCAT_W_SYM: warning: method '-m2' has conflicting definitions:70# CATCAT_W_SYM-NEXT: >>> defined in category Cat2 from {{.*}}cat2_w_sym{{.*}}.o ({{.*}}cat2.s{{.*}})71# CATCAT_W_SYM-NEXT: >>> defined in category Cat1 from {{.*}}cat1_w_sym{{.*}}.o ({{.*}}cat1.s{{.*}})72 73 74#--- cat1.s75 76.include "objc-macros.s"77 78## @interface Foo(Cat1)79## -(void) m1;80## -(void) m2;81## +(void) s1;82## +(void) s2;83## @end84##85## @implementation Foo(Cat1)86## -(void) m1 {}87## -(void) m2 {}88## +(void) s1 {}89## +(void) s2 {}90## @end91 92.section __DATA,__objc_catlist,regular,no_dead_strip93 .quad __OBJC_$_CATEGORY_Foo_$_Cat194 95.ifdef MAKE_LOAD_METHOD96.section __DATA,__objc_nlcatlist,regular,no_dead_strip97 .quad __OBJC_$_CATEGORY_Foo_$_Cat198.endif99 100.section __DATA,__objc_const101__OBJC_$_CATEGORY_Foo_$_Cat1:102 .objc_classname "Cat1"103 .quad _OBJC_CLASS_$_Foo104 .quad __OBJC_$_CATEGORY_INSTANCE_METHODS_Foo_$_Cat1105 .quad __OBJC_$_CATEGORY_CLASS_METHODS_Foo_$_Cat1106 .quad 0107 .quad 0108 .quad 0109 .long 64110 .space 4111 112__OBJC_$_CATEGORY_INSTANCE_METHODS_Foo_$_Cat1:113 .long 24 # size of method entry114 .long 2 # number of methods115 .empty_objc_method "m1", "v16@0:8", "-[Foo(Cat1) m1]"116 .empty_objc_method "m2", "v16@0:8", "-[Foo(Cat2) m2]"117 118__OBJC_$_CATEGORY_CLASS_METHODS_Foo_$_Cat1:119 .long 24120.ifdef MAKE_LOAD_METHOD121 .long 3122 .empty_objc_method "load", "v16@0:8", "+[Foo(Cat1) load]"123.else124 .long 2125.endif126 .empty_objc_method "s1", "v16@0:8", "+[Foo(Cat1) s1]"127 .empty_objc_method "s2", "v16@0:8", "+[Foo(Cat1) s2]"128 129.section __DATA,__objc_imageinfo,regular,no_dead_strip130 .long 0131 .long 64132 133.subsections_via_symbols134 135#--- cat2.s136 137.include "objc-macros.s"138 139## @interface Foo(Cat2)140## -(void) m2;141## +(void) s2;142## @end143##144## @implementation Foo(Cat2)145## -(void) m2 {}146## +(void) s2 {}147## @end148 149.section __DATA,__objc_catlist,regular,no_dead_strip150 .quad __OBJC_$_CATEGORY_Foo_$_Cat2151 152.ifdef MAKE_LOAD_METHOD153.section __DATA,__objc_nlcatlist,regular,no_dead_strip154 .quad __OBJC_$_CATEGORY_Foo_$_Cat2155.endif156 157.section __DATA,__objc_const158__OBJC_$_CATEGORY_Foo_$_Cat2:159 .objc_classname "Cat2"160 .quad _OBJC_CLASS_$_Foo161 .quad __OBJC_$_CATEGORY_INSTANCE_METHODS_Foo_$_Cat2162 .quad __OBJC_$_CATEGORY_CLASS_METHODS_Foo_$_Cat2163 .quad 0164 .quad 0165 .quad 0166 .long 64167 .space 4168 169__OBJC_$_CATEGORY_INSTANCE_METHODS_Foo_$_Cat2:170 .long 24171 .long 1172 .empty_objc_method "m2", "v16@0:8", "-[Foo(Cat2) m2]"173 174__OBJC_$_CATEGORY_CLASS_METHODS_Foo_$_Cat2:175 .long 24176.ifdef MAKE_LOAD_METHOD177 .long 2178 .empty_objc_method "load", "v16@0:8", "+[Foo(Cat2) load]"179.else180 .long 1181.endif182 .empty_objc_method "s2", "v16@0:8", "+[Foo(Cat2) m2]"183 184.section __DATA,__objc_imageinfo,regular,no_dead_strip185 .long 0186 .long 64187 188.subsections_via_symbols189 190#--- klass.s191 192.include "objc-macros.s"193 194## @interface Foo195## -(void) m1;196## +(void) s1;197## @end198##199## @implementation Foo200## -(void) m1 {}201## +(void) s1 {}202## @end203 204.globl _OBJC_CLASS_$_Foo, _OBJC_METACLASS_$_Foo205 206.section __DATA,__objc_data207_OBJC_CLASS_$_Foo:208 .quad _OBJC_METACLASS_$_Foo209 .quad 0210 .quad __objc_empty_cache211 .quad 0212 .quad __OBJC_CLASS_RO_$_Foo213 214_OBJC_METACLASS_$_Foo:215 .quad _OBJC_METACLASS_$_Foo216 .quad _OBJC_CLASS_$_Foo217 .quad __objc_empty_cache218 .quad 0219 .quad __OBJC_METACLASS_RO_$_Foo220 221.section __DATA,__objc_const222__OBJC_METACLASS_RO_$_Foo:223 .long 3224 .long 40225 .long 40226 .space 4227 .quad 0228 .objc_classname "Foo"229 .quad __OBJC_$_CLASS_METHODS_Foo230 .quad 0231 .quad 0232 .quad 0233 .quad 0234 235__OBJC_CLASS_RO_$_Foo:236 .long 2237 .long 0238 .long 0239 .space 4240 .quad 0241 .objc_classname "Foo"242 .quad __OBJC_$_INSTANCE_METHODS_Foo243 .quad 0244 .quad 0245 .quad 0246 .quad 0247 248__OBJC_$_CLASS_METHODS_Foo:249 .long 24250.ifdef MAKE_LOAD_METHOD251 .long 2252 .empty_objc_method "load", "v16@0:8", "+[Foo load]"253.else254 .long 1255.endif256 .empty_objc_method "s1", "v16@0:8", "+[Foo s1]"257 258__OBJC_$_INSTANCE_METHODS_Foo:259 .long 24260 .long 1261 .empty_objc_method "m1", "v16@0:8", "-[Foo m1]"262 263.section __DATA,__objc_classlist,regular,no_dead_strip264 .quad _OBJC_CLASS_$_Foo265 266.ifdef MAKE_LOAD_METHOD267.section __DATA,__objc_nlclslist,regular,no_dead_strip268 .quad _OBJC_CLASS_$_Foo269.endif270 271.section __DATA,__objc_imageinfo,regular,no_dead_strip272 .long 0273 .long 64274 275.subsections_via_symbols276 277#--- klass-with-no-rodata.s278 279.include "objc-macros.s"280 281## swiftc generates some classes without a statically-linked rodata. Not282## entirely sure what the corresponding Swift inputs are required for this to283## happen; this test merely checks that we can gracefully handle this case284## without crashing.285## FIXME: It would be better if this test used the output of some real Swift286## code.287 288.globl _$s11FooAACfD289 290.section __DATA,__objc_data291_$s11FooAACfD:292 .quad _$s11FooAACfD293 .quad 0294 .quad __objc_empty_cache295 .quad 0296 .quad __objc_empty_cache297 298.section __DATA,__objc_catlist,regular,no_dead_strip299 .quad __CATEGORY_METAFoo_$_Foo20300 301.section __DATA,__objc_const302__CATEGORY_METAFoo_$_Foo20:303 .objc_classname "Foo20"304 .quad _$s11FooAACfD305 .quad 0306 .quad 0307 .quad 0308 .quad 0309 .quad 0310 .long 64311 .space 4312 313#--- objc-macros.s314 315# Macros for taking some of the boilerplate out of defining objc structs.316 317# NOTE: \@ below is a variable that gets auto-incremented by the assembler on318# each macro invocation. It serves as a mechanism for generating unique symbol319# names for each macro call.320 321.macro .objc_classname name322 323 .section __TEXT,__objc_classname,cstring_literals324 L_OBJC_CLASS_NAME_.\@:325 .asciz "\name"326 327 .section __DATA,__objc_const328 .quad L_OBJC_CLASS_NAME_.\@329 330.endm331 332# struct method_t {333# const char *name;334# const char *type;335# void *impl;336# }337.macro .objc_method name, type, impl338 339 .section __TEXT,__objc_methname,cstring_literals340 L_OBJC_METH_VAR_NAME_.\@:341 .asciz "\name"342 343 .section __TEXT,__objc_methtype,cstring_literals344 L_OBJC_METH_VAR_TYPE_.\@:345 .asciz "\type"346 347 .section __DATA,__objc_const348 .quad L_OBJC_METH_VAR_NAME_.\@349 .quad L_OBJC_METH_VAR_TYPE_.\@350 .quad "\impl"351 352.endm353 354# Generate a method_t with a basic impl that just contains `ret`.355.macro .empty_objc_method name, type, impl356 357 .text358 "\impl":359 ret360 361 .objc_method "\name", "\type", "\impl"362 363.endm364