[CMake][compiler-rt][AArch64] Avoid preprocessing LSE builtins separately
[lldb.git] / compiler-rt / lib / builtins / CMakeLists.txt
1 # This directory contains a large amount of C code which provides
2 # generic implementations of the core runtime library along with optimized
3 # architecture-specific code in various subdirectories.
4
5 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
6   cmake_minimum_required(VERSION 3.13.4)
7
8   project(CompilerRTBuiltins C ASM)
9   set(COMPILER_RT_STANDALONE_BUILD TRUE)
10   set(COMPILER_RT_BUILTINS_STANDALONE_BUILD TRUE)
11   list(INSERT CMAKE_MODULE_PATH 0
12     "${CMAKE_SOURCE_DIR}/../../cmake"
13     "${CMAKE_SOURCE_DIR}/../../cmake/Modules")
14   include(base-config-ix)
15   include(CompilerRTUtils)
16
17   load_llvm_config()
18   construct_compiler_rt_default_triple()
19
20   if(APPLE)
21     include(CompilerRTDarwinUtils)
22   endif()
23   if(APPLE)
24     include(UseLibtool)
25   endif()
26   include(AddCompilerRT)
27
28   if(${CMAKE_SYSTEM_NAME} MATCHES "AIX")
29     set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> -X32_64 qc <TARGET> <LINK_FLAGS> <OBJECTS>")
30     set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> -X32_64 qc <TARGET> <LINK_FLAGS> <OBJECTS>")
31     set(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> -X32_64 q <TARGET> <LINK_FLAGS> <OBJECTS>")
32     set(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> -X32_64 q <TARGET> <LINK_FLAGS> <OBJECTS>")
33     set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -X32_64 <TARGET>")
34     set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -X32_64 <TARGET>")
35   endif()
36 endif()
37
38 if (COMPILER_RT_STANDALONE_BUILD)
39   # When compiler-rt is being built standalone, possibly as a cross-compilation
40   # target, the target may or may not want position independent code. This
41   # option provides an avenue through which the flag may be controlled when an
42   # LLVM configuration is not being utilized.
43   option(COMPILER_RT_BUILTINS_ENABLE_PIC
44     "Turns on or off -fPIC for the builtin library source"
45     ON)
46 endif()
47
48 include(builtin-config-ix)
49
50 # TODO: Need to add a mechanism for logging errors when builtin source files are
51 # added to a sub-directory and not this CMakeLists file.
52 set(GENERIC_SOURCES
53   absvdi2.c
54   absvsi2.c
55   absvti2.c
56   adddf3.c
57   addsf3.c
58   addvdi3.c
59   addvsi3.c
60   addvti3.c
61   apple_versioning.c
62   ashldi3.c
63   ashlti3.c
64   ashrdi3.c
65   ashrti3.c
66   bswapdi2.c
67   bswapsi2.c
68   clzdi2.c
69   clzsi2.c
70   clzti2.c
71   cmpdi2.c
72   cmpti2.c
73   comparedf2.c
74   comparesf2.c
75   ctzdi2.c
76   ctzsi2.c
77   ctzti2.c
78   divdc3.c
79   divdf3.c
80   divdi3.c
81   divmoddi4.c
82   divmodsi4.c
83   divmodti4.c
84   divsc3.c
85   divsf3.c
86   divsi3.c
87   divti3.c
88   extendsfdf2.c
89   extendhfsf2.c
90   ffsdi2.c
91   ffssi2.c
92   ffsti2.c
93   fixdfdi.c
94   fixdfsi.c
95   fixdfti.c
96   fixsfdi.c
97   fixsfsi.c
98   fixsfti.c
99   fixunsdfdi.c
100   fixunsdfsi.c
101   fixunsdfti.c
102   fixunssfdi.c
103   fixunssfsi.c
104   fixunssfti.c
105   floatdidf.c
106   floatdisf.c
107   floatsidf.c
108   floatsisf.c
109   floattidf.c
110   floattisf.c
111   floatundidf.c
112   floatundisf.c
113   floatunsidf.c
114   floatunsisf.c
115   floatuntidf.c
116   floatuntisf.c
117   fp_mode.c
118   int_util.c
119   lshrdi3.c
120   lshrti3.c
121   moddi3.c
122   modsi3.c
123   modti3.c
124   muldc3.c
125   muldf3.c
126   muldi3.c
127   mulodi4.c
128   mulosi4.c
129   muloti4.c
130   mulsc3.c
131   mulsf3.c
132   multi3.c
133   mulvdi3.c
134   mulvsi3.c
135   mulvti3.c
136   negdf2.c
137   negdi2.c
138   negsf2.c
139   negti2.c
140   negvdi2.c
141   negvsi2.c
142   negvti2.c
143   os_version_check.c
144   paritydi2.c
145   paritysi2.c
146   parityti2.c
147   popcountdi2.c
148   popcountsi2.c
149   popcountti2.c
150   powidf2.c
151   powisf2.c
152   subdf3.c
153   subsf3.c
154   subvdi3.c
155   subvsi3.c
156   subvti3.c
157   trampoline_setup.c
158   truncdfhf2.c
159   truncdfsf2.c
160   truncsfhf2.c
161   ucmpdi2.c
162   ucmpti2.c
163   udivdi3.c
164   udivmoddi4.c
165   udivmodsi4.c
166   udivmodti4.c
167   udivsi3.c
168   udivti3.c
169   umoddi3.c
170   umodsi3.c
171   umodti3.c
172 )
173
174 # TODO: Several "tf" files (and divtc3.c, but not multc3.c) are in
175 # GENERIC_SOURCES instead of here.
176 set(GENERIC_TF_SOURCES
177   addtf3.c
178   comparetf2.c
179   divtc3.c
180   divtf3.c
181   extenddftf2.c
182   extendhftf2.c
183   extendsftf2.c
184   fixtfdi.c
185   fixtfsi.c
186   fixtfti.c
187   fixunstfdi.c
188   fixunstfsi.c
189   fixunstfti.c
190   floatditf.c
191   floatsitf.c
192   floattitf.c
193   floatunditf.c
194   floatunsitf.c
195   floatuntitf.c
196   multc3.c
197   multf3.c
198   powitf2.c
199   subtf3.c
200   trunctfdf2.c
201   trunctfhf2.c
202   trunctfsf2.c
203 )
204
205 option(COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN
206   "Skip the atomic builtin (these should normally be provided by a shared library)"
207   On)
208
209 if(NOT FUCHSIA AND NOT COMPILER_RT_BAREMETAL_BUILD)
210   set(GENERIC_SOURCES
211     ${GENERIC_SOURCES}
212     emutls.c
213     enable_execute_stack.c
214     eprintf.c
215   )
216 endif()
217
218 if(COMPILER_RT_HAS_ATOMIC_KEYWORD AND NOT COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN)
219   set(GENERIC_SOURCES
220     ${GENERIC_SOURCES}
221     atomic.c
222   )
223 endif()
224
225 if(APPLE)
226   set(GENERIC_SOURCES
227     ${GENERIC_SOURCES}
228     atomic_flag_clear.c
229     atomic_flag_clear_explicit.c
230     atomic_flag_test_and_set.c
231     atomic_flag_test_and_set_explicit.c
232     atomic_signal_fence.c
233     atomic_thread_fence.c
234   )
235 endif()
236
237 if (HAVE_UNWIND_H)
238   set(GENERIC_SOURCES
239     ${GENERIC_SOURCES}
240     gcc_personality_v0.c
241   )
242 endif ()
243
244 if (NOT FUCHSIA)
245   set(GENERIC_SOURCES
246     ${GENERIC_SOURCES}
247     clear_cache.c
248   )
249 endif()
250
251 # These files are used on 32-bit and 64-bit x86.
252 set(x86_ARCH_SOURCES
253   cpu_model.c
254   )
255
256 if (NOT MSVC)
257   set(x86_ARCH_SOURCES
258     ${x86_ARCH_SOURCES}
259     i386/fp_mode.c
260   )
261 endif ()
262
263 # Implement extended-precision builtins, assuming long double is 80 bits.
264 # long double is not 80 bits on Android or MSVC.
265 set(x86_80_BIT_SOURCES
266   divxc3.c
267   fixxfdi.c
268   fixxfti.c
269   fixunsxfdi.c
270   fixunsxfsi.c
271   fixunsxfti.c
272   floatdixf.c
273   floattixf.c
274   floatundixf.c
275   floatuntixf.c
276   mulxc3.c
277   powixf2.c
278 )
279
280 if (NOT MSVC)
281   set(x86_64_SOURCES
282     ${GENERIC_SOURCES}
283     ${GENERIC_TF_SOURCES}
284     ${x86_ARCH_SOURCES}
285     x86_64/floatdidf.c
286     x86_64/floatdisf.c
287     x86_64/floatundidf.S
288     x86_64/floatundisf.S
289   )
290
291   if (NOT ANDROID)
292     set(x86_64_SOURCES
293       ${x86_64_SOURCES}
294       ${x86_80_BIT_SOURCES}
295       x86_64/floatdixf.c
296       x86_64/floatundixf.S
297     )
298   endif()
299
300   # Darwin x86_64 Haswell
301   set(x86_64h_SOURCES ${x86_64_SOURCES})
302
303   if (WIN32)
304     set(x86_64_SOURCES
305       ${x86_64_SOURCES}
306       x86_64/chkstk.S
307       x86_64/chkstk2.S
308     )
309   endif()
310
311   set(i386_SOURCES
312     ${GENERIC_SOURCES}
313     ${x86_ARCH_SOURCES}
314     i386/ashldi3.S
315     i386/ashrdi3.S
316     i386/divdi3.S
317     i386/floatdidf.S
318     i386/floatdisf.S
319     i386/floatundidf.S
320     i386/floatundisf.S
321     i386/lshrdi3.S
322     i386/moddi3.S
323     i386/muldi3.S
324     i386/udivdi3.S
325     i386/umoddi3.S
326   )
327
328   if (NOT ANDROID)
329     set(i386_SOURCES
330       ${i386_SOURCES}
331       ${x86_80_BIT_SOURCES}
332       i386/floatdixf.S
333       i386/floatundixf.S
334     )
335   endif()
336
337   if (WIN32)
338     set(i386_SOURCES
339       ${i386_SOURCES}
340       i386/chkstk.S
341       i386/chkstk2.S
342     )
343   endif()
344 else () # MSVC
345   # Use C versions of functions when building on MSVC
346   # MSVC's assembler takes Intel syntax, not AT&T syntax.
347   # Also use only MSVC compilable builtin implementations.
348   set(x86_64_SOURCES
349     ${GENERIC_SOURCES}
350     ${x86_ARCH_SOURCES}
351     x86_64/floatdidf.c
352     x86_64/floatdisf.c
353   )
354   set(i386_SOURCES ${GENERIC_SOURCES} ${x86_ARCH_SOURCES})
355 endif () # if (NOT MSVC)
356
357 set(arm_SOURCES
358   arm/fp_mode.c
359   arm/bswapdi2.S
360   arm/bswapsi2.S
361   arm/clzdi2.S
362   arm/clzsi2.S
363   arm/comparesf2.S
364   arm/divmodsi4.S
365   arm/divsi3.S
366   arm/modsi3.S
367   arm/sync_fetch_and_add_4.S
368   arm/sync_fetch_and_add_8.S
369   arm/sync_fetch_and_and_4.S
370   arm/sync_fetch_and_and_8.S
371   arm/sync_fetch_and_max_4.S
372   arm/sync_fetch_and_max_8.S
373   arm/sync_fetch_and_min_4.S
374   arm/sync_fetch_and_min_8.S
375   arm/sync_fetch_and_nand_4.S
376   arm/sync_fetch_and_nand_8.S
377   arm/sync_fetch_and_or_4.S
378   arm/sync_fetch_and_or_8.S
379   arm/sync_fetch_and_sub_4.S
380   arm/sync_fetch_and_sub_8.S
381   arm/sync_fetch_and_umax_4.S
382   arm/sync_fetch_and_umax_8.S
383   arm/sync_fetch_and_umin_4.S
384   arm/sync_fetch_and_umin_8.S
385   arm/sync_fetch_and_xor_4.S
386   arm/sync_fetch_and_xor_8.S
387   arm/udivmodsi4.S
388   arm/udivsi3.S
389   arm/umodsi3.S
390   ${GENERIC_SOURCES}
391 )
392
393 set(thumb1_SOURCES
394   arm/divsi3.S
395   arm/udivsi3.S
396   arm/comparesf2.S
397   arm/addsf3.S
398   ${GENERIC_SOURCES}
399 )
400
401 set(arm_EABI_SOURCES
402   arm/aeabi_cdcmp.S
403   arm/aeabi_cdcmpeq_check_nan.c
404   arm/aeabi_cfcmp.S
405   arm/aeabi_cfcmpeq_check_nan.c
406   arm/aeabi_dcmp.S
407   arm/aeabi_div0.c
408   arm/aeabi_drsub.c
409   arm/aeabi_fcmp.S
410   arm/aeabi_frsub.c
411   arm/aeabi_idivmod.S
412   arm/aeabi_ldivmod.S
413   arm/aeabi_memcmp.S
414   arm/aeabi_memcpy.S
415   arm/aeabi_memmove.S
416   arm/aeabi_memset.S
417   arm/aeabi_uidivmod.S
418   arm/aeabi_uldivmod.S
419 )
420
421 set(arm_Thumb1_JT_SOURCES
422   arm/switch16.S
423   arm/switch32.S
424   arm/switch8.S
425   arm/switchu8.S
426 )
427 set(arm_Thumb1_SjLj_EH_SOURCES
428   arm/restore_vfp_d8_d15_regs.S
429   arm/save_vfp_d8_d15_regs.S
430 )
431 set(arm_Thumb1_VFPv2_DP_SOURCES
432   arm/adddf3vfp.S
433   arm/divdf3vfp.S
434   arm/eqdf2vfp.S
435   arm/extendsfdf2vfp.S
436   arm/fixdfsivfp.S
437   arm/fixunsdfsivfp.S
438   arm/floatsidfvfp.S
439   arm/floatunssidfvfp.S
440   arm/gedf2vfp.S
441   arm/gtdf2vfp.S
442   arm/ledf2vfp.S
443   arm/ltdf2vfp.S
444   arm/muldf3vfp.S
445   arm/nedf2vfp.S
446   arm/negdf2vfp.S
447   arm/subdf3vfp.S
448   arm/truncdfsf2vfp.S
449   arm/unorddf2vfp.S
450 )
451 set(arm_Thumb1_VFPv2_SP_SOURCES
452   arm/addsf3vfp.S
453   arm/divsf3vfp.S
454   arm/eqsf2vfp.S
455   arm/fixsfsivfp.S
456   arm/fixunssfsivfp.S
457   arm/floatsisfvfp.S
458   arm/floatunssisfvfp.S
459   arm/gesf2vfp.S
460   arm/gtsf2vfp.S
461   arm/lesf2vfp.S
462   arm/ltsf2vfp.S
463   arm/mulsf3vfp.S
464   arm/negsf2vfp.S
465   arm/nesf2vfp.S
466   arm/subsf3vfp.S
467   arm/unordsf2vfp.S
468 )
469 set(arm_Thumb1_icache_SOURCES
470   arm/sync_synchronize.S
471 )
472 set(arm_Thumb1_SOURCES
473   ${arm_Thumb1_JT_SOURCES}
474   ${arm_Thumb1_SjLj_EH_SOURCES}
475   ${arm_Thumb1_VFPv2_DP_SOURCES}
476   ${arm_Thumb1_VFPv2_SP_SOURCES}
477   ${arm_Thumb1_icache_SOURCES}
478 )
479
480 if(MINGW)
481   set(arm_SOURCES
482     arm/aeabi_idivmod.S
483     arm/aeabi_ldivmod.S
484     arm/aeabi_uidivmod.S
485     arm/aeabi_uldivmod.S
486     arm/chkstk.S
487     mingw_fixfloat.c
488     ${GENERIC_SOURCES}
489   )
490 elseif(NOT WIN32)
491   # TODO the EABI sources should only be added to EABI targets
492   set(arm_SOURCES
493     ${arm_SOURCES}
494     ${arm_EABI_SOURCES}
495     ${arm_Thumb1_SOURCES}
496   )
497
498   set(thumb1_SOURCES
499     ${thumb1_SOURCES}
500     ${arm_EABI_SOURCES}
501   )
502 endif()
503
504 set(aarch64_SOURCES
505   ${GENERIC_TF_SOURCES}
506   ${GENERIC_SOURCES}
507   cpu_model.c
508   aarch64/fp_mode.c
509 )
510
511 # Generate outline atomics helpers from lse.S base
512 set(OA_HELPERS_DIR "${CMAKE_CURRENT_BINARY_DIR}/outline_atomic_helpers.dir")
513 file(MAKE_DIRECTORY "${OA_HELPERS_DIR}")
514
515 foreach(pat cas swp ldadd ldclr ldeor ldset)
516   foreach(size 1 2 4 8 16)
517     foreach(model 1 2 3 4)
518       if(pat STREQUAL "cas" OR NOT size STREQUAL "16")
519         set(helper_asm "${OA_HELPERS_DIR}/outline_atomic_${pat}${size}_${model}.S")
520         add_custom_command(
521           OUTPUT ${helper_asm}
522           COMMAND ${CMAKE_COMMAND} -E create_symlink "${CMAKE_CURRENT_SOURCE_DIR}/aarch64/lse.S" "${helper_asm}"
523         )
524         set_source_files_properties("${helper_asm}"
525           PROPERTIES
526           COMPILE_DEFINITIONS "L_${pat};SIZE=${size};MODEL=${model}"
527           INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}"
528         )
529         list(APPEND aarch64_SOURCES "${helper_asm}")
530       endif()
531     endforeach(model)
532   endforeach(size)
533 endforeach(pat)
534
535 if (MINGW)
536   set(aarch64_SOURCES
537     ${aarch64_SOURCES}
538     aarch64/chkstk.S
539   )
540 endif()
541
542 set(armhf_SOURCES ${arm_SOURCES})
543 set(armv7_SOURCES ${arm_SOURCES})
544 set(armv7s_SOURCES ${arm_SOURCES})
545 set(armv7k_SOURCES ${arm_SOURCES})
546 set(arm64_SOURCES ${aarch64_SOURCES})
547 set(arm64e_SOURCES ${aarch64_SOURCES})
548
549 # macho_embedded archs
550 set(armv6m_SOURCES ${thumb1_SOURCES})
551 set(armv7m_SOURCES ${arm_SOURCES})
552 set(armv7em_SOURCES ${arm_SOURCES})
553
554 # hexagon arch
555 set(hexagon_SOURCES
556   hexagon/common_entry_exit_abi1.S
557   hexagon/common_entry_exit_abi2.S
558   hexagon/common_entry_exit_legacy.S
559   hexagon/dfaddsub.S
560   hexagon/dfdiv.S
561   hexagon/dffma.S
562   hexagon/dfminmax.S
563   hexagon/dfmul.S
564   hexagon/dfsqrt.S
565   hexagon/divdi3.S
566   hexagon/divsi3.S
567   hexagon/fastmath2_dlib_asm.S
568   hexagon/fastmath2_ldlib_asm.S
569   hexagon/fastmath_dlib_asm.S
570   hexagon/memcpy_forward_vp4cp4n2.S
571   hexagon/memcpy_likely_aligned.S
572   hexagon/moddi3.S
573   hexagon/modsi3.S
574   hexagon/sfdiv_opt.S
575   hexagon/sfsqrt_opt.S
576   hexagon/udivdi3.S
577   hexagon/udivmoddi4.S
578   hexagon/udivmodsi4.S
579   hexagon/udivsi3.S
580   hexagon/umoddi3.S
581   hexagon/umodsi3.S
582   ${GENERIC_SOURCES}
583   ${GENERIC_TF_SOURCES}
584 )
585
586
587 set(mips_SOURCES ${GENERIC_SOURCES})
588 set(mipsel_SOURCES ${mips_SOURCES})
589 set(mips64_SOURCES ${GENERIC_TF_SOURCES}
590                    ${mips_SOURCES})
591 set(mips64el_SOURCES ${GENERIC_TF_SOURCES}
592                      ${mips_SOURCES})
593
594 set(powerpc_SOURCES ${GENERIC_SOURCES})
595
596 set(powerpc64_SOURCES
597   ppc/divtc3.c
598   ppc/fixtfdi.c
599   ppc/fixunstfdi.c
600   ppc/floatditf.c
601   ppc/floatunditf.c
602   ppc/gcc_qadd.c
603   ppc/gcc_qdiv.c
604   ppc/gcc_qmul.c
605   ppc/gcc_qsub.c
606   ppc/multc3.c
607   ${GENERIC_SOURCES}
608 )
609 # These routines require __int128, which isn't supported on AIX.
610 if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
611   set(powerpc64_SOURCES
612     ppc/floattitf.c
613     ppc/fixtfti.c
614     ppc/fixunstfti.c
615     ${powerpc64_SOURCES}
616   )
617 endif()
618 set(powerpc64le_SOURCES ${powerpc64_SOURCES})
619
620 set(riscv_SOURCES ${GENERIC_SOURCES} ${GENERIC_TF_SOURCES})
621 set(riscv32_SOURCES
622   riscv/mulsi3.S
623   ${riscv_SOURCES}
624 )
625 set(riscv64_SOURCES
626   riscv/muldi3.S
627   ${riscv_SOURCES}
628 )
629
630 set(sparc_SOURCES ${GENERIC_SOURCES} ${GENERIC_TF_SOURCES})
631 set(sparcv9_SOURCES ${GENERIC_SOURCES} ${GENERIC_TF_SOURCES})
632
633 set(wasm32_SOURCES
634   ${GENERIC_TF_SOURCES}
635   ${GENERIC_SOURCES}
636 )
637 set(wasm64_SOURCES
638   ${GENERIC_TF_SOURCES}
639   ${GENERIC_SOURCES}
640 )
641
642 set(ve_SOURCES
643   ve/grow_stack.S
644   ve/grow_stack_align.S
645   ${GENERIC_TF_SOURCES}
646   ${GENERIC_SOURCES})
647
648 add_custom_target(builtins)
649 set_target_properties(builtins PROPERTIES FOLDER "Compiler-RT Misc")
650
651 if (APPLE)
652   add_subdirectory(Darwin-excludes)
653   add_subdirectory(macho_embedded)
654   darwin_add_builtin_libraries(${BUILTIN_SUPPORTED_OS})
655 else ()
656   set(BUILTIN_CFLAGS "")
657
658   append_list_if(COMPILER_RT_HAS_FLOAT16 -DCOMPILER_RT_HAS_FLOAT16 BUILTIN_CFLAGS)
659
660   append_list_if(COMPILER_RT_HAS_STD_C11_FLAG -std=c11 BUILTIN_CFLAGS)
661
662   # These flags would normally be added to CMAKE_C_FLAGS by the llvm
663   # cmake step. Add them manually if this is a standalone build.
664   if(COMPILER_RT_STANDALONE_BUILD)
665     if(COMPILER_RT_BUILTINS_ENABLE_PIC)
666       append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC BUILTIN_CFLAGS)
667     endif()
668     append_list_if(COMPILER_RT_HAS_FNO_BUILTIN_FLAG -fno-builtin BUILTIN_CFLAGS)
669     if(NOT ANDROID)
670       append_list_if(COMPILER_RT_HAS_VISIBILITY_HIDDEN_FLAG -fvisibility=hidden BUILTIN_CFLAGS)
671     endif()
672     if(NOT COMPILER_RT_DEBUG)
673       append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fomit-frame-pointer BUILTIN_CFLAGS)
674     endif()
675   endif()
676
677   set(BUILTIN_DEFS "")
678
679   if(NOT ANDROID)
680     append_list_if(COMPILER_RT_HAS_VISIBILITY_HIDDEN_FLAG VISIBILITY_HIDDEN BUILTIN_DEFS)
681   endif()
682
683   append_list_if(COMPILER_RT_HAS_ASM_LSE HAS_ASM_LSE BUILTIN_DEFS)
684
685   foreach (arch ${BUILTIN_SUPPORTED_ARCH})
686     if (CAN_TARGET_${arch})
687       # For ARM archs, exclude any VFP builtins if VFP is not supported
688       if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em)$")
689         string(REPLACE ";" " " _TARGET_${arch}_CFLAGS "${TARGET_${arch}_CFLAGS}")
690         check_compile_definition(__ARM_FP "${CMAKE_C_FLAGS} ${_TARGET_${arch}_CFLAGS}" COMPILER_RT_HAS_${arch}_VFP)
691         if(NOT COMPILER_RT_HAS_${arch}_VFP)
692           list(REMOVE_ITEM ${arch}_SOURCES ${arm_Thumb1_VFPv2_DP_SOURCES} ${arm_Thumb1_VFPv2_SP_SOURCES} ${arm_Thumb1_SjLj_EH_SOURCES})
693         else()
694           # Exclude any double-precision builtins if VFP is single-precision-only
695           check_c_source_compiles("#if !(__ARM_FP & 0x8)
696                                    #error No double-precision support!
697                                    #endif
698                                    int main() { return 0; }" COMPILER_RT_HAS_${arch}_VFP_DP)
699           if(NOT COMPILER_RT_HAS_${arch}_VFP_DP)
700             list(REMOVE_ITEM ${arch}_SOURCES ${arm_Thumb1_VFPv2_DP_SOURCES})
701           endif()
702         endif()
703       endif()
704
705       # Remove a generic C builtin when an arch-specific builtin is specified.
706       filter_builtin_sources(${arch}_SOURCES ${arch})
707
708       # Needed for clear_cache on debug mode, due to r7's usage in inline asm.
709       # Release mode already sets it via -O2/3, Debug mode doesn't.
710       if (${arch} STREQUAL "armhf")
711         list(APPEND BUILTIN_CFLAGS -fomit-frame-pointer -DCOMPILER_RT_ARMHF_TARGET)
712       endif()
713
714       # For RISCV32, we must force enable int128 for compiling long
715       # double routines.
716       if("${arch}" STREQUAL "riscv32")
717         list(APPEND BUILTIN_CFLAGS -fforce-enable-int128)
718       endif()
719
720       add_compiler_rt_runtime(clang_rt.builtins
721                               STATIC
722                               ARCHS ${arch}
723                               SOURCES ${${arch}_SOURCES}
724                               DEFS ${BUILTIN_DEFS}
725                               CFLAGS ${BUILTIN_CFLAGS}
726                               PARENT_TARGET builtins)
727     endif ()
728   endforeach ()
729 endif ()
730
731 add_dependencies(compiler-rt builtins)