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