brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.6 KiB · 3fb81d7 Raw
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