150472Speter# $FreeBSD$ 2207995Sobrien 3169718SkanGCCDIR= ${.CURDIR}/../../../contrib/gcc 4169718SkanGCCLIB= ${.CURDIR}/../../../contrib/gcclibs 51823Sphk 6169718SkanSHLIB_NAME= libgcc_s.so.1 7169718SkanSHLIBDIR?= /lib 8169718Skan 9156854Sru.include <bsd.own.mk> 10195697Skan# 11195697Skan# libgcc is linked in last and thus cannot depend on ssp symbols coming 12195697Skan# from earlier libraries. Disable stack protection for this library. 13195697Skan# 14195697SkanMK_SSP= no 15195697Skan 1696456Sobrien.include "${.CURDIR}/../../usr.bin/cc/Makefile.tgt" 1745299Sobrien 18245539Sandrew.if ${TARGET_CPUARCH} == "arm" && ${MK_ARM_EABI} != "no" 19245539SandrewCFLAGS+= -DTARGET_ARM_EABI 20245539Sandrew.endif 21245539Sandrew 22169718Skan.PATH: ${GCCDIR}/config/${GCC_CPU} ${GCCDIR}/config ${GCCDIR} 2345171Sobrien 24169718SkanCFLAGS+= -DIN_GCC -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED \ 25169718Skan -DHAVE_GTHR_DEFAULT \ 26169718Skan -I${GCCLIB}/include \ 27169718Skan -I${GCCDIR}/config -I${GCCDIR} -I. \ 28169718Skan -I${.CURDIR}/../../usr.bin/cc/cc_tools 2918441Speter 30169718SkanLDFLAGS+= -nodefaultlibs 31271125SngieDPADD+= ${LIBC} 32195152SkanLDADD+= -lc 3396340Sobrien 34215082SimpOBJS= # added to below in various ways depending on TARGET_CPUARCH 3596784Sobrien 3696340Sobrien#--------------------------------------------------------------------------- 3796340Sobrien# 38260998Spfg# Library members defined in libgcc2.c. 39260998Spfg# When upgrading GCC, obtain the following list from mklibgcc.in 4096340Sobrien# 41169718SkanLIB2FUNCS= _muldi3 _negdi2 _lshrdi3 _ashldi3 _ashrdi3 \ 42244382Sandrew _cmpdi2 _ucmpdi2 \ 43132751Skan _enable_execute_stack _trampoline __main _absvsi2 _absvdi2 _addvsi3 \ 44132751Skan _addvdi3 _subvsi3 _subvdi3 _mulvsi3 _mulvdi3 _negvsi2 _negvdi2 _ctors \ 45132751Skan _ffssi2 _ffsdi2 _clz _clzsi2 _clzdi2 _ctzsi2 _ctzdi2 _popcount_tab \ 46169718Skan _popcountsi2 _popcountdi2 _paritysi2 _paritydi2 _powisf2 _powidf2 \ 47169718Skan _powixf2 _powitf2 _mulsc3 _muldc3 _mulxc3 _multc3 _divsc3 _divdc3 \ 48260998Spfg _divxc3 _divtc3 _bswapsi2 _bswapdi2 49244382Sandrew.if ${COMPILER_TYPE} != "clang" || ${TARGET_CPUARCH} != "arm" 50244382SandrewLIB2FUNCS+= _clear_cache 51244382Sandrew.endif 5218390Speter 53169718Skan# The floating-point conversion routines that involve a single-word integer. 54169718Skan.for mode in sf df xf 55169718SkanLIB2FUNCS+= _fixuns${mode}si 56169718Skan.endfor 57169718Skan 58169718Skan# Likewise double-word routines. 59245539Sandrew.if ${TARGET_CPUARCH} != "arm" || ${MK_ARM_EABI} == "no" 60245539Sandrew# These are implemented in an ARM specific file but will not be filtered out 61169718Skan.for mode in sf df xf tf 62169718SkanLIB2FUNCS+= _fix${mode}di _fixuns${mode}di 63169718SkanLIB2FUNCS+= _floatdi${mode} _floatundi${mode} 64169718Skan.endfor 65245539Sandrew.endif 66169718Skan 67169718SkanLIB2ADD = $(LIB2FUNCS_EXTRA) 68169718SkanLIB2ADD_ST = $(LIB2FUNCS_STATIC_EXTRA) 69169718Skan 70169718Skan# Additional sources to handle exceptions; overridden by targets as needed. 71169718SkanLIB2ADDEH = unwind-dw2.c unwind-dw2-fde-glibc.c unwind-sjlj.c gthr-gnat.c \ 72169718Skan unwind-c.c 73169718SkanLIB2ADDEHSTATIC = $(LIB2ADDEH) 74169718SkanLIB2ADDEHSHARED = $(LIB2ADDEH) 75169718Skan 76169718Skan# List of extra C and assembler files to add to static and shared libgcc2. 77169718Skan# Assembler files should have names ending in `.asm'. 78169718SkanLIB2FUNCS_EXTRA = 79169718Skan 80169718Skan# List of extra C and assembler files to add to static libgcc2. 81169718Skan# Assembler files should have names ending in `.asm'. 82169718SkanLIB2FUNCS_STATIC_EXTRA = 83169718Skan 8496340Sobrien# Defined in libgcc2.c, included only in the static library. 85169718Skan# KAN: Excluded _sf_to_tf and _df_to_tf as TPBIT_FUNCS are not 86169718Skan# built on any of our platforms. 87132751SkanLIB2FUNCS_ST = _eprintf __gcc_bcmp 8845299Sobrien 8996340SobrienFPBIT_FUNCS = _pack_sf _unpack_sf _addsub_sf _mul_sf _div_sf \ 9096340Sobrien _fpcmp_parts_sf _compare_sf _eq_sf _ne_sf _gt_sf _ge_sf \ 9196340Sobrien _lt_sf _le_sf _unord_sf _si_to_sf _sf_to_si _negate_sf _make_sf \ 92169718Skan _sf_to_df _thenan_sf _sf_to_usi _usi_to_sf 9345299Sobrien 9496340SobrienDPBIT_FUNCS = _pack_df _unpack_df _addsub_df _mul_df _div_df \ 9596340Sobrien _fpcmp_parts_df _compare_df _eq_df _ne_df _gt_df _ge_df \ 9696340Sobrien _lt_df _le_df _unord_df _si_to_df _df_to_si _negate_df _make_df \ 97169718Skan _df_to_sf _thenan_df _df_to_usi _usi_to_df 9845299Sobrien 99132751SkanTPBIT_FUNCS = _pack_tf _unpack_tf _addsub_tf _mul_tf _div_tf \ 100132751Skan _fpcmp_parts_tf _compare_tf _eq_tf _ne_tf _gt_tf _ge_tf \ 101132751Skan _lt_tf _le_tf _unord_tf _si_to_tf _tf_to_si _negate_tf _make_tf \ 102132751Skan _tf_to_df _tf_to_sf _thenan_tf _tf_to_usi _usi_to_tf 103132751Skan 10496340Sobrien# These might cause a divide overflow trap and so are compiled with 10596340Sobrien# unwinder info. 10696340SobrienLIB2_DIVMOD_FUNCS = _divdi3 _moddi3 _udivdi3 _umoddi3 _udiv_w_sdiv _udivmoddi4 10718609Speter 10896340Sobrien#----------------------------------------------------------------------- 10996340Sobrien# 11096340Sobrien# Platform specific bits. 111169718Skan# When upgrading GCC, get the following definitions from config/<cpu>/t-* 11296340Sobrien# 113215082Simp.if ${TARGET_CPUARCH} == "arm" 11496340Sobrien# from config/arm/t-strongarm-elf 115132751SkanCFLAGS+= -Dinhibit_libc -fno-inline 116260096SdimCFLAGS.clang+= -fheinous-gnu-extensions 117244382Sandrew 118132751SkanLIB1ASMSRC = lib1funcs.asm 119169718SkanLIB1ASMFUNCS = _dvmd_tls _bb_init_func 120245539Sandrew.if ${MK_ARM_EABI} != "no" 121245539SandrewLIB2ADDEH = unwind-arm.c libunwind.S pr-support.c unwind-c.c 122248401Sandrew# Some compilers generate __aeabi_ functions libgcc_s is missing 123248401SandrewDPADD+= ${LIBGCC} 124248401SandrewLDADD+= -lgcc 125245539Sandrew.else 126169718SkanLIB2FUNCS_EXTRA = floatunsidf.c floatunsisf.c 12745306Sobrien.endif 128245539Sandrew.endif 12934814Sbde 130217123Simp.if ${TARGET_CPUARCH} == mips 131201852SimpLIB2FUNCS_EXTRA = floatunsidf.c floatunsisf.c 132217942Sjchandra# ABIs other than o32 need this 133233644Sjmallett.if ${TARGET_ARCH} != "mips" && ${TARGET_ARCH} != "mipsel" 134208737SjmallettLIB2FUNCS_EXTRA+= floatdidf.c fixunsdfsi.c 135208737SjmallettLIB2FUNCS_EXTRA+= floatdisf.c floatundidf.c 136208737SjmallettLIB2FUNCS_EXTRA+= fixsfdi.c floatundisf.c 137208737SjmallettLIB2FUNCS_EXTRA+= fixdfdi.c fixunssfsi.c 138201852Simp.endif 139208737Sjmallett.endif 140201852Simp 141215082Simp.if ${TARGET_CPUARCH} == "ia64" 14296340Sobrien# from config/ia64/t-ia64 143169718SkanLIB1ASMSRC = lib1funcs.asm 144169718SkanLIB1ASMFUNCS = __divxf3 __divdf3 __divsf3 \ 145169718Skan __divdi3 __moddi3 __udivdi3 __umoddi3 \ 146169718Skan __divsi3 __modsi3 __udivsi3 __umodsi3 __save_stack_nonlocal \ 147169718Skan __nonlocal_goto __restore_stack_nonlocal __trampoline \ 148169718Skan _fixtfdi _fixunstfdi _floatditf 149169718SkanLIB2ADDEH = unwind-ia64.c unwind-sjlj.c unwind-c.c 15096340Sobrien.endif 15134814Sbde 152215275Simp.if ${TARGET_ARCH} == "powerpc" 15396340Sobrien# from config/rs6000/t-ppccomm 154176530SrajLIB2FUNCS_EXTRA = tramp.asm 15596779SobrienLIB2FUNCS_STATIC_EXTRA = eabi.asm 15696340Sobrien.endif 1571823Sphk 158215275Simp.if ${TARGET_ARCH} == "powerpc64" 159209867Snwhitehorn# from config/rs6000/t-ppccomm 160209867SnwhitehornLIB2FUNCS_EXTRA = tramp.asm 161209867Snwhitehorn.endif 162209867Snwhitehorn 163215082Simp.if ${TARGET_CPUARCH} == "sparc64" 16496340Sobrien# from config/sparc/t-elf 165169718SkanLIB1ASMSRC = lb1spc.asm 16696340SobrienLIB1ASMFUNCS = _mulsi3 _divsi3 _modsi3 16796340Sobrien.endif 1681823Sphk 16996340Sobrien#----------------------------------------------------------------------- 17096340Sobrien 17196449Sobrien# Remove any objects from LIB2FUNCS and LIB2_DIVMOD_FUNCS that are 17296449Sobrien# defined as optimized assembly code in LIB1ASMFUNCS. 17396449Sobrien.if defined(LIB1ASMFUNCS) 17496449Sobrien.for sym in ${LIB1ASMFUNCS} 175133103SkanLIB2FUNCS:= ${LIB2FUNCS:S/${sym}//g} 17696449SobrienLIB2_DIVMOD_FUNCS:= ${LIB2_DIVMOD_FUNCS:S/${sym}//g} 17796449Sobrien.endfor 17896449Sobrien.endif 17996449Sobrien 180169718SkanCOMMONHDRS= tm.h tconfig.h options.h unwind.h gthr-default.h 18196456Sobrien 182169718Skan#----------------------------------------------------------------------- 183169718Skan# 184169718Skan# Helpful shortcuts for compiler invocations. 185169718Skan# 186169718SkanHIDE = -fvisibility=hidden -DHIDE_EXPORTS 187169718SkanCC_T = ${CC} -c ${CFLAGS} ${HIDE} -fPIC 188169718SkanCC_P = ${CC} -c ${CFLAGS} ${HIDE} -p -fPIC 189169718SkanCC_S = ${CC} -c ${CFLAGS} ${PICFLAG} -DSHARED 19096449Sobrien 191169718Skan#----------------------------------------------------------------------- 192169718Skan# 193169718Skan# Functions from libgcc2.c 194169718Skan# 195169718SkanSTD_CFLAGS = 196169718SkanDIV_CFLAGS = -fexceptions -fnon-call-exceptions 19796340Sobrien 198169718SkanSTD_FUNCS = ${LIB2FUNCS} 199169718SkanDIV_FUNCS = ${LIB2_DIVMOD_FUNCS} 20096340Sobrien 201169718SkanSTD_CFILE = libgcc2.c 202169718SkanDIV_CFILE = libgcc2.c 20396340Sobrien 204169718SkanOBJ_GRPS = STD DIV 20545299Sobrien 206169718Skan#----------------------------------------------------------------------- 207169718Skan# 208169718Skan# Floating point emulation functions 209169718Skan# 210215082Simp.if ${TARGET_CPUARCH} == "armNOT_YET" || \ 211215082Simp ${TARGET_CPUARCH} == "powerpc" || ${TARGET_CPUARCH} == "sparc64" 212169718Skan 213169718SkanFPBIT_CFLAGS = -DFINE_GRAINED_LIBRARIES -DFLOAT 214169718SkanDPBIT_CFLAGS = -DFINE_GRAINED_LIBRARIES 215169718Skan 216169718SkanFPBIT_CFILE = config/fp-bit.c 217169718SkanDPBIT_CFILE = config/fp-bit.c 218169718Skan 219169718SkanOBJ_GRPS += FPBIT DPBIT 2201823Sphk.endif 2211823Sphk 222169718Skan#----------------------------------------------------------------------- 223169718Skan# 224169718Skan# Generic build rules for object groups defined above 225169718Skan# 226169718Skan.for T in ${OBJ_GRPS} 227169718Skan${T}_OBJS_T = ${${T}_FUNCS:S/$/.o/} 228169718Skan${T}_OBJS_P = ${${T}_FUNCS:S/$/.po/} 229169718Skan${T}_OBJS_S = ${${T}_FUNCS:S/$/.So/} 230169718SkanOBJS += ${${T}_FUNCS:S/$/.o/} 231169718Skan 232169718Skan${${T}_OBJS_T}: ${${T}_CFILE} ${COMMONHDRS} 233169718Skan ${CC_T} ${${T}_CFLAGS} -DL${.PREFIX} -o ${.TARGET} ${.ALLSRC:M*.c} 234169718Skan${${T}_OBJS_P}: ${${T}_CFILE} ${COMMONHDRS} 235169718Skan ${CC_P} ${${T}_CFLAGS} -DL${.PREFIX} -o ${.TARGET} ${.ALLSRC:M*.c} 236169718Skan${${T}_OBJS_S}: ${${T}_CFILE} ${COMMONHDRS} 237169718Skan ${CC_S} ${${T}_CFLAGS} -DL${.PREFIX} -o ${.TARGET} ${.ALLSRC:M*.c} 238169718Skan.endfor 239169718Skan 240169718Skan#----------------------------------------------------------------------- 241169718Skan# 242169718Skan# Extra objects coming from separate files 243169718Skan# 244169718Skan.if !empty(LIB2ADD) 245169718SkanOBJS += ${LIB2ADD:R:S/$/.o/} 246169718SkanSOBJS += ${LIB2ADD:R:S/$/.So/} 247169718SkanPOBJS += ${LIB2ADD:R:S/$/.po/} 2481823Sphk.endif 2491823Sphk 250169718Skan#----------------------------------------------------------------------- 251169718Skan# 252169718Skan# Objects that should be in static library only. 253169718Skan# 254171846SkanSYMS_ST = ${LIB2FUNCS_ST} ${LIB2ADD_ST} 255169718SkanSTAT_OBJS_T = ${SYMS_ST:S/$/.o/} 256169718SkanSTAT_OBJS_P = ${SYMS_ST:S/$/.po/} 257169718SkanSTATICOBJS = ${SYMS_ST:S/$/.o/} 258169718Skan 259169718Skan${STAT_OBJS_T}: ${STD_CFILE} ${COMMONHDRS} 260169718Skan ${CC_T} -DL${.PREFIX} -o ${.TARGET} ${.ALLSRC:M*.c} 261169718Skan${STAT_OBJS_P}: ${STD_CFILE} ${COMMONHDRS} 262169718Skan ${CC_P} -DL${.PREFIX} -o ${.TARGET} ${.ALLSRC:M*.c} 263169718Skan 264169718Skan#----------------------------------------------------------------------- 265169718Skan# 266169718Skan# Assembler files. 267169718Skan# 26896456Sobrien.if defined(LIB1ASMSRC) 269169718SkanASM_T = ${LIB1ASMFUNCS:S/$/.o/} 270169718SkanASM_P = ${LIB1ASMFUNCS:S/$/.po/} 271169718SkanASM_S = ${LIB1ASMFUNCS:S/$/.So/} 272169718SkanASM_V = ${LIB1ASMFUNCS:S/$/.vis/} 273169718SkanOBJS += ${LIB1ASMFUNCS:S/$/.o/} 274169718Skan 275169718Skan${ASM_T}: ${LIB1ASMSRC} ${.PREFIX}.vis 276169718Skan ${CC} -x assembler-with-cpp -c ${CFLAGS} -DL${.PREFIX} \ 277169718Skan -o ${.TARGET} -include ${.PREFIX}.vis ${.ALLSRC:N*.h:N*.vis} 278169718Skan${ASM_P}: ${LIB1ASMSRC} ${.PREFIX}.vis 279169718Skan ${CC} -x assembler-with-cpp -p -c ${CFLAGS} -DL${.PREFIX} \ 280169718Skan -o ${.TARGET} -include ${.PREFIX}.vis ${.ALLSRC:N*.h:N*.vis} 281169718Skan${ASM_S}: ${LIB1ASMSRC} 282169718Skan ${CC} -x assembler-with-cpp -c ${PICFLAG} ${CFLAGS} -DL${.PREFIX} \ 28396850Sobrien -o ${.TARGET} ${.ALLSRC:N*.h} 284169718Skan${ASM_V}: ${LIB1ASMSRC} 285169718Skan ${CC} -x assembler-with-cpp -c ${CFLAGS} -DL${.PREFIX} \ 286169718Skan -o ${.PREFIX}.vo ${.ALLSRC:N*.h} 287234546Simp ( ${NM} -pg ${.PREFIX}.vo | \ 288169718Skan awk 'NF == 3 && $$2 !~ /^[UN]$$/ { print "\t.hidden ", $$3 }'\ 289169718Skan ) > ${.TARGET} 29096456Sobrien 291169718SkanCLEANFILES += ${ASM_V} ${ASM_V:R:S/$/.vo/} 29296456Sobrien.endif 29396456Sobrien 294169718Skan#----------------------------------------------------------------------- 295169718Skan# 296169718Skan# Exception handling / unwinding support. 297169718Skan# 298169718SkanEH_OBJS_T = ${LIB2ADDEHSTATIC:R:S/$/.o/} 299169718SkanEH_OBJS_P = ${LIB2ADDEHSTATIC:R:S/$/.po/} 300169718SkanEH_OBJS_S = ${LIB2ADDEHSHARED:R:S/$/.So/} 301169718SkanEH_CFLAGS = -fexceptions -D__GLIBC__=3 -DElfW=__ElfN 302169718SkanSOBJS += ${EH_OBJS_S} 303169718Skan 304169718Skan.for _src in ${LIB2ADDEHSTATIC} 305169718Skan${_src:R:S/$/.o/}: ${_src} ${COMMONHDRS} 306169718Skan ${CC_T} ${EH_CFLAGS} -o ${.TARGET} ${.IMPSRC} 307169718Skan${_src:R:S/$/.po/}: ${_src} ${COMMONHDRS} 308169718Skan ${CC_P} ${EH_CFLAGS} -o ${.TARGET} ${.IMPSRC} 309169718Skan.endfor 310169718Skan.for _src in ${LIB2ADDEHSHARED} 311169718Skan${_src:R:S/$/.So/}: ${_src} ${COMMONHDRS} 312169718Skan ${CC_S} ${EH_CFLAGS} -o ${.TARGET} ${.IMPSRC} 313169718Skan.endfor 314169718Skan 315169718Skan 316169718Skan#----------------------------------------------------------------------- 317169718Skan# 318169718Skan# Generated headers 319169718Skan# 320169718Skan${COMMONHDRS}: ${.CURDIR}/../../usr.bin/cc/cc_tools/Makefile 321169718Skan ${MAKE} -f ${.ALLSRC} MFILE=${.ALLSRC} GCCDIR=${GCCDIR} ${.TARGET} 322169718Skan 323169718SkanCLEANFILES += ${COMMONHDRS} 324169718SkanCLEANFILES += cs-*.h option* 325169718Skan 326169718Skan#----------------------------------------------------------------------- 327169718Skan# 328200499Skan# Build symbol version map 329169718Skan# 330169718SkanSHLIB_MKMAP = ${GCCDIR}/mkmap-symver.awk 331169718SkanSHLIB_MKMAP_OPTS = 332169718SkanSHLIB_MAPFILES = ${GCCDIR}/libgcc-std.ver 333245539Sandrew.if ${TARGET_CPUARCH} == "arm" && ${MK_ARM_EABI} != "no" 334245539SandrewSHLIB_MAPFILES += ${GCCDIR}/config/arm/libgcc-bpabi.ver 335245539Sandrew.endif 336169718SkanVERSION_MAP = libgcc.map 337169718Skan 338169718Skanlibgcc.map: ${SHLIB_MKMAP} ${SHLIB_MAPFILES} ${SOBJS} ${OBJS:R:S/$/.So/} 339234546Simp ( ${NM} -pg ${SOBJS};echo %% ; \ 340169718Skan cat ${SHLIB_MAPFILES} \ 341169718Skan | sed -e '/^[ ]*#/d' \ 342169718Skan -e 's/^%\(if\|else\|elif\|endif\|define\)/#\1/' \ 343169718Skan | ${CC} ${CFLAGS} -E -xassembler-with-cpp -; \ 344169718Skan ) | awk -f ${SHLIB_MKMAP} ${SHLIB_MKMAP_OPTS} > ${.TARGET} 345169718Skan 346169718SkanCLEANFILES += libgcc.map 347169718Skan 348169718Skan#----------------------------------------------------------------------- 349169718Skan# 350200499Skan# Build additional static libgcc_eh[_p].a libraries. 351169718Skan# 352215126Sedlibgcc_eh.a: ${EH_OBJS_T} 353215126Sed @${ECHO} building static gcc_eh library 354169718Skan @rm -f ${.TARGET} 355243933Seadler @${AR} ${ARFLAGS} ${.TARGET} `lorder ${EH_OBJS_T} | tsort -q` 356270484Sdes ${RANLIB} ${RANLIBFLAGS} ${.TARGET} 357169718Skan 358215126Sedall: libgcc_eh.a 359169718Skan 360156854Sru.if ${MK_PROFILE} != "no" 361215126Sedlibgcc_eh_p.a: ${EH_OBJS_P} 362215126Sed @${ECHO} building profiled gcc_eh library 363169718Skan @rm -f ${.TARGET} 364243933Seadler @${AR} ${ARFLAGS} ${.TARGET} `lorder ${EH_OBJS_P} | tsort -q` 365270484Sdes ${RANLIB} ${RANLIBFLAGS} ${.TARGET} 366215126Sedall: libgcc_eh_p.a 36796456Sobrien.endif 368169718Skan 369169718Skan_libinstall: _lib-eh-install 370169718Skan 371169718Skan_lib-eh-install: 372188583Sjkim.if ${MK_INSTALLLIB} != "no" 373169718Skan ${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 374215126Sed ${_INSTALLFLAGS} libgcc_eh.a ${DESTDIR}${LIBDIR} 375188583Sjkim.endif 376169718Skan.if ${MK_PROFILE} != "no" 377169718Skan ${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 378215126Sed ${_INSTALLFLAGS} libgcc_eh_p.a ${DESTDIR}${LIBDIR} 37996456Sobrien.endif 38096456Sobrien 381215126SedCLEANFILES+= libgcc_eh.a libgcc_eh_p.a ${EH_OBJS_T} ${EH_OBJS_P} 382169718Skan 3831823Sphk.include <bsd.lib.mk> 384169718Skan 385169718Skan.SUFFIXES: .vis .vo 386