# $OpenBSD: Makefile,v 1.8 2024/02/06 05:07:28 jca Exp $

.include <bsd.own.mk>

.if ${COMPILER_VERSION:L} != "clang"
CC=		clang
CXX=		clang++
.endif

.if ${BUILD_CLANG:L} == "yes"

LIB=	compiler_rt
NOPIC=
NOPROFILE=

CFLAGS+=	-fPIC -std=gnu99 -fvisibility=hidden -fno-stack-protector
CPPFLAGS+=	-I${.CURDIR}/../../llvm/compiler-rt/lib/builtins
CPPFLAGS+=	-DVISIBILITY_HIDDEN

.if ${MACHINE_ARCH} == "amd64"
RTARCH=	x86_64
.elif ${MACHINE_ARCH} == "powerpc"
RTARCH=	ppc
.elif ${MACHINE_ARCH} == "riscv64"
RTARCH=	riscv
.else
RTARCH=	${MACHINE_ARCH}
.endif

.PATH: ${.CURDIR}/../../llvm/compiler-rt/lib/builtins/${RTARCH}
.PATH: ${.CURDIR}/../../llvm/compiler-rt/lib/builtins

GEN_SRCS=	absvdi2 \
		absvsi2 \
		absvti2 \
		addtf3 \
		addvdi3 \
		addvsi3 \
		addvti3 \
		apple_versioning \
		ashldi3 \
		ashlti3 \
		ashrdi3 \
		ashrti3 \
		atomic \
		bswapdi2 \
		bswapsi2 \
		clear_cache \
		clzdi2 \
		clzsi2 \
		clzti2 \
		cmpdi2 \
		cmpti2 \
		comparedf2 \
		comparesf2 \
		cpu_model \
		ctzdi2 \
		ctzsi2 \
		ctzti2 \
		divdc3 \
		divdi3 \
		divmoddi4 \
		divmodsi4 \
		divsc3 \
		divtc3 \
		divti3 \
		divtf3 \
		divxc3 \
		emutls \
		enable_execute_stack \
		eprintf \
		extendhfsf2 \
		ffsdi2 \
		ffssi2 \
		ffsti2 \
		fixdfti \
		fixsfti \
		fixunsdfsi \
		fixunsdfti \
		fixunssfsi \
		fixunssfti \
		fixunsxfdi \
		fixunsxfsi \
		fixunsxfti \
		fixxfdi \
		fixxfti \
		floattidf \
		floattisf \
		floattixf \
		floatunsidf \
		floatunsisf \
		floatuntidf \
		floatuntisf \
		floatuntixf \
		fp_mode \
		gcc_personality_v0 \
		int_util \
		lshrdi3 \
		lshrti3 \
		moddi3 \
		modsi3 \
		modti3 \
		muldc3 \
		muldi3 \
		mulodi4 \
		mulosi4 \
		muloti4 \
		mulsc3 \
		multi3 \
		multf3 \
		mulvdi3 \
		mulvsi3 \
		mulvti3 \
		mulxc3 \
		negdf2 \
		negdi2 \
		negsf2 \
		negti2 \
		negvdi2 \
		negvsi2 \
		negvti2 \
		paritydi2 \
		paritysi2 \
		parityti2 \
		popcountdi2 \
		popcountsi2 \
		popcountti2 \
		powidf2 \
		powisf2 \
		powitf2 \
		powixf2 \
		subvdi3 \
		subvsi3 \
		subvti3 \
		subtf3 \
		trampoline_setup \
		truncdfhf2 \
		truncsfhf2 \
		ucmpdi2 \
		ucmpti2 \
		udivdi3 \
		udivmoddi4 \
		udivmodsi4 \
		udivmodti4 \
		udivti3 \
		umoddi3 \
		umodsi3 \
		umodti3

.if ${RTARCH} != "arm"
GEN_SRCS+=	adddf3 \
		addsf3 \
		divdf3 \
		divsf3 \
		divsi3 \
		extendsfdf2 \
		fixdfdi \
		fixdfsi \
		fixsfdi \
		fixsfsi \
		fixunsdfdi \
		fixunssfdi \
		floatsidf \
		floatsisf \
		muldf3 \
		mulsf3 \
		subdf3 \
		subsf3 \
		truncdfsf2 \
		udivsi3
.endif

.if ${RTARCH} == "i386"
SRCS+=	floatdidf.c \
	floatdisf.c \
	floatdixf.c \
	floatundidf.c \
	floatundisf.c \
	floatundixf.c
.else
GEN_SRCS+=	floatdidf \
		floatdisf \
		floatdixf \
		floatundidf \
		floatundisf \
		floatundixf
.endif

.for file in ${GEN_SRCS}
.	if exists(${.CURDIR}/../../llvm/compiler-rt/lib/builtins/${RTARCH}/${file}.S)
SRCS+=	${file}.S
.	else
SRCS+=	${file}.c
.	endif
.endfor

.if ${RTARCH} == "aarch64"
SRCS+=	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

# Prepare multiple versions of the LSE-helper
CPPFLAGS+=-DHAS_ASM_LSE
.for pat in cas swp ldadd ldclr ldeor ldset
.  for size in 1 2 4 8 16
.    for model in 1 2 3 4
.      if "${pat}" == "cas" || "${size}" != "16"
outline_atomic_${pat}${size}_${model}.S: Makefile ${.CURDIR}/../../llvm/compiler-rt/lib/builtins/${RTARCH}/lse.S
	@echo "#define L_${pat}\n#define SIZE ${size}\n#define MODEL ${model}\n" > $@.tmp
	@cat ${.CURDIR}/../../llvm/compiler-rt/lib/builtins/${RTARCH}/lse.S >> $@.tmp
	@mv $@.tmp $@

SRCS+=	outline_atomic_${pat}${size}_${model}.S
.      endif
.    endfor
.  endfor
.endfor

.endif

.if ${RTARCH} == "arm"
SRCS+=	aeabi_cdcmp.S \
	aeabi_cdcmpeq_check_nan.c \
	aeabi_cfcmp.S \
	aeabi_cfcmpeq_check_nan.c \
	aeabi_dcmp.S \
	aeabi_div0.c \
	aeabi_drsub.c \
	aeabi_fcmp.S \
	aeabi_frsub.c \
	aeabi_ldivmod.S \
	aeabi_memcmp.S \
	aeabi_memcpy.S \
	aeabi_memmove.S \
	aeabi_memset.S \
	aeabi_uldivmod.S \
	switch16.S \
	switch32.S \
	switch8.S \
	switchu8.S \
	sync_fetch_and_add_4.S \
	sync_fetch_and_add_8.S \
	sync_fetch_and_and_4.S \
	sync_fetch_and_and_8.S \
	sync_fetch_and_max_4.S \
	sync_fetch_and_max_8.S \
	sync_fetch_and_min_4.S \
	sync_fetch_and_min_8.S \
	sync_fetch_and_nand_4.S \
	sync_fetch_and_nand_8.S \
	sync_fetch_and_or_4.S \
	sync_fetch_and_or_8.S \
	sync_fetch_and_sub_4.S \
	sync_fetch_and_sub_8.S \
	sync_fetch_and_umax_4.S \
	sync_fetch_and_umax_8.S \
	sync_fetch_and_umin_4.S \
	sync_fetch_and_umin_8.S \
	sync_fetch_and_xor_4.S \
	sync_fetch_and_xor_8.S \
	sync_synchronize.S
.endif

.if ${RTARCH} == "mips64" || ${RTARCH} == "mips64el"
SRCS+=	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
.endif

.if ${RTARCH} == "ppc"
# Omit "double-double" functions since long double is the same as
# double on OpenBSD.
SRCS+=	atomic_lock_free.c
.endif

.if ${RTARCH} == "riscv"
SRCS+=	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 \
	restore.S \
	save.S \
	trunctfdf2.c \
	trunctfsf2.c
.endif

.if ${RTARCH} == "sparc64"
SRCS+=	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
.endif

.include <bsd.lib.mk>

.else
NOPROG=
.include <bsd.prog.mk>
.endif
