]> git.proxmox.com Git - rustc.git/blob - src/compiler-rt/make/platform/clang_darwin.mk
New upstream version 1.12.0+dfsg1
[rustc.git] / src / compiler-rt / make / platform / clang_darwin.mk
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