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