1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00

[gn] Support for building compiler-rt builtins

This is support for building compiler-rt builtins, The library build
should be complete for a subset of supported platforms, but not all
CMake options have been replicated in GN.

We always use the just built compiler to build all the runtimes, which
is equivalent to the CMake runtimes build. This simplifies the build
configuration because we don't need to support arbitrary host compiler
and can always assume the latest Clang. With GN's toolchain support,
this is significantly more efficient than the CMake runtimes build.

Differential Revision: https://reviews.llvm.org/D60331

llvm-svn: 357821
This commit is contained in:
Petr Hosek 2019-04-05 21:30:40 +00:00
parent fbf46c6eb8
commit e9fc38b6ef
5 changed files with 491 additions and 2 deletions

View File

@ -23,9 +23,9 @@ def sync_source_lists():
shell=os.name == 'nt').splitlines() shell=os.name == 'nt').splitlines()
# Matches e.g. | "foo.cpp",|, captures |foo| in group 1. # Matches e.g. | "foo.cpp",|, captures |foo| in group 1.
gn_cpp_re = re.compile(r'^\s*"([^"]+\.(?:cpp|h))",$', re.MULTILINE) gn_cpp_re = re.compile(r'^\s*"([^"]+\.(?:cpp|c|h|S))",$', re.MULTILINE)
# Matches e.g. | foo.cpp|, captures |foo| in group 1. # Matches e.g. | foo.cpp|, captures |foo| in group 1.
cmake_cpp_re = re.compile(r'^\s*([A-Za-z_0-9/-]+\.(?:cpp|h))$', cmake_cpp_re = re.compile(r'^\s*([A-Za-z_0-9/-]+\.(?:cpp|c|h|S))$',
re.MULTILINE) re.MULTILINE)
for gn_file in gn_files: for gn_file in gn_files:

View File

@ -9,6 +9,9 @@ group("default") {
"//lld/test", "//lld/test",
"//llvm/test", "//llvm/test",
] ]
if (current_os == "linux") {
deps += [ "//compiler-rt" ]
}
if (current_os == "linux" || current_os == "android") { if (current_os == "linux" || current_os == "android") {
deps += [ "//compiler-rt/test/hwasan" ] deps += [ "//compiler-rt/test/hwasan" ]
} }

View File

@ -0,0 +1,5 @@
group("compiler-rt") {
deps = [
"//compiler-rt/lib(//llvm/utils/gn/build/toolchain:stage2_unix)",
]
}

View File

@ -0,0 +1,5 @@
group("lib") {
deps = [
"//compiler-rt/lib/builtins",
]
}

View File

@ -0,0 +1,476 @@
import("//compiler-rt/target.gni")
import("//llvm/utils/gn/build/buildflags.gni")
declare_args() {
# Skip the atomic builtin (these should normally be provided by a shared library)
compiler_rt_exclude_atomic_builtin = true
# Compile builtins for baremetal.
compiler_rt_baremetal_build = false
}
static_library("builtins") {
output_dir = crt_current_out_dir
output_name = "clang_rt.builtins-$crt_current_target"
complete_static_lib = true
cflags = [
"-fPIC",
"-fno-builtin",
]
if (target_os != "android") {
cflags += [ "-fvisibility=hidden" ]
}
if (!is_debug) {
cflags += [ "-fomit-frame-pointer" ]
}
cflags_c = [ "-std=c11" ]
configs -= [ "//llvm/utils/gn/build:thin_archive" ]
sources = [
"absvdi2.c",
"absvsi2.c",
"absvti2.c",
"adddf3.c",
"addsf3.c",
"addtf3.c",
"addvdi3.c",
"addvsi3.c",
"addvti3.c",
"apple_versioning.c",
"ashldi3.c",
"ashlti3.c",
"ashrdi3.c",
"ashrti3.c",
"bswapdi2.c",
"bswapsi2.c",
"clzdi2.c",
"clzsi2.c",
"clzti2.c",
"cmpdi2.c",
"cmpti2.c",
"comparedf2.c",
"comparesf2.c",
"ctzdi2.c",
"ctzsi2.c",
"ctzti2.c",
"divdc3.c",
"divdf3.c",
"divdi3.c",
"divmoddi4.c",
"divmodsi4.c",
"divsc3.c",
"divsf3.c",
"divsi3.c",
"divtc3.c",
"divtf3.c",
"divti3.c",
"extendhfsf2.c",
"extendsfdf2.c",
"ffsdi2.c",
"ffssi2.c",
"ffsti2.c",
"fixdfdi.c",
"fixdfsi.c",
"fixdfti.c",
"fixsfdi.c",
"fixsfsi.c",
"fixsfti.c",
"fixunsdfdi.c",
"fixunsdfsi.c",
"fixunsdfti.c",
"fixunssfdi.c",
"fixunssfsi.c",
"fixunssfti.c",
"floatdidf.c",
"floatdisf.c",
"floatsidf.c",
"floatsisf.c",
"floattidf.c",
"floattisf.c",
"floatundidf.c",
"floatundisf.c",
"floatunsidf.c",
"floatunsisf.c",
"floatuntidf.c",
"floatuntisf.c",
"int_util.c",
"lshrdi3.c",
"lshrti3.c",
"moddi3.c",
"modsi3.c",
"modti3.c",
"muldc3.c",
"muldf3.c",
"muldi3.c",
"mulodi4.c",
"mulosi4.c",
"muloti4.c",
"mulsc3.c",
"mulsf3.c",
"multf3.c",
"multi3.c",
"mulvdi3.c",
"mulvsi3.c",
"mulvti3.c",
"negdf2.c",
"negdi2.c",
"negsf2.c",
"negti2.c",
"negvdi2.c",
"negvsi2.c",
"negvti2.c",
"os_version_check.c",
"paritydi2.c",
"paritysi2.c",
"parityti2.c",
"popcountdi2.c",
"popcountsi2.c",
"popcountti2.c",
"powidf2.c",
"powisf2.c",
"powitf2.c",
"subdf3.c",
"subsf3.c",
"subtf3.c",
"subvdi3.c",
"subvsi3.c",
"subvti3.c",
"trampoline_setup.c",
"truncdfhf2.c",
"truncdfsf2.c",
"truncsfhf2.c",
"ucmpdi2.c",
"ucmpti2.c",
"udivdi3.c",
"udivmoddi4.c",
"udivmodsi4.c",
"udivmodti4.c",
"udivsi3.c",
"udivti3.c",
"umoddi3.c",
"umodsi3.c",
"umodti3.c",
# This depends on unwind.h which is present in Clang headers. We should
# reconsider this if we ever decide to support building builtins with
# other compilers.
"gcc_personality_v0.c",
]
if (target_os != "fuchsia") {
sources += [
"emutls.c ",
"enable_execute_stack.c",
"eprintf.c",
]
}
if (target_os != "fuchsia" && !compiler_rt_baremetal_build) {
sources += [
"clear_cache.c",
]
}
if (target_os == "mac") {
sources += [
"atomic_flag_clear.c",
"atomic_flag_clear_explicit.c",
"atomic_flag_test_and_set.c",
"atomic_flag_test_and_set_explicit.c",
"atomic_signal_fence.c",
"atomic_thread_fence.c",
]
}
if (target_cpu == "x86" || target_cpu == "x64") {
sources += [
"cpu_model.c",
"divxc3.c",
"fixunsxfdi.c",
"fixunsxfsi.c",
"fixunsxfti.c",
"fixxfdi.c",
"fixxfti.c",
"floatdixf.c",
"floattixf.c",
"floatundixf.c",
"floatuntixf.c",
"mulxc3.c",
"powixf2.c",
]
}
if (target_os == "x86") {
sources += [
"i386/ashldi3.S",
"i386/ashrdi3.S",
"i386/divdi3.S",
"i386/floatdidf.S",
"i386/floatdisf.S",
"i386/floatdixf.S",
"i386/floatundidf.S",
"i386/floatundisf.S",
"i386/floatundixf.S",
"i386/lshrdi3.S",
"i386/moddi3.S",
"i386/muldi3.S",
"i386/udivdi3.S",
"i386/umoddi3.S",
]
if (target_os == "win") {
sources += [
"i386/chkstk.S",
"i386/chkstk2.S",
]
}
} else if (target_cpu == "x64") {
sources += [
"x86_64/floatdidf.c",
"x86_64/floatdisf.c",
"x86_64/floatdixf.c",
"x86_64/floatundidf.S",
"x86_64/floatundisf.S",
"x86_64/floatundixf.S",
]
if (target_os == "win") {
sources += [
"x86_64/chkstk.S",
"x86_64/chkstk2.S",
]
}
}
if (target_cpu == "arm") {
sources += [
"arm/bswapdi2.S",
"arm/bswapsi2.S",
"arm/clzdi2.S",
"arm/clzsi2.S",
"arm/comparesf2.S",
"arm/divmodsi4.S",
"arm/divsi3.S",
"arm/modsi3.S",
"arm/sync_fetch_and_add_4.S",
"arm/sync_fetch_and_add_8.S",
"arm/sync_fetch_and_and_4.S",
"arm/sync_fetch_and_and_8.S",
"arm/sync_fetch_and_max_4.S",
"arm/sync_fetch_and_max_8.S",
"arm/sync_fetch_and_min_4.S",
"arm/sync_fetch_and_min_8.S",
"arm/sync_fetch_and_nand_4.S",
"arm/sync_fetch_and_nand_8.S",
"arm/sync_fetch_and_or_4.S",
"arm/sync_fetch_and_or_8.S",
"arm/sync_fetch_and_sub_4.S",
"arm/sync_fetch_and_sub_8.S",
"arm/sync_fetch_and_umax_4.S",
"arm/sync_fetch_and_umax_8.S",
"arm/sync_fetch_and_umin_4.S",
"arm/sync_fetch_and_umin_8.S",
"arm/sync_fetch_and_xor_4.S",
"arm/sync_fetch_and_xor_8.S",
"arm/udivmodsi4.S",
"arm/udivsi3.S",
"arm/umodsi3.S",
]
if (target_os == "mingw") {
sources += [
"arm/aeabi_idivmod.S",
"arm/aeabi_ldivmod.S",
"arm/aeabi_uidivmod.S",
"arm/aeabi_uldivmod.S",
"arm/chkstk.S",
"divdi3.c",
"divmoddi4.c",
"divmodsi4.c",
"divsi3.c",
"emutls.c",
"fixdfdi.c",
"fixsfdi.c",
"fixunsdfdi.c",
"fixunssfdi.c",
"floatdidf.c",
"floatdisf.c",
"floatundidf.c",
"floatundisf.c",
"mingw_fixfloat.c",
"moddi3.c",
"udivmoddi4.c",
"udivmodsi4.c",
"udivsi3.c",
"umoddi3.c",
]
}
}
if (target_cpu == "arm64") {
sources += [
"comparetf2.c",
"extenddftf2.c",
"extendsftf2.c",
"fixtfdi.c",
"fixtfsi.c",
"fixtfti.c",
"fixunstfdi.c",
"fixunstfsi.c",
"fixunstfti.c",
"floatditf.c",
"floatsitf.c",
"floattitf.c",
"floatunditf.c",
"floatunsitf.c",
"floatuntitf.c",
"multc3.c",
"trunctfdf2.c",
"trunctfsf2.c",
]
if (target_os == "mingw") {
sources += [
"aarch64/chkstk.S",
]
}
}
if (target_cpu == "hexagon") {
sources += [
"hexagon/common_entry_exit_abi1.S",
"hexagon/common_entry_exit_abi2.S",
"hexagon/common_entry_exit_legacy.S",
"hexagon/dfaddsub.S",
"hexagon/dfdiv.S",
"hexagon/dffma.S",
"hexagon/dfminmax.S",
"hexagon/dfmul.S",
"hexagon/dfsqrt.S",
"hexagon/divdi3.S",
"hexagon/divsi3.S",
"hexagon/fabs_opt.S",
"hexagon/fastmath2_dlib_asm.S",
"hexagon/fastmath2_ldlib_asm.S",
"hexagon/fastmath_dlib_asm.S",
"hexagon/fma_opt.S",
"hexagon/fmax_opt.S",
"hexagon/fmin_opt.S",
"hexagon/memcpy_forward_vp4cp4n2.S",
"hexagon/memcpy_likely_aligned.S",
"hexagon/moddi3.S",
"hexagon/modsi3.S",
"hexagon/sfdiv_opt.S",
"hexagon/sfsqrt_opt.S",
"hexagon/udivdi3.S",
"hexagon/udivmoddi4.S",
"hexagon/udivmodsi4.S",
"hexagon/udivsi3.S",
"hexagon/umoddi3.S",
"hexagon/umodsi3.S",
]
}
if (target_cpu == "ppc64") {
sources += [
"ppc/divtc3.c",
"ppc/fixtfdi.c",
"ppc/fixunstfdi.c",
"ppc/fixunstfti.c",
"ppc/floatditf.c",
"ppc/floattitf.c",
"ppc/floatunditf.c",
"ppc/gcc_qadd.c",
"ppc/gcc_qdiv.c",
"ppc/gcc_qmul.c",
"ppc/gcc_qsub.c",
"ppc/multc3.c",
]
}
if (target_cpu == "riscv") {
sources += [
"riscv/mulsi3.S",
]
}
if (!compiler_rt_exclude_atomic_builtin) {
sources += [
"atomic.c",
]
}
}
# Currently unused but necessary to make the sync_source_lists_from_cmake.py happy.
source_set("_unused") {
sources = [
# Thumb1
"arm/addsf3.S",
"arm/comparesf2.S",
"arm/divsi3.S",
"arm/udivsi3.S",
# EABI
"arm/aeabi_cdcmp.S",
"arm/aeabi_cdcmpeq_check_nan.c",
"arm/aeabi_cfcmp.S",
"arm/aeabi_cfcmpeq_check_nan.c",
"arm/aeabi_dcmp.S",
"arm/aeabi_div0.c",
"arm/aeabi_drsub.c",
"arm/aeabi_fcmp.S",
"arm/aeabi_frsub.c",
"arm/aeabi_idivmod.S",
"arm/aeabi_ldivmod.S",
"arm/aeabi_memcmp.S",
"arm/aeabi_memcpy.S",
"arm/aeabi_memmove.S",
"arm/aeabi_memset.S",
"arm/aeabi_uidivmod.S",
"arm/aeabi_uldivmod.S",
# Thumb1 JT
"arm/switch16.S",
"arm/switch32.S",
"arm/switch8.S",
"arm/switchu8.S",
# Thumb1 SjLj
"arm/restore_vfp_d8_d15_regs.S",
"arm/save_vfp_d8_d15_regs.S",
# Thumb1 VFPv2
"arm/adddf3vfp.S",
"arm/addsf3vfp.S",
"arm/divdf3vfp.S",
"arm/divsf3vfp.S",
"arm/eqdf2vfp.S",
"arm/eqsf2vfp.S",
"arm/extendsfdf2vfp.S",
"arm/fixdfsivfp.S",
"arm/fixsfsivfp.S",
"arm/fixunsdfsivfp.S",
"arm/fixunssfsivfp.S",
"arm/floatsidfvfp.S",
"arm/floatsisfvfp.S",
"arm/floatunssidfvfp.S",
"arm/floatunssisfvfp.S",
"arm/gedf2vfp.S",
"arm/gesf2vfp.S",
"arm/gtdf2vfp.S",
"arm/gtsf2vfp.S",
"arm/ledf2vfp.S",
"arm/lesf2vfp.S",
"arm/ltdf2vfp.S",
"arm/ltsf2vfp.S",
"arm/muldf3vfp.S",
"arm/mulsf3vfp.S",
"arm/nedf2vfp.S",
"arm/negdf2vfp.S",
"arm/negsf2vfp.S",
"arm/nesf2vfp.S",
"arm/subdf3vfp.S",
"arm/subsf3vfp.S",
"arm/truncdfsf2vfp.S",
"arm/unorddf2vfp.S",
"arm/unordsf2vfp.S",
# Thumb1 icache
"arm/sync_synchronize.S",
]
}