Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / compiler-rt / lib / builtins / CMakeLists.txt
blob360fdb0e99b57bed6af354f59892a68782b1073f
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.
5 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
6   cmake_minimum_required(VERSION 3.20.0)
8   set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
9   project(CompilerRTBuiltins C ASM)
10   set(COMPILER_RT_STANDALONE_BUILD TRUE)
11   set(COMPILER_RT_BUILTINS_STANDALONE_BUILD TRUE)
13   set(COMPILER_RT_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../..")
15   set(LLVM_COMMON_CMAKE_UTILS "${COMPILER_RT_SOURCE_DIR}/../cmake")
17   # Add path for custom modules
18   list(INSERT CMAKE_MODULE_PATH 0
19     "${COMPILER_RT_SOURCE_DIR}/cmake"
20     "${COMPILER_RT_SOURCE_DIR}/cmake/Modules"
21     "${LLVM_COMMON_CMAKE_UTILS}"
22     "${LLVM_COMMON_CMAKE_UTILS}/Modules"
23     )
25   include(base-config-ix)
26   include(CompilerRTUtils)
28   if (NOT LLVM_RUNTIMES_BUILD)
29     load_llvm_config()
30   endif()
31   construct_compiler_rt_default_triple()
33   include(SetPlatformToolchainTools)
34   if(APPLE)
35     include(CompilerRTDarwinUtils)
36   endif()
37   if(APPLE)
38     include(UseLibtool)
39   endif()
40   include(AddCompilerRT)
41 endif()
43 if (COMPILER_RT_STANDALONE_BUILD)
44   # When compiler-rt is being built standalone, possibly as a cross-compilation
45   # target, the target may or may not want position independent code. This
46   # option provides an avenue through which the flag may be controlled when an
47   # LLVM configuration is not being utilized.
48   option(COMPILER_RT_BUILTINS_ENABLE_PIC
49     "Turns on or off -fPIC for the builtin library source"
50     ON)
51 endif()
53 include(builtin-config-ix)
54 include(CMakeDependentOption)
55 include(CMakePushCheckState)
57 option(COMPILER_RT_BUILTINS_HIDE_SYMBOLS
58   "Do not export any symbols from the static library." ON)
60 # TODO: Need to add a mechanism for logging errors when builtin source files are
61 # added to a sub-directory and not this CMakeLists file.
62 set(GENERIC_SOURCES
63   absvdi2.c
64   absvsi2.c
65   absvti2.c
66   adddf3.c
67   addsf3.c
68   addvdi3.c
69   addvsi3.c
70   addvti3.c
71   apple_versioning.c
72   ashldi3.c
73   ashlti3.c
74   ashrdi3.c
75   ashrti3.c
76   bswapdi2.c
77   bswapsi2.c
78   clzdi2.c
79   clzsi2.c
80   clzti2.c
81   cmpdi2.c
82   cmpti2.c
83   comparedf2.c
84   comparesf2.c
85   ctzdi2.c
86   ctzsi2.c
87   ctzti2.c
88   divdc3.c
89   divdf3.c
90   divdi3.c
91   divmoddi4.c
92   divmodsi4.c
93   divmodti4.c
94   divsc3.c
95   divsf3.c
96   divsi3.c
97   divti3.c
98   extendsfdf2.c
99   extendhfsf2.c
100   ffsdi2.c
101   ffssi2.c
102   ffsti2.c
103   fixdfdi.c
104   fixdfsi.c
105   fixdfti.c
106   fixsfdi.c
107   fixsfsi.c
108   fixsfti.c
109   fixunsdfdi.c
110   fixunsdfsi.c
111   fixunsdfti.c
112   fixunssfdi.c
113   fixunssfsi.c
114   fixunssfti.c
115   floatdidf.c
116   floatdisf.c
117   floatsidf.c
118   floatsisf.c
119   floattidf.c
120   floattisf.c
121   floatundidf.c
122   floatundisf.c
123   floatunsidf.c
124   floatunsisf.c
125   floatuntidf.c
126   floatuntisf.c
127   fp_mode.c
128   int_util.c
129   lshrdi3.c
130   lshrti3.c
131   moddi3.c
132   modsi3.c
133   modti3.c
134   muldc3.c
135   muldf3.c
136   muldi3.c
137   mulodi4.c
138   mulosi4.c
139   muloti4.c
140   mulsc3.c
141   mulsf3.c
142   multi3.c
143   mulvdi3.c
144   mulvsi3.c
145   mulvti3.c
146   negdf2.c
147   negdi2.c
148   negsf2.c
149   negti2.c
150   negvdi2.c
151   negvsi2.c
152   negvti2.c
153   os_version_check.c
154   paritydi2.c
155   paritysi2.c
156   parityti2.c
157   popcountdi2.c
158   popcountsi2.c
159   popcountti2.c
160   powidf2.c
161   powisf2.c
162   subdf3.c
163   subsf3.c
164   subvdi3.c
165   subvsi3.c
166   subvti3.c
167   trampoline_setup.c
168   truncdfhf2.c
169   truncdfsf2.c
170   truncsfhf2.c
171   ucmpdi2.c
172   ucmpti2.c
173   udivdi3.c
174   udivmoddi4.c
175   udivmodsi4.c
176   udivmodti4.c
177   udivsi3.c
178   udivti3.c
179   umoddi3.c
180   umodsi3.c
181   umodti3.c
184 # We only build BF16 files when "__bf16" is available.
185 set(BF16_SOURCES
186     truncdfbf2.c
187     truncsfbf2.c
190 set(GENERIC_TF_SOURCES
191   addtf3.c
192   comparetf2.c
193   divtc3.c
194   divtf3.c
195   extenddftf2.c
196   extendhftf2.c
197   extendsftf2.c
198   fixtfdi.c
199   fixtfsi.c
200   fixtfti.c
201   fixunstfdi.c
202   fixunstfsi.c
203   fixunstfti.c
204   floatditf.c
205   floatsitf.c
206   floattitf.c
207   floatunditf.c
208   floatunsitf.c
209   floatuntitf.c
210   multc3.c
211   multf3.c
212   powitf2.c
213   subtf3.c
214   trunctfdf2.c
215   trunctfhf2.c
216   trunctfsf2.c
219 option(COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN
220   "Skip the atomic builtin (these should normally be provided by a shared library)"
221   On)
223 if(NOT FUCHSIA AND NOT COMPILER_RT_BAREMETAL_BUILD)
224   set(GENERIC_SOURCES
225     ${GENERIC_SOURCES}
226     emutls.c
227     enable_execute_stack.c
228     eprintf.c
229   )
230 endif()
232 if(COMPILER_RT_HAS_ATOMIC_KEYWORD AND NOT COMPILER_RT_EXCLUDE_ATOMIC_BUILTIN)
233   set(GENERIC_SOURCES
234     ${GENERIC_SOURCES}
235     atomic.c
236   )
237 endif()
239 if(APPLE)
240   set(GENERIC_SOURCES
241     ${GENERIC_SOURCES}
242     atomic_flag_clear.c
243     atomic_flag_clear_explicit.c
244     atomic_flag_test_and_set.c
245     atomic_flag_test_and_set_explicit.c
246     atomic_signal_fence.c
247     atomic_thread_fence.c
248   )
249 endif()
251 if (HAVE_UNWIND_H)
252   set(GENERIC_SOURCES
253     ${GENERIC_SOURCES}
254     gcc_personality_v0.c
255   )
256 endif ()
258 if (NOT FUCHSIA)
259   set(GENERIC_SOURCES
260     ${GENERIC_SOURCES}
261     clear_cache.c
262   )
263 endif()
265 # These files are used on 32-bit and 64-bit x86.
266 set(x86_ARCH_SOURCES
267   cpu_model.c
268   )
270 if (NOT MSVC)
271   set(x86_ARCH_SOURCES
272     ${x86_ARCH_SOURCES}
273     i386/fp_mode.c
274   )
275 endif ()
277 # Implement extended-precision builtins, assuming long double is 80 bits.
278 # long double is not 80 bits on Android or MSVC.
279 set(x86_80_BIT_SOURCES
280   divxc3.c
281   extendxftf2.c
282   fixxfdi.c
283   fixxfti.c
284   fixunsxfdi.c
285   fixunsxfsi.c
286   fixunsxfti.c
287   floatdixf.c
288   floattixf.c
289   floatundixf.c
290   floatuntixf.c
291   mulxc3.c
292   powixf2.c
293   trunctfxf2.c
296 if (NOT MSVC)
297   set(x86_64_SOURCES
298     ${GENERIC_SOURCES}
299     ${GENERIC_TF_SOURCES}
300     ${x86_ARCH_SOURCES}
301     x86_64/floatdidf.c
302     x86_64/floatdisf.c
303   )
304   if (NOT WIN32)
305     set(x86_64_SOURCES
306       ${x86_64_SOURCES}
307       x86_64/floatundidf.S
308       x86_64/floatundisf.S
309     )
310   endif()
312   if (NOT ANDROID)
313     set(x86_64_SOURCES
314       ${x86_64_SOURCES}
315       ${x86_80_BIT_SOURCES}
316       x86_64/floatdixf.c
317     )
318     if (NOT WIN32)
319       set(x86_64_SOURCES
320         ${x86_64_SOURCES}
321         x86_64/floatundixf.S
322       )
323     endif()
324   endif()
326   # Darwin x86_64 Haswell
327   set(x86_64h_SOURCES ${x86_64_SOURCES})
329   if (WIN32)
330     set(x86_64_SOURCES
331       ${x86_64_SOURCES}
332       x86_64/chkstk.S
333     )
334   endif()
336   set(i386_SOURCES
337     ${GENERIC_SOURCES}
338     ${x86_ARCH_SOURCES}
339     i386/ashldi3.S
340     i386/ashrdi3.S
341     i386/divdi3.S
342     i386/floatdidf.S
343     i386/floatdisf.S
344     i386/floatundidf.S
345     i386/floatundisf.S
346     i386/lshrdi3.S
347     i386/moddi3.S
348     i386/muldi3.S
349     i386/udivdi3.S
350     i386/umoddi3.S
351   )
353   if (NOT ANDROID)
354     set(i386_SOURCES
355       ${i386_SOURCES}
356       ${x86_80_BIT_SOURCES}
357       i386/floatdixf.S
358       i386/floatundixf.S
359     )
360   endif()
362   if (WIN32)
363     set(i386_SOURCES
364       ${i386_SOURCES}
365       i386/chkstk.S
366     )
367   endif()
368 else () # MSVC
369   # Use C versions of functions when building on MSVC
370   # MSVC's assembler takes Intel syntax, not AT&T syntax.
371   # Also use only MSVC compilable builtin implementations.
372   set(x86_64_SOURCES
373     ${GENERIC_SOURCES}
374     ${x86_ARCH_SOURCES}
375     x86_64/floatdidf.c
376     x86_64/floatdisf.c
377   )
378   set(i386_SOURCES ${GENERIC_SOURCES} ${x86_ARCH_SOURCES})
379 endif () # if (NOT MSVC)
382 # builtin support for Targets that have Arm state or have Thumb2
383 set(arm_or_thumb2_base_SOURCES
384   arm/fp_mode.c
385   arm/bswapdi2.S
386   arm/bswapsi2.S
387   arm/clzdi2.S
388   arm/clzsi2.S
389   arm/comparesf2.S
390   arm/divmodsi4.S
391   arm/divsi3.S
392   arm/modsi3.S
393   arm/udivmodsi4.S
394   arm/udivsi3.S
395   arm/umodsi3.S
396   ${GENERIC_SOURCES}
399 set(arm_sync_SOURCES
400   arm/sync_fetch_and_add_4.S
401   arm/sync_fetch_and_add_8.S
402   arm/sync_fetch_and_and_4.S
403   arm/sync_fetch_and_and_8.S
404   arm/sync_fetch_and_max_4.S
405   arm/sync_fetch_and_max_8.S
406   arm/sync_fetch_and_min_4.S
407   arm/sync_fetch_and_min_8.S
408   arm/sync_fetch_and_nand_4.S
409   arm/sync_fetch_and_nand_8.S
410   arm/sync_fetch_and_or_4.S
411   arm/sync_fetch_and_or_8.S
412   arm/sync_fetch_and_sub_4.S
413   arm/sync_fetch_and_sub_8.S
414   arm/sync_fetch_and_umax_4.S
415   arm/sync_fetch_and_umax_8.S
416   arm/sync_fetch_and_umin_4.S
417   arm/sync_fetch_and_umin_8.S
418   arm/sync_fetch_and_xor_4.S
419   arm/sync_fetch_and_xor_8.S
422 # builtin support for Thumb-only targets with very limited Thumb2 technology,
423 # such as v6-m and v8-m.baseline
424 set(thumb1_base_SOURCES
425   arm/divsi3.S
426   arm/udivsi3.S
427   arm/comparesf2.S
428   arm/addsf3.S
429   ${GENERIC_SOURCES}
432 set(arm_EABI_SOURCES
433   arm/aeabi_cdcmp.S
434   arm/aeabi_cdcmpeq_check_nan.c
435   arm/aeabi_cfcmp.S
436   arm/aeabi_cfcmpeq_check_nan.c
437   arm/aeabi_dcmp.S
438   arm/aeabi_div0.c
439   arm/aeabi_drsub.c
440   arm/aeabi_fcmp.S
441   arm/aeabi_frsub.c
442   arm/aeabi_idivmod.S
443   arm/aeabi_ldivmod.S
444   arm/aeabi_memcmp.S
445   arm/aeabi_memcpy.S
446   arm/aeabi_memmove.S
447   arm/aeabi_memset.S
448   arm/aeabi_uidivmod.S
449   arm/aeabi_uldivmod.S
452 set(arm_Thumb1_JT_SOURCES
453   arm/switch16.S
454   arm/switch32.S
455   arm/switch8.S
456   arm/switchu8.S
458 set(arm_Thumb1_SjLj_EH_SOURCES
459   arm/restore_vfp_d8_d15_regs.S
460   arm/save_vfp_d8_d15_regs.S
462 set(arm_Thumb1_VFPv2_DP_SOURCES
463   arm/adddf3vfp.S
464   arm/divdf3vfp.S
465   arm/eqdf2vfp.S
466   arm/extendsfdf2vfp.S
467   arm/fixdfsivfp.S
468   arm/fixunsdfsivfp.S
469   arm/floatsidfvfp.S
470   arm/floatunssidfvfp.S
471   arm/gedf2vfp.S
472   arm/gtdf2vfp.S
473   arm/ledf2vfp.S
474   arm/ltdf2vfp.S
475   arm/muldf3vfp.S
476   arm/nedf2vfp.S
477   arm/negdf2vfp.S
478   arm/subdf3vfp.S
479   arm/truncdfsf2vfp.S
480   arm/unorddf2vfp.S
482 set(arm_Thumb1_VFPv2_SP_SOURCES
483   arm/addsf3vfp.S
484   arm/divsf3vfp.S
485   arm/eqsf2vfp.S
486   arm/fixsfsivfp.S
487   arm/fixunssfsivfp.S
488   arm/floatsisfvfp.S
489   arm/floatunssisfvfp.S
490   arm/gesf2vfp.S
491   arm/gtsf2vfp.S
492   arm/lesf2vfp.S
493   arm/ltsf2vfp.S
494   arm/mulsf3vfp.S
495   arm/negsf2vfp.S
496   arm/nesf2vfp.S
497   arm/subsf3vfp.S
498   arm/unordsf2vfp.S
500 set(arm_Thumb1_icache_SOURCES
501   arm/sync_synchronize.S
504 # thumb1 calling into Arm to cover support
505 set(arm_Thumb1_SOURCES
506   ${arm_Thumb1_JT_SOURCES}
507   ${arm_Thumb1_SjLj_EH_SOURCES}
508   ${arm_Thumb1_VFPv2_DP_SOURCES}
509   ${arm_Thumb1_VFPv2_SP_SOURCES}
510   ${arm_Thumb1_icache_SOURCES}
513 # base functionality for Arm Targets prior to Arm v7-a and Armv6-m such as v6,
514 # v5t, v4t
515 set(arm_min_SOURCES
516   ${arm_or_thumb2_base_SOURCES}
517   ${arm_EABI_SOURCES}
520 if(MINGW)
521   set(arm_SOURCES
522     arm/aeabi_idivmod.S
523     arm/aeabi_ldivmod.S
524     arm/aeabi_uidivmod.S
525     arm/aeabi_uldivmod.S
526     arm/chkstk.S
527     ${arm_or_thumb2_base_SOURCES}
528     ${arm_sync_SOURCES}
529   )
531   set(thumb1_SOURCES
532     ${thumb1_base_SOURCES}
533   )
534 elseif(NOT WIN32)
535   # TODO the EABI sources should only be added to EABI targets
536   set(arm_SOURCES
537     ${arm_or_thumb2_base_SOURCES}
538     ${arm_sync_SOURCES}
539     ${arm_EABI_SOURCES}
540     ${arm_Thumb1_SOURCES}
541   )
543   set(thumb1_SOURCES
544     ${thumb1_base_SOURCES}
545     ${arm_EABI_SOURCES}
546   )
547 endif()
549 set(aarch64_SOURCES
550   ${GENERIC_TF_SOURCES}
551   ${GENERIC_SOURCES}
552   cpu_model.c
553   aarch64/fp_mode.c
556 if(COMPILER_RT_HAS_ASM_SME AND (COMPILER_RT_HAS_AUXV OR COMPILER_RT_BAREMETAL_BUILD))
557   list(APPEND aarch64_SOURCES aarch64/sme-abi.S aarch64/sme-abi-init.c)
558   message(STATUS "AArch64 SME ABI routines enabled")
559 else()
560   message(STATUS "AArch64 SME ABI routines disabled")
561 endif()
563 # Generate outline atomics helpers from lse.S base
564 set(OA_HELPERS_DIR "${CMAKE_CURRENT_BINARY_DIR}/outline_atomic_helpers.dir")
565 file(MAKE_DIRECTORY "${OA_HELPERS_DIR}")
567 if(CMAKE_HOST_UNIX)
568   set(COMPILER_RT_LINK_OR_COPY create_symlink)
569 else()
570   set(COMPILER_RT_LINK_OR_COPY copy)
571 endif()
573 foreach(pat cas swp ldadd ldclr ldeor ldset)
574   foreach(size 1 2 4 8 16)
575     foreach(model 1 2 3 4 5)
576       if(pat STREQUAL "cas" OR NOT size STREQUAL "16")
577         set(source_asm "${CMAKE_CURRENT_SOURCE_DIR}/aarch64/lse.S")
578         set(helper_asm "${OA_HELPERS_DIR}/outline_atomic_${pat}${size}_${model}.S")
579         add_custom_command(
580           OUTPUT "${helper_asm}"
581           COMMAND ${CMAKE_COMMAND} -E ${COMPILER_RT_LINK_OR_COPY} "${source_asm}" "${helper_asm}"
582           DEPENDS "${source_asm}"
583         )
584         set_source_files_properties("${helper_asm}"
585           PROPERTIES
586           COMPILE_DEFINITIONS "L_${pat};SIZE=${size};MODEL=${model}"
587           INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}"
588         )
589         list(APPEND aarch64_SOURCES "${helper_asm}")
590       endif()
591     endforeach(model)
592   endforeach(size)
593 endforeach(pat)
595 if (MINGW)
596   set(aarch64_SOURCES
597     ${aarch64_SOURCES}
598     aarch64/chkstk.S
599   )
600 endif()
602 set(armv4t_SOURCES ${arm_min_SOURCES})
603 set(armv5te_SOURCES ${arm_min_SOURCES})
604 set(armv6_SOURCES ${arm_min_SOURCES})
605 set(armhf_SOURCES ${arm_SOURCES})
606 set(armv7_SOURCES ${arm_SOURCES})
607 set(armv7s_SOURCES ${arm_SOURCES})
608 set(armv7k_SOURCES ${arm_SOURCES})
609 set(arm64_SOURCES ${aarch64_SOURCES})
610 set(arm64e_SOURCES ${aarch64_SOURCES})
611 set(arm64_32_SOURCES ${aarch64_SOURCES})
613 # macho_embedded archs
614 set(armv6m_SOURCES ${thumb1_SOURCES})
615 set(armv7m_SOURCES ${arm_SOURCES})
616 set(armv7em_SOURCES ${arm_SOURCES})
617 set(armv8m.base_SOURCES ${thumb1_SOURCES})
618 set(armv8m.main_SOURCES ${arm_SOURCES})
619 set(armv8.1m.main_SOURCES ${arm_SOURCES})
621 # 8-bit AVR MCU
622 set(avr_SOURCES
623   avr/mulqi3.S
624   avr/mulhi3.S
625   avr/exit.S
626   avr/divmodhi4.S
627   avr/udivmodhi4.S
628   avr/divmodqi4.S
629   avr/udivmodqi4.S
630   ${GENERIC_SOURCES}
633 # hexagon arch
634 set(hexagon_SOURCES
635   hexagon/common_entry_exit_abi1.S
636   hexagon/common_entry_exit_abi2.S
637   hexagon/common_entry_exit_legacy.S
638   hexagon/dfaddsub.S
639   hexagon/dfdiv.S
640   hexagon/dffma.S
641   hexagon/dfminmax.S
642   hexagon/dfmul.S
643   hexagon/dfsqrt.S
644   hexagon/divdi3.S
645   hexagon/divsi3.S
646   hexagon/fastmath2_dlib_asm.S
647   hexagon/fastmath2_ldlib_asm.S
648   hexagon/fastmath_dlib_asm.S
649   hexagon/memcpy_forward_vp4cp4n2.S
650   hexagon/memcpy_likely_aligned.S
651   hexagon/moddi3.S
652   hexagon/modsi3.S
653   hexagon/sfdiv_opt.S
654   hexagon/sfsqrt_opt.S
655   hexagon/udivdi3.S
656   hexagon/udivmoddi4.S
657   hexagon/udivmodsi4.S
658   hexagon/udivsi3.S
659   hexagon/umoddi3.S
660   hexagon/umodsi3.S
661   ${GENERIC_SOURCES}
662   ${GENERIC_TF_SOURCES}
665 set(loongarch_SOURCES
666   loongarch/fp_mode.c
667   ${GENERIC_SOURCES}
668   ${GENERIC_TF_SOURCES}
670 set(loongarch64_SOURCES
671   ${loongarch_SOURCES}
674 set(mips_SOURCES ${GENERIC_SOURCES})
675 set(mipsel_SOURCES ${mips_SOURCES})
676 set(mips64_SOURCES ${GENERIC_TF_SOURCES}
677                    ${mips_SOURCES})
678 set(mips64el_SOURCES ${GENERIC_TF_SOURCES}
679                      ${mips_SOURCES})
681 set(powerpc_SOURCES ${GENERIC_SOURCES})
683 set(powerpcspe_SOURCES ${GENERIC_SOURCES})
685 set(powerpc64_SOURCES
686   ppc/divtc3.c
687   ppc/fixtfdi.c
688   ppc/fixunstfdi.c
689   ppc/floatditf.c
690   ppc/floatunditf.c
691   ppc/gcc_qadd.c
692   ppc/gcc_qdiv.c
693   ppc/gcc_qmul.c
694   ppc/gcc_qsub.c
695   ppc/multc3.c
696   ${GENERIC_SOURCES}
698 # These routines require __int128, which isn't supported on AIX.
699 if (NOT OS_NAME MATCHES "AIX")
700   set(powerpc64_SOURCES
701     ppc/floattitf.c
702     ppc/fixtfti.c
703     ppc/fixunstfti.c
704     ${powerpc64_SOURCES}
705   )
706 endif()
707 set(powerpc64le_SOURCES ${powerpc64_SOURCES})
709 set(riscv_SOURCES
710   riscv/fp_mode.c
711   riscv/save.S
712   riscv/restore.S
713   ${GENERIC_SOURCES}
714   ${GENERIC_TF_SOURCES}
716 set(riscv32_SOURCES
717   riscv/mulsi3.S
718   ${riscv_SOURCES}
720 set(riscv64_SOURCES
721   riscv/muldi3.S
722   ${riscv_SOURCES}
725 set(sparc_SOURCES ${GENERIC_SOURCES} ${GENERIC_TF_SOURCES})
726 set(sparcv9_SOURCES ${GENERIC_SOURCES} ${GENERIC_TF_SOURCES})
728 set(wasm32_SOURCES
729   ${GENERIC_TF_SOURCES}
730   ${GENERIC_SOURCES}
732 set(wasm64_SOURCES
733   ${GENERIC_TF_SOURCES}
734   ${GENERIC_SOURCES}
737 set(ve_SOURCES
738   ve/grow_stack.S
739   ve/grow_stack_align.S
740   ${GENERIC_TF_SOURCES}
741   ${GENERIC_SOURCES})
743 add_custom_target(builtins)
744 set_target_properties(builtins PROPERTIES FOLDER "Compiler-RT Misc")
746 option(COMPILER_RT_ENABLE_SOFTWARE_INT128
747   "Enable the int128 builtin routines for all targets."
748   OFF)
750 if (APPLE)
751   add_subdirectory(Darwin-excludes)
752   add_subdirectory(macho_embedded)
753   darwin_add_builtin_libraries(${BUILTIN_SUPPORTED_OS})
754 else ()
755   set(BUILTIN_CFLAGS "")
756   add_security_warnings(BUILTIN_CFLAGS 0)
758   if (COMPILER_RT_HAS_FCF_PROTECTION_FLAG)
759     append_list_if(COMPILER_RT_ENABLE_CET -fcf-protection=full BUILTIN_CFLAGS)
760   endif()
762   append_list_if(COMPILER_RT_HAS_STD_C11_FLAG -std=c11 BUILTIN_CFLAGS)
764   # Don't embed directives for picking any specific CRT
765   if (MSVC)
766     set(CMAKE_MSVC_RUNTIME_LIBRARY "")
767     append_list_if(COMPILER_RT_HAS_ZL_FLAG /Zl BUILTIN_CFLAGS)
768   endif()
770   # These flags would normally be added to CMAKE_C_FLAGS by the llvm
771   # cmake step. Add them manually if this is a standalone build.
772   if(COMPILER_RT_STANDALONE_BUILD)
773     if(COMPILER_RT_BUILTINS_ENABLE_PIC)
774       append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC BUILTIN_CFLAGS)
775     endif()
776     append_list_if(COMPILER_RT_HAS_FNO_BUILTIN_FLAG -fno-builtin BUILTIN_CFLAGS)
777     if(COMPILER_RT_BUILTINS_HIDE_SYMBOLS)
778       append_list_if(COMPILER_RT_HAS_VISIBILITY_HIDDEN_FLAG -fvisibility=hidden BUILTIN_CFLAGS)
779     endif()
780     if(NOT COMPILER_RT_DEBUG)
781       append_list_if(COMPILER_RT_HAS_OMIT_FRAME_POINTER_FLAG -fomit-frame-pointer BUILTIN_CFLAGS)
782     endif()
783   endif()
785   set(BUILTIN_DEFS "")
787   if(COMPILER_RT_BUILTINS_HIDE_SYMBOLS)
788     append_list_if(COMPILER_RT_HAS_VISIBILITY_HIDDEN_FLAG VISIBILITY_HIDDEN BUILTIN_DEFS)
789   endif()
791   if(COMPILER_RT_DISABLE_AARCH64_FMV)
792     list(APPEND BUILTIN_DEFS DISABLE_AARCH64_FMV)
793   endif()
795   append_list_if(COMPILER_RT_HAS_ASM_LSE HAS_ASM_LSE BUILTIN_DEFS)
797   foreach (arch ${BUILTIN_SUPPORTED_ARCH})
798     if (CAN_TARGET_${arch})
799       cmake_push_check_state()
800       # TODO: we should probably make most of the checks in builtin-config depend on the target flags.
801       message(STATUS "Performing additional configure checks with target flags: ${TARGET_${arch}_CFLAGS}")
802       set(BUILTIN_CFLAGS_${arch} ${BUILTIN_CFLAGS})
803       list(APPEND CMAKE_REQUIRED_FLAGS ${TARGET_${arch}_CFLAGS} ${BUILTIN_CFLAGS_${arch}})
804       # For ARM archs, exclude any VFP builtins if VFP is not supported
805       if (${arch} MATCHES "^(arm|armhf|armv7|armv7s|armv7k|armv7m|armv7em|armv8m.main|armv8.1m.main)$")
806         string(REPLACE ";" " " _TARGET_${arch}_CFLAGS "${TARGET_${arch}_CFLAGS}")
807         check_compile_definition(__ARM_FP "${CMAKE_C_FLAGS} ${_TARGET_${arch}_CFLAGS}" COMPILER_RT_HAS_${arch}_VFP)
808         if(NOT COMPILER_RT_HAS_${arch}_VFP)
809           list(REMOVE_ITEM ${arch}_SOURCES ${arm_Thumb1_VFPv2_DP_SOURCES} ${arm_Thumb1_VFPv2_SP_SOURCES} ${arm_Thumb1_SjLj_EH_SOURCES})
810         else()
811           # Exclude any double-precision builtins if VFP is single-precision-only
812           try_compile_only(COMPILER_RT_HAS_${arch}_VFP_DP
813                            SOURCE "#if !(__ARM_FP & 0x8)
814                                    #error No double-precision support!
815                                    #endif
816                                    int main(void) { return 0; }")
817           if(NOT COMPILER_RT_HAS_${arch}_VFP_DP)
818             list(REMOVE_ITEM ${arch}_SOURCES ${arm_Thumb1_VFPv2_DP_SOURCES})
819           endif()
820         endif()
821       endif()
822       check_c_source_compiles("_Float16 foo(_Float16 x) { return x; }"
823                               COMPILER_RT_HAS_${arch}_FLOAT16)
824       append_list_if(COMPILER_RT_HAS_${arch}_FLOAT16 -DCOMPILER_RT_HAS_FLOAT16 BUILTIN_CFLAGS_${arch})
825       check_c_source_compiles("__bf16 foo(__bf16 x) { return x; }"
826                               COMPILER_RT_HAS_${arch}_BFLOAT16)
827       # Build BF16 files only when "__bf16" is available.
828       if(COMPILER_RT_HAS_${arch}_BFLOAT16)
829         list(APPEND ${arch}_SOURCES ${BF16_SOURCES})
830       endif()
832       # Remove a generic C builtin when an arch-specific builtin is specified.
833       filter_builtin_sources(${arch}_SOURCES ${arch})
835       # Needed for clear_cache on debug mode, due to r7's usage in inline asm.
836       # Release mode already sets it via -O2/3, Debug mode doesn't.
837       if (${arch} STREQUAL "armhf")
838         list(APPEND BUILTIN_CFLAGS_${arch} -fomit-frame-pointer -DCOMPILER_RT_ARMHF_TARGET)
839       endif()
841       # For RISCV32, we must force enable int128 for compiling long
842       # double routines.
843       if(COMPILER_RT_ENABLE_SOFTWARE_INT128 OR "${arch}" STREQUAL "riscv32")
844         list(APPEND BUILTIN_CFLAGS_${arch} -fforce-enable-int128)
845       endif()
847       add_compiler_rt_runtime(clang_rt.builtins
848                               STATIC
849                               ARCHS ${arch}
850                               DEPS ${deps_${arch}}
851                               SOURCES ${${arch}_SOURCES}
852                               DEFS ${BUILTIN_DEFS}
853                               CFLAGS ${BUILTIN_CFLAGS_${arch}}
854                               PARENT_TARGET builtins)
855       cmake_pop_check_state()
856     endif ()
857   endforeach ()
858 endif ()
860 add_dependencies(compiler-rt builtins)
862 option(COMPILER_RT_BUILD_STANDALONE_LIBATOMIC
863   "Build standalone shared atomic library."
864   OFF)
866 if(COMPILER_RT_BUILD_STANDALONE_LIBATOMIC)
867   add_custom_target(builtins-standalone-atomic)
868   set(BUILTIN_TYPE SHARED)
869   if(OS_NAME MATCHES "AIX")
870     include(CompilerRTAIXUtils)
871     if(NOT COMPILER_RT_LIBATOMIC_LINK_FLAGS)
872       get_aix_libatomic_default_link_flags(COMPILER_RT_LIBATOMIC_LINK_FLAGS
873         "${CMAKE_CURRENT_SOURCE_DIR}/ppc/atomic.exp")
874     endif()
875     # For different versions of cmake, SHARED behaves differently. For some
876     # versions, we might need MODULE rather than SHARED.
877     get_aix_libatomic_type(BUILTIN_TYPE)
878   else()
879     list(APPEND COMPILER_RT_LIBATOMIC_LINK_FLAGS -nodefaultlibs)
880   endif()
881   foreach (arch ${BUILTIN_SUPPORTED_ARCH})
882     if(CAN_TARGET_${arch})
883       add_compiler_rt_runtime(clang_rt.atomic
884                               ${BUILTIN_TYPE}
885                               ARCHS ${arch}
886                               SOURCES atomic.c
887                               LINK_FLAGS ${COMPILER_RT_LIBATOMIC_LINK_FLAGS}
888                               LINK_LIBS clang_rt.builtins-${arch}
889                               PARENT_TARGET builtins-standalone-atomic)
890     endif()
891   endforeach()
892   # FIXME: On AIX, we have to archive built shared libraries into a static
893   # archive, i.e., libatomic.a. Once cmake adds support of such usage for AIX,
894   # this ad-hoc part can be removed.
895   if(OS_NAME MATCHES "AIX")
896     archive_aix_libatomic(clang_rt.atomic libatomic
897                           ARCHS ${BUILTIN_SUPPORTED_ARCH}
898                           PARENT_TARGET builtins-standalone-atomic)
899   endif()
900   add_dependencies(compiler-rt builtins-standalone-atomic)
901 endif()
903 # TODO: COMPILER_RT_BUILD_CRT used to be a cached variable so we need to unset
904 # it first so cmake_dependent_option can set the local variable of the same
905 # name. This statement can be removed in the future.
906 unset(COMPILER_RT_BUILD_CRT CACHE)
908 cmake_dependent_option(COMPILER_RT_BUILD_CRT "Build crtbegin.o/crtend.o" ON "COMPILER_RT_HAS_CRT" OFF)
910 if (COMPILER_RT_BUILD_CRT)
911   add_compiler_rt_component(crt)
913   option(COMPILER_RT_CRT_USE_EH_FRAME_REGISTRY "Use eh_frame in crtbegin.o/crtend.o" ON)
915   include(CheckSectionExists)
916   check_section_exists(".init_array" COMPILER_RT_HAS_INITFINI_ARRAY
917     SOURCE "volatile int x;\n__attribute__((constructor)) void f(void) {x = 0;}\nint main(void) { return 0; }\n")
919   append_list_if(COMPILER_RT_HAS_STD_C11_FLAG -std=c11 CRT_CFLAGS)
920   append_list_if(COMPILER_RT_HAS_INITFINI_ARRAY -DCRT_HAS_INITFINI_ARRAY CRT_CFLAGS)
921   append_list_if(COMPILER_RT_CRT_USE_EH_FRAME_REGISTRY -DEH_USE_FRAME_REGISTRY CRT_CFLAGS)
922   append_list_if(COMPILER_RT_HAS_FPIC_FLAG -fPIC CRT_CFLAGS)
923   append_list_if(COMPILER_RT_HAS_WNO_PEDANTIC -Wno-pedantic CRT_CFLAGS)
924   if (COMPILER_RT_HAS_FCF_PROTECTION_FLAG)
925     append_list_if(COMPILER_RT_ENABLE_CET -fcf-protection=full CRT_CFLAGS)
926   endif()
928   foreach(arch ${BUILTIN_SUPPORTED_ARCH})
929     add_compiler_rt_runtime(clang_rt.crtbegin
930       OBJECT
931       ARCHS ${arch}
932       SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/crtbegin.c
933       CFLAGS ${CRT_CFLAGS}
934       PARENT_TARGET crt)
935     add_compiler_rt_runtime(clang_rt.crtend
936       OBJECT
937       ARCHS ${arch}
938       SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/crtend.c
939       CFLAGS ${CRT_CFLAGS}
940       PARENT_TARGET crt)
941   endforeach()
943   add_dependencies(compiler-rt crt)
944 endif()