## # Copyright (c) 2010 Apple Inc. All rights reserved. # # @APPLE_LICENSE_HEADER_START@ # # This file contains Original Code and/or Modifications of Original Code # as defined in and that are subject to the Apple Public Source License # Version 2.0 (the 'License'). You may not use this file except in # compliance with the License. Please obtain a copy of the License at # http://www.opensource.apple.com/apsl/ and read it before using this # file. # # The Original Code and all software distributed under the License are # distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER # EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, # INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. # Please see the License for the specific language governing rights and # limitations under the License. # # @APPLE_LICENSE_HEADER_END@ ## TESTROOT = ../.. include ${TESTROOT}/include/common.makefile SHELL = bash # # Verify handling of object files with mismatched category class properties. # LD_R = ${LD} -arch ${ARCH} -r # check output of objcimageinfo FAIL_IF_OLD = grep -v has-category-class-properties | ${FAIL_IF_STDIN} FAIL_IF_NEW = grep has-category-class-properties | ${FAIL_IF_STDIN} REALLY_FAIL_IF_NEW = grep has-category-class-properties | ${FAIL_IF_STDIN} # check diagnostics from ld FAIL_IF_DIAGNOSTICS = ${FAIL_IF_STDIN} FAIL_IF_NO_DIAGNOSTICS = egrep 'warning.*category metadata' | ${FAIL_IF_EMPTY} # Hack: Old ABI doesn't need the has-category-class-properties bit. # There should instead be no diagnostics and no "OLD" output anywhere. ifeq (${ARCH},i386) FAIL_IF_NEW = ${FAIL_IF_OLD} FAIL_IF_NO_DIAGNOSTICS = ${FAIL_IF_DIAGNOSTICS} # REALLY_FAIL_IF_NEW is unchanged to sanity-check objcimageinfo itself. endif all: # Generate files with has-category-class-properties bit ("NEW"). ${CC} ${CCFLAGS} -c class.m -o class.o ${CC} ${CCFLAGS} -c -DCATEGORY=1 -DCLASS_PROPERTY=1 cat.m -o cat-with-class-prop.o ${CC} ${CCFLAGS} -c -DCATEGORY=1 -DCLASS_PROPERTY=0 cat.m -o cat-without-class-prop.o ${CC} ${CCFLAGS} -c -DCATEGORY=0 -DCLASS_PROPERTY=0 cat.m -o nocat.o ${CC} ${CCFLAGS} -c -DCATEGORY=0 -DCLASS_PROPERTY=0 -x c cat.m -o noobjc.o ${OBJCIMAGEINFO} class.o cat-with-class-prop.o cat-without-class-prop.o nocat.o | ${FAIL_IF_OLD} # nocat.o must have objc_image_info; noobjc.o must not size -m -l nocat.o | egrep '(__image_info|__objc_imageinfo)' | ${FAIL_IF_EMPTY} size -m -l noobjc.o | egrep '(__image_info|__objc_imageinfo)' | ${FAIL_IF_STDIN} # Generate files without has-category-class-properties bit ("OLD"). cp -f cat-without-class-prop.o old-cat.o cp -f nocat.o old-nocat.o cp -f class.o old-class.o ${OBJCIMAGEINFO} -has-category-class-properties old-cat.o old-class.o old-nocat.o | ${REALLY_FAIL_IF_NEW} # Link each pair of class and category. # Verify diagnostics and output's has-category-class-properties bit. ############ # Class: NEW # Category: not OLD. No diagnostics. Result should be marked NEW. # Category: OLD but no category. No diagnostics. Result should be marked NEW. ${LD_R} class.o cat-with-class-prop.o -o class__cat-with-class-prop.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${LD_R} class.o cat-without-class-prop.o -o class__cat-without-class-prop.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${LD_R} class.o nocat.o -o class__nocat.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${LD_R} class.o noobjc.o -o class__noobjc.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${LD_R} class.o old-nocat.o -o class__old-nocat.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${OBJCIMAGEINFO} class__cat-with-class-prop.o | ${FAIL_IF_OLD} ${OBJCIMAGEINFO} class__cat-without-class-prop.o | ${FAIL_IF_OLD} ${OBJCIMAGEINFO} class__nocat.o | ${FAIL_IF_OLD} ${OBJCIMAGEINFO} class__noobjc.o | ${FAIL_IF_OLD} ${OBJCIMAGEINFO} class__old-nocat.o | ${FAIL_IF_OLD} # Category: OLD. No diagnostics. Result should be marked OLD. ${LD_R} class.o old-cat.o -o class__old-cat.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${OBJCIMAGEINFO} class__old-cat.o | ${FAIL_IF_NEW} # Two categories: OLD + NEW with class properties. Has diagnostics. Result should be marked OLD. ${LD_R} class.o old-cat.o cat-with-class-prop.o -o class__old-cat__cat-with-class-prop.o 2>&1 | ${FAIL_IF_NO_DIAGNOSTICS} ${OBJCIMAGEINFO} class__old-cat__cat-with-class-prop.o | ${FAIL_IF_NEW} # Two categories: OLD + NEW without class properties. No diagnostics. Result should be marked OLD. ${LD_R} class.o old-cat.o cat-without-class-prop.o -o class__old-cat__cat-without-class-prop.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${OBJCIMAGEINFO} class__old-cat__cat-without-class-prop.o | ${FAIL_IF_NEW} ############ # Class: OLD # Category: OLD. No diagnostics. Result should be marked OLD. ${LD_R} old-class.o old-cat.o -o old-class__old-cat.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${OBJCIMAGEINFO} old-class__old-cat.o | ${FAIL_IF_NEW} # Category: none. No diagnostics. Result should be marked NEW. ${LD_R} old-class.o nocat.o -o old-class__nocat.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${LD_R} old-class.o noobjc.o -o old-class__noobjc.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${LD_R} old-class.o old-nocat.o -o old-class__old-nocat.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${OBJCIMAGEINFO} old-class__nocat.o | ${FAIL_IF_OLD} ${OBJCIMAGEINFO} old-class__noobjc.o | ${FAIL_IF_OLD} ${OBJCIMAGEINFO} old-class__old-nocat.o | ${FAIL_IF_OLD} # Category: NEW. No diagnostics. Result should be marked NEW. ${LD_R} old-class.o cat-without-class-prop.o -o old-class__cat-without-class-prop.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${LD_R} old-class.o cat-with-class-prop.o -o old-class__cat-with-class-prop.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${OBJCIMAGEINFO} old-class__cat-without-class-prop.o | ${FAIL_IF_OLD} ${OBJCIMAGEINFO} old-class__cat-with-class-prop.o | ${FAIL_IF_OLD} # Two categories: OLD + NEW with class properties. Has diagnostics. Result should be marked OLD. ${LD_R} old-class.o old-cat.o cat-with-class-prop.o -o old-class__old-cat__cat-with-class-prop.o 2>&1 | ${FAIL_IF_NO_DIAGNOSTICS} ${OBJCIMAGEINFO} old-class__old-cat__cat-with-class-prop.o | ${FAIL_IF_NEW} # Two categories: OLD + NEW without class properties. No diagnostics. Result should be marked OLD. ${LD_R} old-class.o old-cat.o cat-without-class-prop.o -o old-class__old-cat__cat-without-class-prop.o 2>&1 | ${FAIL_IF_DIAGNOSTICS} ${OBJCIMAGEINFO} old-class__old-cat__cat-without-class-prop.o | ${FAIL_IF_NEW} ${PASS_IFF} true clean: rm -rf *.o