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