clang_darwin.mk revision a69eb9a1a0b111a4776a9bd727f4d551ec308261
1# These are the functions which clang needs when it is targetting a previous 2# version of the OS. The issue is that the backend may use functions which were 3# not present in the libgcc that shipped on the platform. In such cases, we link 4# with a version of the library which contains private_extern definitions of all 5# the extra functions which might be referenced. 6 7Description := Static runtime libraries for clang/Darwin. 8 9# A function that ensures we don't try to build for architectures that we 10# don't have working toolchains for. 11CheckArches = \ 12 $(shell \ 13 result=""; \ 14 for arch in $(1); do \ 15 if $(CC) -arch $$arch -c \ 16 -integrated-as \ 17 $(ProjSrcRoot)/make/platform/clang_darwin_test_input.c \ 18 -isysroot $(ProjSrcRoot)/SDKs/darwin \ 19 -o /dev/null > /dev/null 2> /dev/null; then \ 20 result="$$result$$arch "; \ 21 else \ 22 printf 1>&2 \ 23 "warning: clang_darwin.mk: dropping arch '$$arch' from lib '$(2)'\n"; \ 24 fi; \ 25 done; \ 26 echo $$result) 27 28### 29 30CC := clang 31 32Configs := 33UniversalArchs := 34 35# Configuration solely for providing access to an eprintf symbol, which may 36# still be referenced from Darwin system headers. This symbol is only ever 37# needed on i386. 38Configs += eprintf 39UniversalArchs.eprintf := $(call CheckArches,i386,eprintf) 40 41# Configuration for targetting 10.4. We need a few functions missing from 42# libgcc_s.10.4.dylib. We only build x86 slices since clang doesn't really 43# support targetting PowerPC. 44Configs += 10.4 45UniversalArchs.10.4 := $(call CheckArches,i386 x86_64,10.4) 46 47# Configuration for targetting iOS for a couple of functions that didn't 48# make it into libSystem. 49Configs += ios 50UniversalArchs.ios := $(call CheckArches,i386 x86_64 armv7,ios) 51 52# Configuration for targetting OSX. These functions may not be in libSystem 53# so we should provide our own. 54Configs += osx 55UniversalArchs.osx := $(call CheckArches,i386 x86_64,osx) 56 57# Configuration for use with kernel/kexts. 58Configs += cc_kext 59UniversalArchs.cc_kext := $(call CheckArches,armv7 i386 x86_64,cc_kext) 60 61# Configuration for use with kernel/kexts for iOS 5.0 and earlier (which used 62# a different code generation strategy). 63Configs += cc_kext_ios5 64UniversalArchs.cc_kext_ios5 := $(call CheckArches,x86_64 armv7,cc_kext_ios5) 65 66# Configurations which define the profiling support functions. 67Configs += profile_osx 68UniversalArchs.profile_osx := $(call CheckArches,i386 x86_64,profile_osx) 69Configs += profile_ios 70UniversalArchs.profile_ios := $(call CheckArches,i386 x86_64 armv7,profile_ios) 71 72# Configurations which define the ASAN support functions. 73Configs += asan_osx 74UniversalArchs.asan_osx := $(call CheckArches,i386 x86_64,asan_osx) 75 76Configs += asan_osx_dynamic 77UniversalArchs.asan_osx_dynamic := $(call CheckArches,i386 x86_64,asan_osx_dynamic) 78 79# Darwin 10.6 has a bug in cctools that makes it unable to use ranlib on our ARM 80# object files. If we are on that platform, strip out all ARM archs. We still 81# build the libraries themselves so that Clang can find them where it expects 82# them, even though they might not have an expected slice. 83ifneq ($(shell sw_vers -productVersion | grep 10.6),) 84UniversalArchs.ios := $(filter-out armv7, $(UniversalArchs.ios)) 85UniversalArchs.cc_kext := $(filter-out armv7, $(UniversalArchs.cc_kext)) 86UniversalArchs.cc_kext_ios5 := $(filter-out armv7, $(UniversalArchs.cc_kext_ios5)) 87UniversalArchs.profile_ios := $(filter-out armv7, $(UniversalArchs.profile_ios)) 88endif 89 90# If RC_SUPPORTED_ARCHS is defined, treat it as a list of the architectures we 91# are intended to support and limit what we try to build to that. 92# 93# We make sure to remove empty configs if we end up dropping all the requested 94# archs for a particular config. 95ifneq ($(RC_SUPPORTED_ARCHS),) 96$(foreach config,$(Configs),\ 97 $(call Set,UniversalArchs.$(config),\ 98 $(filter $(RC_SUPPORTED_ARCHS),$(UniversalArchs.$(config))))\ 99 $(if $(UniversalArchs.$(config)),,\ 100 $(call Set,Configs,$(filter-out $(config),$(Configs))))) 101endif 102 103### 104 105# Forcibly strip off any -arch, as that totally breaks our universal support. 106override CC := $(subst -arch ,-arch_,$(CC)) 107override CC := $(patsubst -arch_%,,$(CC)) 108 109CFLAGS := -Wall -Werror -O3 -fomit-frame-pointer 110 111# Always set deployment target arguments for every build, these libraries should 112# never depend on the environmental overrides. We simply set them to minimum 113# supported deployment target -- nothing in the compiler-rt libraries should 114# actually depend on the deployment target. 115OSX_DEPLOYMENT_ARGS := -mmacosx-version-min=10.4 116IOS_DEPLOYMENT_ARGS := -miphoneos-version-min=1.0 117IOS6_DEPLOYMENT_ARGS := -miphoneos-version-min=6.0 118IOSSIM_DEPLOYMENT_ARGS := -miphoneos-version-min=1.0 119 120# Use our stub SDK as the sysroot to support more portable building. 121OSX_DEPLOYMENT_ARGS += -isysroot $(ProjSrcRoot)/SDKs/darwin 122IOS_DEPLOYMENT_ARGS += -isysroot $(ProjSrcRoot)/SDKs/darwin 123IOS6_DEPLOYMENT_ARGS += -isysroot $(ProjSrcRoot)/SDKs/darwin 124IOSSIM_DEPLOYMENT_ARGS += -isysroot $(ProjSrcRoot)/SDKs/darwin 125 126CFLAGS.eprintf := $(CFLAGS) $(OSX_DEPLOYMENT_ARGS) 127CFLAGS.10.4 := $(CFLAGS) $(OSX_DEPLOYMENT_ARGS) 128# FIXME: We can't build ASAN with our stub SDK yet. 129CFLAGS.asan_osx := $(CFLAGS) -mmacosx-version-min=10.5 -fno-builtin 130CFLAGS.asan_osx_dynamic := \ 131 $(CFLAGS) -mmacosx-version-min=10.5 -fno-builtin \ 132 -DMAC_INTERPOSE_FUNCTIONS=1 133 134CFLAGS.ios.i386 := $(CFLAGS) $(IOSSIM_DEPLOYMENT_ARGS) 135CFLAGS.ios.x86_64 := $(CFLAGS) $(IOSSIM_DEPLOYMENT_ARGS) 136CFLAGS.ios.armv7 := $(CFLAGS) $(IOS_DEPLOYMENT_ARGS) 137CFLAGS.ios.armv7f := $(CFLAGS) $(IOS_DEPLOYMENT_ARGS) 138CFLAGS.ios.armv7k := $(CFLAGS) $(IOS_DEPLOYMENT_ARGS) 139CFLAGS.ios.armv7s := $(CFLAGS) $(IOS_DEPLOYMENT_ARGS) 140CFLAGS.osx.i386 := $(CFLAGS) $(OSX_DEPLOYMENT_ARGS) 141CFLAGS.osx.x86_64 := $(CFLAGS) $(OSX_DEPLOYMENT_ARGS) 142CFLAGS.cc_kext.i386 := $(CFLAGS) $(OSX_DEPLOYMENT_ARGS) 143CFLAGS.cc_kext.x86_64 := $(CFLAGS) $(OSX_DEPLOYMENT_ARGS) 144CFLAGS.cc_kext.armv7 := $(CFLAGS) $(IOS6_DEPLOYMENT_ARGS) 145CFLAGS.cc_kext.armv7f := $(CFLAGS) $(IOS6_DEPLOYMENT_ARGS) 146CFLAGS.cc_kext.armv7k := $(CFLAGS) $(IOS6_DEPLOYMENT_ARGS) 147CFLAGS.cc_kext.armv7s := $(CFLAGS) $(IOS6_DEPLOYMENT_ARGS) 148CFLAGS.cc_kext_ios5.armv7 := $(CFLAGS) $(IOS_DEPLOYMENT_ARGS) 149CFLAGS.cc_kext_ios5.armv7f := $(CFLAGS) $(IOS_DEPLOYMENT_ARGS) 150CFLAGS.cc_kext_ios5.armv7k := $(CFLAGS) $(IOS_DEPLOYMENT_ARGS) 151CFLAGS.cc_kext_ios5.armv7s := $(CFLAGS) $(IOS_DEPLOYMENT_ARGS) 152CFLAGS.profile_osx.i386 := $(CFLAGS) $(OSX_DEPLOYMENT_ARGS) 153CFLAGS.profile_osx.x86_64 := $(CFLAGS) $(OSX_DEPLOYMENT_ARGS) 154CFLAGS.profile_ios.i386 := $(CFLAGS) $(IOSSIM_DEPLOYMENT_ARGS) 155CFLAGS.profile_ios.x86_64 := $(CFLAGS) $(IOSSIM_DEPLOYMENT_ARGS) 156CFLAGS.profile_ios.armv7 := $(CFLAGS) $(IOS_DEPLOYMENT_ARGS) 157CFLAGS.profile_ios.armv7f := $(CFLAGS) $(IOS_DEPLOYMENT_ARGS) 158CFLAGS.profile_ios.armv7k := $(CFLAGS) $(IOS_DEPLOYMENT_ARGS) 159CFLAGS.profile_ios.armv7s := $(CFLAGS) $(IOS_DEPLOYMENT_ARGS) 160 161# Configure the asan_osx_dynamic library to be built shared. 162SHARED_LIBRARY.asan_osx_dynamic := 1 163LDFLAGS.asan_osx_dynamic := -framework Foundation -lstdc++ 164 165FUNCTIONS.eprintf := eprintf 166FUNCTIONS.10.4 := eprintf floatundidf floatundisf floatundixf 167 168FUNCTIONS.ios := divmodsi4 udivmodsi4 mulosi4 mulodi4 muloti4 169# On x86, the divmod functions reference divsi. 170FUNCTIONS.ios.i386 := $(FUNCTIONS.ios) \ 171 divsi3 udivsi3 172FUNCTIONS.ios.x86_64 := $(FUNCTIONS.ios) \ 173 divsi3 udivsi3 174 175FUNCTIONS.osx := mulosi4 mulodi4 muloti4 176 177FUNCTIONS.profile_osx := GCDAProfiling 178FUNCTIONS.profile_ios := GCDAProfiling 179 180FUNCTIONS.asan_osx := $(AsanFunctions) $(InterceptionFunctions) \ 181 $(SanitizerCommonFunctions) 182FUNCTIONS.asan_osx_dynamic := $(AsanFunctions) $(InterceptionFunctions) \ 183 $(SanitizerCommonFunctions) \ 184 $(AsanDynamicFunctions) 185 186CCKEXT_COMMON_FUNCTIONS := \ 187 absvdi2 \ 188 absvsi2 \ 189 addvdi3 \ 190 addvsi3 \ 191 ashldi3 \ 192 ashrdi3 \ 193 bswapdi2 \ 194 bswapsi2 \ 195 clzdi2 \ 196 clzsi2 \ 197 cmpdi2 \ 198 ctzdi2 \ 199 ctzsi2 \ 200 divdc3 \ 201 divdi3 \ 202 divsc3 \ 203 divmodsi4 \ 204 udivmodsi4 \ 205 do_global_dtors \ 206 eprintf \ 207 ffsdi2 \ 208 fixdfdi \ 209 fixsfdi \ 210 fixunsdfdi \ 211 fixunsdfsi \ 212 fixunssfdi \ 213 fixunssfsi \ 214 floatdidf \ 215 floatdisf \ 216 floatundidf \ 217 floatundisf \ 218 gcc_bcmp \ 219 lshrdi3 \ 220 moddi3 \ 221 muldc3 \ 222 muldi3 \ 223 mulsc3 \ 224 mulvdi3 \ 225 mulvsi3 \ 226 negdi2 \ 227 negvdi2 \ 228 negvsi2 \ 229 paritydi2 \ 230 paritysi2 \ 231 popcountdi2 \ 232 popcountsi2 \ 233 powidf2 \ 234 powisf2 \ 235 subvdi3 \ 236 subvsi3 \ 237 ucmpdi2 \ 238 udiv_w_sdiv \ 239 udivdi3 \ 240 udivmoddi4 \ 241 umoddi3 242 243CCKEXT_ARM_FUNCTIONS := $(CCKEXT_COMMON_FUNCTIONS) \ 244 adddf3 \ 245 addsf3 \ 246 aeabi_cdcmpeq \ 247 aeabi_cdrcmple \ 248 aeabi_cfcmpeq \ 249 aeabi_cfrcmple \ 250 aeabi_dcmpeq \ 251 aeabi_dcmpge \ 252 aeabi_dcmpgt \ 253 aeabi_dcmple \ 254 aeabi_dcmplt \ 255 aeabi_drsub \ 256 aeabi_fcmpeq \ 257 aeabi_fcmpge \ 258 aeabi_fcmpgt \ 259 aeabi_fcmple \ 260 aeabi_fcmplt \ 261 aeabi_frsub \ 262 aeabi_idivmod \ 263 aeabi_uidivmod \ 264 cmpdf2 \ 265 cmpsf2 \ 266 div0 \ 267 divdf3 \ 268 divsf3 \ 269 divsi3 \ 270 extendsfdf2 \ 271 ffssi2 \ 272 fixdfsi \ 273 fixsfsi \ 274 floatsidf \ 275 floatsisf \ 276 floatunsidf \ 277 floatunsisf \ 278 comparedf2 \ 279 comparesf2 \ 280 modsi3 \ 281 muldf3 \ 282 mulsf3 \ 283 negdf2 \ 284 negsf2 \ 285 subdf3 \ 286 subsf3 \ 287 switch16 \ 288 switch32 \ 289 switch8 \ 290 switchu8 \ 291 truncdfsf2 \ 292 udivsi3 \ 293 umodsi3 \ 294 unorddf2 \ 295 unordsf2 296 297CCKEXT_ARMVFP_FUNCTIONS := $(CCKEXT_ARM_FUNCTIONS) \ 298 adddf3vfp \ 299 addsf3vfp \ 300 divdf3vfp \ 301 divsf3vfp \ 302 eqdf2vfp \ 303 eqsf2vfp \ 304 extendsfdf2vfp \ 305 fixdfsivfp \ 306 fixsfsivfp \ 307 fixunsdfsivfp \ 308 fixunssfsivfp \ 309 floatsidfvfp \ 310 floatsisfvfp \ 311 floatunssidfvfp \ 312 floatunssisfvfp \ 313 gedf2vfp \ 314 gesf2vfp \ 315 gtdf2vfp \ 316 gtsf2vfp \ 317 ledf2vfp \ 318 lesf2vfp \ 319 ltdf2vfp \ 320 ltsf2vfp \ 321 muldf3vfp \ 322 mulsf3vfp \ 323 nedf2vfp \ 324 nesf2vfp \ 325 subdf3vfp \ 326 subsf3vfp \ 327 truncdfsf2vfp \ 328 unorddf2vfp \ 329 unordsf2vfp 330 331FUNCTIONS.cc_kext.armv7 := $(CCKEXT_ARMVFP_FUNCTIONS) 332FUNCTIONS.cc_kext.armv7f := $(CCKEXT_ARMVFP_FUNCTIONS) 333FUNCTIONS.cc_kext.armv7k := $(CCKEXT_ARMVFP_FUNCTIONS) 334FUNCTIONS.cc_kext.armv7s := $(CCKEXT_ARMVFP_FUNCTIONS) 335FUNCTIONS.cc_kext_ios5.armv7 := $(CCKEXT_ARMVFP_FUNCTIONS) 336FUNCTIONS.cc_kext_ios5.armv7f := $(CCKEXT_ARMVFP_FUNCTIONS) 337FUNCTIONS.cc_kext_ios5.armv7k := $(CCKEXT_ARMVFP_FUNCTIONS) 338FUNCTIONS.cc_kext_ios5.armv7s := $(CCKEXT_ARMVFP_FUNCTIONS) 339 340CCKEXT_X86_FUNCTIONS := $(CCKEXT_COMMON_FUNCTIONS) \ 341 divxc3 \ 342 fixunsxfdi \ 343 fixunsxfsi \ 344 fixxfdi \ 345 floatdixf \ 346 floatundixf \ 347 mulxc3 \ 348 powixf2 349 350FUNCTIONS.cc_kext.i386 := $(CCKEXT_X86_FUNCTIONS) \ 351 ffssi2 \ 352 i686.get_pc_thunk.eax \ 353 i686.get_pc_thunk.ebp \ 354 i686.get_pc_thunk.ebx \ 355 i686.get_pc_thunk.ecx \ 356 i686.get_pc_thunk.edi \ 357 i686.get_pc_thunk.edx \ 358 i686.get_pc_thunk.esi 359 360FUNCTIONS.cc_kext.x86_64 := $(CCKEXT_X86_FUNCTIONS) \ 361 absvti2 \ 362 addvti3 \ 363 ashlti3 \ 364 ashrti3 \ 365 clzti2 \ 366 cmpti2 \ 367 ctzti2 \ 368 divti3 \ 369 ffsti2 \ 370 fixdfti \ 371 fixsfti \ 372 fixunsdfti \ 373 fixunssfti \ 374 fixunsxfti \ 375 fixxfti \ 376 floattidf \ 377 floattisf \ 378 floattixf \ 379 floatuntidf \ 380 floatuntisf \ 381 floatuntixf \ 382 lshrti3 \ 383 modti3 \ 384 multi3 \ 385 mulvti3 \ 386 negti2 \ 387 negvti2 \ 388 parityti2 \ 389 popcountti2 \ 390 subvti3 \ 391 ucmpti2 \ 392 udivmodti4 \ 393 udivti3 \ 394 umodti3 395 396# FIXME: Currently, compiler-rt is missing implementations for a number of the 397# functions that need to go into libcc_kext.a. Filter them out for now. 398CCKEXT_MISSING_FUNCTIONS := \ 399 cmpdf2 cmpsf2 div0 \ 400 ffssi2 \ 401 udiv_w_sdiv unorddf2 unordsf2 bswapdi2 \ 402 bswapsi2 \ 403 gcc_bcmp \ 404 do_global_dtors \ 405 i686.get_pc_thunk.eax i686.get_pc_thunk.ebp i686.get_pc_thunk.ebx \ 406 i686.get_pc_thunk.ecx i686.get_pc_thunk.edi i686.get_pc_thunk.edx \ 407 i686.get_pc_thunk.esi \ 408 aeabi_cdcmpeq aeabi_cdrcmple aeabi_cfcmpeq aeabi_cfrcmple aeabi_dcmpeq \ 409 aeabi_dcmpge aeabi_dcmpgt aeabi_dcmple aeabi_dcmplt aeabi_drsub aeabi_fcmpeq \ 410 aeabi_fcmpge aeabi_fcmpgt aeabi_fcmple aeabi_fcmplt aeabi_frsub aeabi_idivmod \ 411 aeabi_uidivmod 412 413FUNCTIONS.cc_kext.armv7 := \ 414 $(filter-out $(CCKEXT_MISSING_FUNCTIONS),$(FUNCTIONS.cc_kext.armv7)) 415FUNCTIONS.cc_kext.armv7f := \ 416 $(filter-out $(CCKEXT_MISSING_FUNCTIONS),$(FUNCTIONS.cc_kext.armv7f)) 417FUNCTIONS.cc_kext.armv7k := \ 418 $(filter-out $(CCKEXT_MISSING_FUNCTIONS),$(FUNCTIONS.cc_kext.armv7k)) 419FUNCTIONS.cc_kext.armv7s := \ 420 $(filter-out $(CCKEXT_MISSING_FUNCTIONS),$(FUNCTIONS.cc_kext.armv7s)) 421FUNCTIONS.cc_kext_ios5.armv7 := \ 422 $(filter-out $(CCKEXT_MISSING_FUNCTIONS),$(FUNCTIONS.cc_kext_ios5.armv7)) 423FUNCTIONS.cc_kext_ios5.armv7f := \ 424 $(filter-out $(CCKEXT_MISSING_FUNCTIONS),$(FUNCTIONS.cc_kext_ios5.armv7f)) 425FUNCTIONS.cc_kext_ios5.armv7k := \ 426 $(filter-out $(CCKEXT_MISSING_FUNCTIONS),$(FUNCTIONS.cc_kext_ios5.armv7k)) 427FUNCTIONS.cc_kext_ios5.armv7s := \ 428 $(filter-out $(CCKEXT_MISSING_FUNCTIONS),$(FUNCTIONS.cc_kext_ios5.armv7s)) 429FUNCTIONS.cc_kext.i386 := \ 430 $(filter-out $(CCKEXT_MISSING_FUNCTIONS),$(FUNCTIONS.cc_kext.i386)) 431FUNCTIONS.cc_kext.x86_64 := \ 432 $(filter-out $(CCKEXT_MISSING_FUNCTIONS),$(FUNCTIONS.cc_kext.x86_64)) 433 434KERNEL_USE.cc_kext := 1 435KERNEL_USE.cc_kext_ios5 := 1 436 437VISIBILITY_HIDDEN := 1 438 439SHARED_LIBRARY_SUFFIX := dylib 440