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 18236014Smarius.if ${TARGET_CPUARCH} == "mips" 19215185SedLIB= gcc 20215185Sed.endif 21215185Sed 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 31195152SkanLDADD+= -lc 3296340Sobrien 33215082SimpOBJS= # added to below in various ways depending on TARGET_CPUARCH 3496784Sobrien 3596340Sobrien#--------------------------------------------------------------------------- 3696340Sobrien# 3796340Sobrien# When upgrading GCC, get the following defintions straight from Makefile.in 3896340Sobrien# 3918609Speter# Library members defined in libgcc2.c. 40169718SkanLIB2FUNCS= _muldi3 _negdi2 _lshrdi3 _ashldi3 _ashrdi3 \ 41169718Skan _cmpdi2 _ucmpdi2 _clear_cache \ 42132751Skan _enable_execute_stack _trampoline __main _absvsi2 _absvdi2 _addvsi3 \ 43132751Skan _addvdi3 _subvsi3 _subvdi3 _mulvsi3 _mulvdi3 _negvsi2 _negvdi2 _ctors \ 44132751Skan _ffssi2 _ffsdi2 _clz _clzsi2 _clzdi2 _ctzsi2 _ctzdi2 _popcount_tab \ 45169718Skan _popcountsi2 _popcountdi2 _paritysi2 _paritydi2 _powisf2 _powidf2 \ 46169718Skan _powixf2 _powitf2 _mulsc3 _muldc3 _mulxc3 _multc3 _divsc3 _divdc3 \ 47169718Skan _divxc3 _divtc3 4818390Speter 49169718Skan# The floating-point conversion routines that involve a single-word integer. 50169718Skan.for mode in sf df xf 51169718SkanLIB2FUNCS+= _fixuns${mode}si 52169718Skan.endfor 53169718Skan 54169718Skan# Likewise double-word routines. 55169718Skan.for mode in sf df xf tf 56169718SkanLIB2FUNCS+= _fix${mode}di _fixuns${mode}di 57169718SkanLIB2FUNCS+= _floatdi${mode} _floatundi${mode} 58169718Skan.endfor 59169718Skan 60169718SkanLIB2ADD = $(LIB2FUNCS_EXTRA) 61169718SkanLIB2ADD_ST = $(LIB2FUNCS_STATIC_EXTRA) 62169718Skan 63169718Skan# Additional sources to handle exceptions; overridden by targets as needed. 64169718SkanLIB2ADDEH = unwind-dw2.c unwind-dw2-fde-glibc.c unwind-sjlj.c gthr-gnat.c \ 65169718Skan unwind-c.c 66169718SkanLIB2ADDEHSTATIC = $(LIB2ADDEH) 67169718SkanLIB2ADDEHSHARED = $(LIB2ADDEH) 68169718Skan 69169718Skan# List of extra C and assembler files to add to static and shared libgcc2. 70169718Skan# Assembler files should have names ending in `.asm'. 71169718SkanLIB2FUNCS_EXTRA = 72169718Skan 73169718Skan# List of extra C and assembler files to add to static libgcc2. 74169718Skan# Assembler files should have names ending in `.asm'. 75169718SkanLIB2FUNCS_STATIC_EXTRA = 76169718Skan 7796340Sobrien# Defined in libgcc2.c, included only in the static library. 78169718Skan# KAN: Excluded _sf_to_tf and _df_to_tf as TPBIT_FUNCS are not 79169718Skan# built on any of our platforms. 80132751SkanLIB2FUNCS_ST = _eprintf __gcc_bcmp 8145299Sobrien 8296340SobrienFPBIT_FUNCS = _pack_sf _unpack_sf _addsub_sf _mul_sf _div_sf \ 8396340Sobrien _fpcmp_parts_sf _compare_sf _eq_sf _ne_sf _gt_sf _ge_sf \ 8496340Sobrien _lt_sf _le_sf _unord_sf _si_to_sf _sf_to_si _negate_sf _make_sf \ 85169718Skan _sf_to_df _thenan_sf _sf_to_usi _usi_to_sf 8645299Sobrien 8796340SobrienDPBIT_FUNCS = _pack_df _unpack_df _addsub_df _mul_df _div_df \ 8896340Sobrien _fpcmp_parts_df _compare_df _eq_df _ne_df _gt_df _ge_df \ 8996340Sobrien _lt_df _le_df _unord_df _si_to_df _df_to_si _negate_df _make_df \ 90169718Skan _df_to_sf _thenan_df _df_to_usi _usi_to_df 9145299Sobrien 92132751SkanTPBIT_FUNCS = _pack_tf _unpack_tf _addsub_tf _mul_tf _div_tf \ 93132751Skan _fpcmp_parts_tf _compare_tf _eq_tf _ne_tf _gt_tf _ge_tf \ 94132751Skan _lt_tf _le_tf _unord_tf _si_to_tf _tf_to_si _negate_tf _make_tf \ 95132751Skan _tf_to_df _tf_to_sf _thenan_tf _tf_to_usi _usi_to_tf 96132751Skan 9796340Sobrien# These might cause a divide overflow trap and so are compiled with 9896340Sobrien# unwinder info. 9996340SobrienLIB2_DIVMOD_FUNCS = _divdi3 _moddi3 _udivdi3 _umoddi3 _udiv_w_sdiv _udivmoddi4 10018609Speter 10196340Sobrien#----------------------------------------------------------------------- 10296340Sobrien# 10396340Sobrien# Platform specific bits. 104169718Skan# When upgrading GCC, get the following definitions from config/<cpu>/t-* 10596340Sobrien# 106215082Simp.if ${TARGET_CPUARCH} == "arm" 10796340Sobrien# from config/arm/t-strongarm-elf 108132751SkanCFLAGS+= -Dinhibit_libc -fno-inline 109132751SkanLIB1ASMSRC = lib1funcs.asm 110169718SkanLIB1ASMFUNCS = _dvmd_tls _bb_init_func 111169718SkanLIB2FUNCS_EXTRA = floatunsidf.c floatunsisf.c 112169718Skan 113169718Skan# Not now 114169718Skan#LIB1ASMFUNCS = _udivsi3 _divsi3 _umodsi3 _modsi3 _dvmd_tls _bb_init_func 115169718Skan#LIB1ASMFUNCS+= _call_via_rX _interwork_call_via_rX \ 116169718Skan# _lshrdi3 _ashrdi3 _ashldi3 \ 117169718Skan# _negdf2 _addsubdf3 _muldivdf3 _cmpdf2 _unorddf2 _fixdfsi _fixunsdfsi \ 118169718Skan# _truncdfsf2 _negsf2 _addsubsf3 _muldivsf3 _cmpsf2 _unordsf2 \ 119169718Skan# _fixsfsi _fixunssfsi _floatdidf _floatdisf 12045306Sobrien.endif 12134814Sbde 122217123Simp.if ${TARGET_CPUARCH} == mips 123201852SimpLIB2FUNCS_EXTRA = floatunsidf.c floatunsisf.c 124217942Sjchandra# ABIs other than o32 need this 125218181Simp.if ${TARGET_ARCH:Mmipse[lb]} == "" 126208737SjmallettLIB2FUNCS_EXTRA+= floatdidf.c fixunsdfsi.c 127208737SjmallettLIB2FUNCS_EXTRA+= floatdisf.c floatundidf.c 128208737SjmallettLIB2FUNCS_EXTRA+= fixsfdi.c floatundisf.c 129208737SjmallettLIB2FUNCS_EXTRA+= fixdfdi.c fixunssfsi.c 130201852Simp.endif 131208737Sjmallett.endif 132201852Simp 133215082Simp.if ${TARGET_CPUARCH} == "ia64" 13496340Sobrien# from config/ia64/t-ia64 135169718SkanLIB1ASMSRC = lib1funcs.asm 136169718SkanLIB1ASMFUNCS = __divxf3 __divdf3 __divsf3 \ 137169718Skan __divdi3 __moddi3 __udivdi3 __umoddi3 \ 138169718Skan __divsi3 __modsi3 __udivsi3 __umodsi3 __save_stack_nonlocal \ 139169718Skan __nonlocal_goto __restore_stack_nonlocal __trampoline \ 140169718Skan _fixtfdi _fixunstfdi _floatditf 141169718SkanLIB2ADDEH = unwind-ia64.c unwind-sjlj.c unwind-c.c 14296340Sobrien.endif 14334814Sbde 144215275Simp.if ${TARGET_ARCH} == "powerpc" 14596340Sobrien# from config/rs6000/t-ppccomm 146176530SrajLIB2FUNCS_EXTRA = tramp.asm 14796779SobrienLIB2FUNCS_STATIC_EXTRA = eabi.asm 14896340Sobrien.endif 1491823Sphk 150215275Simp.if ${TARGET_ARCH} == "powerpc64" 151209867Snwhitehorn# from config/rs6000/t-ppccomm 152209867SnwhitehornLIB2FUNCS_EXTRA = tramp.asm 153209867Snwhitehorn.endif 154209867Snwhitehorn 155215082Simp.if ${TARGET_CPUARCH} == "sparc64" 15696340Sobrien# from config/sparc/t-elf 157169718SkanLIB1ASMSRC = lb1spc.asm 15896340SobrienLIB1ASMFUNCS = _mulsi3 _divsi3 _modsi3 15996340Sobrien.endif 1601823Sphk 16196340Sobrien#----------------------------------------------------------------------- 16296340Sobrien 16396449Sobrien# Remove any objects from LIB2FUNCS and LIB2_DIVMOD_FUNCS that are 16496449Sobrien# defined as optimized assembly code in LIB1ASMFUNCS. 16596449Sobrien.if defined(LIB1ASMFUNCS) 16696449Sobrien.for sym in ${LIB1ASMFUNCS} 167133103SkanLIB2FUNCS:= ${LIB2FUNCS:S/${sym}//g} 16896449SobrienLIB2_DIVMOD_FUNCS:= ${LIB2_DIVMOD_FUNCS:S/${sym}//g} 16996449Sobrien.endfor 17096449Sobrien.endif 17196449Sobrien 172169718SkanCOMMONHDRS= tm.h tconfig.h options.h unwind.h gthr-default.h 17396456Sobrien 174169718Skan#----------------------------------------------------------------------- 175169718Skan# 176169718Skan# Helpful shortcuts for compiler invocations. 177169718Skan# 178169718SkanHIDE = -fvisibility=hidden -DHIDE_EXPORTS 179169718SkanCC_T = ${CC} -c ${CFLAGS} ${HIDE} -fPIC 180169718SkanCC_P = ${CC} -c ${CFLAGS} ${HIDE} -p -fPIC 181169718SkanCC_S = ${CC} -c ${CFLAGS} ${PICFLAG} -DSHARED 18296449Sobrien 183169718Skan#----------------------------------------------------------------------- 184169718Skan# 185169718Skan# Functions from libgcc2.c 186169718Skan# 187169718SkanSTD_CFLAGS = 188169718SkanDIV_CFLAGS = -fexceptions -fnon-call-exceptions 18996340Sobrien 190169718SkanSTD_FUNCS = ${LIB2FUNCS} 191169718SkanDIV_FUNCS = ${LIB2_DIVMOD_FUNCS} 19296340Sobrien 193169718SkanSTD_CFILE = libgcc2.c 194169718SkanDIV_CFILE = libgcc2.c 19596340Sobrien 196169718SkanOBJ_GRPS = STD DIV 19745299Sobrien 198169718Skan#----------------------------------------------------------------------- 199169718Skan# 200169718Skan# Floating point emulation functions 201169718Skan# 202215082Simp.if ${TARGET_CPUARCH} == "armNOT_YET" || \ 203215082Simp ${TARGET_CPUARCH} == "powerpc" || ${TARGET_CPUARCH} == "sparc64" 204169718Skan 205169718SkanFPBIT_CFLAGS = -DFINE_GRAINED_LIBRARIES -DFLOAT 206169718SkanDPBIT_CFLAGS = -DFINE_GRAINED_LIBRARIES 207169718Skan 208169718SkanFPBIT_CFILE = config/fp-bit.c 209169718SkanDPBIT_CFILE = config/fp-bit.c 210169718Skan 211169718SkanOBJ_GRPS += FPBIT DPBIT 2121823Sphk.endif 2131823Sphk 214169718Skan#----------------------------------------------------------------------- 215169718Skan# 216169718Skan# Generic build rules for object groups defined above 217169718Skan# 218169718Skan.for T in ${OBJ_GRPS} 219169718Skan${T}_OBJS_T = ${${T}_FUNCS:S/$/.o/} 220169718Skan${T}_OBJS_P = ${${T}_FUNCS:S/$/.po/} 221169718Skan${T}_OBJS_S = ${${T}_FUNCS:S/$/.So/} 222169718SkanOBJS += ${${T}_FUNCS:S/$/.o/} 223169718Skan 224169718Skan${${T}_OBJS_T}: ${${T}_CFILE} ${COMMONHDRS} 225169718Skan ${CC_T} ${${T}_CFLAGS} -DL${.PREFIX} -o ${.TARGET} ${.ALLSRC:M*.c} 226169718Skan${${T}_OBJS_P}: ${${T}_CFILE} ${COMMONHDRS} 227169718Skan ${CC_P} ${${T}_CFLAGS} -DL${.PREFIX} -o ${.TARGET} ${.ALLSRC:M*.c} 228169718Skan${${T}_OBJS_S}: ${${T}_CFILE} ${COMMONHDRS} 229169718Skan ${CC_S} ${${T}_CFLAGS} -DL${.PREFIX} -o ${.TARGET} ${.ALLSRC:M*.c} 230169718Skan.endfor 231169718Skan 232169718Skan#----------------------------------------------------------------------- 233169718Skan# 234169718Skan# Extra objects coming from separate files 235169718Skan# 236169718Skan.if !empty(LIB2ADD) 237169718SkanOBJS += ${LIB2ADD:R:S/$/.o/} 238169718SkanSOBJS += ${LIB2ADD:R:S/$/.So/} 239169718SkanPOBJS += ${LIB2ADD:R:S/$/.po/} 2401823Sphk.endif 2411823Sphk 242169718Skan#----------------------------------------------------------------------- 243169718Skan# 244169718Skan# Objects that should be in static library only. 245169718Skan# 246171846SkanSYMS_ST = ${LIB2FUNCS_ST} ${LIB2ADD_ST} 247169718SkanSTAT_OBJS_T = ${SYMS_ST:S/$/.o/} 248169718SkanSTAT_OBJS_P = ${SYMS_ST:S/$/.po/} 249169718SkanSTATICOBJS = ${SYMS_ST:S/$/.o/} 250169718Skan 251169718Skan${STAT_OBJS_T}: ${STD_CFILE} ${COMMONHDRS} 252169718Skan ${CC_T} -DL${.PREFIX} -o ${.TARGET} ${.ALLSRC:M*.c} 253169718Skan${STAT_OBJS_P}: ${STD_CFILE} ${COMMONHDRS} 254169718Skan ${CC_P} -DL${.PREFIX} -o ${.TARGET} ${.ALLSRC:M*.c} 255169718Skan 256169718Skan#----------------------------------------------------------------------- 257169718Skan# 258169718Skan# Assembler files. 259169718Skan# 26096456Sobrien.if defined(LIB1ASMSRC) 261169718SkanASM_T = ${LIB1ASMFUNCS:S/$/.o/} 262169718SkanASM_P = ${LIB1ASMFUNCS:S/$/.po/} 263169718SkanASM_S = ${LIB1ASMFUNCS:S/$/.So/} 264169718SkanASM_V = ${LIB1ASMFUNCS:S/$/.vis/} 265169718SkanOBJS += ${LIB1ASMFUNCS:S/$/.o/} 266169718Skan 267169718Skan${ASM_T}: ${LIB1ASMSRC} ${.PREFIX}.vis 268169718Skan ${CC} -x assembler-with-cpp -c ${CFLAGS} -DL${.PREFIX} \ 269169718Skan -o ${.TARGET} -include ${.PREFIX}.vis ${.ALLSRC:N*.h:N*.vis} 270169718Skan${ASM_P}: ${LIB1ASMSRC} ${.PREFIX}.vis 271169718Skan ${CC} -x assembler-with-cpp -p -c ${CFLAGS} -DL${.PREFIX} \ 272169718Skan -o ${.TARGET} -include ${.PREFIX}.vis ${.ALLSRC:N*.h:N*.vis} 273169718Skan${ASM_S}: ${LIB1ASMSRC} 274169718Skan ${CC} -x assembler-with-cpp -c ${PICFLAG} ${CFLAGS} -DL${.PREFIX} \ 27596850Sobrien -o ${.TARGET} ${.ALLSRC:N*.h} 276169718Skan${ASM_V}: ${LIB1ASMSRC} 277169718Skan ${CC} -x assembler-with-cpp -c ${CFLAGS} -DL${.PREFIX} \ 278169718Skan -o ${.PREFIX}.vo ${.ALLSRC:N*.h} 279169718Skan ( nm -pg ${.PREFIX}.vo | \ 280169718Skan awk 'NF == 3 && $$2 !~ /^[UN]$$/ { print "\t.hidden ", $$3 }'\ 281169718Skan ) > ${.TARGET} 28296456Sobrien 283169718SkanCLEANFILES += ${ASM_V} ${ASM_V:R:S/$/.vo/} 28496456Sobrien.endif 28596456Sobrien 286169718Skan#----------------------------------------------------------------------- 287169718Skan# 288169718Skan# Exception handling / unwinding support. 289169718Skan# 290169718SkanEH_OBJS_T = ${LIB2ADDEHSTATIC:R:S/$/.o/} 291169718SkanEH_OBJS_P = ${LIB2ADDEHSTATIC:R:S/$/.po/} 292169718SkanEH_OBJS_S = ${LIB2ADDEHSHARED:R:S/$/.So/} 293169718SkanEH_CFLAGS = -fexceptions -D__GLIBC__=3 -DElfW=__ElfN 294169718SkanSOBJS += ${EH_OBJS_S} 295169718Skan 296169718Skan.for _src in ${LIB2ADDEHSTATIC} 297169718Skan${_src:R:S/$/.o/}: ${_src} ${COMMONHDRS} 298169718Skan ${CC_T} ${EH_CFLAGS} -o ${.TARGET} ${.IMPSRC} 299169718Skan${_src:R:S/$/.po/}: ${_src} ${COMMONHDRS} 300169718Skan ${CC_P} ${EH_CFLAGS} -o ${.TARGET} ${.IMPSRC} 301169718Skan.endfor 302169718Skan.for _src in ${LIB2ADDEHSHARED} 303169718Skan${_src:R:S/$/.So/}: ${_src} ${COMMONHDRS} 304169718Skan ${CC_S} ${EH_CFLAGS} -o ${.TARGET} ${.IMPSRC} 305169718Skan.endfor 306169718Skan 307169718Skan 308169718Skan#----------------------------------------------------------------------- 309169718Skan# 310169718Skan# Generated headers 311169718Skan# 312169718Skan${COMMONHDRS}: ${.CURDIR}/../../usr.bin/cc/cc_tools/Makefile 313169718Skan ${MAKE} -f ${.ALLSRC} MFILE=${.ALLSRC} GCCDIR=${GCCDIR} ${.TARGET} 314169718Skan 315169718SkanCLEANFILES += ${COMMONHDRS} 316169718SkanCLEANFILES += cs-*.h option* 317169718Skan 318169718Skan#----------------------------------------------------------------------- 319169718Skan# 320200499Skan# Build symbol version map 321169718Skan# 322169718SkanSHLIB_MKMAP = ${GCCDIR}/mkmap-symver.awk 323169718SkanSHLIB_MKMAP_OPTS = 324169718SkanSHLIB_MAPFILES = ${GCCDIR}/libgcc-std.ver 325169718SkanVERSION_MAP = libgcc.map 326169718Skan 327169718Skanlibgcc.map: ${SHLIB_MKMAP} ${SHLIB_MAPFILES} ${SOBJS} ${OBJS:R:S/$/.So/} 328169718Skan ( nm -pg ${SOBJS};echo %% ; \ 329169718Skan cat ${SHLIB_MAPFILES} \ 330169718Skan | sed -e '/^[ ]*#/d' \ 331169718Skan -e 's/^%\(if\|else\|elif\|endif\|define\)/#\1/' \ 332169718Skan | ${CC} ${CFLAGS} -E -xassembler-with-cpp -; \ 333169718Skan ) | awk -f ${SHLIB_MKMAP} ${SHLIB_MKMAP_OPTS} > ${.TARGET} 334169718Skan 335169718SkanCLEANFILES += libgcc.map 336169718Skan 337169718Skan#----------------------------------------------------------------------- 338169718Skan# 339200499Skan# Build additional static libgcc_eh[_p].a libraries. 340169718Skan# 341215126Sedlibgcc_eh.a: ${EH_OBJS_T} 342215126Sed @${ECHO} building static gcc_eh library 343169718Skan @rm -f ${.TARGET} 344169718Skan @${AR} cq ${.TARGET} `lorder ${EH_OBJS_T} | tsort -q` 345169718Skan ${RANLIB} ${.TARGET} 346169718Skan 347215126Sedall: libgcc_eh.a 348169718Skan 349156854Sru.if ${MK_PROFILE} != "no" 350215126Sedlibgcc_eh_p.a: ${EH_OBJS_P} 351215126Sed @${ECHO} building profiled gcc_eh library 352169718Skan @rm -f ${.TARGET} 353169718Skan @${AR} cq ${.TARGET} `lorder ${EH_OBJS_P} | tsort -q` 354169718Skan ${RANLIB} ${.TARGET} 355215126Sedall: libgcc_eh_p.a 35696456Sobrien.endif 357169718Skan 358169718Skan_libinstall: _lib-eh-install 359169718Skan 360169718Skan_lib-eh-install: 361188583Sjkim.if ${MK_INSTALLLIB} != "no" 362169718Skan ${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 363215126Sed ${_INSTALLFLAGS} libgcc_eh.a ${DESTDIR}${LIBDIR} 364188583Sjkim.endif 365169718Skan.if ${MK_PROFILE} != "no" 366169718Skan ${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ 367215126Sed ${_INSTALLFLAGS} libgcc_eh_p.a ${DESTDIR}${LIBDIR} 36896456Sobrien.endif 36996456Sobrien 370215126SedCLEANFILES+= libgcc_eh.a libgcc_eh_p.a ${EH_OBJS_T} ${EH_OBJS_P} 371169718Skan 3721823Sphk.include <bsd.lib.mk> 373169718Skan 374169718Skan.SUFFIXES: .vis .vo 375