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